From 9b6b60729d8178399396e2670c0e7914a9746b59 Mon Sep 17 00:00:00 2001
From: yuxc <yuxc@vci-tech.com>
Date: 星期一, 29 四月 2024 17:22:41 +0800
Subject: [PATCH] 文件上传以及接口权限修改
---
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/TransactionException.java | 44
web/tomcat/webapps/docs/config/realm.html | 994
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/WireBinding.java | 39
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/usercode/UserCodeReference.java | 97
web/tomcat/webapps/docs/appdev/sample/web/WEB-INF/web.xml | 40
grid/jre/bin/api-ms-win-crt-utility-l1-1-0.dll | 0
web/tomcat/webapps/docs/proxy-howto.html | 111
grid/jre/bin/instrument.dll | 0
grid/jre/legal/jdk/dynalink.md | 32
web/tomcat/webapps/docs/images/tomcat.png | 0
web/tomcat/webapps/examples/WEB-INF/classes/examples/LogTag.java | 63
grid/jre/bin/j2pkcs11.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/BusinessCalendarBinding.java | 206
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/EnvironmentFactory.java | 66
web/tomcat/webapps/examples/WEB-INF/classes/util/HTMLFilter.class | 0
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/VMInfo.java | 36
Source/ThirdPart/jbpm.4.3.2/lib/gwt-console-server-integration.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindLatestProcessDefinitionByKeyCmd.java | 48
web/tomcat/webapps/docs/config/cluster-manager.html | 241
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ActivityBehaviourBuilder.java | 43
Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanel.java | 5
Source/Client/PLTClientBase/.classpath | 1
web/tomcat/webapps/examples/WEB-INF/classes/error/Smart.java | 30
web/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.html | 30
Source/Service/LogService/src/com/vci/server/log/dao/LogService.java | 572
Source/ThirdPart/jbpm.4.3.2/lib/gwt-console-jbpm.war | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/hibernate/ConverterType.java | 104
Source/Service/BOFactory/src/com/vci/server/bof/server/delete/DeleteBO.java | 4
grid/jre/legal/javafx/libffi.md | 28
Source/Service/CacheService/src/properties/VolumnWithLog4j.properties | 12
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/TransactionRefDescriptor.java | 39
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/DateToStringConverter.java | 62
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/AntHelper.java | 59
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/HibernateSessionDescriptor.java | 116
web/tomcat/webapps/examples/servlets/index.html | 171
grid/jre/bin/bci.dll | 0
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.java | 32
web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.java | 128
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/JobItem.java | 83
web/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp.html | 117
Source/Service/CacheService/.settings/org.eclipse.core.resources.prefs | 5
Source/ThirdPart/jbpm.4.3.2/lib/postgresql.jar | 0
grid/jre/bin/decora_sse.dll | 0
Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/operate/OperateMangePanel.java | 2
web/tomcat/webapps/examples/WEB-INF/classes/cal/Entries.java | 62
Source/ThirdPart/jbpm.4.3.2/migration/lib/ant-1.7.0.jar | 0
web/tomcat/webapps/examples/jsp/include/foo.jsp.html | 18
web/tomcat/webapps/docs/config/cluster-membership.html | 119
Source/Service/LogService/build-jar.xml | 36
Source/Client/PLTClient/src/com/vci/client/logon/client/VciFrame.java | 2
Source/Client/PLTClient/src/com/vci/client/oq/ui/ExpQTDDialog.java | 15
grid/jre/lib/calendars.properties | 62
Source/ThirdPart/jbpm.4.3.2/lib/hibernate-entitymanager.jar | 0
web/tomcat/bin/digest.sh | 60
grid/jre/legal/jdk/pkcs11cryptotoken.md | 33
grid/jre/bin/api-ms-win-core-processthreads-l1-1-1.dll | 0
grid/start-grid-wnode.bat | 2
Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtexport/LinkQTExportTree.java | 5
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HibernateConfigurationBinding.java | 216
web/tomcat/webapps/examples/jsp/include/include.jsp | 30
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/utils/DateUtils.java | 1048
Source/ThirdPart/jbpm.4.3.2/lib/avalon-framework.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/package.html | 5
web/tomcat/webapps/examples/jsp/include/foo.html | 17
web/tomcat/webapps/examples/WEB-INF/classes/sessions/DummyCart.java | 66
Source/Client/PLTClient/src/com/vci/client/uif/engine/client/tableArea/TablePanelDataProvider.java | 4
Source/Service/CacheService/src/properties/VCICacheService.properties | 3
web/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.jsp | 54
grid/jre/bin/msvcp140.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/DeploymentQuery.java | 63
web/tomcat/webapps/examples/jsp/jsp2/simpletag/RepeatSimpleTag.java.html | 43
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/ManagementServiceImpl.java | 45
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/StringStreamInput.java | 44
grid/app/thrid/jaxrpc.jar | 0
Source/Service/ServiceBase/build.properties | 4
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AddTaskCommentCmd.java | 58
Source/ThirdPart/jbpm.4.3.2/lib/idm-hibernate.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.java | 109
web/tomcat/webapps/docs/images/docs-stylesheet.css | 303
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/WireContext.java | 720
web/tomcat/lib/tomcat-i18n-zh-CN.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/UnpersistableVariable.java | 27
web/tomcat/webapps/docs/appdev/introduction.html | 58
web/tomcat/webapps/examples/jsp/cal/Entries.java.html | 63
web/tomcat/bin/tomcat8.exe | 0
grid/jre/lib/deploy/ffjcext.zip | 0
Source/Client/PLTClient/src/com/vci/client/utils/BOTool.java | 98
Source/Service/FrameService/dist/FrameService.jar | 0
web/tomcat/webapps/examples/jsp/tagplugin/notes.html | 41
web/tomcat/webapps/docs/config/server.html | 81
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/VariableOutDefinitionSet.java | 81
web/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.class | 0
grid/jre/legal/jdk/lcms.md | 27
grid/jre/bin/jp2ssv.dll | 0
Source/ThirdPart/DBSync/lib/mssql-jdbc-6.2.0.jre8.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/client/ClientProcessInstance.java | 37
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/Deployer.java | 35
web/tomcat/webapps/examples/servlets/reqheaders.html | 49
Source/ThirdPart/jbpm.4.3.2/lib/idm-spi.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetResourceAsStreamCmd.java | 47
web/tomcat/conf/server.xml | 171
web/tomcat/bin/startup.bat | 58
Source/Client/PLTClient/src/com/vci/client/workflow/task/TrackTaskPanel.java | 2
web/tomcat/webapps/examples/jsp/jsp2/el/composite.html | 31
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskAssign.java | 60
grid/jre/bin/jfxmedia.dll | 0
web/tomcat/webapps/examples/jsp/error/err.jsp.html | 45
grid/jre/bin/servertool.exe | 0
web/tomcat/webapps/docs/setup.html | 164
grid/properties/mail.properties | 8
web/tomcat/webapps/host-manager/WEB-INF/jsp/401.jsp | 71
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/XmlUtil.java | 495
web/tomcat/webapps/examples/jsp/jsp2/simpletag/book.html | 37
web/tomcat/webapps/examples/WEB-INF/classes/async/Async0$1.class | 0
Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/operate/OperaTypeTreeCellRenderer.java | 2
web/tomcat/webapps/docs/ssi-howto.html | 398
Source/ThirdPart/jbpm.4.3.2/lib/hibernate-commons-annotations.jar | 0
Source/Common/PLTSlice/build-jar.xml | 3
Source/ThirdPart/jbpm.4.3.2/build-jar.xml | 32
web/tomcat/webapps/examples/WEB-INF/classes/examples/LogTag.class | 0
Source/Client/PLTClient/src/com/vci/client/log/ui/LogManagementPanelActionListener.java | 183
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetExecutionVariableNamesCmd.java | 54
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SendMessageCmd.java | 47
Source/Client/PLTClient/src/com/vci/client/omd/lifecycle/ui/LifeCyclePanel.java | 2
web/tomcat/webapps/docs/connectors.html | 44
grid/jre/bin/jp2iexp.dll | 0
Source/ThirdPart/jbpm.4.3.2/migration/lib/mockrunner-0.4.1.jar | 0
web/tomcat/webapps/docs/html-host-manager-howto.html | 169
web/tomcat/webapps/examples/jsp/checkbox/cresult.html | 34
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/identity/Group.java | 39
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.java | 34
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/StartBinding.java | 62
web/tomcat/webapps/examples/jsp/error/errorpge.jsp.html | 26
web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.java | 65
web/tomcat/webapps/examples/jsp/xml/xml.jsp.html | 71
grid/jre/bin/api-ms-win-core-interlocked-l1-1-0.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/NullBinding.java | 45
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.java | 236
web/tomcat/webapps/docs/RELEASE-NOTES.txt | 178
Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBOLOTS.java | 15
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/hibernate/DbSessionImpl.java | 470
web/tomcat/webapps/docs/appdev/sample/web/images/tomcat.gif | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/HistoryServiceImpl.java | 82
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetOutcomes.java | 76
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ClassLoaderDescriptor.java | 42
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/ClobStrategyText.java | 14
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/JbossIdmIdentitySessionDescriptor.java | 72
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteProcessDefinitionCmd.java | 59
Source/Service/BOFactory/src/com/vci/server/BOFactoryBoxService.java | 14
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/MockRunnerTest.java | 57
grid/jre/bin/deploy.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SetExecutionVariablesCmd.java | 55
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/TypesDescriptor.java | 53
Source/Service/BOFactory/dist/BOFService.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/ByteToLongConverter.java | 44
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/SeamHibernateSessionDescriptor.java | 51
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/assertion/QueryAssertions.java | 150
web/tomcat/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp.html | 24
web/tomcat/webapps/examples/jsp/jsp2/misc/prelude.jspf.html | 22
Source/ThirdPart/jbpm.4.3.2/src/jbpm.jpdl.cfg.xml | 14
Source/ThirdPart/jbpm.4.3.2/lib/logkit.jar | 0
Source/Client/PLTClient/src/com/vci/client/omd/statepool/ui/StatePoolUI.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/JbpmIdentityStore.java | 53
grid/app/thrid/logkit-1.2.jar | 0
grid/properties/lifeCycleEvents.properties | 9
Source/Client/PLTClient/src/com/vci/client/portal/platformPortal/ImportExcel.java | 13
Source/Service/ServiceBase/src/com/vci/server/base/log/PltLogger.java | 54
web/tomcat/webapps/examples/WEB-INF/classes/cal/Entry.java | 52
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RulesDeployer.java | 85
web/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.html | 33
web/tomcat/webapps/examples/jsp/jsp2/misc/EchoAttributesTag.java.html | 57
grid/app/thrid/jbpm-4.3.2.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/DefaultMigrationHandler.java | 57
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/UrlStreamInput.java | 55
Source/Client/PLTClient/src/com/vci/client/portal/NewUI/UIDesinDialog.java | 5
web/tomcat/webapps/docs/images/update.gif | 0
grid/jre/bin/t2k.dll | 0
Source/ThirdPart/jbpm.4.3.2/lib/jbpm-db.jar | 0
Source/ThirdPart/jbpm.4.3.2/lib/drools-core.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/jbpm.identity.hbm.xml | 60
web/tomcat/bin/setclasspath.sh | 98
grid/jre/bin/plugin2/msvcp140.dll | 0
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$2.class | 0
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/Constants.java | 50
web/tomcat/webapps/examples/WEB-INF/classes/cal/TableBean.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/CharacterDescriptor.java | 58
web/tomcat/webapps/examples/WEB-INF/classes/validators/DebugValidator.java | 83
grid/app/common/mail.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/TaskQuery.java | 94
Source/Client/build-client/Timer.properties | 14
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cfg/ConfigurationParser.java | 135
grid/jre/bin/verify.dll | 0
Source/Service/LogService/.classpath | 11
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/JpdlDeployerBinding.java | 44
Source/ThirdPart/jbpm.4.3.2/lib/dom4j.jar | 0
grid/jre/legal/javafx/jpeg_fx.md | 51
Source/Client/PLTClient/src/com/vci/client/auth2/action/SaveRuleAction.java | 5
Source/ThirdPart/jbpm.4.3.2/lib/jtds.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/ResourceStreamInput.java | 59
Source/Service/BOFactory/src/com/vci/server/bof/server/transfer/TransferBO.java | 5
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/Day.java | 70
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/MailBinding.java | 42
web/tomcat/webapps/examples/WEB-INF/tags/panel.tag | 29
Source/ThirdPart/jbpm.4.3.2/migration/lib/antlr-2.7.6.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/BusinessCalendarImpl.java | 277
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/XPathScriptEngine.java | 458
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SetTaskVariablesCmd.java | 53
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TransactionBinding.java | 64
web/tomcat/webapps/ROOT/asf-logo-wide.svg | 295
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/UserImpl.java | 101
web/tomcat/lib/catalina-ant.jar | 0
Source/ThirdPart/DBSync/lib/c3p0-0.9.1.1.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/listener/EventListener.java | 36
web/tomcat/webapps/examples/WEB-INF/classes/util/HTMLFilter.java | 69
web/tomcat/webapps/host-manager/WEB-INF/manager.xml | 30
Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanelV3.java | 2
grid/app/thrid/axis-ant.jar | 0
Source/ThirdPart/jbpm.4.3.2/build.properties | 12
web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.java | 115
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/session/TimerSession.java | 60
web/tomcat/webapps/examples/jsp/images/execute.gif | 0
web/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.java | 44
web/tomcat/webapps/examples/WEB-INF/classes/RequestInfoExample.java | 118
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetActivityCoordinatesCmd.java | 60
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Priority.java | 61
grid/jre/bin/api-ms-win-core-namedpipe-l1-1-0.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/wirecontext.gif | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/AtomicOperation.java | 61
grid/jre/COPYRIGHT | 69
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/action/Script.java | 50
Source/Client/PLTClient/src/com/vci/client/framework/specialrole/RolingDialog.java | 2
grid/jre/lib/management/jmxremote.password.template | 64
web/tomcat/lib/tomcat-i18n-ko.jar | 0
grid/jre/bin/api-ms-win-crt-process-l1-1-0.dll | 0
grid/jre/bin/prism_d3d.dll | 0
Source/Service/OMDService/build.properties | 4
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/Condition.java | 40
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SqlActivity.java | 37
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/EndState.java | 38
web/tomcat/webapps/examples/jsp/colors/ColorGameBean.html | 116
grid/app/common/log4j-api-2.12.4.jar | 0
web/tomcat/webapps/docs/WEB-INF/web.xml | 29
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/MethodInvokerListener.java | 70
grid/jre/bin/fxplugins.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/jbpm.tx.hibernate.cfg.xml | 33
web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.class | 0
Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtimport/LinkQTImpQTStep2Panel.java | 5
grid/app/thrid/jms-1.1.jar | 0
web/tomcat/bin/tomcat-juli.jar | 0
grid/start-grid-lnode.sh | 5
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/MemoryIdComposer.java | 37
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/BusinessCalendarDescriptor.java | 48
Source/Client/PLTClient/src/com/vci/client/portal/utility/DataModelFactory.java | 7
web/tomcat/lib/tomcat-jni.jar | 0
web/tomcat/webapps/examples/jsp/xml/xml.jsp | 70
Source/ThirdPart/jbpm.4.3.2/migration/lib/junit-3.8.2.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/jbpm.tx.spring.cfg.xml | 27
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CommandException.java | 48
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateHistoryActivityInstanceQueryCmd.java | 41
Source/ThirdPart/jbpm.4.3.2/lib/mvel2.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessInstance.java | 33
web/tomcat/webapps/docs/config/jar-scanner.html | 99
web/tomcat/webapps/docs/config/loader.html | 119
Source/ThirdPart/jbpm.4.3.2/src/jbpm.wire.bindings.xml | 101
Source/Service/LogService/dist/LogService.jar | 0
Source/Service/UIService/src/com/vci/server/UIBoxService.java | 13
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/JobContext.java | 77
Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-jpdl-4.3.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ArgDescriptor.java | 61
web/tomcat/webapps/examples/jsp/jsp2/el/composite.jsp | 110
web/tomcat/webapps/examples/jsp/cal/Entry.java.html | 53
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/HibernateSessionResource.java | 85
grid/jre/lib/fontconfig.bfc | 0
Source/Client/PLTClient/src/com/vci/client/tool/dialog/UIContexBuilderWrapperDialog.java | 3
web/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.jsp | 90
web/tomcat/webapps/ROOT/tomcat.css | 354
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExecutorMessageSession.java | 63
web/tomcat/webapps/examples/jsp/tagplugin/if.jsp | 47
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/DeploymentProperty.java | 102
grid/jre/legal/jdk/libpng.md | 144
grid/jre/bin/api-ms-win-core-sysinfo-l1-1-0.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/ScriptContextEngineView.java | 268
grid/jre/lib/jvm.hprof.txt | 86
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessEngine.java | 93
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/problem/Problem.java | 121
web/tomcat/webapps/docs/images/docs.gif | 0
Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBOLO.java | 3
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/QueryCommand.java | 40
web/tomcat/webapps/mpmweb.war | 0
Bin/properties/hibernate.cfg.xml | 3
web/tomcat/webapps/examples/WEB-INF/classes/listeners/ContextListener.class | 0
web/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.html | 30
web/tomcat/webapps/examples/WEB-INF/classes/async/Async1.class | 0
Source/ThirdPart/jbpm.4.3.2/migration/lib/groovy-all-1.5.6.jar | 0
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/CombinationDialog.java | 2
Source/Client/PLTClient/src/com/vci/client/workflow/task/TodoTaskPanel.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeployCmd.java | 49
web/tomcat/webapps/examples/jsp/jsp2/misc/coda.jspf.html | 22
Source/Service/ServiceBase/src/com/vci/server/base/utility/LogRecordUtil.java | 216
Source/Client/PLTClient/src/com/vci/client/workflow/task/FlowSearchDialog.java | 2
Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/OperationTypeTreeDialog.java | 2
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/LongVariable.java | 51
web/tomcat/bin/startup.sh | 60
web/tomcat/LICENSE | 1057
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ContextTypeRefDescriptor.java | 48
grid/jre/lib/security/policy/limited/US_export_policy.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/JBossIdmIdentitySessionImpl.java | 397
web/tomcat/webapps/docs/architecture/requestProcess/authentication-process.png | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/CommandServiceDescriptor.java | 70
grid/jre/bin/tnameserv.exe | 0
web/tomcat/webapps/docs/images/fonts/OpenSans600.woff | 0
web/tomcat/bin/catalina.sh | 688
web/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.jsp.html | 32
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/Holiday.java | 106
grid/app/thrid/hibernate-jpa-2.0-api-1.0.1.Final.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/JbpmException.java | 44
web/tomcat/webapps/docs/images/fonts/OpenSans400italic.woff | 0
web/tomcat/webapps/host-manager/WEB-INF/jsp/403.jsp | 90
Source/Service/BOFactory/src/com/vci/server/bof/server/delete/BatchDeleteBO.java | 4
web/tomcat/webapps/examples/servlets/images/code.gif | 0
Source/Client/PLTClient/src/com/vci/client/log/ui/LogOperateManagerMainPanel.java | 40
Source/ThirdPart/jbpm.4.3.2/src/jbpm.task.lifecycle.xml | 13
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/environment.gif | 0
grid/jre/legal/javafx/mesa3d.md | 134
Source/Service/CacheService/src/properties/VCICacheService_zhNative.properties | 3
web/tomcat/webapps/ROOT/tomcat.svg | 967
Source/Service/UIService/build.properties | 4
grid/jre/bin/WindowsAccessBridge-64.dll | 0
web/tomcat/bin/shutdown.sh | 60
Source/Client/PLTClient/src/com/vci/client/logon/client/LogonPanel.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetTaskCmd.java | 50
web/tomcat/webapps/docs/appdev/sample/sample.war | 0
web/tomcat/webapps/examples/jsp/jsp2/simpletag/book.jsp.html | 56
grid/jre/bin/management.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ClassBinding.java | 34
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryProcessInstance.java | 76
web/tomcat/lib/tomcat-i18n-ja.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Listener.java | 17
web/tomcat/webapps/docs/building.html | 236
web/tomcat/webapps/examples/WEB-INF/classes/CookieExample.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryVariableUpdateImpl.java | 49
Source/ThirdPart/jbpm.4.3.2/lib/livetribe-jsr223.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/AbstractOperation.java | 35
Source/Service/WFService/src/com/vci/server/WorkflowBoxService.java | 13
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/package.html | 4
grid/properties/email.properties | 7
web/tomcat/webapps/docs/maven-jars.html | 27
Source/ThirdPart/jbpm.4.3.2/lib/stax-api.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/DeploymentImpl.java | 365
Source/Service/ServiceBase/build-jar.xml | 4
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/CharBinding.java | 53
web/tomcat/webapps/examples/WEB-INF/classes/cal/JspCalendar.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/BooleanToStringConverter.java | 55
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/Db.java | 194
web/tomcat/webapps/examples/WEB-INF/classes/async/Async2.java | 70
web/tomcat/webapps/examples/jsp/error/er.html | 31
web/tomcat/webapps/examples/jsp/tagplugin/foreach.jsp.html | 55
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RepositorySessionBinding.java | 46
web/tomcat/webapps/docs/appdev/sample/web/hello.jsp | 37
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/AssignActivity.java | 68
grid/jre/bin/lcms.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/DeserializedObject.java | 67
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ProcessInstanceMigration.java | 80
web/tomcat/webapps/examples/jsp/forward/fwd.html | 30
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/StringBinding.java | 47
Source/Service/CacheService/.classpath | 14
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/ForkActivity.java | 95
Source/Client/PLTClient/src/com/vci/client/oq/ui/QTDPanel.java | 13
grid/jre/lib/ext/sunec.jar | 0
web/tomcat/webapps/examples/jsp/colors/clr.html | 34
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ProcessElementImpl.java | 113
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CompositeCmd.java | 51
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/StringDescriptor.java | 41
Source/Service/VciServiceMain/src/com/vci/server/ServiceManagerMain.java | 7
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TaskServiceBinding.java | 47
grid/app/thrid/commons-pool2-2.6.2.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ProcessModificationsImpl.java | 125
grid/jre/lib/ext/access-bridge-64.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/EqualsUtil.java | 59
Source/ThirdPart/jbpm.4.3.2/src/jbpm.variable.types.xml | 34
Source/ThirdPart/jbpm.4.3.2/lib/log4j.jar | 0
grid/jre/bin/sunec.dll | 0
web/tomcat/webapps/docs/images/fonts/OpenSans600italic.woff | 0
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Fork.java | 38
grid/app/thrid/axis.jar | 0
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/exception/ConvertException.java | 48
web/tomcat/bin/tcnative-1.dll | 0
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/JpdlConverterTool.java | 229
Source/Client/PLTClient/src/com/vci/client/oq/ui/SelectorQTDialog.java | 3
grid/jre/bin/api-ms-win-crt-stdio-l1-1-0.dll | 0
Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtexport/LinkQTExpQTStep1Panel.java | 3
web/tomcat/webapps/examples/jsp/jsp2/jspattribute/TileSimpleTag.java.html | 47
Source/Client/PLTClient/src/com/vci/client/portal/utility/DataModelProcessor.java | 13
grid/app/thrid/jdsl.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/Configuration.java | 127
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailTemplateRegistry.java | 44
grid/app/thrid/jfreechart-1.0.14.jar | 0
grid/jre/bin/api-ms-win-crt-string-l1-1-0.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateDeploymentQueryCmd.java | 42
web/tomcat/webapps/examples/WEB-INF/lib/taglibs-standard-impl-1.2.5.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/DeploymentQueryImpl.java | 111
web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$1.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/ProblemList.java | 177
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/StateActivity.java | 78
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/action/Action.java | 92
grid/app/service/OQService.jar | 0
Source/Client/PLTClient/src/com/vci/client/framework/delegate/RightManagementClientDelegate.java | 19
grid/linuxnode.cfg | 21
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AuthorizationInterceptor.java | 47
grid/jre/bin/api-ms-win-core-synch-l1-1-0.dll | 0
web/tomcat/webapps/docs/config/cluster-deployer.html | 65
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AbstractServiceImpl.java | 41
web/tomcat/webapps/docs/balancer-howto.html | 19
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/package.html | 3
web/tomcat/webapps/examples/jsp/jsp2/el/Functions.java.html | 46
web/tomcat/webapps/examples/websocket/echo.xhtml | 184
Source/ThirdPart/jbpm.4.3.2/migration/lib/bsh-2.0b5.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/SerializableMatcher.java | 41
web/tomcat/lib/jasper-el.jar | 0
Source/Client/PLTClient/src/com/vci/client/framework/specialrole/UserDialog.java | 2
Source/Client/PLTClientBase/src/com/vci/client/common/excel/SheetDataSet.java | 8
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/BlobVariable.java | 73
web/tomcat/webapps/docs/images/tomcat.gif | 0
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/JobTask.java | 203
Source/Service/FrameService/src/com/vci/server/FrameBoxService.java | 23
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Log4jLogFactory.java | 36
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RepositorySessionImpl.java | 216
web/tomcat/webapps/examples/jsp/forward/one.jsp | 23
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.java | 45
Source/ThirdPart/jbpm.4.3.2/lib/jboss-logging-spi.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RetryInterceptorBinding.java | 87
grid/jre/legal/jdk/cldr.md | 63
Source/ThirdPart/jbpm.4.3.2/lib/joda-time.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryDecisionInstanceImpl.java | 43
Source/Service/BOFactory/src/com/vci/server/bof/server/update/BatchChangeBOOwner.java | 14
Source/ThirdPart/jbpm.4.3.2/lib/idm-api.jar | 0
grid/app/common/plt-slice.jar | 0
grid/jre/bin/pack200.exe | 0
Source/ThirdPart/jbpm.4.3.2/lib/gwt-console-server-jbpm.war | 0
Source/ThirdPart/jbpm.4.3.2/lib/jaxb-impl.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/IdentitySessionResource.java | 68
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/jpdl/DecisionHandler.java | 36
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ScopeInstanceImpl.java | 395
grid/jre/lib/psfontj2d.properties | 323
web/tomcat/webapps/examples/jsp/num/numguess.jsp.html | 70
Source/Client/PLTClient/src/com/vci/client/omd/btm/ui/DeleteTypeDialog.java | 5
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JpdlExternalActivity.java | 31
grid/jre/bin/api-ms-win-core-file-l2-1-0.dll | 0
web/tomcat/bin/version.sh | 60
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/JobQueryImpl.java | 128
grid/jre/Welcome.html | 28
web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location.class | 0
Source/Client/PLTClient/src/com/vci/client/omd/lifecycle/ui/ImageSelectDialog.java | 5
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/VariableOutDefinitionImpl.java | 56
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.java | 50
Source/ThirdPart/DBSync/properties/dbSynclog4j.properties | 23
grid/jre/lib/tzmappings | 226
web/tomcat/webapps/docs/config/cluster.html | 177
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/package.html | 4
Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/CSRoleRightPanel.java | 2
Source/Service/BOFactory/src/com/vci/server/bof/server/update/ChangeBOOwner.java | 4
web/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.jsp | 58
web/tomcat/webapps/docs/config/manager.html | 466
Source/ThirdPart/jbpm.4.3.2/dist/Jbpm-4.3.2.jar | 0
web/tomcat/bin/configtest.sh | 60
web/tomcat/webapps/docs/config/listeners.html | 566
Source/Client/PLTClientBase/dist/plt-clientbase.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/DeleteGroupCmd.java | 47
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/package.html | 4
web/tomcat/webapps/examples/WEB-INF/jsp/example-taglib.tld | 107
grid/jre/lib/net.properties | 121
Source/Client/PLTClient/src/com/vci/client/ui/swing/components/table/export/VCIJTablePanelExportFilterDialogActionListener.java | 2
web/tomcat/webapps/examples/WEB-INF/classes/async/Async3.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/WireOperationBinding.java | 34
web/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp | 44
web/tomcat/webapps/examples/WEB-INF/classes/HelloWorldExample.java | 79
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/TimerDefinitionImpl.java | 94
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/ExecuteActivityMessage.java | 58
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.class | 0
web/tomcat/bin/tool-wrapper.bat | 110
web/tomcat/webapps/docs/changelog.html | 10025 +++
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/TaskNode.java | 37
web/tomcat/webapps/docs/mbeans-descriptors-howto.html | 52
grid/jre/lib/deploy/splash.gif | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/BasicEnvironment.java | 170
grid/jre/bin/prism_common.dll | 0
Source/Common/PLTSlice/slice/02-framework.ice | 1069
web/tomcat/webapps/examples/jsp/colors/colrs.jsp | 70
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/OpenExecution.java | 132
web/tomcat/webapps/examples/jsp/jsp2/el/functions.html | 32
Source/ThirdPart/jbpm.4.3.2/src/jbpm.execution.hbm.xml | 356
grid/jre/legal/jdk/relaxngcc.md | 48
grid/jre/lib/ext/jaccess.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/Participation.java | 66
web/tomcat/webapps/examples/jsp/checkbox/checkresult.jsp | 65
web/tomcat/webapps/examples/index.html | 30
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SaveTaskCmd.java | 68
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/HibernateSessionFactoryDescriptor.java | 95
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JbpmTestCase.java | 326
Source/ThirdPart/jbpm.4.3.2/src/jbpm.task.hbm.xml | 139
web/tomcat/conf/tomcat-users.xsd | 59
grid/jre/bin/klist.exe | 0
web/tomcat/webapps/examples/jsp/checkbox/checkresult.jsp.html | 66
web/tomcat/webapps/docs/windows-auth-howto.html | 299
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/AbortMigrationHandler.java | 17
web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location$1.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/Operation.java | 18
Source/Service/FrameService/build.properties | 4
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ListDescriptor.java | 29
Source/Service/UIService/build-jar.xml | 4
web/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jpg | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessDefinitionQuery.java | 82
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TypesBinding.java | 205
web/tomcat/bin/tool-wrapper.sh | 153
web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_es.properties | 48
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/DOMWriter.java | 634
grid/jre/bin/rmiregistry.exe | 0
grid/jre/bin/api-ms-win-core-memory-l1-1-0.dll | 0
Source/Client/PLTClient/src/com/vci/client/log/ui/LogInfoManagerMainPanel.java | 40
web/tomcat/webapps/docs/apr.html | 131
Source/Service/UIService/src/com/vci/server/portal/PortalServiceImpl.java | 40
web/tomcat/webapps/examples/jsp/async/async1.jsp.html | 29
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/DeleteUserCmd.java | 48
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/SignalMessage.java | 66
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/SubscribeOperation.java | 227
Source/Client/PLTClient/src/com/vci/client/log/ui/DetailDialog.java | 88
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/Swimlane.java | 44
Source/Client/PLTClient/src/com/vci/test/oq/TestQTAPI.java | 5
web/tomcat/webapps/examples/jsp/jsptoserv/hello.jsp.html | 27
web/tomcat/webapps/docs/aio.html | 55
Source/Client/PLTClientBase/src/com/vci/client/ClientSession.java | 4
grid/jre/THIRDPARTYLICENSEREADME-JAVAFX.txt | 3
web/tomcat/lib/jsp-api.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/EnvironmentBindings.java | 91
grid/jre/bin/api-ms-win-core-string-l1-1-0.dll | 0
web/tomcat/webapps/examples/jsp/async/index.jsp | 69
Source/Service/ServiceBase/src/com/vci/server/mw/ServerContextInterceptor.java | 6
Source/Service/LogService/src/com/vci/server/log/dao/LogDAO.java | 8
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JoinBinding.java | 69
web/tomcat/webapps/ROOT/RELEASE-NOTES.txt | 178
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/ProcessDefinitionQueryImpl.java | 202
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ExpressionDescriptor.java | 50
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/NodeConverterTypes.java | 104
Source/Client/PLTClient/src/com/vci/client/workflow/task/DoneTaskPanel.java | 2
web/tomcat/lib/ecj-4.6.3.jar | 0
grid/app/thrid/commons-discovery-0.2.jar | 0
grid/jre/bin/server/classes.jsa | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ByteDescriptor.java | 57
web/tomcat/webapps/docs/config/systemprops.html | 533
Source/Service/build-service/build-service.xml | 10
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExecutionKeyGenerator.java | 34
web/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.jsp.html | 55
grid/jre/bin/eula.dll | 0
grid/app/thrid/antlr-2.7.6.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ProcessDefinitionBuilder.java | 120
grid/app/thrid/hibernate3.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/Event.java | 41
web/tomcat/webapps/examples/WEB-INF/classes/validators/DebugValidator.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Log.java | 82
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JmsBinding.java | 109
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/InstanceMigrator.java | 131
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CheckDbCmd.java | 95
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ActivityEnd.java | 69
Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-api-1.0.0.Beta1.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateProcessInstanceQueryCmd.java | 41
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ProcessDefinitionImpl.java | 204
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/Execution.java | 226
web/tomcat/webapps/docs/images/add.gif | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/RemoveParticipantCmd.java | 78
Source/Client/PLTClient/build-jar.xml | 2
Source/Client/PLTClient/src/com/vci/client/logon/base/BaseMenuBar.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/IdentitySessionBinding.java | 46
grid/jre/legal/jdk/giflib.md | 32
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.class | 0
Source/Service/BOFactory/src/com/vci/server/bof/server/transfer/BatchTransferBO.java | 42
Source/Client/PLTClient/src/com/vci/client/oq/ui/QTPanel.java | 11
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JbpmCustomCfgTestCase.java | 62
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/spi/IdentitySession.java | 86
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.java | 85
web/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp.html | 89
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/EndProcessInstance.java | 52
web/tomcat/webapps/examples/servlets/images/execute.gif | 0
web/tomcat/conf/tomcat-users.xml | 56
Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/BatchCheckOutBO.java | 14
grid/app/thrid/livetribe-jsr223.jar | 0
grid/jre/bin/ucrtbase.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/activity/ExternalActivityBehaviour.java | 64
web/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.html | 33
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/Jpdl3ConverterParser.java | 176
Source/Client/PLTClient/src/com/vci/client/auth2/view/UserSelectView.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AsyncCommandMessage.java | 73
Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/FuncOperatePanel.java | 2
Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCustomToolBar.java | 2
web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_zh_CN.properties | 48
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Decision.java | 38
Source/ThirdPart/jbpm.4.3.2/lib/jbosscache-core.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.class | 0
web/tomcat/webapps/examples/jsp/simpletag/foo.html | 30
web/tomcat/webapps/docs/images/fonts/fonts.css | 54
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionBinding.java | 104
grid/jre/lib/charsets.jar | 0
Source/Client/PLTClient/src/com/vci/client/utils/excel/ExcelDocumentUtils.java | 1
Source/ThirdPart/jbpm.4.3.2/lib/ejb3-persistence.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BlobStrategyBinary.java | 12
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/filesync/FileSync.java | 146
web/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.html | 33
web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Snake.class | 0
web/tomcat/webapps/examples/jsp/jsp2/el/ValuesTag.java.html | 80
web/tomcat/webapps/examples/jsp/jsp2/simpletag/FindBookSimpleTag.java.html | 45
web/tomcat/webapps/examples/WEB-INF/classes/listeners/SessionListener.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/cmd/VoidCommand.java | 38
Source/ThirdPart/DBSync/properties/dbjobs.xml | 77
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/package.html | 20
Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-log-4.3.jar | 0
web/tomcat/BUILDING.txt | 567
grid/app/thrid/commons-collections-3.1.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetStartFormResourceNameCmd.java | 65
web/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp | 90
Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-hibernate-1.0.0.Beta1.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/checkbox/CheckTest.java | 30
Source/ThirdPart/jbpm.4.3.2/lib/commons-logging.jar | 0
grid/app/service/ServiceBase.jar | 0
Source/Service/FrameService/src/com/vci/server/framework/delegate/RightManagementDelegate.java | 247
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/InitializePropertiesCmd.java | 163
web/tomcat/webapps/examples/jsp/jsp2/simpletag/Functions.java.html | 46
grid/jre/bin/api-ms-win-crt-runtime-l1-1-0.dll | 0
Source/Client/PLTClient/src/com/vci/client/log/ui/LogAuthorizeManagerMainPanel.java | 40
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/ExecuteEventListener.java | 136
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteProcessInstance.java | 54
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/DeploymentClassLoader.java | 124
Source/Client/PLTClient/src/com/vci/client/ui/date/PopupCalendarPanel.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/ClobStrategy.java | 7
grid/properties/hibernate.cfg.xml | 98
web/tomcat/webapps/docs/tribes/interceptors.html | 8
grid/jre/lib/deploy/messages_zh_HK.properties | 32
grid/app/thrid/commons-fileupload-1.2.2.jar | 0
Source/ThirdPart/jbpm.4.3.2/lib/juel-impl.jar | 0
grid/jre/bin/api-ms-win-core-processenvironment-l1-1-0.dll | 0
web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$NumberWriterListener.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/Page.java | 41
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryAutomaticInstanceImpl.java | 43
grid/start-grid.sh | 5
Source/Client/PLTClient/src/com/vci/client/oq/ui/QTPanelForLink2.java | 9
Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-commons-annotations-3.1.0.GA.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/JbpmDeployTask.java | 125
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ExceptionHandlerBuilder.java | 47
grid/app/thrid/jaxen-1.1-beta-9.jar | 0
grid/app/thrid/slf4j-api-1.7.14.jar | 0
grid/jre/legal/jdk/xalan.md | 234
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/JpdlParser.java | 727
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/log/SyncLog.java | 43
Source/Service/CacheService/src/properties/hibernate.map.xml | 34
web/tomcat/conf/web.xml | 4731 +
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/BasicTypeBinding.java | 37
Source/ThirdPart/jbpm.4.3.2/migration/lib/log4j-1.2.14.jar | 0
grid/jre/bin/jaas_nt.dll | 0
grid/jre/bin/javafx_iio.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EndErrorBinding.java | 43
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/rules/Outcome.java | 24
web/tomcat/webapps/examples/WEB-INF/classes/async/Async0.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExceptionHandlerSynchronization.java | 77
grid/app/thrid/guava-20.0.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HibernateSessionFactoryBinding.java | 58
web/tomcat/webapps/docs/cgi-howto.html | 133
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/HistoryProcessInstanceQueryImpl.java | 123
Source/Service/LogService/properties/Timer.properties | 5
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JmsXATopicListener.java | 141
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/DoubleVariable.java | 50
web/tomcat/webapps/examples/jsp/checkbox/CheckTest.html | 56
web/tomcat/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.class | 0
Source/ThirdPart/DBSync/lib/quartz-2.1.3.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/job/Job.java | 71
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailTemplate.java | 132
grid/jre/bin/api-ms-win-core-heap-l1-1-0.dll | 0
Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/CSRoleRightPanelV2.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/job/TimerImpl.java | 181
web/tomcat/webapps/examples/META-INF/context.xml | 21
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/FloatBinding.java | 55
web/tomcat/webapps/examples/jsp/xml/xml.html | 31
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Jdk14Log.java | 97
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryVariableImpl.java | 118
Source/Client/PLTClient/src/com/vci/client/oq/ui/QTPanelForLink.java | 9
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesDecisionActivity.java | 55
Source/Client/PLTClient/src/com/vci/client/uif/actions/client/ImportBOAction.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RepositoryServiceBinding.java | 47
grid/app/thrid/bsf-2.3.0.jar | 0
web/tomcat/webapps/manager/images/asf-logo.svg | 226
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/job/CommandMessage.java | 59
grid/jre/bin/api-ms-win-crt-filesystem-l1-1-0.dll | 0
Source/Service/CacheService/src/com/vci/server/cache/delegate/VciCacheServerDelegate.java | 104
grid/jre/bin/javaw.exe | 0
Source/Common/PLTCommon/.classpath | 2
grid/jre/bin/dtplugin/npdeployJava1.dll | 0
Source/Client/PLTClient/src/com/vci/client/uif/actions/client/ImportLOAction.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JpdlAutomaticActivity.java | 24
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExecutor.java | 228
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/AuthorizationInterceptorBinding.java | 44
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIDataController.java | 1
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/Launcher.java | 84
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JobTestHelperBinding.java | 47
Source/ThirdPart/jbpm.4.3.2/src/jpdl-4.3.xsd | 1400
web/tomcat/bin/ciphers.sh | 60
web/tomcat/webapps/examples/jsp/jsp2/jspattribute/HelloWorldSimpleTag.java.html | 33
Source/Client/PLTClient/src/com/vci/client/log/delegate/LogManagementClientDelegate.java | 227
web/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.html | 33
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.java | 37
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryProcessInstanceMigrationImpl.java | 49
grid/app/thrid/jee-management-1.1.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/session/DbSession.java | 125
grid/jre/README.txt | 1
Source/Common/PLTCommon/dist/plt-common.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/cmd/Command.java | 14
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateProcessDefinitionQueryCmd.java | 41
grid/jre/lib/fonts/LucidaTypewriterRegular.ttf | 0
web/tomcat/temp/safeToDelete.tmp | 0
Source/Client/PLTClient/src/com/vci/client/logon/client/VCISpecialModuleMainTreeCellRenderer.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/JobQuery.java | 75
Source/ThirdPart/jbpm.4.3.2/lib/subethasmtp-wiser.jar | 0
web/tomcat/webapps/docs/annotationapi/index.html | 34
web/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.html | 37
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptDialog.java | 2
web/tomcat/webapps/examples/servlets/sessions.html | 70
grid/jre/legal/jdk/pkcs11wrapper.md | 46
web/tomcat/webapps/docs/config/context.html | 1234
grid/jre/bin/jsound.dll | 0
Source/Service/WFWorkItem/dist/WFPlugins.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EndActivity.java | 93
web/tomcat/webapps/docs/tribes/status.html | 8
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/LongDescriptor.java | 51
web/tomcat/webapps/examples/WEB-INF/classes/async/Async1.java | 62
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/DbidGenerator.java | 47
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/ScriptManager.java | 140
Source/ThirdPart/jbpm.4.3.2/lib/drools-api.jar | 0
Source/ThirdPart/jbpm.4.3.2/migration/lib/jta-1.1.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobHistoryEntry.java | 37
web/tomcat/webapps/docs/config/cluster-interceptor.html | 275
web/tomcat/webapps/docs/config/jar-scan-filter.html | 141
grid/jre/legal/jdk/ecc.md | 581
Source/Client/PLTClient/src/com/vci/client/framework/specialrole/SelectUserDialog.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/SkipInterceptor.java | 46
web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.class | 0
grid/jre/lib/cmm/PYCC.pf | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SuspendDeploymentCmd.java | 65
web/tomcat/lib/servlet-api.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/AddressTemplate.java | 63
grid/app/thrid/jcalendar-1.3.3.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SubscribeBinding.java | 82
grid/app/service/VolumeService.jar | 0
web/tomcat/webapps/docs/config/cluster-listener.html | 35
Source/ThirdPart/jbpm.4.3.2/migration/lib/juel-2.1.0.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$CounterListener.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/MailActivity.java | 51
web/tomcat/webapps/examples/jsp/snp/snoop.html | 31
grid/jre/bin/rmid.exe | 0
Source/Client/PLTClient/src/com/vci/client/ui/image/BundleImage.java | 66
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/BusinessCalendar.java | 33
Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtexport/LinkQTExportData.java | 3
grid/jre/bin/javacpl.exe | 0
Source/ThirdPart/jbpm.4.3.2/lib/hibernate-annotations.jar | 0
web/tomcat/webapps/examples/WEB-INF/tags/displayProducts.tag | 55
web/tomcat/webapps/docs/jndi-resources-howto.html | 1024
grid/app/service/WFService.jar | 0
grid/jre/lib/currency.data | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/ResumeDeploymentCmd.java | 49
Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-entitymanager-3.4.0.GA.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/AttachmentTemplate.java | 79
Source/Client/PLTClient/src/com/vci/client/common/IconSelectDialog.java | 2
web/tomcat/webapps/examples/jsp/jsp2/jspx/svgexample.html | 46
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/PropertyBinding.java | 104
Source/ThirdPart/DBSync/lib/junit-4.12.jar | 0
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/filesync/ORBHelper.java | 268
web/tomcat/lib/catalina-tribes.jar | 0
Source/ThirdPart/jbpm.4.3.2/lib/jbpm-console-integration.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ProcessInstanceCreate.java | 45
Source/ThirdPart/jbpm.4.3.2/lib/hibernate-cglib-repack.jar | 0
web/tomcat/webapps/examples/jsp/tagplugin/foreach.html | 36
grid/jre/lib/management-agent.jar | 0
web/tomcat/webapps/examples/jsp/forward/forward.jsp.html | 34
Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryDialog.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskActivityStart.java | 76
web/tomcat/webapps/examples/jsp/include/foo.jsp | 17
web/tomcat/webapps/docs/appdev/processes.html | 273
Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtimport/LinkQTImportTree.java | 5
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/UnresolvedTransition.java | 49
Source/Service/OQService/src/com/vci/server/ObjectQueryBoxService.java | 13
web/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java | 144
grid/app/common/plt-common.jar | 0
web/tomcat/bin/catalina-tasks.xml | 39
Source/Client/PLTClient/src/com/vci/client/logon/client/LogonFrame.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Jdk14LogFactory.java | 80
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.class | 0
Source/Service/BOFactory/src/com/vci/server/bof/server/update/revision/BatchRevisionBO.java | 4
web/tomcat/webapps/examples/jsp/tagplugin/if.html | 36
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesActivity.java | 70
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.java | 497
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryTask.java | 64
web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$CompletedFuture.class | 0
web/tomcat/webapps/examples/jsp/snp/snoop.jsp | 56
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.java | 46
web/tomcat/webapps/examples/WEB-INF/classes/colors/ColorGameBean.class | 0
Source/Service/LogService/src/com/vci/server/log/dao/LogDAOImpl.java | 8
Source/ThirdPart/DBSync/lib/log4j-1.2.17.jar | 0
grid/jre/legal/jdk/jpeg.md | 83
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/FileStreamInput.java | 72
web/tomcat/webapps/examples/WEB-INF/jsp/applet/Clock2.java | 229
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/ClobStrategyChopped.java | 50
web/tomcat/webapps/docs/web-socket-howto.html | 115
web/tomcat/webapps/examples/WEB-INF/classes/async/Async2$1.class | 0
web/tomcat/webapps/examples/jsp/tagplugin/choose.jsp.html | 55
Source/Service/CacheService/.settings/com.zeroc.IceBuilderPlugin.prefs | 2
Source/Service/LogService/src/com/vci/server/log/objects/LogPeriod.java | 26
web/tomcat/webapps/examples/jsp/checkbox/check.html | 38
grid/jre/bin/hprof.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/SerializableToBytesConverter.java | 82
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/MessageSessionBinding.java | 81
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetSubTasksCmd.java | 57
grid/jre/bin/JavaAccessBridge-64.dll | 0
grid/jre/legal/javafx/gstreamer.md | 536
web/tomcat/webapps/docs/appdev/deployment.html | 202
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/DefaultObservable.java | 74
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/Policy.java | 27
grid/app/thrid/rsyntax.jar | 0
web/tomcat/webapps/examples/jsp/sessions/crt.html | 34
web/tomcat/webapps/examples/jsp/images/return.gif | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobParcel.java | 59
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryTaskInstanceImpl.java | 48
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/JuelScriptEngineFactory.java | 187
Source/Client/PLTClient/src/com/vci/client/oq/ui/ExpLQTDialog.java | 7
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/ReflectUtil.java | 315
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistoryEvent.java | 66
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/AvgDurationPerActivityQueryCmd.java | 76
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/Transaction.java | 40
Source/ThirdPart/jbpm.4.3.2/lib/ant-launcher.jar | 0
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/exception/IllegalCommandException.java | 48
web/tomcat/lib/tomcat-i18n-es.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HistorySessionsBinding.java | 55
grid/app/common/icegridgui.jar | 0
web/tomcat/lib/tomcat-websocket.jar | 0
Source/ThirdPart/DBSync/lib/commons-logging-1.1.1.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/GroupBinding.java | 48
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/ShortToLongConverter.java | 44
grid/jre/bin/JAWTAccessBridge-64.dll | 0
web/tomcat/webapps/examples/WEB-INF/classes/HelloWorldExample.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/DescriptorException.java | 19
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/DeployerManager.java | 83
Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/RoleRightPanel.java | 2
Source/ThirdPart/jbpm.4.3.2/migration/lib/drools-api-5.0.1.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ProvidedObjectDescriptor.java | 81
grid/jre/bin/server/jvm.dll | 0
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Node.java | 60
grid/app/thrid/poi-ooxml-schemas-3.9-20121203.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/jbpm.tx.jta.cfg.xml | 36
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/WireObjectEventInfo.java | 27
grid/jre/bin/glass.dll | 0
web/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp | 116
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/session/MessageSession.java | 33
web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_pt.properties | 48
web/tomcat/webapps/examples/WEB-INF/classes/sessions/DummyCart.class | 0
Source/Client/PLTClient/src/com/vci/client/uif/engine/client/tree/TreePanel.java | 3
web/tomcat/webapps/docs/RUNNING.txt | 477
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JobExecutorBinding.java | 95
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/MailTemplateBinding.java | 136
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/DbSessionDescriptor.java | 67
grid/jre/lib/ext/jfxrt.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.java | 24
web/tomcat/bin/ciphers.bat | 58
Source/Service/OMDService/dist/OMDService.jar | 0
web/tomcat/bin/version.bat | 58
web/tomcat/webapps/examples/WEB-INF/classes/error/Smart.class | 0
grid/jre/bin/w2k_lsa_auth.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ContextRefDescriptor.java | 31
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/GetNextDueDateCmd.java | 61
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TransactionRefBinding.java | 46
grid/properties/redis.properties | 22
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/IntBinding.java | 55
Source/ThirdPart/jbpm.4.3.2/migration/lib/joda-time-1.6.jar | 0
web/tomcat/conf/context.xml | 30
Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/ModelManagementPanel.java | 8
web/tomcat/webapps/docs/tribes/developers.html | 8
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/SysConfigTreeCellRenderer.java | 2
web/tomcat/webapps/docs/host-manager-howto.html | 209
Source/platformProject/platform-parent.iml | 12
grid/jre/lib/deploy/messages_pt_BR.properties | 32
web/tomcat/webapps/docs/images/asf-logo.svg | 226
web/tomcat/webapps/docs/class-loader-howto.html | 249
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/GroupImpl.java | 79
web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.java | 135
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/Task.java | 119
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/ListLabelCellRender.java | 2
Source/Service/FrameService/src/com/vci/server/framework/FrameworkServiceImpl.java | 228
grid/jre/bin/resource.dll | 0
web/tomcat/webapps/host-manager/css/manager.css | 141
web/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.jsp.html | 91
Source/ThirdPart/jbpm.4.3.2/lib/subethasmtp-smtp.jar | 0
web/tomcat/webapps/docs/mbeans-descriptors.dtd | 247
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/job/JobImpl.java | 197
web/tomcat/webapps/examples/jsp/jsp2/jspx/basic.jspx.html | 49
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryPriorityUpdateImpl.java | 49
web/tomcat/webapps/docs/config/host.html | 592
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessBinding.java | 164
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/TaskServiceImpl.java | 206
grid/jre/lib/deploy/splash_11-lic.gif | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/spi/MailSession.java | 16
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/HqlBinding.java | 88
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JtaTransactionInterceptorBinding.java | 56
grid/jre/lib/images/cursors/win32_MoveDrop32x32.gif | 0
grid/jre/bin/java-rmi.exe | 0
web/tomcat/webapps/examples/WEB-INF/classes/async/Async1$1.class | 0
web/tomcat/webapps/examples/WEB-INF/web.xml | 418
Source/ThirdPart/jbpm.4.3.2/src/jbpm.identity.cfg.xml | 9
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryCommentImpl.java | 78
web/tomcat/webapps/docs/index.html | 190
Source/Client/PLTClient/src/com/vci/client/oq/ui/ImpQT.java | 5
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BlobStrategy.java | 7
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.java | 42
grid/jre/bin/vcruntime140.dll | 0
web/tomcat/webapps/docs/developers.html | 47
web/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp.html | 47
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/ProcessState.java | 40
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/CreateUserCmd.java | 61
grid/app/thrid/avalon-framework-4.1.5.jar | 0
grid/jre/lib/security/trusted.libraries | 0
web/tomcat/webapps/docs/websocketapi/index.html | 34
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ActivityStart.java | 61
grid/jre/bin/api-ms-win-core-rtlsupport-l1-1-0.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SavePolicy.java | 32
Source/Client/PLTClient/src/com/vci/client/log/ui/LogPeriodObject.java | 25
Source/ThirdPart/DBSync/lib/dom4j-1.6.1.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/JbossIdmIdentitySessionFactoryDescriptor.java | 72
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/PvmEnvironment.java | 56
Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/RoleRightTreeCellRenderer.java | 2
grid/jre/bin/zip.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/EventExceptionHandlerBuilder.java | 60
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SqlBinding.java | 39
web/tomcat/webapps/examples/WEB-INF/classes/RequestHeaderExample.class | 0
Source/Client/PLTClient/src/com/vci/client/auth2/view/CheckRightResultView.java | 3
grid/jre/legal/jdk/joni.md | 27
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/FindUsersCmd.java | 43
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/UnresolvedTransitions.java | 35
web/tomcat/webapps/examples/websocket/drawboard.xhtml | 899
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/DateToLongConverter.java | 46
grid/jre/bin/api-ms-win-core-profile-l1-1-0.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/VersionTimestampPolicy.java | 149
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/UrlEntity.java | 69
Source/Client/PLTClient/src/com/vci/client/logon/client/VciApplet.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/AbstractTransaction.java | 49
grid/jre/lib/security/blacklist | 95
Source/Service/WFService/build-jar.xml | 4
Source/ThirdPart/jbpm.4.3.2/lib/mockrunner.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/InvokeOperation.java | 85
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CompleteTaskCmd.java | 72
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/AddressResolverBinding.java | 43
Source/ThirdPart/jbpm.4.3.2/migration/lib/activation-1.1.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/PatternDescriptor.java | 69
grid/jre/lib/ext/dnsns.jar | 0
web/tomcat/webapps/docs/monitoring.html | 1118
web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$1.class | 0
grid/jre/bin/dt_shmem.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/Converter.java | 47
grid/app/thrid/xmlbeans-2.3.0.jar | 0
Source/Common/PLTCommon/build.properties | 3
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/DoubleDescriptor.java | 55
Source/ThirdPart/DBSync/dbsync/readme.txt | 54
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/StartActivity.java | 46
grid/jre/bin/jfr.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/StringUtil.java | 61
Source/Client/PLTClient/src/com/vci/client/uif/actions/client/UIFUtils.java | 13
grid/jre/lib/content-types.properties | 276
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/HibernateStringVariable.java | 44
grid/jre/bin/jp2native.dll | 0
grid/properties/ServerLog4j2.xml | 25
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskComplete.java | 67
grid/jre/bin/unpack.dll | 0
web/tomcat/lib/tomcat-jdbc.jar | 0
grid/jre/legal/jdk/thaidict.md | 31
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/TransitionEndActivity.java | 69
web/tomcat/bin/digest.bat | 58
web/tomcat/webapps/docs/config/globalresources.html | 220
Source/Client/PLTClient/src/com/vci/client/log/ui/LogInfoMainPanel.java | 39
Source/Client/PLTClient/src/com/vci/client/omd/statepool/ui/ImageSelectDialog.java | 2
web/tomcat/webapps/examples/WEB-INF/classes/filters/ExampleFilter.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SeamHibernateSessionBinding.java | 48
Source/ThirdPart/jbpm.4.3.2/migration/lib/jboss-j2ee-4.2.2.GA.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryActivityInstanceQuery.java | 84
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/EnvRefBinding.java | 47
grid/jre/bin/api-ms-win-core-handle-l1-1-0.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/NewTaskCmd.java | 50
web/tomcat/webapps/examples/jsp/jsp2/simpletag/book.jsp | 55
web/tomcat/webapps/docs/config/cluster-sender.html | 133
Source/Service/FrameService/src/com/vci/server/framework/cache/VolumeCatch.java | 106
web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_de.properties | 28
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/ListLabelCellRenderForRightRole.java | 2
Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-common-1.0.0.Beta1.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker$TickListener.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/StreamInput.java | 46
Source/ThirdPart/jbpm.4.3.2/lib/javassist.jar | 0
web/tomcat/webapps/docs/appdev/sample/src/mypackage/Hello.java | 83
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/ProcessInstanceQueryImpl.java | 135
web/tomcat/webapps/docs/virtual-hosting-howto.html | 110
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/problem/ProblemListener.java | 33
grid/jre/lib/ext/sunmscapi.jar | 0
grid/jre/lib/management/snmp.acl.template | 110
web/tomcat/webapps/docs/config/http2.html | 236
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/CreateGroupCmd.java | 50
Source/Service/LogService/src/properties/RMIPFramework_zh.properties | 798
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/AbstractQuery.java | 180
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Binding.java | 46
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/Jpdl3Converter.java | 882
web/tomcat/webapps/docs/realm-howto.html | 1183
Source/ThirdPart/jbpm.4.3.2/lib/jbpm-bpmn.jar | 0
web/tomcat/webapps/manager/WEB-INF/jsp/sessionsList.jsp | 170
grid/jre/bin/api-ms-win-core-file-l1-2-0.dll | 0
web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.class | 0
web/tomcat/webapps/examples/jsp/cal/cal1.jsp | 94
web/tomcat/webapps/manager/WEB-INF/jsp/404.jsp | 63
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/MailListener.java | 67
Source/Service/LogService/src/com/vci/server/LogServiceMain.java | 10
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/TransitionStartActivity.java | 96
grid/jre/lib/deploy/splash_11@2x-lic.gif | 0
Source/ThirdPart/jbpm.4.3.2/lib/jboss-j2ee.jar | 0
Source/ThirdPart/jbpm.4.3.2/migration/lib/cglib-nodep-2.1_3.jar | 0
grid/jre/lib/ext/nashorn.jar | 0
web/tomcat/webapps/docs/architecture/requestProcess.html | 43
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Parse.java | 284
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SkipInterceptorBinding.java | 44
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1$1.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/CompositeBuilder.java | 143
web/tomcat/webapps/ROOT/index.jsp | 219
Source/Client/PLTClient/src/com/vci/client/workflow/task/ProcessControlPanel.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/PropertyImpl.java | 201
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/CommandServiceBinding.java | 82
web/tomcat/webapps/examples/jsp/plugin/applet/Clock2.class | 0
Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/UndoCheckOutBO.java | 4
Source/ThirdPart/jbpm.4.3.2/lib/jline.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/StandardSynchronization.java | 54
Source/ThirdPart/jbpm.4.3.2/lib/slf4j-jdk14.jar | 0
grid/app/thrid/xmlsec-1.3.0.jar | 0
Source/Service/OQService/dist/OQService.jar | 0
Source/Service/CacheService/properties/corba.properties | 16
Source/ThirdPart/jbpm.4.3.2/migration/lib/juel-engine-2.1.0.jar | 0
Source/ThirdPart/jbpm.4.3.2/migration/lib/mvel2-2.0.10.jar | 0
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/VariableAccess.java | 93
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/UsersExcelImportDialogActionListener.java | 15
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/TaskBinding.java | 50
Source/ThirdPart/DBSync/dbsync/properties/dbjobs.xml | 104
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JndiBinding.java | 54
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RightRoleDialog.java | 2
Source/Client/PLTClient/src/com/vci/client/log/ui/LogQueryBaseMainPanel.java | 85
web/tomcat/bin/shutdown.bat | 58
web/tomcat/webapps/docs/config/http.html | 1743
grid/jre/legal/jdk/zlib.md | 27
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/EnvironmentInterceptor.java | 77
Source/Client/PLTClient/src/com/vci/client/workflow/task/DoneProcessPanel.java | 2
web/tomcat/README.md | 81
grid/jre/bin/jpeg.dll | 0
Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryTreeCellRender.java | 2
web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.java | 75
Source/ThirdPart/jbpm.4.3.2/lib/freemarker.jar | 0
grid/jre/bin/mlib_image.dll | 0
grid/jre/bin/api-ms-win-core-file-l1-1-0.dll | 0
web/tomcat/webapps/examples/WEB-INF/classes/util/CookieFilter.java | 85
web/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.jsp.html | 36
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessInParameterImpl.java | 46
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/PolicyEvaluation.java | 49
Source/Service/VciServiceMain/logs/server_log.log | 1462
web/tomcat/webapps/docs/servletapi/index.html | 34
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.class | 0
web/tomcat/webapps/examples/jsp/error/error.html | 37
grid/jre/legal/javafx/icu_web.md | 421
web/tomcat/webapps/docs/images/void.gif | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/ejb/JbpmEjbMockTestCase.java | 46
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/FindGroupCmd.java | 47
grid/app/thrid/xml-apis.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ProcessEngineDescriptor.java | 25
grid/app/thrid/juel-engine.jar | 0
web/tomcat/bin/daemon.sh | 293
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/AssignmentHandler.java | 37
grid/app/thrid/poi-3.9-20121203.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/HibernateStringIdMatcher.java | 43
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/job/Message.java | 30
grid/app/thrid/slf4j-jdk14-1.7.14.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.java | 34
grid/jre/bin/ssvagent.exe | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryDetail.java | 44
grid/jre/lib/management/management.properties | 331
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryDetailQuery.java | 75
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/Matcher.java | 9
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/TagBinding.java | 91
web/tomcat/webapps/docs/appdev/installation.html | 73
Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-test-base-4.3.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jms/JmsMessageSession.java | 95
Source/Client/PLTClient/src/com/vci/client/utils/excel/ExcelCellStyleSettingCallback.java | 7
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/ExecuteActivity.java | 82
Source/Service/FrameService/src/properties/hibernate.map.xml | 1
Source/ThirdPart/jbpm.4.3.2/migration/lib/dom4j-1.6.1.jar | 0
Source/ThirdPart/jbpm.4.3.2/lib/jbpm-test-db-tests.jar | 0
web/tomcat/webapps/docs/architecture/overview.html | 104
Source/Service/CacheService/src/com/vci/server/CacheBoxService.java | 44
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/ExecutionContext.java | 82
Source/Service/WFService/src/com/vci/server/workflow/server/interfaceImpl/WorkFlowUserParserImpl.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/JpdlBindingsParser.java | 79
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/ErrorTriggeredFileHandler.java | 115
grid/jre/lib/security/policy/unlimited/local_policy.jar | 0
grid/properties/service.xml | 14
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetTaskVariablesCmd.java | 59
Source/ThirdPart/jbpm.4.3.2/lib/gson.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.java | 75
Source/Service/OQService/build-jar.xml | 4
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BlobStrategyBlob.java | 32
Source/Service/ServiceBase/src/com/vci/server/cache/OrgCacheProvider.java | 12
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Join.java | 37
web/tomcat/webapps/docs/config/cluster-receiver.html | 117
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/PropertyOperation.java | 77
web/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.jsp.html | 40
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/WireProperties.java | 73
web/tomcat/webapps/examples/jsp/security/protected/index.jsp.html | 113
web/tomcat/webapps/examples/websocket/chat.xhtml | 136
grid/jre/lib/jfxswt.jar | 0
Source/Service/VciServiceMain/dist/VciServiceMain.jar | 0
web/tomcat/webapps/examples/jsp/tagplugin/choose.html | 36
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionHandlerActivity.java | 75
grid/jre/bin/java.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ObservableElementImpl.java | 99
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/EnvironmentInterceptorBinding.java | 57
Source/Service/CacheService/build-jar.xml | 36
Source/ThirdPart/jbpm.4.3.2/src/jbpm.jbossremote.cfg.xml | 24
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/CompositeElement.java | 67
grid/jre/bin/gstreamer-lite.dll | 0
web/tomcat/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.java | 36
Source/Client/PLTClient/src/com/vci/client/portal/UI/UIDesinDialog.java | 5
Source/Service/CacheService/build.properties | 16
grid/app/common/commons-lang3-3.1.jar | 0
web/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.jsp | 39
web/tomcat/webapps/manager/status.xsd | 84
Source/ThirdPart/jbpm.4.3.2/migration/lib/livetribe-jsr223-2.0.5.jar | 0
Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSRoleRightPanel.java | 2
grid/jre/lib/jfr/profile.jfc | 586
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.class | 0
Source/ThirdPart/DBSync/dbsync/.settings/org.eclipse.jdt.core.prefs | 11
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/ChoiceDistributionQueryCmd.java | 76
Source/Service/VolumeService/build.properties | 4
Source/Service/FrameService/src/com/vci/server/FrameServiceMain.java | 10
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/VariableDefinitionImpl.java | 99
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/test/JobTestHelper.java | 85
web/tomcat/webapps/docs/images/cors-flowchart.png | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/PropertiesBinding.java | 96
web/tomcat/lib/el-api.jar | 0
Source/Service/OQService/src/com/vci/server/query/ObjectQueryServiceImpl.java | 12
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ObjectDescriptor.java | 462
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/activity/ActivityBehaviour.java | 41
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/MailSessionBinding.java | 137
web/tomcat/webapps/examples/WEB-INF/classes/RequestHeaderExample.java | 109
web/tomcat/webapps/examples/websocket/snake.xhtml | 266
web/tomcat/lib/websocket-api.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker$Stock.class | 0
grid/jre/bin/attach.dll | 0
Source/ThirdPart/jbpm.4.3.2/migration/lib/javassist-3.4.GA.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/usercode/UserCodeEventListener.java | 48
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/VariableUpdate.java | 55
grid/jre/bin/glib-lite.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesFact.java | 74
web/tomcat/lib/tomcat-dbcp.jar | 0
grid/application.xml | 332
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/FindGroupIds.java | 35
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/FindGroupsCmd.java | 58
web/tomcat/webapps/docs/architecture/index.html | 35
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/FloatToStringConverter.java | 45
web/tomcat/webapps/examples/WEB-INF/classes/checkbox/CheckTest.class | 0
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptInfoTreeTableCellRender.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SignalCmd.java | 65
web/tomcat/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/StartJBossTask.java | 82
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/XPathScriptEngineFactory.java | 111
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/package.html | 4
Source/Client/PLTClient/src/com/vci/client/framework/specialrole/PasswordStrategySetingDialog.java | 2
web/tomcat/webapps/docs/config/resources.html | 278
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindProcessDefinitionByIdCmd.java | 47
grid/jre/lib/deploy/messages_fr.properties | 32
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ExecutionServiceBinding.java | 47
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindExecutionCmd.java | 51
Source/Common/PLTCommon/src/com/vci/common/ServiceNames.java | 26
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/FloatToDoubleConverter.java | 45
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/UpdateDeploymentResourceCmd.java | 55
grid/jre/bin/ktab.exe | 0
web/tomcat/webapps/examples/WEB-INF/classes/async/Async2.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/package.html | 2
Source/ThirdPart/jbpm.4.3.2/migration/lib/jaxb-api-2.1.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SetBinding.java | 49
grid/jre/bin/server/Xusage.txt | 24
web/tomcat/webapps/docs/config/executor.html | 85
web/tomcat/webapps/manager/WEB-INF/jsp/sessionDetail.jsp | 197
grid/app/thrid/commons-codec-1.3.jar | 0
grid/jre/lib/tzdb.dat | 0
grid/jre/lib/accessibility.properties | 6
Source/Service/BOFactory/src/com/vci/server/bof/server/create/CreateBOLO.java | 4
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/PassthroughBinding.java | 42
Source/Service/LogService/src/com/vci/server/log/utils/LogTypeUtil.java | 31
grid/jre/legal/javafx/libxml2.md | 30
web/tomcat/bin/tomcat8w.exe | 0
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$MessageType.class | 0
Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-core-3.3.1.GA.jar | 0
grid/app/thrid/commons-logging-1.0.4.jar | 0
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/Main.java | 21
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailProducerImpl.java | 412
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/HistoryTaskQueryImpl.java | 189
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/DeployerManagerBinding.java | 75
Source/ThirdPart/DBSync/lib/hamcrest-core-1.3.jar | 0
grid/app/thrid/juel.jar | 0
grid/jre/bin/sawindbg.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/FalseBinding.java | 46
grid/jre/lib/management/jmxremote.access | 79
web/tomcat/webapps/docs/config/valve.html | 2040
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/jms/JbpmJmsMockTestCase.java | 68
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/StandardResource.java | 36
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RepositoryCache.java | 42
grid/jre/bin/api-ms-win-core-util-l1-1-0.dll | 0
Source/Service/FrameService/src/com/vci/server/framework/delegate/MachSecurityDelegate.java | 24
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/job/MessageImpl.java | 47
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/package.html | 3
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/ConverterContext.java | 59
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/FindUserCmd.java | 47
Source/Client/PLTClient/src/com/vci/client/ui/swing/KJButton.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/BshScriptEngine.java | 340
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/Chop.java | 39
Source/Client/PLTClient/src/com/vci/client/oq/ui/export/QTExportTree.java | 5
Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryTypeDialog.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/Activity.java | 111
web/tomcat/webapps/examples/jsp/jsp2/misc/coda.jspf | 21
Source/Client/PLTClient/src/com/vci/client/omd/enumManager/ui/EnumItemPanel.java | 7
web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/DbSessionBinding.java | 54
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CommandService.java | 26
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryTaskDuedateUpdateImpl.java | 51
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/LogFormatter.java | 83
Source/Service/LogService/src/com/vci/server/LogBoxService.java | 45
web/tomcat/RUNNING.txt | 477
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/StateBinding.java | 42
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ListBinding.java | 51
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/HistoryService.java | 56
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RepositoryCacheImpl.java | 103
Source/ThirdPart/jbpm.4.3.2/lib/activation.jar | 0
grid/jre/legal/jdk/icu.md | 66
web/tomcat/webapps/docs/images/code.gif | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/ClassLoaderContext.java | 30
Source/ThirdPart/DBSync/dbsync/build-jar.xml | 26
Source/ThirdPart/jbpm.4.3.2/src/jbpm.default.cfg.xml | 70
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/EnvBinding.java | 52
web/tomcat/webapps/host-manager/index.jsp | 18
grid/app/thrid/sapjco.jar | 0
grid/jre/bin/api-ms-win-core-synch-l1-2-0.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/InputStreamInput.java | 46
grid/jre/lib/logging.properties | 59
grid/jre/lib/security/java.policy | 49
grid/jre/lib/classlist | 2469
grid/jre/bin/jsoundds.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/LifeCycle.java | 95
web/tomcat/webapps/examples/websocket/index.xhtml | 32
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RefBinding.java | 55
Source/Client/PLTClient/src/com/vci/client/log/ui/LogOperateMainPanel.java | 40
web/tomcat/CONTRIBUTING.md | 165
grid/jre/lib/security/cacerts | 0
grid/jre/bin/api-ms-win-core-processthreads-l1-1-0.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetExecutionVariablesCmd.java | 69
grid/app/thrid/ognl-2.6.11.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ShortDescriptor.java | 62
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/rules/ExecutionGlobals.java | 43
grid/jre/lib/deploy/splash@2x.gif | 0
web/tomcat/webapps/examples/jsp/num/numguess.html | 34
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/Deployment.java | 52
Source/ThirdPart/jbpm.4.3.2/lib/slf4j-api.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/HibernateIdMatcher.java | 78
grid/jre/lib/security/policy/unlimited/US_export_policy.jar | 0
Source/Service/FrameService/src/com/vci/server/framework/volume/delegate/PvolumeDelegate.java | 26
web/tomcat/webapps/docs/cluster-howto.html | 647
web/tomcat/webapps/examples/WEB-INF/classes/dates/JspCalendar.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryDetailImpl.java | 118
Source/Service/FrameService/.classpath | 2
web/tomcat/webapps/examples/jsp/sessions/DummyCart.html | 56
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/OpenTask.java | 43
grid/properties/ClientLog4j2.xml | 25
Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateDeleteBOLO.java | 19
web/tomcat/webapps/examples/jsp/simpletag/foo.jsp | 38
grid/app/service/OMDService.jar | 0
web/tomcat/webapps/examples/jsp/async/async3.jsp.html | 26
web/tomcat/webapps/examples/jsp/cal/JspCalendar.java.html | 153
Source/ThirdPart/jbpm.4.3.2/lib/antlr-runtime.jar | 0
Source/Client/PLTClient/src/com/vci/client/logon/client/VCIModuleMainTreeCellRenderer.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/CompositeExceptionHandlerBuilder.java | 59
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/MachSecurityPanel.java | 4
grid/jre/lib/ext/meta-index | 69
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/JbpmClassNotFoundException.java | 40
Source/Common/PLTSlice/build.properties | 3
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JavaBinding.java | 81
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/xml/BindingParser.java | 66
web/tomcat/webapps/examples/WEB-INF/classes/ServletToJsp.java | 39
web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.java | 148
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/BooleanHelper.java | 42
grid/app/thrid/javassist-3.12.0.GA.jar | 0
grid/jre/bin/dtplugin/deployJava1.dll | 0
Source/Service/ServiceBase/src/com/vci/server/base/utility/ServerServiceProvider.java | 44
grid/jre/lib/images/cursors/win32_CopyDrop32x32.gif | 0
web/tomcat/webapps/examples/WEB-INF/tags/helloWorld.tag | 17
Source/Service/CacheService/.project | 28
Source/Service/UIService/src/com/vci/server/portal/cache/PortalVICacheUtil.java | 10
grid/app/common/dom4j-1.6.1.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/DispatcherThread.java | 184
Source/Service/BOFactory/src/com/vci/server/bof/server/update/BatchUpdateBO.java | 16
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ScriptManagerBinding.java | 96
Source/Service/LogService/build.properties | 16
Source/Client/PLTClient/src/com/vci/client/log/ui/LogManagementPanel.java | 714
web/tomcat/webapps/docs/jndi-datasource-examples-howto.html | 637
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/SwimlaneDefinitionImpl.java | 33
web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location.java | 73
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/FilterListener.java | 56
grid/jre/lib/images/cursors/cursors.properties | 40
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ObservableBuilder.java | 69
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/MembershipImpl.java | 67
web/tomcat/webapps/docs/introduction.html | 258
Source/Service/LogService/src/com/vci/server/log/delegate/LogManagementDelegate.java | 460
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/utils/Tool.java | 88
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/HistorySessionDescriptor.java | 56
Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/CheckOutBO.java | 4
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/action/ActionConverterTypes.java | 109
Source/ThirdPart/jbpm.4.3.2/lib/idm-common.jar | 0
grid/jre/LICENSE | 1
Source/Client/PLTClient/src/com/vci/client/auth2/view/RoleSelectView.java | 2
Source/Service/FrameService/build-jar.xml | 4
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteDeploymentCmd.java | 97
grid/jre/bin/java_crw_demo.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ManagementService.java | 42
web/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/ExecuteJobCmd.java | 118
Source/build.properties | 12
web/tomcat/webapps/host-manager/images/tomcat.svg | 967
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/CollectionDescriptor.java | 111
Source/Common/PLTCommon/build-jar.xml | 3
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindProcessDefinitionKeysCmd.java | 43
web/tomcat/webapps/examples/jsp/num/numguess.jsp | 69
Source/Client/PLTClient/src/com/vci/client/ui/date/PopupCalendarMethod.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/FlowBuilder.java | 84
Source/Service/CacheService/src/properties/ServerWithLog4j.properties | 10
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RepositoryServiceImpl.java | 115
Source/Client/PLTClient/dist/plt-client.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JbossIdmIdentitySessionFactoryBinding.java | 52
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RepositoryCacheBinding.java | 45
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/State.java | 37
grid/jre/bin/api-ms-win-crt-convert-l1-1-0.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/IntegerDescriptor.java | 62
Source/ThirdPart/DBSync/lib/xml-apis-1.0.b2.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/DeleteMembershipCmd.java | 52
web/tomcat/webapps/examples/WEB-INF/jsp/debug-taglib.tld | 54
grid/jre/bin/api-ms-win-crt-environment-l1-1-0.dll | 0
web/tomcat/webapps/examples/jsp/jsp2/misc/config.jsp | 32
web/tomcat/webapps/examples/jsp/jsp2/tagfiles/helloWorld.tag.html | 18
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/DBSync.java | 49
Source/ThirdPart/jbpm.4.3.2/lib/jbpm-console-reports.jar | 0
Source/Client/PLTClient/src/com/vci/client/auth2/action/DelAction.java | 3
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/NullVariable.java | 20
grid/jre/bin/api-ms-win-core-debug-l1-1-0.dll | 0
grid/app/thrid/IKAnalyzer2012FF_u1.jar | 0
Source/Service/OMDService/src/com/vci/server/omd/OMDServiceImpl.java | 33
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateHistoryProcessInstanceQueryCmd.java | 41
grid/jre/lib/deploy/messages_zh_TW.properties | 32
grid/jre/bin/api-ms-win-core-datetime-l1-1-0.dll | 0
Source/ThirdPart/jbpm.4.3.2/lib/mockejb.jar | 0
web/tomcat/webapps/docs/config/cluster-channel.html | 98
grid/jre/bin/fontmanager.dll | 0
grid/jre/legal/jdk/santuario.md | 238
web/tomcat/webapps/docs/appdev/sample/index.html | 55
web/tomcat/webapps/examples/WEB-INF/classes/colors/ColorGameBean.java | 114
web/tomcat/lib/tomcat-i18n-de.jar | 0
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/PasswordSrategyDialog.java | 2
Source/Service/BOFactory/src/com/vci/server/bof/server/create/CreateBO.java | 14
Source/Common/PLTSlice/slice/12-query.ice | 3
Source/Client/PLTClient/src/com/vci/client/uif/actions/client/DataRightReturnNameUtil.java | 3
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/WireInterceptorBinding.java | 35
web/tomcat/webapps/docs/jdbc-pool.html | 887
web/tomcat/webapps/examples/jsp/jsp2/el/functions.jsp | 67
Source/Service/OQService/src/com/vci/server/query/parsers/Parser.java | 49
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/usercode/UserCodeActivityBehaviour.java | 52
web/tomcat/webapps/docs/tribes/introduction.html | 232
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/MoveToChildActivity.java | 55
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/AbstractCollectionBinding.java | 72
web/tomcat/webapps/examples/jsp/error/errorpge.jsp | 25
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/WireDescriptorBinding.java | 34
web/tomcat/webapps/docs/images/fonts/OpenSans700italic.woff | 0
web/tomcat/webapps/examples/WEB-INF/classes/RequestParamExample.java | 111
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/package.html | 2
web/tomcat/RELEASE-NOTES | 178
Source/Service/OMDService/src/com/vci/server/OMDBoxService.java | 13
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/FieldOperation.java | 83
Source/ThirdPart/jbpm.4.3.2/src/jbpm.default.scriptmanager.xml | 16
web/tomcat/webapps/examples/jsp/jsp2/misc/prelude.jspf | 21
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/DefaultTypeSet.java | 70
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EndCancelBinding.java | 43
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/BshScriptEngineFactory.java | 115
grid/jre/bin/prism_sw.dll | 0
web/tomcat/webapps/examples/WEB-INF/classes/async/Async3.java | 39
Source/ThirdPart/jbpm.4.3.2/lib/ant.jar | 0
web/tomcat/webapps/docs/appdev/source.html | 279
Source/Service/VolumeService/dist/VolumeService.jar | 0
web/tomcat/webapps/examples/jsp/tagplugin/choose.jsp | 54
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/IdentitySessionImpl.java | 204
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/InvokeBinding.java | 59
web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/DoubleBinding.java | 55
web/tomcat/webapps/examples/jsp/sessions/carts.jsp.html | 44
grid/jre/THIRDPARTYLICENSEREADME.txt | 3
grid/jre/lib/javafx.properties | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/FalseDescriptor.java | 36
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetDeploymentResourceNamesCmd.java | 54
web/tomcat/webapps/docs/deployer-howto.html | 309
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/TaskImpl.java | 494
Source/Client/PLTClient/src/com/vci/client/workflow/task/ProcessTaskTreeCellRender.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/JtaRetryInterceptor.java | 58
web/tomcat/webapps/examples/WEB-INF/classes/cal/Entries.class | 0
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.java | 25
web/tomcat/webapps/docs/config/credentialhandler.html | 167
Source/Client/PLTClient/src/com/vci/client/portal/UI/dialog/VCIGrandUIPanel.java | 2
web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_ko.properties | 48
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cfg/ConfigurationImpl.java | 200
web/tomcat/webapps/examples/jsp/async/async1.jsp | 28
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/Assignable.java | 40
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryProcessInstanceQuery.java | 75
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/DBInfo.java | 81
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/assertion/CollectionAssertions.java | 61
web/tomcat/webapps/docs/appdev/sample/docs/README.txt | 17
web/tomcat/webapps/docs/config/sessionidgenerator.html | 89
grid/jre/bin/npt.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/Context.java | 57
grid/jre/lib/security/policy/limited/local_policy.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/PropertiesDescriptor.java | 122
grid/app/service/FrameService.jar | 0
grid/jre/bin/api-ms-win-core-errorhandling-l1-1-0.dll | 0
web/tomcat/webapps/docs/BUILDING.txt | 567
Source/ThirdPart/jbpm.4.3.2/lib/jgroups.jar | 0
web/tomcat/webapps/ROOT/bg-nav.png | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/EnvDescriptor.java | 82
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/GroovyCompiledScript.java | 53
Source/Service/LogService/src/properties/RMIPFramework.properties | 796
web/tomcat/webapps/examples/jsp/include/inc.html | 30
Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/BatchUndoCheckOutBO.java | 14
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/WriteBinding.java | 35
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/DayPart.java | 152
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.java | 42
Source/Client/PLTClientBase/build-jar.xml | 2
web/tomcat/webapps/examples/jsp/security/protected/error.jsp | 25
web/tomcat/webapps/manager/WEB-INF/jsp/connectorCerts.jsp | 92
web/tomcat/webapps/examples/jsp/jsp2/jspx/basic.html | 31
grid/jre/lib/images/cursors/win32_CopyNoDrop32x32.gif | 0
Source/ThirdPart/jbpm.4.3.2/src/jbpm.repository.hbm.xml | 59
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/package.html | 2
grid/jre/lib/psfont.properties.ja | 119
Source/ThirdPart/jbpm.4.3.2/lib/mail.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Log4jLog.java | 93
web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.java | 295
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.class | 0
Source/Service/LogService/src/properties/ServerWithLog4j.properties | 10
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/VariableBuilder.java | 64
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/JuelScriptEngine.java | 387
web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$1.class | 0
Source/ThirdPart/jbpm.4.3.2/migration/lib/stax-api-1.0-2.jar | 0
grid/jre/bin/awt.dll | 0
web/tomcat/webapps/docs/config/engine.html | 217
grid/jre/bin/api-ms-win-crt-heap-l1-1-0.dll | 0
grid/jre/legal/jdk/jopt-simple.md | 27
Source/Service/WFService/build.properties | 4
web/tomcat/webapps/examples/servlets/reqinfo.html | 68
Source/Service/FrameService/src/com/vci/server/framework/cache/AppConfigDetailCatch.java | 172
web/tomcat/webapps/docs/images/design.gif | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/ParticipationImpl.java | 99
web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/servers.json | 20
web/tomcat/lib/annotations-api.jar | 0
web/tomcat/webapps/ROOT/bg-upper.png | 0
web/tomcat/webapps/examples/jsp/jsp2/simpletag/HelloWorldSimpleTag.java.html | 33
web/tomcat/webapps/examples/jsp/colors/colors.html | 47
grid/jre/bin/jabswitch.exe | 0
web/tomcat/webapps/docs/config/cookie-processor.html | 166
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryActivityInstance.java | 47
Source/Client/PLTClient/src/com/vci/client/ui/swing/CheckBoxLabel.java | 2
grid/app/thrid/proxool-0.8.3.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExecutorTimerSession.java | 89
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/usercode/UserCodeCondition.java | 45
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/ClobStrategyClob.java | 29
Source/Service/CacheService/.settings/org.eclipse.ltk.core.refactoring.prefs | 3
grid/jre/legal/jdk/bcel.md | 222
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JmsActivity.java | 333
web/tomcat/webapps/host-manager/images/asf-logo.svg | 226
grid/app/thrid/juel-impl.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerText.class | 0
Source/Client/PLTClient/src/com/vci/client/uif/actions/client/DataRightUtil.java | 9
grid/jre/lib/deploy/messages_de.properties | 32
Source/Common/PLTSlice/slice/04-workflow.ice | 588
Source/ThirdPart/jbpm.4.3.2/lib/hsqldb.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Closable.java | 30
grid/app/common/log4j-core-2.12.4.jar | 0
grid/jre/bin/splashscreen.dll | 0
grid/jre/legal/jdk/colorimaging.md | 7
web/tomcat/bin/setclasspath.bat | 94
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/TransitionStartActivityMessage.java | 57
grid/jre/lib/rt.jar | 0
Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBO.java | 13
web/tomcat/conf/logging.properties | 76
web/tomcat/webapps/examples/jsp/cal/cal2.jsp.html | 46
Source/Client/PLTClient/src/com/vci/client/logon/base/AboutCODE.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EndBinding.java | 59
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/model/JpdlProcessDefinition.java | 66
Source/Client/PLTClient/src/com/vci/client/omd/enumManager/toOutside/GetEnumForOut.java | 4
Source/ThirdPart/DBSync/dbsync/properties/dbjobs---.xml | 77
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/hibernate/ExecutionType.java | 136
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JoinActivity.java | 134
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/package.html | 2
Source/ThirdPart/DBSync/lib/slf4j-log4j12-1.7.2.jar | 0
web/tomcat/webapps/examples/jsp/plugin/plugin.html | 30
grid/app/thrid/poi-ooxml-3.9-20121203.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/UnresolvedFlow.java | 34
web/tomcat/webapps/docs/default-servlet.html | 271
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.java | 230
web/tomcat/webapps/examples/jsp/error/err.jsp | 44
Source/ThirdPart/jbpm.4.3.2/lib/jaxb-api.jar | 0
grid/jre/lib/deploy/messages_zh_CN.properties | 32
web/tomcat/webapps/examples/jsp/snp/snoop.jsp.html | 57
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExpressionCondition.java | 54
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/Type.java | 75
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/JobInfo.java | 124
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RolesExcelImportDialogActionListener.java | 4
grid/app/thrid/XmlSchema-1.1.jar | 0
web/tomcat/webapps/docs/api/index.html | 34
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/EnlistBinding.java | 50
grid/jre/legal/jdk/mesa3d.md | 134
Source/ThirdPart/jbpm.4.3.2/lib/groovy-all.jar | 0
web/tomcat/webapps/examples/jsp/dates/date.html | 31
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/MachSecurityDialog.java | 4
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/TextVariable.java | 52
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/ProblemImpl.java | 128
web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerBinary.class | 0
web/tomcat/webapps/examples/jsp/include/include.jsp.html | 31
Source/ThirdPart/jbpm.4.3.2/lib/idm-core.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/listener/EventListenerExecution.java | 41
Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBOLONoCheckLog.java | 13
Source/Service/LogService/src/com/vci/server/log/hbm/Log.hbm.xml | 93
grid/jre/lib/deploy/messages_ko.properties | 32
web/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.jsp | 35
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JavaActivity.java | 113
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/DecisionEnd.java | 50
Source/ThirdPart/jbpm.4.3.2/migration/lib/jline-0.9.94.jar | 0
web/tomcat/webapps/examples/jsp/index.html | 369
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/ScriptBinding.java | 69
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ActivityBuilder.java | 108
Source/ThirdPart/jbpm.4.3.2/lib/servlet-api.jar | 0
Source/ThirdPart/jbpm.4.3.2/migration/lib/jaxb-impl-2.1.8.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/TaskContext.java | 83
Source/ThirdPart/jbpm.4.3.2/lib/bsh.jar | 0
web/tomcat/webapps/examples/jsp/jsp2/el/composite.jsp.html | 111
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailServer.java | 46
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JbossIdmIdentitySessionBinding.java | 49
Source/ThirdPart/DBSync/dbsync/.classpath | 24
grid/app/thrid/c3p0-0.9.1.jar | 0
web/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jspx.html | 54
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AddReplyCommentCmd.java | 58
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/ConsoleHandler.java | 30
web/tomcat/lib/tomcat-api.jar | 0
Bin/web/lib/app.pid | 2
grid/app/thrid/jta-1.1.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/AssignableDefinitionImpl.java | 110
web/tomcat/webapps/docs/logging.html | 395
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/PasswordStrategySetingDialog.java | 2
web/tomcat/webapps/docs/comments.html | 80
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ExecutionService.java | 128
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/VariablesCmd.java | 69
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RolingDialog.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/DefaultAddressResolver.java | 66
web/tomcat/bin/commons-daemon.jar | 0
Source/ThirdPart/jbpm.4.3.2/migration/lib/slf4j-jdk14-1.5.2.jar | 0
grid/jre/legal/jdk/unicode.md | 53
Source/ThirdPart/jbpm.4.3.2/src/jbpm.jobexecutor.cfg.xml | 11
grid/jre/bin/concrt140.dll | 0
grid/app/thrid/commons-dbcp-1.1.jar | 0
grid/jre/lib/security/blacklisted.certs | 20
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$Player.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/identity/User.java | 42
grid/jre/legal/jdk/relaxngdatatype.md | 37
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/HqlActivity.java | 102
web/tomcat/webapps/examples/WEB-INF/classes/util/CookieFilter.class | 0
Source/Service/ServiceBase/dist/ServiceBase.jar | 0
grid/jre/bin/plugin2/npjp2.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobAddedNotification.java | 55
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/IoUtil.java | 66
web/tomcat/webapps/examples/jsp/security/protected/login.jsp | 38
Source/Client/PLTClient/src/com/vci/client/workflow/task/ProcessTaskToolBar.java | 2
web/tomcat/webapps/examples/WEB-INF/classes/SessionExample.java | 147
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/OpenProcessDefinition.java | 59
grid/start-grid-admin.bat | 2
Source/ThirdPart/DBSync/dbsync/dist/dbsync.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/Duration.java | 293
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/BaseJbpmTestCase.java | 95
web/tomcat/webapps/examples/WEB-INF/classes/examples/ValuesTag.class | 0
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.class | 0
web/tomcat/webapps/docs/config/filter.html | 1713
web/tomcat/conf/catalina.properties | 215
web/tomcat/webapps/examples/servlets/images/return.gif | 0
web/tomcat/lib/tomcat-i18n-fr.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/TaskExecution.java | 34
web/tomcat/webapps/examples/jsp/tagplugin/foreach.jsp | 54
Source/Client/PLTClient/src/com/vci/client/log/ui/LogAuthorizeMainPanel.java | 34
web/tomcat/conf/jaspic-providers.xsd | 53
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/EnvironmentInterceptorDescriptor.java | 56
Source/Client/PLTClient/src/com/vci/client/workflow/WorkFlowClient.java | 48
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/package.html | 3
grid/app/thrid/jedis-2.9.0.jar | 0
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/utils/StringUtils.java | 29
web/tomcat/webapps/docs/appdev/sample/web/index.html | 39
web/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.html | 31
web/tomcat/webapps/manager/images/tomcat.svg | 967
web/tomcat/webapps/docs/rewrite.html | 703
Source/Client/PLTClient/src/com/vci/client/workflow/delegate/ProcessCustomClientDelegate.java | 2
web/tomcat/webapps/manager/xform.xsl | 140
Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/ModelManageTreeCellRenderer.java | 2
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/ClobVariable.java | 53
Source/Client/PLTClient/src/com/vci/client/utils/ImportDataTool.java | 1630
grid/jre/lib/flavormap.properties | 77
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/TransitionImpl.java | 135
web/tomcat/webapps/examples/jsp/async/index.jsp.html | 70
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/AbstractDescriptor.java | 97
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/JobExecutorDescriptor.java | 75
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/WireException.java | 49
web/tomcat/webapps/docs/architecture/requestProcess/request-process.png | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/listener/package.html | 4
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExecutionImpl.java | 1290
web/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.tag.html | 30
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/ExecuteEventListenerMessage.java | 161
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/MigrationDescriptor.java | 81
web/tomcat/webapps/manager/WEB-INF/jsp/connectorTrustedCerts.jsp | 92
Source/ThirdPart/jbpm.4.3.2/migration/lib/mail-1.4.1.jar | 0
Source/Client/PLTClient/src/com/vci/client/utils/LOTool.java | 84
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/DBSyncBuilder.java | 171
Source/ThirdPart/jbpm.4.3.2/jbpm_fat.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JpdlBinding.java | 99
web/tomcat/webapps/examples/jsp/images/code.gif | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/JtaTransaction.java | 152
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TimerSessionBinding.java | 70
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Access.java | 88
web/tomcat/webapps/docs/security-manager-howto.html | 469
web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer$1.class | 0
Source/Service/FrameService/src/com/vci/server/framework/volume/VolumeManagerImpl.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesDecisionBinding.java | 41
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage$ParseException.class | 0
Source/ThirdPart/jbpm.4.3.2/migration/lib/commons-collections-3.1.jar | 0
Source/ThirdPart/DBSync/dbsync/.project | 17
Source/ThirdPart/jbpm.4.3.2/lib/jbpm-console-form-plugin.jar | 0
grid/jre/legal/jdk/xmlresolver.md | 233
grid/jre/lib/sound.properties | 39
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/ProcessDeployer.java | 198
web/tomcat/webapps/examples/WEB-INF/classes/examples/ValuesTag.java | 79
Source/ThirdPart/jbpm.4.3.2/lib/gwt-console-rpc.jar | 0
grid/jre/bin/api-ms-win-crt-locale-l1-1-0.dll | 0
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.class | 0
Source/Client/PLTClientBase/src/com/vci/client/common/excel/ExcelDocumentUtils.java | 177
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/RetryInterceptor.java | 90
Source/Service/VciServiceMain/properties/hibernate.cfg.xml | 5
Source/ThirdPart/jbpm.4.3.2/lib/slf4j-log4j12.jar | 0
Source/Service/LogService/.project | 28
web/tomcat/bin/catalina.bat | 389
web/tomcat/webapps/docs/tribes/transport.html | 8
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/dbimpl/MySQLSync.java | 107
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/StandardTransactionInterceptor.java | 83
web/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jspx | 53
Source/Service/OMDService/src/com/vci/server/omd/qt/QTDefineBoxService.java | 2
Source/Client/PLTClient/src/com/vci/client/logon/base/AboutDialog.java | 2
grid/jre/lib/fonts/LucidaSansRegular.ttf | 0
web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings.properties | 48
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/NewDeployment.java | 70
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionExpressionActivity.java | 74
web/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.jsp.html | 59
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetTaskCommentsCmd.java | 77
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskCreated.java | 59
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/DoubleToStringConverter.java | 45
web/tomcat/webapps/examples/servlets/helloworld.html | 50
grid/app/thrid/quartz-all-1.8.6.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EventListenerBinding.java | 49
grid/jre/lib/ext/zipfs.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/listeners/ContextListener.java | 139
web/tomcat/webapps/docs/tribes/membership.html | 8
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/EnvironmentImpl.java | 270
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistorySessionImpl.java | 33
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Observable.java | 52
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Clock.java | 19
Source/Service/OMDService/build-jar.xml | 4
grid/app/thrid/commons-net-1.4.1.jar | 0
Source/ThirdPart/jbpm.4.3.2/migration/lib/mockejb-0.6-beta2.jar | 0
grid/app/thrid/picocontainer-1.2.jar | 0
grid/app/thrid/xstream-1.3.1.jar | 0
Source/Service/VciServiceMain/properties/service.xml | 3
web/tomcat/lib/catalina-ha.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_fr.properties | 48
Source/Service/WFWorkItem/build.properties | 4
grid/jre/bin/jdwp.dll | 0
grid/jre/bin/sunmscapi.dll | 0
Source/ThirdPart/jbpm.4.3.2/lib/xml-apis.jar | 0
grid/winnode.cfg | 21
grid/jre/bin/javafx_font.dll | 0
grid/jre/lib/javaws.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/TransitionTake.java | 54
Source/Service/OMDService/src/com/vci/server/omd/qt/QTDefineServiceImpl.java | 7
Source/Service/FrameService/src/com/vci/server/framework/delegate/AppConfigDetailDelegate.java | 2
Source/Client/PLTClient/src/com/vci/client/framework/specialrole/DeptingDialog.java | 2
Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-cglib-repack-2.1_3.jar | 0
web/tomcat/webapps/examples/jsp/jsp2/el/ValuesBean.java.html | 51
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/CharacterToStringConverter.java | 44
Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-core-1.0.0.Beta1.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessInstanceQuery.java | 68
grid/properties/volume.properties | 11
Source/Client/PLTClientBase/src/com/vci/client/common/providers/ServiceProvider.java | 61
web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.java | 142
Source/Service/LogService/src/com/vci/server/log/objects/Log.java | 123
web/tomcat/webapps/examples/WEB-INF/classes/examples/FooTag.class | 0
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/CheckPassWordStrategy.java | 5
Source/Client/PLTClient/src/com/vci/client/oq/ui/ExpQTDialog.java | 7
web/tomcat/lib/tomcat-util.jar | 0
Source/ThirdPart/jbpm.4.3.2/migration/lib/commons-logging-1.1.1.jar | 0
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptTablePanel.java | 2
web/tomcat/webapps/examples/WEB-INF/classes/async/Async0.java | 71
Source/ThirdPart/jbpm.4.3.2/lib/cglib-nodep.jar | 0
grid/jre/lib/ext/localedata.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/WireDefinition.java | 216
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessActivity.java | 187
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Entity.java | 36
Source/Service/CacheService/src/properties/VCICacheService_zh.properties | 3
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/LongBinding.java | 54
web/tomcat/webapps/examples/jsp/jsp2/el/functions.jsp.html | 68
Source/Client/PLTClient/src/com/vci/client/portal/platformPortal/ExportExcel.java | 7
grid/jre/bin/kinit.exe | 0
Source/Common/PLTCommon/src/com/vci/common/log/ServerWithLog4j.java | 3
Source/Client/PLTClient/src/com/vci/client/logon/client/LoginThread.java | 3
Source/Service/LogService/src/properties/RMIPFramework_zhNative.properties | 793
web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.java | 240
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ScopeElementImpl.java | 83
Source/ThirdPart/jbpm.4.3.2/src/jbpm.history.hbm.xml | 251
grid/jre/bin/java.exe | 0
Source/Client/PLTClient/src/com/vci/client/ui/excel/ExcelDocumentUtils.java | 2
web/tomcat/webapps/docs/images/fonts/OpenSans400.woff | 0
web/tomcat/webapps/host-manager/WEB-INF/web.xml | 160
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/StringVariable.java | 50
grid/jre/bin/api-ms-win-core-console-l1-2-0.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/AcquireDbidBlockCmd.java | 39
web/tomcat/webapps/examples/jsp/cal/cal2.jsp | 45
Source/ThirdPart/jbpm.4.3.2/migration/lib/juel-impl-2.1.0.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/OpenTaskDefinition.java | 30
Source/ThirdPart/jbpm.4.3.2/lib/hibernate-core.jar | 0
Source/Common/PLTSlice/slice/14-portal.ice | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AbstractCommand.java | 44
Source/Service/VolumeService/build-jar.xml | 4
Source/Client/PLTClient/src/com/vci/test/oq/Test.java | 3
Source/ThirdPart/jbpm.4.3.2/lib/jbpm-tomcat6.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ShortBinding.java | 54
Source/Client/PLTClient/src/com/vci/client/oq/ui/ConditionPanelForLink.java | 9
web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.java | 80
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/IntegerToLongConverter.java | 44
grid/jre/bin/net.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/Transition.java | 66
web/tomcat/webapps/host-manager/META-INF/context.xml | 24
web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$1.class | 0
grid/jre/bin/api-ms-win-crt-conio-l1-1-0.dll | 0
Source/Common/PLTSlice/slice/08-cache.ice | 29
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/UserTablePanel.java | 4
web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_ru.properties | 16
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BytesChop.java | 41
web/tomcat/webapps/docs/appdev/sample/build.xml | 508
grid/app/service/UIService.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JmsExtensions.java | 258
Source/Service/ServiceBase/src/com/vci/server/PltIceBoxServer.java | 140
web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/HibernateConfigurationDescriptor.java | 316
web/tomcat/webapps/docs/appdev/index.html | 45
web/tomcat/lib/catalina-storeconfig.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.java | 74
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/StandardTransaction.java | 246
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/EventImpl.java | 105
Source/Service/CacheService/dist/CacheService.jar | 0
grid/jre/bin/api-ms-win-crt-math-l1-1-0.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/activity/ActivityExecution.java | 114
grid/jre/lib/images/cursors/invalid32x32.gif | 0
Source/Client/PLTClient/src/com/vci/client/portal/NewNewUI/buttonmng/ButtonInfoPanel.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/TaskService.java | 192
grid/jre/legal/javafx/directshow.md | 26
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.java | 56
Source/ThirdPart/jbpm.4.3.2/lib/junit.jar | 0
web/tomcat/webapps/ROOT/favicon.ico | 0
web/tomcat/webapps/examples/WEB-INF/classes/cal/Entry.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ByteBinding.java | 56
web/tomcat/webapps/examples/jsp/jsp2/jspx/basic.jspx | 48
grid/app/thrid/poi-scratchpad-3.9-20121203.jar | 0
web/tomcat/conf/jaspic-providers.xml | 23
web/tomcat/webapps/examples/jsp/forward/two.html | 23
Source/Service/CacheService/properties/hibernate.cfg.xml | 42
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/dbimpl/AbstractDBSync.java | 40
web/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.html | 33
web/tomcat/webapps/manager/WEB-INF/jsp/401.jsp | 80
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/EnlistOperation.java | 74
Source/Service/ServiceBase/src/properties/logback.xml | 11
grid/start-grid.bat | 4
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.class | 0
web/tomcat/webapps/examples/jsp/jsptoserv/ServletToJsp.java.html | 40
web/tomcat/webapps/docs/manager-howto.html | 1419
web/tomcat/webapps/examples/servlets/cookies.html | 61
web/tomcat/webapps/docs/config/index.html | 65
Source/Service/LogService/src/properties/hibernate.map.xml | 5
web/tomcat/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.class | 0
web/tomcat/NOTICE | 51
Source/Client/PLTClient/src/com/vci/client/omd/btm/ui/BtmPanel.java | 2
grid/jre/bin/policytool.exe | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/DomBuilder.java | 833
grid/app/thrid/bsh.jar | 0
web/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp.html | 91
grid/jre/lib/fonts/LucidaBrightDemiBold.ttf | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HibernateSessionBinding.java | 79
grid/jre/bin/ssv.dll | 0
Source/Service/BOFactory/build-jar.xml | 4
web/tomcat/webapps/examples/jsp/cal/calendar.html | 43
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/StartProcessInstanceCmd.java | 83
Source/Client/PLTClient/src/com/vci/client/oq/ui/ImpQTD.java | 5
Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/BatchCheckInBO.java | 14
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/action/CreateTimerAction.java | 74
web/tomcat/webapps/docs/elapi/index.html | 34
web/tomcat/webapps/examples/jsp/cal/cal1.jsp.html | 95
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/IdentityServiceImpl.java | 113
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/TypeSet.java | 33
Source/Client/PLTClient/src/properties/iceClient.properties | 3
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/CharChop.java | 41
grid/jre/bin/api-ms-win-crt-time-l1-1-0.dll | 0
web/tomcat/webapps/examples/servlets/reqparams.html | 82
grid/jre/legal/jdk/dom.md | 62
grid/app/thrid/jdom-1.0.jar | 0
grid/app/common/junit-4.8.jar | 0
grid/app/thrid/ojdbc8.jar | 0
grid/jre/bin/api-ms-win-core-localization-l1-2-0.dll | 0
Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/CheckInBO.java | 4
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateJobQueryCmd.java | 41
web/tomcat/webapps/docs/jaspicapi/index.html | 34
web/tomcat/webapps/examples/jsp/security/protected/error.jsp.html | 26
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ActivityImpl.java | 427
grid/jre/bin/unpack200.exe | 0
grid/registry.cfg | 30
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HistoryServiceBinding.java | 47
Source/Service/OQService/build.properties | 4
web/tomcat/bin/configtest.bat | 58
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client$1.class | 0
web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Direction.java | 21
grid/jre/bin/jjs.exe | 0
web/tomcat/webapps/docs/jasper-howto.html | 385
Source/ThirdPart/DBSync/dbsync/properties/dbSynclog4j.properties | 23
grid/jre/lib/ext/sunpkcs11.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/EventBuilder.java | 74
web/tomcat/webapps/examples/jsp/async/async3.jsp | 25
Source/ThirdPart/jbpm.4.3.2/migration/lib/ant-launcher-1.7.0.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/ScriptActivity.java | 59
grid/start-grid-reg.bat | 3
grid/jre/lib/deploy/messages_it.properties | 32
Source/ThirdPart/jbpm.4.3.2/lib/antlr.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/jbpm.jboss.idm.cfg.xml | 13
web/tomcat/webapps/manager/META-INF/context.xml | 24
Source/Client/PLTClient/src/com/vci/client/logon/client/LogonAppletPanel.java | 2
Source/Service/WFService/dist/WFService.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/cmd/ParamCommand.java | 42
web/tomcat/webapps/examples/jsp/colors/colrs.jsp.html | 71
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/CompositeElementImpl.java | 151
web/tomcat/webapps/examples/WEB-INF/classes/cal/TableBean.java | 105
grid/jre/lib/security/java.security | 1116
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/EventListenerReference.java | 95
Source/Client/PLTClient/src/com/vci/client/logon/base/LogonHandler.java | 73
grid/jre/bin/dcpr.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/identity/package.html | 2
grid/jre/lib/cmm/CIEXYZ.pf | 0
web/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker.java | 212
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1.class | 0
grid/app/service/WFPlugins.jar | 0
grid/jre/lib/resources.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/VariableCreate.java | 77
grid/jre/bin/javaws.exe | 0
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/MailNode.java | 60
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/ExecutionServiceImpl.java | 153
Source/Client/PLTClient/src/com/vci/client/auth2/utils/RightManagerHelper.java | 32
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/HibernateLongIdMatcher.java | 42
grid/jre/bin/wsdetect.dll | 0
Source/Common/PLTSlice/slice/05-omd.ice | 2
web/tomcat/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.java | 66
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateTaskQueryCmd.java | 41
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/repository/JpdlDeployer.java | 185
grid/jre/lib/fonts/LucidaBrightDemiItalic.ttf | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/JtaStatusHelper.java | 57
Source/Client/PLTClient/src/com/vci/client/uif/actions/client/AbstractBatchBusionessOperationAction.java | 4
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/session/RepositorySession.java | 51
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/TrueDescriptor.java | 36
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/ClassNameMatcher.java | 63
web/tomcat/webapps/docs/config/ajp.html | 766
Source/ThirdPart/jbpm.4.3.2/src/jbpm.jpdl.bindings.xml | 35
Source/Service/FrameService/src/com/vci/server/framework/delegate/RoleRightDelegate.java | 38
Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-pvm-4.3.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/jpdl/package.html | 2
grid/jre/lib/meta-index | 92
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/HistoryDetailQueryImpl.java | 142
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/IdentitySessionDescriptor.java | 69
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskUpdated.java | 54
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/FormBehaviour.java | 32
Source/Service/UIService/dist/UIService.jar | 0
Source/ThirdPart/jbpm.4.3.2/lib/report-engine.zip | 0
Source/ThirdPart/jbpm.4.3.2/src/jpdl-4.2.xsd | 1241
grid/properties/eventConf.properties | 19
Source/Service/FrameService/src/com/vci/server/framework/delegate/SystemCfgDelegate.java | 38
Source/ThirdPart/jbpm.4.3.2/lib/jbpm-jboss.jar | 0
web/tomcat/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp | 23
Source/Common/PLTSlice/dist/plt-slice.jar | 0
grid/jre/lib/jfr/default.jfc | 586
web/tomcat/webapps/examples/WEB-INF/classes/ServletToJsp.class | 0
Source/ThirdPart/jbpm.4.3.2/migration/jpdl-migration-4.3.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/GroovyScriptEngineFactory.java | 160
grid/jre/lib/deploy/messages_es.properties | 32
web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.class | 0
grid/jre/lib/fontconfig.properties.src | 302
Source/Service/UIService/src/com/vci/server/portal/cache/ActionCacheUtil.java | 4
web/tomcat/webapps/examples/WEB-INF/classes/num/NumberGuessBean.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/activity/package.html | 3
web/tomcat/webapps/manager/css/manager.css | 141
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteTaskCmd.java | 73
Source/Service/LogService/src/com/vci/server/log/dao/LogAutoControlUtil.java | 313
web/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.html | 32
Source/Service/LogService/properties/ServerWithLog4j.properties | 10
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/StartTomcatTask.java | 79
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryActivityInstanceImpl.java | 129
Source/Service/BOFactory/src/com/vci/server/bof/server/create/CreateBOLOTS.java | 4
Source/Service/UIService/src/com/vci/server/portal/cache/UICacheBaseUtil.java | 3
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessOutParameterImpl.java | 48
grid/app/common/fastjson-1.2.83.jar | 0
web/tomcat/webapps/examples/jsp/jsp2/misc/config.jsp.html | 33
Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-annotations-3.4.0.GA.jar | 0
web/tomcat/bin/bootstrap.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistorySession.java | 29
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AuthorizationSession.java | 9
Source/ThirdPart/jbpm.4.3.2/lib/commons-collections.jar | 0
web/tomcat/webapps/examples/jsp/sessions/carts.jsp | 43
grid/jre/lib/plugin.jar | 0
Source/ThirdPart/jbpm.4.3.2/migration/lib/drools-core-5.0.1.jar | 0
Source/Client/PLTClient/src/com/vci/client/uif/engine/client/tree/SearchTipDialog.java | 2
Source/Service/VolumeService/src/com/vci/server/VolumeBoxService.java | 40
web/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.html | 37
web/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.jsp | 31
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessParameterImpl.java | 63
web/tomcat/webapps/docs/windows-service-howto.html | 449
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/GroupActivity.java | 107
web/tomcat/webapps/docs/config/automatic-deployment.html | 498
Source/Service/FrameService/src/com/vci/server/framework/right/roleRight/RoleRightService.java | 13
web/tomcat/webapps/docs/tribes/setup.html | 8
Source/ThirdPart/jbpm.4.3.2/lib/jta.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/HistoryActivityInstanceQueryImpl.java | 174
web/tomcat/webapps/docs/extras.html | 86
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/dbimpl/OracleSync.java | 312
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/StartState.java | 41
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/Interceptor.java | 44
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Problem.java | 41
grid/app/thrid/jcommon-1.0.17.jar | 0
web/tomcat/lib/jasper.jar | 0
web/tomcat/webapps/host-manager/WEB-INF/jsp/404.jsp | 62
web/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/spi/MailProducer.java | 40
web/tomcat/lib/catalina.jar | 0
web/tomcat/conf/catalina.policy | 265
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryComment.java | 44
grid/jre/lib/ext/cldrdata.jar | 0
Source/Common/PLTSlice/slice/07-message.ice | 17
Source/Client/PLTClient/src/com/vci/client/portal/platformPortal/TableDialog.java | 5
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistorySessionChain.java | 46
grid/jre/legal/jdk/asm.md | 36
Source/ThirdPart/DBSync/lib/ojdbc6.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/properties/JBpm4Properties.java | 79
Source/ThirdPart/jbpm.4.3.2/.settings/org.eclipse.jdt.core.prefs | 12
grid/app/thrid/geronimo-stax-api_1.0_spec-1.0.jar | 0
grid/app/thrid/saaj.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/MemoryDbidGenerator.java | 40
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessDefinition.java | 65
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.java | 34
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteCommentCmd.java | 57
Source/Service/CacheService/properties/ServerWithLog4j.properties | 10
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/AutomaticEnd.java | 40
grid/jre/bin/javacpl.cpl | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryTaskAssignmentImpl.java | 49
web/tomcat/webapps/docs/images/fix.gif | 0
web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_ja.properties | 48
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/TaskActivity.java | 267
grid/jre/legal/jdk/relaxngom.md | 24
grid/jre/bin/jawt.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/MigrationHandler.java | 14
web/tomcat/webapps/examples/jsp/forward/forward.jsp | 33
web/tomcat/webapps/manager/WEB-INF/web.xml | 224
web/tomcat/webapps/ROOT/bg-middle.png | 0
Source/Client/PLTClient/src/com/vci/client/log/ui/LogBasicConfPanel.java | 332
web/tomcat/webapps/docs/architecture/startup/serverStartup.txt | 139
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/LifeCycleParser.java | 109
web/tomcat/webapps/examples/jsp/cal/login.html | 47
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/Signal.java | 89
grid/jre/lib/ext/sunjce_provider.jar | 0
Source/Client/PLTClient/src/com/vci/client/oq/ui/ConditionPanel.java | 9
web/tomcat/webapps/examples/jsp/jsp2/simpletag/BookBean.java.html | 43
web/tomcat/webapps/docs/config/cluster-valve.html | 126
Source/ThirdPart/jbpm.4.3.2/migration/lib/slf4j-api-1.5.2.jar | 0
grid/jre/lib/deploy/messages.properties | 57
web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TrueBinding.java | 45
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/client/ClientProcessDefinition.java | 68
web/tomcat/webapps/examples/WEB-INF/classes/CookieExample.java | 140
web/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp | 46
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ReferenceDescriptor.java | 59
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/LogFactory.java | 32
grid/jre/bin/api-ms-win-crt-private-l1-1-0.dll | 0
grid/jre/bin/api-ms-win-core-timezone-l1-1-0.dll | 0
Source/Service/VciServiceMain/.classpath | 2
Source/ThirdPart/jbpm.4.3.2/src/jbpm.businesscalendar.cfg.xml | 18
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/Descriptor.java | 101
grid/jre/lib/amd64/jvm.cfg | 38
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/Lob.java | 147
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/job/package.html | 2
web/tomcat/webapps/examples/WEB-INF/classes/filters/ExampleFilter.java | 136
Source/Service/CacheService/src/com/vci/server/cache/CacheServerImpl.java | 169
Source/ThirdPart/DBSync/lib/slf4j-api-1.7.2.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/jpdl-4.0.xsd | 1196
web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.java | 443
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.java | 253
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/DatabaseIdComposer.java | 67
Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryPanel.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/TaskDefinitionImpl.java | 73
grid/jre/lib/cmm/sRGB.pf | 0
web/tomcat/webapps/examples/jsp/simpletag/foo.jsp.html | 39
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/ForkBinding.java | 42
grid/app/thrid/portalcustom.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/MoveToParentActivity.java | 55
grid/jre/lib/jfr.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetStartActivityNamesCmd.java | 62
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/GroovyScriptEngine.java | 356
web/tomcat/webapps/examples/WEB-INF/jsp2/jsp2-example-taglib.tld | 124
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Parser.java | 546
grid/jre/lib/security/javaws.policy | 5
Source/Client/PLTClient/src/com/vci/client/utils/excel/ExcelFileOperation.java | 588
Source/Client/PLTClient/src/com/vci/client/portal/utility/TableDataUtil.java | 4
Source/ThirdPart/jbpm.4.3.2/lib/jbpm-console-graphView-plugin.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/spi/AddressResolver.java | 37
Source/ThirdPart/jbpm.4.3.2/lib/drools-compiler.jar | 0
grid/app/thrid/commons-io-2.0.1.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Bindings.java | 131
web/tomcat/lib/jaspic-api.jar | 0
web/tomcat/webapps/examples/jsp/jsp2/tagfiles/displayProducts.tag.html | 56
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionConditionActivity.java | 69
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateHistoryDetailQueryCmd.java | 42
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/TypeMapping.java | 33
grid/jre/bin/jsdt.dll | 0
grid/jre/bin/jp2launcher.exe | 0
Source/ThirdPart/jbpm.4.3.2/lib/mysql-connector-java.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/DateVariable.java | 56
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/AsyncContinuations.java | 43
Source/Service/WFWorkItem/build-jar.xml | 4
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/StartHsqldbServerTask.java | 72
grid/app/thrid/commons-httpclient-3.0.jar | 0
web/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp | 88
web/tomcat/webapps/examples/jsp/security/protected/login.jsp.html | 39
web/tomcat/webapps/examples/jsp/jsp2/jspattribute/FooBean.java.html | 35
Source/Service/VciServiceMain/build.xml | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/IdentityServiceBinding.java | 48
grid/jre/lib/cmm/GRAY.pf | 0
grid/properties/iceClient.properties | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/UserProvidedEnvironmentObject.java | 62
web/tomcat/lib/tomcat-i18n-ru.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/JndiDescriptor.java | 55
grid/jre/bin/api-ms-win-core-console-l1-1-0.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BlobStrategyChopped.java | 53
Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-api-4.3.jar | 0
Source/Service/BOFactory/build.properties | 4
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryTaskQuery.java | 95
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesBinding.java | 70
Source/ThirdPart/jbpm.4.3.2/.classpath | 84
Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanel2.java | 616
Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-spi-1.0.0.Beta1.jar | 0
web/tomcat/webapps/examples/WEB-INF/classes/cal/JspCalendar.java | 152
web/tomcat/webapps/docs/appdev/build.xml.txt | 508
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/LifeCycleState.java | 44
web/tomcat/webapps/examples/jsp/cal/TableBean.java.html | 106
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/Operate.java | 7
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/MigrationHelper.java | 119
grid/jre/legal/jdk/freebxml.md | 73
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/SwimlaneImpl.java | 153
Source/Common/PLTCommon/src/com/vci/common/util/IceProxyUtility.java | 47
Source/ThirdPart/DBSync/lib/mysql-connector-java-5.1.22.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/xml/WireParser.java | 295
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RightManagementTreeCellRenderer.java | 2
web/tomcat/webapps/docs/security-howto.html | 523
Source/ThirdPart/jbpm.4.3.2/migration/lib/ejb3-persistence-1.0.2.GA.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/AssignBinding.java | 74
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JpdlActivity.java | 35
grid/jre/bin/keytool.exe | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/StandardTransactionInterceptorBinding.java | 46
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/ActivityCoordinates.java | 41
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/IdComposer.java | 51
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistorySessionFilter.java | 54
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/MapBinding.java | 92
grid/properties/Timer.properties | 10
web/tomcat/webapps/examples/WEB-INF/classes/RequestInfoExample.class | 0
Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanelV2.java | 2
grid/jre/legal/jdk/cryptix.md | 35
grid/jre/lib/fonts/LucidaTypewriterBold.ttf | 0
web/tomcat/webapps/examples/WEB-INF/classes/num/NumberGuessBean.java | 98
grid/jre/lib/deploy/messages_sv.properties | 32
web/tomcat/webapps/docs/architecture/startup.html | 42
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionBuilder.java | 43
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ActivityCoordinatesImpl.java | 63
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/processengine/ProcessEngineImpl.java | 310
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ProcessInstanceEnd.java | 45
grid/jre/bin/jli.dll | 0
Source/Client/PLTClient/src/com/vci/client/ui/swing/VCISwingUtil.java | 27
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/cmd/Environment.java | 43
web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Snake.java | 150
Source/Common/PLTSlice/slice/06-log.ice | 124
Source/Service/BOFactory/src/com/vci/server/bof/server/update/UpdateBO.java | 4
web/tomcat/webapps/examples/jsp/jsptoserv/hello.jsp | 26
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailSessionImpl.java | 73
web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Direction.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ObjectBinding.java | 167
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/PassthroughActivity.java | 37
grid/jre/legal/jdk/xerces.md | 229
Source/Service/BOFactory/src/com/vci/server/bof/server/ServiceFacadeUtil.java | 139
web/tomcat/webapps/examples/jsp/forward/one.jsp.html | 24
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetTaskVariableNamesCmd.java | 55
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/dbimpl/SQLServerSync.java | 88
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/volumn/PvolumeUserDialog.java | 2
grid/jre/lib/jsse.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/EnvironmentDescriptor.java | 23
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ProcessEngineRefBinding.java | 48
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryTaskImpl.java | 165
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/NullDescriptor.java | 42
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/DefaultCommandService.java | 53
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JmsTopicListener.java | 34
Source/Client/PLTClient/src/com/vci/client/oq/ui/qtimport/QTImpQTStep2Panel.java | 5
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateHistoryTaskQueryCmd.java | 40
Source/ThirdPart/jbpm.4.3.2/lib/jboss-common-core.jar | 0
Source/Client/PLTClient/src/com/vci/client/omd/enumManager/ui/EnumManagerPanel.java | 5
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/UrlDescriptor.java | 53
Source/Client/PLTClient/src/com/vci/client/portal/Formdesign/FormDesignDialog.java | 5
web/tomcat/webapps/docs/config/service.html | 68
Source/Service/FrameService/src/com/vci/server/framework/systemConfig/stafforgmanage/dept/DepartmentService.java | 5
web/tomcat/webapps/examples/jsp/dates/date.jsp | 41
grid/jre/bin/jfxwebkit.dll | 0
web/tomcat/webapps/examples/WEB-INF/classes/SessionExample.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/SetDescriptor.java | 30
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/UserDialog.java | 6
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.class | 0
web/tomcat/webapps/docs/html-manager-howto.html | 495
grid/jre/bin/j2pcsc.dll | 0
web/tomcat/webapps/examples/WEB-INF/classes/dates/JspCalendar.java | 155
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3$1.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/OpenProcessInstance.java | 39
grid/jre/bin/api-ms-win-crt-multibyte-l1-1-0.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetParticipantsCmd.java | 74
grid/app/common/freemarker.jar | 0
Source/Service/LogService/properties/volume.properties | 12
grid/jre/legal/javafx/webkit.md | 536
grid/jre/lib/deploy/messages_ja.properties | 32
web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.java | 44
Source/ThirdPart/jbpm.4.3.2/lib/core.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/FloatDescriptor.java | 59
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$2.class | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/TaskQueryImpl.java | 217
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ManagementServiceBinding.java | 48
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RoleDialog.java | 2
web/tomcat/webapps/examples/jsp/plugin/applet/Clock2.java | 229
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindProcessDefinitionsByKeyCmd.java | 49
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/ByteArrayStreamInput.java | 52
grid/jre/bin/api-ms-win-core-libraryloader-l1-1-0.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/TaskConstants.java | 43
web/tomcat/webapps/examples/WEB-INF/classes/listeners/SessionListener.java | 161
web/tomcat/webapps/ROOT/bg-button.png | 0
Source/Service/LogService/src/com/vci/server/log/LogServiceImpl.java | 175
web/tomcat/webapps/ROOT/WEB-INF/web.xml | 30
grid/jre/lib/images/cursors/win32_MoveNoDrop32x32.gif | 0
web/tomcat/webapps/examples/WEB-INF/classes/examples/FooTag.java | 87
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ContextRefBinding.java | 51
web/tomcat/webapps/examples/jsp/jsptoserv/jts.html | 36
grid/app/thrid/plugin.jar | 0
web/tomcat/webapps/docs/config/jaspic.html | 162
Source/Client/PLTClient/.classpath | 2
web/tomcat/webapps/examples/jsp/dates/date.jsp.html | 42
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ObservableElement.java | 65
web/tomcat/webapps/docs/tribes/faq.html | 8
Source/Service/ServiceBase/src/com/vci/server/base/persistence/dao/HibernateSessionFactory.java | 51
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/JtaTransactionInterceptor.java | 108
grid/jre/bin/orbd.exe | 0
grid/jre/legal/jdk/jcup.md | 24
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/HibernateLongVariable.java | 44
grid/jre/legal/javafx/glib.md | 538
Source/ThirdPart/jbpm.4.3.2/lib/janino.jar | 0
Source/Client/PLTClient/src/com/vci/client/portal/utility/TableDataUtilNew.java | 3
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jms/JmsMessageUtil.java | 76
grid/jre/bin/dt_socket.dll | 0
web/tomcat/webapps/examples/WEB-INF/classes/RequestParamExample.class | 0
grid/jre/bin/plugin2/vcruntime140.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/IdentityService.java | 101
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExceptionHandler.java | 102
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExecutorServlet.java | 118
grid/jre/lib/fonts/LucidaBrightItalic.ttf | 0
web/tomcat/webapps/docs/architecture/startup/serverStartup.pdf | 0
web/tomcat/webapps/docs/images/fonts/OpenSans700.woff | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/Continuation.java | 35
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/Variable.java | 168
Source/ThirdPart/jbpm.4.3.2/src/jbpm.console.cfg.xml | 10
grid/jre/lib/images/cursors/win32_LinkNoDrop32x32.gif | 0
web/tomcat/webapps/examples/WEB-INF/lib/taglibs-standard-spec-1.2.5.jar | 0
Source/Client/PLTClient/src/com/vci/client/uif/actions/client/folder/FolderImportAction.java | 6
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/CustomBinding.java | 50
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$1.class | 0
Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/DBSyncFactory.java | 52
grid/app/thrid/activation.jar | 0
web/tomcat/webapps/examples/jsp/jsp2/jspattribute/ShuffleSimpleTag.java.html | 86
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/AcquireJobsCmd.java | 98
web/tomcat/webapps/examples/jsp/plugin/plugin.jsp | 34
grid/jre/lib/cmm/LINEAR_RGB.pf | 0
grid/jre/lib/deploy.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/RepositoryService.java | 94
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskDelete.java | 74
Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptingDialog.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/TimerBuilder.java | 98
web/tomcat/webapps/examples/jsp/jsp2/misc/config.html | 35
Source/ThirdPart/jbpm.4.3.2/lib/juel.jar | 0
web/tomcat/webapps/manager/WEB-INF/jsp/connectorCiphers.jsp | 92
web/tomcat/webapps/examples/jsp/security/protected/index.jsp | 112
web/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp.html | 45
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AddParticipationCmd.java | 75
grid/app/service/BOFService.jar | 0
web/tomcat/webapps/examples/jsp/sessions/carts.html | 53
Source/Client/PLTClient/src/com/vci/client/oq/ui/qtimport/QTImportTree.java | 5
Source/ThirdPart/jbpm.4.3.2/.project | 28
grid/jre/lib/fonts/LucidaBrightRegular.ttf | 0
Source/ThirdPart/jbpm.4.3.2/lib/juel-engine.jar | 0
Source/Client/PLTClient/src/com/vci/client/workflow/task/CCTaskPanel.java | 2
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JmsNonXATopicListener.java | 152
web/tomcat/webapps/examples/jsp/tagplugin/if.jsp.html | 48
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/DatabaseDbidGenerator.java | 113
web/tomcat/webapps/examples/jsp/plugin/plugin.jsp.html | 35
web/tomcat/webapps/docs/jspapi/index.html | 34
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExceptionHandlerImpl.java | 264
Source/Client/PLTClient/src/com/vci/client/utils/excel/WorkboolStyleSetting.java | 9
Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/SuperState.java | 38
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/AddressFilter.java | 98
web/tomcat/webapps/docs/appdev/web.xml.txt | 166
web/tomcat/webapps/manager/WEB-INF/jsp/403.jsp | 100
Source/Client/PLTClient/src/com/vci/client/oq/ui/export/QTExpQTStep1Panel.java | 3
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/StartProcessInstanceInLatestCmd.java | 76
web/tomcat/bin/service.bat | 238
web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3.class | 0
grid/jre/lib/jce.jar | 0
web/tomcat/webapps/manager/index.jsp | 18
web/tomcat/lib/tomcat-util-scan.jar | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AsyncCommandService.java | 55
grid/jre/legal/javafx/libxslt.md | 60
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ClassDescriptor.java | 43
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AssignTaskCmd.java | 70
grid/jre/lib/images/cursors/win32_LinkDrop32x32.gif | 0
web/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.html | 33
Source/ThirdPart/DBSync/dbsync/build.properties | 5
Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCUDBOLO.java | 23
Source/ThirdPart/jbpm.4.3.2/lib/jbpm-examples-tests.jar | 0
grid/jre/lib/fonts/LucidaSansDemiBold.ttf | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/CreateMembershipCmd.java | 51
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/client/ClientExecution.java | 186
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/MapDescriptor.java | 68
web/tomcat/lib/tomcat-coyote.jar | 0
grid/jre/bin/nio.dll | 0
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/FieldBinding.java | 66
web/tomcat/webapps/examples/servlets/nonblocking/bytecounter.html | 32
Source/Service/WFService/src/com/vci/server/workflow/WorkflowServiceImpl.java | 13
grid/jre/lib/hijrah-config-umalqura.properties | 369
web/tomcat/webapps/examples/jsp/tagplugin/howto.html | 45
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/SerializeInterceptor.java | 61
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SerializeInterceptorBinding.java | 44
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryProcessInstanceImpl.java | 129
Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/job/Timer.java | 42
grid/app/thrid/inforbroker-core-5.1.0.jar | 0
Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/FunOperateExcelImportDialogActionListener.java | 10
web/tomcat/webapps/docs/ssl-howto.html | 673
2,296 files changed, 183,274 insertions(+), 2,317 deletions(-)
diff --git a/Bin/properties/hibernate.cfg.xml b/Bin/properties/hibernate.cfg.xml
index d61063d..a381442 100644
--- a/Bin/properties/hibernate.cfg.xml
+++ b/Bin/properties/hibernate.cfg.xml
@@ -9,9 +9,6 @@
<property name="connection.username">vcimes</property>
<property name="connection.password">vcimes</property>-->
- <!-- <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
- <property name="connection.username">mpm550new</property>
- <property name="connection.password">vcitest</property> -->
<property name="connection.url">jdbc:oracle:thin:@192.168.0.66:1521:orcl</property>
<property name="connection.username">PLT2024</property>
<property name="connection.password">vcitest</property>
diff --git a/Bin/web/lib/app.pid b/Bin/web/lib/app.pid
index 88df3d4..c48df2e 100644
--- a/Bin/web/lib/app.pid
+++ b/Bin/web/lib/app.pid
@@ -1 +1 @@
-12956
\ No newline at end of file
+28804
\ No newline at end of file
diff --git a/Source/Client/PLTClient/.classpath b/Source/Client/PLTClient/.classpath
index 5476a57..5e37e15 100644
--- a/Source/Client/PLTClient/.classpath
+++ b/Source/Client/PLTClient/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry excluding="com/vci/client/framework/delegate/SpecialRoleClientDelegate.java|com/vci/client/omd/ddl/DDLToolClient.java|com/vci/client/workflow/delegate/FlowApproveContentClientDelegate.java|com/vci/client/workflow/delegate/FlowInstanceClientDelegate.java|com/vci/client/workflow/task/CCTaskDialog.java|com/vci/client/workflow/task/DoneProcessDialog.java|com/vci/client/workflow/task/DoneProcessPanel.java|com/vci/client/workflow/task/DoneTaskDialog.java|com/vci/client/workflow/task/DoneTaskPanel.java|com/vci/client/workflow/task/FlowSearchDialog.java|com/vci/client/workflow/task/ProcessControlPanel.java|com/vci/client/workflow/task/TodoTaskByPlatformDialog.java|com/vci/client/workflow/task/TodoTaskDialog.java|com/vci/client/workflow/task/TrackTaskPanel.java|com/vci/client/workflow/task/ViewExecutionImagePanel.java|com/vci/client/workflow/task/ViewWorkfolwHistoryByPlatformDialog.java|com/vci/client/workflow/task/approve/object/FlowApproveContentObject.java|com/vci/client/workflow/task/ApplicationTaskPanel.java|com/vci/client/workflow/task/AppointTaskDialog.java|com/vci/client/workflow/task/BlockTaskPanel.java|com/vci/client/workflow/task/CCTaskPanel.java|com/vci/client/workflow/task/ChangeTaskPanel.java|com/vci/client/workflow/task/DeleteTaskPanel.java|com/vci/client/workflow/task/RMAddTaskPanel.java|com/vci/client/workflow/task/RMBlockTaskPanel.java|com/vci/client/workflow/task/RMChangeTaskPanel.java|com/vci/client/workflow/task/RMDeleteTaskPanel.java|com/vci/client/workflow/task/RMScrapTaskPanel.java|com/vci/client/workflow/task/RMStartTaskPanel.java|com/vci/client/uif/engine/client/renderer/EndTiemInTableCellRenderer.java|com/vci/client/uif/actions/client/EndWorkFlowAction.java|com/vci/client/uif/actions/client/ExecuteWorkFlowAction.java|com/vci/client/uif/actions/client/ViewWorkFlowHistoryAction.java|com/vci/client/workflow/task/ProcessTaskOperate.java|com/vci/client/workflow/task/ProcessTaskPanel.java|com/vci/client/workflow/task/ProcessTaskToolBar.java|com/vci/client/workflow/task/StartTaskPanel.java|com/vci/client/workflow/task/StoreTaskPanel.java|com/vci/client/workflow/task/TodoTaskPanel.java|com/vci/client/workflow/template/AssignProcessDialog.java|com/vci/client/workflow/template/WorkFlowConfDialog.java|com/vci/client/workflow/user/VciWorkflowUserImpl.java|com/vci/client/workflow/user/WorkflowUserUtil.java" kind="src" path="src"/>
+ <classpathentry excluding="com/vci/client/framework/delegate/SpecialRoleClientDelegate.java|com/vci/client/omd/ddl/DDLToolClient.java|com/vci/client/workflow/delegate/FlowApproveContentClientDelegate.java|com/vci/client/workflow/delegate/FlowInstanceClientDelegate.java|com/vci/client/workflow/task/CCTaskDialog.java|com/vci/client/workflow/task/DoneProcessDialog.java|com/vci/client/workflow/task/DoneProcessPanel.java|com/vci/client/workflow/task/DoneTaskDialog.java|com/vci/client/workflow/task/DoneTaskPanel.java|com/vci/client/workflow/task/FlowSearchDialog.java|com/vci/client/workflow/task/ProcessControlPanel.java|com/vci/client/workflow/task/TodoTaskByPlatformDialog.java|com/vci/client/workflow/task/TodoTaskDialog.java|com/vci/client/workflow/task/TrackTaskPanel.java|com/vci/client/workflow/task/ViewExecutionImagePanel.java|com/vci/client/workflow/task/ViewWorkfolwHistoryByPlatformDialog.java|com/vci/client/workflow/task/approve/object/FlowApproveContentObject.java|com/vci/client/workflow/task/ApplicationTaskPanel.java|com/vci/client/workflow/task/AppointTaskDialog.java|com/vci/client/workflow/task/BlockTaskPanel.java|com/vci/client/workflow/task/CCTaskPanel.java|com/vci/client/workflow/task/ChangeTaskPanel.java|com/vci/client/workflow/task/DeleteTaskPanel.java|com/vci/client/workflow/task/RMAddTaskPanel.java|com/vci/client/workflow/task/RMBlockTaskPanel.java|com/vci/client/workflow/task/RMChangeTaskPanel.java|com/vci/client/workflow/task/RMDeleteTaskPanel.java|com/vci/client/workflow/task/RMScrapTaskPanel.java|com/vci/client/workflow/task/RMStartTaskPanel.java|com/vci/client/uif/engine/client/renderer/EndTiemInTableCellRenderer.java|com/vci/client/uif/actions/client/EndWorkFlowAction.java|com/vci/client/uif/actions/client/ExecuteWorkFlowAction.java|com/vci/client/uif/actions/client/ViewWorkFlowHistoryAction.java|com/vci/client/workflow/task/ProcessTaskOperate.java|com/vci/client/workflow/task/ProcessTaskPanel.java|com/vci/client/workflow/task/ProcessTaskToolBar.java|com/vci/client/workflow/task/StartTaskPanel.java|com/vci/client/workflow/task/StoreTaskPanel.java|com/vci/client/workflow/task/TodoTaskPanel.java|com/vci/client/workflow/template/AssignProcessDialog.java|com/vci/client/workflow/template/WorkFlowConfDialog.java|com/vci/client/workflow/user/VciWorkflowUserImpl.java|com/vci/client/workflow/user/WorkflowUserUtil.java|com/vci/client/ui/excel/ExcelDocumentUtils.java|com/vci/client/ui/excel/SheetDataSet.java" kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry combineaccessrules="false" kind="src" path="/PLTCommon"/>
<classpathentry combineaccessrules="false" kind="src" path="/PLTClientBase"/>
diff --git a/Source/Client/PLTClient/build-jar.xml b/Source/Client/PLTClient/build-jar.xml
index 406783d..cf7ba48 100644
--- a/Source/Client/PLTClient/build-jar.xml
+++ b/Source/Client/PLTClient/build-jar.xml
@@ -2,7 +2,7 @@
<!--classes.jar; src.jar-->
<project name = "platform-Client" default = "build-Client-jar" basedir = ".">
- <property file="build.properties"/>
+ <property file="../../build.properties"/>
<target name="time">
<tstamp>
diff --git a/Source/Client/PLTClient/dist/plt-client.jar b/Source/Client/PLTClient/dist/plt-client.jar
index f088559..22d8a54 100644
--- a/Source/Client/PLTClient/dist/plt-client.jar
+++ b/Source/Client/PLTClient/dist/plt-client.jar
Binary files differ
diff --git a/Source/Client/PLTClient/src/com/vci/client/auth2/action/DelAction.java b/Source/Client/PLTClient/src/com/vci/client/auth2/action/DelAction.java
index 6d0eeb6..0a76ddd 100644
--- a/Source/Client/PLTClient/src/com/vci/client/auth2/action/DelAction.java
+++ b/Source/Client/PLTClient/src/com/vci/client/auth2/action/DelAction.java
@@ -6,6 +6,7 @@
import com.vci.client.auth2.model.BooleanTableModel;
import com.vci.client.auth2.utils.RightManagerHelper;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.corba.framework.data.GrandValue;
public class DelAction extends Action {
@@ -61,7 +62,7 @@
// DataBase
boolean isTrue = false;
try {
- isTrue = RightManagerHelper.getFrameworkService().deleteTypeRuleGrand(getType(value.identifier),
+ isTrue = ServiceProvider.getFrameService().deleteTypeRuleGrand(getType(value.identifier),
value.ruleName);
} catch (Exception e) {
JOptionPane.showMessageDialog(
diff --git a/Source/Client/PLTClient/src/com/vci/client/auth2/action/SaveRuleAction.java b/Source/Client/PLTClient/src/com/vci/client/auth2/action/SaveRuleAction.java
index 6b457dc..3426b61 100644
--- a/Source/Client/PLTClient/src/com/vci/client/auth2/action/SaveRuleAction.java
+++ b/Source/Client/PLTClient/src/com/vci/client/auth2/action/SaveRuleAction.java
@@ -7,6 +7,7 @@
import javax.swing.tree.TreePath;
import com.vci.client.auth2.utils.RightManagerHelper;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.btm.ui.BtmTree;
import com.vci.client.omd.btm.ui.ResourceTree;
import com.vci.client.omd.btm.wrapper.BtmItemWrapper;
@@ -52,7 +53,7 @@
// DataBase
boolean isTrue = false;
try {
- isTrue = RightManagerHelper.getFrameworkService().deleteTypeRuleGrand(
+ isTrue = ServiceProvider.getFrameService().deleteTypeRuleGrand(
btm.name, values.get(0).ruleName);
} catch (Exception e) {
JOptionPane.showMessageDialog(
@@ -66,7 +67,7 @@
// save
boolean isTrue_add = false;
try {
- isTrue_add = RightManagerHelper.getFrameworkService().saveGrand(
+ isTrue_add = ServiceProvider.getFrameService().saveGrand(
values.toArray(new GrandValue[values.size()]));
} catch (Exception e) {
JOptionPane.showMessageDialog(
diff --git a/Source/Client/PLTClient/src/com/vci/client/auth2/utils/RightManagerHelper.java b/Source/Client/PLTClient/src/com/vci/client/auth2/utils/RightManagerHelper.java
index 74ff340..7627676 100644
--- a/Source/Client/PLTClient/src/com/vci/client/auth2/utils/RightManagerHelper.java
+++ b/Source/Client/PLTClient/src/com/vci/client/auth2/utils/RightManagerHelper.java
@@ -55,7 +55,7 @@
import com.vci.common.qt.object.Symbol;
//import com.vci.corba.auth2.Auth2ServicePrx;
import com.vci.corba.framework.data.GrandValue;
-import com.vci.corba.framework.method.FrameworkServicePrx;
+import com.vci.corba.framework.FrameworkServicePrx;
import com.vci.corba.common.VCIError;
import com.vci.corba.omd.btm.BtmItem;
import com.vci.corba.omd.lcm.LifeCycle;
@@ -66,20 +66,20 @@
import com.vci.corba.portal.data.PLAction;
public class RightManagerHelper {
- private static FrameworkServicePrx frameService = null;
-
- public static FrameworkServicePrx getFrameworkService() throws VCIError {
- if (frameService != null) {
- return frameService;
- }
- try {
-
- return frameService = ServiceProvider.getFrameService();
- } catch (Exception e) {
- ClientLog4j.logger.error(e.getMessage(), e);
- throw new VCIError("1", new String[] { e.getMessage() });
- }
- }
+// private static FrameworkServicePrx frameService = null;
+//
+// public static FrameworkServicePrx getFrameworkService() throws VCIError {
+// if (frameService != null) {
+// return frameService;
+// }
+// try {
+//
+// return frameService = ServiceProvider.getFrameService();
+// } catch (Exception e) {
+// ClientLog4j.logger.error(e.getMessage(), e);
+// throw new VCIError("1", new String[] { e.getMessage() });
+// }
+// }
public static BtmItem getResourceType(AbstractUIFunclet funclet) {
@@ -103,7 +103,7 @@
public static GrandValue[] getRightDatas(String typeName) {
GrandValue[] dataSets = null;
try {
- dataSets = getFrameworkService().queryGrand(typeName);
+ dataSets = ServiceProvider.getFrameService().queryGrand(typeName);
} catch (Throwable e) {
JOptionPane.showMessageDialog(LogonApplication.frame,
((VCIError) e).messages[0], "閿欒鎻愮ず", JOptionPane.ERROR_MESSAGE);
diff --git a/Source/Client/PLTClient/src/com/vci/client/auth2/view/CheckRightResultView.java b/Source/Client/PLTClient/src/com/vci/client/auth2/view/CheckRightResultView.java
index dd59068..8529ada 100644
--- a/Source/Client/PLTClient/src/com/vci/client/auth2/view/CheckRightResultView.java
+++ b/Source/Client/PLTClient/src/com/vci/client/auth2/view/CheckRightResultView.java
@@ -42,6 +42,7 @@
import com.vci.client.common.objects.DeptObject;
import com.vci.client.common.objects.RoleObject;
import com.vci.client.common.objects.UserObject;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.framework.delegate.RightManagementClientDelegate;
import com.vci.client.logon.base.BaseJDialog;
import com.vci.client.ui.exception.VCIException;
@@ -256,7 +257,7 @@
// 鎿嶄綔
List<OpItem> opitems = new ArrayList<OpItem>();
try {
- String where = RightManagerHelper.getFrameworkService().checkRight(params);
+ String where = ServiceProvider.getFrameService().checkRight(params);
String[] ops = where.split(":");
for (String s : ops) {
diff --git a/Source/Client/PLTClient/src/com/vci/client/auth2/view/RoleSelectView.java b/Source/Client/PLTClient/src/com/vci/client/auth2/view/RoleSelectView.java
index af2b049..f13a919 100644
--- a/Source/Client/PLTClient/src/com/vci/client/auth2/view/RoleSelectView.java
+++ b/Source/Client/PLTClient/src/com/vci/client/auth2/view/RoleSelectView.java
@@ -27,7 +27,7 @@
import com.vci.client.framework.systemConfig.stafforgmanage.UserTablePanel;
import com.vci.client.logon.base.BaseJDialog;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
diff --git a/Source/Client/PLTClient/src/com/vci/client/auth2/view/UserSelectView.java b/Source/Client/PLTClient/src/com/vci/client/auth2/view/UserSelectView.java
index fb4333a..6c93a88 100644
--- a/Source/Client/PLTClient/src/com/vci/client/auth2/view/UserSelectView.java
+++ b/Source/Client/PLTClient/src/com/vci/client/auth2/view/UserSelectView.java
@@ -28,7 +28,7 @@
import com.vci.client.framework.delegate.RightManagementClientDelegate;
import com.vci.client.framework.systemConfig.stafforgmanage.ListLabelCellRenderForRightRole;
import com.vci.client.logon.base.BaseJDialog;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
import com.vci.corba.common.VCIError;
diff --git a/Source/Client/PLTClient/src/com/vci/client/common/IconSelectDialog.java b/Source/Client/PLTClient/src/com/vci/client/common/IconSelectDialog.java
index 02e3104..91b6e99 100644
--- a/Source/Client/PLTClient/src/com/vci/client/common/IconSelectDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/common/IconSelectDialog.java
@@ -30,7 +30,7 @@
import com.vci.client.framework.util.ClientHelper;
import com.vci.client.logon.base.BaseJDialog;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.VCISwingUtil;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/delegate/RightManagementClientDelegate.java b/Source/Client/PLTClient/src/com/vci/client/framework/delegate/RightManagementClientDelegate.java
index beb6721..f2c21f4 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/delegate/RightManagementClientDelegate.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/delegate/RightManagementClientDelegate.java
@@ -1,6 +1,5 @@
package com.vci.client.framework.delegate;
-import java.sql.Timestamp;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Arrays;
@@ -21,11 +20,11 @@
import com.vci.client.common.objects.UserEntityObject;
import com.vci.client.common.objects.UserLogonObject;
import com.vci.client.common.objects.UserObject;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.framework.appConfig.object.AppConfigDetailObject;
import com.vci.client.framework.systemConfig.object.CombinationObject;
import com.vci.client.framework.systemConfig.object.CombinationValueObject;
import com.vci.client.framework.systemConfig.object.PasswordStrategyObject;
-import com.vci.client.omd.enumManager.ui.EnumClient;
import com.vci.client.ui.exception.VCIException;
import com.vci.corba.common.VCIError;
import com.vci.corba.common.data.VCIInvocationInfo;
@@ -38,6 +37,7 @@
import com.vci.corba.framework.data.UserLogonInfo;
import com.vci.corba.omd.etm.EnumChild;
import com.vci.corba.omd.etm.EnumItem;
+import com.vci.corba.log.data.LogType;
public class RightManagementClientDelegate extends ClientBaseDelegate {
@@ -1408,7 +1408,7 @@
// 浣跨敤IP瀵嗙骇鏋氫妇鐨勬渶灏忓��
EnumItem enumItem;
try {
- enumItem = EnumClient.getService().getEmItemByName("ipsecurityenum");
+ enumItem = ServiceProvider.getOMDService().getEnumService().getEmItemByName("ipsecurityenum");
List<EnumChild> childs = new LinkedList<EnumChild>();
if(enumItem == null || enumItem.children.length == 0) return "10";
for(EnumChild child : enumItem.children){
@@ -1547,18 +1547,21 @@
*/
public void savelog(String content) throws VCIException{
try{
- ClientSession.getFrameworkService().savelog(content, userEntityInfo);
+ ServiceProvider.getLogService().saveLoginLog(true, content, userEntityInfo);
}catch(VCIError e){
throw new VCIException(String.valueOf(e.code), e.messages);
}
}
+
+
public void saveLogV2(String result, String content, String type, int logTypeIntVal, String dataObjOid) throws VCIException{
try{
- ClientSession.getFrameworkService().saveLogV2(result, content, type, (short)logTypeIntVal, dataObjOid, userEntityInfo);
+ ServiceProvider.getLogService().saveLog(result, content, type, LogType.valueOf(logTypeIntVal), dataObjOid, userEntityInfo);
}catch(VCIError e){
throw new VCIException(String.valueOf(e.code), e.messages);
}
}
+
//add by caill start 2016.9.13鐢ㄦ埛琚攣瀹氱殑鏃ュ織
/**
*
@@ -1571,7 +1574,7 @@
*/
public void blocklog(String userId) throws VCIException{
try{
- ClientSession.getFrameworkService().blocklog(userId, userEntityInfo);
+ ServiceProvider.getLogService().saveLockLog(userId, userEntityInfo);
}catch(VCIError e){
throw new VCIException(String.valueOf(e.code), e.messages);
}
@@ -1588,12 +1591,12 @@
*/
public void savelogFail(String message) throws VCIException{
try{
- ClientSession.getFrameworkService().savelogfail(message, userEntityInfo);
+ ServiceProvider.getLogService().saveLoginLog(false, message, userEntityInfo);
}catch(VCIError e){
throw new VCIException(String.valueOf(e.code), e.messages);
}
-
}
+
/**
* 鍒嗛〉鏌ヨ瀵嗙爜缁勫悎鏂瑰紡
* <p>Description: </p>
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/FunOperateExcelImportDialogActionListener.java b/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/FunOperateExcelImportDialogActionListener.java
index 60d6dbd..1e95177 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/FunOperateExcelImportDialogActionListener.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/FunOperateExcelImportDialogActionListener.java
@@ -25,17 +25,17 @@
import com.vci.client.framework.delegate.RightManagementClientDelegate;
import com.vci.client.framework.rightConfig.object.FuncOperationObject;
import com.vci.client.framework.rightConfig.object.FunctionObject;
-import com.vci.client.ui.excel.ExcelCellStyleSettingCallback;
-import com.vci.client.ui.excel.ExcelDocumentUtils;
-import com.vci.client.ui.excel.ExcelFileOperation;
-import com.vci.client.ui.excel.SheetDataSet;
-import com.vci.client.ui.excel.WorkboolStyleSetting;
+import com.vci.client.utils.excel.ExcelDocumentUtils;
+import com.vci.client.utils.excel.SheetDataSet;
import com.vci.client.ui.exception.VCIException;
import com.vci.client.ui.process.QANProcessBar;
import com.vci.client.ui.process.QANProcessBarFrame;
import com.vci.client.ui.swing.VCIOptionPane;
import com.vci.client.ui.swing.VCISwingUtil;
import com.vci.client.ui.swing.components.VCIJOptionPane;
+import com.vci.client.utils.excel.ExcelCellStyleSettingCallback;
+import com.vci.client.utils.excel.ExcelFileOperation;
+import com.vci.client.utils.excel.WorkboolStyleSetting;
import com.vci.common.utility.ObjectUtility;
import com.vci.corba.common.VCIError;
import com.vci.corba.framework.data.OperateInfo;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/FuncOperatePanel.java b/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/FuncOperatePanel.java
index e9daebe..d27159f 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/FuncOperatePanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/FuncOperatePanel.java
@@ -20,7 +20,7 @@
import com.vci.client.framework.delegate.FuncOperationClientDelegate;
import com.vci.client.framework.rightConfig.object.FuncOperationObject;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KTextField;
import com.vci.client.ui.swing.VCIOptionPane;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/ModelManageTreeCellRenderer.java b/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/ModelManageTreeCellRenderer.java
index e6cd623..5cc8729 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/ModelManageTreeCellRenderer.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/ModelManageTreeCellRenderer.java
@@ -6,7 +6,7 @@
import javax.swing.ToolTipManager;
import javax.swing.tree.DefaultTreeCellRenderer;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.tree.VCIBaseTreeNode;
/**
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/ModelManagementPanel.java b/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/ModelManagementPanel.java
index 8b36c09..266f87e 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/ModelManagementPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/ModelManagementPanel.java
@@ -41,11 +41,8 @@
import com.vci.client.framework.rightConfig.modelConfig.ModuleConfigMainPanel;
import com.vci.client.framework.rightConfig.object.FunctionObject;
import com.vci.client.omd.btm.ui.BtmPanel;
-import com.vci.client.ui.excel.ExcelCellStyleSettingCallback;
-import com.vci.client.ui.excel.ExcelFileOperation;
-import com.vci.client.ui.excel.WorkboolStyleSetting;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.process.QANProcessBar;
import com.vci.client.ui.process.QANProcessBarFrame;
@@ -58,6 +55,9 @@
import com.vci.client.ui.tree.VCIBaseTreeModel;
import com.vci.client.ui.tree.VCIBaseTreeNode;
import com.vci.client.ui.util.UIHelper;
+import com.vci.client.utils.excel.ExcelCellStyleSettingCallback;
+import com.vci.client.utils.excel.ExcelFileOperation;
+import com.vci.client.utils.excel.WorkboolStyleSetting;
import com.vci.corba.common.VCIError;
import com.vci.mw.ClientContextVariable;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/OperationTypeTreeDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/OperationTypeTreeDialog.java
index 706257d..6f27fcf 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/OperationTypeTreeDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/functiontree/OperationTypeTreeDialog.java
@@ -17,7 +17,7 @@
import com.vci.client.framework.rightConfig.object.OperateObject;
import com.vci.client.logon.base.BaseJDialog;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
import com.vci.client.ui.swing.components.VCIJPanel;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/operate/OperaTypeTreeCellRenderer.java b/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/operate/OperaTypeTreeCellRenderer.java
index d56674c..5bc7e8d 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/operate/OperaTypeTreeCellRenderer.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/operate/OperaTypeTreeCellRenderer.java
@@ -6,7 +6,7 @@
import javax.swing.ToolTipManager;
import javax.swing.tree.DefaultTreeCellRenderer;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.tree.VCIBaseTreeNode;
/**
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/operate/OperateMangePanel.java b/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/operate/OperateMangePanel.java
index ef2f308..c561f27 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/operate/OperateMangePanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/rightConfig/operate/OperateMangePanel.java
@@ -28,7 +28,7 @@
import com.vci.client.framework.delegate.OperateClientDelegate;
import com.vci.client.framework.rightConfig.object.OperateObject;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KTextField;
import com.vci.client.ui.swing.VCIOptionPane;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSRoleRightPanel.java b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSRoleRightPanel.java
index 16a8f98..6d3f276 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSRoleRightPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSRoleRightPanel.java
@@ -44,7 +44,7 @@
import com.vci.client.framework.rightdistribution.object.RoleRightObject;
import com.vci.client.framework.specialrole.ModuleInterface.IModuleShow;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.VCIOptionPane;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanel.java b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanel.java
index 4cc1d29..12b7cf4 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanel.java
@@ -48,7 +48,7 @@
import com.vci.client.framework.systemConfig.stafforgmanage.ListLabelCellRender;
import com.vci.client.portal.utility.UIDataFetcher;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.VCIOptionPane;
@@ -165,8 +165,7 @@
leftMainPanel.add(leftPanel,BorderLayout.CENTER);
leftMainPanel.add(getSearchPanel(),BorderLayout.NORTH);
- jspConfigPanel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftMainPanel,
- palMain);
+ jspConfigPanel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftMainPanel, palMain);
jspConfigPanel.setDividerSize(7);
jspConfigPanel.setContinuousLayout(true);
jspConfigPanel.setOneTouchExpandable(true);
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanel2.java b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanel2.java
index 26f0216..e469e27 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanel2.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanel2.java
@@ -58,7 +58,7 @@
import com.vci.client.portal.utility.UIDataFetcher;
import com.vci.client.portal.utility.UITools;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.process.QANProcessBar;
import com.vci.client.ui.process.QANProcessBarFrame;
@@ -142,7 +142,7 @@
JPanel buttonPanel = new JPanel();
JPanel midPanel = new JPanel();
palMain.setLayout(new BorderLayout());
- roleList("");
+ initRoleList("");
contentItem(contentPanel);
jButtonPanl(buttonPanel);
initTreeNode();
@@ -235,7 +235,10 @@
BizTypeEx btEx = (BizTypeEx)comboType.getSelectedItem();
if (btEx == null || btEx.getBizType() == null)
+ {
+ initUIContextTree(null, null);
return;
+ }
BtmItem bt = btEx.getBizType();
@@ -255,11 +258,102 @@
private void UIContextSelectChanged(ItemEvent e) {
- // TODO Auto-generated method stub
+ BtmItem bt = null;
+ PLUILayout uiContext = null;
+ BizTypeEx btEx = (BizTypeEx)comboType.getSelectedItem();
+ if (btEx != null)
+ bt = btEx.getBizType();
+
+ UILayoutEx uiEx = (UILayoutEx)comboUIContext.getSelectedItem();
+ if (uiEx != null)
+ uiContext = uiEx.getUIContext();
+
+ initUIContextTree(bt, uiContext);
+ }
+
+ private String getNodeText(Object obj) {
+ String text = "";
+
+ if (obj == null)
+ return null;
+
+ if (obj instanceof BtmItem) {
+ BtmItem bt = (BtmItem)obj;
+ return bt.name+" ["+ bt.label+"]";
+ } else if (obj instanceof PLUILayout) {
+ PLUILayout ui = (PLUILayout)obj;
+ return ui.plCode+" ["+ui.plName+"]";
+ } else if (obj instanceof PLTabPage) {
+ PLTabPage tab = (PLTabPage)obj;
+ return tab.plName;
+ } else if (obj instanceof PLPageDefination) {
+ PLPageDefination page = (PLPageDefination)obj;
+ return page.name;
+ } else if (obj instanceof PLTabButton) {
+ PLTabButton btn = (PLTabButton)obj;
+ return btn.plLabel;
+ }
+ return text;
+ }
+
+ private void initUIContextTree(BtmItem bt, PLUILayout uiContext) {
+
+ treeManager.getSelectionModel().removeSelectionPath(new TreePath(rootNode.getPath()));
+ //鍏堟竻闄ゆ墍鏈夊睍寮�鐨勮妭鐐�
+ rootNode.removeAllChildren();
+ treeModel.reload();
+// for(int i=rootNode.getChildCount(); i>0; i--){
+// VCIBaseTreeNode childNode = (VCIBaseTreeNode)rootNode.getChildAt(i-1);
+// treeModel.removeNodeFromParent(childNode);
+// }
+ funMap.clear();
+
+ //rootNode.setExpand(true);
+
+ if(bt != null) {
+ if (uiContext != null) {
+ Map<String, VCIBaseTreeNode> showNodes = new HashMap<String, VCIBaseTreeNode>();
+ VCIBaseTreeNode typeNode = showNodes.get(bt.name);
+ if(typeNode == null){
+ //娣诲姞绫诲瀷鑺傜偣
+ typeNode = new VCIBaseTreeNode(getNodeText(bt), bt);//bt.name+" ["+ bt.label+"]", bt);
+ treeModel.insertNodeInto(typeNode, rootNode,rootNode.getChildCount());
+ //typeNode.setExpand(true);
+ funMap.put(bt.name, bt.name);
+ showNodes.put(bt.name, typeNode);
+ }
+ //娣诲姞涓婁笅鏂囪妭鐐瑰強瀛愯妭鐐�
+ VCIBaseTreeNode curNode = new VCIBaseTreeNode(getNodeText(uiContext), uiContext);//uiContext.plName+" ["+uiContext.plCode+"]", uiContext);
+ //curNode.setExpand(true);
+ treeModel.insertNodeInto(curNode, typeNode,typeNode.getChildCount());
+ funMap.put(uiContext.plOId, uiContext.plCode);
+ setChildNode(curNode, uiContext);
+ } else {
+ VCIBaseTreeNode typeNode = new VCIBaseTreeNode(getNodeText(bt), bt);//bt.label+" ["+ bt.name+"]", bt);
+ treeModel.insertNodeInto(typeNode, rootNode,rootNode.getChildCount());
+ //typeNode.setExpand(true);
+ funMap.put(bt.name, bt.name);
+ setChildNode(typeNode, bt, uiDataFechter);
+ }
+ }else{
+ BtmItem[] btmItems = BtmProvider.getInstance().getAllBtmItems();
+ for (int i = 0; i < btmItems.length; i++) {
+ VCIBaseTreeNode typeNode = new VCIBaseTreeNode(getNodeText(btmItems[i]), btmItems[i]);//btmItems[i].label+"("+ btmItems[i].name+")", btmItems[i]);
+ treeModel.insertNodeInto(typeNode, rootNode,rootNode.getChildCount());
+ //typeNode.setExpand(true);
+ funMap.put(btmItems[i].name, btmItems[i].name);
+ setChildNode(typeNode, bt, uiDataFechter);
+ }
+ }
+
+ tree.scrollPathToVisible(new TreePath(rootNode.getPath()));
+ //tree.expandAllTreeNode(new TreePath(rootNode.getPath()), true);
+ if (curRole != null)
+ initRoleRight(curRole.getId());
}
- public void roleList(String searchText) {
+ public void initRoleList(String searchText) {
setRoleList(searchText);
roleList.setCellRenderer(new ListLabelCellRender());
roleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
@@ -276,72 +370,22 @@
leftPanel.getViewport().add(roleList);
}
+
+
Map<String,RoleRightObject> allRightRoleMap = new HashMap<String,RoleRightObject>();
public void initRoleRight(String roleId){
- try{
- //鍏堟竻闄ゆ墍鏈夊睍寮�鐨勮妭鐐�
- /*for(int i=rootNode.getChildCount(); i>0; i--){
- VCIBaseTreeNode childNode = (VCIBaseTreeNode)rootNode.getChildAt(i-1);
- for(int j=childNode.getChildCount();j>0;j--){
- VCIBaseTreeNode cchildNode = (VCIBaseTreeNode)childNode.getChildAt(j-1);
- treeModel.removeNodeFromParent(cchildNode);
- }
- }*/
- initTreeNode();
- //allRightRoleMap = new HashMap<String,RoleRightObject>();
- funMap.clear();
- //寮�濮嬪睍绀烘垜鐨勬潈闄愬唴瀹�
- long s = System.currentTimeMillis();
+ try {
+ allRightRoleMap = new HashMap<String,RoleRightObject>();
RoleRightObject[] roleRightObjs = new RoleRightClientDelegate().getRoleRightList(roleId, LogonApplication.getUserEntityObject().getUserName());
-
- long t = System.currentTimeMillis();
- System.out.println("1: " + (t - s));
- s = System.currentTimeMillis();
- BtmItem[] btmItems = BtmProvider.getInstance().getAllBtmItems();
- t = System.currentTimeMillis();
- System.out.println("2: " + (t - s));
-
- s = System.currentTimeMillis();
- Map<String,Long> rightMap = new HashMap<String,Long>();
- for(RoleRightObject obj:roleRightObjs){
- allRightRoleMap.put(obj.getFuncId(), obj);
- rightMap.put(obj.getFuncId(), obj.getRightValue());
- }
- t = System.currentTimeMillis();
- System.out.println("3: " + (t - s));
-
- //娣诲姞type鑺傜偣
- UIDataFetcher uiDataFechter = new UIDataFetcher();
- s = System.currentTimeMillis();
- int ii=0;
- for(BtmItem btmItem: btmItems){
-
- if(rightMap.containsKey(btmItem.name))
- {
- //VCIBaseTreeNode node = new VCIBaseTreeNode(btmItem.label+"("+ btmItem.name+")", btmItem);
- VCIBaseTreeNode node = (VCIBaseTreeNode)rootNode.getChildAt(ii);
- //node.setExpand(true);
- funMap.put(btmItem.name, btmItem.name);
- // treeModel.insertNodeInto(node, rootNode,rootNode.getChildCount());
- // setChildNode(node, btmItem, rightMap);
- setChildNode(node, btmItem, uiDataFechter);
- }
- ii++;
- }
- t = System.currentTimeMillis();
- System.out.println("4: " + (t - s));
-
- s = System.currentTimeMillis();
visitAllTreeNode(rootNode, roleRightObjs);
- //treeManager.getSelectionModel().addSelectionPath(new TreePath(rootNode.getPath()));
- t = System.currentTimeMillis();
- System.out.println("5: " + (t - s));
} catch (VCIException e) {
e.printStackTrace();
VCIOptionPane.showError(LogonApplication.frame, LocaleDisplay.getI18nString(e,"RMIPFramework", getLocale()));
}
}
+
+
private void setChildNode(VCIBaseTreeNode node ,Object funcObj, UIDataFetcher uiDataFechter) {
if (funcObj instanceof BtmItem) {
BtmItem btmItem = (BtmItem) funcObj;
@@ -350,7 +394,7 @@
return;
}
for(PLUILayout context : contexts){
- VCIBaseTreeNode curNode = new VCIBaseTreeNode(context.plName+"("+context.plCode+")", context);
+ VCIBaseTreeNode curNode = new VCIBaseTreeNode(getNodeText(context), context);// context.plName+"("+context.plCode+")", context);
treeModel.insertNodeInto(curNode, node,node.getChildCount());
funMap.put(context.plOId, context.plCode);
setChildNode(curNode, context, uiDataFechter);
@@ -362,7 +406,7 @@
return;
}
for(PLTabPage tab : tabs){
- VCIBaseTreeNode curNode = new VCIBaseTreeNode(tab.plName, tab);
+ VCIBaseTreeNode curNode = new VCIBaseTreeNode(getNodeText(tab), tab);//tab.plName, tab);
treeModel.insertNodeInto(curNode, node,node.getChildCount());
funMap.put(tab.plOId, tab.plName);
setChildNode(curNode, tab, uiDataFechter);
@@ -374,7 +418,7 @@
return;
}
for (PLPageDefination pageDefination : pageDefinations) {
- VCIBaseTreeNode curNode = new VCIBaseTreeNode(pageDefination.name, pageDefination);
+ VCIBaseTreeNode curNode = new VCIBaseTreeNode(getNodeText(pageDefination), pageDefination);//pageDefination.name, pageDefination);
treeModel.insertNodeInto(curNode, node,node.getChildCount());
funMap.put(pageDefination.plOId, pageDefination.name);
setChildNode(curNode, pageDefination, uiDataFechter);
@@ -389,7 +433,7 @@
if(!button.show.equals("0")){
continue;
}
- VCIBaseTreeNode curNode = new VCIBaseTreeNode(button.plLabel, button);
+ VCIBaseTreeNode curNode = new VCIBaseTreeNode(getNodeText(button), button);//button.plLabel, button);
treeModel.insertNodeInto(curNode, node,node.getChildCount());
funMap.put(button.plTableOId, button.plLabel);
setChildNode(curNode, button, uiDataFechter);
@@ -563,13 +607,13 @@
}
});
- reAddButton.setText(LocaleDisplay.getI18nString("rmip.framework.rightdistribution.moduleRight.reAddButton.file","RMIPFramework", getLocale()));
- reAddButton.setIcon(new BundleImage().createImageIcon("create.gif"));
- reAddButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- reAdd_actionPerform();
- }
- });
+// reAddButton.setText(LocaleDisplay.getI18nString("rmip.framework.rightdistribution.moduleRight.reAddButton.file","RMIPFramework", getLocale()));
+// reAddButton.setIcon(new BundleImage().createImageIcon("create.gif"));
+// reAddButton.addActionListener(new ActionListener() {
+// public void actionPerformed(ActionEvent e) {
+// reAdd_actionPerform();
+// }
+// });
delButton.setText(LocaleDisplay.getI18nString("rmip.framework.rightdistribution.moduleRight.delButton.file","RMIPFramework", getLocale()));
@@ -581,21 +625,21 @@
}
});
- removeButton.setText(LocaleDisplay.getI18nString("rmip.framework.rightdistribution.moduleRight.removeButton.file","RMIPFramework", getLocale()));
- removeButton.setIcon(new BundleImage().createImageIcon("remove.gif"));
- removeButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- remove_actionPerform();
- }
- });
+// removeButton.setText(LocaleDisplay.getI18nString("rmip.framework.rightdistribution.moduleRight.removeButton.file","RMIPFramework", getLocale()));
+// removeButton.setIcon(new BundleImage().createImageIcon("remove.gif"));
+// removeButton.addActionListener(new ActionListener() {
+// public void actionPerformed(ActionEvent e) {
+// remove_actionPerform();
+// }
+// });
- clearButton.setText(LocaleDisplay.getI18nString("rmip.framework.rightdistribution.moduleRight.clearButton.file","RMIPFramework", getLocale()));
- clearButton.setIcon(new BundleImage().createImageIcon("clear.gif"));
- clearButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- clear_actionPerform();
- }
- });
+// clearButton.setText(LocaleDisplay.getI18nString("rmip.framework.rightdistribution.moduleRight.clearButton.file","RMIPFramework", getLocale()));
+// clearButton.setIcon(new BundleImage().createImageIcon("clear.gif"));
+// clearButton.addActionListener(new ActionListener() {
+// public void actionPerformed(ActionEvent e) {
+// clear_actionPerform();
+// }
+// });
sBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
@@ -675,100 +719,100 @@
// p.add(contextText);
// p.add(sBtn);
p.add(addButton);
- p.add(reAddButton);
+// p.add(reAddButton);
p.add(delButton);
- p.add(removeButton);
- p.add(clearButton);
+// p.add(removeButton);
+// p.add(clearButton);
}
- private void remove_actionPerform(){
- if (!checkItem()) {
- return;
- }
- final QANProcessBarFrame frame = new QANProcessBarFrame();
- TreePath[] treePath = treeManager.getSelectionModel().getSelectionPaths();
- if (treePath == null || treePath.length == 0) {
- VCIOptionPane.showMessage(LogonApplication.frame, "璇烽�夋嫨瑕佸垹闄ょ殑鏉冮檺");
- return ;
- }
- QANProcessBar bar = null;
- Thread t = new Thread(){
- public void run() {
- frame.setContent("姝e湪鎺堟潈,璇风◢绛�......");
- try {
- rightMap.clear();
- boolean refresh = true;
- TreePath[] treePath = treeManager.getSelectionModel().getSelectionPaths();
- //褰撴病鏈夐�変腑妯″潡鐨勬椂鍊�
- if (treePath == null && treePath.length == 0){
- refresh = false;
- }else{
- RoleRightObject[] roleRightObjs = getRemoveedSelectedRoleRightObjs(treePath);
- boolean res = new RoleRightClientDelegate(LogonApplication.getUserEntityObject()).removeRoleRight(roleRightObjs,curRole.getId(),currentUserName);
- frame.setProcessBarCancel(true);
- if(res){
- VCIOptionPane.showMessage(LogonApplication.frame, "绉婚櫎UI鎿嶄綔鏉冮檺鎴愬姛锛�");
- }
- }
- if(refresh){
- treeManager.getSelectionModel().clearSelection();
- initRoleRight(curRole.getId());
- }
- } catch (VCIException e1) {
- e1.printStackTrace();
- VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e1);
- } finally {
- frame.setProcessBarCancel(true);
- }
- }
- };
- bar = new QANProcessBar(t, frame, frame,"UI鎿嶄綔鎺堟潈",false);
- bar.setVisible(true);
- }
-
- private void clear_actionPerform(){
- if (!checkItem()) {
- return;
- }
- final QANProcessBarFrame frame = new QANProcessBarFrame();
- TreePath[] treePath = treeManager.getSelectionModel().getSelectionPaths();
- if (treePath == null || treePath.length == 0) {
- int result = VCIOptionPane.showConfirmDialog(LogonApplication.frame, this, "鎮ㄧ‘瀹氳娓呴櫎鎵�鏈夌殑UI鎿嶄綔鏉冮檺鍚楋紵", "娉ㄦ剰锛屾偍纭畾瑕佹竻闄ゆ墍鏈夌殑UI鏉冮檺鍚�?", VCIOptionPane.YES_NO_OPTION, VCIOptionPane.WARNING_MESSAGE);
- if(result != VCIOptionPane.YES_OPTION){
- return;
- }
- }
- QANProcessBar bar = null;
- Thread t = new Thread(){
- public void run() {
- frame.setContent("姝e湪娓呴櫎鎺堟潈,璇风◢绛�......");
- try {
- rightMap.clear();
- boolean refresh = true;
- TreePath[] treePath = treeManager.getSelectionModel().getSelectionPaths();
- //褰撴病鏈夐�変腑妯″潡鐨勬椂鍊�
- RoleRightObject[] roleRightObjs = new RoleRightObject[0];
- boolean res = new RoleRightClientDelegate(LogonApplication.getUserEntityObject()).clearRight(curRole.getId(),currentUserName, RightType.UI);
- frame.setProcessBarCancel(true);
- if(res){
- VCIOptionPane.showMessage(LogonApplication.frame, "UI鎿嶄綔鏉冮檺娓呯┖鎴愬姛锛�");
- }
-
- if(refresh){
- treeManager.getSelectionModel().clearSelection();
- initRoleRight(curRole.getId());
- }
- } catch (VCIException e1) {
- e1.printStackTrace();
- VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e1);
- } finally {
- frame.setProcessBarCancel(true);
- }
- }
- };
- bar = new QANProcessBar(t, frame, frame,"UI鎿嶄綔鎺堟潈",false);
- bar.setVisible(true);
- }
+// private void remove_actionPerform(){
+// if (!checkItem()) {
+// return;
+// }
+// final QANProcessBarFrame frame = new QANProcessBarFrame();
+// TreePath[] treePath = treeManager.getSelectionModel().getSelectionPaths();
+// if (treePath == null || treePath.length == 0) {
+// VCIOptionPane.showMessage(LogonApplication.frame, "璇烽�夋嫨瑕佸垹闄ょ殑鏉冮檺");
+// return ;
+// }
+// QANProcessBar bar = null;
+// Thread t = new Thread(){
+// public void run() {
+// frame.setContent("姝e湪鎺堟潈,璇风◢绛�......");
+// try {
+// rightMap.clear();
+// boolean refresh = true;
+// TreePath[] treePath = treeManager.getSelectionModel().getSelectionPaths();
+// //褰撴病鏈夐�変腑妯″潡鐨勬椂鍊�
+// if (treePath == null && treePath.length == 0){
+// refresh = false;
+// }else{
+// RoleRightObject[] roleRightObjs = getRemoveedSelectedRoleRightObjs(treePath);
+// boolean res = new RoleRightClientDelegate(LogonApplication.getUserEntityObject()).removeRoleRight(roleRightObjs,curRole.getId(),currentUserName);
+// frame.setProcessBarCancel(true);
+// if(res){
+// VCIOptionPane.showMessage(LogonApplication.frame, "绉婚櫎UI鎿嶄綔鏉冮檺鎴愬姛锛�");
+// }
+// }
+// if(refresh){
+// treeManager.getSelectionModel().clearSelection();
+// initRoleRight(curRole.getId());
+// }
+// } catch (VCIException e1) {
+// e1.printStackTrace();
+// VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e1);
+// } finally {
+// frame.setProcessBarCancel(true);
+// }
+// }
+// };
+// bar = new QANProcessBar(t, frame, frame,"UI鎿嶄綔鎺堟潈",false);
+// bar.setVisible(true);
+// }
+//
+// private void clear_actionPerform(){
+// if (!checkItem()) {
+// return;
+// }
+// final QANProcessBarFrame frame = new QANProcessBarFrame();
+// TreePath[] treePath = treeManager.getSelectionModel().getSelectionPaths();
+// if (treePath == null || treePath.length == 0) {
+// int result = VCIOptionPane.showConfirmDialog(LogonApplication.frame, this, "鎮ㄧ‘瀹氳娓呴櫎鎵�鏈夌殑UI鎿嶄綔鏉冮檺鍚楋紵", "娉ㄦ剰锛屾偍纭畾瑕佹竻闄ゆ墍鏈夌殑UI鏉冮檺鍚�?", VCIOptionPane.YES_NO_OPTION, VCIOptionPane.WARNING_MESSAGE);
+// if(result != VCIOptionPane.YES_OPTION){
+// return;
+// }
+// }
+// QANProcessBar bar = null;
+// Thread t = new Thread(){
+// public void run() {
+// frame.setContent("姝e湪娓呴櫎鎺堟潈,璇风◢绛�......");
+// try {
+// rightMap.clear();
+// boolean refresh = true;
+// TreePath[] treePath = treeManager.getSelectionModel().getSelectionPaths();
+// //褰撴病鏈夐�変腑妯″潡鐨勬椂鍊�
+// RoleRightObject[] roleRightObjs = new RoleRightObject[0];
+// boolean res = new RoleRightClientDelegate(LogonApplication.getUserEntityObject()).clearRight(curRole.getId(),currentUserName, RightType.UI);
+// frame.setProcessBarCancel(true);
+// if(res){
+// VCIOptionPane.showMessage(LogonApplication.frame, "UI鎿嶄綔鏉冮檺娓呯┖鎴愬姛锛�");
+// }
+//
+// if(refresh){
+// treeManager.getSelectionModel().clearSelection();
+// initRoleRight(curRole.getId());
+// }
+// } catch (VCIException e1) {
+// e1.printStackTrace();
+// VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e1);
+// } finally {
+// frame.setProcessBarCancel(true);
+// }
+// }
+// };
+// bar = new QANProcessBar(t, frame, frame,"UI鎿嶄綔鎺堟潈",false);
+// bar.setVisible(true);
+// }
public void initTreeNode(){
rootNode = new VCIBaseTreeNode(LocaleDisplay.getI18nString("rmip.framework.rightdistribution.moduleRight.moduleTree","RMIPFramework", getLocale()), "root");
@@ -780,46 +824,47 @@
comboType.addItem(new BizTypeEx(null));
for(int k = 0;k < btmItems.length;k++) {
- funMap.put(btmItems[k].name, btmItems[k].name);
-
comboType.addItem(new BizTypeEx(btmItems[k]));
}
for (int i = 0; i < btmItems.length; i++) {
- VCIBaseTreeNode node = new VCIBaseTreeNode(btmItems[i].label+"("+ btmItems[i].name+")", btmItems[i]);
+ VCIBaseTreeNode node = new VCIBaseTreeNode(btmItems[i].label+" ["+ btmItems[i].name+"]", btmItems[i]);
treeModel.insertNodeInto(node, rootNode,rootNode.getChildCount());
+ funMap.put(btmItems[i].name, btmItems[i].name);
+ setChildNode(node, btmItems[i]);
}
+
treeManager = new CheckBoxTreeManager(tree);
scrollTree.getViewport().removeAll();
scrollTree.getViewport().add(tree);
scrollTree.repaint();
- tree.addTreeExpansionListener(new TreeExpansionListener() {
-
- @Override
- public void treeExpanded(TreeExpansionEvent event) {
- TreePath path = event.getPath();
- VCIBaseTreeNode selNode = (VCIBaseTreeNode)path.getLastPathComponent();
- if(!selNode.isLeaf() && selNode.getChildCount() == 0 && !selNode.isExpand()){
- setChildNode(selNode, selNode.getObj());
- }
- }
-
- @Override
- public void treeCollapsed(TreeExpansionEvent event) {
-
- }
- });
+// tree.addTreeExpansionListener(new TreeExpansionListener() {
+//
+// @Override
+// public void treeExpanded(TreeExpansionEvent event) {
+// TreePath path = event.getPath();
+// VCIBaseTreeNode selNode = (VCIBaseTreeNode)path.getLastPathComponent();
+// if(!selNode.isLeaf() && selNode.getChildCount() == 0 && !selNode.isExpand()){
+// setChildNode(selNode, selNode.getObj());
+// }
+// }
+//
+// @Override
+// public void treeCollapsed(TreeExpansionEvent event) {
+//
+// }
+// });
}
private void refreshRole() {
- roleList("");
+ initRoleList("");
treeManager.getSelectionModel().clearSelection();
}
/**鏌ヨ婊¤冻鏉′欢鐨勮鑹蹭俊鎭�**/
private void searchRoleList() {
String search = this.searchTxt.getText().trim();
- roleList(search);
+ initRoleList(search);
treeManager.getSelectionModel().clearSelection();
}
@@ -878,141 +923,54 @@
bar.setVisible(true);
}
-/* private void remove_actionPerform(){
- if (!checkItem()) {
- return;
- }
- final QANProcessBarFrame frame = new QANProcessBarFrame();
- TreePath[] treePath = treeManager.getSelectionModel().getSelectionPaths();
- if (treePath == null || treePath.length == 0) {
- VCIOptionPane.showMessage(LogonApplication.frame, "璇烽�夋嫨瑕佸垹闄ょ殑鏉冮檺");
- return ;
- }
- QANProcessBar bar = null;
- Thread t = new Thread(){
- public void run() {
- frame.setContent("姝e湪鎺堟潈,璇风◢绛�......");
- try {
- rightMap.clear();
- boolean refresh = true;
- TreePath[] treePath = treeManager.getSelectionModel().getSelectionPaths();
- //褰撴病鏈夐�変腑妯″潡鐨勬椂鍊�
- if (treePath == null && treePath.length == 0){
- refresh = false;
- }else{
- RoleRightObject[] roleRightObjs = getRemoveedSelectedRoleRightObjs(treePath);
- boolean res = new RoleRightClientDelegate(LogonApplication.getUserEntityObject()).removeRoleRight(roleRightObjs,curRole.getId(),currentUserName);
- frame.setProcessBarCancel(true);
- if(res){
- VCIOptionPane.showMessage(LogonApplication.frame, "绉婚櫎UI鎿嶄綔鏉冮檺鎴愬姛锛�");
- }
- }
- if(refresh){
- treeManager.getSelectionModel().clearSelection();
- initRoleRight(curRole.getId());
- }
- } catch (VCIException e1) {
- e1.printStackTrace();
- VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e1);
- } finally {
- frame.setProcessBarCancel(true);
- }
- }
- };
- bar = new QANProcessBar(t, frame, frame,"UI鎿嶄綔鎺堟潈",false);
- bar.setVisible(true);
- }*/
-
-/* private void clear_actionPerform(){
- if (!checkItem()) {
- return;
- }
- final QANProcessBarFrame frame = new QANProcessBarFrame();
- TreePath[] treePath = treeManager.getSelectionModel().getSelectionPaths();
- if (treePath == null || treePath.length == 0) {
- int result = VCIOptionPane.showConfirmDialog(LogonApplication.frame, this, "鎮ㄧ‘瀹氳娓呴櫎鎵�鏈夌殑UI鎿嶄綔鏉冮檺鍚楋紵", "娉ㄦ剰锛屾偍纭畾瑕佹竻闄ゆ墍鏈夌殑UI鏉冮檺鍚�?", VCIOptionPane.YES_NO_OPTION, VCIOptionPane.WARNING_MESSAGE);
- if(result != VCIOptionPane.YES_OPTION){
- return;
- }
- }
- QANProcessBar bar = null;
- Thread t = new Thread(){
- public void run() {
- frame.setContent("姝e湪娓呴櫎鎺堟潈,璇风◢绛�......");
- try {
- rightMap.clear();
- boolean refresh = true;
- TreePath[] treePath = treeManager.getSelectionModel().getSelectionPaths();
- //褰撴病鏈夐�変腑妯″潡鐨勬椂鍊�
- RoleRightObject[] roleRightObjs = new RoleRightObject[0];
- boolean res = new RoleRightClientDelegate(LogonApplication.getUserEntityObject()).clearRight(curRole.getId(),currentUserName,1);
- frame.setProcessBarCancel(true);
- if(res){
- VCIOptionPane.showMessage(LogonApplication.frame, "UI鎿嶄綔鏉冮檺娓呯┖鎴愬姛锛�");
- }
-
- if(refresh){
- treeManager.getSelectionModel().clearSelection();
- initRoleRight(curRole.getId());
- }
- } catch (VCIException e1) {
- e1.printStackTrace();
- VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e1);
- } finally {
- frame.setProcessBarCancel(true);
- }
- }
- };
- bar = new QANProcessBar(t, frame, frame,"UI鎿嶄綔鎺堟潈",false);
- bar.setVisible(true);
- }*/
+
/*
* 璇ユ柟娉曚綔涓鸿ˉ鍏呮坊鍔犳巿鏉冨姛鑳藉簲鐢�
*/
- private void reAdd_actionPerform(){
- if (!checkItem()) {
- return;
- }
- TreePath[] treePath = treeManager.getSelectionModel().getSelectionPaths();
- if (treePath == null || treePath.length == 0) {
- VCIOptionPane.showMessage(LogonApplication.frame, "鎮ㄦ病鏈夊湪褰撳墠椤甸潰閫夋嫨浠讳綍鐨勬潈闄愶紝鎵�浠ュ皢涓嶆墽琛岃拷鍔犳潈闄�");
- return ;
- }
- final QANProcessBarFrame frame = new QANProcessBarFrame();
- Thread t = new Thread(){
- public void run() {
- frame.setContent("姝e湪鎺堟潈,璇风◢绛�......");
- try {
- rightMap.clear();
- boolean refresh = true;
- TreePath[] treePath = treeManager.getSelectionModel().getSelectionPaths();
- //褰撴病鏈夐�変腑妯″潡鐨勬椂鍊�
- if (treePath == null) {
- refresh = false;
- }
- RoleRightObject[] roleRightObjs = getSelectedRoleRightObjs(treePath);
- boolean res = new RoleRightClientDelegate(LogonApplication.getUserEntityObject()).addRoleRight(roleRightObjs,curRole.getId(),currentUserName);
- frame.setProcessBarCancel(true);
- if(res){
- VCIOptionPane.showMessage(LogonApplication.frame, "鍔熻兘妯″潡鎺堟潈鎴愬姛锛�");
- }
- if(refresh){
- treeManager.getSelectionModel().clearSelection();
- initRoleRight(curRole.getId());
- }
- } catch (VCIException e1) {
- e1.printStackTrace();
- VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e1);
- } finally {
- if (frame.isActive()) {
- frame.setProcessBarCancel(true);
- }
- }
- }
- };
- QANProcessBar bar = new QANProcessBar(t, frame, frame,"鍔熻兘妯″潡鎺堟潈",false);
- bar.setVisible(true);
- }
+// private void reAdd_actionPerform(){
+// if (!checkItem()) {
+// return;
+// }
+// TreePath[] treePath = treeManager.getSelectionModel().getSelectionPaths();
+// if (treePath == null || treePath.length == 0) {
+// VCIOptionPane.showMessage(LogonApplication.frame, "鎮ㄦ病鏈夊湪褰撳墠椤甸潰閫夋嫨浠讳綍鐨勬潈闄愶紝鎵�浠ュ皢涓嶆墽琛岃拷鍔犳潈闄�");
+// return ;
+// }
+// final QANProcessBarFrame frame = new QANProcessBarFrame();
+// Thread t = new Thread(){
+// public void run() {
+// frame.setContent("姝e湪鎺堟潈,璇风◢绛�......");
+// try {
+// rightMap.clear();
+// boolean refresh = true;
+// TreePath[] treePath = treeManager.getSelectionModel().getSelectionPaths();
+// //褰撴病鏈夐�変腑妯″潡鐨勬椂鍊�
+// if (treePath == null) {
+// refresh = false;
+// }
+// RoleRightObject[] roleRightObjs = getSelectedRoleRightObjs(treePath);
+// boolean res = new RoleRightClientDelegate(LogonApplication.getUserEntityObject()).addRoleRight(roleRightObjs,curRole.getId(),currentUserName);
+// frame.setProcessBarCancel(true);
+// if(res){
+// VCIOptionPane.showMessage(LogonApplication.frame, "鍔熻兘妯″潡鎺堟潈鎴愬姛锛�");
+// }
+// if(refresh){
+// treeManager.getSelectionModel().clearSelection();
+// initRoleRight(curRole.getId());
+// }
+// } catch (VCIException e1) {
+// e1.printStackTrace();
+// VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e1);
+// } finally {
+// if (frame.isActive()) {
+// frame.setProcessBarCancel(true);
+// }
+// }
+// }
+// };
+// QANProcessBar bar = new QANProcessBar(t, frame, frame,"鍔熻兘妯″潡鎺堟潈",false);
+// bar.setVisible(true);
+// }
private RoleRightObject[] getSelectedRoleRightObjs(TreePath[] treePath){
rightMap.clear();
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanelV2.java b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanelV2.java
index 90fddc9..3a6d11d 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanelV2.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanelV2.java
@@ -50,7 +50,7 @@
import com.vci.client.omd.provider.BtmProvider;
import com.vci.client.portal.utility.UITools;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.VCIOptionPane;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanelV3.java b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanelV3.java
index 6e47147..1e2ea02 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanelV3.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/BSTypeRoleRightPanelV3.java
@@ -57,7 +57,7 @@
import com.vci.client.portal.utility.UIDataFetcher;
import com.vci.client.portal.utility.UITools;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.process.QANProcessBar;
import com.vci.client.ui.process.QANProcessBarFrame;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/CSRoleRightPanel.java b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/CSRoleRightPanel.java
index 2d203b8..485adee 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/CSRoleRightPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/CSRoleRightPanel.java
@@ -47,7 +47,7 @@
import com.vci.client.framework.systemConfig.stafforgmanage.ListLabelCellRender;
import com.vci.client.framework.util.RightControlUtil;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.VCIOptionPane;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/CSRoleRightPanelV2.java b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/CSRoleRightPanelV2.java
index e5f1937..b83e102 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/CSRoleRightPanelV2.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/CSRoleRightPanelV2.java
@@ -51,7 +51,7 @@
import com.vci.client.framework.systemConfig.stafforgmanage.ListLabelCellRender;
import com.vci.client.framework.util.RightControlUtil;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.VCIOptionPane;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/RoleRightPanel.java b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/RoleRightPanel.java
index 443d4e2..f614bcc 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/RoleRightPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/RoleRightPanel.java
@@ -45,7 +45,7 @@
import com.vci.client.framework.systemConfig.stafforgmanage.ListLabelCellRender;
import com.vci.client.framework.util.RightControlUtil;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.VCIOptionPane;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/RoleRightTreeCellRenderer.java b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/RoleRightTreeCellRenderer.java
index aeaf3c0..364ec11 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/RoleRightTreeCellRenderer.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/rightdistribution/roleRight/RoleRightTreeCellRenderer.java
@@ -6,7 +6,7 @@
import javax.swing.ToolTipManager;
import javax.swing.tree.DefaultTreeCellRenderer;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.tree.VCIBaseTreeNode;
/**
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/DeptingDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/DeptingDialog.java
index 2f8425e..be7e815 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/DeptingDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/DeptingDialog.java
@@ -15,7 +15,7 @@
import com.vci.client.framework.delegate.RightManagementClientDelegate;
import com.vci.client.logon.base.BaseJDialog;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/PasswordStrategySetingDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/PasswordStrategySetingDialog.java
index 40f2b46..4d37f4e 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/PasswordStrategySetingDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/PasswordStrategySetingDialog.java
@@ -16,7 +16,7 @@
import com.vci.client.framework.systemConfig.object.PasswordStrategyObject;
import com.vci.client.logon.base.BaseJDialog;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/RolingDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/RolingDialog.java
index 5d13942..af436d5 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/RolingDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/RolingDialog.java
@@ -24,7 +24,7 @@
import com.vci.client.framework.delegate.RightManagementClientDelegate;
import com.vci.client.logon.base.BaseJDialog;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/SelectUserDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/SelectUserDialog.java
index 14fa65b..cff5544 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/SelectUserDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/SelectUserDialog.java
@@ -25,7 +25,7 @@
import com.vci.client.framework.systemConfig.stafforgmanage.ListLabelCellRenderForRightRole;
import com.vci.client.logon.base.BaseJDialog;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
import com.vci.corba.framework.data.RoleInfo;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/UserDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/UserDialog.java
index 1ff6759..da2f4b5 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/UserDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/specialrole/UserDialog.java
@@ -17,7 +17,7 @@
import com.vci.client.common.TransmitTreeObject;
import com.vci.client.common.objects.UserObject;
import com.vci.client.logon.base.BaseJDialog;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.KPasswordField;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/SysConfigTreeCellRenderer.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/SysConfigTreeCellRenderer.java
index 14ac5ea..146c8de 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/SysConfigTreeCellRenderer.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/SysConfigTreeCellRenderer.java
@@ -10,7 +10,7 @@
import com.vci.client.framework.systemConfig.object.AttributeObject;
import com.vci.client.framework.systemConfig.object.SpecialCharClsfObject;
import com.vci.client.framework.systemConfig.volumn.object.PvolumeObject;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.tree.VCIBaseTreeNode;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/CheckPassWordStrategy.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/CheckPassWordStrategy.java
index 001e09b..7cdc90c 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/CheckPassWordStrategy.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/CheckPassWordStrategy.java
@@ -1,13 +1,8 @@
package com.vci.client.framework.systemConfig.stafforgmanage;
import java.awt.Component;
-import java.util.ArrayList;
-import java.util.List;
-
import com.vci.client.LogonApplication;
import com.vci.client.framework.delegate.RightManagementClientDelegate;
-import com.vci.client.framework.systemConfig.object.CombinationObject;
-import com.vci.client.framework.systemConfig.object.CombinationValueObject;
import com.vci.client.framework.systemConfig.object.PasswordStrategyObject;
import com.vci.client.ui.exception.VCIException;
import com.vci.client.ui.swing.VCIOptionPane;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/CombinationDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/CombinationDialog.java
index 246aaf8..4fef240 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/CombinationDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/CombinationDialog.java
@@ -14,7 +14,7 @@
import com.vci.client.LogonApplication;
import com.vci.client.framework.systemConfig.object.CombinationObject;
import com.vci.client.logon.base.BaseJDialog;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.KTextField;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptDialog.java
index f4493e3..ae8bf4e 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptDialog.java
@@ -15,7 +15,7 @@
import com.vci.client.common.TransmitTreeObject;
import com.vci.client.common.objects.DeptObject;
import com.vci.client.logon.base.BaseJDialog;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.KTextField;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptInfoTreeTableCellRender.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptInfoTreeTableCellRender.java
index 3689e02..be5301b 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptInfoTreeTableCellRender.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptInfoTreeTableCellRender.java
@@ -15,7 +15,7 @@
import javax.swing.ToolTipManager;
import javax.swing.tree.DefaultTreeCellRenderer;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.treeTable.TreeTableModel;
public class DeptInfoTreeTableCellRender extends DefaultTreeCellRenderer {
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptTablePanel.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptTablePanel.java
index 8cdf83d..8d0e2e1 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptTablePanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptTablePanel.java
@@ -28,7 +28,6 @@
import com.vci.client.framework.delegate.RightManagementClientDelegate;
import com.vci.client.framework.rightConfig.object.FunctionObject;
import com.vci.client.framework.util.RightControlUtil;
-import com.vci.client.ui.excel.ExcelFileOperation;
import com.vci.client.ui.exception.VCIException;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.process.QANProcessBar;
@@ -39,6 +38,7 @@
import com.vci.client.ui.treeTable.InterfaceTreeTableModel;
import com.vci.client.ui.treeTable.JTreeTable;
import com.vci.client.ui.treeTable.TreeTableModel;
+import com.vci.client.utils.excel.ExcelFileOperation;
import com.vci.common.utility.ObjectUtility;
/**
* <p>Title: DeptTablePanel</p>
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptingDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptingDialog.java
index a4abe37..7078d29 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptingDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/DeptingDialog.java
@@ -15,7 +15,7 @@
import com.vci.client.framework.delegate.RightManagementClientDelegate;
import com.vci.client.logon.base.BaseJDialog;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/ListLabelCellRender.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/ListLabelCellRender.java
index 93c236b..0c7f485 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/ListLabelCellRender.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/ListLabelCellRender.java
@@ -7,7 +7,7 @@
import javax.swing.ListCellRenderer;
import com.vci.client.common.objects.RoleObject;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
public class ListLabelCellRender extends JLabel implements ListCellRenderer {
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/ListLabelCellRenderForRightRole.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/ListLabelCellRenderForRightRole.java
index 38d295c..b93d26e 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/ListLabelCellRenderForRightRole.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/ListLabelCellRenderForRightRole.java
@@ -7,7 +7,7 @@
import javax.swing.ListCellRenderer;
import com.vci.client.common.objects.UserObject;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
public class ListLabelCellRenderForRightRole extends JLabel implements ListCellRenderer {
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/MachSecurityDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/MachSecurityDialog.java
index 80d357d..76ea063 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/MachSecurityDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/MachSecurityDialog.java
@@ -15,10 +15,10 @@
import com.vci.client.ClientSession;
import com.vci.client.LogonApplication;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.framework.delegate.UserEntityClientDelegate;
import com.vci.client.framework.systemConfig.object.TransmitMethod;
import com.vci.client.logon.base.BaseJDialog;
-import com.vci.client.omd.enumManager.ui.EnumClient;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.KTextField;
import com.vci.client.ui.swing.VCIOptionPane;
@@ -167,7 +167,7 @@
private void initSecurityCombo() {
try {
securityCombo.setEditable(false);
- EnumItem item = EnumClient.getService().getEmItemByName(ENUM_SECURITYGRADE);
+ EnumItem item = ServiceProvider.getOMDService().getEnumService().getEmItemByName(ENUM_SECURITYGRADE);
securityEnum = item.children;
if (!ClientContextVariable.getIpSecretSwitch().equals("on")) {
securityCombo.addItem("");
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/MachSecurityPanel.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/MachSecurityPanel.java
index 9bbca44..2b0339b 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/MachSecurityPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/MachSecurityPanel.java
@@ -20,10 +20,10 @@
import com.vci.client.ClientSession;
import com.vci.client.LogonApplication;
import com.vci.client.common.VCIBasePanel;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.framework.delegate.UserEntityClientDelegate;
import com.vci.client.framework.rightConfig.object.FunctionObject;
import com.vci.client.framework.util.RightControlUtil;
-import com.vci.client.omd.enumManager.ui.EnumClient;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.VCIOptionPane;
import com.vci.client.ui.swing.VCISwingUtil;
@@ -97,7 +97,7 @@
private void initSecurityMap() {
try {
securityCombo.addItem("");
- EnumItem item = EnumClient.getService().getEmItemByName(ENUM_SECURITYGRADE);
+ EnumItem item = ServiceProvider.getOMDService().getEnumService().getEmItemByName(ENUM_SECURITYGRADE);
for (EnumChild child : item.children) {
securityCombo.addItem(child.name);
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/PasswordSrategyDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/PasswordSrategyDialog.java
index 97940c5..ea7c229 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/PasswordSrategyDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/PasswordSrategyDialog.java
@@ -20,7 +20,7 @@
import com.vci.client.LogonApplication;
import com.vci.client.framework.systemConfig.object.PasswordStrategyObject;
import com.vci.client.logon.base.BaseJDialog;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.KTextField;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/PasswordStrategySetingDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/PasswordStrategySetingDialog.java
index f29a1eb..6f396e4 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/PasswordStrategySetingDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/PasswordStrategySetingDialog.java
@@ -16,7 +16,7 @@
import com.vci.client.framework.systemConfig.object.PasswordStrategyObject;
import com.vci.client.logon.base.BaseJDialog;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RightManagementTreeCellRenderer.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RightManagementTreeCellRenderer.java
index 48937bc..020e55b 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RightManagementTreeCellRenderer.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RightManagementTreeCellRenderer.java
@@ -10,7 +10,7 @@
import com.vci.client.common.objects.RoleObject;
import com.vci.client.common.objects.UserObject;
import com.vci.client.framework.systemConfig.object.PasswordStrategyObject;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.tree.VCIBaseTreeNode;
import com.vci.client.workflow.template.object.TasksAssignedObject;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RightRoleDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RightRoleDialog.java
index b45634b..600d12b 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RightRoleDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RightRoleDialog.java
@@ -23,7 +23,7 @@
import com.vci.client.framework.delegate.RightManagementClientDelegate;
import com.vci.client.logon.base.BaseJDialog;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RoleDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RoleDialog.java
index 88bf8db..82979a2 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RoleDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RoleDialog.java
@@ -14,7 +14,7 @@
import com.vci.client.LogonApplication;
import com.vci.client.common.objects.RoleObject;
import com.vci.client.logon.base.BaseJDialog;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.KTextField;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RolesExcelImportDialogActionListener.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RolesExcelImportDialogActionListener.java
index ccb2936..4e6a492 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RolesExcelImportDialogActionListener.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RolesExcelImportDialogActionListener.java
@@ -17,8 +17,8 @@
import com.vci.client.common.objects.RoleObject;
import com.vci.client.common.objects.UserObject;
import com.vci.client.framework.delegate.RightManagementClientDelegate;
-import com.vci.client.ui.excel.ExcelDocumentUtils;
-import com.vci.client.ui.excel.SheetDataSet;
+import com.vci.client.utils.excel.ExcelDocumentUtils;
+import com.vci.client.utils.excel.SheetDataSet;
import com.vci.client.ui.exception.VCIException;
import com.vci.client.ui.process.QANProcessBar;
import com.vci.client.ui.process.QANProcessBarFrame;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RolingDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RolingDialog.java
index 186304a..9ecb0f1 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RolingDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/RolingDialog.java
@@ -25,7 +25,7 @@
import com.vci.client.logon.base.BaseJDialog;
import com.vci.client.logon.client.LogonFrame;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/UserDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/UserDialog.java
index 349a299..d8f14ce 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/UserDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/UserDialog.java
@@ -22,13 +22,13 @@
import com.vci.client.common.TransmitTreeObject;
import com.vci.client.common.objects.DeptObject;
import com.vci.client.common.objects.UserObject;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.framework.appConfig.object.AppConfigDetailObject;
import com.vci.client.framework.delegate.AppConfigDetailClientDelegate;
import com.vci.client.framework.delegate.RightManagementClientDelegate;
import com.vci.client.logon.base.BaseJDialog;
-import com.vci.client.omd.enumManager.ui.EnumClient;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.KPasswordField;
@@ -266,7 +266,7 @@
private void initSecurityCombo() {
try {
securityCombo.setEditable(false);
- EnumItem item = EnumClient.getService().getEmItemByName(ENUM_USERSECURITYENUM);
+ EnumItem item = ServiceProvider.getOMDService().getEnumService().getEmItemByName(ENUM_USERSECURITYENUM);
securityEnum = item.children;
if(!ClientContextVariable.getUserSecretSwith().equals("on")){
//modify by weidy@2021-06-16 瀵嗙骇鐨勯�夐」涓嶈兘鏈夌┖鐨�
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/UserTablePanel.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/UserTablePanel.java
index f834ff6..e7708d2 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/UserTablePanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/UserTablePanel.java
@@ -30,12 +30,12 @@
import com.vci.client.common.objects.UserEntityObject;
import com.vci.client.common.objects.UserLogonObject;
import com.vci.client.common.objects.UserObject;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.framework.delegate.RightManagementClientDelegate;
import com.vci.client.framework.rightConfig.object.FunctionObject;
import com.vci.client.framework.specialrole.ModuleInterface.IModuleShow;
import com.vci.client.framework.systemConfig.object.PasswordStrategyObject;
import com.vci.client.framework.util.RightControlUtil;
-import com.vci.client.omd.enumManager.ui.EnumClient;
import com.vci.client.ui.exception.VCIException;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KJButton;
@@ -286,7 +286,7 @@
node.setPropertyValue(getSpecialColumns()[10], dataObj.getIsDeptLeader().equals("1") ? "鏄�" : "鍚�");
String secretGrade = dataObj.getSecretGrade();
try {
- EnumItem item = EnumClient.getService().getEmItemByName(ENUM_USERSECURITYENUM);
+ EnumItem item = ServiceProvider.getOMDService().getEnumService().getEmItemByName(ENUM_USERSECURITYENUM);
EnumChild[] children = item.children;
String securityShowName = "";
for(EnumChild child: children){
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/UsersExcelImportDialogActionListener.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/UsersExcelImportDialogActionListener.java
index 5014d7b..4108375 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/UsersExcelImportDialogActionListener.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/stafforgmanage/UsersExcelImportDialogActionListener.java
@@ -7,7 +7,6 @@
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -26,15 +25,15 @@
import com.vci.client.common.ConfigUtils;
import com.vci.client.common.objects.DeptObject;
import com.vci.client.common.objects.UserObject;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.framework.delegate.RightManagementClientDelegate;
import com.vci.client.framework.systemConfig.object.TransmitMethod;
import com.vci.client.framework.util.RightControlUtil;
-import com.vci.client.omd.enumManager.ui.EnumClient;
-import com.vci.client.ui.excel.ExcelCellStyleSettingCallback;
-import com.vci.client.ui.excel.ExcelDocumentUtils;
-import com.vci.client.ui.excel.ExcelFileOperation;
-import com.vci.client.ui.excel.SheetDataSet;
-import com.vci.client.ui.excel.WorkboolStyleSetting;
+import com.vci.client.utils.excel.ExcelCellStyleSettingCallback;
+import com.vci.client.utils.excel.ExcelDocumentUtils;
+import com.vci.client.utils.excel.ExcelFileOperation;
+import com.vci.client.utils.excel.SheetDataSet;
+import com.vci.client.utils.excel.WorkboolStyleSetting;
import com.vci.client.ui.exception.VCIException;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.process.QANProcessBar;
@@ -293,7 +292,7 @@
return false;
}
try {
- EnumItem item = EnumClient.getService().getEmItemByName(ENUM_USERSECURITYENUM);
+ EnumItem item = ServiceProvider.getOMDService().getEnumService().getEmItemByName(ENUM_USERSECURITYENUM);
EnumChild[] children = item.children;
boolean isExist = true;
String flag = ConfigUtils.getConfigValue("exportSecretGrade");
diff --git a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/volumn/PvolumeUserDialog.java b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/volumn/PvolumeUserDialog.java
index 9f36295..b020df6 100644
--- a/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/volumn/PvolumeUserDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/framework/systemConfig/volumn/PvolumeUserDialog.java
@@ -24,7 +24,7 @@
import com.vci.client.framework.systemConfig.volumn.object.PvolumeObject;
import com.vci.client.logon.base.BaseJDialog;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
import com.vci.corba.common.VCIError;
diff --git a/Source/Client/PLTClient/src/com/vci/client/log/delegate/LogManagementClientDelegate.java b/Source/Client/PLTClient/src/com/vci/client/log/delegate/LogManagementClientDelegate.java
new file mode 100644
index 0000000..874379c
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/log/delegate/LogManagementClientDelegate.java
@@ -0,0 +1,227 @@
+package com.vci.client.log.delegate;
+
+import com.vci.client.common.objects.LogObject;
+import com.vci.client.common.objects.UserEntityObject;
+import com.vci.client.common.providers.ServiceProvider;
+import com.vci.client.framework.delegate.ClientBaseDelegate;
+import com.vci.client.framework.delegate.UserEntityClientDelegate;
+import com.vci.client.framework.systemConfig.log.SystemCfgObject;
+import com.vci.client.log.ui.LogPeriodObject;
+import com.vci.client.ui.exception.VCIException;
+import com.vci.corba.common.VCIError;
+import com.vci.corba.log.data.LogInfo;
+import com.vci.corba.log.data.LogPeriodInfo;
+
+
+/**
+ * 鏃ュ織绠$悊clientdelegate
+ * @author xiongfei
+ *
+ */
+public class LogManagementClientDelegate extends ClientBaseDelegate{
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public LogManagementClientDelegate(UserEntityObject userEntityObject) {
+ super(userEntityObject);
+ }
+
+ /**
+ * 鑾峰彇鏃ュ織鍒犻櫎閰嶇疆锛�
+ * @return true 鑷姩锛宖alse 鎵嬪姩
+ * @throws VCIError
+ */
+ public boolean getIsAutoDelete() throws VCIError {
+ boolean res = false;
+ res = ServiceProvider.getLogService().getIsAutoDelete();
+ return res;
+ }
+
+ /**
+ * 鑾峰彇鏃ュ織淇℃伅
+ * @return
+ * @throws VCIError
+ */
+ public LogObject[] fetchLogInfo(int pageNo,int pageSize,String sql) throws VCIException {
+ LogObject[] objs = null;
+ try {
+ LogInfo[] logInfos = ServiceProvider.getLogService().fetchLogInfo(pageNo, pageSize,sql);
+ objs = new LogObject[logInfos.length];
+ for(int i = 0;i < logInfos.length;i++){
+ objs[i] = this.changeLogInfoToLogObjcet(logInfos[i]);
+ }
+
+ }catch(VCIError e) {
+ this.convertVCIErrorToVCIException(e);
+ }
+ return objs;
+ }
+
+ /**
+ * 鑾峰彇鏃ュ織淇℃伅
+ * @return
+ * @throws VCIError
+ */
+ public LogObject[] getLogListByContion(int pageNo,int pageSize,String sql) throws VCIException {
+ LogObject[] objs = null;
+ try {
+ LogInfo[] logInfos = ServiceProvider.getLogService().getLogListByContion(pageNo,pageSize,sql);
+ objs = new LogObject[logInfos.length];
+ for(int i = 0;i < logInfos.length;i++){
+ objs[i] = this.changeLogInfoToLogObjcet(logInfos[i]);
+ }
+
+ }catch(VCIError e) {
+ this.convertVCIErrorToVCIException(e);
+ }
+ return objs;
+ }
+
+ /**
+ * 鍙栧緱鏃ュ織鏉℃暟
+ * @return
+ * @throws VCIError
+ */
+ public long getSumLogRows(String sql) throws VCIException {
+ long sumCount = 0;
+ try {
+ sumCount = ServiceProvider.getLogService().getSumLogRows(sql);
+ }catch(VCIError e) {
+ this.convertVCIErrorToVCIException(e);
+ }
+ return sumCount;
+ }
+
+ /**
+ * 鑾峰彇淇濆瓨鏈熼檺涓嬫媺妗嗙殑鍊�
+ * @return
+ * @throws VCIError
+ */
+ public LogPeriodObject[] getPeriods() throws VCIException {
+ LogPeriodObject[] objs = null;
+ try{
+ LogPeriodInfo[] infos = null;
+ infos = ServiceProvider.getLogService().getPeriods();
+ objs = new LogPeriodObject[infos.length];
+ for(int i=0;i<infos.length;i++) {
+ objs[i] = changePeriodInfoToObj(infos[i]);
+ }
+
+ }catch(VCIError e) {
+ this.convertVCIErrorToVCIException(e);
+ }
+ return objs;
+ }
+
+ /**
+ * 鑾峰彇鏃ュ織鏌ヨ椤甸潰鏄剧ず鏉℃暟
+ * @return 椤甸潰鏄剧ず鏉℃暟
+ * @throws VCIError
+ */
+ public int getPageSize() throws VCIException {
+ try {
+ return (int)ServiceProvider.getLogService().getPageSize();
+ }catch(VCIError e) {
+ this.convertVCIErrorToVCIException(e);
+ }
+ return 0;
+ }
+
+ /**
+ * 鑾峰彇褰撳墠鏈熼檺璁剧疆
+ * @param type 鍒ゆ柇鏄繚瀛樿繕鏄浠芥湡闄�
+ * @return
+ * @throws VCIError
+ */
+ public int getCurPeriod(String type) throws VCIException {
+ try {
+ return ServiceProvider.getLogService().getCurPeriod();
+ }catch(VCIError e) {
+ this.convertVCIErrorToVCIException(e);
+ }
+ return 0;
+ }
+
+ /**
+ * 淇濆瓨鏈熼檺璁剧疆
+ * @param systemCfgObject
+ * @param userEntityObject
+ * @return
+ * @throws VCIError
+ */
+ public boolean savePeriod(String period) throws VCIException {
+ try {
+ return ServiceProvider.getLogService().savePeriod(period, UserEntityClientDelegate.changeUserEntityToInfo(userEntityObject));
+ //return ClientSession.getFrameworkService().savePeriod(new SystemCfgClientDelegate().changeSystemCfgObjectToSystemCfgInfo(systemCfgObject), UserEntityClientDelegate.changeUserEntityToInfo(userEntityObject));
+ }catch(VCIError e) {
+ this.convertVCIErrorToVCIException(e);
+ }
+ return false;
+ }
+
+ /**
+ * 淇濆瓨澶囦唤鏈熼檺璁剧疆
+ * @param systemCfgObject
+ * @param userEntityObject
+ * @return
+ * @throws VCIError
+ */
+ public boolean saveBackupPeriod(SystemCfgObject systemCfgObject) throws VCIException {
+ try {
+ return ServiceProvider.getLogService().savePeriod(systemCfgObject.getValue(), UserEntityClientDelegate.changeUserEntityToInfo(userEntityObject));
+ //return ClientSession.getFrameworkService().savePeriod(new SystemCfgClientDelegate().changeSystemCfgObjectToSystemCfgInfo(systemCfgObject), UserEntityClientDelegate.changeUserEntityToInfo(userEntityObject));
+ } catch(VCIError e) {
+ this.convertVCIErrorToVCIException(e);
+ }
+ return false;
+ }
+
+ public boolean deleteLog(String deleteDate) throws VCIException {
+ try {
+ return ServiceProvider.getLogService().deleteLog(deleteDate);
+ //return ClientSession.getFrameworkService().deleteLog(deleteDate);
+ }catch(VCIError e) {
+ this.convertVCIErrorToVCIException(e);
+ }
+ return false;
+ }
+
+
+ /**
+ * period瀵硅薄鐨勮浆鎹�
+ * CORBA绔璞¤浆鎴愬鎴风瀵硅薄
+ */
+ private LogPeriodObject changePeriodInfoToObj(LogPeriodInfo info) {
+ LogPeriodObject obj = new LogPeriodObject();
+ obj.setCode(info.code);
+ obj.setValue(info.value);
+ return obj;
+ }
+
+ /**
+ * Log瀵硅薄鐨勮浆鎹�
+ * CORBA绔璞¤浆鎴愬鎴风瀵硅薄
+ * @param info
+ * @return
+ */
+ private LogObject changeLogInfoToLogObjcet(LogInfo info) {
+ LogObject obj = new LogObject();
+ obj.setDate(info.date);
+ obj.setPuid(info.puid);
+ obj.setUsername(info.username);
+ obj.setTruename(info.truename);
+ obj.setUserIp(info.userIp);
+ obj.setType(info.type);
+ obj.setEntityDesc(info.entityDesc);
+ obj.setProperty(info.property);
+ obj.setPreviousVal(info.previousVal);
+ obj.setNewVal(info.newVal);
+ obj.setResult(info.result);
+ obj.setModule(info.moduleName);
+ return obj;
+ }
+
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/log/ui/DetailDialog.java b/Source/Client/PLTClient/src/com/vci/client/log/ui/DetailDialog.java
new file mode 100644
index 0000000..df4565f
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/log/ui/DetailDialog.java
@@ -0,0 +1,88 @@
+
+package com.vci.client.log.ui;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+
+import com.vci.client.LogonApplication;
+import com.vci.client.logon.base.BaseJDialog;
+import com.vci.client.ui.image.BundleImage;
+import com.vci.client.ui.swing.VCISwingUtil;
+import com.vci.client.ui.swing.components.VCIJButton;
+import com.vci.client.ui.swing.components.VCIJLabel;
+import com.vci.client.ui.swing.components.VCIJPanel;
+import com.vci.client.ui.swing.components.VCIJTextArea;
+
+public class DetailDialog extends BaseJDialog{
+
+ private static final long serialVersionUID = 1L;
+ private String content;
+
+ VCIJTextArea descriptionArea = new VCIJTextArea();
+// private KJButton cancelButton = new KJButton(LocaleDisplay.getI18nString("rmip.framework.button.cancel", "RMIPFramework", getLocale()) , "cancel.gif");
+ private VCIJButton cancelButton = new VCIJButton("鍏抽棴", VCISwingUtil.createImageIcon("cancel.gif"));
+ public DetailDialog(String content){
+ super(LogonApplication.frame, true);
+ this.content = content;
+ init();
+ }
+ public void init (){
+ VCIJLabel titleLabel = new VCIJLabel();
+ titleLabel.setText("鏃ュ織璇︾粏鎻忚堪淇℃伅");
+ setTitle(titleLabel.getText());
+ titleLabel.setIcon(new BundleImage().createImageIcon ("star.png"));
+
+ JPanel bottomPanel = new JPanel();
+ bottomPanel.add(cancelButton);
+
+ JPanel contentPanel = initCenterContentPanel();
+
+ JPanel midPanel = new JPanel();
+ midPanel.setLayout(new BorderLayout());
+ midPanel.add(contentPanel, BorderLayout.CENTER);
+
+ this.setLayout(new BorderLayout());
+ this.add(titleLabel, BorderLayout.NORTH);
+ this.add(midPanel, BorderLayout.CENTER);
+ this.add(bottomPanel, BorderLayout.SOUTH);
+
+// int x = (int)(this.getParent().getLocationOnScreen().getX()) +500;
+// int y = (int)(this.getParent().getLocationOnScreen().getY()) +200;
+// this.setLocation(x , y);
+// this.setSize(500, 500);
+ initDialogSize(400, 400);
+ this.setVisible(true);
+ }
+ private JPanel initCenterContentPanel() {
+ VCIJPanel contentPanel = new VCIJPanel();
+ contentPanel.setLayout(new BorderLayout());
+ JScrollPane jsDescription=new JScrollPane();
+ contentPanel.add(jsDescription);
+ descriptionArea.setLineWrap(true);
+ descriptionArea.setBorder(null);
+ jsDescription.getViewport().add(descriptionArea);
+ cancelButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ cancelButton_ActionPerformed(e);
+ }
+ });
+ initContent();
+ return contentPanel;
+ }
+ private void initContent(){
+ descriptionArea.setText(content);
+ }
+ /**
+ * 鍙栨秷鎸夐挳浜嬩欢
+ * @param e
+ */
+ private void cancelButton_ActionPerformed(ActionEvent e) {
+ this.dispose();
+ }
+
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/log/ui/LogAuthorizeMainPanel.java b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogAuthorizeMainPanel.java
new file mode 100644
index 0000000..a2c2c20
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogAuthorizeMainPanel.java
@@ -0,0 +1,34 @@
+package com.vci.client.log.ui;
+
+import com.vci.client.framework.rightConfig.object.FunctionObject;
+import com.vci.corba.log.data.LogType;
+
+/**
+ * 鎺堟潈鏃ュ織鏌ヨ
+ * <p>Title: </p>
+ * <p>Description: </p>
+ * <p>Copyright: Copyright (c) 2016</p>
+ * <p>Company: VCI</p>
+ * @author xiongchao
+ * @time 2016-12-12
+ * @version 1.0
+ */
+public class LogAuthorizeMainPanel extends LogQueryBaseMainPanel {
+
+ private static final long serialVersionUID = -2067147674546592962L;
+
+ public LogAuthorizeMainPanel(FunctionObject funcObj) {
+ super(funcObj);
+ }
+
+ @Override
+ public LogType getLogType() {
+ return LogType.Grant;
+ }
+
+ @Override
+ public boolean isManagerQuery() {
+ return false;
+ }
+
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/log/ui/LogAuthorizeManagerMainPanel.java b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogAuthorizeManagerMainPanel.java
new file mode 100644
index 0000000..006f412
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogAuthorizeManagerMainPanel.java
@@ -0,0 +1,40 @@
+
+package com.vci.client.log.ui;
+
+import com.vci.client.framework.rightConfig.object.FunctionObject;
+import com.vci.corba.log.data.LogType;
+
+
+/**
+ * 绠$悊鍛� 鎺堟潈鏃ュ織鏌ヨ
+ *
+ * <p>Title: </p>
+ * <p>Description: </p>
+ * <p>Copyright: Copyright (c) 2016</p>
+ * <p>Company: VCI</p>
+ * @author xiongchao
+ * @time 2016-12-12
+ * @version 1.0
+ */
+public class LogAuthorizeManagerMainPanel extends LogQueryBaseMainPanel {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 3826233878733669088L;
+
+ public LogAuthorizeManagerMainPanel(FunctionObject funcObj) {
+ super(funcObj);
+ }
+
+ @Override
+ public LogType getLogType() {
+ return LogType.Grant;
+ }
+
+ @Override
+ public boolean isManagerQuery() {
+ return true;
+ }
+
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/log/ui/LogBasicConfPanel.java b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogBasicConfPanel.java
new file mode 100644
index 0000000..57904fe
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogBasicConfPanel.java
@@ -0,0 +1,332 @@
+package com.vci.client.log.ui;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JTextField;
+
+import com.vci.client.LogonApplication;
+import com.vci.client.common.VCIBasePanel;
+import com.vci.client.framework.rightConfig.object.FunctionObject;
+import com.vci.client.framework.systemConfig.log.SystemCfgObject;
+import com.vci.client.framework.util.ClientHelper;
+import com.vci.client.log.delegate.LogManagementClientDelegate;
+import com.vci.client.oq.QTClient;
+import com.vci.client.ui.exception.VCIException;
+import com.vci.client.ui.image.BundleImage;
+import com.vci.client.ui.swing.KJButton;
+import com.vci.client.ui.swing.VCIOptionPane;
+import com.vci.client.ui.swing.components.VCIJCalendarPanel;
+import com.vci.client.ui.swing.components.VCIJLabel;
+import com.vci.corba.common.VCIError;
+
+public class LogBasicConfPanel extends VCIBasePanel {
+ private static final long serialVersionUID = 1L;
+
+ private JLabel deleteLbl = new JLabel(getI18nString("logDelete"));
+ private JRadioButton autoRadio = new JRadioButton(getI18nString("autoDelete"));
+ private JRadioButton manualRadio = new JRadioButton(getI18nString("manualDelete"));
+ private ButtonGroup btnGroup = new ButtonGroup();
+
+ //鏃ュ織淇濆瓨
+ private JLabel periodLabel = new JLabel(getI18nString("savePeriod"));
+ private JComboBox periodComboBox = new JComboBox();//淇濆瓨鏈熼檺涓嬫媺妗�
+ private Map<String,String> periodMap = new HashMap<String,String>();
+ private Map<String,String> periodValueMap = new HashMap<String,String>();
+ private final String LOG_SAVE_PERIOD = "logSavePeriod";//鏃ュ織淇濆瓨鏈熼檺
+ private KJButton savePeriodButton = new KJButton(getI18nString("saveBtn"),"save.png");
+
+ //鏃ュ織鍒犻櫎
+ private JLabel deleteLabel = new JLabel(getI18nString("selectDate"));
+ private VCIJCalendarPanel calDelDate = new VCIJCalendarPanel(true, true, true, false);
+ private KJButton deleteLogButton = new KJButton(getI18nString("delete"),"delete.gif");
+
+ private LogManagementClientDelegate logDel = new LogManagementClientDelegate(LogonApplication.getUserEntityObject());;
+
+ public LogBasicConfPanel(FunctionObject funcObj){
+ super(funcObj);
+ init();
+ initAction();
+ }
+
+ private void initAction() {
+ /**鑷姩鍒犻櫎**/
+ autoRadio.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+ autoDeleteActionPerformed();
+ }
+ });
+
+ /***鎵嬪姩鍒犻櫎**/
+ manualRadio.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+ manualDeleteActionPerformed();
+ }
+ });
+
+ /***淇濆瓨鏃ュ織**/
+ savePeriodButton.addActionListener(new ActionListener(){//淇濆瓨鏃ュ織淇濆瓨鏈熼檺
+ public void actionPerformed(ActionEvent e){
+ savePeriod_actionPerfermed(e);
+ }
+ });
+
+ /***鍒犻櫎鏃ュ織**/
+ deleteLogButton.addActionListener(new ActionListener() {//鍒犻櫎鏃ュ織
+ public void actionPerformed(ActionEvent e) {
+ deleteLog_actionPerfermed(e);
+ }
+ });
+ }
+
+ /**
+ * 鍒濆鍖栫晫闈�
+ */
+ JPanel contentPanel = new JPanel(new BorderLayout());
+ JPanel logPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
+ private void init() {
+ initSavePeroidCombox();
+ JLabel titleLabel = new JLabel();
+ titleLabel.setText(getI18nString("logBasicConf"));
+ titleLabel.setIcon(new BundleImage().createImageIcon ("door.png"));
+ JPanel bottomPanel = new JPanel();
+
+ contentPanel = initCenterContentPanel();
+
+ VCIJLabel lblNote = new VCIJLabel("" +
+ "<html>" +
+ "<p style='color:red'>鏃ュ織鍩虹閰嶇疆璇存槑锛�</p>" +
+ "<p style='color:blue;'> " + "1锛氭棩蹇楀垹闄ゅ寘鍚墜鍔ㄥ垹闄ゅ拰鑷姩鍒犻櫎</p>" +
+ "<p style='color:blue;'> " + "2锛氳嚜鍔ㄥ垹闄や細鏍规嵁鏃ュ織鐨勪繚瀛樻湡闄愭潵杩涜鏃ュ織鍒犻櫎</p>" +
+ "<p style='color:blue;'> " + "3锛氭墜鍔ㄥ垹闄ゆ牴鎹�夊畾鐨勬椂闂存潵杩涜鏃ュ織鍒犻櫎</p>" +
+ "<p> </p>" +
+ "<br/>" +
+ "</html>");
+ contentPanel.add(lblNote,BorderLayout.SOUTH);
+
+
+ JPanel midPanel = new JPanel();
+ midPanel.setLayout(new BorderLayout());
+ JTextField jTextField1 = new JTextField();
+ JTextField jTextField2 = new JTextField();
+ jTextField1.setPreferredSize(new Dimension(63,2));
+ jTextField2.setPreferredSize(new Dimension(63,2));
+ midPanel.add(jTextField1, BorderLayout.NORTH);
+ midPanel.add(jTextField2, BorderLayout.SOUTH);
+ midPanel.add(contentPanel, BorderLayout.CENTER);
+
+ this.setLayout(new BorderLayout());
+ this.add(titleLabel, BorderLayout.NORTH);
+ this.add(midPanel, BorderLayout.CENTER);
+ this.add(bottomPanel, BorderLayout.SOUTH);
+
+ }
+
+ /**
+ * 鍒濆鍖栨棩鏈熶繚瀛樻湡闄愪笅鎷夊垪琛ㄦ
+ * <p>Description: </p>
+ *
+ * @author Administrator
+ * @time 2012-12-29
+ */
+ private void initSavePeroidCombox() {
+ try {
+ LogPeriodObject[] periods = logDel.getPeriods();
+ for(int i = 0;i<periods.length;i++){
+ this.periodComboBox.addItem(periods[i].getValue());
+ this.periodMap.put(periods[i].getCode(), periods[i].getValue());
+ this.periodValueMap.put(periods[i].getValue(), periods[i].getCode());
+ }
+ int curSavePeriod = this.getPeriod(LOG_SAVE_PERIOD);
+ this.periodComboBox.setSelectedItem(this.periodMap.get(String.valueOf(curSavePeriod)));
+ } catch (VCIException e) {
+ VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e);
+ }
+ }
+
+ /**
+ * 鑾峰彇鏃ュ織淇濆瓨鏈熼檺
+ * @param type 绫诲瀷锛屽垽鏂槸淇濆瓨杩樻槸澶囦唤鏈熼檺
+ * @return
+ */
+ private int getPeriod(String type){
+ int curPeriod = 0;
+ try {
+ curPeriod = this.logDel.getCurPeriod(type);
+ } catch (VCIException e) {
+ VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e);
+ curPeriod = 0;
+ }
+ return curPeriod;
+ }
+
+
+ private JPanel initCenterContentPanel() {
+ JPanel contentPanel = new JPanel(new BorderLayout());
+ JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER));
+ panel.add(deleteLbl);
+ panel.add(autoRadio);
+ panel.add(manualRadio);
+ btnGroup.add(autoRadio);
+ btnGroup.add(manualRadio);
+ autoRadio.setSelected(true);
+
+ logPanel.add(periodLabel);
+ logPanel.add(periodComboBox);
+ logPanel.add(savePeriodButton);
+ contentPanel.add(logPanel,BorderLayout.CENTER);
+ contentPanel.add(panel,BorderLayout.NORTH);
+ return contentPanel;
+
+ }
+
+ /***鍒濆鍖栬嚜鍔ㄥ垹闄ょ晫闈�**/
+ private void autoDeleteActionPerformed() {
+ logPanel.removeAll();
+ logPanel.add(periodLabel);
+ logPanel.add(periodComboBox);
+ logPanel.add(savePeriodButton);
+ contentPanel.add(logPanel,BorderLayout.CENTER);
+ this.updateUI();
+ }
+
+ /***鍒濆鍖栨墜鍔ㄥ垹闄ょ晫闈�**/
+ private void manualDeleteActionPerformed() {
+ logPanel.removeAll();
+ logPanel.add(deleteLabel);
+ logPanel.add(calDelDate);
+ logPanel.add(deleteLogButton);
+
+ contentPanel.add(logPanel,BorderLayout.CENTER);
+ this.updateUI();
+ }
+
+ /**
+ * 鍒犻櫎鏃ュ織
+ * @param e
+ */
+ protected void deleteLog_actionPerfermed(ActionEvent e) {
+ String deleteDate = (String)this.calDelDate.getDateString();
+ if(deleteDate == null || "".equals(deleteDate)){
+ VCIOptionPane.showMessageDialog(LogonApplication.frame, "璇峰厛閫夋嫨鏃ユ湡锛�");
+ return;
+ }
+ int monthSpan = 1;
+ String monthLabel = "";
+ int curSavePeriod = this.getPeriod(LOG_SAVE_PERIOD);
+ if(curSavePeriod <= 0){
+ // 鏈厤缃椂锛屽彧鑳藉垹闄�
+ monthLabel = (String) this.periodComboBox.getModel().getElementAt(0);
+ monthSpan = Integer.valueOf(this.periodValueMap.get(monthLabel));
+ } else {
+ monthSpan = curSavePeriod;
+ monthLabel = this.periodMap.get(String.valueOf(monthSpan));
+ }
+
+ if(!checkCanDelete(deleteDate, monthSpan, monthLabel)){
+ return;
+ }
+
+ boolean res = false;
+ if(deleteDate==null||deleteDate.trim().equals("")){
+ VCIOptionPane.showMessageDialog(LogonApplication.frame, getI18nString("deleteDateAlert"));
+ return;
+ }
+ int ok = VCIOptionPane.showQuestion(LogonApplication.frame, getI18nString("deleteLogConfirm"));
+ if(ok != 0){
+ return ;
+ }
+ try {
+ res = this.logDel.deleteLog(getDeleteDateString(deleteDate));//鍒犻櫎鏃ュ織
+ } catch (VCIException e1) {
+ VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e1);
+ }
+ if(res){
+ VCIOptionPane.showMessage(LogonApplication.frame, getI18nString("deleteSuccess"));
+ }
+ }
+
+ protected String getDeleteDateString(String deleteDate){
+ int s = Integer.parseInt(deleteDate.substring(8))+1;
+ StringBuffer buff = new StringBuffer();
+ buff.append(deleteDate.substring(0, 8));
+ if(("0"+s).length()>2){
+ buff.append(s+"");
+ }else{
+ buff.append("0"+s);
+ }
+ return buff.toString();
+ }
+
+ private boolean checkCanDelete(String deleteDate, int monthSpan, String monthLabel){
+ boolean res = false;
+ try {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+ sdf.parse(deleteDate);
+ } catch (ParseException e1) {
+ VCIOptionPane.showError(LogonApplication.frame, "灏�" + deleteDate + "杞崲鏃ユ湡鏃跺彂鐢熼敊璇紒");
+ return false;
+ }
+
+ String sql = "SELECT FLOOR(MONTHS_BETWEEN(SYSDATE, to_date('" + deleteDate + "','yyyy-mm-dd'))) from dual";
+ String[][] vals;
+ try {
+ vals = QTClient.getService().queryBySqlWithoutKey(sql);
+ if(vals != null && vals.length > 0 && vals[0].length > 0){
+ int spval = Integer.valueOf(vals[0][0]);
+ if(spval <= monthSpan){
+ VCIOptionPane.showError(LogonApplication.frame, "鍙兘鍒犻櫎 " + monthLabel + " 涔嬪墠鐨勬暟鎹紒");
+ return false;
+ }
+ }
+ } catch (VCIError e) {
+ e.printStackTrace();
+ VCIOptionPane.showError(LogonApplication.frame, "璁$畻鏄惁鍙互鍒犻櫎鎸囧畾鏃ユ湡涔嬪墠鐨勬暟鎹椂鍙戠敓閿欒锛�");
+ return false;
+ }
+ res = true;
+ return res;
+ }
+
+ /**
+ * 淇濆瓨鏃ュ織淇濆瓨鏈熼檺
+ * @param e
+ */
+ private void savePeriod_actionPerfermed(ActionEvent e){
+// SystemCfgObject systemCfgObject = new SystemCfgObject();
+ boolean flag = false;
+ try {
+ String selectedPeriod = (String) this.periodComboBox.getSelectedItem();
+ if(selectedPeriod == null){
+ VCIOptionPane.showMessage(LogonApplication.frame, getI18nString("savePeriodAlert"));
+ return;
+ }
+// systemCfgObject.setName(LOG_SAVE_PERIOD);
+// systemCfgObject.setValue(this.periodValueMap.get(selectedPeriod));//閫氳繃鍚嶇О鍙朿ode鍊煎瓨鍏ュ埌鏁版嵁搴�
+ flag = this.logDel.savePeriod(this.periodValueMap.get(selectedPeriod));
+ } catch (VCIException e1) {
+ VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e1);
+ }
+ if(flag){
+ VCIOptionPane.showMessage(LogonApplication.frame,getI18nString("saveSuccess"));
+ }
+ }
+
+ private String getI18nString(String spCode){
+ return ClientHelper.getI18nStringForFramework("com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel" + "." + spCode, this.getLocale());
+ }
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/log/ui/LogInfoMainPanel.java b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogInfoMainPanel.java
new file mode 100644
index 0000000..05c7d5c
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogInfoMainPanel.java
@@ -0,0 +1,39 @@
+package com.vci.client.log.ui;
+
+import com.vci.client.framework.rightConfig.object.FunctionObject;
+import com.vci.corba.log.data.LogType;
+
+
+/**
+ * 鐧诲綍鏃ュ織鏌ヨ
+ *
+ * <p>Title: </p>
+ * <p>Description: </p>
+ * <p>Copyright: Copyright (c) 2016</p>
+ * <p>Company: VCI</p>
+ * @author xiongchao
+ * @time 2016-12-12
+ * @version 1.0
+ */
+public class LogInfoMainPanel extends LogQueryBaseMainPanel {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 43415318338488222L;
+
+ public LogInfoMainPanel(FunctionObject funcObj) {
+ super(funcObj);
+ }
+
+ @Override
+ public LogType getLogType() {
+ return LogType.Login;
+ }
+
+ @Override
+ public boolean isManagerQuery() {
+ return false;
+ }
+
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/log/ui/LogInfoManagerMainPanel.java b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogInfoManagerMainPanel.java
new file mode 100644
index 0000000..d3642a2
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogInfoManagerMainPanel.java
@@ -0,0 +1,40 @@
+
+package com.vci.client.log.ui;
+
+import com.vci.client.framework.rightConfig.object.FunctionObject;
+import com.vci.corba.log.data.LogType;
+
+
+/**
+ *
+ * 绠$悊鍛� 鐧诲綍鏃ュ織鏌ヨ
+ * <p>Title: </p>
+ * <p>Description: </p>
+ * <p>Copyright: Copyright (c) 2016</p>
+ * <p>Company: VCI</p>
+ * @author xiongchao
+ * @time 2016-12-12
+ * @version 1.0
+ */
+public class LogInfoManagerMainPanel extends LogQueryBaseMainPanel {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -864335690643261962L;
+
+ public LogInfoManagerMainPanel(FunctionObject funcObj) {
+ super(funcObj);
+ }
+
+ @Override
+ public LogType getLogType() {
+ return LogType.Login;
+ }
+
+ @Override
+ public boolean isManagerQuery() {
+ return true;
+ }
+
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/log/ui/LogManagementPanel.java b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogManagementPanel.java
new file mode 100644
index 0000000..9cdfdea
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogManagementPanel.java
@@ -0,0 +1,714 @@
+package com.vci.client.log.ui;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.GridBagConstraints;
+import java.awt.GridLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.border.TitledBorder;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.vci.corba.common.VCIError;
+import com.vci.corba.log.data.LogType;
+import com.vci.mw.ClientContextVariable;
+import com.vci.client.LogonApplication;
+import com.vci.client.common.VCIBasePanel;
+import com.vci.client.common.objects.LogObject;
+import com.vci.client.common.objects.RoleObject;
+import com.vci.client.common.objects.UserObject;
+import com.vci.client.framework.delegate.RightManagementClientDelegate;
+import com.vci.client.framework.util.JAutoCompleteComboBox;
+import com.vci.client.log.delegate.LogManagementClientDelegate;
+import com.vci.client.oq.QTClient;
+import com.vci.client.ui.date.PopupCalendarMethod;
+import com.vci.client.ui.exception.VCIException;
+import com.vci.client.ui.locale.LocaleDisplay;
+import com.vci.client.ui.swing.VCIOptionPane;
+import com.vci.client.ui.swing.VCISwingUtil;
+import com.vci.client.ui.swing.components.VCIJButton;
+import com.vci.client.ui.swing.components.VCIJComboBox;
+import com.vci.client.ui.swing.components.VCIJPanel;
+import com.vci.client.ui.swing.components.table.AbstractVCIJTableDataProvider;
+import com.vci.client.ui.swing.components.table.VCIJTableNode;
+import com.vci.client.ui.swing.components.table.VCIJTablePanel;
+
+/**
+ *
+ * @author xiongfei
+ * 鏃ュ織绠$悊
+ * 鍒涘缓鏃堕棿锛�2011-06-13
+ */
+public class LogManagementPanel extends VCIJPanel {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -5588255327255334689L;
+
+ //鑾峰彇寮傚父淇℃伅鍙婂浗闄呭寲淇℃伅鐨勬枃浠跺悕
+ private String FILENAME = "RMIPFramework";
+ //鏌ヨ鏃ユ湡锛氱敱
+ private String DATE_START = LocaleDisplay.getI18nString("rmip.framework.log.startDate", "RMIPFramework", getLocale());
+ //鍒�
+ private String TO = LocaleDisplay.getI18nString("rmip.framework.log.to", "RMIPFramework", getLocale());
+ //鍒涘缓
+ private String CREATE = LocaleDisplay.getI18nString("rmip.framework.log.create", "RMIPFramework", getLocale());
+ //淇敼
+ private String UPDATE = LocaleDisplay.getI18nString("rmip.framework.log.update", "RMIPFramework", getLocale());
+ //鍒犻櫎
+ private String DELETE = LocaleDisplay.getI18nString("rmip.framework.log.delete", "RMIPFramework", getLocale());
+ //鎿嶄綔鐢ㄦ埛锛�
+ private String OPERATEUSER = LocaleDisplay.getI18nString("rmip.framework.log.operateUser", "RMIPFramework", getLocale());
+ //鏌ヨ
+ private String QUERY = LocaleDisplay.getI18nString("rmip.framework.log.query", "RMIPFramework", getLocale());
+ //瀵煎嚭
+ private String EXPORT = LocaleDisplay.getI18nString("rmip.framework.log.export", "RMIPFramework", getLocale());
+ //鏃ュ織绠$悊
+ private String LOGMANAGE = LocaleDisplay.getI18nString("rmip.framework.logManagementModel", "RMIPFramework", getLocale());
+
+ /**
+ * 鎿嶄綔绫诲瀷
+ */
+ private String OPERATE_TYPE = LocaleDisplay.getI18nString("rmip.framework.log.operateType", "RMIPFramework", getLocale());
+
+ private JLabel dateLabelStart = new JLabel(DATE_START);
+ private JLabel dateLabelTo = new JLabel(TO);
+ protected VCIJComboBox startDateBox = new VCIJComboBox();
+ protected VCIJComboBox endDateBox = new VCIJComboBox();
+ private JButton startDateButton = new PopupCalendarMethod().createDateDialogButton("date.gif",startDateBox);
+ private JButton endDateButton = new PopupCalendarMethod().createDateDialogButton("date.gif",endDateBox);
+ private JCheckBox create = new JCheckBox(CREATE);
+ private JCheckBox modify = new JCheckBox(UPDATE);
+ private JCheckBox delete = new JCheckBox(DELETE);
+ private JLabel userLabel = new JLabel(OPERATEUSER);
+
+ protected JAutoCompleteComboBox userCombox = new JAutoCompleteComboBox();
+ //added by xf 澧炲姞鎸夌敤鎴稩P鏌ヨ鏃ュ織 锛屾敮鎸佹ā绯婃煡璇�
+ private JLabel ipLabel = new JLabel("鐢ㄦ埛IP锛�");
+ protected JTextField ipText = new JTextField();
+ private JLabel operateTypeLabel = new JLabel(OPERATE_TYPE);
+ protected JTextField typeText = new JTextField();
+
+ private LogManagementPanelActionListener logActionListener = new LogManagementPanelActionListener(this);
+ private VCIJButton queryBtn = VCISwingUtil.createVCIJButton("query",QUERY,QUERY,"search.png",logActionListener);
+ private VCIJButton exportBtn = VCISwingUtil.createVCIJButton("export",EXPORT,EXPORT,"export.gif",logActionListener);
+ VCIJButton queryDetail = new VCIJButton("鏌ョ湅璇︾粏淇℃伅", VCISwingUtil.createImageIcon("search.png"));
+ private String querySql = "";
+ LogManagementClientDelegate logDel = new LogManagementClientDelegate(LogonApplication.getUserEntityObject());
+ protected final String LOG_SAVE_PERIOD = "logSavePeriod";//鏃ュ織淇濆瓨鏈熼檺
+
+ // 鎺т欢鐨勫潗鏍囦綅缃彉閲�
+ private int x = 10;
+ private int y = 20;
+ private int width = 50;
+ private int height = 25;
+ /**
+ * 涓ゆ帶浠堕棿鍨傜洿闂撮殧
+ */
+ private int vspan = 5;
+ /**
+ * 涓ゆ帶浠堕棿姘村钩闂撮殧
+ */
+ private int hspan = 5;
+
+ private VCIBasePanel vciBasePanel = null;
+ private LinkedList<VCIJButton> selfCustomButtons = new LinkedList<VCIJButton>();
+ {
+ selfCustomButtons.add(exportBtn);
+ selfCustomButtons.add(queryDetail);
+ }
+
+ private LogType logType = null;
+ private boolean isManagerQuery = false;
+ public LogType getLogType() {
+ return logType;
+ }
+ public void setLogType(LogType logType) {
+ this.logType = logType;
+ }
+ public boolean isManagerQuery() {
+ return isManagerQuery;
+ }
+ public void setManagerQuery(boolean isManagerQuery) {
+ this.isManagerQuery = isManagerQuery;
+ }
+
+ public LogManagementPanel(VCIBasePanel vciBasePanel, LogType logType, boolean isManagerQuery){
+ this.vciBasePanel = vciBasePanel;
+ this.logType = logType;
+ this.isManagerQuery = isManagerQuery;
+ init();
+ }
+
+ class MyDataProvider extends AbstractVCIJTableDataProvider<LogObject>{
+ @Override
+ public LogObject[] getDatas(int pageCount, int pageSize) {
+ LogObject[] logInfos = new LogObject[0];
+ try {
+ querySql = getSQL();
+ logInfos = logDel.getLogListByContion(pageCount,pageSize,querySql);
+
+ } catch (VCIException e) {
+ VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e);
+ return null;
+ }
+ return logInfos;
+ }
+ @Override
+ public VCIJTableNode<LogObject> getNewRowNode(LogObject dataObj) {
+ VCIJTableNode<LogObject> node = new VCIJTableNode<LogObject>(dataObj);
+ node.setPropertyValue(getSpecialColumns()[0], dataObj.getUsername());
+ node.setPropertyValue(getSpecialColumns()[1], dataObj.getTruename());
+ node.setPropertyValue(getSpecialColumns()[2], dataObj.getUserIp());
+ node.setPropertyValue(getSpecialColumns()[3], dataObj.getModule());
+ node.setPropertyValue(getSpecialColumns()[4], dataObj.getType());
+ node.setPropertyValue(getSpecialColumns()[5], dataObj.getDate());
+ String result = "鎿嶄綔鎴愬姛";
+ String memo = dataObj.getResult();
+ if(StringUtils.isNotBlank(memo)){
+ boolean hasResult =false;
+ if(memo.startsWith("鎿嶄綔") && memo.length()>4){
+ result = memo.substring(0,4);
+ hasResult = true;
+ }
+ if((memo.startsWith("鐧诲叆") || memo.startsWith("鐧诲嚭"))&& memo.length()>4){
+ result = memo.substring(0,4);
+ hasResult = true;
+ }
+ if(memo.length()>5 && hasResult){
+ memo = memo.substring(5);
+ }else{
+ //memo = "";
+ }
+ }
+ node.setPropertyValue(getSpecialColumns()[6], result);
+ node.setPropertyValue(getSpecialColumns()[7], memo);
+ return node;
+ }
+
+ @Override
+ public String[] getSpecialColumns() {
+ return "鐢ㄦ埛鍚�,濮撳悕, 鐢ㄦ埛ip,妯″潡,鎿嶄綔,鏃堕棿,鎿嶄綔缁撴灉, 鎻忚堪".split(",");
+ }
+ @Override
+ public int getTotal() {
+ querySql = getSQL();
+ try {
+ total = (int) logDel.getSumLogRows(querySql);
+ } catch (VCIException e) {
+ e.printStackTrace();
+ VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e);
+ }
+ return this.total;
+ }
+ }
+
+ protected MyDataProvider dataProvider = new MyDataProvider();
+ protected VCIJTablePanel<LogObject> tablePanel = new VCIJTablePanel<LogObject>(dataProvider);
+ private VCIJPanel tablePanel(){
+ LinkedHashMap<Integer, Integer> widthMaps = new LinkedHashMap<Integer, Integer>();
+ widthMaps.put(2, 150);
+ widthMaps.put(3, 150);
+ widthMaps.put(4, 150);
+ widthMaps.put(5, 150);
+ widthMaps.put(6, 150);
+ widthMaps.put(7, 150);
+ widthMaps.put(8, 150);
+ widthMaps.put(9, 350);
+ tablePanel.setColumnWidthMaps(widthMaps);
+ tablePanel.setCustomButtons(selfCustomButtons);
+ tablePanel.setShowPaging(true);
+ tablePanel.setCustomButtonFlowAlign(FlowLayout.CENTER);
+ tablePanel.setPageButtonFlowAlign(FlowLayout.CENTER);
+ tablePanel.setShowExport(false);
+ tablePanel.buildTablePanel();
+ tablePanel.refreshTableData();
+ return tablePanel;
+ }
+ /**
+ * 鍒濆鍖栭〉闈�
+ */
+ private void init(){
+ JPanel palMain = new JPanel();
+ palMain.setLayout(new BorderLayout());
+ palMain.setBorder(new TitledBorder(LOGMANAGE));
+
+ JPanel palTop = new JPanel();//涓婇儴
+ //鍒濆鍖�
+ initTop(palTop);//涓婇儴
+ initComboBox();//涓嬫媺妗�
+ initAction();
+
+ palMain.add(palTop, BorderLayout.NORTH);
+ palMain.add(tablePanel(), BorderLayout.CENTER);
+ this.setLayout(new BorderLayout());
+ this.add(palMain,BorderLayout.CENTER);
+ }
+
+ private void initAction(){
+ queryDetail.addActionListener(new ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent paramActionEvent) {
+ queryDetai_Method();
+
+ }
+ });
+ }
+ private void queryDetai_Method(){
+ int select = tablePanel.getSelectedRowIndexs().length;
+ if(select ==0){
+ VCIOptionPane.showMessage(this,
+ "璇烽�夋嫨瑕佹煡鐪嬬殑鏁版嵁!");
+ return;
+ }else if(select>1){
+ VCIOptionPane.showMessage(this,
+ "璇烽�夋嫨鍗曟潯鏁版嵁杩涜鏌ョ湅!");
+ return;
+ }else{
+ LinkedList<LogObject> list = tablePanel.getSelectedRowObjects();
+ LogObject dataObj = list.getFirst();
+ new DetailDialog(dataObj.getResult());
+ }
+ }
+ /**
+ * 鍒濆鍖栦笂閮�
+ * @param palTop
+ */
+ private void initTop(JPanel palTop){
+ JPanel palLeft = new JPanel();//涓婇儴宸﹁竟鐨勯儴鍒�
+ palLeft.setLayout(null);
+ palLeft.setPreferredSize(new Dimension(700,200));
+ initTopLeft(palLeft);
+
+ palTop.setLayout(new GridLayout());
+ palTop.setPreferredSize(new Dimension(900,50));
+ palTop.add(palLeft,new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 30, 10, 0), 0, 0));
+ }
+
+ /**
+ * 鍒濆鍖栦笂閮ㄥ乏杈�
+ * @param palLeft
+ */
+ private void initTopLeft(JPanel palLeft){
+
+ /*-----------------------------绗竴琛�---------------------------------*/
+
+ x = 20; y = 10; width = 80; height = 25;
+ dateLabelStart.setBounds(x, y, width, height);//鏌ヨ鏃ユ湡:鐢�
+
+ x += dateLabelStart.getBounds().width+hspan; y = 10; width=120;height=25;
+ startDateBox.setBounds(x, y, width, height);//璧峰鏃ユ湡
+
+ x += startDateBox.getBounds().width+hspan; y = 10;width=25;height=25;
+ startDateButton.setBounds(x, y, width, height);//鏃ユ湡鎺т欢
+
+ x+= startDateButton.getBounds().width+hspan;y = 10;width=25;height=25;
+ dateLabelTo.setBounds(x, y, width, height);//鍒�
+
+ x+= dateLabelTo.getBounds().width+hspan;y = 10;width=120;height=25;
+ endDateBox.setBounds(x, y, width, height);//缁撴潫鏃ユ湡
+
+ x+= endDateBox.getBounds().width+hspan;y = 10;width=25;height=25;
+ endDateButton.setBounds(x, y, width, height);//鏃ユ湡鎺т欢
+
+ /*-----------------------------绗笁琛�---------------------------------*/
+
+ x = 460;y = 10;width = 60;height = 25;
+ userLabel.setBounds(x, y, width, height);
+
+ x+=userLabel.getBounds().width+hspan+20; width=180;
+ userCombox.setBounds(x, y, width, height);
+ userCombox.setEditable(true);
+
+ x+=userCombox.getBounds().width+hspan+15; width=60;
+ ipLabel.setBounds(x, y, width, height);
+ x+=ipLabel.getBounds().width+hspan; width = 105;
+ ipText.setBounds(x, y, width, height);
+
+
+ x+= ipText.getBounds().width + hspan + 20;
+ width = 80;
+ operateTypeLabel.setBounds(x,y,width,height);
+
+ x+= operateTypeLabel.getBounds().width + hspan ;
+ width = 100;
+ typeText.setBounds(x,y,width,height);
+
+ x+= typeText.getBounds().width + hspan; width = 80;
+ queryBtn.setBounds(x, y, width, height);
+
+
+ //绗竴琛�
+ palLeft.add(dateLabelStart);
+ palLeft.add(startDateBox);
+ palLeft.add(startDateButton);
+ palLeft.add(dateLabelTo);
+ palLeft.add(endDateBox);
+ palLeft.add(endDateButton);
+ //绗笁琛�
+ palLeft.add(userLabel);
+ palLeft.add(userCombox);
+ palLeft.add(ipLabel);
+ palLeft.add(ipText);
+ palLeft.add(operateTypeLabel);
+ palLeft.add(typeText);
+
+
+ palLeft.add(queryBtn);
+ }
+
+ /**
+ * 鍒濆鍖栦笅鎷夋锛岀敤鎴凤紝鏈熼檺
+ */
+ protected void initComboBox(){
+ initUser();
+ }
+
+ /***
+ * 鍒濆鍖栫敤鎴�
+ */
+ protected void initUser() {
+ UserObject[] users = getUserObjects();
+ setUserObjectToComboBox(users);
+ }
+
+ private static final String SYSTEM_ADMIN_ROLE = "绯荤粺绠$悊鍛�";
+
+ private static final String SEC_ADMIN_ROLE = "瀹夊叏绠$悊鍛�";
+
+ private static final String AUDIT_ADMIN_ROLE = "瀹¤绠$悊鍛�";
+
+
+ protected UserObject[] getUserObjects(){
+// UserObject[] users = new UserObject[0];
+// try {
+// RightManagementClientDelegate del = new RightManagementClientDelegate(LogonApplication.getUserEntityObject());
+// int userType = 0;
+//
+// List<UserObject> lstUser = new ArrayList<UserObject>();
+// if(isManagerQuery()){
+// RoleObject role = del.fetchRoleByName(SYSTEM_ADMIN_ROLE);
+// users = del.fetchUsersByRoleId(role.getId());
+// for (UserObject user : users)
+// lstUser.add(user);
+//
+// role = del.fetchRoleByName(SEC_ADMIN_ROLE);
+// users = del.fetchUsersByRoleId(role.getId());
+// for (UserObject user : users)
+// lstUser.add(user);
+//
+//// role = del.fetchRoleByName(AUDIT_ADMIN_ROLE);
+//// users = del.fetchUsersByRoleId(role.getId());
+//// for (UserObject user : users)
+//// lstUser.add(user);
+//
+// users = lstUser.toArray(new UserObject[0]);
+// userType = 0;
+// } else {
+// userType = 1;
+// users = del.fetchUserInfoByType(userType);
+// //鐪嬫槸涓嶆槸瀹¤绠$悊鍛橈紝瀹¤绠$悊鍛樺彲浠ョ湅绯荤粺绠$悊鍜屽畨鍏ㄧ鐞�
+//
+// if(isAdminByRoleName(AUDIT_ADMIN_ROLE)){
+// return wrapperAdminUser(users, Arrays.asList(new String[]{SYSTEM_ADMIN_ROLE,SEC_ADMIN_ROLE}));
+// }
+// if(isAdminByRoleName(SEC_ADMIN_ROLE)){
+// return wrapperAdminUser(users, Arrays.asList(new String[]{AUDIT_ADMIN_ROLE}));
+// }
+// }
+// //users = del.fetchUserInfoByType(userType);
+// } catch (VCIException re) {
+// VCIOptionPane.showError(LogonApplication.frame, FILENAME, re);
+// }
+// return users;
+ List<UserObject> users = new ArrayList<UserObject>();
+ if("secAdmin".equals(ClientContextVariable.getInvocationInfo().userName)){
+ try {
+ users.addAll(getUsersByUserNames(Arrays.asList("auditAdmin")));
+ users.addAll(getUsersByUserNames(getUserNameByUserType(2)));
+ } catch (VCIException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (VCIError e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ else if("auditAdmin".equals(ClientContextVariable.getInvocationInfo().userName)){
+ try {
+ users.addAll(getUsersByUserNames(Arrays.asList("secAdmin", "sysAdmin")));
+ } catch (VCIException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ } else if("sysAdmin".equals((ClientContextVariable.getInvocationInfo().userName))){
+
+ }
+ return users.toArray(new UserObject[users.size()]);
+ }
+ private List<UserObject> getUsersByUserNames(List<String> userNames) throws VCIException{
+ List<UserObject> userList = new ArrayList<UserObject>();
+ RightManagementClientDelegate rmcd = new RightManagementClientDelegate(LogonApplication.getUserEntityObject());
+ for(String userName : userNames){
+ userList.add(rmcd.fetchUserInfoByName(userName));
+ }
+
+ Collections.sort(userList, new Comparator<UserObject>(){
+ @Override
+ public int compare(UserObject o1, UserObject o2) {
+ return o1.getUserName().compareTo(o2.getUserName());
+ }
+ });
+ return userList;
+ }
+
+ private List<String> getUserNameByUserType(int userType) throws VCIError{
+ List<String> userNames = new ArrayList<String>();
+ String sql = "select plusername,pltruename from pluser u where u.plusertype = " + String.valueOf(userType);
+ String[][] valss = QTClient.getService().queryBySqlWithoutKey(sql);
+ for(String[] vals : valss){
+ userNames.add(vals[0]);
+ }
+ return userNames;
+ }
+
+ private UserObject[] wrapperAdminUser(UserObject[] users,List<String> adminRoleList){
+ List<UserObject> userObjList = new ArrayList<UserObject>();
+ Collections.addAll(userObjList, users);
+ RightManagementClientDelegate del = new RightManagementClientDelegate(LogonApplication.getUserEntityObject());
+ try{
+ for(String roleName:adminRoleList){
+ RoleObject role = del.fetchRoleByName(roleName);
+ UserObject[] tempUsers = del.fetchUsersByRoleId(role.getId());
+ for (UserObject user : tempUsers){
+ userObjList.add(user);
+ }
+ }
+ }catch(Throwable e){
+
+ }
+ return userObjList.toArray(new UserObject[0]);
+ }
+
+
+ private boolean isAdminByRoleName(String roleName){
+ boolean isAuditUser = false;
+ try{
+ RightManagementClientDelegate del = new RightManagementClientDelegate(LogonApplication.getUserEntityObject());
+ RoleObject role = del.fetchRoleByName(roleName);
+ UserObject[] auditUsers = del.fetchUsersByRoleId(role.getId());
+
+ for (UserObject user : auditUsers){
+ if(user.getUserName().equals(LogonApplication.getUserObject().getUserName())){
+ isAuditUser = true;
+ break;
+ }
+ }
+ }catch(Throwable a){
+
+ }
+ return isAuditUser;
+ }
+
+
+ protected void setUserObjectToComboBox(UserObject[] users){
+ for(UserObject obj : users){
+ userCombox.addItem(obj);
+ }
+ userCombox.setSelectedIndex(-1);
+ }
+
+ /**
+ * 鑾峰彇鏌ヨ鏉′欢骞舵嫾鎴怱QL锛屽彧鎷紈here瀛愬彞鍚庨潰鐨凷QL
+ * @return
+ */
+ public String getSQL(){
+ String startDate = String.valueOf(this.startDateBox.getSelectedItem());//鑾峰彇璧峰鏃堕棿
+ String endDate = String.valueOf(this.endDateBox.getSelectedItem());//鑾峰彇缁撴潫鏃堕棿
+
+ StringBuffer sql = new StringBuffer("");
+ int period = this.getPeriod(LOG_SAVE_PERIOD);//鑾峰彇淇濆瓨鏈熼檺锛屼互鏈堜负鍗曚綅
+ //涓嬮潰鏄嫾鍑篠QL
+ if(period != 0){
+ sql.append(" to_date(PLDATE) >= add_months(to_date(sysdate),"+(-period)+")");
+ }
+ if(!startDate.trim().equals("")&&!startDate.equals("null")&&startDate!=null){//璧峰鏃ユ湡
+ if(!sql.toString().equals("")){
+ sql.append(" and ");
+ }
+ sql.append(" to_date(PLDATE) >= to_date('"+startDate.trim()+"','yyyy-MM-dd') ");
+ }
+ if(!endDate.trim().equals("")&&!endDate.equals("null")&&endDate!=null){//缁撴潫鏃ユ湡
+ if(!sql.toString().equals("")){
+ sql.append(" and ");
+ }
+ sql.append(" trunc(PLDATE) <= to_date('"+endDate.trim()+"','yyyy-MM-dd')");
+ }
+
+ if(getLogType() == LogType.Login) {//鐧诲叆鐧诲嚭鏃ュ織
+ if(!sql.toString().equals("")){
+ sql.append(" and ");
+ }
+ sql.append("PLLOGTYPE in ('" + getLogTypeString(LogType.Login) +"','" + getLogTypeString(LogType.Logout)+ "')");
+ } else if(getLogType() == LogType.Grant) {//鎺堟潈鏃ュ織
+ if(!sql.toString().equals("")){
+ sql.append(" and ");
+ }
+ sql.append("PLLOGTYPE in('" + getLogTypeString(LogType.Grant) + "')");
+ } else if(getLogType() == LogType.General) {//涓�鑸搷浣滄棩蹇�
+ if(!sql.toString().equals("")){
+ sql.append(" and ");
+ }
+ sql.append("PLLOGTYPE in('" + getLogTypeString(LogType.General) + "')");
+ }
+// String roleNameSql = getSqlByRole();
+// if(!"".equals(roleNameSql)) {
+// sql.append(" and "+ roleNameSql);
+// }
+//
+ if(userCombox.getSelectedItem() != null&&!userCombox.getSelectedItem().equals("")){//鎿嶄綔鐢ㄦ埛
+ String userName = "";
+ Object obj = userCombox.getSelectedItem();
+ if(obj instanceof UserObject){
+ UserObject user = (UserObject)obj;
+ userName = user.getUserName();
+ }else{
+ userName = (String)obj;
+ }
+ if(!userName.trim().equals("")){//濡傛灉鐢ㄦ埛鍚嶄负绌烘牸鍒欎笉鍔犵敤鎴锋潯浠�
+ if(!sql.toString().equals("")){
+ sql.append(" and ");
+ }
+ if(userName.contains("*")){
+ userName = userName.trim().replaceAll("\\*", "%");
+ sql.append(" PLUSER like '").append(userName.trim()).append("'");
+ }else{
+ sql.append(" PLUSER = '").append(userName.trim()).append("'");
+ }
+ }
+ }
+ //鎸塈P鏌ヨ
+ if(!ipText.getText().trim().equals("")){
+ String ip = ipText.getText().trim();
+ if(!sql.toString().equals("")){
+ sql.append(" and ");
+ }
+ if(ip.trim().contains("*")){//妯$硦鏌ヨ
+ ip = ip.trim().replaceAll("\\*", "%");
+ sql.append(" PLIP like '").append(ip.trim()).append("'");
+ }else{
+ sql.append(" PLIP = '").append(ip.trim()).append("'");
+ }
+ }
+ if(StringUtils.isNotBlank(typeText.getText())){
+ String typeValue = typeText.getText();
+ sql.append(" and pltype like '%").append(typeValue).append("%'");
+ }
+ //杩囨护鎺塧dmin鍜宒eveloper鐢ㄦ埛鐨勬棩蹇楄褰�
+ sql.append(" and PLUSER !='admin' and PLUSER !='developer' ");
+
+ sql.append(" and pluser != '" + ClientContextVariable.getInvocationInfo().userName + "' ");
+
+
+ // 瀹夊叏淇濆瘑鍛樹笉鐪嬬郴缁熺鐞嗗憳鐨勬棩蹇�
+ if("secAdmin".equals(ClientContextVariable.getInvocationInfo().userName)){
+ sql.append(" and pluser != 'sysAdmin' ");
+ }
+ // 瀹¤绠$悊鍛樺彧鐪嬬郴缁熺鐞嗗憳鍜屽畨鍏ㄤ繚瀵嗗憳鐨勬棩蹇�
+ else if("auditAdmin".equals(ClientContextVariable.getInvocationInfo().userName)){
+ sql.append(" and pluser in ('secAdmin', 'sysAdmin')");
+ }
+ return sql.toString();
+ }
+ protected String getSqlByRole(){
+ RightManagementClientDelegate del = new RightManagementClientDelegate(LogonApplication.getUserEntityObject());
+ StringBuilder roleNameString = new StringBuilder();
+
+ try {
+ RoleObject[] roleObj = del.fetchRoleInfoByRoleType(1);//鍙栧嚭绠$悊鍛樿鑹�
+ StringBuilder userString = new StringBuilder();
+ for(int k = 0;k < roleObj.length;k++) {
+ RoleObject obj = roleObj[k];
+ userString.append(" '");
+ userString.append(obj.getName());
+ userString.append("' ");
+ if(k < roleObj.length - 1) {
+ userString.append(" ,");
+ }
+ }
+
+ if("".equals(userString.toString())) {
+ return "";
+ }
+ //绠$悊鍛樻棩蹇楄褰�
+ if(isManagerQuery()){
+ roleNameString.append("PLROLENAME in ( ");
+ }else{
+ roleNameString.append("PLROLENAME not in ( ");
+ }
+
+ roleNameString.append(userString.toString());
+ roleNameString.append(" ) ");
+ } catch (VCIException e) {
+ e.printStackTrace();
+ VCIOptionPane.showError(LogonApplication.frame,"RMIPFramework", e);
+ }
+
+ return roleNameString.toString();
+ }
+
+ protected String getLogTypeString(LogType logType){
+ String res = "";
+ if(logType == LogType.Login) {
+ res = "鐧诲綍";
+ } else if(logType == LogType.Logout) {
+ res = "鐧诲嚭";
+ } else if(logType == LogType.Grant) {
+ res = "鎺堟潈";
+ } else if(logType == LogType.General) {
+ res = "涓�鑸搷浣�";
+ } else if(logType == LogType.Integration) {
+ res = "闆嗘垚搴旂敤";
+ }
+ return res;
+ }
+
+ /**
+ * 鑾峰彇鏃ュ織淇濆瓨鏈熼檺
+ * @param type 绫诲瀷锛屽垽鏂槸淇濆瓨杩樻槸澶囦唤鏈熼檺
+ * @return
+ */
+ protected int getPeriod(String type){
+ int curPeriod = 0;
+ try {
+ curPeriod = this.logDel.getCurPeriod(type);
+ } catch (VCIException e) {
+ VCIOptionPane.showError(LogonApplication.frame, FILENAME, e);
+ curPeriod = 0;
+ }
+ return curPeriod;
+ }
+
+
+
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/log/ui/LogManagementPanelActionListener.java b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogManagementPanelActionListener.java
new file mode 100644
index 0000000..e4e2676
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogManagementPanelActionListener.java
@@ -0,0 +1,183 @@
+package com.vci.client.log.ui;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.util.LinkedHashMap;
+
+import javax.swing.JFileChooser;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.vci.client.LogonApplication;
+import com.vci.client.common.objects.LogObject;
+import com.vci.client.log.delegate.LogManagementClientDelegate;
+import com.vci.client.ui.exception.VCIException;
+import com.vci.client.ui.swing.VCIOptionPane;
+import com.vci.client.ui.swing.VCISwingUtil;
+import com.vci.client.utils.excel.ExcelFileOperation;
+
+public class LogManagementPanelActionListener implements ActionListener {
+
+ private LinkedHashMap<String, Runnable> actionMaps = new LinkedHashMap<String, Runnable>();
+ private LogManagementPanel owner = null;
+
+ public LogManagementPanelActionListener(LogManagementPanel owner) {
+ this.owner = owner;
+ initActionMaps();
+ }
+
+ private void initActionMaps() {
+ actionMaps.put("query", new Runnable() { public void run() {
+ queryAction_Performed();
+ }});
+ actionMaps.put("export", new Runnable() { public void run() {
+ exportAction_Performed();
+ }});
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ String key = e.getActionCommand();
+ if(actionMaps.containsKey(key)){
+ actionMaps.get(key).run();
+ }
+ }
+
+ private void queryAction_Performed() {
+ this.owner.tablePanel.setPageIndex(1);
+ this.owner.tablePanel.refreshTableData();
+ }
+
+ private void exportAction_Performed() {
+ try{
+ LogManagementClientDelegate logDel = new LogManagementClientDelegate(LogonApplication.getUserEntityObject());
+ LogObject[] objs = logDel.fetchLogInfo(1,100000,this.owner.getSQL());//鍙栧嚭鏉′欢鏌ヨ鐨勭粨鏋滈泦
+ String[][] logString = new String[objs.length + 1][8];
+ for(int i = 0;i<this.owner.tablePanel.getTableModel().getColumnCount() - 2;i++){//鍒濆鍖栫涓�琛�
+ logString[0][i] = this.owner.tablePanel.getTableModel().getColumnName(i + 2);
+ }
+ //鑾峰彇琛ㄦ牸涓嬀閫夌殑鏁版嵁搴忓彿鏁扮粍
+ int [] orderNum = this.owner.tablePanel.getSelectedRowIndexs();
+ int m = 0;
+ if(orderNum.length==0){
+ for(int j = 0;j<objs.length;j++){
+ LogObject obj = objs[j];
+ /* StringBuffer desc = new StringBuffer();
+ desc.append(obj.getType()).append(" ").append(obj.getResult());*/
+ logString[j+1][0]=obj.getUsername();//鐢ㄦ埛鍚�
+ logString[j+1][1]=obj.getTruename();//濮撳悕
+ logString[j+1][2]=obj.getUserIp();//鐢ㄦ埛IP
+ logString[j+1][3]=obj.getModule();//妯″潡
+ logString[j+1][4]=obj.getType();//鎿嶄綔
+ logString[j+1][5]=obj.getDate();//鏃堕棿
+ String result = "鎿嶄綔鎴愬姛";
+ String memo = obj.getResult();
+ if(StringUtils.isNotBlank(memo)){
+ boolean hasResult =false;
+ if(memo.startsWith("鎿嶄綔") && memo.length()>4){
+ result = memo.substring(0,4);
+ hasResult = true;
+ }
+ if((memo.startsWith("鐧诲叆") || memo.startsWith("鐧诲嚭"))&& memo.length()>4){
+ result = memo.substring(0,4);
+ hasResult = true;
+ }
+ if(memo.length()>5 && hasResult){
+ memo = memo.substring(5);
+ }else{
+ //memo = "";
+ }
+ }
+ logString[j+1][6]=result;//缁撴灉
+ logString[j+1][7]=memo;//鎻忚堪
+ }
+ }else{
+ for(int j = 0;j<objs.length;j++){
+ LogObject obj = objs[j];
+ if(m==orderNum.length){
+ break;
+ }
+ for(int k = m;k<orderNum.length;k++){
+ if(orderNum[k]>j){
+ break;
+ }
+ if(orderNum[k]==j){
+ logString[m+1][0]=obj.getUsername();//鐢ㄦ埛鍚�
+ logString[m+1][1]=obj.getTruename();//濮撳悕
+ logString[m+1][2]=obj.getUserIp();//鐢ㄦ埛IP
+ logString[m+1][3]=obj.getModule();//妯″潡
+ logString[m+1][4]=obj.getType();//鎿嶄綔
+ logString[m+1][5]=obj.getDate();//鏃堕棿
+ String result = "鎿嶄綔鎴愬姛";
+ String memo = obj.getResult();
+ if(StringUtils.isNotBlank(memo)){
+ boolean hasResult =false;
+ if(memo.startsWith("鎿嶄綔") && memo.length()>4){
+ result = memo.substring(0,4);
+ hasResult = true;
+ }
+ if((memo.startsWith("鐧诲叆") || memo.startsWith("鐧诲嚭"))&& memo.length()>4){
+ result = memo.substring(0,4);
+ hasResult = true;
+ }
+ if(memo.length()>5 && hasResult){
+ memo = memo.substring(5);
+ }else{
+ //memo = "";
+ }
+ }
+ logString[m+1+1][6]=result;//缁撴灉
+ logString[m+1+1][7]=memo;//鎻忚堪
+ m++;
+ break;
+ }
+ }
+ }
+ }
+ boolean exportSuccess = exportExcel(logString);
+ if(exportSuccess){
+ VCIOptionPane.showMessage(LogonApplication.frame,"瀵煎嚭鏃ュ織鏂囦欢鎴愬姛!");
+ }
+ } catch (VCIException e1) {
+ VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e1);
+ }
+ }
+
+ /**
+ * 瀵煎嚭鏃ュ織
+ * @param logString
+ * @return
+ */
+ private boolean exportExcel(String[][] logString){
+ String EXPORTFILE = "鏃ュ織淇℃伅瀵煎嚭";
+ File f = this.getFile();
+ if (f == null) return false;
+ /**鍒ゆ柇瀵煎嚭鐨勬枃浠舵槸鍚﹁浣跨敤鐨勬牎楠岋紝濡傛灉鏂囦欢宸茬粡鎵撳紑锛屼笉鍏佽瀵煎叆**/
+ if(!f.renameTo(f) && f.exists()) {
+ VCIOptionPane.showMessageDialog(this.owner, "鏂囦欢宸茬粡琚娇鐢紝璇烽噸鏂伴�夋嫨锛�");
+ if(exportExcel(logString)){
+ return true;
+ }
+ }
+ new ExcelFileOperation().writeExcelFileInfo(f.getPath(), EXPORTFILE,logString);
+ return true;
+ }
+
+ /**
+ * 鑾峰彇閫夋嫨瀵煎叆鐨勬枃浠�
+ *
+ * @return
+ */
+ private File getFile() {
+ File f = null;
+ JFileChooser fileDialog = new JFileChooser("閫夋嫨鏂囦欢");
+ @SuppressWarnings("static-access")
+ String fileURL = new VCISwingUtil().getExcelFileURL(fileDialog, true, "");
+ if (fileURL == null) return null;
+ System.out.println(fileURL);
+ f = new File(fileURL);
+ return f;
+ }
+
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/log/ui/LogOperateMainPanel.java b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogOperateMainPanel.java
new file mode 100644
index 0000000..4aef855
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogOperateMainPanel.java
@@ -0,0 +1,40 @@
+package com.vci.client.log.ui;
+
+import com.vci.client.framework.rightConfig.object.FunctionObject;
+import com.vci.corba.log.data.LogType;
+
+
+/**
+ * 涓�鑸搷浣滄棩蹇楁煡璇�
+ *
+ * <p>Title: </p>
+ * <p>Description: </p>
+ * <p>Copyright: Copyright (c) 2016</p>
+ * <p>Company: VCI</p>
+ * @author xiongchao
+ * @time 2016-12-12
+ * @version 1.0
+ */
+public class LogOperateMainPanel extends LogQueryBaseMainPanel {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -8474257094196357644L;
+
+ public LogOperateMainPanel(FunctionObject funcObj) {
+ super(funcObj);
+ }
+
+ @Override
+ public LogType getLogType() {
+ return LogType.General;
+ }
+
+ @Override
+ public boolean isManagerQuery() {
+ return false;
+ }
+
+}
+
diff --git a/Source/Client/PLTClient/src/com/vci/client/log/ui/LogOperateManagerMainPanel.java b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogOperateManagerMainPanel.java
new file mode 100644
index 0000000..3d2a43f
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogOperateManagerMainPanel.java
@@ -0,0 +1,40 @@
+
+package com.vci.client.log.ui;
+
+import com.vci.client.framework.rightConfig.object.FunctionObject;
+import com.vci.corba.log.data.LogType;
+
+
+/**
+ * 绠$悊鍛� 涓�鑸搷浣滄棩蹇楁煡璇�
+ *
+ * <p>Title: </p>
+ * <p>Description: </p>
+ * <p>Copyright: Copyright (c) 2016</p>
+ * <p>Company: VCI</p>
+ * @author xiongchao
+ * @time 2016-12-12
+ * @version 1.0
+ */
+public class LogOperateManagerMainPanel extends LogQueryBaseMainPanel {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 4252501462518845274L;
+
+ public LogOperateManagerMainPanel(FunctionObject funcObj) {
+ super(funcObj);
+ }
+
+ @Override
+ public LogType getLogType() {
+ return LogType.General;
+ }
+
+ @Override
+ public boolean isManagerQuery() {
+ return true;
+ }
+
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/log/ui/LogPeriodObject.java b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogPeriodObject.java
new file mode 100644
index 0000000..59c56f9
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogPeriodObject.java
@@ -0,0 +1,25 @@
+package com.vci.client.log.ui;
+
+/**
+ * 鐢ㄦ潵瀛樺偍淇濆瓨鏈熼檺鍜屽浠芥湡闄愪笅鎷夋鍒楄〃鍊肩殑瀹炰綋绫�
+ * @author xiongfei
+ * @time 2011-06-16
+ */
+public class LogPeriodObject {
+
+ private String code; //瀵瑰簲鐨勬暟瀛楋紝浠ユ湀涓哄崟浣�
+ private String value;//瀵瑰簲鐨勬樉绀哄悕绉�
+ public String getCode() {
+ return code;
+ }
+ public void setCode(String code) {
+ this.code = code;
+ }
+ public String getValue() {
+ return value;
+ }
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/log/ui/LogQueryBaseMainPanel.java b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogQueryBaseMainPanel.java
new file mode 100644
index 0000000..b191a54
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/log/ui/LogQueryBaseMainPanel.java
@@ -0,0 +1,85 @@
+package com.vci.client.log.ui;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JPanel;
+
+import com.vci.client.common.VCIBasePanel;
+import com.vci.client.framework.rightConfig.object.FunctionObject;
+import com.vci.client.framework.specialrole.ModuleInterface.IModuleShow;
+import com.vci.corba.log.data.LogType;
+
+
+/**
+ * 鏃ュ織鏌ヨ鍩虹鍔熻兘妯″潡
+ *
+ * <p>Title: </p>
+ * <p>Description: </p>
+ * <p>Copyright: Copyright (c) 2016</p>
+ * <p>Company: VCI</p>
+ * @author xiongchao
+ * @time 2016-12-12
+ * @version 1.0
+ */
+public abstract class LogQueryBaseMainPanel extends VCIBasePanel implements IModuleShow {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -1867129531972223762L;
+
+ private String userID = "";
+ private String roleID = "";
+ private String moduleName = "";
+ private String iconName = "";
+ private String moduleShowInfo = "";
+ private JPanel moduleComponent = null;
+ public String getUserID() {
+ return userID;
+ }
+ public void setUserID(String userID) {
+ this.userID = userID;
+ }
+ public String getRoleID() {
+ return roleID;
+ }
+ public void setRoleID(String roleID) {
+ this.roleID = roleID;
+ }
+ public String getModuleName() {
+ return moduleName;
+ }
+ public void setModuleName(String moduleName) {
+ this.moduleName = moduleName;
+ }
+ public String getIconName() {
+ return iconName;
+ }
+ public void setIconName(String iconName) {
+ this.iconName = iconName;
+ }
+ public String getModuleShowInfo() {
+ return moduleShowInfo;
+ }
+ public void setModuleShowInfo(String moduleShowInfo) {
+ this.moduleShowInfo = moduleShowInfo;
+ }
+ public JPanel getModuleComponent() {
+ moduleComponent = this;
+ return moduleComponent;
+ }
+
+ public LogQueryBaseMainPanel(FunctionObject funcObj) {
+ super(funcObj);
+ init();
+ }
+
+ protected void init() {
+ this.setLayout(new BorderLayout());
+ this.add(new LogManagementPanel(this, getLogType(), isManagerQuery()));
+ }
+
+ public abstract LogType getLogType();
+ public abstract boolean isManagerQuery();
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/logon/base/AboutCODE.java b/Source/Client/PLTClient/src/com/vci/client/logon/base/AboutCODE.java
index 59a53ee..769895e 100644
--- a/Source/Client/PLTClient/src/com/vci/client/logon/base/AboutCODE.java
+++ b/Source/Client/PLTClient/src/com/vci/client/logon/base/AboutCODE.java
@@ -8,7 +8,7 @@
import javax.swing.JLabel;
import javax.swing.JPanel;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
public class AboutCODE extends BaseJDialog {
private static final long serialVersionUID = 1L;
diff --git a/Source/Client/PLTClient/src/com/vci/client/logon/base/AboutDialog.java b/Source/Client/PLTClient/src/com/vci/client/logon/base/AboutDialog.java
index 42181d5..24fb293 100644
--- a/Source/Client/PLTClient/src/com/vci/client/logon/base/AboutDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/logon/base/AboutDialog.java
@@ -22,7 +22,7 @@
import javax.swing.JTextArea;
import com.vci.client.common.ConfigUtils;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
/**
* 鍏充簬绐楀彛
diff --git a/Source/Client/PLTClient/src/com/vci/client/logon/base/BaseMenuBar.java b/Source/Client/PLTClient/src/com/vci/client/logon/base/BaseMenuBar.java
index 47e4feb..8220789 100644
--- a/Source/Client/PLTClient/src/com/vci/client/logon/base/BaseMenuBar.java
+++ b/Source/Client/PLTClient/src/com/vci/client/logon/base/BaseMenuBar.java
@@ -14,7 +14,7 @@
import com.vci.client.framework.util.RightControlUtil;
import com.vci.client.logon.client.LogonPanel;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
import com.vci.client.ui.swing.WindowClosedDialog;
diff --git a/Source/Client/PLTClient/src/com/vci/client/logon/base/LogonHandler.java b/Source/Client/PLTClient/src/com/vci/client/logon/base/LogonHandler.java
index 0a66579..af36b79 100644
--- a/Source/Client/PLTClient/src/com/vci/client/logon/base/LogonHandler.java
+++ b/Source/Client/PLTClient/src/com/vci/client/logon/base/LogonHandler.java
@@ -22,6 +22,7 @@
import com.vci.client.framework.util.RightControlUtil;
import com.vci.client.ui.exception.VCIException;
import com.vci.client.ui.locale.LocaleDisplay;
+import com.vci.client.ui.swing.VCIOptionPane;
import com.vci.corba.common.VCIError;
import com.vci.corba.framework.data.DataSourceInfo;
import com.vci.mw.ClientContextVariable;
@@ -239,24 +240,6 @@
return res;
}
- int actualType = 0;
- int mimacelue = pwdStgObj.getRequiredType();
- //鍒ゆ柇瀵嗙爜灞炰簬鍝瀵嗙爜绛栫暐
- CombinationObject[] combinationObjs = rmcd.fetchCombinationsByPstId(pwdStgObj.getId());
- for (CombinationObject combObj : combinationObjs){
- List<String> list = new ArrayList<String>();
- CombinationValueObject[] combValObj = rmcd.fetchCombinationValuesByParentId(combObj.getId());
- for (CombinationValueObject obj : combValObj){
- list.add(obj.getValue());
- }
- for (int i = 0 ; i < userObj.getPwd().length() ;i ++){
- String a = ""+userObj.getPwd().charAt(i);
- if (list.contains(a)){
- actualType +=1 ;
- break;
- }
- }
- }
if (!("".equals(pwdStgObj.getId()))) {// 瀵嗙爜绛栫暐鏄惁涓虹┖
defaultWrongNum = pwdStgObj.getRetryTime(); // 鑾峰彇瀵嗙爜绛栫暐瑙勫畾鐨勯敊璇櫥褰曟鏁�
@@ -264,6 +247,57 @@
dafaultOverdueDay = pwdStgObj.getOverdueDay(); // 鑾峰彇瀵嗙爜瑙勫垯鐨勮繃鏈熷ぉ鏁�
dafaultRemideDay = pwdStgObj.getRemideDay(); // 鑾峰彇瀵嗙爜绛栫暐瑙勫畾鐨勫瘑鐮佸揩杩囨湡鎻愰啋澶╂暟锛堟彁鍓峹x澶╁紑濮嬫彁閱掕淇敼瀵嗙爜锛�
}
+
+ String password = userObj.getPwd();
+ int requiredType = pwdStgObj.getRequiredType(); // 蹇呭~绉嶇被
+ int containsTypes = pwdStgObj.getCharTypes();// 鍖呭惈瀛楃绫诲瀷
+
+ //鍒ゆ柇瀵嗙爜灞炰簬鍝瀵嗙爜绛栫暐
+// CombinationObject[] combinationObjs = rmcd.fetchCombinationsByPstId(pwdStgObj.getId());
+// for (CombinationObject combObj : combinationObjs){
+// List<String> list = new ArrayList<String>();
+// CombinationValueObject[] combValObj = rmcd.fetchCombinationValuesByParentId(combObj.getId());
+// for (CombinationValueObject obj : combValObj){
+// list.add(obj.getValue());
+// }
+// for (int i = 0 ; i < userObj.getPwd().length() ;i ++){
+// String a = ""+userObj.getPwd().charAt(i);
+// if (list.contains(a)){
+// actualType +=1 ;
+// break;
+// }
+// }
+// }
+ int actualTypes = 0;
+ int typeCount = 0;
+ {
+
+ String symbol = "[ _`~!@#$%^&*()-+={[}]|\\'\":;,.<>/?";
+
+ for (int i = 0 ; i < password.length() ;i ++){
+ char c = password.charAt(i);
+ if (Character.isDigit(c))
+ actualTypes |= 0x01;
+ else if (Character.isLowerCase(c))
+ actualTypes |= 0x02;
+ else if (Character.isUpperCase(c))
+ actualTypes |= 0x04;
+ else if (symbol.indexOf(c) > -1)
+ actualTypes |= 0x08;
+ }
+
+ for (int i = 0; i < 4; i++) {
+ int type = (int)Math.pow(2, i);
+ if ((actualTypes & type) == type)
+ typeCount++;
+ }
+
+ if ((actualTypes & containsTypes) != actualTypes || typeCount < requiredType){
+ res.setOtherMessage(getThisI18n("userPwdStagIsUpdatePleaseChange"));
+ res.setNeedChangePassword(true);
+ }
+ }
+
long pwdUpdateTime = userObj.getPwdUpdateTime();
long systemTime = rmcd.getSystemTime();
@@ -277,7 +311,8 @@
// 鎮ㄧ殑瀵嗙爜宸茬粡杩囨湡,璇疯繘琛屼慨鏀癸紒
res.setOtherMessage(getThisI18n("userPwdIsExpiredPleaseChange"));
res.setNeedChangePassword(true);
- } else if (actualType < mimacelue) {
+ //} else if (actualType < mimacelue) {
+ } else if ((actualTypes & containsTypes) != actualTypes || typeCount < requiredType){
// 鎮ㄧ殑瀵嗙爜绛栫暐宸茬粡淇敼锛岄渶瑕佷慨鏀瑰瘑鐮佹墠鑳借繘琛屽叾瀹冩搷浣�!
res.setOtherMessage(getThisI18n("userPwdStagIsUpdatePleaseChange"));
res.setNeedChangePassword(true);
diff --git a/Source/Client/PLTClient/src/com/vci/client/logon/client/LoginThread.java b/Source/Client/PLTClient/src/com/vci/client/logon/client/LoginThread.java
index e84c3ce..854e4db 100644
--- a/Source/Client/PLTClient/src/com/vci/client/logon/client/LoginThread.java
+++ b/Source/Client/PLTClient/src/com/vci/client/logon/client/LoginThread.java
@@ -15,6 +15,7 @@
import com.vci.client.LogonApplication;
import com.vci.client.common.ConfigUtils;
import com.vci.client.common.objects.UserObject;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.framework.appConfig.object.AppConfigDetailObject;
import com.vci.client.framework.delegate.AppConfigDetailClientDelegate;
import com.vci.client.framework.delegate.RightManagementClientDelegate;
@@ -95,7 +96,7 @@
uei.ip = clientIpList.size()>0?clientIpList.get(0):"127.0.0.1";
uei.modules = "鐧诲綍";
uei.userName = userName;
- ClientSession.getFrameworkService().savelogfail("鐧诲叆澶辫触:褰撳墠鐧诲綍鐢ㄦ埛闈炰笁鍛樼敤鎴�" , uei);
+ ServiceProvider.getLogService().saveLoginLog(false, "鐧诲叆澶辫触:褰撳墠鐧诲綍鐢ㄦ埛闈炰笁鍛樼敤鎴�" , uei);
return ;
}
diff --git a/Source/Client/PLTClient/src/com/vci/client/logon/client/LogonAppletPanel.java b/Source/Client/PLTClient/src/com/vci/client/logon/client/LogonAppletPanel.java
index a112125..4782474 100644
--- a/Source/Client/PLTClient/src/com/vci/client/logon/client/LogonAppletPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/logon/client/LogonAppletPanel.java
@@ -7,7 +7,7 @@
import javax.swing.ImageIcon;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.swing.VCIOptionPane;
import netscape.javascript.JSObject;
diff --git a/Source/Client/PLTClient/src/com/vci/client/logon/client/LogonFrame.java b/Source/Client/PLTClient/src/com/vci/client/logon/client/LogonFrame.java
index aaf6a59..3529cb7 100644
--- a/Source/Client/PLTClient/src/com/vci/client/logon/client/LogonFrame.java
+++ b/Source/Client/PLTClient/src/com/vci/client/logon/client/LogonFrame.java
@@ -4,7 +4,7 @@
import java.awt.Dimension;
import java.awt.event.WindowEvent;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.components.VCIJFrame;
diff --git a/Source/Client/PLTClient/src/com/vci/client/logon/client/LogonPanel.java b/Source/Client/PLTClient/src/com/vci/client/logon/client/LogonPanel.java
index 64902a3..fc88172 100644
--- a/Source/Client/PLTClient/src/com/vci/client/logon/client/LogonPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/logon/client/LogonPanel.java
@@ -19,7 +19,7 @@
import com.vci.client.common.objects.UserEntityObject;
import com.vci.client.framework.delegate.SystemCfgClientDelegate;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KPasswordField;
import com.vci.client.ui.swing.KTextField;
diff --git a/Source/Client/PLTClient/src/com/vci/client/logon/client/VCIModuleMainTreeCellRenderer.java b/Source/Client/PLTClient/src/com/vci/client/logon/client/VCIModuleMainTreeCellRenderer.java
index 78f9c83..2a2a2f8 100644
--- a/Source/Client/PLTClient/src/com/vci/client/logon/client/VCIModuleMainTreeCellRenderer.java
+++ b/Source/Client/PLTClient/src/com/vci/client/logon/client/VCIModuleMainTreeCellRenderer.java
@@ -7,7 +7,7 @@
import javax.swing.tree.DefaultTreeCellRenderer;
import com.vci.client.framework.rightConfig.object.FunctionObject;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.tree.VCIBaseTreeNode;
/**
diff --git a/Source/Client/PLTClient/src/com/vci/client/logon/client/VCISpecialModuleMainTreeCellRenderer.java b/Source/Client/PLTClient/src/com/vci/client/logon/client/VCISpecialModuleMainTreeCellRenderer.java
index 6fb412b..43e589a 100644
--- a/Source/Client/PLTClient/src/com/vci/client/logon/client/VCISpecialModuleMainTreeCellRenderer.java
+++ b/Source/Client/PLTClient/src/com/vci/client/logon/client/VCISpecialModuleMainTreeCellRenderer.java
@@ -8,7 +8,7 @@
import com.vci.client.framework.rightConfig.object.FunctionObject;
import com.vci.client.framework.specialrole.SpecialRoleClientObject;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.tree.VCIBaseTreeNode;
/**
diff --git a/Source/Client/PLTClient/src/com/vci/client/logon/client/VciApplet.java b/Source/Client/PLTClient/src/com/vci/client/logon/client/VciApplet.java
index 53cce83..6f41c7f 100644
--- a/Source/Client/PLTClient/src/com/vci/client/logon/client/VciApplet.java
+++ b/Source/Client/PLTClient/src/com/vci/client/logon/client/VciApplet.java
@@ -31,7 +31,7 @@
import com.vci.client.framework.rightConfig.modelConfig.ModuleConfigMainPanel;
import com.vci.client.framework.rightConfig.object.FunctionObject;
import com.vci.client.framework.util.RightControlUtil;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.swing.VCISwingUtil;
import com.vci.client.ui.swing.components.VCIJLabel;
import com.vci.client.ui.swing.components.VCIJMenuBar;
diff --git a/Source/Client/PLTClient/src/com/vci/client/logon/client/VciFrame.java b/Source/Client/PLTClient/src/com/vci/client/logon/client/VciFrame.java
index f3f8318..fe42088 100644
--- a/Source/Client/PLTClient/src/com/vci/client/logon/client/VciFrame.java
+++ b/Source/Client/PLTClient/src/com/vci/client/logon/client/VciFrame.java
@@ -33,7 +33,7 @@
import com.vci.client.logon.base.SysCofigMenuBar;
import com.vci.client.logon.base.TabPanelManage;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
import com.vci.client.ui.swing.VCISwingUtil;
diff --git a/Source/Client/PLTClient/src/com/vci/client/omd/btm/ui/BtmPanel.java b/Source/Client/PLTClient/src/com/vci/client/omd/btm/ui/BtmPanel.java
index 4579e01..a0a438d 100644
--- a/Source/Client/PLTClient/src/com/vci/client/omd/btm/ui/BtmPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/omd/btm/ui/BtmPanel.java
@@ -61,7 +61,7 @@
import com.vci.client.omd.btm.wrapper.BtmItemWrapper;
import com.vci.client.omd.provider.LinkTypeProvider;
import com.vci.client.omd.ui.OmdTreeCellRenderer;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.util.PostorderEnumeration;
import com.vci.corba.common.VCIError;
import com.vci.omd.utils.BTComparator;
diff --git a/Source/Client/PLTClient/src/com/vci/client/omd/btm/ui/DeleteTypeDialog.java b/Source/Client/PLTClient/src/com/vci/client/omd/btm/ui/DeleteTypeDialog.java
index 0cdc0c6..0652f8c 100644
--- a/Source/Client/PLTClient/src/com/vci/client/omd/btm/ui/DeleteTypeDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/omd/btm/ui/DeleteTypeDialog.java
@@ -26,7 +26,6 @@
import com.vci.corba.omd.stm.StatePool;
import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.attribpool.ui.APClient;
-import com.vci.client.omd.enumManager.ui.EnumClient;
import com.vci.client.omd.lifecycle.LifeCycleStart;
import com.vci.client.omd.statepool.StatePoolStart;
import com.vci.client.omd.versionrule.VRClientStart;
@@ -163,7 +162,7 @@
updateTable(2, 1, "澶辫触");
}
try {
- EnumClient.getService().deleteEmItems(delEnumList.toArray(new EnumItem[0]));
+ ServiceProvider.getOMDService().getEnumService().deleteEmItems(delEnumList.toArray(new EnumItem[0]));
updateTable(3, 1, "鎴愬姛");
} catch (VCIError e1) {
e1.printStackTrace();
@@ -315,7 +314,7 @@
try {
//渚濇嵁淇濈暀鐨勭被鍨嬫瀯閫犱繚鐣欑殑灞炴��
exceptEnums = new ArrayList<String>();
- EnumItem[] emItems = EnumClient.getService().getEmItems("", 0, 0);
+ EnumItem[] emItems = ServiceProvider.getOMDService().getEnumService().getEmItems("", 0, 0);
AttribItem[] abs = APClient.getService().getAttribItemsByNames(exceptAbs.toArray(new String[0]));
for(AttribItem ab : abs){
OtherInfo otherInfo = OtherInfo.getOtherInfoByText(ab.other);
diff --git a/Source/Client/PLTClient/src/com/vci/client/omd/enumManager/toOutside/GetEnumForOut.java b/Source/Client/PLTClient/src/com/vci/client/omd/enumManager/toOutside/GetEnumForOut.java
index 5933083..bc6dac5 100644
--- a/Source/Client/PLTClient/src/com/vci/client/omd/enumManager/toOutside/GetEnumForOut.java
+++ b/Source/Client/PLTClient/src/com/vci/client/omd/enumManager/toOutside/GetEnumForOut.java
@@ -3,7 +3,7 @@
import java.util.ArrayList;
import java.util.HashMap;
-import com.vci.client.omd.enumManager.ui.EnumClient;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.corba.common.VCIError;
import com.vci.corba.omd.etm.EnumChild;
import com.vci.corba.omd.etm.EnumItem;
@@ -24,7 +24,7 @@
HashMap<String, ArrayList<String>> enumMap = new HashMap<String, ArrayList<String>>();
EnumItem[] emArray = null;
try {
- emArray = EnumClient.getService().getEmItemsByType(enumType);
+ emArray = ServiceProvider.getOMDService().getEnumService().getEmItemsByType(enumType);
} catch (VCIError e) {
e.printStackTrace();
}
diff --git a/Source/Client/PLTClient/src/com/vci/client/omd/enumManager/ui/EnumItemPanel.java b/Source/Client/PLTClient/src/com/vci/client/omd/enumManager/ui/EnumItemPanel.java
index ba2ac61..be561e2 100644
--- a/Source/Client/PLTClient/src/com/vci/client/omd/enumManager/ui/EnumItemPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/omd/enumManager/ui/EnumItemPanel.java
@@ -26,6 +26,7 @@
import org.jdesktop.swingx.decorator.HighlighterFactory;
import com.vci.mw.InvocationUtility;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.enumManager.toOutside.InterEM;
import com.vci.client.omd.enumManager.toOutside.InterEMManager;
import com.vci.client.omd.enumManager.wrapper.EnumChildWrapper;
@@ -275,7 +276,7 @@
emItem.creator = userName;
emItem.modifier = userName;
try {
- boolean addSuccess = EnumClient.getService().addEmItem(emItem);
+ boolean addSuccess = ServiceProvider.getOMDService().getEnumService().addEmItem(emItem);
if(!addSuccess){
JOptionPane.showMessageDialog(null, "娣诲姞鏋氫妇澶辫触", "娣诲姞鏋氫妇澶辫触", JOptionPane.ERROR_MESSAGE);
return;
@@ -306,7 +307,7 @@
emItem.children = emChildList.toArray(new EnumChild[0]);
emItem.modifier = InvocationUtility.getInvocation().userName;
try {
- boolean mdSuccess = EnumClient.getService().modifyEmItem(emItem);
+ boolean mdSuccess = ServiceProvider.getOMDService().getEnumService().modifyEmItem(emItem);
if(!mdSuccess){
JOptionPane.showMessageDialog(null, "淇敼鏋氫妇澶辫触", "淇敼鏋氫妇澶辫触", JOptionPane.ERROR_MESSAGE);
return;
@@ -456,7 +457,7 @@
try {
- if(EnumClient.getService().checkRowIsExists(tfName.getText())){
+ if(ServiceProvider.getOMDService().getEnumService().checkRowIsExists(tfName.getText())){
JOptionPane.showMessageDialog(this, "鏋氫妇鍚嶅凡缁忓瓨鍦�", "娉ㄦ剰", JOptionPane.WARNING_MESSAGE);
return false;
}
diff --git a/Source/Client/PLTClient/src/com/vci/client/omd/enumManager/ui/EnumManagerPanel.java b/Source/Client/PLTClient/src/com/vci/client/omd/enumManager/ui/EnumManagerPanel.java
index 8e1e007..283cacd 100644
--- a/Source/Client/PLTClient/src/com/vci/client/omd/enumManager/ui/EnumManagerPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/omd/enumManager/ui/EnumManagerPanel.java
@@ -29,6 +29,7 @@
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.decorator.HighlighterFactory;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.enumManager.toOutside.InterEM;
import com.vci.client.omd.enumManager.toOutside.InterEMManager;
import com.vci.client.omd.enumManager.wrapper.EnumItemWrapper;
@@ -188,7 +189,7 @@
EnumItem emItem;
//add by caill 浣胯〃鏍煎唴瀹硅窡鎼滅储妗嗗唴瀹圭粨鍚堣捣鏉ワ紝骞舵寜鐓ф悳绱㈡涓殑鏋氫妇鍚嶇О鏄剧ず鐩稿簲鐨勮〃鏍间俊鎭�
String filter=tfFilter.getText();
- emItemArray = EnumClient.getService().getEmItems(filter, 1, 1);
+ emItemArray = ServiceProvider.getOMDService().getEnumService().getEmItems(filter, 1, 1);
tableModel.setRowCount(emItemArray.length);
//閲嶆柊璁剧疆table鐨凜ell鐨勫彲缂栬緫鎬�
tableModel.setInitFlag(false);
@@ -370,7 +371,7 @@
}
try {
- boolean isSuccess = EnumClient.getService().deleteEmItems(emItemList.toArray(new EnumItem[0]));
+ boolean isSuccess = ServiceProvider.getOMDService().getEnumService().deleteEmItems(emItemList.toArray(new EnumItem[0]));
if(isSuccess){
JOptionPane.showMessageDialog(this, "鍒犻櫎鏋氫妇鎴愬姛", "鍒犻櫎鎴愬姛", JOptionPane.INFORMATION_MESSAGE);
}else{
diff --git a/Source/Client/PLTClient/src/com/vci/client/omd/lifecycle/ui/ImageSelectDialog.java b/Source/Client/PLTClient/src/com/vci/client/omd/lifecycle/ui/ImageSelectDialog.java
index 4617ab8..bf73eb9 100644
--- a/Source/Client/PLTClient/src/com/vci/client/omd/lifecycle/ui/ImageSelectDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/omd/lifecycle/ui/ImageSelectDialog.java
@@ -27,13 +27,10 @@
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
-import org.jgraph.graph.DefaultEdge;
import org.jgraph.graph.DefaultGraphCell;
-import org.jgraph.graph.DefaultPort;
import org.jgraph.graph.GraphConstants;
-import com.vci.client.LogonApplication;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.corba.omd.lcm.Bound;
public class ImageSelectDialog extends JDialog{
diff --git a/Source/Client/PLTClient/src/com/vci/client/omd/lifecycle/ui/LifeCyclePanel.java b/Source/Client/PLTClient/src/com/vci/client/omd/lifecycle/ui/LifeCyclePanel.java
index 02ebd46..b9c35e4 100644
--- a/Source/Client/PLTClient/src/com/vci/client/omd/lifecycle/ui/LifeCyclePanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/omd/lifecycle/ui/LifeCyclePanel.java
@@ -72,7 +72,7 @@
import com.vci.client.omd.lifecycle.itf.InterLCy;
import com.vci.client.omd.lifecycle.pubimpl.InterLCyManager;
import com.vci.client.omd.lifecycle.pubimpl.LifeCycleTransitionEvents;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.util.PostorderEnumeration;
import com.vci.corba.common.VCIError;
import com.vci.corba.omd.lcm.Bound;
diff --git a/Source/Client/PLTClient/src/com/vci/client/omd/statepool/ui/ImageSelectDialog.java b/Source/Client/PLTClient/src/com/vci/client/omd/statepool/ui/ImageSelectDialog.java
index 86f917f..f78b39d 100644
--- a/Source/Client/PLTClient/src/com/vci/client/omd/statepool/ui/ImageSelectDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/omd/statepool/ui/ImageSelectDialog.java
@@ -34,7 +34,7 @@
import com.vci.client.LogonApplication;
import com.vci.client.omd.statepool.StatePoolStart;
import com.vci.client.ui.ImageBundle;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.common.resource.CommonProperties;
import com.vci.corba.common.VCIError;
diff --git a/Source/Client/PLTClient/src/com/vci/client/omd/statepool/ui/StatePoolUI.java b/Source/Client/PLTClient/src/com/vci/client/omd/statepool/ui/StatePoolUI.java
index 2bc0525..b72c0d6 100644
--- a/Source/Client/PLTClient/src/com/vci/client/omd/statepool/ui/StatePoolUI.java
+++ b/Source/Client/PLTClient/src/com/vci/client/omd/statepool/ui/StatePoolUI.java
@@ -61,7 +61,7 @@
import com.vci.client.omd.statepool.itf.InterState;
import com.vci.client.omd.statepool.pubimpl.InterStateManager;
import com.vci.client.omd.ui.OmdTreeCellRenderer;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.swing.VCISwingUtil;
import com.vci.client.ui.util.PostorderEnumeration;
import com.vci.corba.common.VCIError;
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/ConditionPanel.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/ConditionPanel.java
index 2afd140..d40e246 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/ConditionPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/ConditionPanel.java
@@ -66,6 +66,7 @@
import com.vci.corba.omd.qtm.QTInfo;
import com.vci.omd.objects.OtherInfo;
import com.vci.client.common.oq.OQTool;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.provider.ApProvider;
import com.vci.client.omd.provider.LinkTypeProvider;
import com.vci.client.oq.QTClient;
@@ -383,12 +384,12 @@
if(isForRight){
if(rdBtm.isSelected()){
- qtdArray = QTDClient.getService().getBizTypeQTDs(btmName);
+ qtdArray = ServiceProvider.getOMDService().getQTDService().getBizTypeQTDs(btmName);
}else if(rdLinkType.isSelected()){
List<QTD> qtdList = new ArrayList<QTD>();
LinkType[] linkTypes = LinkTypeProvider.getInstance().getLinkTypeByBtmName(btmName, "from");
for(int i = 0; i < linkTypes.length; i++){
- QTD[] qtds = QTDClient.getService().getLinkTypeQTDs(linkTypes[i].name);
+ QTD[] qtds = ServiceProvider.getOMDService().getQTDService().getLinkTypeQTDs(linkTypes[i].name);
for(int k = 0; k < qtds.length; k++){
qtdList.add(qtds[k]);
}
@@ -396,7 +397,7 @@
qtdArray = qtdList.toArray(new QTD[0]);
}
}else{
- qtdArray = QTDClient.getService().getBizTypeQTDs(btmName);
+ qtdArray = ServiceProvider.getOMDService().getQTDService().getBizTypeQTDs(btmName);
}
} catch (VCIError e) {
e.printStackTrace();
@@ -992,7 +993,7 @@
String QTname = values[0];
String attr = values[1].substring(0, values[1].length());
try {
- QTInfo qt = QTDClient.getService().getQT(QTname);
+ QTInfo qt = ServiceProvider.getOMDService().getQTDService().getQT(QTname);
String qtText = qt.qtText;
QueryTemplate qt_ = OQTool.getQTByQTText(qt.qtName, qtText);
List<String> clauseList = new ArrayList<String>();
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/ConditionPanelForLink.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/ConditionPanelForLink.java
index b2c71f4..e31b7dc 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/ConditionPanelForLink.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/ConditionPanelForLink.java
@@ -63,6 +63,7 @@
import com.vci.corba.omd.qtm.QTInfo;
import com.vci.omd.objects.OtherInfo;
import com.vci.client.common.oq.OQTool;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.provider.ApProvider;
import com.vci.client.oq.QTClient;
import com.vci.client.oq.QTDClient;
@@ -368,7 +369,7 @@
}
QTD[] qtdArray = null;
try {
- qtdArray = QTDClient.getService().getLinkTypeQTDs(typeName);
+ qtdArray = ServiceProvider.getOMDService().getQTDService().getLinkTypeQTDs(typeName);
} catch (VCIError e) {
e.printStackTrace();
}
@@ -395,7 +396,7 @@
}
QTD[] qtdArray = null;
try {
- qtdArray = QTDClient.getService().getBizTypeQTDs(typeName);
+ qtdArray = ServiceProvider.getOMDService().getQTDService().getBizTypeQTDs(typeName);
} catch (VCIError e) {
e.printStackTrace();
}
@@ -981,7 +982,7 @@
String QTname = values[0];
String attr = values[1].substring(0, values[1].length());
try {
- QTInfo qt = QTDClient.getService().getQT(QTname);
+ QTInfo qt = ServiceProvider.getOMDService().getQTDService().getQT(QTname);
String qtText = qt.qtText;
QueryTemplate qt_ = OQTool.getQTByQTText(qt.qtName, qtText);
List<String> clauseList = new ArrayList<String>();
@@ -1026,7 +1027,7 @@
String QTname = values[0];
String attr = values[1].substring(0, values[1].length());
try {
- QTInfo qt = QTDClient.getService().getQT(QTname);
+ QTInfo qt = ServiceProvider.getOMDService().getQTDService().getQT(QTname);
String qtText = qt.qtText;
QueryTemplate qt_ = OQTool.getQTByQTText(qt.qtName, qtText);
List<String> clauseList = new ArrayList<String>();
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/ExpLQTDialog.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/ExpLQTDialog.java
index 69e0c98..9984a4e 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/ExpLQTDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/ExpLQTDialog.java
@@ -28,6 +28,7 @@
import com.vci.corba.omd.ltm.LinkType;
import com.vci.corba.omd.qtm.QTInfo;
import com.vci.client.LogonApplication;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.framework.rightConfig.modelConfig.ModuleTreeCellRenderer;
import com.vci.client.omd.provider.LinkTypeProvider;
import com.vci.client.oq.QTClient;
@@ -74,7 +75,7 @@
for(int i=0; i<linkTypes.length; i++){
VCIBaseTreeNode node = new VCIBaseTreeNode(linkTypes[i].name, linkTypes[i]);
treeModel.insertNodeInto(node, rootNode, rootNode.getChildCount());
- QTInfo[] qtsByLinkTypeName = QTDClient.getService().getObjTypeQTs(linkTypes[i].name);
+ QTInfo[] qtsByLinkTypeName = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(linkTypes[i].name);
for(QTInfo qt: qtsByLinkTypeName){
VCIBaseTreeNode qtdNode = new VCIBaseTreeNode(qt.qtName,qt);
treeModel.insertNodeInto(qtdNode, node, node.getChildCount());
@@ -117,7 +118,7 @@
if(obj instanceof String){//濡傛灉鏄痳oot鑺傜偣锛屽垯淇濆瓨鎵�鏈夋ā鍧�
String nodeName = (String)obj;
if("root".equals(nodeName)){
- QTInfo[] allQTS = QTDClient.getService().getAllQTs();
+ QTInfo[] allQTS = ServiceProvider.getOMDService().getQTDService().getAllQTs();
LinkType[] linkTypes = LinkTypeProvider.getInstance().getLinkTypes();
List<String> linkNames = new ArrayList<String>();
for(LinkType link: linkTypes){
@@ -134,7 +135,7 @@
selQTS.add((QTInfo)obj);
}else if(obj instanceof LinkType){
LinkType linkType = (LinkType)obj;
- QTInfo[] qtdsByLinkTypeName = QTDClient.getService().getObjTypeQTs(linkType.name);
+ QTInfo[] qtdsByLinkTypeName = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(linkType.name);
Collections.addAll(selQTS, qtdsByLinkTypeName);
}
}
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/ExpQTDDialog.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/ExpQTDDialog.java
index 6fee629..6cde532 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/ExpQTDDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/ExpQTDDialog.java
@@ -28,6 +28,7 @@
import com.vci.corba.omd.ltm.LinkType;
import com.vci.corba.omd.qtm.QTD;
import com.vci.client.LogonApplication;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.framework.rightConfig.modelConfig.ModuleTreeCellRenderer;
import com.vci.client.omd.provider.BtmProvider;
import com.vci.client.omd.provider.LinkTypeProvider;
@@ -76,7 +77,7 @@
for(int i=0;i<allBtItems.length;i++){
VCIBaseTreeNode node = new VCIBaseTreeNode(allBtItems[i].name,allBtItems[i]);
treeModel.insertNodeInto(node, btmRoot, btmRoot.getChildCount());
- QTD[] qtdsByBtmName = QTDClient.getService().getBizTypeQTDs(allBtItems[i].name);
+ QTD[] qtdsByBtmName = ServiceProvider.getOMDService().getQTDService().getBizTypeQTDs(allBtItems[i].name);
for(QTD qtd: qtdsByBtmName){
VCIBaseTreeNode qtdNode = new VCIBaseTreeNode(qtd.name,qtd);
treeModel.insertNodeInto(qtdNode, node, node.getChildCount());
@@ -87,7 +88,7 @@
for(int i=0; i<linkTypes.length; i++){
VCIBaseTreeNode node = new VCIBaseTreeNode(linkTypes[i].name, linkTypes[i]);
treeModel.insertNodeInto(node, linkRoot, linkRoot.getChildCount());
- QTD[] qtdsByLinkTypeName = QTDClient.getService().getLinkTypeQTDs(linkTypes[i].name);
+ QTD[] qtdsByLinkTypeName = ServiceProvider.getOMDService().getQTDService().getLinkTypeQTDs(linkTypes[i].name);
for(QTD qtd: qtdsByLinkTypeName){
VCIBaseTreeNode qtdNode = new VCIBaseTreeNode(qtd.name,qtd);
treeModel.insertNodeInto(qtdNode, node, node.getChildCount());
@@ -130,24 +131,24 @@
if(obj instanceof String){//濡傛灉鏄痳oot鑺傜偣锛屽垯淇濆瓨鎵�鏈夋ā鍧�
String nodeName = (String)obj;
if("root".equals(nodeName)){
- QTD[] allQTDS = QTDClient.getService().getAllQTDs();
+ QTD[] allQTDS = ServiceProvider.getOMDService().getQTDService().getAllQTDs();
Collections.addAll(selQTDS, allQTDS);
}else if("btm".equals(nodeName)){
- QTD[] allBTMQTDS = QTDClient.getService().getAllBizTypeQTDs();
+ QTD[] allBTMQTDS = ServiceProvider.getOMDService().getQTDService().getAllBizTypeQTDs();
Collections.addAll(selQTDS, allBTMQTDS);
}else if("link".equals(nodeName)){
- QTD[] allLinkQTDS = QTDClient.getService().getAllLinkTypeQTDs();
+ QTD[] allLinkQTDS = ServiceProvider.getOMDService().getQTDService().getAllLinkTypeQTDs();
Collections.addAll(selQTDS, allLinkQTDS);
}
}else if(obj instanceof QTD){
selQTDS.add((QTD)obj);
}else if(obj instanceof BtmItem){
BtmItem btmItem = (BtmItem)obj;
- QTD[] qtdsByBtmName = QTDClient.getService().getBizTypeQTDs(btmItem.name);
+ QTD[] qtdsByBtmName = ServiceProvider.getOMDService().getQTDService().getBizTypeQTDs(btmItem.name);
Collections.addAll(selQTDS, qtdsByBtmName);
}else if(obj instanceof LinkType){
LinkType linkType = (LinkType)obj;
- QTD[] qtdsByLinkTypeName = QTDClient.getService().getLinkTypeQTDs(linkType.name);
+ QTD[] qtdsByLinkTypeName = ServiceProvider.getOMDService().getQTDService().getLinkTypeQTDs(linkType.name);
Collections.addAll(selQTDS, qtdsByLinkTypeName);
}
}
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/ExpQTDialog.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/ExpQTDialog.java
index 1d4f859..1902b55 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/ExpQTDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/ExpQTDialog.java
@@ -29,6 +29,7 @@
import com.vci.corba.omd.ltm.LinkType;
import com.vci.corba.omd.qtm.QTInfo;
import com.vci.client.LogonApplication;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.framework.rightConfig.modelConfig.ModuleTreeCellRenderer;
import com.vci.client.omd.provider.BtmProvider;
import com.vci.client.oq.QTClient;
@@ -74,7 +75,7 @@
for(int i=0;i<allBtItems.length;i++){
VCIBaseTreeNode node = new VCIBaseTreeNode(allBtItems[i].name,allBtItems[i]);
treeModel.insertNodeInto(node, rootNode, rootNode.getChildCount());
- QTInfo[] qtsByBtmName = QTDClient.getService().getObjTypeQTs(allBtItems[i].name);
+ QTInfo[] qtsByBtmName = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(allBtItems[i].name);
for(QTInfo qt: qtsByBtmName){
VCIBaseTreeNode qtNode = new VCIBaseTreeNode(qt.qtName,qt);
treeModel.insertNodeInto(qtNode, node, node.getChildCount());
@@ -117,7 +118,7 @@
if(obj instanceof String){//濡傛灉鏄痳oot鑺傜偣锛屽垯淇濆瓨鎵�鏈夋ā鍧�
String nodeName = (String)obj;
if("root".equals(nodeName)){
- QTInfo[] allQTS = QTDClient.getService().getAllQTs();
+ QTInfo[] allQTS = ServiceProvider.getOMDService().getQTDService().getAllQTs();
BtmItem[] allBtItems = BtmProvider.getInstance().getAllBtmItems();
List<String> btmNames = new ArrayList<String>();
for(BtmItem btm: allBtItems){
@@ -134,7 +135,7 @@
selQTS.add((QTInfo)obj);
}else if(obj instanceof BtmItem){
BtmItem btmItem = (BtmItem)obj;
- QTInfo[] qtsByBtmName = QTDClient.getService().getObjTypeQTs(btmItem.name);
+ QTInfo[] qtsByBtmName = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(btmItem.name);
Collections.addAll(selQTS, qtsByBtmName);
}
}
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/ImpQT.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/ImpQT.java
index 115276e..68287e7 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/ImpQT.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/ImpQT.java
@@ -14,6 +14,7 @@
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import com.vci.client.LogonApplication;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.oq.QTClient;
import com.vci.client.oq.QTDClient;
import com.vci.corba.omd.qtm.QTInfo;
@@ -58,9 +59,9 @@
}
System.out.println(qts.size());
for(QTInfo qt: qts){
- boolean isExist = QTDClient.getService().isExistsQT(qt.qtName);
+ boolean isExist = ServiceProvider.getOMDService().getQTDService().isExistsQT(qt.qtName);
if(!isExist){
- boolean isSuc = QTDClient.getService().saveQT(qt);
+ boolean isSuc = ServiceProvider.getOMDService().getQTDService().saveQT(qt);
}
}
return true;
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/ImpQTD.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/ImpQTD.java
index e8da59e..571d600 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/ImpQTD.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/ImpQTD.java
@@ -15,6 +15,7 @@
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import com.vci.client.LogonApplication;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.oq.QTDClient;
import com.vci.corba.omd.qtm.QTD;
@@ -57,9 +58,9 @@
}
System.out.println(qtds.size());
for(QTD qtd: qtds){
- boolean isExist = QTDClient.getService().isExistsQTD(qtd.name);
+ boolean isExist = ServiceProvider.getOMDService().getQTDService().isExistsQTD(qtd.name);
if(!isExist){
- boolean isSuc = QTDClient.getService().addQTD(qtd);
+ boolean isSuc = ServiceProvider.getOMDService().getQTDService().addQTD(qtd);
}
}
return true;
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/QTDPanel.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/QTDPanel.java
index 3421f93..937deea 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/QTDPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/QTDPanel.java
@@ -44,6 +44,7 @@
import com.vci.corba.omd.ltm.LinkType;
import com.vci.corba.omd.qtm.QTD;
import com.vci.client.common.oq.OQTool;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.btm.ui.BtmTree;
import com.vci.client.omd.btm.wrapper.BtmItemWrapper;
import com.vci.client.omd.linktype.LinkTypeTree;
@@ -552,7 +553,7 @@
}
boolean flag = false;
try {
- flag = QTDClient.getService().deleteQTD(qtdName);
+ flag = ServiceProvider.getOMDService().getQTDService().deleteQTD(qtdName);
} catch (VCIError e1) {
e1.printStackTrace();
}
@@ -663,7 +664,7 @@
qtd.abNames = abList.toArray(new String[0]);
boolean addFlag = false;
try {
- addFlag = QTDClient.getService().addQTD(qtd);
+ addFlag = ServiceProvider.getOMDService().getQTDService().addQTD(qtd);
} catch (VCIError e1) {
e1.printStackTrace();
}
@@ -691,7 +692,7 @@
qtd.abNames = abNameList.toArray(new String[0]);
boolean modifyFlag = false;
try {
- modifyFlag = QTDClient.getService().modifyQTD(qtd);
+ modifyFlag = ServiceProvider.getOMDService().getQTDService().modifyQTD(qtd);
} catch (VCIError e1) {
e1.printStackTrace();
}
@@ -788,7 +789,7 @@
return;
}
try {
- qtdArray = QTDClient.getService().getBizTypeQTDs(btmName);
+ qtdArray = ServiceProvider.getOMDService().getQTDService().getBizTypeQTDs(btmName);
} catch (VCIError e) {
e.printStackTrace();
}
@@ -805,7 +806,7 @@
return;
}
try {
- qtdArray = QTDClient.getService().getLinkTypeQTDs(linkTypeName);
+ qtdArray = ServiceProvider.getOMDService().getQTDService().getLinkTypeQTDs(linkTypeName);
} catch (VCIError e) {
e.printStackTrace();
}
@@ -938,7 +939,7 @@
String qtdName = name.toLowerCase();
try {
- if(QTDClient.getService().isExistsQTD(qtdName)){
+ if(ServiceProvider.getOMDService().getQTDService().isExistsQTD(qtdName)){
JOptionPane.showMessageDialog(this, "璇ユā鏉垮畾涔夊悕宸茬粡琚娇鐢�, 璇锋洿鎹�", "娉ㄦ剰", JOptionPane.WARNING_MESSAGE);
return false;
}
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/QTPanel.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/QTPanel.java
index fcdf722..b6d635b 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/QTPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/QTPanel.java
@@ -47,6 +47,7 @@
import com.vci.corba.omd.qtm.QTInfo;
import com.vci.client.LogonApplication;
import com.vci.client.common.oq.OQTool;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.btm.ui.BtmClient;
import com.vci.client.omd.btm.ui.BtmTree;
import com.vci.client.omd.btm.wrapper.BtmItemWrapper;
@@ -521,7 +522,7 @@
//TODO
qtWrapper.qtText = OQTool.qtTOXMl(qt).asXML();
try {
- saveFlag = QTDClient.getService().saveQT(qtWrapper);
+ saveFlag = ServiceProvider.getOMDService().getQTDService().saveQT(qtWrapper);
} catch (VCIError e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
@@ -603,7 +604,7 @@
@Override
public void actionPerformed(ActionEvent e) {
try {
- boolean f = QTDClient.getService().updateQT();
+ boolean f = ServiceProvider.getOMDService().getQTDService().updateQT();
if(f){
JOptionPane.showMessageDialog(QTPanel.getInstance(), "鏇存柊鎴愬姛", "鎴愬姛", JOptionPane.INFORMATION_MESSAGE);
}else{
@@ -649,7 +650,7 @@
if(selectedBtm != null){
QTInfo[] qtWrappers = null;
try {
- qtWrappers = QTDClient.getService().getObjTypeQTs(selectedBtm.name);
+ qtWrappers = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(selectedBtm.name);
} catch (VCIError e) {
// TODO Auto-generated catch block
e.printStackTrace();
@@ -682,7 +683,7 @@
private boolean isExists(String name){
boolean flag = true;
try {
- flag = QTDClient.getService().isExistsQT(name);
+ flag = ServiceProvider.getOMDService().getQTDService().isExistsQT(name);
} catch (VCIError e) {
e.printStackTrace();
}
@@ -705,7 +706,7 @@
}
}
try {
- flag = QTDClient.getService().deleteQTs(list.toArray(new String[0]));
+ flag = ServiceProvider.getOMDService().getQTDService().deleteQTs(list.toArray(new String[0]));
} catch (VCIError e) {
// TODO Auto-generated catch block
e.printStackTrace();
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/QTPanelForLink.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/QTPanelForLink.java
index dbf8288..bd08436 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/QTPanelForLink.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/QTPanelForLink.java
@@ -51,6 +51,7 @@
import com.vci.corba.omd.qtm.QTInfo;
import com.vci.client.LogonApplication;
import com.vci.client.common.oq.OQTool;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.linktype.LinkTypeStart;
import com.vci.client.omd.linktype.LinkTypeTree;
import com.vci.client.omd.linktype.LinkTypeWrapper;
@@ -556,7 +557,7 @@
//TODO
qtWrapper.qtText = OQTool.qtTOXMl(qt).asXML();
try {
- saveFlag = QTDClient.getService().saveQT(qtWrapper);
+ saveFlag = ServiceProvider.getOMDService().getQTDService().saveQT(qtWrapper);
} catch (VCIError e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
@@ -664,7 +665,7 @@
if(selectedLinkType != null){
QTInfo[] qtWrappers = null;
try {
- qtWrappers = QTDClient.getService().getObjTypeQTs(selectedLinkType.name);
+ qtWrappers = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(selectedLinkType.name);
} catch (VCIError e) {
// TODO Auto-generated catch block
e.printStackTrace();
@@ -697,7 +698,7 @@
private boolean isExists(String name){
boolean flag = true;
try {
- flag = QTDClient.getService().isExistsQT(name);
+ flag = ServiceProvider.getOMDService().getQTDService().isExistsQT(name);
} catch (VCIError e) {
e.printStackTrace();
}
@@ -720,7 +721,7 @@
}
}
try {
- flag = QTDClient.getService().deleteQTs(list.toArray(new String[0]));
+ flag = ServiceProvider.getOMDService().getQTDService().deleteQTs(list.toArray(new String[0]));
} catch (VCIError e) {
// TODO Auto-generated catch block
e.printStackTrace();
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/QTPanelForLink2.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/QTPanelForLink2.java
index c82799c..63668fa 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/QTPanelForLink2.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/QTPanelForLink2.java
@@ -47,6 +47,7 @@
import com.vci.corba.omd.qtm.QTInfo;
import com.vci.client.LogonApplication;
import com.vci.client.common.oq.OQTool;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.linktype.LinkTypeTree;
import com.vci.client.omd.linktype.LinkTypeWrapper;
import com.vci.client.oq.QTClient;
@@ -431,7 +432,7 @@
//TODO
qtWrapper.qtText = OQTool.qtTOXMl(qt).asXML();
try {
- saveFlag = QTDClient.getService().saveQT(qtWrapper);
+ saveFlag = ServiceProvider.getOMDService().getQTDService().saveQT(qtWrapper);
} catch (VCIError e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
@@ -513,7 +514,7 @@
if(selectedLinkType != null){
QTInfo[] qtWrappers = null;
try {
- qtWrappers = QTDClient.getService().getObjTypeQTs(selectedLinkType.name);
+ qtWrappers = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(selectedLinkType.name);
} catch (VCIError e) {
// TODO Auto-generated catch block
e.printStackTrace();
@@ -546,7 +547,7 @@
private boolean isExists(String name){
boolean flag = true;
try {
- flag = QTDClient.getService().isExistsQT(name);
+ flag = ServiceProvider.getOMDService().getQTDService().isExistsQT(name);
} catch (VCIError e) {
e.printStackTrace();
}
@@ -569,7 +570,7 @@
}
}
try {
- flag = QTDClient.getService().deleteQTs(list.toArray(new String[0]));
+ flag = ServiceProvider.getOMDService().getQTDService().deleteQTs(list.toArray(new String[0]));
} catch (VCIError e) {
// TODO Auto-generated catch block
e.printStackTrace();
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/SelectorQTDialog.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/SelectorQTDialog.java
index e06c36a..251bd31 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/SelectorQTDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/SelectorQTDialog.java
@@ -8,6 +8,7 @@
import java.util.LinkedHashMap;
import java.util.LinkedList;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.oq.QTClient;
import com.vci.client.oq.QTDClient;
import com.vci.client.ui.swing.VCIOptionPane;
@@ -104,7 +105,7 @@
@Override
public QTInfo[] getDatas(int arg0, int arg1) {
try {
- allQts = QTDClient.getService().getAllQTs();
+ allQts = ServiceProvider.getOMDService().getQTDService().getAllQTs();
} catch (VCIError e) {
e.printStackTrace();
//UIFUtils.showErrorMessage(ClientContextVariable.getFrame(), e); // modify by zgy 2015-02-13 [oq涓嶄笉寤鸿寮曠敤uif宸ョ▼]
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/export/QTExpQTStep1Panel.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/export/QTExpQTStep1Panel.java
index e61b9ad..21fa969 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/export/QTExpQTStep1Panel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/export/QTExpQTStep1Panel.java
@@ -25,6 +25,7 @@
import javax.swing.tree.TreePath;
import com.vci.client.LogonApplication;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.btm.ui.BtmClient;
import com.vci.client.oq.QTClient;
import com.vci.client.oq.QTDClient;
@@ -256,7 +257,7 @@
if (obj instanceof String) {// 濡傛灉鏄痳oot鑺傜偣锛屽垯淇濆瓨鎵�鏈夋ā鍧� 杩斿洖
String nodeName = (String) obj;
if ("涓氬姟绫诲瀷".equals(nodeName)) {
- QTInfo[] qts = QTDClient.getService().getAllQTs();
+ QTInfo[] qts = ServiceProvider.getOMDService().getQTDService().getAllQTs();
List<QTInfo> list = new ArrayList<QTInfo>();
for (QTInfo qtWrapper : qts) {
if (!BtmClient.getService().getBtmItemByName(qtWrapper.btmName).oid.equals("")) {
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/export/QTExportTree.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/export/QTExportTree.java
index 4769643..b292f70 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/export/QTExportTree.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/export/QTExportTree.java
@@ -17,6 +17,7 @@
import com.vci.corba.omd.btm.BtmItem;
import com.vci.corba.omd.qtm.QTInfo;
import com.vci.mw.ClientContextVariable;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.btm.ui.BtmClient;
import com.vci.client.oq.QTClient;
import com.vci.client.oq.QTDClient;
@@ -87,7 +88,7 @@
if (btmArray == null) {
btmItemName.clear();
btmArray = BtmClient.getService().getAllBtmItem("");
- qts = QTDClient.getService().getAllQTs();//鑾峰彇鎵�鏈夋煡璇㈡ā鏉�
+ qts = ServiceProvider.getOMDService().getQTDService().getAllQTs();//鑾峰彇鎵�鏈夋煡璇㈡ā鏉�
for (BtmItem element : btmArray) {
btmItemName.put(element.name,element);
}
@@ -130,7 +131,7 @@
private void filterBtmItem(BtmItem element) {
// TODO Auto-generated method stub
try {
- QTInfo[] qtWrappers = QTDClient.getService().getObjTypeQTs(element.name);
+ QTInfo[] qtWrappers = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(element.name);
if(qtWrappers.length==0){
String[] strings= BtmClient.getService().getChildrenNames(element.name);
if(strings.length == 0){
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtexport/LinkQTExpQTStep1Panel.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtexport/LinkQTExpQTStep1Panel.java
index f5f76b8..5163df5 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtexport/LinkQTExpQTStep1Panel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtexport/LinkQTExpQTStep1Panel.java
@@ -26,6 +26,7 @@
import javax.swing.tree.TreePath;
import com.vci.client.LogonApplication;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.linktype.LinkTypeStart;
import com.vci.client.oq.QTClient;
import com.vci.client.oq.QTDClient;
@@ -253,7 +254,7 @@
if (obj instanceof String) {// 濡傛灉鏄痳oot鑺傜偣锛屽垯淇濆瓨鎵�鏈夋ā鍧� 杩斿洖
String nodeName = (String) obj;
if ("涓氬姟绫诲瀷".equals(nodeName)) {
- QTInfo[] qts = QTDClient.getService().getAllQTs();
+ QTInfo[] qts = ServiceProvider.getOMDService().getQTDService().getAllQTs();
List<QTInfo> list = new ArrayList<QTInfo>();
for (QTInfo qtWrapper : qts) {
if (!LinkTypeStart.getService().getLinkType(qtWrapper.btmName).oid.equals("")) {
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtexport/LinkQTExportData.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtexport/LinkQTExportData.java
index 10660ca..745dbd4 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtexport/LinkQTExportData.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtexport/LinkQTExportData.java
@@ -7,6 +7,7 @@
import com.vci.corba.omd.ltm.LinkType;
import com.vci.corba.omd.qtm.QTD;
import com.vci.corba.omd.qtm.QTInfo;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.linktype.LinkTypeStart;
import com.vci.client.oq.QTDClient;
import com.vci.corba.common.VCIError;
@@ -81,7 +82,7 @@
selectedBtmItems.put(linkType.name, linkType);
// selectedBtmAttrs.put(linkType.name, BtmProvider.getInstance().getAbNames(linkType.name));
selectedBtmAttrs.put(linkType.name, linkType.attributes);
- allQTDs.put(linkType.name, QTDClient.getService().getLinkTypeQTDs(linkType.name));
+ allQTDs.put(linkType.name, ServiceProvider.getOMDService().getQTDService().getLinkTypeQTDs(linkType.name));
}
} catch (VCIError e1) {
// TODO Auto-generated catch block
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtexport/LinkQTExportTree.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtexport/LinkQTExportTree.java
index d50e382..42b8b6f 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtexport/LinkQTExportTree.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtexport/LinkQTExportTree.java
@@ -17,6 +17,7 @@
import com.vci.corba.omd.ltm.LinkType;
import com.vci.corba.omd.qtm.QTInfo;
import com.vci.mw.ClientContextVariable;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.linktype.LinkTypeStart;
import com.vci.client.oq.QTClient;
import com.vci.client.oq.QTDClient;
@@ -85,14 +86,14 @@
List<LinkType> es = new ArrayList<LinkType>();
linkTypes = LinkTypeStart.getService().getLinkTypes();
for (LinkType lt : linkTypes) {
- QTInfo[] qtWrappers = QTDClient.getService().getObjTypeQTs(lt.name);
+ QTInfo[] qtWrappers = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(lt.name);
if (qtWrappers.length!=0) {
es.add(lt);
}
}
linkTypes = es.toArray(new LinkType[es.size()]);
//TODO:闇�淇娌℃湁鍏宠仈鏌ヨ妯℃澘涓氬姟绫诲瀷鍘绘帀
- qts = QTDClient.getService().getAllQTs();//鑾峰彇鎵�鏈夋煡璇㈡ā鏉�
+ qts = ServiceProvider.getOMDService().getQTDService().getAllQTs();//鑾峰彇鎵�鏈夋煡璇㈡ā鏉�
}
DefaultTreeModel dtml = (DefaultTreeModel) this.getModel();
DefaultMutableTreeNode node = (DefaultMutableTreeNode) pathForRow
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtimport/LinkQTImpQTStep2Panel.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtimport/LinkQTImpQTStep2Panel.java
index f5e716b..5c7ab83 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtimport/LinkQTImpQTStep2Panel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtimport/LinkQTImpQTStep2Panel.java
@@ -19,6 +19,7 @@
import javax.swing.table.DefaultTableModel;
import com.vci.client.LogonApplication;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.oq.QTClient;
import com.vci.client.oq.QTDClient;
import com.vci.client.portal.UI.dialog.VCIGuideStepPanel;
@@ -188,7 +189,7 @@
for (Entry<String, QTD[]> entry : pLActions) {
QTD[] qtds = entry.getValue();
for (QTD qtd : qtds) {
- boolean success= QTDClient.getService().addQTD(qtd);
+ boolean success= ServiceProvider.getOMDService().getQTDService().addQTD(qtd);
if(!success){
VCIJOptionPane.showMessage(this, qtd.name+"瀵煎叆澶辫触锛�");
}
@@ -199,7 +200,7 @@
if(allQTs.size()!=0){
for (Entry<String, QTInfo> entry : pLQts) {
QTInfo qtWrapper = entry.getValue();
- boolean success = QTDClient.getService().saveQT(qtWrapper);
+ boolean success = ServiceProvider.getOMDService().getQTDService().saveQT(qtWrapper);
if(!success){
VCIJOptionPane.showMessage(this, qtWrapper.qtName+"瀵煎叆澶辫触锛�");
}
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtimport/LinkQTImportTree.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtimport/LinkQTImportTree.java
index ef888a6..9b15257 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtimport/LinkQTImportTree.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/linkqtimport/LinkQTImportTree.java
@@ -22,6 +22,7 @@
import javax.swing.tree.TreeSelectionModel;
import com.vci.client.LogonApplication;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.linktype.LinkTypeStart;
import com.vci.client.oq.QTClient;
import com.vci.client.oq.QTDClient;
@@ -329,7 +330,7 @@
*/
// TODO Auto-generated method stub
try {
- QTInfo[] qtws = QTDClient.getService().getAllQTs();
+ QTInfo[] qtws = ServiceProvider.getOMDService().getQTDService().getAllQTs();
boolean islaet = true;
for (int i = 0; i < qtws.length; i++) {
if (string.equals(qtws[i].qtName)) {
@@ -420,7 +421,7 @@
private void getPLQtIsInDB(String string, QTD[] qtds) {
// TODO Auto-generated method stub
try {
- QTD[] qtds2 = QTDClient.getService().getBizTypeQTDs(string);
+ QTD[] qtds2 = ServiceProvider.getOMDService().getQTDService().getBizTypeQTDs(string);
QTD[] qtdsNewQtds = null;
List<QTD> es = new ArrayList<QTD>();
for (QTD qtd : qtds) {
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/qtimport/QTImpQTStep2Panel.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/qtimport/QTImpQTStep2Panel.java
index a9d94d0..abb87a2 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/qtimport/QTImpQTStep2Panel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/qtimport/QTImpQTStep2Panel.java
@@ -19,6 +19,7 @@
import javax.swing.table.DefaultTableModel;
import com.vci.client.LogonApplication;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.oq.QTClient;
import com.vci.client.oq.QTDClient;
import com.vci.client.portal.UI.dialog.VCIGuideStepPanel;
@@ -189,7 +190,7 @@
for (Entry<String, QTD[]> entry : pLActions) {
QTD[] qtds = entry.getValue();
for (QTD qtd : qtds) {
- boolean success= QTDClient.getService().addQTD(qtd);
+ boolean success= ServiceProvider.getOMDService().getQTDService().addQTD(qtd);
if(!success){
VCIJOptionPane.showMessage(this, qtd.name+"瀵煎叆澶辫触锛�");
}
@@ -200,7 +201,7 @@
if(allQTs.size()!=0){
for (Entry<String, QTInfo> entry : pLQts) {
QTInfo qtWrapper = entry.getValue();
- boolean success = QTDClient.getService().saveQT(qtWrapper);
+ boolean success = ServiceProvider.getOMDService().getQTDService().saveQT(qtWrapper);
if(!success){
VCIJOptionPane.showMessage(this, qtWrapper.qtName+"瀵煎叆澶辫触锛�");
}
diff --git a/Source/Client/PLTClient/src/com/vci/client/oq/ui/qtimport/QTImportTree.java b/Source/Client/PLTClient/src/com/vci/client/oq/ui/qtimport/QTImportTree.java
index b4da46d..82ba1cc 100644
--- a/Source/Client/PLTClient/src/com/vci/client/oq/ui/qtimport/QTImportTree.java
+++ b/Source/Client/PLTClient/src/com/vci/client/oq/ui/qtimport/QTImportTree.java
@@ -31,6 +31,7 @@
import com.vci.corba.omd.qtm.QTD;
import com.vci.corba.omd.qtm.QTInfo;
import com.vci.client.LogonApplication;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.btm.ui.BtmClient;
import com.vci.client.omd.provider.BtmProvider;
import com.vci.client.oq.QTClient;
@@ -457,7 +458,7 @@
private void getPLQtWrapper(String string, QTInfo qtWrapper) {
// TODO Auto-generated method stub
try {
- QTInfo[] qtws = QTDClient.getService().getAllQTs();
+ QTInfo[] qtws = ServiceProvider.getOMDService().getQTDService().getAllQTs();
boolean islaet = true;
for (int i = 0; i < qtws.length; i++) {
if (string.equals(qtws[i].qtName)) {
@@ -561,7 +562,7 @@
private void getPLQtIsInDB(String string, QTD[] qtds) {
// TODO Auto-generated method stub
try {
- QTD[] qtds2 = QTDClient.getService().getBizTypeQTDs(string);
+ QTD[] qtds2 = ServiceProvider.getOMDService().getQTDService().getBizTypeQTDs(string);
QTD[] qtdsNewQtds = null;
List<QTD> es = new ArrayList<QTD>();
for (QTD qtd : qtds) {
diff --git a/Source/Client/PLTClient/src/com/vci/client/portal/Formdesign/FormDesignDialog.java b/Source/Client/PLTClient/src/com/vci/client/portal/Formdesign/FormDesignDialog.java
index da7c745..5a1345e 100644
--- a/Source/Client/PLTClient/src/com/vci/client/portal/Formdesign/FormDesignDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/portal/Formdesign/FormDesignDialog.java
@@ -53,6 +53,7 @@
import javax.swing.border.TitledBorder;
import com.vci.client.LogonApplication;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.btm.wrapper.BtmItemWrapper;
import com.vci.client.omd.linktype.LinkTypeWrapper;
import com.vci.client.omd.provider.BtmProvider;
@@ -842,7 +843,7 @@
btmName = ((LinkTypeWrapper) selectTreeNodeobject).linkType.name;
}
try {
- QTInfo[] qts = QTDClient.getService().getObjTypeQTs(btmName);
+ QTInfo[] qts = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(btmName);
for (QTInfo qt : qts) {
qtName.addItem(qt.qtName.trim());
}
@@ -1574,7 +1575,7 @@
private void fillQtNameCom() {
qtName.addItem("");
try {
- QTInfo[] qts = QTDClient.getService().getObjTypeQTs(otName);
+ QTInfo[] qts = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(otName);
for (QTInfo qt : qts) {
qtName.addItem(qt.qtName);
}
diff --git a/Source/Client/PLTClient/src/com/vci/client/portal/NewNewUI/buttonmng/ButtonInfoPanel.java b/Source/Client/PLTClient/src/com/vci/client/portal/NewNewUI/buttonmng/ButtonInfoPanel.java
index 2bd4671..a506144 100644
--- a/Source/Client/PLTClient/src/com/vci/client/portal/NewNewUI/buttonmng/ButtonInfoPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/portal/NewNewUI/buttonmng/ButtonInfoPanel.java
@@ -32,7 +32,7 @@
import com.vci.client.common.IconSelectDialog;
import com.vci.client.portal.NewNewUI.actionmng.ActionSelectDialog;
import com.vci.client.portal.utility.UITools;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.swing.VCISwingUtil;
import com.vci.client.ui.swing.components.VCIJButton;
import com.vci.client.ui.swing.components.VCIJIntegerTextField;
diff --git a/Source/Client/PLTClient/src/com/vci/client/portal/NewUI/UIDesinDialog.java b/Source/Client/PLTClient/src/com/vci/client/portal/NewUI/UIDesinDialog.java
index c223d39..1605aeb 100644
--- a/Source/Client/PLTClient/src/com/vci/client/portal/NewUI/UIDesinDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/portal/NewUI/UIDesinDialog.java
@@ -40,6 +40,7 @@
import com.vci.corba.portal.data.PLTabPage;
import com.vci.corba.portal.data.PortalVI;
import com.vci.client.LogonApplication;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.provider.BtmProvider;
import com.vci.client.omd.provider.LinkTypeProvider;
import com.vci.client.oq.QTClient;
@@ -2091,12 +2092,12 @@
}
tree_templateIdCom.removeAllItems();
if(linktypeFlage){
- QTInfo[] qts = QTDClient.getService().getObjTypeQTs(linkTypebtmName);
+ QTInfo[] qts = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(linkTypebtmName);
for(QTInfo qt : qts){
tree_templateIdCom.addItem(qt.qtName);
}
}else{
- QTInfo[] qts = QTDClient.getService().getObjTypeQTs(showtypebtmName);
+ QTInfo[] qts = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(showtypebtmName);
for(QTInfo qt : qts){
tree_templateIdCom.addItem(qt.qtName);
}
diff --git a/Source/Client/PLTClient/src/com/vci/client/portal/UI/UIDesinDialog.java b/Source/Client/PLTClient/src/com/vci/client/portal/UI/UIDesinDialog.java
index a263752..9e5c71c 100644
--- a/Source/Client/PLTClient/src/com/vci/client/portal/UI/UIDesinDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/portal/UI/UIDesinDialog.java
@@ -38,6 +38,7 @@
import com.vci.client.LogonApplication;
import com.vci.client.common.PinyinCommon;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.btm.ui.BtmClient;
import com.vci.client.omd.btm.wrapper.BtmItemWrapper;
import com.vci.client.omd.linktype.LinkTypeStart;
@@ -2860,7 +2861,7 @@
}
tree_templateIdCom.removeAllItems();
if(linktypeFlage){
- QTInfo[] qts = QTDClient.getService().getObjTypeQTs(linkTypebtmName);
+ QTInfo[] qts = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(linkTypebtmName);
qts = getSortedQTWrappers(qts);
for(QTInfo qt : qts){
tree_templateIdCom.addItem(qt.qtName);
@@ -2869,7 +2870,7 @@
txtTreeRootContent.setToolTipText("Link鍏崇郴鏋勬垚鏍戞牴鑺傜偣鏄剧ず鍙澶栬缃〃杈惧紡(鍏蜂綋鍙傝�僜"鏍戣妭鐐规樉绀篭"鐨勮〃杈惧紡瀹氫箟)锛屽涓嶈缃氨鎸夌収瀛愬瓩鑺傜偣涓�鏍锋樉绀�!");
tree_templateIdCom.setToolTipText("璇烽�夋嫨閾炬帴绫诲瀷[" + linkTypebtmName + "]鎵�瀵瑰簲鐨勬煡璇�");
}else{
- QTInfo[] qts = QTDClient.getService().getObjTypeQTs(showtypebtmName);
+ QTInfo[] qts = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(showtypebtmName);
qts = getSortedQTWrappers(qts);
for(QTInfo qt : qts){
tree_templateIdCom.addItem(qt.qtName);
diff --git a/Source/Client/PLTClient/src/com/vci/client/portal/UI/dialog/VCIGrandUIPanel.java b/Source/Client/PLTClient/src/com/vci/client/portal/UI/dialog/VCIGrandUIPanel.java
index 7dffbd1..1cf7dac 100644
--- a/Source/Client/PLTClient/src/com/vci/client/portal/UI/dialog/VCIGrandUIPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/portal/UI/dialog/VCIGrandUIPanel.java
@@ -47,7 +47,7 @@
import com.vci.client.framework.specialrole.ModuleInterface.IModuleShow;
import com.vci.client.portal.utility.UITools;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.process.QANProcessBar;
import com.vci.client.ui.process.QANProcessBarFrame;
diff --git a/Source/Client/PLTClient/src/com/vci/client/portal/platformPortal/ExportExcel.java b/Source/Client/PLTClient/src/com/vci/client/portal/platformPortal/ExportExcel.java
index 5664877..eb4d153 100644
--- a/Source/Client/PLTClient/src/com/vci/client/portal/platformPortal/ExportExcel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/portal/platformPortal/ExportExcel.java
@@ -17,6 +17,7 @@
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import com.vci.client.LogonApplication;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.provider.ApProvider;
import com.vci.client.omd.provider.BtmProvider;
import com.vci.client.omd.provider.LinkTypeProvider;
@@ -189,7 +190,7 @@
}
BufferedWriter qtbw = null;
try {
- QTInfo qt = QTDClient.getService().getQT(qtName);
+ QTInfo qt = ServiceProvider.getOMDService().getQTDService().getQT(qtName);
if(qt != null){
//鏌ヨ妯℃澘鍚嶇О
cell = row.createCell(6);
@@ -214,7 +215,7 @@
cell = row.createCell(8);
cell.setCellValue(qt.btmName);
}
- QTD[] qtdsByBtmName = QTDClient.getService().getBizTypeQTDs(btmname);
+ QTD[] qtdsByBtmName = ServiceProvider.getOMDService().getQTDService().getBizTypeQTDs(btmname);
for(int qtdIndex =0;qtdIndex<qtdsByBtmName.length;qtdIndex++){
HSSFRow qtdRow = qtdSheet.createRow(qtdIndex);
QTD qtd = qtdsByBtmName[qtdIndex];
@@ -235,7 +236,7 @@
qtdCell.setCellValue(qtdattr.substring(0,qtdattr.length()-1));
}
}
- QTD[] qtdsByLinkTypeName = QTDClient.getService().getLinkTypeQTDs(linkname);
+ QTD[] qtdsByLinkTypeName = ServiceProvider.getOMDService().getQTDService().getLinkTypeQTDs(linkname);
for(int qtdLinkIndex =0;qtdLinkIndex<qtdsByLinkTypeName.length;qtdLinkIndex++){
HSSFRow qtdRow = qtdSheet.createRow(qtdLinkIndex);
QTD qtd = qtdsByLinkTypeName[qtdLinkIndex];
diff --git a/Source/Client/PLTClient/src/com/vci/client/portal/platformPortal/ImportExcel.java b/Source/Client/PLTClient/src/com/vci/client/portal/platformPortal/ImportExcel.java
index 04dc7f5..e0c6c59 100644
--- a/Source/Client/PLTClient/src/com/vci/client/portal/platformPortal/ImportExcel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/portal/platformPortal/ImportExcel.java
@@ -20,6 +20,7 @@
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import com.vci.client.LogonApplication;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.btm.wrapper.BtmItemWrapper;
import com.vci.client.omd.linktype.LinkTypeWrapper;
import com.vci.client.omd.provider.ApProvider;
@@ -235,10 +236,10 @@
readcell = readrow.getCell(8);
String qtBtmName = readcell.getStringCellValue();
qt.btmName = qtBtmName;
- QTInfo qt2 = QTDClient.getService().getQT(
+ QTInfo qt2 = ServiceProvider.getOMDService().getQTDService().getQT(
qt.qtName);
if (qt2 == null) {
- QTDClient.getService().saveQT(qt);
+ ServiceProvider.getOMDService().getQTDService().saveQT(qt);
}
}
}
@@ -405,10 +406,10 @@
String qtBtmName = readcell
.getStringCellValue();
qt.btmName = qtBtmName;
- QTInfo qt2 = QTDClient.getService()
+ QTInfo qt2 = ServiceProvider.getOMDService().getQTDService()
.getQT(qt.qtName);
if (qt2 == null) {
- QTDClient.getService().saveQT(qt);
+ ServiceProvider.getOMDService().getQTDService().saveQT(qt);
}
}
}
@@ -427,8 +428,8 @@
* cell = readrow.getCell(3); String attrValue =
* cell.getStringCellValue(); String[] split =
* attrValue.split(","); qtd.abNames = split; QTD qtdByName =
- * QTDClient.getService().getQTDByName(qtd.name);
- * if(qtdByName==null){ QTDClient.getService().addQTD(qtd); } }
+ * ServiceProvider.getOMDService().getQTDService().getQTDByName(qtd.name);
+ * if(qtdByName==null){ ServiceProvider.getOMDService().getQTDService().addQTD(qtd); } }
*/
if (checkPortalVI.length() > 0) {
// VCIOptionPane.showMessage(LogonApplication.frame,
diff --git a/Source/Client/PLTClient/src/com/vci/client/portal/platformPortal/TableDialog.java b/Source/Client/PLTClient/src/com/vci/client/portal/platformPortal/TableDialog.java
index 7cdf173..4483db9 100644
--- a/Source/Client/PLTClient/src/com/vci/client/portal/platformPortal/TableDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/portal/platformPortal/TableDialog.java
@@ -39,6 +39,7 @@
import com.vci.client.LogonApplication;
import com.vci.client.common.ConfigUtils;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.btm.wrapper.BtmItemWrapper;
import com.vci.client.omd.linktype.LinkTypeWrapper;
import com.vci.client.oq.QTClient;
@@ -1606,7 +1607,7 @@
btmName = ((LinkTypeWrapper)selectNodeObject).linkType.name;
}
try {
- QTInfo[] qts = QTDClient.getService().getObjTypeQTs(btmName);
+ QTInfo[] qts = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(btmName);
for(QTInfo qt : qts){
qtnameCom.addItem(qt.qtName.trim());
}
@@ -1978,7 +1979,7 @@
}
qtnameCom.addItem("");
try {
- QTInfo[] qts = QTDClient.getService().getObjTypeQTs(btmName);
+ QTInfo[] qts = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(btmName);
for(QTInfo qt : qts){
qtnameCom.addItem(qt.qtName.trim());
}
diff --git a/Source/Client/PLTClient/src/com/vci/client/portal/utility/DataModelFactory.java b/Source/Client/PLTClient/src/com/vci/client/portal/utility/DataModelFactory.java
index 1a5c7ac..0d8c45c 100644
--- a/Source/Client/PLTClient/src/com/vci/client/portal/utility/DataModelFactory.java
+++ b/Source/Client/PLTClient/src/com/vci/client/portal/utility/DataModelFactory.java
@@ -26,6 +26,7 @@
import com.vci.corba.portal.data.PortalVI;
import com.vci.corba.query.data.RefPath;
import com.vci.client.common.oq.OQTool;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.provider.ApProvider;
import com.vci.client.omd.provider.EnumProvider;
import com.vci.client.oq.QTClient;
@@ -132,7 +133,7 @@
PortalVI p = UITools.getService().getPortalVIById(datagridId);
PRM prm = UITools.getPRM(p.prm);
String queryTemplate = prm.getPrmItemList().get(0).getItemQtName();
- QTInfo wrapper = QTDClient.getService().getQT(queryTemplate);
+ QTInfo wrapper = ServiceProvider.getOMDService().getQTDService().getQT(queryTemplate);
QueryTemplate qt = OQTool.getQTByDoc(DocumentHelper.parseText(wrapper.qtText), queryTemplate);
QueryTemplate qt_ = OQTool.replaceQTValues(qt, replaceMap);
int total = (int)QTClient.getService().findTotalCount(qt_.getId(),OQTool.qtTOXMl(qt_).asXML());
@@ -143,7 +144,7 @@
PortalVI p = UITools.getService().getPortalVIById(datagridId);
PRM prm = UITools.getPRM(p.prm);
String queryTemplate = prm.getPrmItemList().get(0).getItemQtName();
- QTInfo wrapper = QTDClient.getService().getQT(queryTemplate);
+ QTInfo wrapper = ServiceProvider.getOMDService().getQTDService().getQT(queryTemplate);
QueryTemplate qt = OQTool.getQTByDoc(DocumentHelper.parseText(wrapper.qtText), queryTemplate);
QueryTemplate qt_ = OQTool.replaceQTValues(qt, replaceMap);
if (conditionsMap != null && conditionsMap.size() > 0) {
@@ -463,7 +464,7 @@
Map<String, Map<String, String>> rowRefMap, List<Map<String, String>> listMap, Map<String, String> replaceMap, Map<String, List<String>> selectValues,
Map<String, String> conditions, Map<String, String> orderMap, Map<String, String> columnTypeMap) throws VCIError, DocumentException {
- QTInfo wrapper = QTDClient.getService().getQT(queryTemplate);
+ QTInfo wrapper = ServiceProvider.getOMDService().getQTDService().getQT(queryTemplate);
//鏌ヨ鏁版嵁
Map<String, String> map = null;
diff --git a/Source/Client/PLTClient/src/com/vci/client/portal/utility/DataModelProcessor.java b/Source/Client/PLTClient/src/com/vci/client/portal/utility/DataModelProcessor.java
index e1f6f53..a857cd6 100644
--- a/Source/Client/PLTClient/src/com/vci/client/portal/utility/DataModelProcessor.java
+++ b/Source/Client/PLTClient/src/com/vci/client/portal/utility/DataModelProcessor.java
@@ -11,6 +11,7 @@
import org.dom4j.DocumentHelper;
import com.vci.client.common.oq.OQTool;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.oq.QTClient;
import com.vci.client.oq.QTDClient;
import com.vci.client.portal.constants.QueryConditionConstants;
@@ -631,7 +632,7 @@
public LinkObject[] getLinkObjectByQueryTemplate(String queryTemplate, Map<String, String> replaceMap) throws VCIError, DocumentException {
LinkObject[] linkObjects = null;
try{
- QTInfo wrapper = QTDClient.getService().getQT(queryTemplate);
+ QTInfo wrapper = ServiceProvider.getOMDService().getQTDService().getQT(queryTemplate);
QueryTemplate qt = OQTool.getQTByDoc(DocumentHelper.parseText(wrapper.qtText), queryTemplate);
PageInfo pageInfo = null;
if(replaceMap.containsKey(QueryConditionConstants.PAGESIZE) && replaceMap.containsKey(QueryConditionConstants.PAGENO)){
@@ -746,7 +747,7 @@
QueryTemplate qt_ = null;
try
{
- QTInfo wrapper = QTDClient.getService().getQT(queryTemplate);
+ QTInfo wrapper = ServiceProvider.getOMDService().getQTDService().getQT(queryTemplate);
QueryTemplate qt = OQTool.getQTByDoc(DocumentHelper.parseText(wrapper.qtText), queryTemplate);
PageInfo pageInfo = null;
if(replaceMap != null && replaceMap.containsKey(QueryConditionConstants.PAGESIZE) && replaceMap.containsKey(QueryConditionConstants.PAGENO)){
@@ -794,7 +795,7 @@
QueryTemplate qt_ = null;
try
{
- QTInfo wrapper = QTDClient.getService().getQT(queryTemplate);
+ QTInfo wrapper = ServiceProvider.getOMDService().getQTDService().getQT(queryTemplate);
QueryTemplate qt = OQTool.getQTByDoc(DocumentHelper.parseText(wrapper.qtText), queryTemplate);
qt_ = OQTool.replaceQTValues(qt, replaceMap);
if (conditionMap != null && conditionMap.size() > 0) {
@@ -834,7 +835,7 @@
QueryTemplate qt_ = null;
try
{
- QTInfo wrapper = QTDClient.getService().getQT(queryTemplate);
+ QTInfo wrapper = ServiceProvider.getOMDService().getQTDService().getQT(queryTemplate);
QueryTemplate qt = OQTool.getQTByDoc(DocumentHelper.parseText(wrapper.qtText), queryTemplate);
qt_ = OQTool.replaceQTValues(qt, replaceMap);
if (conditionMap != null && conditionMap.size() > 0) {
@@ -865,7 +866,7 @@
QueryTemplate qt_ = null;
try
{
- QTInfo wrapper = QTDClient.getService().getQT(queryTemplate);
+ QTInfo wrapper = ServiceProvider.getOMDService().getQTDService().getQT(queryTemplate);
QueryTemplate qt = OQTool.getQTByDoc(DocumentHelper.parseText(wrapper.qtText), queryTemplate);
qt_ = OQTool.replaceQTValues(qt, replaceMap);
if (conditionMap != null && conditionMap.size() > 0) {
@@ -906,7 +907,7 @@
BusinessObject[] v = null;
try
{
- QTInfo wrapper = QTDClient.getService().getQT(queryTemplate);
+ QTInfo wrapper = ServiceProvider.getOMDService().getQTDService().getQT(queryTemplate);
if (replaceMap != null && replaceMap.size() > 0){
QueryTemplate qt = OQTool.getQTByDoc(DocumentHelper.parseText(wrapper.qtText), queryTemplate);
PageInfo pageInfo = null;
diff --git a/Source/Client/PLTClient/src/com/vci/client/portal/utility/TableDataUtil.java b/Source/Client/PLTClient/src/com/vci/client/portal/utility/TableDataUtil.java
index 11fcdc8..89ae603 100644
--- a/Source/Client/PLTClient/src/com/vci/client/portal/utility/TableDataUtil.java
+++ b/Source/Client/PLTClient/src/com/vci/client/portal/utility/TableDataUtil.java
@@ -32,9 +32,9 @@
import com.vci.corba.query.data.RefPath;
import com.vci.omd.utils.ObjectTool;
import com.vci.client.common.oq.OQTool;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.attribpool.ui.APClient;
import com.vci.client.omd.btm.ui.BtmClient;
-import com.vci.client.omd.enumManager.ui.EnumClient;
import com.vci.client.omd.linktype.LinkTypeStart;
import com.vci.client.omd.statepool.StatePoolStart;
import com.vci.client.oq.QTClient;
@@ -1065,7 +1065,7 @@
try {
// if(enumItemMap.size() == 0){
String filter = enumName;
- EnumItem[] enumItems = EnumClient.getService().getEmItems(filter, 1, 1);
+ EnumItem[] enumItems = ServiceProvider.getOMDService().getEnumService().getEmItems(filter, 1, 1);
for(EnumItem ei : enumItems){
// enumItemMap.put(ei.name, ei);
diff --git a/Source/Client/PLTClient/src/com/vci/client/portal/utility/TableDataUtilNew.java b/Source/Client/PLTClient/src/com/vci/client/portal/utility/TableDataUtilNew.java
index a3df38a..4bfc48f 100644
--- a/Source/Client/PLTClient/src/com/vci/client/portal/utility/TableDataUtilNew.java
+++ b/Source/Client/PLTClient/src/com/vci/client/portal/utility/TableDataUtilNew.java
@@ -14,6 +14,7 @@
import com.vci.corba.query.data.RefPath;
import com.vci.omd.utils.ObjectTool;
import com.vci.client.common.oq.OQTool;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.oq.QTClient;
import com.vci.client.oq.QTDClient;
import com.vci.client.portal.custom.ICustomDefine;
@@ -80,7 +81,7 @@
QueryTemplate qt_ = null;
try
{
- QTInfo wrapper = QTDClient.getService().getQT(queryTemplate);
+ QTInfo wrapper = ServiceProvider.getOMDService().getQTDService().getQT(queryTemplate);
QueryTemplate qt = OQTool.getQTByDoc(DocumentHelper.parseText(wrapper.qtText), queryTemplate);
qt_ = OQTool.replaceQTValues(qt, replaceMap);
if (conditionMap != null && conditionMap.size() > 0) {
diff --git a/Source/Client/PLTClient/src/com/vci/client/tool/dialog/UIContexBuilderWrapperDialog.java b/Source/Client/PLTClient/src/com/vci/client/tool/dialog/UIContexBuilderWrapperDialog.java
index ca58bf3..bacba5b 100644
--- a/Source/Client/PLTClient/src/com/vci/client/tool/dialog/UIContexBuilderWrapperDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/tool/dialog/UIContexBuilderWrapperDialog.java
@@ -29,6 +29,7 @@
import com.vci.corba.omd.atm.AttribItem;
import com.vci.corba.omd.qtm.QTInfo;
import com.vci.mw.ClientContextVariable;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.btm.wrapper.BtmItemWrapper;
import com.vci.client.omd.linktype.LinkTypeWrapper;
import com.vci.client.oq.QTClient;
@@ -213,7 +214,7 @@
DefaultComboBoxModel model2 = new DefaultComboBoxModel();
try {
String btmName = getBtmName();
- QTInfo[] qts = QTDClient.getService().getObjTypeQTs(btmName);
+ QTInfo[] qts = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(btmName);
for(QTInfo qt : qts){
model.addElement(new QTWrapperEx(qt));
model2.addElement(new QTWrapperEx(qt));
diff --git a/Source/Client/PLTClient/src/com/vci/client/ui/date/PopupCalendarMethod.java b/Source/Client/PLTClient/src/com/vci/client/ui/date/PopupCalendarMethod.java
index 57eb9ef..c2f39e9 100644
--- a/Source/Client/PLTClient/src/com/vci/client/ui/date/PopupCalendarMethod.java
+++ b/Source/Client/PLTClient/src/com/vci/client/ui/date/PopupCalendarMethod.java
@@ -7,7 +7,7 @@
import javax.swing.JButton;
import javax.swing.JComboBox;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.swing.components.VCIJComboBox;
/***
diff --git a/Source/Client/PLTClient/src/com/vci/client/ui/date/PopupCalendarPanel.java b/Source/Client/PLTClient/src/com/vci/client/ui/date/PopupCalendarPanel.java
index 5395bf3..dfc3867 100644
--- a/Source/Client/PLTClient/src/com/vci/client/ui/date/PopupCalendarPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/ui/date/PopupCalendarPanel.java
@@ -36,7 +36,7 @@
import org.apache.commons.lang3.StringUtils;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.swing.components.VCIJComboBox;
/**
diff --git a/Source/Client/PLTClient/src/com/vci/client/ui/excel/ExcelDocumentUtils.java b/Source/Client/PLTClient/src/com/vci/client/ui/excel/ExcelDocumentUtils.java
index 88f9cca..f048a43 100644
--- a/Source/Client/PLTClient/src/com/vci/client/ui/excel/ExcelDocumentUtils.java
+++ b/Source/Client/PLTClient/src/com/vci/client/ui/excel/ExcelDocumentUtils.java
@@ -23,7 +23,7 @@
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import com.vci.client.ui.excel.ExcelFileOperation;
+import com.vci.client.utils.excel.ExcelFileOperation;
import com.vci.corba.common.VCIError;
public class ExcelDocumentUtils {
diff --git a/Source/Client/PLTClient/src/com/vci/client/ui/image/BundleImage.java b/Source/Client/PLTClient/src/com/vci/client/ui/image/BundleImage.java
new file mode 100644
index 0000000..b517f5b
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/ui/image/BundleImage.java
@@ -0,0 +1,66 @@
+package com.vci.client.ui.image;
+
+import javax.swing.ImageIcon;
+
+public class BundleImage {
+
+private String path = "/resource/images/"; //the path of images's folder
+
+ public BundleImage()
+ {
+ }
+
+
+ public String getPath() {
+ return this.path;
+ }
+
+ /**
+ * set the path of image's folder, or use the default
+ *
+ * @param path
+ */
+ public void setPath(String path) {
+ this.path = path;
+ }
+
+ /**
+ * create a new ImageIcon and return it
+ *
+ * @param fileName
+ * @return
+ */
+ public ImageIcon createImageIcon(String fileName){
+ ImageIcon icon = new ImageIcon("");
+ if (fileName == null || fileName.length() == 0) {
+ return icon;
+ }
+ if (path == null || path.length() == 0) {
+ return icon;
+ }
+ try {
+ icon = new ImageIcon(BundleImage.class.getResource(path + fileName));
+ } catch (Exception e) {
+ }
+ return icon;
+ }
+
+ /**
+ * create a new ImageIcon and return it
+ *
+ * @param filePath
+ * @return
+ */
+ public ImageIcon createImageIconByPath(String filePath){
+ ImageIcon icon = new ImageIcon("");
+ if (filePath == null || filePath.length() == 0) {
+ return icon;
+ }
+
+ try {
+ icon = new ImageIcon(BundleImage.class.getResource(filePath));
+ } catch (Exception e) {
+ }
+ return icon;
+ }
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/ui/swing/CheckBoxLabel.java b/Source/Client/PLTClient/src/com/vci/client/ui/swing/CheckBoxLabel.java
index f49b9c3..39047cd 100644
--- a/Source/Client/PLTClient/src/com/vci/client/ui/swing/CheckBoxLabel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/ui/swing/CheckBoxLabel.java
@@ -3,7 +3,7 @@
import javax.swing.ImageIcon;
import javax.swing.JLabel;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
/**
*
diff --git a/Source/Client/PLTClient/src/com/vci/client/ui/swing/KJButton.java b/Source/Client/PLTClient/src/com/vci/client/ui/swing/KJButton.java
index 9ed373d..1be595c 100644
--- a/Source/Client/PLTClient/src/com/vci/client/ui/swing/KJButton.java
+++ b/Source/Client/PLTClient/src/com/vci/client/ui/swing/KJButton.java
@@ -2,7 +2,7 @@
import javax.swing.JButton;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
public class KJButton extends JButton{
diff --git a/Source/Client/PLTClient/src/com/vci/client/ui/swing/VCISwingUtil.java b/Source/Client/PLTClient/src/com/vci/client/ui/swing/VCISwingUtil.java
index 6232750..1ab632b 100644
--- a/Source/Client/PLTClient/src/com/vci/client/ui/swing/VCISwingUtil.java
+++ b/Source/Client/PLTClient/src/com/vci/client/ui/swing/VCISwingUtil.java
@@ -35,15 +35,11 @@
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.plaf.FontUIResource;
-import org.springframework.core.io.Resource;
-import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
-import org.springframework.core.io.support.ResourcePatternResolver;
-
-import com.vci.client.ui.excel.ExcelFileOperation;
import com.vci.client.ui.swing.components.VCIJButton;
import com.vci.client.ui.swing.components.VCIJLabel;
import com.vci.client.ui.swing.components.VCIJMenuItem;
import com.vci.client.ui.swing.components.VCIJOptionPane;
+import com.vci.client.utils.excel.ExcelFileOperation;
import edu.stanford.smi.protege.util.LookAndFeelUtil;
@@ -203,23 +199,34 @@
public static String[] getImages() {
try {
- ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
+ //ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
- Resource[] resources = resourceResolver.getResources("resource/images/*.*");
+ //Resource[] resources = resourceResolver.getResources("resource/images/*.*");
+
+ String path = "resource/images/*.*";
+ Enumeration<?> urlEnumeration = VCISwingUtil.class.getClassLoader().getResources(path);
List<String> lstImage = new ArrayList<String>();
- for (int i = 0; i < resources.length; i++) {
- String name = resources[i].getFilename();
+ while (urlEnumeration.hasMoreElements()) {
+ URL url = (URL)urlEnumeration.nextElement();
+ File file = new File(url.toString());
+ String name = file.getName();
lstImage.add(name);
}
+
+// for (int i = 0; i < resources.length; i++) {
+// String name = resources[i].getFilename();
+// lstImage.add(name);
+// }
return lstImage.toArray(new String[0]);
} catch (IOException e) {
- // TODO Auto-generated catch block
e.printStackTrace();
}
return new String[0];
}
+
+
/**
*
* <p>Description: </p>
diff --git a/Source/Client/PLTClient/src/com/vci/client/ui/swing/components/table/export/VCIJTablePanelExportFilterDialogActionListener.java b/Source/Client/PLTClient/src/com/vci/client/ui/swing/components/table/export/VCIJTablePanelExportFilterDialogActionListener.java
index c91e0f2..6da2e63 100644
--- a/Source/Client/PLTClient/src/com/vci/client/ui/swing/components/table/export/VCIJTablePanelExportFilterDialogActionListener.java
+++ b/Source/Client/PLTClient/src/com/vci/client/ui/swing/components/table/export/VCIJTablePanelExportFilterDialogActionListener.java
@@ -11,7 +11,6 @@
import javax.swing.DefaultListModel;
-import com.vci.client.ui.excel.ExcelFileOperation;
import com.vci.client.ui.process.QANProcessBar;
import com.vci.client.ui.process.QANProcessBarFrame;
import com.vci.client.ui.swing.VCISwingUtil;
@@ -20,6 +19,7 @@
import com.vci.client.ui.swing.components.VCIJOptionPane;
import com.vci.client.ui.swing.components.table.VCIJTableNode;
import com.vci.client.ui.swing.components.table.VCIJTablePanel;
+import com.vci.client.utils.excel.ExcelFileOperation;
/**
*
diff --git a/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/AbstractBatchBusionessOperationAction.java b/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/AbstractBatchBusionessOperationAction.java
index a1de754..8e1ae03 100644
--- a/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/AbstractBatchBusionessOperationAction.java
+++ b/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/AbstractBatchBusionessOperationAction.java
@@ -9,10 +9,10 @@
import javax.swing.JOptionPane;
-import com.vci.client.auth2.utils.RightManagerHelper;
import com.vci.client.bof.ClientBusinessObject;
import com.vci.client.bof.ClientLinkObject;
import com.vci.client.common.ConfigUtils;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.logon.base.TabPanelManage;
import com.vci.client.omd.provider.BtmProvider;
import com.vci.client.portal.utility.DataModelFactory;
@@ -741,7 +741,7 @@
params.objectroid = revisionOid;
params.businesstype = btmName;
params.objectoid = oid;
- String where = RightManagerHelper.getFrameworkService().checkRight(params);
+ String where = ServiceProvider.getFrameService().checkRight(params);
String[] ops = where.split(":");
String msg = "0";
//TODO 闇�瑕佸鐞� query 绫诲瀷鐨勬搷浣滐紝鏉冮檺瀹氫箟锛堣繑鍥炴暟鎹牸锛変笉涓�鏍风殑闂
diff --git a/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/DataRightReturnNameUtil.java b/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/DataRightReturnNameUtil.java
index 5f2a5c7..952b989 100644
--- a/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/DataRightReturnNameUtil.java
+++ b/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/DataRightReturnNameUtil.java
@@ -3,6 +3,7 @@
import com.vci.client.auth2.utils.RightManagerHelper;
import com.vci.client.bof.ClientBusinessObject;
import com.vci.client.bof.ClientLinkObject;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.uif.engine.common.GlobalContextParam;
import com.vci.client.uif.engine.common.IDataNode;
import com.vci.corba.framework.data.CheckValue;
@@ -226,7 +227,7 @@
params.objectroid = revisionOid;
params.businesstype = btmName;
params.objectoid = oid;
- String where = RightManagerHelper.getFrameworkService().checkRight(params);
+ String where = ServiceProvider.getFrameService().checkRight(params);
String[] ops = where.split(":");
String msg = "0";
//TODO 闇�瑕佸鐞� query 绫诲瀷鐨勬搷浣滐紝鏉冮檺瀹氫箟锛堣繑鍥炴暟鎹牸锛変笉涓�鏍风殑闂
diff --git a/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/DataRightUtil.java b/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/DataRightUtil.java
index 98ab1ae..ff08c73 100644
--- a/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/DataRightUtil.java
+++ b/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/DataRightUtil.java
@@ -1,22 +1,17 @@
package com.vci.client.uif.actions.client;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
-import org.apache.commons.lang3.StringUtils;
-
-import com.vci.client.auth2.utils.RightManagerHelper;
import com.vci.client.bof.ClientBusinessObject;
import com.vci.client.bof.ClientLinkObject;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.uif.actions.client.BusinessOperationAction.ValueType;
import com.vci.client.uif.engine.client.IDataModel;
-import com.vci.client.uif.engine.common.GlobalContextParam;
import com.vci.client.uif.engine.common.IDataNode;
import com.vci.corba.framework.data.CheckValue;
import com.vci.corba.common.VCIError;
import com.vci.corba.common.data.VCIInvocationInfo;
-import com.vci.mw.ClientContextVariable;
import com.vci.mw.InvocationUtility;
/**
@@ -242,7 +237,7 @@
//System.out.println("objectroid:" + params.objectroid);
//System.out.println("businesstype:" + params.businesstype);
//System.out.println("objectoid:" + params.objectoid);
- String where = RightManagerHelper.getFrameworkService().checkRight(params);
+ String where = ServiceProvider.getFrameService().checkRight(params);
//System.out.println("checkResult where :" + where);
//System.out.println("==========================================");
diff --git a/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/ImportBOAction.java b/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/ImportBOAction.java
index a3cf28b..f37bad3 100644
--- a/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/ImportBOAction.java
+++ b/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/ImportBOAction.java
@@ -5,7 +5,7 @@
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
-import com.vci.client.utils.excel.ImportDataTool;
+import com.vci.client.utils.ImportDataTool;
import com.vci.mw.ClientContextVariable;
/**
diff --git a/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/ImportLOAction.java b/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/ImportLOAction.java
index 61eea7b..1475989 100644
--- a/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/ImportLOAction.java
+++ b/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/ImportLOAction.java
@@ -8,7 +8,7 @@
import com.vci.client.bof.ClientLinkObject;
import com.vci.client.uif.engine.common.IDataNode;
-import com.vci.client.utils.excel.ImportDataTool;
+import com.vci.client.utils.ImportDataTool;
import com.vci.corba.omd.data.LinkObject;
import com.vci.mw.ClientContextVariable;
diff --git a/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/UIFUtils.java b/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/UIFUtils.java
index b465a69..85a9739 100644
--- a/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/UIFUtils.java
+++ b/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/UIFUtils.java
@@ -8,7 +8,6 @@
import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
-import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -35,17 +34,14 @@
import com.vci.client.common.FreemarkerParamObject;
import com.vci.client.common.PositionMessager;
import com.vci.client.common.oq.OQTool;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.attribpool.ui.APClient;
import com.vci.client.omd.btm.ui.BtmClient;
-import com.vci.client.omd.enumManager.ui.EnumClient;
import com.vci.client.omd.lifecycle.LifeCycleStart;
import com.vci.client.oq.QTClient;
import com.vci.client.oq.QTDClient;
import com.vci.client.portal.utility.PRM;
import com.vci.client.portal.utility.PRMItem;
-import com.vci.client.ui.excel.ExcelCellStyleSettingCallback;
-import com.vci.client.ui.excel.ExcelFileOperation;
-import com.vci.client.ui.excel.WorkboolStyleSetting;
import com.vci.client.ui.exception.VCIException;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
@@ -55,8 +51,11 @@
import com.vci.client.uif.engine.client.combobox.IComboBoxDataProvider;
import com.vci.client.uif.engine.common.IDataNode;
import com.vci.client.uif.engine.common.UIFUtilsCommon;
+import com.vci.client.utils.excel.ExcelCellStyleSettingCallback;
import com.vci.client.utils.excel.ExcelDocumentUtils;
+import com.vci.client.utils.excel.ExcelFileOperation;
import com.vci.client.utils.excel.SheetDataSet;
+import com.vci.client.utils.excel.WorkboolStyleSetting;
import com.vci.common.qt.object.Condition;
import com.vci.common.qt.object.ConditionItem;
import com.vci.common.qt.object.LeafInfo;
@@ -1705,7 +1704,7 @@
if(cvs[0].trim().equalsIgnoreCase("enumName")){
String enumName = cvs[1].trim();
//EnumItemFilter filter = new EnumItemFilter(enumName);
- EnumItem[] enumItems = EnumClient.getService().getEmItems(enumName, 1, 1);
+ EnumItem[] enumItems = ServiceProvider.getOMDService().getEnumService().getEmItems(enumName, 1, 1);
for(EnumItem ei : enumItems){
for(EnumChild ec : ei.children){
sysEnumMap.put(btmName + "#" + attrName + "#" + ec.value, ec.name);
@@ -1867,7 +1866,7 @@
public static QueryTemplate getQueryTemplateByName(String queryTemplateName){
QueryTemplate qt = null;
try{
- QTInfo wrapper = QTDClient.getService().getQT(queryTemplateName);
+ QTInfo wrapper = ServiceProvider.getOMDService().getQTDService().getQT(queryTemplateName);
qt = OQTool.getQTByDoc(DocumentHelper.parseText(wrapper.qtText), queryTemplateName);
} catch (VCIError e) {
e.printStackTrace();
diff --git a/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/folder/FolderImportAction.java b/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/folder/FolderImportAction.java
index 247bd44..4ec193c 100644
--- a/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/folder/FolderImportAction.java
+++ b/Source/Client/PLTClient/src/com/vci/client/uif/actions/client/folder/FolderImportAction.java
@@ -25,9 +25,6 @@
import com.vci.client.bof.ClientLinkObject;
import com.vci.client.common.oq.OQTool;
import com.vci.client.oq.QTClient;
-import com.vci.client.ui.excel.ExcelCellStyleSettingCallback;
-import com.vci.client.ui.excel.ExcelFileOperation;
-import com.vci.client.ui.excel.WorkboolStyleSetting;
import com.vci.client.ui.exception.VCIException;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.process.QANProcessBar;
@@ -42,6 +39,9 @@
import com.vci.client.uif.engine.client.tree.TreeNode;
import com.vci.client.uif.engine.client.tree.TreePanel;
import com.vci.client.uif.engine.common.IDataNode;
+import com.vci.client.utils.excel.ExcelCellStyleSettingCallback;
+import com.vci.client.utils.excel.ExcelFileOperation;
+import com.vci.client.utils.excel.WorkboolStyleSetting;
import com.vci.common.qt.object.Condition;
import com.vci.common.qt.object.QueryTemplate;
import com.vci.corba.common.VCIError;
diff --git a/Source/Client/PLTClient/src/com/vci/client/uif/engine/client/tableArea/TablePanelDataProvider.java b/Source/Client/PLTClient/src/com/vci/client/uif/engine/client/tableArea/TablePanelDataProvider.java
index e94f894..71c0c74 100644
--- a/Source/Client/PLTClient/src/com/vci/client/uif/engine/client/tableArea/TablePanelDataProvider.java
+++ b/Source/Client/PLTClient/src/com/vci/client/uif/engine/client/tableArea/TablePanelDataProvider.java
@@ -25,9 +25,9 @@
import com.vci.client.bof.ClientLinkObject;
import com.vci.client.common.FreeMarkerCommon;
import com.vci.client.common.FreemarkerParamObject;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.attribpool.ui.APClient;
import com.vci.client.omd.btm.ui.BtmClient;
-import com.vci.client.omd.enumManager.ui.EnumClient;
import com.vci.client.omd.linktype.LinkTypeStart;
import com.vci.client.omd.statepool.StatePoolStart;
import com.vci.client.portal.constants.QueryConditionConstants;
@@ -1616,7 +1616,7 @@
HashMap<String, String> map = new HashMap<String, String>();
try {
if(enumItemMap.size() == 0){
- EnumItem[] enumItems = EnumClient.getService().getEmItems("", 1, 1);
+ EnumItem[] enumItems = ServiceProvider.getOMDService().getEnumService().getEmItems("", 1, 1);
for(EnumItem ei : enumItems){
enumItemMap.put(ei.name, ei);
}
diff --git a/Source/Client/PLTClient/src/com/vci/client/uif/engine/client/tree/SearchTipDialog.java b/Source/Client/PLTClient/src/com/vci/client/uif/engine/client/tree/SearchTipDialog.java
index e9e0b7f..2ee1ed4 100644
--- a/Source/Client/PLTClient/src/com/vci/client/uif/engine/client/tree/SearchTipDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/uif/engine/client/tree/SearchTipDialog.java
@@ -13,7 +13,7 @@
import javax.swing.JPanel;
import javax.swing.border.Border;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.uif.engine.client.AbstractRegionPanel;
public class SearchTipDialog extends JDialog implements Runnable{
diff --git a/Source/Client/PLTClient/src/com/vci/client/uif/engine/client/tree/TreePanel.java b/Source/Client/PLTClient/src/com/vci/client/uif/engine/client/tree/TreePanel.java
index 6879178..7cde7b5 100644
--- a/Source/Client/PLTClient/src/com/vci/client/uif/engine/client/tree/TreePanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/uif/engine/client/tree/TreePanel.java
@@ -44,6 +44,7 @@
import com.vci.client.common.FreeMarkerCommon;
import com.vci.client.common.FreemarkerParamObject;
import com.vci.client.common.oq.OQTool;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.framework.rightConfig.modelConfig.ModuleTreeCellRenderer;
import com.vci.client.omd.provider.ApProvider;
import com.vci.client.oq.QTClient;
@@ -687,7 +688,7 @@
private QueryTemplate getQueryTemplate(String fromId, IDataNode sourceData) throws VCIError, DocumentException {
String templateId = this.getDefination().getTemplateId();
- QTInfo wrapper = QTDClient.getService().getQT(templateId);
+ QTInfo wrapper = ServiceProvider.getOMDService().getQTDService().getQT(templateId);
QueryTemplate qt = OQTool.getQTByDoc(DocumentHelper.parseText(wrapper.qtText), templateId);
Map<String, String> replaceMap = this.getQueryTemplateReplaceMap(qt, sourceData);
replaceMap.put("f_oid", fromId); //鍙嶅悜Link鎬庝箞鍔烇紵 -- zhonggy
diff --git a/Source/Client/PLTClient/src/com/vci/client/utils/BOTool.java b/Source/Client/PLTClient/src/com/vci/client/utils/BOTool.java
new file mode 100644
index 0000000..cace500
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/utils/BOTool.java
@@ -0,0 +1,98 @@
+package com.vci.client.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.vci.client.bof.ClientBusinessObject;
+import com.vci.common.utility.ObjectUtility;
+import com.vci.corba.omd.data.AttributeValue;
+import com.vci.corba.omd.data.BusinessObject;
+
+public class BOTool {
+
+ /**
+ * 鑾峰彇鎸囧畾BO鐨勬寚瀹歛ttVal
+ * @param bo
+ * @param attName
+ * @return
+ */
+ public static String getBOAttVal(BusinessObject bo, String attName){
+ AttributeValue[] attrValList = bo.hisAttrValList;
+ for(int i = attrValList.length - 1; i >= 0; i--){
+ AttributeValue attVal = attrValList[i];
+ if(attVal.attrName.equalsIgnoreCase(attName)){
+ return attVal.attrVal;
+ }
+ }
+ return null;
+ }
+
+ public static List<BusinessObject> ArrayTOList(BusinessObject[] bos){
+ List<BusinessObject> list = new ArrayList<BusinessObject>();
+ for(BusinessObject bo : bos){
+ list.add(bo);
+ }
+ return list;
+ }
+
+ /**
+ * 鍏嬮殕涓�涓柊鐨凜BO瀵硅薄锛屼笉璋冪敤
+ * @param source 婧愬璞�
+ * @param isNew 鏄惁鐢熸垚鏂扮殑瀵硅薄锛�
+ * 濡傛灉涓簍rue鍒欎负鍏嬮殕鐨勫璞$敓鎴愭柊鐨刼id銆丷evisionid銆丯ameoid
+ * @return
+ */
+ public static ClientBusinessObject cloneClientBusinessObject(ClientBusinessObject source, boolean isNew){
+ if(source == null){
+ return null;
+ }
+ ClientBusinessObject bo = new ClientBusinessObject();
+ if(isNew){
+ bo.setOid(ObjectUtility.getNewObjectID36());
+ bo.setRevisionid(ObjectUtility.getNewObjectID36());
+ bo.setNameoid(ObjectUtility.getNewObjectID36());
+ } else {
+ bo.setOid(source.getOid());
+ bo.setRevisionid(source.getRevisionid());
+ bo.setNameoid(source.getNameoid());
+ }
+ bo.setBtmName(source.getBtmName());
+ bo.setIsLastR(source.getIsLastR());
+ bo.setIsFirstR(source.getIsFirstR());
+ bo.setIsFirstV(source.getIsFirstV());
+ bo.setIsLastV(source.getIsLastV());
+ bo.setCreator(source.getCreator());
+ bo.setCreateTime(source.getCreateTime());
+ bo.setLastModifier(source.getLastModifier());
+ bo.setLastModifyTime(source.getLastModifyTime());
+ bo.setRevisionRule(source.getRevisionRule());
+ bo.setVersionRule(source.getVersionRule());
+ bo.setRevisionSeq(source.getRevisionSeq());
+ bo.setRevisionValue(source.getRevisionValue());
+ bo.setVersionSeq(source.getVersionSeq());
+ bo.setVersionValue(source.getVersionValue());
+ bo.setLctId(source.getLctId());
+ bo.setLcStatus(source.getLcStatus());
+ bo.setId(source.getId());
+ bo.setName(source.getName());
+ bo.setDescription(source.getDescription());
+ bo.setOwner(source.getOwner());
+ //bo.setCheckinBy(source.getCheckinBy());
+ bo.setCopyFromVersion(source.getCopyFromVersion());
+ //璁剧疆BO鑷畾涔夊睘鎬�
+ AttributeValue[] attrs = null;
+ if(source.getBusinessObject().newAttrValList != null){
+ int size = source.getBusinessObject().newAttrValList.length;
+ attrs = new AttributeValue[size];
+ AttributeValue[] sourceAttrs = source.getBusinessObject().newAttrValList;
+ for(int i = 0; i < sourceAttrs.length; i++){
+ AttributeValue av = new AttributeValue();
+ av.attrName = sourceAttrs[i].attrName;
+ av.attrVal = "";
+ attrs[i] = av;
+ }
+ }
+ bo.getBusinessObject().newAttrValList = attrs;
+ return bo;
+ }
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/utils/ImportDataTool.java b/Source/Client/PLTClient/src/com/vci/client/utils/ImportDataTool.java
new file mode 100644
index 0000000..1aa5000
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/utils/ImportDataTool.java
@@ -0,0 +1,1630 @@
+package com.vci.client.utils;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import com.vci.client.bof.ClientBusinessObject;
+import com.vci.client.bof.ClientBusinessObjectOperation;
+import com.vci.client.bof.ClientLinkObject;
+import com.vci.client.bof.ClientLinkObjectOperation;
+import com.vci.client.common.oq.OQTool;
+import com.vci.client.fm.ClientFileObjectOperation;
+import com.vci.client.fm.FileObject;
+import com.vci.client.fm.FileTypeConstants;
+import com.vci.client.omd.provider.ApProvider;
+import com.vci.client.omd.provider.EnumProvider;
+import com.vci.client.oq.QTClient;
+import com.vci.client.utils.excel.ExcelDocumentUtils;
+import com.vci.client.utils.excel.SheetDataSet;
+import com.vci.common.qt.object.Condition;
+import com.vci.common.qt.object.Connector;
+import com.vci.common.qt.object.QTConstants;
+import com.vci.common.qt.object.QueryTemplate;
+import com.vci.corba.common.VCIError;
+import com.vci.corba.omd.atm.AttribItem;
+import com.vci.corba.omd.data.BusinessObject;
+import com.vci.corba.omd.data.LinkObject;
+import com.vci.corba.omd.etm.EnumChild;
+import com.vci.corba.omd.etm.EnumItem;
+import com.vci.omd.constants.AttributeConstants;
+
+public class ImportDataTool {
+ public static final String ERROR = "error";
+ public static final String RESULT = "result";
+ public static final String TRUE = "true";
+ public static final String FALSE = "false";
+ private final int PARTIONSIZE = 500;
+
+ private static ImportDataTool instance = null;
+
+ private static ImportDataTool getInstance(){
+ if (instance == null) {
+ instance = new ImportDataTool();
+ }
+ return instance;
+ }
+
+ private ClientLinkObjectOperation instanceLo;
+
+ private ClientLinkObjectOperation getInstanceLo() {
+ if (instanceLo == null) {
+ instanceLo = new ClientLinkObjectOperation();
+ }
+ return instanceLo;
+ }
+
+ private ClientBusinessObjectOperation instanceBo;
+
+ private ClientBusinessObjectOperation getInstanceBo() {
+ if (instanceBo == null) {
+ instanceBo = new ClientBusinessObjectOperation();
+ }
+ return instanceBo;
+ }
+
+ public static Map<String, String> importLOData(File file, String fileName, String type,
+ String linkType, String f_type, String f_oid, String f_revisionOid, String f_nameoid, int updateFlag) throws VCIError, IOException{
+ Map<String, String> infoMap = new HashMap<String, String>();
+ //鍘嬬缉鏂囦欢涓殑excel鏁版嵁鏂囦欢
+ InputStream dataInputStream = null;
+ Map<String, File> files = new HashMap<String, File>();
+ boolean zipFlag = false;
+ if(fileName.endsWith(".zip")){
+ zipFlag = true;
+ ZipFile zipFile = new ZipFile(file);
+ Enumeration<? extends ZipEntry> entries = zipFile.entries();
+ String tempFolder = file.getParent();
+ while(entries.hasMoreElements()){
+ ZipEntry zipEntry = entries.nextElement();
+ if(!zipEntry.isDirectory()){
+ String fileName_ = zipEntry.getName();
+ InputStream inputStream_ = zipFile.getInputStream(zipEntry);
+ if(fileName_.endsWith(".xlsx") || fileName_.endsWith(".xls")){
+ fileName = fileName_;
+ dataInputStream = inputStream_;
+ }else{
+ String filePath = tempFolder + "\\" + fileName_;
+ File tempFile = new File(filePath);
+ File folder = tempFile.getParentFile();
+ if(!folder.exists()){
+ folder.mkdirs();
+ }
+ if(!tempFile.exists()){
+ tempFile.createNewFile();
+ }
+ BufferedInputStream inBuff = new BufferedInputStream(inputStream_);
+ BufferedOutputStream outBuff = new BufferedOutputStream(new FileOutputStream(tempFile));
+
+ byte[] b = new byte[1024 * 512];
+ int len;
+ while((len = inBuff.read(b)) != -1){
+ outBuff.write(b, 0, len);
+ }
+
+ files.put(fileName_, tempFile);
+ inBuff.close();
+ outBuff.close();
+ }
+ }
+ }
+ }
+ BufferedInputStream bs;
+ if(zipFlag){
+ bs = new BufferedInputStream(dataInputStream);
+ }else{
+ bs = new BufferedInputStream(new FileInputStream(file));
+ }
+ List<SheetDataSet> sheetDataSets = ExcelDocumentUtils
+ .readExcelDocument(fileName, bs);
+ List<String[]> dataSets = sheetDataSets.get(0).getDataSet();
+ String[] dataSet = dataSets.get(0);
+ Set<String> typeSet = new HashSet<String>();
+ Map<Integer, String> typeAttMap = new HashMap<Integer, String>();
+
+ //鍒ら噸鍒�
+ List<String> uniqueCols = new ArrayList<String>();
+ //鏂囦欢鍒�
+ List<String> fileCols = new ArrayList<String>();
+ for(int i = 0; i < dataSet.length; i++){
+ String data = dataSet[i];
+ String[] data_ = data.split("\\.");
+ typeSet.add(data_[0]);
+
+ //鍒ら噸鍒楁爣璇�
+ if(data_[1].endsWith("*")){
+ uniqueCols.add(data_[1].substring(0, data_[1].indexOf("*")).toUpperCase());
+ data = data.substring(0, data.indexOf("*"));
+ //鏂囦欢鍒楁爣璇�
+ }else if(data_[1].endsWith("+")){
+ fileCols.add(data_[1].substring(0, data_[1].indexOf("+")).toUpperCase());
+ data = data.substring(0, data.indexOf("+"));
+ }
+ typeAttMap.put(i, data);
+ }
+ if(!typeSet.contains(type)){
+ infoMap.put(ERROR, "鏂囦欢涓棤璇ョ被鍨嬫暟鎹�");
+ return infoMap;
+ }
+
+ if(typeSet.size() > 2){
+ infoMap.put(ERROR, "鏂囦欢涓惈鏈夊叾浠栫被鍨嬫暟鎹�");
+ return infoMap;
+ }
+
+ boolean flag = false;
+ if(zipFlag){
+ flag = getInstance().saveBOAndLOsWithFile(dataSets, typeAttMap, type, linkType, f_type, f_oid, f_revisionOid, f_nameoid,
+ uniqueCols, updateFlag, fileCols, files);
+ }else{
+ flag = getInstance().saveBOAndLOs(dataSets, typeAttMap, type, linkType, f_type, f_oid, f_revisionOid, f_nameoid, uniqueCols, updateFlag);
+ }
+ //鍒犻櫎涓存椂鏂囦欢
+ for(Iterator<String> ite = files.keySet().iterator(); ite.hasNext();){
+ String fileName_ = ite.next();
+ File file_ = files.get(fileName_);
+ file_.delete();
+ }
+ file.delete();
+
+ if(flag){
+ infoMap.put(RESULT, TRUE);
+ }else{
+ infoMap.put(RESULT, FALSE);
+ }
+ return infoMap;
+ }
+
+ /**
+ * 淇濆瓨涓氬姟瀵硅薄 鍜� 閾炬帴瀵硅薄
+ * 褰撳璞′笉瀛樺湪鏃�, 鍒涘缓瀵硅薄;
+ * 瀛樺湪鏃�(unique), 鏇存柊瀵硅薄.
+ * @param dataSets
+ * @param typeAttMap
+ * @param type
+ * @param linkType
+ * @param f_nameoid
+ * @param f_revisionOid
+ * @return
+ * @throws PLMError
+ */
+ private boolean saveBOAndLOs(List<String[]> dataSets,
+ Map<Integer, String> typeAttMap, String type, String linkType, String f_type, String f_oid, String f_revisionOid, String f_nameoid, List<String> uniqueCols, int updateFlag) throws VCIError {
+ List<ClientBusinessObject> createListBo = new ArrayList<ClientBusinessObject>();
+ List<ClientBusinessObject> updateListBo = new ArrayList<ClientBusinessObject>();
+ List<ClientLinkObject> createListLo = new ArrayList<ClientLinkObject>();
+ List<ClientLinkObject> updateListLo = new ArrayList<ClientLinkObject>();
+ List<ClientBusinessObject> allBoList = new ArrayList<ClientBusinessObject>();
+ Map<String, Map<String, String>> map_ = new HashMap<String, Map<String,String>>();
+ List<ClientLinkObject> allLoList = new ArrayList<ClientLinkObject>();
+ Map<String, ClientLinkObject> loMap = new HashMap<String, ClientLinkObject>();
+ ClientBusinessObject cboSource = getInstanceBo().createBusinessObject(type);
+ ClientLinkObject cloSource = getInstanceLo().createLinkObject(linkType);
+ for(int i = 1; i < dataSets.size(); i++){
+ ClientBusinessObject cbo = BOTool.cloneClientBusinessObject(cboSource, true);
+ ClientLinkObject clo = LOTool.cloneClientLinkObject(cloSource, true);
+ String[] data = dataSets.get(i);
+ Map<String, String> map = new HashMap<String, String>();
+ for(int k = 0; k < data.length; k++){
+ String[] data_ = typeAttMap.get(k).split("\\.");
+ String type_ = data_[0];
+ String attName = data_[1];
+ String value = data[k];
+ value = checkEnum(attName, value);
+ //涓氬姟绫诲瀷灞炴��
+ if(type_.equalsIgnoreCase(type)){
+ if(attName.equalsIgnoreCase("ID") || attName.equalsIgnoreCase("NAME") || attName.equalsIgnoreCase("DESCRIPTION")){
+ map.put(attName.toLowerCase(), value);
+ }
+ cbo.setAttributeValue(attName.toLowerCase(), value, true);
+ //閾炬帴绫诲瀷灞炴��
+ }else{
+ clo.setAttributeValue(attName.toLowerCase(), value);
+ }
+ }
+
+ clo.setFromBTMName(f_type);
+ clo.setFromOid(f_oid);
+ clo.setFromRevisionOid(f_revisionOid);
+ clo.setFromNameOid(f_nameoid);
+ clo.setToBTMName(cbo.getBtmName());
+ clo.setToOid(cbo.getOid());
+ clo.setToRevisionOid(cbo.getRevisionid());
+ clo.setToNameOid(cbo.getNameoid());
+
+ map_.put(cbo.getOid(), map);
+ allBoList.add(cbo);
+ allLoList.add(clo);
+ loMap.put(cbo.getOid(), clo);
+ }
+
+ if (uniqueCols.size() > 0 && allBoList.size() > 0) {
+ List<BusinessObject> queryBO = queryBO(allBoList, uniqueCols);
+ for(ClientBusinessObject cbo : allBoList){
+ BusinessObject bo = isExistBo(cbo, uniqueCols, queryBO);
+ ClientLinkObject clo = loMap.get(cbo.getOid());
+ if (bo != null) {
+ if(updateFlag == 1){
+ Map<String, String> map = map_.get(cbo.getOid());
+ if (map.get("id") != null) {
+ cbo.setAttributeValue("id", map.get("id"));
+ }
+ if (map.get("name") != null) {
+ cbo.setAttributeValue("name", map.get("name"));
+ }
+ if (map.get("description") != null) {
+ cbo.setAttributeValue("description", map.get("description"));
+ }
+ cbo.setOid(bo.oid);
+ cbo.setTs(bo.ts);
+ updateListBo.add(cbo);
+ }
+ // 褰揵o瀛樺湪, lo涓嶅瓨鍦ㄦ椂, 涓嶈bo鏄鐩栬繕鏄烦杩� , 閮介渶瑕佸垱寤簂o
+
+ clo.setToOid(bo.oid);
+ clo.setToRevisionOid(bo.revisionid);
+ clo.setToNameOid(bo.nameoid);
+
+ } else {
+ createListBo.add(cbo);
+ }
+ }
+ if(allLoList.size() > 0){
+ List<LinkObject> queryLO = queryLO(allLoList);
+ for(ClientLinkObject clo : allLoList){
+ LinkObject lo = isExistLo(clo, queryLO);
+ if(lo != null){
+ if (updateFlag == 1) {
+ clo.setOid(lo.oid);
+ clo.setTs(lo.ts);
+ updateListLo.add(clo);
+ }
+ }else{
+ createListLo.add(clo);
+ }
+ }
+ }
+ }else {
+ createListBo.addAll(allBoList);
+ createListLo.addAll(allLoList);
+ }
+
+ boolean flag = true;
+ if(createListBo.size() > 0 || createListLo.size() > 0){
+ flag &= getInstanceBo().batchSaveCreateBuinessObject(
+ createListBo.toArray(new ClientBusinessObject[0]), createListLo.toArray(new ClientLinkObject[0]));
+ }else{
+ flag &= true;
+ }
+ if(updateListBo.size() > 0){
+ flag &= getInstanceBo().batchUpdateBuinessObject(updateListBo.toArray(new ClientBusinessObject[0]));
+ }else{
+ flag &= true;
+ }
+
+ if(updateListLo.size() > 0){
+ flag &= getInstanceLo().batchUpdateLinkObject(updateListLo.toArray(new ClientLinkObject[0]));
+ }else{
+ flag &= true;
+ }
+
+ return flag;
+ }
+
+ /**
+ * 淇濆瓨涓氬姟瀵硅薄 鍜� 閾炬帴瀵硅薄
+ * 褰撳璞′笉瀛樺湪鏃�, 鍒涘缓瀵硅薄;
+ * 瀛樺湪鏃�(unique), 鏇存柊瀵硅薄.
+ * @param dataSets
+ * @param typeAttMap
+ * @param type
+ * @param linkType
+ * @param f_nameoid
+ * @param f_revisionOid
+ * @param fileCols : 鏂囦欢璺緞鍒�
+ * @param files : Map<fileName, tempFile>
+ * @return
+ * @throws PLMError
+ */
+ private boolean saveBOAndLOsWithFile(List<String[]> dataSets,Map<Integer, String> typeAttMap,
+ String type, String linkType, String f_type, String f_oid, String f_revisionOid, String f_nameoid,
+ List<String> uniqueCols, int updateFlag, List<String> fileCols, Map<String, File> files) throws VCIError {
+ List<ClientBusinessObject> createListBo = new ArrayList<ClientBusinessObject>();
+ List<ClientBusinessObject> updateListBo = new ArrayList<ClientBusinessObject>();
+ List<ClientLinkObject> createListLo = new ArrayList<ClientLinkObject>();
+ List<ClientLinkObject> updateListLo = new ArrayList<ClientLinkObject>();
+ List<ClientBusinessObject> allBoList = new ArrayList<ClientBusinessObject>();
+ Map<String, Map<String, String>> map_ = new HashMap<String, Map<String,String>>();
+ Map<String, Map<String, String>> fileMap_ = new HashMap<String, Map<String,String>>();
+ List<ClientLinkObject> allLoList = new ArrayList<ClientLinkObject>();
+ Map<String, ClientLinkObject> loMap = new HashMap<String, ClientLinkObject>();
+ ClientFileObjectOperation operation = new ClientFileObjectOperation();
+ ClientBusinessObject cboSource = getInstanceBo().createBusinessObject(type);
+ ClientLinkObject cloSource = getInstanceLo().createLinkObject(linkType);
+ for(int i = 1; i < dataSets.size(); i++){
+ ClientBusinessObject cbo = BOTool.cloneClientBusinessObject(cboSource, true);
+ ClientLinkObject clo = LOTool.cloneClientLinkObject(cloSource, true);
+ String[] data = dataSets.get(i);
+ Map<String, String> map = new HashMap<String, String>();
+ Map<String, String> fileMap = new HashMap<String, String>();
+ for(int k = 0; k < data.length; k++){
+ String[] data_ = typeAttMap.get(k).split("\\.");
+ String type_ = data_[0];
+ String attName = data_[1];
+ String value = data[k];
+ value = checkEnum(attName, value);
+ //涓氬姟绫诲瀷灞炴��
+ if(type_.equalsIgnoreCase(type)){
+ if(attName.equalsIgnoreCase("ID") || attName.equalsIgnoreCase("NAME") || attName.equalsIgnoreCase("DESCRIPTION")){
+ map.put(attName.toLowerCase(), value);
+ //涓婁紶鏂囦欢
+ }else if(fileCols.contains(attName.toUpperCase())){
+ if(uniqueCols.size() > 0){
+ //鏂囦欢淇℃伅鍦ㄥ垽閲嶅悗鍐嶈ˉ鍏呭埌瀵硅薄
+ fileMap.put(attName, value);
+ continue;
+ }else{
+ //涓嶉渶鍒ら噸锛屾枃浠朵俊鎭洿鎺ュ湪姝ゅ鐞�
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)
+ if(attName.equalsIgnoreCase("_attach")){
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)鏃� , 鏂囦欢鐨刣ocumentoid
+ String docId = cbo.getOid();
+
+ String[] paths = value.split(";");
+ for (String path : paths) {
+ File file = files.get(path);
+ String fileName = file.getName();
+
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject.setAttributeValue("documentoid", docId);
+ fileObject = operation.createNewFile(file.getAbsolutePath(), fileObject);
+ }
+ continue;
+ //鏂囦欢鏄璞″睘鎬�(濡俻ersonallog)
+ }else{
+ File file = files.get(value);
+ String fileName = file.getName();
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject = operation.createNewFile(file.getAbsolutePath(),
+ fileObject);
+ value = fileObject.getOid();
+ }
+ }
+ }
+ cbo.setAttributeValue(attName.toLowerCase(), value, true);
+ //閾炬帴绫诲瀷灞炴��
+ }else{
+ clo.setAttributeValue(attName.toLowerCase(), value);
+ }
+ }
+
+ clo.setFromBTMName(f_type);
+ clo.setFromOid(f_oid);
+ clo.setFromRevisionOid(f_revisionOid);
+ clo.setFromNameOid(f_nameoid);
+ clo.setToBTMName(cbo.getBtmName());
+ clo.setToOid(cbo.getOid());
+ clo.setToRevisionOid(cbo.getRevisionid());
+ clo.setToNameOid(cbo.getNameoid());
+
+ map_.put(cbo.getOid(), map);
+ fileMap_.put(cbo.getOid(), fileMap);
+ allBoList.add(cbo);
+ allLoList.add(clo);
+ loMap.put(cbo.getOid(), clo);
+ }
+
+ if (uniqueCols.size() > 0 && allBoList.size() > 0) {
+ List<BusinessObject> queryBO = queryBO(allBoList, uniqueCols);
+ for(ClientBusinessObject cbo : allBoList){
+ BusinessObject bo = isExistBo(cbo, uniqueCols, queryBO);
+ ClientLinkObject clo = loMap.get(cbo.getOid());
+ if (bo != null) {
+ if(updateFlag == 1){
+ Map<String, String> map = map_.get(cbo.getOid());
+ if (map.get("id") != null) {
+ cbo.setAttributeValue("id", map.get("id"));
+ }
+ if (map.get("name") != null) {
+ cbo.setAttributeValue("name", map.get("name"));
+ }
+ if (map.get("description") != null) {
+ cbo.setAttributeValue("description", map.get("description"));
+ }
+
+ //澶勭悊cbo鐨勬枃浠朵俊鎭�
+ Map<String, String> fileMap = fileMap_.get(cbo.getOid());
+ for(String key : fileMap.keySet()){
+ String value = fileMap.get(key);
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)
+ if(key.equalsIgnoreCase("_attach")){
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)鏃� , 鏂囦欢鐨刣ocumentoid
+ String docId = bo.oid;
+
+ // 鍒犻櫎瀵硅薄鍏宠仈鐨勬枃妗�
+ ClientBusinessObject[] fObjs = getClientFileObjectByDocId(docId);
+ if (fObjs != null && fObjs.length > 0) {
+ getInstanceBo().batchDeleteBuinessObject(fObjs);
+ }
+
+ // 鍒涘缓瀵硅薄鍏宠仈鐨勬枃妗�
+ String[] paths = value.split(";");
+ for (String path : paths) {
+ File file = files.get(path);
+ String fileName = file.getName();
+
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject.setAttributeValue("documentoid", docId);
+ fileObject = operation.createNewFile(file.getAbsolutePath(), fileObject);
+ }
+ //鏂囦欢鏄璞″睘鎬�(濡俻ersonallog)
+ }else{
+ File file = files.get(value);
+ String fileName = file.getName();
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject = operation.createNewFile(file.getAbsolutePath(),
+ fileObject);
+ value = fileObject.getOid();
+ cbo.setAttributeValue(key.toLowerCase(), value, true);
+ }
+ }
+
+ cbo.setOid(bo.oid);
+ cbo.setTs(bo.ts);
+ updateListBo.add(cbo);
+ }
+ // 褰揵o瀛樺湪, lo涓嶅瓨鍦ㄦ椂, 涓嶈bo鏄鐩栬繕鏄烦杩� , 閮介渶瑕佸垱寤簂o
+
+ clo.setToOid(bo.oid);
+ clo.setToRevisionOid(bo.revisionid);
+ clo.setToNameOid(bo.nameoid);
+
+ } else {
+ //澶勭悊cbo鐨勬枃浠朵俊鎭�
+ Map<String, String> fileMap = fileMap_.get(cbo.getOid());
+ for(String key : fileMap.keySet()){
+ String value = fileMap.get(key);
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)
+ if(key.equalsIgnoreCase("_attach")){
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)鏃� , 鏂囦欢鐨刣ocumentoid
+ String docId = cbo.getOid();
+
+ String[] paths = value.split(";");
+ for (String path : paths) {
+ File file = files.get(path);
+ String fileName = file.getName();
+
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject.setAttributeValue("documentoid", docId);
+ fileObject = operation.createNewFile(file.getAbsolutePath(), fileObject);
+ }
+ //鏂囦欢鏄璞″睘鎬�(濡俻ersonallog)
+ }else{
+ File file = files.get(value);
+ String fileName = file.getName();
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject = operation.createNewFile(file.getAbsolutePath(),
+ fileObject);
+ value = fileObject.getOid();
+ cbo.setAttributeValue(key.toLowerCase(), value, true);
+ }
+ }
+ createListBo.add(cbo);
+ }
+ }
+
+ if(allLoList.size() > 0){
+ List<LinkObject> queryLO = queryLO(allLoList);
+ for(ClientLinkObject clo : allLoList){
+ LinkObject lo = isExistLo(clo, queryLO);
+ if(lo != null){
+ if (updateFlag == 1) {
+ clo.setOid(lo.oid);
+ clo.setTs(lo.ts);
+ updateListLo.add(clo);
+ }
+ }else{
+ createListLo.add(clo);
+ }
+ }
+ }
+ }else {
+ createListBo.addAll(allBoList);
+ createListLo.addAll(allLoList);
+ }
+
+ boolean flag = true;
+ if(createListBo.size() > 0 || createListLo.size() > 0){
+ flag &= getInstanceBo().batchSaveCreateBuinessObject(
+ createListBo.toArray(new ClientBusinessObject[0]), createListLo.toArray(new ClientLinkObject[0]));
+ }else{
+ flag &= true;
+ }
+ if(updateListBo.size() > 0){
+ flag &= getInstanceBo().batchUpdateBuinessObject(updateListBo.toArray(new ClientBusinessObject[0]));
+ }else{
+ flag &= true;
+ }
+
+ if(updateListLo.size() > 0){
+ flag &= getInstanceLo().batchUpdateLinkObject(updateListLo.toArray(new ClientLinkObject[0]));
+ }else{
+ flag &= true;
+ }
+
+ return flag;
+ }
+
+ /**
+ * 瀵煎叆涓氬姟瀵硅薄
+ * @param file
+ * @param fileName
+ * @param type
+ * @param updateFlag: 褰撴湁閲嶅璁板綍鏃�: 1:瑕嗙洊; 0:璺宠繃
+ * @param folderId : 鏂囦欢澶瑰垎绫籌D(PLCLASSIFY)
+ * @return
+ * @throws VCIError
+ * @throws IOException
+ */
+ public static Map<String, String> importBOWithClassifyData(File file, String fileName, String type, int updateFlag, String folderId) throws VCIError, IOException{
+ Map<String, String> infoMap = new HashMap<String, String>();
+ //鍘嬬缉鏂囦欢涓殑excel鏁版嵁鏂囦欢
+ InputStream dataInputStream = null;
+ Map<String, File> files = new HashMap<String, File>();
+ boolean zipFlag = false;
+ if(fileName.endsWith(".zip")){
+ zipFlag = true;
+ ZipFile zipFile = new ZipFile(file);
+ Enumeration<? extends ZipEntry> entries = zipFile.entries();
+ String tempFolder = file.getParent();
+ while(entries.hasMoreElements()){
+ ZipEntry zipEntry = entries.nextElement();
+ if(!zipEntry.isDirectory()){
+ String fileName_ = zipEntry.getName();
+ InputStream inputStream_ = zipFile.getInputStream(zipEntry);
+ if(fileName_.endsWith(".xlsx") || fileName_.endsWith(".xls")){
+ fileName = fileName_;
+ dataInputStream = inputStream_;
+ }else{
+ String filePath = tempFolder + "\\" + fileName_;
+ File tempFile = new File(filePath);
+ File folder = tempFile.getParentFile();
+ if(!folder.exists()){
+ folder.mkdirs();
+ }
+ if(!tempFile.exists()){
+ tempFile.createNewFile();
+ }
+ BufferedInputStream inBuff = new BufferedInputStream(inputStream_);
+ BufferedOutputStream outBuff = new BufferedOutputStream(new FileOutputStream(tempFile));
+
+ byte[] b = new byte[1024 * 512];
+ int len;
+ while((len = inBuff.read(b)) != -1){
+ outBuff.write(b, 0, len);
+ }
+
+ files.put(fileName_, tempFile);
+ inBuff.close();
+ outBuff.close();
+ }
+ }
+ }
+ }
+ BufferedInputStream bs;
+ if(zipFlag){
+ bs = new BufferedInputStream(dataInputStream);
+ }else{
+ bs = new BufferedInputStream(new FileInputStream(file));
+ }
+ List<SheetDataSet> sheetDataSets = ExcelDocumentUtils
+ .readExcelDocument(fileName, bs);
+ List<String[]> dataSets = sheetDataSets.get(0).getDataSet();
+ String[] dataSet = dataSets.get(0);
+ Set<String> typeSet = new HashSet<String>();
+ Map<Integer, String> typeAttMap = new HashMap<Integer, String>();
+
+ //鍒ら噸鍒�
+ List<String> uniqueCols = new ArrayList<String>();
+ //鏂囦欢鍒�
+ List<String> fileCols = new ArrayList<String>();
+ for(int i = 0; i < dataSet.length; i++){
+ String data = dataSet[i];
+ String[] data_ = data.split("\\.");
+ typeSet.add(data_[0]);
+
+ //鍒ら噸鍒楁爣璇�
+ if(data_[1].endsWith("*")){
+ uniqueCols.add(data_[1].substring(0, data_[1].indexOf("*")).toUpperCase());
+ data = data.substring(0, data.indexOf("*"));
+ //鏂囦欢鍒楁爣璇�
+ }else if(data_[1].endsWith("+")){
+ fileCols.add(data_[1].substring(0, data_[1].indexOf("+")).toUpperCase());
+ data = data.substring(0, data.indexOf("+"));
+ }
+ typeAttMap.put(i, data);
+ }
+
+ if(!typeSet.contains(type)){
+ infoMap.put(ERROR, "鏂囦欢涓棤璇ョ被鍨嬫暟鎹�");
+ return infoMap;
+ }
+ if(typeSet.size() > 1){
+ infoMap.put(ERROR, "鏂囦欢涓惈鏈夊叾浠栫被鍨嬫暟鎹�");
+ return infoMap;
+ }
+
+ boolean flag = false;
+ if(zipFlag){
+ flag = getInstance().saveBOsWithClassifyAndFile(dataSets, typeAttMap, type, uniqueCols, updateFlag, folderId, fileCols, files);
+ }else{
+ flag = getInstance().saveBOsWithClassify(dataSets, typeAttMap, type, uniqueCols, updateFlag, folderId);
+ }
+
+ //鍒犻櫎涓存椂鏂囦欢
+ for(Iterator<String> ite = files.keySet().iterator(); ite.hasNext();){
+ String fileName_ = ite.next();
+ File file_ = files.get(fileName_);
+ file_.delete();
+ }
+ file.delete();
+
+ if(flag){
+ infoMap.put(RESULT, TRUE);
+ }else{
+ infoMap.put(RESULT, FALSE);
+ }
+ return infoMap;
+ }
+
+ /**
+ * 淇濆瓨涓氬姟瀵硅薄
+ * 褰撳璞′笉瀛樺湪鏃�, 鍒涘缓瀵硅薄;
+ * 瀛樺湪鏃�(unique), 鏇存柊瀵硅薄.
+ * @param dataSet
+ * @param typeAttMap
+ * @param type
+ * @param uniqueCols : 鍒ら噸鍒�
+ * @param folderId : 鏂囦欢澶瑰垎绫籌D(PLCLASSIFY)
+ * @return
+ * @throws PLMError
+ * @throws VciException
+ */
+ private boolean saveBOsWithClassify(List<String[]> dataSets, Map<Integer, String> typeAttMap, String type, List<String> uniqueCols, int updateFlag, String folderId) throws VCIError {
+ List<ClientBusinessObject> createList = new ArrayList<ClientBusinessObject>();
+ List<ClientBusinessObject> updateList = new ArrayList<ClientBusinessObject>();
+ List<ClientBusinessObject> allBoList = new ArrayList<ClientBusinessObject>();
+ Map<String, Map<String, String>> map_ = new HashMap<String, Map<String,String>>();
+ ClientBusinessObject source = getInstanceBo().createBusinessObject(type);
+ for(int i = 1; i < dataSets.size(); i++){
+ ClientBusinessObject cbo = BOTool.cloneClientBusinessObject(source, true);
+ cbo.setBtmName(type);
+ String[] data = dataSets.get(i);
+ Map<String, String> map = new HashMap<String, String>();
+ for(int k = 0; k < data.length; k++){
+ String key = typeAttMap.get(k).split("\\.")[1];
+ String value = data[k];
+
+ value = checkEnum(key, value);
+ if(key.equalsIgnoreCase("ID") || key.equalsIgnoreCase("NAME") || key.equalsIgnoreCase("DESCRIPTION")){
+ map.put(key.toLowerCase(), value);
+ }
+ cbo.setAttributeValue(key.toLowerCase(), value, true);
+ }
+ cbo.setAttributeValue("PLCLASSIFY".toLowerCase(), folderId, true);
+ map_.put(cbo.getOid(), map);
+ allBoList.add(cbo);
+ }
+
+ if(uniqueCols.size() > 0 && allBoList.size() > 0){
+ List<BusinessObject> queryBO = queryBO(allBoList, uniqueCols);
+ for(ClientBusinessObject cbo : allBoList){
+ BusinessObject bo = isExistBo(cbo, uniqueCols, queryBO);
+ if (bo != null) {
+ if(updateFlag == 1){
+ Map<String, String> map = map_.get(cbo.getOid());
+ if (map.get("id") != null) {
+ cbo.setAttributeValue("id", map.get("id"));
+ }
+ if (map.get("name") != null) {
+ cbo.setAttributeValue("name", map.get("name"));
+ }
+ if (map.get("description") != null) {
+ cbo.setAttributeValue("description", map.get("description"));
+ }
+ cbo.setOid(bo.oid);
+ cbo.setTs(bo.ts);
+ updateList.add(cbo);
+ }
+ } else {
+ createList.add(cbo);
+ }
+ }
+ }else{
+ createList.addAll(allBoList);
+ }
+
+ boolean flag = false;
+ if(createList.size() > 0){
+ ClientBusinessObject[] bos = getInstanceBo().batchSaveCreateBuinessObject(createList.toArray(new ClientBusinessObject[0]));
+ if(bos.length == createList.size()){
+ flag = true;
+ }
+ }else{
+ flag = true;
+ }
+ if(updateList.size() > 0){
+ flag &= getInstanceBo().batchUpdateBuinessObject(updateList.toArray(new ClientBusinessObject[0]));
+ }else{
+ flag &= true;
+ }
+ return flag;
+ }
+
+ /**
+ * 淇濆瓨涓氬姟瀵硅薄
+ * 褰撳璞′笉瀛樺湪鏃�, 鍒涘缓瀵硅薄;
+ * 瀛樺湪鏃�(unique), 鏇存柊瀵硅薄.
+ * @param dataSet
+ * @param typeAttMap
+ * @param type
+ * @param uniqueCols : 鍒ら噸鍒�
+ * @param folderId : 鏂囦欢澶瑰垎绫籌D(PLCLASSIFY)
+ * @param fileCols : 鏂囦欢璺緞鍒�
+ * @param files : Map<fileName, tempFile>
+ * @return
+ * @throws PLMError
+ * @throws VciException
+ */
+ private boolean saveBOsWithClassifyAndFile(List<String[]> dataSets, Map<Integer, String> typeAttMap, String type, List<String> uniqueCols, int updateFlag, String folderId, List<String> fileCols, Map<String, File> files) throws VCIError {
+ List<ClientBusinessObject> createList = new ArrayList<ClientBusinessObject>();
+ List<ClientBusinessObject> updateList = new ArrayList<ClientBusinessObject>();
+ List<ClientBusinessObject> allBoList = new ArrayList<ClientBusinessObject>();
+ Map<String, Map<String, String>> map_ = new HashMap<String, Map<String,String>>();
+ Map<String, Map<String, String>> fileMap_ = new HashMap<String, Map<String,String>>();
+ ClientFileObjectOperation operation = new ClientFileObjectOperation();
+ for(int i = 1; i < dataSets.size(); i++){
+ ClientBusinessObject cbo = getInstanceBo().createBusinessObject(type);
+ cbo.setBtmName(type);
+ String[] data = dataSets.get(i);
+ Map<String, String> map = new HashMap<String, String>();
+ Map<String, String> fileMap = new HashMap<String, String>();
+ for(int k = 0; k < data.length; k++){
+ String key = typeAttMap.get(k).split("\\.")[1];
+ String value = data[k];
+
+ value = checkEnum(key, value);
+ if(key.equalsIgnoreCase("ID") || key.equalsIgnoreCase("NAME") || key.equalsIgnoreCase("DESCRIPTION")){
+ map.put(key.toLowerCase(), value);
+ //涓婁紶鏂囦欢
+ }else if(fileCols.contains(key.toUpperCase())){
+ if(uniqueCols.size() > 0){
+ //鏂囦欢淇℃伅鍦ㄥ垽閲嶅悗鍐嶈ˉ鍏呭埌瀵硅薄
+ fileMap.put(key, value);
+ continue;
+ }else{
+ //涓嶉渶鍒ら噸锛屾枃浠朵俊鎭洿鎺ュ湪姝ゅ鐞�
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)
+ if(key.equalsIgnoreCase("_attach")){
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)鏃� , 鏂囦欢鐨刣ocumentoid
+ String docId = cbo.getOid();
+
+ String[] paths = value.split(";");
+ for (String path : paths) {
+ File file = files.get(path);
+ String fileName = file.getName();
+
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject.setAttributeValue("documentoid", docId);
+ fileObject = operation.createNewFile(file.getAbsolutePath(), fileObject);
+ }
+ continue;
+ //鏂囦欢鏄璞″睘鎬�(濡俻ersonallog)
+ }else{
+ File file = files.get(value);
+ String fileName = file.getName();
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject = operation.createNewFile(file.getAbsolutePath(),
+ fileObject);
+ value = fileObject.getOid();
+ }
+ }
+ }
+ cbo.setAttributeValue(key.toLowerCase(), value, true);
+ }
+ cbo.setAttributeValue("PLCLASSIFY".toLowerCase(), folderId, true);
+
+ map_.put(cbo.getOid(), map);
+ fileMap_.put(cbo.getOid(), fileMap);
+ allBoList.add(cbo);
+ }
+ if(uniqueCols.size() > 0 && allBoList.size() > 0){
+ List<BusinessObject> queryBO = queryBO(allBoList, uniqueCols);
+ for(ClientBusinessObject cbo : allBoList){
+ BusinessObject bo = isExistBo(cbo, uniqueCols, queryBO);
+ if (bo != null) {
+ if(updateFlag == 1){
+ Map<String, String> map = map_.get(cbo.getOid());
+ if (map.get("id") != null) {
+ cbo.setAttributeValue("id", map.get("id"));
+ }
+ if (map.get("name") != null) {
+ cbo.setAttributeValue("name", map.get("name"));
+ }
+ if (map.get("description") != null) {
+ cbo.setAttributeValue("description", map.get("description"));
+ }
+ //澶勭悊cbo鐨勬枃浠朵俊鎭�
+ Map<String, String> fileMap = fileMap_.get(cbo.getOid());
+ for(String key : fileMap.keySet()){
+ String value = fileMap.get(key);
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)
+ if(key.equalsIgnoreCase("_attach")){
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)鏃� , 鏂囦欢鐨刣ocumentoid
+ String docId = bo.oid;
+
+ // 鍒犻櫎瀵硅薄鍏宠仈鐨勬枃妗�
+ ClientBusinessObject[] fObjs = getClientFileObjectByDocId(docId);
+ if (fObjs != null && fObjs.length > 0) {
+ getInstanceBo().batchDeleteBuinessObject(fObjs);
+ }
+
+ // 鍒涘缓瀵硅薄鍏宠仈鐨勬枃妗�
+ String[] paths = value.split(";");
+ for (String path : paths) {
+ File file = files.get(path);
+ String fileName = file.getName();
+
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject.setAttributeValue("documentoid", docId);
+ fileObject = operation.createNewFile(file.getAbsolutePath(), fileObject);
+ }
+ //鏂囦欢鏄璞″睘鎬�(濡俻ersonallog)
+ }else{
+ File file = files.get(value);
+ String fileName = file.getName();
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject = operation.createNewFile(file.getAbsolutePath(),
+ fileObject);
+ value = fileObject.getOid();
+ cbo.setAttributeValue(key.toLowerCase(), value, true);
+ }
+ }
+ cbo.setOid(bo.oid);
+ cbo.setTs(bo.ts);
+ updateList.add(cbo);
+ }
+ } else {
+ //澶勭悊cbo鐨勬枃浠朵俊鎭�
+ Map<String, String> fileMap = fileMap_.get(cbo.getOid());
+ for(String key : fileMap.keySet()){
+ String value = fileMap.get(key);
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)
+ if(key.equalsIgnoreCase("_attach")){
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)鏃� , 鏂囦欢鐨刣ocumentoid
+ String docId = cbo.getOid();
+
+ String[] paths = value.split(";");
+ for (String path : paths) {
+ File file = files.get(path);
+ String fileName = file.getName();
+
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject.setAttributeValue("documentoid", docId);
+ fileObject = operation.createNewFile(file.getAbsolutePath(), fileObject);
+ }
+ //鏂囦欢鏄璞″睘鎬�(濡俻ersonallog)
+ }else{
+ File file = files.get(value);
+ String fileName = file.getName();
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject = operation.createNewFile(file.getAbsolutePath(),
+ fileObject);
+ value = fileObject.getOid();
+ cbo.setAttributeValue(key.toLowerCase(), value, true);
+ }
+ }
+ createList.add(cbo);
+ }
+ }
+ }else{
+ createList.addAll(allBoList);
+ }
+
+ boolean flag = false;
+ if(createList.size() > 0){
+ ClientBusinessObject[] bos = getInstanceBo().batchSaveCreateBuinessObject(createList.toArray(new ClientBusinessObject[0]));
+ if(bos.length == createList.size()){
+ flag = true;
+ }
+ }else{
+ flag = true;
+ }
+ if(updateList.size() > 0){
+ flag &= getInstanceBo().batchUpdateBuinessObject(updateList.toArray(new ClientBusinessObject[0]));
+ }else{
+ flag &= true;
+ }
+ return flag;
+ }
+
+ /**
+ * 瀵煎叆涓氬姟瀵硅薄
+ * @param file
+ * @param fileName
+ * @param type
+ * @param updateFlag: 褰撴湁閲嶅璁板綍鏃�: 1:瑕嗙洊; 0:璺宠繃
+ * @return
+ * @throws VCIError
+ * @throws IOException
+ */
+ public static Map<String, String> importBOData(File file, String fileName, String type, int updateFlag) throws VCIError, IOException{
+ Map<String, String> infoMap = new HashMap<String, String>();
+ //鍘嬬缉鏂囦欢涓殑excel鏁版嵁鏂囦欢
+ InputStream dataInputStream = null;
+ Map<String, File> files = new HashMap<String, File>();
+ boolean zipFlag = false;
+ if(fileName.endsWith(".zip")){
+ zipFlag = true;
+ ZipFile zipFile = new ZipFile(file);
+ Enumeration<? extends ZipEntry> entries = zipFile.entries();
+ String tempFolder = file.getParent();
+ while(entries.hasMoreElements()){
+ ZipEntry zipEntry = entries.nextElement();
+ if(!zipEntry.isDirectory()){
+ String fileName_ = zipEntry.getName();
+ InputStream inputStream_ = zipFile.getInputStream(zipEntry);
+ if(fileName_.endsWith(".xlsx") || fileName_.endsWith(".xls")){
+ fileName = fileName_;
+ dataInputStream = inputStream_;
+ }else{
+ String filePath = tempFolder + "\\" + fileName_;
+ File tempFile = new File(filePath);
+ File folder = tempFile.getParentFile();
+ if(!folder.exists()){
+ folder.mkdirs();
+ }
+ if(!tempFile.exists()){
+ tempFile.createNewFile();
+ }
+ BufferedInputStream inBuff = new BufferedInputStream(inputStream_);
+ BufferedOutputStream outBuff = new BufferedOutputStream(new FileOutputStream(tempFile));
+
+ byte[] b = new byte[1024 * 512];
+ int len;
+ while((len = inBuff.read(b)) != -1){
+ outBuff.write(b, 0, len);
+ }
+
+ files.put(fileName_, tempFile);
+ inBuff.close();
+ outBuff.close();
+ }
+ }
+ }
+ }
+ BufferedInputStream bs;
+ if(zipFlag){
+ bs = new BufferedInputStream(dataInputStream);
+ }else{
+ bs = new BufferedInputStream(new FileInputStream(file));
+ }
+ List<SheetDataSet> sheetDataSets = ExcelDocumentUtils
+ .readExcelDocument(fileName, bs);
+ List<String[]> dataSets = sheetDataSets.get(0).getDataSet();
+ String[] dataSet = dataSets.get(0);
+ Set<String> typeSet = new HashSet<String>();
+ Map<Integer, String> typeAttMap = new HashMap<Integer, String>();
+
+ //鍒ら噸鍒�
+ List<String> uniqueCols = new ArrayList<String>();
+ //鏂囦欢鍒�
+ List<String> fileCols = new ArrayList<String>();
+ for(int i = 0; i < dataSet.length; i++){
+ String data = dataSet[i];
+ String[] data_ = data.split("\\.");
+ typeSet.add(data_[0]);
+
+ //鍒ら噸鍒楁爣璇�
+ if(data_[1].endsWith("*")){
+ uniqueCols.add(data_[1].substring(0, data_[1].indexOf("*")).toUpperCase());
+ data = data.substring(0, data.indexOf("*"));
+ //鏂囦欢鍒楁爣璇�
+ }else if(data_[1].endsWith("+")){
+ fileCols.add(data_[1].substring(0, data_[1].indexOf("+")).toUpperCase());
+ data = data.substring(0, data.indexOf("+"));
+ }
+ typeAttMap.put(i, data);
+ }
+
+ if(!typeSet.contains(type)){
+ infoMap.put(ERROR, "鏂囦欢涓棤璇ョ被鍨嬫暟鎹�");
+ return infoMap;
+ }
+ if(typeSet.size() > 1){
+ infoMap.put(ERROR, "鏂囦欢涓惈鏈夊叾浠栫被鍨嬫暟鎹�");
+ return infoMap;
+ }
+
+ boolean flag = false;
+ if(zipFlag){
+ flag = getInstance().saveBOsWithFile(dataSets, typeAttMap, type, uniqueCols, updateFlag, fileCols, files);
+ }else{
+ flag = getInstance().saveBOs(dataSets, typeAttMap, type, uniqueCols, updateFlag);
+ }
+
+ //鍒犻櫎涓存椂鏂囦欢
+ for(Iterator<String> ite = files.keySet().iterator(); ite.hasNext();){
+ String fileName_ = ite.next();
+ File file_ = files.get(fileName_);
+ file_.delete();
+ }
+ file.delete();
+
+ if(flag){
+ infoMap.put(RESULT, TRUE);
+ }else{
+ infoMap.put(RESULT, FALSE);
+ }
+ return infoMap;
+ }
+
+ /**
+ * 淇濆瓨涓氬姟瀵硅薄
+ * 褰撳璞′笉瀛樺湪鏃�, 鍒涘缓瀵硅薄;
+ * 瀛樺湪鏃�(unique), 鏇存柊瀵硅薄.
+ * @param dataSet
+ * @param typeAttMap
+ * @param type
+ * @param uniqueCols : 鍒ら噸鍒�
+ * @return
+ * @throws PLMError
+ * @throws VciException
+ */
+ private boolean saveBOs(List<String[]> dataSets, Map<Integer, String> typeAttMap, String type, List<String> uniqueCols, int updateFlag) throws VCIError {
+ List<ClientBusinessObject> createList = new ArrayList<ClientBusinessObject>();
+ List<ClientBusinessObject> updateList = new ArrayList<ClientBusinessObject>();
+ List<ClientBusinessObject> allBoList = new ArrayList<ClientBusinessObject>();
+ Map<String, Map<String, String>> map_ = new HashMap<String, Map<String,String>>();
+ ClientBusinessObject source = getInstanceBo().createBusinessObject(type);
+ for(int i = 1; i < dataSets.size(); i++){
+ ClientBusinessObject cbo = BOTool.cloneClientBusinessObject(source, true);
+ String[] data = dataSets.get(i);
+ Map<String, String> map = new HashMap<String, String>();
+ for(int k = 0; k < data.length; k++){
+ String key = typeAttMap.get(k).split("\\.")[1];
+ String value = data[k];
+
+ value = checkEnum(key, value);
+ if(key.equalsIgnoreCase("ID") || key.equalsIgnoreCase("NAME") || key.equalsIgnoreCase("DESCRIPTION")){
+ map.put(key.toLowerCase(), value);
+ }
+ cbo.setAttributeValue(key.toLowerCase(), value, true);
+ }
+ map_.put(cbo.getOid(), map);
+ allBoList.add(cbo);
+ }
+
+ if(uniqueCols.size() > 0 && allBoList.size() > 0){
+ List<BusinessObject> queryBO = queryBO(allBoList, uniqueCols);
+ for(ClientBusinessObject cbo : allBoList){
+ BusinessObject bo = isExistBo(cbo, uniqueCols, queryBO);
+ if (bo != null) {
+ if(updateFlag == 1){
+ Map<String, String> map = map_.get(cbo.getOid());
+ if (map.get("id") != null) {
+ cbo.setAttributeValue("id", map.get("id"));
+ }
+ if (map.get("name") != null) {
+ cbo.setAttributeValue("name", map.get("name"));
+ }
+ if (map.get("description") != null) {
+ cbo.setAttributeValue("description", map.get("description"));
+ }
+ cbo.setOid(bo.oid);
+ cbo.setTs(bo.ts);
+ updateList.add(cbo);
+ }
+ } else {
+ createList.add(cbo);
+ }
+ }
+ }else{
+ createList.addAll(allBoList);
+ }
+ boolean flag = false;
+ if(createList.size() > 0){
+ ClientBusinessObject[] bos = getInstanceBo().batchSaveCreateBuinessObject(createList.toArray(new ClientBusinessObject[0]));
+ if(bos.length == createList.size()){
+ flag = true;
+ }
+ }else{
+ flag = true;
+ }
+ if(updateList.size() > 0){
+ flag &= getInstanceBo().batchUpdateBuinessObject(updateList.toArray(new ClientBusinessObject[0]));
+ }else{
+ flag &= true;
+ }
+ return flag;
+ }
+
+ /**
+ * 淇濆瓨涓氬姟瀵硅薄
+ * 褰撳璞′笉瀛樺湪鏃�, 鍒涘缓瀵硅薄;
+ * 瀛樺湪鏃�(unique), 鏇存柊瀵硅薄.
+ * @param dataSet
+ * @param typeAttMap
+ * @param type
+ * @param uniqueCols : 鍒ら噸鍒�
+ * @param updateFlag
+ * @param fileCols : 鏂囦欢璺緞鍒�
+ * @param files : Map<fileName, tempFile>
+ * @return
+ * @throws PLMError
+ * @throws VciException
+ */
+ private boolean saveBOsWithFile(List<String[]> dataSets, Map<Integer, String> typeAttMap, String type, List<String> uniqueCols, int updateFlag, List<String> fileCols, Map<String, File> files) throws VCIError {
+ List<ClientBusinessObject> createList = new ArrayList<ClientBusinessObject>();
+ List<ClientBusinessObject> updateList = new ArrayList<ClientBusinessObject>();
+ List<ClientBusinessObject> allBoList = new ArrayList<ClientBusinessObject>();
+ Map<String, Map<String, String>> map_ = new HashMap<String, Map<String,String>>();
+ Map<String, Map<String, String>> fileMap_ = new HashMap<String, Map<String,String>>();
+ ClientBusinessObject source = getInstanceBo().createBusinessObject(type);
+ ClientFileObjectOperation operation = new ClientFileObjectOperation();
+ for(int i = 1; i < dataSets.size(); i++){
+ ClientBusinessObject cbo = BOTool.cloneClientBusinessObject(source, true);
+ String[] data = dataSets.get(i);
+ Map<String, String> map = new HashMap<String, String>();
+ Map<String, String> fileMap = new HashMap<String, String>();
+ for(int k = 0; k < data.length; k++){
+ String key = typeAttMap.get(k).split("\\.")[1];
+ String value = data[k];
+
+ value = checkEnum(key, value);
+ if(key.equalsIgnoreCase("ID") || key.equalsIgnoreCase("NAME") || key.equalsIgnoreCase("DESCRIPTION")){
+ map.put(key.toLowerCase(), value);
+ //涓婁紶鏂囦欢
+ }else if(fileCols.contains(key.toUpperCase())){
+ if(uniqueCols.size() > 0){
+ //鏂囦欢淇℃伅鍦ㄥ垽閲嶅悗鍐嶈ˉ鍏呭埌瀵硅薄
+ fileMap.put(key, value);
+ continue;
+ }else{
+ //涓嶉渶鍒ら噸锛屾枃浠朵俊鎭洿鎺ュ湪姝ゅ鐞�
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)
+ if(key.equalsIgnoreCase("_attach")){
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)鏃� , 鏂囦欢鐨刣ocumentoid
+ String docId = cbo.getOid();
+
+ String[] paths = value.split(";");
+ for (String path : paths) {
+ File file = files.get(path);
+ String fileName = file.getName();
+
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject.setAttributeValue("documentoid", docId);
+ fileObject = operation.createNewFile(file.getAbsolutePath(), fileObject);
+ }
+ continue;
+ //鏂囦欢鏄璞″睘鎬�(濡俻ersonallog)
+ }else{
+ File file = files.get(value);
+ String fileName = file.getName();
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject = operation.createNewFile(file.getAbsolutePath(),
+ fileObject);
+ value = fileObject.getOid();
+ }
+ }
+ }
+ cbo.setAttributeValue(key.toLowerCase(), value, true);
+ }
+ map_.put(cbo.getOid(), map);
+ fileMap_.put(cbo.getOid(), fileMap);
+ allBoList.add(cbo);
+ }
+ if(uniqueCols.size() > 0 && allBoList.size() > 0){
+ List<BusinessObject> queryBO = queryBO(allBoList, uniqueCols);
+ for(ClientBusinessObject cbo : allBoList){
+ BusinessObject bo = isExistBo(cbo, uniqueCols, queryBO);
+ if (bo != null) {
+ if(updateFlag == 1){
+ Map<String, String> map = map_.get(cbo.getOid());
+ if (map.get("id") != null) {
+ cbo.setAttributeValue("id", map.get("id"));
+ }
+ if (map.get("name") != null) {
+ cbo.setAttributeValue("name", map.get("name"));
+ }
+ if (map.get("description") != null) {
+ cbo.setAttributeValue("description", map.get("description"));
+ }
+ //澶勭悊cbo鐨勬枃浠朵俊鎭�
+ Map<String, String> fileMap = fileMap_.get(cbo.getOid());
+ for(String key : fileMap.keySet()){
+ String value = fileMap.get(key);
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)
+ if(key.equalsIgnoreCase("_attach")){
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)鏃� , 鏂囦欢鐨刣ocumentoid
+ String docId = bo.oid;
+
+ // 鍒犻櫎瀵硅薄鍏宠仈鐨勬枃妗�
+ ClientBusinessObject[] fObjs = getClientFileObjectByDocId(docId);
+ if (fObjs != null && fObjs.length > 0) {
+ getInstanceBo().batchDeleteBuinessObject(fObjs);
+ }
+
+ // 鍒涘缓瀵硅薄鍏宠仈鐨勬枃妗�
+ String[] paths = value.split(";");
+ for (String path : paths) {
+ File file = files.get(path);
+ String fileName = file.getName();
+
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject.setAttributeValue("documentoid", docId);
+ fileObject = operation.createNewFile(file.getAbsolutePath(), fileObject);
+ }
+ //鏂囦欢鏄璞″睘鎬�(濡俻ersonallog)
+ }else{
+ File file = files.get(value);
+ String fileName = file.getName();
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject = operation.createNewFile(file.getAbsolutePath(),
+ fileObject);
+ value = fileObject.getOid();
+ cbo.setAttributeValue(key.toLowerCase(), value, true);
+ }
+ }
+ cbo.setOid(bo.oid);
+ cbo.setTs(bo.ts);
+ updateList.add(cbo);
+ }
+ } else {
+ //澶勭悊cbo鐨勬枃浠朵俊鎭�
+ Map<String, String> fileMap = fileMap_.get(cbo.getOid());
+ for(String key : fileMap.keySet()){
+ String value = fileMap.get(key);
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)
+ if(key.equalsIgnoreCase("_attach")){
+ //鏂囦欢浠ラ檮浠跺舰寮忓皢瀵硅薄浣滀负澶栭敭(濡侱ocument)鏃� , 鏂囦欢鐨刣ocumentoid
+ String docId = cbo.getOid();
+
+ String[] paths = value.split(";");
+ for (String path : paths) {
+ File file = files.get(path);
+ String fileName = file.getName();
+
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject.setAttributeValue("documentoid", docId);
+ fileObject = operation.createNewFile(file.getAbsolutePath(), fileObject);
+ }
+ //鏂囦欢鏄璞″睘鎬�(濡俻ersonallog)
+ }else{
+ File file = files.get(value);
+ String fileName = file.getName();
+ FileObject fileObject = operation.createNewFile();
+ fileObject.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
+ fileObject.setRevisionLimit(7);
+ fileObject.setName(fileName);
+ fileObject = operation.createNewFile(file.getAbsolutePath(),
+ fileObject);
+ value = fileObject.getOid();
+ cbo.setAttributeValue(key.toLowerCase(), value, true);
+ }
+ }
+ createList.add(cbo);
+ }
+ }
+ }else{
+ createList.addAll(allBoList);
+ }
+ boolean flag = false;
+ if(createList.size() > 0){
+ ClientBusinessObject[] bos = getInstanceBo().batchSaveCreateBuinessObject(createList.toArray(new ClientBusinessObject[0]));
+ if(bos.length == createList.size()){
+ flag = true;
+ }
+ }else{
+ flag = true;
+ }
+ if(updateList.size() > 0){
+ flag &= getInstanceBo().batchUpdateBuinessObject(updateList.toArray(new ClientBusinessObject[0]));
+ }else{
+ flag &= true;
+ }
+ return flag;
+ }
+
+ /**
+ * 鍒嗘鏌ヨ鍑烘弧瓒冲垽閲嶆潯浠�(F_OID, T_OID)鐨凩O
+ * @param allLoList
+ * @return
+ */
+ private List<LinkObject> queryLO(List<ClientLinkObject> allLoList) {
+ List<LinkObject> queryLoList = new ArrayList<LinkObject>();
+ QueryTemplate qt = new QueryTemplate();
+ qt.setId("id");
+ qt.setType(QTConstants.TYPE_LINK);
+ List<String> clauseList = new ArrayList<String>();
+ clauseList.add("*");
+ qt.setClauseList(clauseList);
+ ClientLinkObject clo = allLoList.get(0);
+ qt.setLinkType(clo.getLoName());
+
+ int size = allLoList.size();
+
+ for(int k = 0; k < size/PARTIONSIZE + 1; k++){
+ Condition cond = new Condition();
+ for(int m = k * PARTIONSIZE; m < (k + 1) * PARTIONSIZE && m < size; m++){
+ ClientLinkObject clo_ = allLoList.get(m);
+ Map<String, String> map_ = new HashMap<String, String>();
+ map_.put("f_oid", clo_.getFromOid());
+ map_.put("t_oid", clo_.getToOid());
+ Condition cond_ = OQTool.getCondition(map_);
+
+ cond = OQTool.mergeCondition(cond, cond_, Connector.OR);
+ }
+ qt.setCondition(cond);
+
+ try {
+ LinkObject[] los = QTClient.getService().findLTObjects(qt.getId(), OQTool.getQTTextByQT(qt));
+ queryLoList.addAll(LOTool.ArrayTOList(los));
+ } catch (VCIError e) {
+ e.printStackTrace();
+ }
+ }
+ return queryLoList;
+ }
+
+ /**
+ * 鏍规嵁f_oid , t_oid鍦╭ueryLO涓垽鏂璞℃槸鍚﹀凡缁忓瓨鍦�
+ * @param clo
+ * @param queryLO
+ * @return
+ */
+ private LinkObject isExistLo(ClientLinkObject clo, List<LinkObject> queryLO) {
+ for(LinkObject lo : queryLO){
+ if(lo.fromOid.equals(clo.getFromOid())
+ && lo.toOid.equals(clo.getToOid())){
+ return lo;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 鍒嗘鏌ヨ鍑烘弧瓒冲垽閲嶆潯浠剁殑BO
+ * @param allBoList
+ * @param uniqueCols
+ * @return
+ */
+ private List<BusinessObject> queryBO(
+ List<ClientBusinessObject> allBoList, List<String> uniqueCols) {
+ List<BusinessObject> queryBoList = new ArrayList<BusinessObject>();
+ int size = allBoList.size();
+ String type = allBoList.get(0).getBtmName();
+ QueryTemplate qt = new QueryTemplate();
+ qt.setId("qt");
+ qt.setBtmType(type);
+ List<String> clauseList = new ArrayList<String>();
+ clauseList.add("*");
+ qt.setClauseList(clauseList);
+ qt.setType(QTConstants.TYPE_BTM);
+
+ for(int k = 0; k < size/PARTIONSIZE + 1; k++){
+ Condition cond = new Condition();
+ for(int m = k * PARTIONSIZE; m < (k + 1) * PARTIONSIZE && m < size; m++){
+ ClientBusinessObject cbo = allBoList.get(m);
+ Map<String, String> map = new HashMap<String, String>();
+ for(String uniqueCol : uniqueCols){
+ if(uniqueCol.equalsIgnoreCase("ID")){
+ map.put("id", cbo.getId());
+ continue;
+ }
+ if(uniqueCol.equalsIgnoreCase("NAME")){
+ map.put("name", cbo.getName());
+ continue;
+ }
+ if(uniqueCol.equalsIgnoreCase("DESCRIPTION")){
+ map.put("description", cbo.getDescription());
+ continue;
+ }
+ String attributeValue = cbo.getAttributeValue(uniqueCol);
+ if(attributeValue != null && !attributeValue.equals("")){
+ map.put(uniqueCol, attributeValue);
+ }
+ }
+ Condition cond_ = OQTool.getCondition(map);
+ cond = OQTool.mergeCondition(cond, cond_, Connector.OR);
+ }
+ qt.setCondition(cond);
+ BusinessObject[] bos = null;
+ try {
+ bos = QTClient.getService().findBTMObjects(qt.getId(), OQTool.getQTTextByQT(qt));
+ queryBoList.addAll(BOTool.ArrayTOList(bos));
+ } catch (VCIError e) {
+ e.printStackTrace();
+ }
+ }
+ return queryBoList;
+ }
+
+ /**
+ * 鏍规嵁uniqueCols鍦╞oList涓垽鏂璫bo瀵硅薄鏄惁宸茬粡瀛樺湪
+ * 澶勭悊绯荤粺灞炴��:id/name/description (鍥犱粎姝や笁涓郴缁熷睘鎬у彲鐢ㄦ埛璁剧疆)
+ * 澶勭悊鑷畾涔夊睘鎬�:cbo.getAttributeValue(attrName)
+ * @param uniqueCols
+ * @param id
+ * @param type
+ * @return
+ * @throws VciException
+ * @throws PLMError
+ */
+ private BusinessObject isExistBo(ClientBusinessObject cbo, List<String> uniqueCols, List<BusinessObject> boList){
+ for(BusinessObject bo : boList){
+ boolean flag = true;
+ for(String uniqueCol : uniqueCols){
+ if(uniqueCol.equalsIgnoreCase("ID")){
+ if(!cbo.getId().equals(bo.id)){
+ flag = false;
+ break;
+ }
+ }else if(uniqueCol.equalsIgnoreCase("NAME")){
+ if(!cbo.getName().equals(bo.name)){
+ flag = false;
+ break;
+ }
+ }else if(uniqueCol.equalsIgnoreCase("DESCRIPTION")){
+ if(!cbo.getDescription().equals(bo.description)){
+ flag = false;
+ break;
+ }
+ }else{
+ String attributeValue = cbo.getAttributeValue(uniqueCol);
+ if (attributeValue != null && !attributeValue.equals("")) {
+ String boAttVal = BOTool.getBOAttVal(bo, uniqueCol);
+ if (!attributeValue.equals(boAttVal)) {
+ flag = false;
+ break;
+ }
+ }
+ }
+ }
+ if(flag){
+ return bo;
+ }
+ }
+ return null;
+ }
+ /**
+ * 鑻ュ睘鎬т娇鐢ㄦ灇涓�, 灏嗗緱鍒扮殑鏋氫妇鍚嶈浆鎹负瀵瑰簲鐨勬灇涓惧��
+ * @param key
+ * @param value
+ * @return
+ */
+ private String checkEnum(String key, String value) {
+ AttribItem att = ApProvider.getInstance().getAbItemByName(key.toLowerCase());
+ String enumName = OQTool.getOtherValueByType(att.other, AttributeConstants.ENUMNAME);
+ if(enumName == null || enumName.equals("")){
+ return value;
+ }
+ EnumItem enumItem = EnumProvider.getInstance().getEnumByName(enumName);
+ EnumChild[] children = enumItem.children;
+ for(int i = 0; i < children.length; i++){
+ EnumChild child = children[i];
+ if(child.name.equalsIgnoreCase(value)){
+ return child.value;
+ }
+ }
+ return value;
+ }
+
+ /**
+ * 鏌ヨ瀵硅薄鍏宠仈鐨勬枃妗�
+ * @param docId
+ * @return
+ */
+ private BusinessObject[] getFileObjectByDocId(String docId){
+ QueryTemplate qt = new QueryTemplate();
+ qt.setId("id");
+ qt.setType(QTConstants.TYPE_BTM);
+ qt.setBtmType(FileTypeConstants.FILE_DATA_TABLE);
+ List<String> clauseList = new ArrayList<String>();
+ clauseList.add("*");
+ qt.setClauseList(clauseList);
+ Map<String, String> arg0 = new HashMap<String, String>();
+ arg0.put("documentoid", docId);
+ Condition condition = OQTool.getCondition(arg0 );
+ qt.setCondition(condition);
+ try {
+ return QTClient.getService().findBTMObjects(qt.getId(), OQTool.qtTOXMl(qt).asXML());
+ } catch (VCIError e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * 鏌ヨ瀵硅薄鍏宠仈鐨勬枃妗�
+ * @param docId
+ * @return
+ */
+ private ClientBusinessObject[] getClientFileObjectByDocId(String docId){
+ List<ClientBusinessObject> cbos = new ArrayList<ClientBusinessObject>();
+ BusinessObject[] bos = getFileObjectByDocId(docId);
+ if(bos != null && bos.length > 0){
+ for(BusinessObject bo : bos){
+ ClientBusinessObject cbo = new ClientBusinessObject();
+ cbo.setBusinessObject(bo);
+ cbos.add(cbo);
+ }
+ }
+ return cbos.toArray(new ClientBusinessObject[0]);
+ }
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/utils/LOTool.java b/Source/Client/PLTClient/src/com/vci/client/utils/LOTool.java
new file mode 100644
index 0000000..e8e4ec1
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/utils/LOTool.java
@@ -0,0 +1,84 @@
+package com.vci.client.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.vci.client.bof.ClientLinkObject;
+import com.vci.common.utility.ObjectUtility;
+import com.vci.corba.omd.data.AttributeValue;
+import com.vci.corba.omd.data.LinkObject;
+
+public class LOTool {
+ /**
+ * 鑾峰彇鎸囧畾BO鐨勬寚瀹歛ttVal
+ * @param lo
+ * @param attName
+ * @return
+ */
+ public static String getLOAttVal(LinkObject lo, String attName){
+ AttributeValue[] attrValList = lo.hisAttrValList;
+ for(int i = attrValList.length - 1; i >= 0; i--){
+ AttributeValue attVal = attrValList[i];
+ if(attVal.attrName.equalsIgnoreCase(attName)){
+ return attVal.attrVal;
+ }
+ }
+ return null;
+ }
+
+ public static List<LinkObject> ArrayTOList(LinkObject[] los){
+ List<LinkObject> list = new ArrayList<LinkObject>();
+ for(LinkObject lo : los){
+ list.add(lo);
+ }
+ return list;
+ }
+
+ /**
+ * 鍏嬮殕涓�涓狶O瀵硅薄锛屽缓绔嬩竴涓柊鐨勫璞★紝鍙鍒跺睘鎬�
+ * @param source lo瀵硅薄
+ * @return
+ * @throws Exception
+ */
+ public static ClientLinkObject cloneClientLinkObject(ClientLinkObject source, boolean isNew){
+ if(source == null){
+ return null;
+ }
+ //鑾峰緱绌虹殑lo瀵硅薄
+ //ClientLinkObject newlo = loOperation.createLinkObject(loType);
+ ClientLinkObject newlo = new ClientLinkObject();
+ //璁剧疆鏂扮殑LO鐨勪俊鎭�
+ if(isNew){
+ newlo.setOid(ObjectUtility.getNewObjectID36());
+ } else {
+ newlo.setOid(source.getLinkObject().oid);
+ }
+ newlo.setCreator(source.getCreator());
+ newlo.setCreateTime(source.getCreateTime());
+ newlo.setLastModifier(source.getLastModifier());
+ newlo.setLastModifyTime(source.getLastModifyTime());
+ newlo.setLoName(source.getLoName());
+ newlo.setFromBTMName(source.getLinkObject().fromBTName);
+ newlo.setFromNameOid(source.getLinkObject().fromNameOid);
+ newlo.setFromOid(source.getLinkObject().fromOid);
+ newlo.setFromRevisionOid(source.getLinkObject().fromRevOid);
+ newlo.setToBTMName(source.getLinkObject().toBTName);
+ newlo.setToNameOid(source.getLinkObject().toNameOid);
+ newlo.setToOid(source.getLinkObject().toOid);
+ newlo.setToRevisionOid(source.getLinkObject().toRevOid);
+ newlo.setTs(source.getLinkObject().ts);
+ //璁剧疆lo鐨勫睘鎬�
+ AttributeValue[] attrs = source.getLinkObject().newAttrValList;
+ if(attrs != null){
+ AttributeValue[] newAttrs = new AttributeValue[attrs.length];
+ for(int i = 0; i < attrs.length; i++){
+ AttributeValue av = new AttributeValue();
+ av.attrName = attrs[i].attrName;
+ av.attrVal = "";
+ newAttrs[i] = av;
+ }
+ newlo.getLinkObject().newAttrValList = newAttrs;
+ }
+ return newlo;
+ }
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/utils/excel/ExcelCellStyleSettingCallback.java b/Source/Client/PLTClient/src/com/vci/client/utils/excel/ExcelCellStyleSettingCallback.java
new file mode 100644
index 0000000..011ce75
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/utils/excel/ExcelCellStyleSettingCallback.java
@@ -0,0 +1,7 @@
+package com.vci.client.utils.excel;
+
+import org.apache.poi.ss.usermodel.Workbook;
+
+public interface ExcelCellStyleSettingCallback {
+ public WorkboolStyleSetting doSetWorkbookStyle(Workbook workbook);
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/utils/excel/ExcelDocumentUtils.java b/Source/Client/PLTClient/src/com/vci/client/utils/excel/ExcelDocumentUtils.java
index e9e7d61..93a8eb8 100644
--- a/Source/Client/PLTClient/src/com/vci/client/utils/excel/ExcelDocumentUtils.java
+++ b/Source/Client/PLTClient/src/com/vci/client/utils/excel/ExcelDocumentUtils.java
@@ -23,7 +23,6 @@
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import com.vci.client.ui.excel.ExcelFileOperation;
import com.vci.corba.common.VCIError;
public class ExcelDocumentUtils {
diff --git a/Source/Client/PLTClient/src/com/vci/client/utils/excel/ExcelFileOperation.java b/Source/Client/PLTClient/src/com/vci/client/utils/excel/ExcelFileOperation.java
new file mode 100644
index 0000000..c83d076
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/utils/excel/ExcelFileOperation.java
@@ -0,0 +1,588 @@
+package com.vci.client.utils.excel;
+
+import java.awt.Component;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.poi.hssf.OldExcelFormatException;
+import org.apache.poi.hssf.usermodel.HSSFCell;
+import org.apache.poi.hssf.usermodel.HSSFDateUtil;
+import org.apache.poi.hssf.usermodel.HSSFFont;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.DataFormat;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import com.vci.client.ui.exception.VCIException;
+import com.vci.client.ui.swing.VCISwingUtil;
+import com.vci.client.ui.swing.components.VCIJOptionPane;
+
+/**
+ * <p>
+ * Title: read infos from excel file or write infos into excel file.
+ * </p>
+ * <p>
+ * Description:
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2009
+ * </p>
+ * <p>
+ * Company: VCI
+ * </p>
+ *
+ * @author eddie
+ * @time 2009-6-15
+ * @version 1.0
+ */
+public class ExcelFileOperation {
+
+ public ExcelFileOperation() {
+
+ }
+
+ /**
+ * 鍐欏叆Excel
+ * <p>Description: </p>
+ * @author: xchao
+ * @time 2014-10-24 涓嬪崍5:51:15
+ * @param path 鏂囦欢璺緞
+ * @param excelInfoMap 鏁版嵁 key锛歴heetName value锛歋tring[][] 褰㈠紡鐨勬暟鎹�
+ * @param settingMap 涓烘瘡涓猻heet 璁剧疆鐨勬牱寮� key锛歴heetName value锛欵xcelCellStyleSettingCallback 褰㈠紡鐨勬暟鎹�
+ * @return 鏄惁鍐欏叆鎴愬姛
+ */
+ public boolean writeExcelFileInfo(String path, Map<String, String[][]> excelInfoMap,
+ Map<String, ExcelCellStyleSettingCallback> settingMap){
+ boolean isSucess = false;
+ if(path == null || excelInfoMap == null){
+ return isSucess;
+ }
+ FileOutputStream fos = null;
+ try {
+ fos = new FileOutputStream(path);
+ Workbook wb = null;
+ boolean isEndWithXlsx = path.endsWith(".xlsx");
+ if(isEndWithXlsx){
+ SXSSFWorkbook swb = new SXSSFWorkbook(100);
+ swb = new SXSSFWorkbook(100);
+ swb.setCompressTempFiles(true);
+ wb = swb;
+ } else{
+ // 鐢� HSSFWorkbook 澶勭悊2003鎴栦互涓嬬増鏈珽XCEL鏂囦欢
+ wb = new HSSFWorkbook();
+ }
+ Iterator<String> its = excelInfoMap.keySet().iterator();
+ while(its.hasNext()){
+ String sheetName = its.next();
+ Sheet sheet = wb.createSheet(sheetName);
+ String[][] excelInfos = excelInfoMap.get(sheetName);
+ if(excelInfos == null) continue;
+ ExcelCellStyleSettingCallback setting = settingMap == null ? null : settingMap.get(sheetName);
+ isSucess &= writeExcelInfo(wb, sheet, excelInfos, setting, isEndWithXlsx);
+ }
+ wb.write(fos);
+ fos.close();
+ isSucess = true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ isSucess = false;
+ throw new RuntimeException(e);
+ } finally{
+ if(fos != null){
+ try {
+ fos.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return isSucess;
+ }
+
+ private boolean writeExcelInfo(Workbook wb, Sheet sheet, String[][] excelInfos, ExcelCellStyleSettingCallback setting, boolean isEndWithXlsx){
+ boolean isSucess = false;
+ WorkboolStyleSetting wbStyleSetting = null;
+ LinkedHashMap<String, CellStyle> styleMap = null;
+ if(setting != null){
+ wbStyleSetting = setting.doSetWorkbookStyle(wb);
+ styleMap = wbStyleSetting.getStyleMap();
+ }
+
+ // 鏂囨湰绫诲瀷鍒楁牱寮�
+ DataFormat fmt = wb.createDataFormat();
+ CellStyle textStyle = wb.createCellStyle();
+ textStyle.setDataFormat(fmt.getFormat("@"));
+
+ int row = excelInfos.length;
+ int column = -1;
+ for (int i = 0; i < row; i++) {
+ Row rowData = sheet.createRow(i);
+ column = excelInfos[i].length;
+ for (int j = 0; j < column; j++) {
+ Cell cell = rowData.createCell(j);
+ if (excelInfos[i][j] == null) {
+ cell.setCellValue("");
+ } else {
+ cell.setCellValue("" + excelInfos[i][j]);
+ }
+ cell.setCellType(Cell.CELL_TYPE_STRING);
+ if(styleMap != null && styleMap.containsKey(""+i+"*"+j+"")){
+ CellStyle cs = styleMap.get(""+i+"*"+j+"");
+ cs.setDataFormat(textStyle.getDataFormat());
+ cell.setCellStyle(cs);
+ } else{
+ cell.setCellStyle(textStyle);
+ }
+ }
+ }
+
+ // add by xchao 2013.10.28 begin
+ if(!isEndWithXlsx){
+ // 璁剧疆鍒楃殑鍗曞厓鏍肩被鍨嬩负鏂囨湰
+ for(int i = 0; i < 256; i++){
+ sheet.setDefaultColumnStyle(i, textStyle);
+ }
+ }
+ // add by xchao 2013.10.28 end
+ isSucess = true;
+ return isSucess;
+ }
+
+ public boolean writeExcelFileInfo(String path, String sheetName, String[][] excelInfos, ExcelCellStyleSettingCallback setting){
+ Map<String, String[][]> excelInfoMap = new LinkedHashMap<String, String[][]>();
+ excelInfoMap.put(sheetName, excelInfos);
+ Map<String, ExcelCellStyleSettingCallback> settingMap = new LinkedHashMap<String, ExcelCellStyleSettingCallback>();
+ settingMap.put(sheetName, setting);
+ return writeExcelFileInfo(path, excelInfoMap, settingMap);
+ }
+
+ /**
+ * write infos into a excel file. The columns of every row are not equal.
+ *
+ * @param path
+ * String, the file's whole path
+ * @param sheetName
+ * String, sheet description
+ * @param excelInfos
+ * String[][], the infos which will be writed into excel file
+ * @return
+ */
+ public boolean writeExcelFileInfo(String path, String sheetName, String[][] excelInfos) {
+ return writeExcelFileInfo(path, sheetName,excelInfos, null);
+ }
+
+ /**
+ * 妫�鏌ユ寚瀹氳矾寰勭殑excel鏂囦欢鏄惁鏄兘澶熸敮鎸佺殑EXCEL鏂囦欢
+ * @param parentComponent 鐖跺鍣ㄥ璞�
+ * @param path 鏂囦欢瀹屾暣璺緞
+ * @return
+ */
+ public boolean isSupportExcelFormat(Component parentComponent, String path){
+ boolean res = false;
+ boolean isXls = (path.endsWith(".xls") || path.endsWith(".xlsx"));
+ // 濡傛灉鏄�.xlsx鏍煎紡锛屾鏌ユ牸寮忛棶棰橈紝浼氭湁鍗¢挐鐜拌薄锛屾晠绠�鍖栧鐞�
+ if(isXls){
+ return true;
+ }
+ File file = new File(path);
+ // 濡傛灉鏂囦欢鍚庣紑鏄痚xcel鏍煎紡锛屼絾鏂囦欢涓嶅瓨鍦ㄦ椂锛屾鏃惰繑鍥瀟rue
+ if(isXls && !file.exists()) {
+ return true;
+ }
+ if(file.length() == 0) return true;
+ Workbook wb = null;
+ POIFSFileSystem fs = null;
+ try{
+ // XSSFWorkbook 鏀寔OFFICE EXCEL 2007锛�
+ // 浣嗕笉鏀寔2003浠ヤ笅鐨勶紝鍖呭惈2003
+ wb = new XSSFWorkbook(new FileInputStream(path));
+ res = true;
+ }catch(Exception ex){
+ try {
+ // 鐢� HSSFWorkbook 澶勭悊2003鎴栦互涓嬬増鏈珽XCEL鏂囦欢
+ fs = new POIFSFileSystem(new FileInputStream(path));
+ wb = new HSSFWorkbook(fs);
+ res = true;
+ } catch(OldExcelFormatException e){
+ e.printStackTrace();
+ VCIJOptionPane.showError(parentComponent, "Excel鏂囦欢鐗堟湰閿欒锛屽綋鍓嶆敮鏀寔 Excel 97/2000/XP/2003/2007/2010");
+ res = false;
+ } catch(IOException e){
+ e.printStackTrace();
+ if(e.getMessage().contains("Invalid header signature")){
+ VCIJOptionPane.showError(parentComponent, "鏂囦欢绫诲瀷閿欒锛屼笉鏄湁鏁堢殑Excel鏂囦欢锛�");
+ }
+ res = false;
+ } catch(Exception e){
+ e.printStackTrace();
+ VCIJOptionPane.showError(parentComponent, "妫�鏌ユ枃浠舵槸鍚︽槸鏈夋晥鐨凟xcel鏂囦欢鏃跺彂鐢熼敊璇紒\n" + e.getMessage());
+ res = false;
+ }
+ }
+ return res;
+ }
+
+ /**
+ * 杩斿洖Excel鏂囦欢閲屾暟鎹紙鍏ㄩ儴Sheet锛�
+ * @param path Excel 鏂囦欢瀹屾暣璺緞
+ * @return
+ * @throws VCIException
+ */
+ public String[][][] readExcelFileInfos(String path) throws VCIException{
+ String[][][] res = new String[][][]{};
+ Workbook wb = getWorkBook(path);
+ if(wb == null){
+ return res;
+ }
+ int sheetCount = wb.getNumberOfSheets();
+ res = new String[sheetCount][0][0];
+ for(int sheetIndex = 0; sheetIndex < sheetCount; sheetIndex++){
+ res[sheetIndex] = readExcelFileInfo(path, sheetIndex);
+ }
+ return res;
+ }
+
+ /**
+ * 杩斿洖Excel鏂囦欢閲岀殑鏁版嵁锛堟牴鎹寚瀹氱殑Sheet鍚嶇О锛�
+ * @param path Excel 鏂囦欢瀹屾暣璺緞
+ * @param sheetName Sheet 鍚嶇О
+ * @return
+ * @throws VCIException
+ */
+ public String[][] readExcelFileInfo(String path, String sheetName) throws VCIException {
+ String[][] res = new String[][]{};
+ Workbook wb = getWorkBook(path);
+ if(wb == null){
+ return res;
+ }
+ int sheetIndex = wb.getSheetIndex(sheetName);
+ if(sheetIndex < 0){
+ return res;
+ }
+ return readExcelFileInfo(path, sheetIndex);
+ }
+ /**
+ * 杩斿洖Excel鏂囦欢閲岀殑鏁版嵁锛堥粯璁よ繑鍥炵涓�涓猄heet閲岀殑鏁版嵁锛�
+ * @param path Excel 鏂囦欢瀹屾暣璺緞
+ * @return
+ * @throws VCIException
+ */
+ public String[][] readExcelFileInfo(String path) throws VCIException {
+ return readExcelFileInfo(path, 0);
+ }
+
+ /**
+ * 杩斿洖Excel鏂囦欢閲岀殑鏁版嵁锛堟牴鎹寚瀹氱殑Sheet绱㈠紩锛�
+ * @param path Excel 鏂囦欢瀹屾暣璺緞
+ * @param sheetIndex Sheet绱㈠紩锛�0 ~ SheetCount - 1)
+ * @return
+ * @throws VCIException
+ */
+ public String[][] readExcelFileInfo(String path, int sheetIndex) throws VCIException {
+ String[][] excelInfos = null;
+ /**
+ * 璇诲彇閫昏緫&&绾︽潫
+ * 1銆佹爣棰�&鎶ご琛屼笉鑳藉嚭鐜颁换浣曠殑绌烘暟鎹垪
+ * 2銆佹爣棰�&鎶ご琛屼笉鑳藉嚭鐜扮函鏁板瓧鍒�
+ */
+ // 鍙朣heet瀵硅薄
+ Sheet sheet = this.getWorkbookSheet(path, sheetIndex);
+ if(sheet == null) return new String[0][0];
+ LinkedList<String[]> datas = new LinkedList<String[]>();
+ if(sheet.getLastRowNum() <= 0){
+ throw new VCIException(String.valueOf("99996"), new Object[]{});// 璇ユ枃浠跺彧鏈夋爣棰�&鎶ご琛屾垨娌℃湁鏁版嵁锛堣繛鏍囬&鎶ご琛岄兘娌℃湁锛夛紒
+ }
+
+ StringBuffer sbRowValueString = new StringBuffer();
+ // 鍙栨爣棰樿鏈夋晥鐨勫垪鏁�
+ int firstRowColumnNum = this.getFirstRowColumnNum(sheet);
+ for(int i = 0; i < sheet.getLastRowNum() + 1; i++){
+ Row row = sheet.getRow(i);
+ if(row == null) { // 鏁磋閮芥病鏈夋暟鎹�
+ i++;
+ continue;
+ }
+ sbRowValueString = new StringBuffer();
+ LinkedList<String> rowValue = new LinkedList<String>();
+ for (int j = 0; j < firstRowColumnNum; j++) {
+ Cell cell = row.getCell(j);
+ String cellValueString = "";
+ if(i == 0){// 鏍囬琛�
+ // 绉婚櫎鏁版嵁鍒椾腑鍓嶅彲鍦ㄥ瓨鍦ㄧ殑"'"
+ String val = cell.getStringCellValue();
+ while(val.startsWith("'")){
+ val = val.substring(1);
+ }
+ cellValueString = val;
+ rowValue.add(val);
+ sbRowValueString.append(cellValueString);
+ }else{// 鏁版嵁琛�
+ // 澶勭悊鏁版嵁琛屼腑鐨勭┖鏁版嵁
+ if(cell == null){
+ cellValueString = "";
+ }else{
+ cellValueString = getCellValue(cell);
+ }
+ rowValue.add(cellValueString);
+ sbRowValueString.append(cellValueString);
+ }
+ }
+ // add by xchao 濡傛灉鏁版嵁琛岀殑鏁版嵁鍏ㄩ儴涓虹┖锛屽垯涓嶆坊鍔�
+ if(sbRowValueString.length() != 0){
+ datas.add(rowValue.toArray(new String[]{}));
+ }
+ }
+ excelInfos = datas.toArray(new String[][]{});
+ return excelInfos;
+ }
+
+ public static String getCellValue(Cell cell){
+ String cellValueString = "";
+ if(cell == null) return cellValueString;
+ int cellType = cell.getCellType();
+ NumberFormat numFormat = NumberFormat.getInstance(Locale.CHINA);
+ SimpleDateFormat sdfDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ // add by xchao 2012.11.22 澶勭悊鏃ユ湡绫诲瀷鍜孋ell
+ if(cellType == Cell.CELL_TYPE_NUMERIC && HSSFDateUtil.isCellDateFormatted(cell)){
+ Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
+ cellValueString = sdfDateTime.format(date);
+ }
+ else if(cellType == Cell.CELL_TYPE_BLANK){
+ cellValueString = "";
+ } else if(cellType == Cell.CELL_TYPE_BOOLEAN){
+ cellValueString = cell.getBooleanCellValue() ? "1" : "0";
+ } else if(cellType == Cell.CELL_TYPE_ERROR){
+ cellValueString = "";
+ } else if(cellType == Cell.CELL_TYPE_FORMULA){
+ try{
+ cellValueString = String.valueOf(cell.getNumericCellValue());
+ } catch (Exception e) {
+ cellValueString = cell.getRichStringCellValue().getString();
+ }
+ } else if(cellType == Cell.CELL_TYPE_NUMERIC){
+// String[] dataFormatStrings = cell.getCellStyle().getDataFormatString().replace("_", "").trim().split("\\.");
+// int maxFracDigits = 0;
+// if(dataFormatStrings.length == 2){
+// maxFracDigits = dataFormatStrings[1].length();
+// numFormat.setMaximumFractionDigits(maxFracDigits);
+// cellValueString = numFormat.format(cell.getNumericCellValue()).replace(",", "").trim();
+// } else {
+// cellValueString = cell.toString();
+// }
+ //cell.setCellType(Cell.CELL_TYPE_STRING);
+ //cellValueString = cell.getStringCellValue();
+ DecimalFormat df = new DecimalFormat("#.#########");
+ cellValueString = df.format(cell.getNumericCellValue());
+ } else if(cellType == Cell.CELL_TYPE_STRING){
+ // 绉婚櫎鏁版嵁鍒椾腑鍓嶅彲鍦ㄥ瓨鍦ㄧ殑"'"
+ String val = cell.getStringCellValue();
+ while(val.startsWith("'")){
+ val = val.substring(1);
+ }
+ cellValueString = val;
+ }
+ return cellValueString;
+ }
+
+ /**
+ * 杩斿洖Sheet鐨勬爣棰�&鎶ご琛岀殑瀹為檯鏈夋晥鐨勫垪鏁�
+ * @param sheet
+ * @return
+ * @throws VCIException
+ */
+ private int getFirstRowColumnNum(Sheet sheet) throws VCIException{
+ int i = 0;
+ Row row = sheet.getRow(i);
+ int rowCellNum = row.getLastCellNum();
+ int firstRowColumnNum = 0;
+ for (int j = 0; j < rowCellNum; j++) {
+ int columnIndex = j;
+ int columnIndexToShow = columnIndex + 1;
+ Cell cell = row.getCell(j);
+ int cellType = 0;
+ if(i == 0){// 鏍囬琛�
+ if(cell == null){
+ throw new VCIException(String.valueOf("99995"), new Object[]{columnIndexToShow});// 鏍囬&鎶ご琛屼腑鐨勭{0}鍒楃殑涓嶈兘涓虹┖锛�
+ }
+ cellType = cell.getCellType();
+ if(cellType == Cell.CELL_TYPE_BLANK){
+ throw new VCIException(String.valueOf("99995"), new Object[]{columnIndexToShow});// 鏍囬&鎶ご琛屼腑鐨勭{0}鍒楃殑涓嶈兘涓虹┖锛�
+ }
+ if(cellType == Cell.CELL_TYPE_NUMERIC || cellType == Cell.CELL_TYPE_NUMERIC){
+ throw new VCIException(String.valueOf("99994"), new Object[]{columnIndexToShow});// 鏍囬&鎶ご琛屼腑鐨勭{0}鍒椾笉鑳芥槸绾暟瀛楋紒
+ }
+ // 璁$畻鏍囬琛屾湁鏁堝垪鏁�
+ firstRowColumnNum += 1;
+ }
+ }
+ return firstRowColumnNum;
+ }
+
+ /**
+ * 鎵瑰洖鎸囧畾鏂囦欢鐨凷heet
+ * @param path excel鏂囦欢瀹屾暣璺緞
+ * @param sheetIndex Sheet 绱㈠紩锛堜粠0 ~ SheetCount-1锛�
+ * @return
+ * @throws VCIException
+ */
+ private Sheet getWorkbookSheet(String path, int sheetIndex) throws VCIException{
+ Workbook wb = getWorkBook(path);
+ if(wb == null) return null;
+ int sheetCount = wb.getNumberOfSheets();
+ if(sheetIndex < 0 || sheetIndex >= sheetCount) return null;
+ return wb.getSheetAt(sheetIndex);
+ }
+
+ private Workbook getWorkBook(String path) throws VCIException{
+ Workbook wb = null;
+ POIFSFileSystem fs = null;
+ try{
+ // XSSFWorkbook 鏀寔OFFICE EXCEL 2007锛�
+ // 浣嗕笉鏀寔2003浠ヤ笅鐨勶紝鍖呭惈2003
+ wb = new XSSFWorkbook(new FileInputStream(path));
+ }catch(Exception ex){
+ try {
+ // 鐢� HSSFWorkbook 澶勭悊2003鎴栦互涓嬬増鏈珽XCEL鏂囦欢
+ fs = new POIFSFileSystem(new FileInputStream(path));
+ wb = new HSSFWorkbook(fs);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ throw new VCIException("99999", new String[]{path});
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new VCIException("99998", new String[]{path});
+ } catch(Exception e){
+ e.printStackTrace();
+ throw new VCIException("99997", new String[]{path, e.getMessage()});
+ }
+ }
+ return wb;
+ }
+
+ public static void main(String[] args) throws VCIException{
+ String path = "E:/";
+ String name = "test.xlsx";
+ String[][] datas = new ExcelFileOperation().readExcelFileInfo(path + name);
+ for(String[] row : datas){
+ for(String val : row){
+ System.out.print(val + "\t");
+ }
+ System.out.println("");
+ }
+// writeTest();
+// readTest();
+ }
+ private static void readTest() throws VCIException{
+ String path = VCISwingUtil.getExcelFileURL(null, false, "");
+ System.out.println("readTest1:");
+ readTest1(path);
+
+ System.out.println("readTest2:");
+ readTest2(path);
+
+ System.out.println("readTest3:");
+ readTest3(path);
+
+ System.out.println("readTest4:");
+ readTest4(path);
+ }
+ private static void readTest1(String path) throws VCIException{
+ out(new ExcelFileOperation().readExcelFileInfo(path));
+ }
+ private static void readTest2(String path) throws VCIException{
+ if(path == null) return;
+ out(new ExcelFileOperation().readExcelFileInfo(path, 0));
+ out(new ExcelFileOperation().readExcelFileInfo(path, 1));
+ out(new ExcelFileOperation().readExcelFileInfo(path, 2));
+ out(new ExcelFileOperation().readExcelFileInfo(path, 3));
+ }
+ private static void readTest3(String path) throws VCIException{
+ if(path == null) return;
+ out(new ExcelFileOperation().readExcelFileInfo(path, "Sheet1"));
+ out(new ExcelFileOperation().readExcelFileInfo(path, "Sheet2"));
+ out(new ExcelFileOperation().readExcelFileInfo(path, "Sheet3"));
+ out(new ExcelFileOperation().readExcelFileInfo(path, "Sheet4"));
+ }
+ private static void readTest4(String path) throws VCIException{
+ if(path == null) return;
+ out(new ExcelFileOperation().readExcelFileInfos(path));
+ }
+ private static void out(String[][][] datas){
+ for(String[][] data : datas){
+ out(data);
+ }
+ }
+ private static void out(String[][] datas){
+ for(String[] row : datas){
+ for(String cell : row){
+ System.out.print(cell + "\t");
+ }
+ System.out.print("\n");
+ }
+ }
+ private static void writeTest(){
+ ExcelFileOperation efo = new ExcelFileOperation();
+ boolean isRead = false;
+ File file = null;
+ String filePath = VCISwingUtil.getExcelFileURL(null, !isRead, "");
+ if(filePath != null){
+ file = new File(filePath);
+ }
+ if(file == null){
+ System.exit(0);
+ }
+ LinkedList<String[]> list = new LinkedList<String[]>();
+ for(int i = 0; i < 100; i++){
+ LinkedList<String> row = new LinkedList<String>();
+ for(int j = 0; j < 52; j++){
+ row.add(String.valueOf(j));
+ }
+ list.add(row.toArray(new String[]{}));
+ }
+ String[][] excelInfos = {{"a","b","c"},{"123","456","789"}};
+ excelInfos = list.toArray(new String[][]{});
+ ExcelCellStyleSettingCallback setting = new ExcelCellStyleSettingCallback() {
+ public WorkboolStyleSetting doSetWorkbookStyle(final Workbook workbook) {
+ WorkboolStyleSetting setting = new WorkboolStyleSetting() {
+ public LinkedHashMap<String, CellStyle> getStyleMap() {
+ LinkedHashMap<String, CellStyle> styleMap = new LinkedHashMap<String, CellStyle>();
+ org.apache.poi.ss.usermodel.CellStyle style = workbook.createCellStyle();
+ org.apache.poi.ss.usermodel.Font font = (org.apache.poi.ss.usermodel.Font)workbook.createFont();
+ font.setColor(HSSFFont.COLOR_RED);
+ style.setFont(font);
+ styleMap.put("0*0", style);
+ return styleMap;
+ }
+ };
+ return setting;
+ }
+ };
+ Map<String, String[][]> excelInfoMap = new LinkedHashMap<String, String[][]>();
+ excelInfoMap.put("sheet1", excelInfos);
+ excelInfoMap.put("sheet2", excelInfos);
+ excelInfoMap.put("sheet3", excelInfos);
+
+ Map<String, ExcelCellStyleSettingCallback> settingMap = new HashMap<String, ExcelCellStyleSettingCallback>();
+ settingMap.put("sheet1", setting);
+ efo.writeExcelFileInfo(file.getAbsolutePath(), excelInfoMap, settingMap);
+ }
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/utils/excel/WorkboolStyleSetting.java b/Source/Client/PLTClient/src/com/vci/client/utils/excel/WorkboolStyleSetting.java
new file mode 100644
index 0000000..deffa61
--- /dev/null
+++ b/Source/Client/PLTClient/src/com/vci/client/utils/excel/WorkboolStyleSetting.java
@@ -0,0 +1,9 @@
+package com.vci.client.utils.excel;
+
+import java.util.LinkedHashMap;
+
+import org.apache.poi.ss.usermodel.CellStyle;
+
+public interface WorkboolStyleSetting {
+ public LinkedHashMap<String, CellStyle> getStyleMap();
+}
diff --git a/Source/Client/PLTClient/src/com/vci/client/workflow/WorkFlowClient.java b/Source/Client/PLTClient/src/com/vci/client/workflow/WorkFlowClient.java
index 85197e0..4a94474 100644
--- a/Source/Client/PLTClient/src/com/vci/client/workflow/WorkFlowClient.java
+++ b/Source/Client/PLTClient/src/com/vci/client/workflow/WorkFlowClient.java
@@ -9,11 +9,11 @@
import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.ui.exception.VCIException;
import com.vci.client.workflow.template.ProcessCustomPanel;
-import com.vci.corba.workflow.method.WorkflowServicePrx;
+import com.vci.corba.workflow.WorkflowServicePrx;
public class WorkFlowClient {
- private static WorkflowServicePrx workFlowServiceService;
+// private static WorkflowServicePrx workFlowServiceService;
private static WorkFlowClient workFlowClient = null;
private static WorkFlowClient getInstance(){
@@ -29,15 +29,15 @@
}
public void init() throws VCIException {
- if(workFlowServiceService != null){
- return;
- }
- try {
-
- workFlowServiceService = ServiceProvider.getWFService();
- } catch (Exception e) {
- throw new VCIException("", new String[0]);
- }
+// if(workFlowServiceService != null){
+// return;
+// }
+// try {
+//
+// workFlowServiceService = ServiceProvider.getWFService();
+// } catch (Exception e) {
+// throw new VCIException("", new String[0]);
+// }
}
@@ -47,23 +47,25 @@
}
- public static WorkflowServicePrx getService(){
- if(workFlowServiceService == null){
- try {
- WorkFlowClient.getInstance().init();
- } catch (VCIException e) {
- e.printStackTrace();
- }
- }
- return workFlowServiceService;
- }
+// public static WorkflowServicePrx getService(){
+// if(workFlowServiceService == null){
+// try {
+// WorkFlowClient.getInstance().init();
+// } catch (VCIException e) {
+// e.printStackTrace();
+// }
+// }
+// return workFlowServiceService;
+// }
/**
* @param args
*/
public static void main(String[] args) {
+ //WorkFlowClient.getInstance().init();
try {
- WorkFlowClient.getInstance().init();
- } catch (VCIException e) {
+ ServiceProvider.getWFService();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
e.printStackTrace();
}
diff --git a/Source/Client/PLTClient/src/com/vci/client/workflow/delegate/ProcessCustomClientDelegate.java b/Source/Client/PLTClient/src/com/vci/client/workflow/delegate/ProcessCustomClientDelegate.java
index 2d1bf85..f37775c 100644
--- a/Source/Client/PLTClient/src/com/vci/client/workflow/delegate/ProcessCustomClientDelegate.java
+++ b/Source/Client/PLTClient/src/com/vci/client/workflow/delegate/ProcessCustomClientDelegate.java
@@ -32,7 +32,7 @@
import com.vci.corba.workflow.data.TaskDescInfo;
import com.vci.corba.workflow.data.TaskRevokeInfo;
import com.vci.corba.workflow.data.TasksAssignedInfo;
-import com.vci.corba.workflow.method.WorkflowService.GetTasksAssignedByPageingResult;
+import com.vci.corba.workflow.WorkflowService.GetTasksAssignedByPageingResult;
public class ProcessCustomClientDelegate extends ClientBaseDelegate {
diff --git a/Source/Client/PLTClient/src/com/vci/client/workflow/task/CCTaskPanel.java b/Source/Client/PLTClient/src/com/vci/client/workflow/task/CCTaskPanel.java
index 6b2e813..cbb966e 100644
--- a/Source/Client/PLTClient/src/com/vci/client/workflow/task/CCTaskPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/workflow/task/CCTaskPanel.java
@@ -24,7 +24,7 @@
import com.vci.client.LogonApplication;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.workflow.commom.ClientHelper;
import com.vci.client.workflow.delegate.ProcessCustomClientDelegate;
import com.vci.client.workflow.editor.user.FowardUserDialog;
diff --git a/Source/Client/PLTClient/src/com/vci/client/workflow/task/DoneProcessPanel.java b/Source/Client/PLTClient/src/com/vci/client/workflow/task/DoneProcessPanel.java
index d040e2a..e202cbc 100644
--- a/Source/Client/PLTClient/src/com/vci/client/workflow/task/DoneProcessPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/workflow/task/DoneProcessPanel.java
@@ -27,7 +27,7 @@
import com.vci.client.framework.rightConfig.object.FunctionObject;
import com.vci.client.ui.date.PopupCalendarMethod;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
import com.vci.client.ui.swing.VCISwingUtil;
diff --git a/Source/Client/PLTClient/src/com/vci/client/workflow/task/DoneTaskPanel.java b/Source/Client/PLTClient/src/com/vci/client/workflow/task/DoneTaskPanel.java
index 65c943b..74b2140 100644
--- a/Source/Client/PLTClient/src/com/vci/client/workflow/task/DoneTaskPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/workflow/task/DoneTaskPanel.java
@@ -27,7 +27,7 @@
import com.vci.client.framework.rightConfig.object.FunctionObject;
import com.vci.client.ui.date.PopupCalendarMethod;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
import com.vci.client.ui.swing.VCISwingUtil;
diff --git a/Source/Client/PLTClient/src/com/vci/client/workflow/task/FlowSearchDialog.java b/Source/Client/PLTClient/src/com/vci/client/workflow/task/FlowSearchDialog.java
index bc2fc8d..984ef6c 100644
--- a/Source/Client/PLTClient/src/com/vci/client/workflow/task/FlowSearchDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/workflow/task/FlowSearchDialog.java
@@ -23,7 +23,7 @@
import com.vci.client.LogonApplication;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.workflow.commom.ClientHelper;
import com.vci.client.workflow.delegate.ProcessCustomClientDelegate;
diff --git a/Source/Client/PLTClient/src/com/vci/client/workflow/task/ProcessControlPanel.java b/Source/Client/PLTClient/src/com/vci/client/workflow/task/ProcessControlPanel.java
index ebc64d7..a1ec468 100644
--- a/Source/Client/PLTClient/src/com/vci/client/workflow/task/ProcessControlPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/workflow/task/ProcessControlPanel.java
@@ -26,7 +26,7 @@
import com.vci.client.LogonApplication;
import com.vci.client.ui.date.PopupCalendarMethod;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
import com.vci.client.ui.swing.VCISwingUtil;
diff --git a/Source/Client/PLTClient/src/com/vci/client/workflow/task/ProcessTaskToolBar.java b/Source/Client/PLTClient/src/com/vci/client/workflow/task/ProcessTaskToolBar.java
index 91d438b..08c55cc 100644
--- a/Source/Client/PLTClient/src/com/vci/client/workflow/task/ProcessTaskToolBar.java
+++ b/Source/Client/PLTClient/src/com/vci/client/workflow/task/ProcessTaskToolBar.java
@@ -7,7 +7,7 @@
import javax.swing.JButton;
import com.vci.client.logon.base.BaseToolBar;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.workflow.commom.ClientHelper;
public class ProcessTaskToolBar extends BaseToolBar {
diff --git a/Source/Client/PLTClient/src/com/vci/client/workflow/task/ProcessTaskTreeCellRender.java b/Source/Client/PLTClient/src/com/vci/client/workflow/task/ProcessTaskTreeCellRender.java
index 4fe4da6..d9d176b 100644
--- a/Source/Client/PLTClient/src/com/vci/client/workflow/task/ProcessTaskTreeCellRender.java
+++ b/Source/Client/PLTClient/src/com/vci/client/workflow/task/ProcessTaskTreeCellRender.java
@@ -6,7 +6,7 @@
import javax.swing.ToolTipManager;
import javax.swing.tree.DefaultTreeCellRenderer;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.tree.VCIBaseTreeNode;
import com.vci.client.workflow.template.object.ProcessCategoryObject;
import com.vci.client.workflow.template.object.ProcessDefinitionObject;
diff --git a/Source/Client/PLTClient/src/com/vci/client/workflow/task/TodoTaskPanel.java b/Source/Client/PLTClient/src/com/vci/client/workflow/task/TodoTaskPanel.java
index f12ae71..107fcbe 100644
--- a/Source/Client/PLTClient/src/com/vci/client/workflow/task/TodoTaskPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/workflow/task/TodoTaskPanel.java
@@ -31,7 +31,7 @@
import com.vci.client.framework.rightConfig.object.FunctionObject;
import com.vci.client.logon.client.VciFrameTimerTask;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
import com.vci.client.ui.swing.VCISwingUtil;
diff --git a/Source/Client/PLTClient/src/com/vci/client/workflow/task/TrackTaskPanel.java b/Source/Client/PLTClient/src/com/vci/client/workflow/task/TrackTaskPanel.java
index 827ab6e..27138ff 100644
--- a/Source/Client/PLTClient/src/com/vci/client/workflow/task/TrackTaskPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/workflow/task/TrackTaskPanel.java
@@ -27,7 +27,7 @@
import com.vci.client.framework.rightConfig.object.FunctionObject;
import com.vci.client.ui.date.PopupCalendarMethod;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.VCIOptionPane;
import com.vci.client.ui.swing.VCISwingUtil;
diff --git a/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryDialog.java b/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryDialog.java
index 4e18e41..765ea92 100644
--- a/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryDialog.java
@@ -17,7 +17,7 @@
import com.vci.client.LogonApplication;
import com.vci.client.common.IconSelectDialog;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.KTextField;
diff --git a/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryPanel.java b/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryPanel.java
index bc16b40..e7799e3 100644
--- a/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryPanel.java
+++ b/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryPanel.java
@@ -15,7 +15,7 @@
import com.vci.client.common.VCIBasePanel;
import com.vci.client.framework.rightConfig.object.FunctionObject;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.KTextField;
diff --git a/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryTreeCellRender.java b/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryTreeCellRender.java
index 92ded61..72765d4 100644
--- a/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryTreeCellRender.java
+++ b/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryTreeCellRender.java
@@ -6,7 +6,7 @@
import javax.swing.ToolTipManager;
import javax.swing.tree.DefaultTreeCellRenderer;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.tree.VCIBaseTreeNode;
import com.vci.client.workflow.template.object.ProcessCategoryObject;
import com.vci.client.workflow.template.object.ProcessDefinitionObject;
diff --git a/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryTypeDialog.java b/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryTypeDialog.java
index b85270c..a4c8d08 100644
--- a/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryTypeDialog.java
+++ b/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCategoryTypeDialog.java
@@ -19,7 +19,7 @@
import com.vci.client.framework.rightConfig.object.FunctionObject;
import com.vci.client.logon.base.BaseJDialog;
import com.vci.client.ui.exception.VCIException;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.ui.locale.LocaleDisplay;
import com.vci.client.ui.swing.KJButton;
import com.vci.client.ui.swing.KTextField;
diff --git a/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCustomToolBar.java b/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCustomToolBar.java
index 73d661a..6e69793 100644
--- a/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCustomToolBar.java
+++ b/Source/Client/PLTClient/src/com/vci/client/workflow/template/ProcessCustomToolBar.java
@@ -8,7 +8,7 @@
import javax.swing.JOptionPane;
import com.vci.client.logon.base.BaseToolBar;
-import com.vci.client.ui.image.bundle.BundleImage;
+import com.vci.client.ui.image.BundleImage;
import com.vci.client.workflow.commom.ClientHelper;
public class ProcessCustomToolBar extends BaseToolBar {
diff --git a/Source/Client/PLTClient/src/com/vci/test/oq/Test.java b/Source/Client/PLTClient/src/com/vci/test/oq/Test.java
index 3f1ea1d..fec78da 100644
--- a/Source/Client/PLTClient/src/com/vci/test/oq/Test.java
+++ b/Source/Client/PLTClient/src/com/vci/test/oq/Test.java
@@ -7,6 +7,7 @@
import java.util.concurrent.Callable;
import com.vci.client.common.oq.OQTool;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.oq.QTClient;
import com.vci.client.oq.QTDClient;
import com.vci.common.qt.object.ChildrenInfo;
@@ -30,7 +31,7 @@
@org.junit.Test
public void getQT() throws VCIError{
- boolean qt = QTDClient.getService().isExistsQT("GroupPRunitQueryAll");
+ boolean qt = ServiceProvider.getOMDService().getQTDService().isExistsQT("GroupPRunitQueryAll");
System.out.println();
}
@org.junit.Test
diff --git a/Source/Client/PLTClient/src/com/vci/test/oq/TestQTAPI.java b/Source/Client/PLTClient/src/com/vci/test/oq/TestQTAPI.java
index dc450d3..3e400cb 100644
--- a/Source/Client/PLTClient/src/com/vci/test/oq/TestQTAPI.java
+++ b/Source/Client/PLTClient/src/com/vci/test/oq/TestQTAPI.java
@@ -9,6 +9,7 @@
import org.dom4j.DocumentHelper;
import com.vci.client.common.oq.OQTool;
+import com.vci.client.common.providers.ServiceProvider;
import com.vci.client.omd.provider.ApProvider;
import com.vci.client.oq.QTClient;
import com.vci.client.oq.QTDClient;
@@ -156,7 +157,7 @@
private static void testIteratorQuery() throws VCIError, DocumentException {
String queryTemplate = "QueryChildViewClassiyByParentOid";
- QTInfo wrapper = QTDClient.getService().getQT(queryTemplate);
+ QTInfo wrapper = ServiceProvider.getOMDService().getQTDService().getQT(queryTemplate);
QueryTemplate qt = OQTool.getQTByDoc(DocumentHelper.parseText(wrapper.qtText), queryTemplate);
Map<String, String> queryCondition = new HashMap<String, String>();
queryCondition.put("viewparentclsfoid", "68EB3389-D836-79CD-8467-34E0BCBD85B8");
@@ -200,7 +201,7 @@
try {
//鑾峰彇宓屽鏉′欢鐨勬煡璇㈡ā鏉�
- QTInfo qtm = QTDClient.getService().getQT("productTreeQueryTemplate");
+ QTInfo qtm = ServiceProvider.getOMDService().getQTDService().getQT("productTreeQueryTemplate");
String qtText = qtm.qtText;
QueryTemplate qt_ = OQTool.getQTByQTText(qtm.qtName, qtText);
List<String> clauseListse = new ArrayList<String>();
diff --git a/Source/Client/PLTClient/src/properties/iceClient.properties b/Source/Client/PLTClient/src/properties/iceClient.properties
index c175daa..cdf49c8 100644
--- a/Source/Client/PLTClient/src/properties/iceClient.properties
+++ b/Source/Client/PLTClient/src/properties/iceClient.properties
@@ -1 +1,2 @@
-Endpoints=default -h localhost -p 4601
\ No newline at end of file
+#Endpoints=default -h 172.16.0.24 -p 4601
+Endpoints=VCI-PLT/Locator:tcp -h 172.16.0.127 -p 4061
\ No newline at end of file
diff --git a/Source/Client/PLTClientBase/.classpath b/Source/Client/PLTClientBase/.classpath
index d505956..73cfba8 100644
--- a/Source/Client/PLTClientBase/.classpath
+++ b/Source/Client/PLTClientBase/.classpath
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="test"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry combineaccessrules="false" kind="src" path="/PLTCommon"/>
<classpathentry combineaccessrules="false" kind="src" path="/PLTSlice"/>
diff --git a/Source/Client/PLTClientBase/build-jar.xml b/Source/Client/PLTClientBase/build-jar.xml
index 85616ff..140b641 100644
--- a/Source/Client/PLTClientBase/build-jar.xml
+++ b/Source/Client/PLTClientBase/build-jar.xml
@@ -2,7 +2,7 @@
<!--classes.jar; src.jar-->
<project name = "platform-ClientBase" default = "build-ClientBase-jar" basedir = ".">
- <property file="build.properties"/>
+ <property file="../../build.properties"/>
<target name="time">
<tstamp>
diff --git a/Source/Client/PLTClientBase/dist/plt-clientbase.jar b/Source/Client/PLTClientBase/dist/plt-clientbase.jar
index eae5bec..973d410 100644
--- a/Source/Client/PLTClientBase/dist/plt-clientbase.jar
+++ b/Source/Client/PLTClientBase/dist/plt-clientbase.jar
Binary files differ
diff --git a/Source/Client/PLTClientBase/src/com/vci/client/ClientSession.java b/Source/Client/PLTClientBase/src/com/vci/client/ClientSession.java
index 2f9f5cb..0d85cff 100644
--- a/Source/Client/PLTClientBase/src/com/vci/client/ClientSession.java
+++ b/Source/Client/PLTClientBase/src/com/vci/client/ClientSession.java
@@ -12,9 +12,9 @@
import com.vci.client.common.interfaces.IAppEventManager;
import com.vci.common.resource.CommonProperties;
import com.vci.corba.common.VCIError;
-import com.vci.corba.framework.method.FrameworkServicePrx;
+import com.vci.corba.framework.FrameworkServicePrx;
//import com.vci.corba.framework.method.VolumeManagerPrx;
-import com.vci.corba.workflow.method.WorkflowServicePrx;
+import com.vci.corba.workflow.WorkflowServicePrx;
public class ClientSession {
diff --git a/Source/Client/PLTClientBase/src/com/vci/client/common/excel/ExcelDocumentUtils.java b/Source/Client/PLTClientBase/src/com/vci/client/common/excel/ExcelDocumentUtils.java
index cbcf1d9..5a8e147 100644
--- a/Source/Client/PLTClientBase/src/com/vci/client/common/excel/ExcelDocumentUtils.java
+++ b/Source/Client/PLTClientBase/src/com/vci/client/common/excel/ExcelDocumentUtils.java
@@ -8,14 +8,11 @@
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
-import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
-import java.util.Locale;
-
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
@@ -29,22 +26,22 @@
public class ExcelDocumentUtils {
/**
- *鍐欏洖鍒癳xcel鏂囨。
+ * 鍐欏洖鍒癳xcel鏂囨。
*
* @param sheetDataSet
- * <P>
- * 鏁版嵁闆嗗悎
+ * <P>
+ * 鏁版嵁闆嗗悎
* @param path
- * <P>
- * excel鏂囨。鐨勮矾寰�
+ * <P>
+ * excel鏂囨。鐨勮矾寰�
* @param name
- * <P>
- * excel鏂囨。鐨勫悕绉�
+ * <P>
+ * excel鏂囨。鐨勫悕绉�
* @throws VCIError
- * @throws IOException
- * */
- public static void writeExcelDocument(String path, String name,
- List<SheetDataSet> sheetDataSet) throws VCIError, IOException {
+ * @throws IOException
+ */
+ public static void writeExcelDocument(String path, String name, List<SheetDataSet> sheetDataSet)
+ throws VCIError, IOException {
// 鎵撳紑宸ヤ綔绨�
Workbook workBook = makeWorkbook(name);
// sheet
@@ -64,25 +61,24 @@
row = sheet.createRow(rowIndex);
}
String[] rowData = rowDataSet.get(rowIndex);
- //row
+ // row
for (int columnIndex = 0; columnIndex < rowData.length; columnIndex++) {
// cell
Cell cell = row.getCell(columnIndex);
if (cell == null) {
cell = row.createCell(columnIndex);
}
- //璧嬛�
+ // 璧嬛�
cell.setCellValue(rowData[columnIndex]);
}
}
- }// end
+ } // end
FileOutputStream fileOutputStream = makeFileOutputStream(path, name);
workBook.write(fileOutputStream);
fileOutputStream.close();
}
-
- public static void writeExcelDocument(String path, String name,
- SheetDataSet dataSet) throws VCIError, IOException {
+
+ public static void writeExcelDocument(String path, String name, SheetDataSet dataSet) throws VCIError, IOException {
// 鎵撳紑宸ヤ綔绨�
Workbook workBook = makeWorkbook(name);
// sheet
@@ -101,14 +97,14 @@
row = sheet.createRow(rowIndex);
}
String[] rowData = rowDataSet.get(rowIndex);
- //row
+ // row
for (int columnIndex = 0; columnIndex < rowData.length; columnIndex++) {
// cell
Cell cell = row.getCell(columnIndex);
if (cell == null) {
cell = row.createCell(columnIndex);
}
- //璧嬛�
+ // 璧嬛�
cell.setCellValue(rowData[columnIndex]);
}
}
@@ -117,9 +113,9 @@
workBook.write(fileOutputStream);
fileOutputStream.close();
}
-
-
- public static List<SheetDataSet> readExcelDocument(String name,InputStream fileInputStream) throws VCIError, IOException {
+
+ public static List<SheetDataSet> readExcelDocument(String name, InputStream fileInputStream)
+ throws VCIError, IOException {
return readExcelDocument(name, fileInputStream, false);
}
@@ -127,28 +123,27 @@
* 璇诲彇excel鏂囨。鐨勬暟鎹�
*
* @param FileInputStream
- * <P>
- * excel鏂囨。
+ * <P>
+ * excel鏂囨。
* @param name
- * <P>
- * excel鏂囨。鐨勫悕绉�
- * @throws IOException
- * */
- public static List<SheetDataSet> readExcelDocument(String name,InputStream fileInputStream, boolean isDelNullRow)
+ * <P>
+ * excel鏂囨。鐨勫悕绉�
+ * @throws IOException
+ */
+ public static List<SheetDataSet> readExcelDocument(String name, InputStream fileInputStream, boolean isDelNullRow)
throws VCIError, IOException {
InputStream bufferInputStream = getBufferInputStream(fileInputStream);
// 鎵撳紑宸ヤ綔绨�
- Workbook workBook = getWorkbook(fileInputStream, bufferInputStream,
- name);
+ Workbook workBook = getWorkbook(fileInputStream, bufferInputStream, name);
// row
- int maxRow=0;
+ int maxRow = 0;
List<SheetDataSet> dataSet = new ArrayList<SheetDataSet>();
for (int sheetIndex = 0; sheetIndex < workBook.getNumberOfSheets(); sheetIndex++) {
Sheet sheet = workBook.getSheetAt(sheetIndex);
SheetDataSet sheetDataSet = new SheetDataSet();
sheetDataSet.setSheet(sheet.getSheetName());
dataSet.add(sheetDataSet);
- //閬嶅巻
+ // 閬嶅巻
for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
Row rowDataSet = sheet.getRow(rowIndex);
@@ -160,16 +155,15 @@
continue;
}
int currentcolumnSize = rowDataSet.getLastCellNum();
- if(maxRow<currentcolumnSize){
- maxRow=currentcolumnSize;
+ if (maxRow < currentcolumnSize) {
+ maxRow = currentcolumnSize;
}
- //
+ //
String[] values = new String[maxRow];
Arrays.fill(values, "");
boolean hasValue = false;
- //閬嶅巻
- for (int columnIndex = 0; columnIndex < rowDataSet
- .getLastCellNum(); columnIndex++) {
+ // 閬嶅巻
+ for (int columnIndex = 0; columnIndex < rowDataSet.getLastCellNum(); columnIndex++) {
String value = getCellValue(columnIndex, rowDataSet);
values[columnIndex] = rightTrim(value);
hasValue = true;
@@ -183,34 +177,31 @@
return dataSet;
}
-
/**
* 璇诲彇excel鏂囨。鐨勬暟鎹�
*
* @param path
- * <P>
- * excel鏂囨。鐨勮矾寰�
+ * <P>
+ * excel鏂囨。鐨勮矾寰�
* @param name
- * <P>
- * excel鏂囨。鐨勫悕绉�
- * @throws IOException
- * */
- public static List<SheetDataSet> readExcelDocument(String path, String name)
- throws VCIError, IOException {
+ * <P>
+ * excel鏂囨。鐨勫悕绉�
+ * @throws IOException
+ */
+ public static List<SheetDataSet> readExcelDocument(String path, String name) throws VCIError, IOException {
FileInputStream fileInputStream = getFileInputStream(path, name);
InputStream bufferInputStream = getBufferInputStream(fileInputStream);
// 鎵撳紑宸ヤ綔绨�
- Workbook workBook = getWorkbook(fileInputStream, bufferInputStream,
- name);
+ Workbook workBook = getWorkbook(fileInputStream, bufferInputStream, name);
// row
- int maxRow=0;
+ int maxRow = 0;
List<SheetDataSet> dataSet = new ArrayList<SheetDataSet>();
for (int sheetIndex = 0; sheetIndex < workBook.getNumberOfSheets(); sheetIndex++) {
Sheet sheet = workBook.getSheetAt(sheetIndex);
SheetDataSet sheetDataSet = new SheetDataSet();
sheetDataSet.setSheet(sheet.getSheetName());
dataSet.add(sheetDataSet);
- //閬嶅巻
+ // 閬嶅巻
for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
Row rowDataSet = sheet.getRow(rowIndex);
@@ -219,16 +210,15 @@
continue;
}
int currentcolumnSize = rowDataSet.getLastCellNum();
- //
- if(maxRow<currentcolumnSize){
- maxRow=currentcolumnSize;
+ //
+ if (maxRow < currentcolumnSize) {
+ maxRow = currentcolumnSize;
}
String[] values = new String[maxRow];
Arrays.fill(values, "");
boolean hasValue = false;
- //閬嶅巻
- for (int columnIndex = 0; columnIndex < rowDataSet
- .getLastCellNum(); columnIndex++) {
+ // 閬嶅巻
+ for (int columnIndex = 0; columnIndex < rowDataSet.getLastCellNum(); columnIndex++) {
String value = getCellValue(columnIndex, rowDataSet);
if (columnIndex == 0 && value.trim().equals("")) {
break;
@@ -245,7 +235,6 @@
return dataSet;
}
-
private static Workbook makeWorkbook(String name) throws VCIError {
// 鍒涘缓
@@ -259,58 +248,53 @@
}
- private static FileOutputStream makeFileOutputStream(String path,
- String name) throws VCIError, FileNotFoundException {
- FileOutputStream fileOutputStream = new FileOutputStream(path + "\\"
- + name);
+ private static FileOutputStream makeFileOutputStream(String path, String name)
+ throws VCIError, FileNotFoundException {
+ FileOutputStream fileOutputStream = new FileOutputStream(path + "\\" + name);
return fileOutputStream;
}
- private static FileInputStream getFileInputStream(String path, String name)
- throws VCIError, FileNotFoundException {
+ private static FileInputStream getFileInputStream(String path, String name) throws VCIError, FileNotFoundException {
File xlsFile = new File(path + "\\" + name);
FileInputStream fileInputStream = new FileInputStream(xlsFile);
return fileInputStream;
}
- private static BufferedInputStream getBufferInputStream(
- InputStream fileInputStream) throws VCIError {
- BufferedInputStream bufferInputStream = new BufferedInputStream(
- fileInputStream);
+ private static BufferedInputStream getBufferInputStream(InputStream fileInputStream) throws VCIError {
+ BufferedInputStream bufferInputStream = new BufferedInputStream(fileInputStream);
return bufferInputStream;
}
/**
* 璇诲彇鍗曞厓鏍肩殑鍊�
- * */
+ */
private static String getCellValue(int column, Row row) {
return getCellValue(row.getCell(column));
}
-
-
- public static String getCellValue(Cell cell){
+
+ public static String getCellValue(Cell cell) {
String cellValueString = "";
- if(cell == null) return cellValueString;
+ if (cell == null)
+ return cellValueString;
int cellType = cell.getCellType();
SimpleDateFormat sdfDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// add by xchao 2012.11.22 澶勭悊鏃ユ湡绫诲瀷鍜孋ell
- if(cellType == Cell.CELL_TYPE_NUMERIC && HSSFDateUtil.isCellDateFormatted(cell)){
+ if (cellType == Cell.CELL_TYPE_NUMERIC && HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
cellValueString = sdfDateTime.format(date);
- }
- else if(cellType == Cell.CELL_TYPE_BLANK){
+ } else if (cellType == Cell.CELL_TYPE_BLANK) {
cellValueString = "";
- } else if(cellType == Cell.CELL_TYPE_BOOLEAN){
+ } else if (cellType == Cell.CELL_TYPE_BOOLEAN) {
cellValueString = cell.getBooleanCellValue() ? "1" : "0";
- } else if(cellType == Cell.CELL_TYPE_ERROR){
+ } else if (cellType == Cell.CELL_TYPE_ERROR) {
cellValueString = "";
- } else if(cellType == Cell.CELL_TYPE_FORMULA){
- try{
+ } else if (cellType == Cell.CELL_TYPE_FORMULA) {
+ try {
cellValueString = String.valueOf(cell.getNumericCellValue());
} catch (Exception e) {
cellValueString = cell.getRichStringCellValue().getString();
}
- } else if(cellType == Cell.CELL_TYPE_NUMERIC){
+ } else if (cellType == Cell.CELL_TYPE_NUMERIC) {
// String[] dataFormatStrings = cell.getCellStyle().getDataFormatString().replace("_", "").trim().split("\\.");
// int maxFracDigits = 0;
// if(dataFormatStrings.length == 2){
@@ -320,23 +304,23 @@
// } else {
// cellValueString = cell.toString();
// }
- //cell.setCellType(Cell.CELL_TYPE_STRING);
- //cellValueString = cell.getStringCellValue();
+ // cell.setCellType(Cell.CELL_TYPE_STRING);
+ // cellValueString = cell.getStringCellValue();
DecimalFormat df = new DecimalFormat("#.#########");
cellValueString = df.format(cell.getNumericCellValue());
- } else if(cellType == Cell.CELL_TYPE_STRING){
+ } else if (cellType == Cell.CELL_TYPE_STRING) {
// 绉婚櫎鏁版嵁鍒椾腑鍓嶅彲鍦ㄥ瓨鍦ㄧ殑"'"
String val = cell.getStringCellValue();
- while(val.startsWith("'")){
+ while (val.startsWith("'")) {
val = val.substring(1);
}
cellValueString = val;
- }
+ }
return cellValueString;
}
- private static Workbook getWorkbook(InputStream fileInputStream,
- InputStream bufferInputStream, String name) throws VCIError, IOException {
+ private static Workbook getWorkbook(InputStream fileInputStream, InputStream bufferInputStream, String name)
+ throws VCIError, IOException {
// 鎵撳紑宸ヤ綔绨�
Workbook workBook = null;
@@ -357,7 +341,7 @@
/**
* 去锟斤拷锟街凤拷锟揭边的空革拷
- * */
+ */
private static String rightTrim(String value) {
if (value == null) {
return "";
@@ -372,17 +356,14 @@
return value.substring(0, length);
}
-
public static void main(String args[]) throws IOException {
try {
- List<SheetDataSet> sheetDataSet = readExcelDocument("D:\\",
- "a.xlsx");
+ List<SheetDataSet> sheetDataSet = readExcelDocument("D:\\", "a.xlsx");
writeExcelDocument("D:\\", "b.xlsx", sheetDataSet);
} catch (VCIError e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
-
-
+
}
diff --git a/Source/Client/PLTClientBase/src/com/vci/client/common/excel/SheetDataSet.java b/Source/Client/PLTClientBase/src/com/vci/client/common/excel/SheetDataSet.java
index 58f65b8..92985d4 100644
--- a/Source/Client/PLTClientBase/src/com/vci/client/common/excel/SheetDataSet.java
+++ b/Source/Client/PLTClientBase/src/com/vci/client/common/excel/SheetDataSet.java
@@ -8,6 +8,14 @@
private List<String[]> dataSet = new ArrayList<String[]>();
//
private String sheet;
+
+ public SheetDataSet() {
+ }
+
+ public SheetDataSet(String sheet, List<String[]> dataSet) {
+ this.sheet= sheet;
+ this.dataSet = dataSet;
+ }
public List<String[]> getDataSet() {
return dataSet;
diff --git a/Source/Client/PLTClientBase/src/com/vci/client/common/providers/ServiceProvider.java b/Source/Client/PLTClientBase/src/com/vci/client/common/providers/ServiceProvider.java
index f47acf4..d39b65f 100644
--- a/Source/Client/PLTClientBase/src/com/vci/client/common/providers/ServiceProvider.java
+++ b/Source/Client/PLTClientBase/src/com/vci/client/common/providers/ServiceProvider.java
@@ -5,13 +5,15 @@
import com.vci.common.util.IceProxyUtility;
//import com.vci.corba.auth2.Auth2ServicePrx;
import com.vci.corba.bofactory.BOFactoryServicePrx;
-import com.vci.corba.framework.method.FrameworkServicePrx;
+import com.vci.corba.framework.FrameworkServicePrx;
+import com.vci.corba.log.LogServicePrx;
//import com.vci.corba.framework.method.VolumeManagerPrx;
import com.vci.corba.omd.OMDServicePrx;
import com.vci.corba.portal.PortalServicePrx;
import com.vci.corba.query.ObjectQueryServicePrx;
import com.vci.corba.volume.VolumeServicePrx;
-import com.vci.corba.workflow.method.WorkflowServicePrx;
+import com.vci.corba.workflow.WorkflowServicePrx;
+import com.zeroc.Ice.ObjectPrx;
import com.vci.client.mw.ClientProxyUtility;
public class ServiceProvider {
@@ -36,6 +38,20 @@
FrameworkServicePrx service = getInstance().getFrameServiceImpl();
if (service == null) {
String error = "鑾峰彇 Frame Service 鏈嶅姟寮傚父";
+ System.out.println(error);
+ }
+
+ return service;
+ }
+
+ /**
+ * 鑾峰彇绯荤粺璇ユ鏋舵湇鍔′唬鐞�
+ * @return
+ */
+ public static LogServicePrx getLogService() {
+ LogServicePrx service = getInstance().getLogServiceImpl();
+ if (service == null) {
+ String error = "鑾峰彇 Log Service 鏈嶅姟寮傚父";
System.out.println(error);
}
@@ -157,12 +173,14 @@
/**
* 鑾峰彇宸ヤ綔娴佹湇鍔′唬鐞�
* @return
+ * @throws Exception
*/
public static WorkflowServicePrx getWFService() {
WorkflowServicePrx service = getInstance().getWFServiceImpl();
if (service == null) {
String error = "鑾峰彇 WorkflowService 鏈嶅姟寮傚父";
System.out.println(error);
+ //throw new Exception(error);
}
return service;
@@ -244,12 +262,35 @@
InitIceUtil();
}
- _frameService = FrameworkServicePrx.checkedCast(_proxyUtil.getObjectByName(ServiceNames.FRAMESERVICE));
+ ObjectPrx prx = _proxyUtil.getObjectByName(ServiceNames.FRAMESERVICE, ServiceNames.FRAMESERVICEREP);
+
+ _frameService = FrameworkServicePrx.checkedCast(prx);
} catch (Exception e) {
- //e.printStackTrace();
+
ServerWithLog4j.logger.error(e);
}
return _frameService;
+ }
+
+ private LogServicePrx _logService = null;
+ private LogServicePrx getLogServiceImpl() {
+ try {
+ if(_logService != null){
+ return _logService;
+ }
+
+ if (_proxyUtil == null) {
+ InitIceUtil();
+ }
+
+ ObjectPrx prx = _proxyUtil.getObjectByName(ServiceNames.LOGSERVICE, ServiceNames.LOGSERVICEREP);
+
+ _logService = LogServicePrx.checkedCast(prx);
+ } catch (Exception e) {
+
+ ServerWithLog4j.logger.error(e);
+ }
+ return _logService;
}
@@ -284,7 +325,7 @@
InitIceUtil();
}
- _bofService = BOFactoryServicePrx.checkedCast(_proxyUtil.getObjectByName(ServiceNames.BOFSERVICE));
+ _bofService = BOFactoryServicePrx.checkedCast(_proxyUtil.getObjectByName(ServiceNames.BOFSERVICE, ServiceNames.BOFSERVICEREP));
} catch (Exception e) {
//e.printStackTrace();
ServerWithLog4j.logger.error(e);
@@ -322,7 +363,7 @@
InitIceUtil();
}
- _oqService = ObjectQueryServicePrx.checkedCast(_proxyUtil.getObjectByName(ServiceNames.OQSERVICE));
+ _oqService = ObjectQueryServicePrx.checkedCast(_proxyUtil.getObjectByName(ServiceNames.OQSERVICE, ServiceNames.OQSERVICEREP));
} catch (Exception e) {
//e.printStackTrace();
ServerWithLog4j.logger.error(e);
@@ -362,7 +403,7 @@
InitIceUtil();
}
- _uiService = PortalServicePrx.checkedCast(_proxyUtil.getObjectByName(ServiceNames.UISERVICE));
+ _uiService = PortalServicePrx.checkedCast(_proxyUtil.getObjectByName(ServiceNames.UISERVICE, ServiceNames.UISERVICEREP));
} catch (Exception e) {
//e.printStackTrace();
ServerWithLog4j.logger.error(e);
@@ -382,7 +423,7 @@
InitIceUtil();
}
- _omdService = OMDServicePrx.checkedCast(_proxyUtil.getObjectByName(ServiceNames.OMDSERVICE));
+ _omdService = OMDServicePrx.checkedCast(_proxyUtil.getObjectByName(ServiceNames.OMDSERVICE, ServiceNames.OMDSERVICEREP));
} catch (Exception e) {
//e.printStackTrace();
ServerWithLog4j.logger.error(e);
@@ -401,7 +442,7 @@
InitIceUtil();
}
- _wfService = WorkflowServicePrx.checkedCast(_proxyUtil.getObjectByName(ServiceNames.WFSERVICE));
+ _wfService = WorkflowServicePrx.checkedCast(_proxyUtil.getObjectByName(ServiceNames.WFSERVICE, ServiceNames.WFSERVICEREP));
} catch (Exception e) {
//e.printStackTrace();
ServerWithLog4j.logger.error(e);
@@ -433,7 +474,7 @@
InitIceUtil();
}
- _defaultVolService = VolumeServicePrx.checkedCast(_proxyUtil.getObjectByName(ServiceNames.VOLUMESERVICE));
+ _defaultVolService = VolumeServicePrx.checkedCast(_proxyUtil.getObjectByName(ServiceNames.VOLUMESERVICE, ServiceNames.VOLUMESERVICEREP));
} catch (Exception e) {
//e.printStackTrace();
ServerWithLog4j.logger.error(e);
diff --git a/Source/Client/build-client/Timer.properties b/Source/Client/build-client/Timer.properties
new file mode 100644
index 0000000..d9ca342
--- /dev/null
+++ b/Source/Client/build-client/Timer.properties
@@ -0,0 +1,14 @@
+#\u4e8b\u4ef6\u603b\u4e2a\u6570
+#\u5b9a\u65f6\u5668\u7684\u7c7b\u578b, day or hour
+time_type=day
+#\u5b9a\u65f6\u5668\u95f4\u9694\u4e8b\u4ef6
+time_period=1
+
+#\u7528\u6237
+time_username=198210208
+#\u5bc6\u7801
+time_password=1111
+
+#\u5b9a\u65f6\u5668\u542f\u52a8\u4e8b\u4ef6
+start_time=2023/11/8 10\:40\:00
+
diff --git a/Source/Common/PLTCommon/.classpath b/Source/Common/PLTCommon/.classpath
index 5d0d36d..bb38f35 100644
--- a/Source/Common/PLTCommon/.classpath
+++ b/Source/Common/PLTCommon/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry excluding="com/vci/mw/ClientInitializer.java|com/vci/mw/ClientInvocationInterceptor.java|com/vci/common/resource/CommonPropertiesExt.java|com/vci/common/LoginInfoDTO.java" kind="src" path="src"/>
+ <classpathentry excluding="com/vci/mw/ClientInitializer.java|com/vci/mw/ClientInvocationInterceptor.java|com/vci/common/resource/CommonPropertiesExt.java|com/vci/common/LoginInfoDTO.java|com/vci/common/log/LogType.java" kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry combineaccessrules="false" kind="src" path="/PLTSlice"/>
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/common"/>
diff --git a/Source/Common/PLTCommon/build-jar.xml b/Source/Common/PLTCommon/build-jar.xml
index 5b38a35..3c79322 100644
--- a/Source/Common/PLTCommon/build-jar.xml
+++ b/Source/Common/PLTCommon/build-jar.xml
@@ -2,7 +2,7 @@
<!--classes.jar; src.jar-->
<project name = "platform-Common" default = "build-PLT-common-jar" basedir = ".">
- <property file="build.properties"/>
+ <property file="../../build.properties"/>
<path id = "build.classpath">
<fileset dir = "${lib.dir}">
@@ -35,6 +35,7 @@
<include name="**.jar" />
</fileset>
</copy>
+
</target>
diff --git a/Source/Common/PLTCommon/build.properties b/Source/Common/PLTCommon/build.properties
index 4f8a188..7c2256e 100644
--- a/Source/Common/PLTCommon/build.properties
+++ b/Source/Common/PLTCommon/build.properties
@@ -9,4 +9,7 @@
service.dir=${lib.dir}/service
client.dir=${lib.dir}/client
+grid.app = ${app_home}/../grid/app
+grid.common=${grid.app}/common
+
platform.version=2024
\ No newline at end of file
diff --git a/Source/Common/PLTCommon/dist/plt-common.jar b/Source/Common/PLTCommon/dist/plt-common.jar
index 801e62c..fe6988b 100644
--- a/Source/Common/PLTCommon/dist/plt-common.jar
+++ b/Source/Common/PLTCommon/dist/plt-common.jar
Binary files differ
diff --git a/Source/Common/PLTCommon/src/com/vci/common/ServiceNames.java b/Source/Common/PLTCommon/src/com/vci/common/ServiceNames.java
index 3d36ac6..b454503 100644
--- a/Source/Common/PLTCommon/src/com/vci/common/ServiceNames.java
+++ b/Source/Common/PLTCommon/src/com/vci/common/ServiceNames.java
@@ -2,30 +2,34 @@
public class ServiceNames {
- // #鐧诲綍鏈嶅姟
- public static String LOGONSERVICE = "LogonService";
- // #绯荤粺妗嗘灦鏈嶅姟
- public static String FRAMESERVICE = "FrameService";
// 缂撳瓨鏈嶅姟
public static String CACHESERVICE = "CacheService";
+ public static String CACHESERVICEREP = "CacheServiceRep";
+ // #绯荤粺妗嗘灦鏈嶅姟
+ public static String FRAMESERVICE = "FrameService";
+ public static String FRAMESERVICEREP = "FrameServiceRep";
+ // #绯荤粺妗嗘灦鏈嶅姟
+ public static String LOGSERVICE = "LogService";
+ public static String LOGSERVICEREP = "LogServiceRep";
// 瀵硅薄妯″瀷绠$悊
public static String OMDSERVICE = "OMDService";
+ public static String OMDSERVICEREP = "OMDServiceRep";
// 瀵硅薄宸ュ巶鏈嶅姟
public static String BOFSERVICE = "BOFService";
- // 鏌ヨ妯℃澘绠$悊鏈嶅姟
- public static String QTDSERVICE = "QTDService";
+ public static String BOFSERVICEREP = "BOFServiceRep";
// 鏌ヨ妯℃澘绠$悊鏈嶅姟
public static String OQSERVICE = "OQService";
+ public static String OQSERVICEREP = "OQServiceRep";
// 鍙傜収鏌ヨ鏈嶅姟
public static String RQSERVICE = "RQService";
+ public static String RQSERVICEREP = "RQServiceRep";
// 宸ヤ綔娴佹湇鍔�
public static String WFSERVICE = "WFService";
+ public static String WFSERVICEREP = "WFServiceRep";
// UI绠$悊鏈嶅姟
public static String UISERVICE = "UIService";
- // 鎺堟潈銆侀壌鏉冩湇鍔�
- public static String AUTH2SERVICE = "Auth2Service";
- // 鍗风鐞嗘湇鍔�
- public static String VOLUMEMANAGER = "VolumeManager";
+ public static String UISERVICEREP = "UIServiceRep";
// 榛樿鍗锋湇鍔″悕
- public static String VOLUMESERVICE = "VolService";
+ public static String VOLUMESERVICE = "VolumeService";
+ public static String VOLUMESERVICEREP = "VolumeServiceRep";
}
diff --git a/Source/Common/PLTCommon/src/com/vci/common/log/ServerWithLog4j.java b/Source/Common/PLTCommon/src/com/vci/common/log/ServerWithLog4j.java
index 6dfb72a..d7d80f7 100644
--- a/Source/Common/PLTCommon/src/com/vci/common/log/ServerWithLog4j.java
+++ b/Source/Common/PLTCommon/src/com/vci/common/log/ServerWithLog4j.java
@@ -34,6 +34,9 @@
static {
try {
File file = new File(log4j_properties_dev);
+
+ System.out.println("=====log4j_properties_dev = " + file.getAbsolutePath());
+
String loadFrom = "";
if(file.exists()){
diff --git a/Source/Common/PLTCommon/src/com/vci/common/util/IceProxyUtility.java b/Source/Common/PLTCommon/src/com/vci/common/util/IceProxyUtility.java
index 5d84bb4..58a16a5 100644
--- a/Source/Common/PLTCommon/src/com/vci/common/util/IceProxyUtility.java
+++ b/Source/Common/PLTCommon/src/com/vci/common/util/IceProxyUtility.java
@@ -3,9 +3,12 @@
import java.util.HashMap;
import java.util.Map;
+import org.apache.commons.lang3.StringUtils;
+
import com.vci.common.log.ServerWithLog4j;
import com.vci.common.resource.IceClientProperties;
import com.zeroc.Ice.ObjectPrx;
+import com.zeroc.Ice.Util;
/**
* <p>Title: </p>
@@ -18,6 +21,8 @@
*/
public abstract class IceProxyUtility {
+ private static final String locatorKey = "--Ice.Default.Locator";
+
private com.zeroc.Ice.Communicator _communicator = null;
protected IceProxyUtility() {
@@ -33,13 +38,20 @@
{
try
{
- _communicator = com.zeroc.Ice.Util.initialize(args);
- _communicator.getDefaultRouter();
+ String[] initParams = new String[0];
+ if (IceClientProperties.Endpoints().contains("/"))
+ initParams = new String[]{locatorKey + "=" + IceClientProperties.Endpoints()};
+
+ _communicator = Util.initialize(initParams);
+
+ //_communicator = com.zeroc.Ice.Util.initialize(args);
+ //_communicator.getDefaultRouter();
} catch (Exception e) {
ServerWithLog4j.logger.error("InitCommunicator Error", e);
throw e;
}
}
+
/**
* 鑾峰彇鏈嶅姟瀵硅薄浠g悊
@@ -47,25 +59,40 @@
* @return
* @throws Exception
*/
- public ObjectPrx getObjectByName(String name) throws Exception
+ public ObjectPrx getObjectByName(String name, String adapterRep) throws Exception
{
+ ObjectPrx prx = null;
try
{
- String proxyLocator = name + ":" + IceClientProperties.Endpoints();
-
- ObjectPrx prx = _communicator.stringToProxy(proxyLocator);
- Map<String, String> context = getCurUserContext();
- if (context != null) {
- return prx.ice_context(context);
+ String proxyLocator = name;
+ if (!IceClientProperties.Endpoints().contains("/")) {
+ proxyLocator = name + ":" + IceClientProperties.Endpoints();
} else {
- return prx;
+ proxyLocator = name + "@" + adapterRep;
}
+
+ prx = _communicator.stringToProxy(proxyLocator);
+
} catch (Exception e) {
e.printStackTrace();
throw e;
}
+
+ String[] ids = prx.ice_ids();
+
+ if (prx == null)
+ throw new Exception("Not Found ObjectPrx " + name);
+
+ Map<String, String> context = getCurUserContext();
+ if (context != null) {
+ return prx.ice_context(context);
+ } else {
+ return prx;
+ }
}
+
+
/**
* 鑾峰彇鏈嶅姟瀵硅薄浠g悊锛屽苟璁剧疆context淇℃伅
* @param name
diff --git a/Source/Common/PLTSlice/build-jar.xml b/Source/Common/PLTSlice/build-jar.xml
index 4120656..5649610 100644
--- a/Source/Common/PLTSlice/build-jar.xml
+++ b/Source/Common/PLTSlice/build-jar.xml
@@ -2,7 +2,7 @@
<!--classes.jar; src.jar -->
<project name="platform-Slice" default="build-Slice-jar" basedir=".">
- <property file="build.properties" />
+ <property file="../../build.properties" />
<path id="build.classpath">
<fileset dir="${lib.dir}">
@@ -36,6 +36,7 @@
<include name="**.jar" />
</fileset>
</copy>
+
</target>
diff --git a/Source/Common/PLTSlice/build.properties b/Source/Common/PLTSlice/build.properties
index 4f8a188..7c2256e 100644
--- a/Source/Common/PLTSlice/build.properties
+++ b/Source/Common/PLTSlice/build.properties
@@ -9,4 +9,7 @@
service.dir=${lib.dir}/service
client.dir=${lib.dir}/client
+grid.app = ${app_home}/../grid/app
+grid.common=${grid.app}/common
+
platform.version=2024
\ No newline at end of file
diff --git a/Source/Common/PLTSlice/dist/plt-slice.jar b/Source/Common/PLTSlice/dist/plt-slice.jar
index 8a67790..5919ec6 100644
--- a/Source/Common/PLTSlice/dist/plt-slice.jar
+++ b/Source/Common/PLTSlice/dist/plt-slice.jar
Binary files differ
diff --git a/Source/Common/PLTSlice/slice/02-framework.ice b/Source/Common/PLTSlice/slice/02-framework.ice
index 69fc746..55662ee 100644
--- a/Source/Common/PLTSlice/slice/02-framework.ice
+++ b/Source/Common/PLTSlice/slice/02-framework.ice
@@ -237,52 +237,7 @@
string licensor;
};
sequence<RoleRightInfo> RoleRightInfoList;
- /**-----------------------鏃ュ織绠$悊妯″潡-------------------------**/
- //鏃ュ織淇℃伅
- struct LogInfo {
- string puid;//ID
- string username;//鐢ㄦ埛鍚�
- string truename;//濮撳悕
- string userIp;//鐢ㄦ埛IP
- string result;//鎿嶄綔缁撴灉
- string content; // 鏃ュ織鍐呭
- string date;//鎿嶄綔鏃ユ湡
- string type;//鎿嶄綔绫诲瀷
- string moduleName;//鎿嶄綔妯″潡
- string entityDesc;//鎿嶄綔瀵硅薄鐨勬弿杩�
- string property;//鎿嶄綔鐨勫睘鎬�
- string previousVal;//鎿嶄綔鍓嶅緱鍊�
- string newVal;//鎿嶄綔鍚庣殑鍊�
- string logType;// 鏃ュ織绫诲瀷
- };
- sequence<LogInfo> LogInfoList;
- //鏃ュ織淇濆瓨鍜屽浠芥湡闄愪俊鎭�
- struct LogPeriodInfo {
- string code;//瀵瑰簲鐨勬暟鍊硷紝浠ユ湀涓哄崟浣�
- string value;//瀵瑰簲鐨勬樉绀哄悕绉�
- };
- sequence<LogPeriodInfo> LogPeriodInfoList;
- //妯″潡瀵瑰簲鐨勬爲鑿滃崟
- struct SpecialRoleTreeInfo{
- string iconName;
- string nodeName;
- string panelName;
- string nodeShowInfo;
- };
- sequence<SpecialRoleTreeInfo> SpecialRoleTreeInfoList;
- //涓夊憳鐧诲綍鏄剧ず鐨勬ā鍧椾俊鎭�
- struct SpecialRoleInfo{
- string logonUserId;
- string logonRoleId;
- string iconName;
- string moduleName;
- string panelName;
- string moduleShowInfo;
- SpecialRoleTreeInfoList specialRoleTreeInfos;
- }
- sequence<SpecialRoleInfo> SpecialRoleInfoList;
-
//鏁版嵁搴撲俊鎭�
struct DataSourceInfo{
string tbSpaceName; // 琛ㄧ┖闂村悕绉�
@@ -366,538 +321,512 @@
sequence<GrandValue> GrandValueArray;
};//end data
- module method {
- interface FrameworkService {
- // 娴嬭瘯绯荤粺鏄惁鑳借繛閫�
- bool test() throws common::VCIError;
- /**楠岃瘉鐧诲綍**/
- data::UserInfo checkLogin(string userName,string password) throws common::VCIError;
+ interface FrameworkService {
+ // 娴嬭瘯绯荤粺鏄惁鑳借繛閫�
+ bool test() throws common::VCIError;
- data::UserInfo checkLoginForBS(string userName,string password) throws common::VCIError;
+ /**楠岃瘉鐧诲綍**/
+ data::UserInfo checkLogin(string userName,string password) throws common::VCIError;
- data::UserInfo getUserObjectByUserName(string userName) throws common::VCIError;
+ data::UserInfo checkLoginForBS(string userName,string password) throws common::VCIError;
- data::UserInfo checkByToken(string token) throws common::VCIError;
+ data::UserInfo getUserObjectByUserName(string userName) throws common::VCIError;
- // 鏄惁鍚敤鐢ㄦ埛鏉冮檺鏍¢獙
- bool userSecuritySwith() throws common::VCIError;
- // 鏄惁鍚敤鏈哄櫒鏉冮檺鏍¢獙
- bool ipSecuritySwitch() throws common::VCIError;
- // 鏄惁榛樿鏈夋潈
- string defaultHasRight() throws common::VCIError;
+ data::UserInfo checkByToken(string token) throws common::VCIError;
- //flag:nonsys鍒犻櫎闈炵郴缁熸ā鍧�
- //flag:business鍒犻櫎涓氬姟妯″潡
- bool deleteModules(string flag)throws common::VCIError;
- common::data::StringArray getClientDeployJarPath() throws common::VCIError;
-
- /** AppConfigCategory 瀵硅薄鎺ュ彛 **/
- // 娣诲姞銆佷繚瀛� AppConfigCategory 瀵硅薄
- string saveAppConfigCategory(data::AppConfigCategoryInfo info, common::data::UserEntityInfo userEntity) throws common::VCIError;
- // 淇敼銆佹洿鏂� AppConfigCategory 瀵硅薄
- bool updateAppConfigCategory(data::AppConfigCategoryInfo info, common::data::UserEntityInfo userEntity) throws common::VCIError;
- // 鏍规嵁ID鍒犻櫎 AppConfigCategory 瀵硅薄锛堟壒閲忥級
- bool deleteAppConfigCategory(common::data::StringArray ids, common::data::UserEntityInfo userEntity) throws common::VCIError;
- // 杩斿洖鍏ㄩ儴 AppConfigCategory 瀵硅薄
- data::AppConfigCategoryInfoList getAppConfigCategorys(common::data::UserEntityInfo userEntity) throws common::VCIError;
- // 鏍规嵁ID杩斿洖 AppConfigCategory 瀵硅薄
- data::AppConfigCategoryInfo getAppConfigCategoryById(string id, common::data::UserEntityInfo userEntity) throws common::VCIError;
- /** AppConfigDetail 瀵硅薄鎺ュ彛 **/
- // 娣诲姞銆佷繚瀛� AppConfigDetail 瀵硅薄
- string saveAppConfigDetail(data::AppConfigDetailInfo info, common::data::UserEntityInfo userEntity) throws common::VCIError;
- // 淇敼銆佹洿鏂� AppConfigDetail 瀵硅薄
- bool updateAppConfigDetail(data::AppConfigDetailInfo info, common::data::UserEntityInfo userEntity) throws common::VCIError;
- // 鏍规嵁ID鍒犻櫎 AppConfigDetail 瀵硅薄锛堟壒閲忥級
- bool deleteAppConfigDetail(common::data::StringArray ids, common::data::UserEntityInfo userEntity) throws common::VCIError;
- // 杩斿洖鍏ㄩ儴 AppConfigDetail 瀵硅薄
- data::AppConfigDetailInfoList getAppConfigDetails(common::data::UserEntityInfo userEntity) throws common::VCIError;
- // 杩斿洖鎸囧畾鍒嗙被鐨勫叏閮� AppConfigDetail 瀵硅薄
- data::AppConfigDetailInfoList getAppConfigDetailsByCatId(string clsfId, common::data::UserEntityInfo userEntity) throws common::VCIError;
- data::AppConfigDetailInfoList getAppConfigDetailsByCategory(string catName, common::data::UserEntityInfo userEntity) throws common::VCIError;
-
- // 鏍规嵁ID杩斿洖 AppConfigDetail 瀵硅薄
- data::AppConfigDetailInfo getAppConfigDetailById(string id, common::data::UserEntityInfo userEntity) throws common::VCIError;
- // 鏍规嵁閰嶇疆Key杩斿洖 AppConfigDetail 瀵硅薄
- data::AppConfigDetailInfo getAppConfigDetailByKey(string key, common::data::UserEntityInfo userEntity) throws common::VCIError;
- // 鏍规嵁閰嶇疆Key杩斿洖 AppConfigDetail 瀵硅薄
- data::AppConfigDetailInfoList getAppConfigDetailsByName(string name, common::data::UserEntityInfo userEntity) throws common::VCIError;
-
- /** 鏍规嵁key鑾峰彇conf.properties涓殑鍙傛暟鍊�
- fileResourcePath锛氳祫婧愭枃浠惰矾寰�
- 姣斿锛�/properties/conf.properties锛寈xx.properties 鏂囦欢鍦ㄩ」鐩富鐩綍鐨刾roperties鏂囦欢澶逛笅
- 鎴栬�咃細properties/xxx.properties锛寈xx.properties 鏂囦欢鍦╯rc/properties/鏂囦欢澶逛笅
- 濡傛灉浼犲叆绌哄�硷紝鍒欎粠 /properties/conf.properties 涓鍙�
- key锛�
- **/
- string getConfigValue(string key) throws common::VCIError;
-
- //寰楀埌涓�涓殢鍗崇殑36浣嶆暟
- string getRandomGUID36() throws common::VCIError;
-
- /***************************绯荤粺鍔熻兘妯″潡start**************************/
- //淇濆瓨妯″潡
- string saveModule(data::FunctionInfo function,common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鏇存柊妯″潡
- string updateModule(data::FunctionInfo function,common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鍒犻櫎妯″潡
- string deleteModule(string moduleId,common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鑾峰彇鑷姩鐢熸垚鐨勭紪鍙�
- //long getAutoModuleNo() throws common::VCIError;
- //鑾峰彇瀛愮骇妯″潡
- data::FunctionInfoList getModuleListByParentId(string parentId,bool isAll) throws common::VCIError;
- data::FunctionInfoList getModuleListByParentIdForBS(string parentId,bool isAll) throws common::VCIError;
- data::FunctionInfoList getModuleListByParentIdForCS(string parentId,bool isAll) throws common::VCIError;
- //鑾峰彇鎵�鏈夊瓙绾фā鍧�
- data::FunctionInfoList getChildrenFunctionsByParentId(string parentId,bool isAll) throws common::VCIError;
- //鑾峰彇鐢ㄦ埛鏈夋潈闄愮殑瀛愮骇妯″潡鍒楄〃
- data::FunctionInfoList getModuleListByRoleRight(string parentId,string userName) throws common::VCIError;
- data::FunctionInfoList getModuleListByRoleRightForBS(string parentId,string userName) throws common::VCIError;
- //鏍规嵁class鏌ヨ妯″潡瀵硅薄
- data::FunctionInfo getModuleByClass(string classPath) throws common::VCIError;
- //鏍规嵁funcOid鏌ヨ妯″潡瀵硅薄
- data::FunctionInfo getFunctionObjectById(string funcOid) throws common::VCIError;
- //鏍规嵁妯″潡鍚嶇О鏌ヨ妯″潡瀵硅薄
- data::FunctionInfo getModuleByName(string moduleName) throws common::VCIError;
- //妫�鏌ユā鍧椾笅鏄寕鎺ユā鍧楄繕鏄寕鎺ユ搷浣滐紝true涓烘寕鎺ユā鍧�
- long checkChildObject(string moduleId) throws common::VCIError;
- //淇濆瓨鎿嶄綔
- string saveOperate(data::OperateInfo operate,common::data::UserEntityInfo userEntity) throws common::VCIError;
- //淇敼鎿嶄綔
- string updateOperate(data::OperateInfo operate,common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鍒犻櫎鎿嶄綔
- bool deleteOperate(string id,common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鑾峰彇鍏ㄩ儴鎿嶄綔鍒楄〃锛堝弬鏁版ā鍧桰D涓嶄负绌虹殑鏃跺�欒幏鍙栭櫎璇ユā鍧椾笅鎿嶄綔涔嬪鐨勫叏閮ㄦ搷浣滐級
- data::OperateInfoList getOperateTreeList(string moduleId) throws common::VCIError;
- //妫�鏌ユ搷浣滄槸鍚﹁寮曠敤
- long checkOperateIsReferenced(string operateId) throws common::VCIError;
- //閫氳繃鏍囪瘑鑾峰彇鎿嶄綔
- data::OperateInfo getOperateByIdentify(string identify) throws common::VCIError;
- //閫氳繃鍚嶇О鑾峰彇鎿嶄綔
- data::OperateInfo fetchOperateTypeByName(string name) throws common::VCIError;
- //鑾峰彇妯″潡涓嬫寕鎺ョ殑鎿嶄綔瀵硅薄 onlyIsValid 鍙傛暟琛ㄧず鏄惁浠呬粎杩斿洖鏄敓鏁堢殑鎿嶄綔 true锛氭槸 false 锛氫笉鏄紙姝ゆ椂杩斿洖妯″潡涓嬪叏閮ㄧ殑鎿嶄綔锛屼粎鍦ㄥ畾涔夋ā鍧椾笅鐨勬搷浣滄椂闇�瑕佽繑鍥炲叏閮ㄧ殑鎿嶄綔锛屽叾瀹冩儏鍐甸渶瑕佸潎鍙渶瑕佽繑鍥炵敓鏁堢殑鎿嶄綔锛�
- data::FuncOperationInfoList getFuncOperationByModule(string funcitonId,string operateId, bool onlyIsValid) throws common::VCIError;
- //閫氳繃鎿嶄綔鏍囪瘑鍜屾ā鍧桰D鑾峰彇鎸傛帴鍏崇郴
- data::FuncOperationInfo getFuncOperationByIdentify(string funcId,string identify) throws common::VCIError;
- //淇濆瓨妯″潡涓嬬殑鎿嶄綔
- bool saveFuncOperation(data::FuncOperationInfoList funcOperationInfos,common::data::UserEntityInfo userEntity) throws common::VCIError;
- //淇敼妯″潡涓嬫搷浣滃埆鍚�
- bool updateFuncOperation(string id, string alias, bool isSelected, common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鍒犻櫎妯″潡涓嬬殑鎿嶄綔
- bool deleteFuncOperation(data::FuncOperationInfo funcOperation,common::data::UserEntityInfo userEntity) throws common::VCIError;
-
- //淇濆瓨瑙掕壊鏉冮檺,閫氳繃鐢ㄦ埛鍚嶅尯鍒嗘潈闄愮被鍨�
- bool saveRoleRight(data::RoleRightInfoList roleRightInfos,string roleId,string userName,common::data::UserEntityInfo userEntity) throws common::VCIError;
- //澧炲姞瑙掕壊鏉冮檺,閫氳繃鐢ㄦ埛鍚嶅尯鍒嗘潈闄愮被鍨�
- bool addRoleRight(data::RoleRightInfoList roleRightInfos,string roleId,string userName,common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鑾峰彇瑙掕壊鏉冮檺,閫氳繃鐢ㄦ埛鍚嶅尯鍒嗘潈闄愮被鍨�
- data::RoleRightInfoList getRoleRightList(string roleId,string userName) throws common::VCIError;
- //鏍规嵁鎺堟潈瑙掕壊鐨勭被鍨嬭幏鍙栨潈闄�
- data::RoleRightInfoList getRoleRightListByType(common::data::StringArray rightType) throws common::VCIError;
- //鍒犻櫎瑙掕壊鏉冮檺锛寃eidy@2018-10-12
- bool removeRoleRight(data::RoleRightInfoList roleRightInfos,string roleId,string userName,common::data::UserEntityInfo userEntity) throws common::VCIError;
- //娓呯┖瑙掕壊鏉冮檺锛寃eidy@2019-01-24
- bool clearRoleRight(string roleId,string userName,common::data::UserEntityInfo userEntity, short functionType) throws common::VCIError;
- //鑾峰彇鐢ㄦ埛瀵瑰綋鍓嶆ā鍧楃殑鏉冮檺鍊�
- data::RoleRightInfoList getRoleRightByModule(string funcId,string userName) throws common::VCIError;
- //鑾峰彇褰撳墠鐢ㄦ埛鐨勬潈闄�
- data::RoleRightInfoList getRoleRightByUserName(string userName) throws common::VCIError;
- //鑾峰彇褰撳墠鐢ㄦ埛鐨勫叿鏈夌殑鍔熻兘妯″潡鏉冮檺
- data::RoleRightInfoList getFunctionRoleRightByUserName(string userName) throws common::VCIError;
-
+ // 鏄惁鍚敤鐢ㄦ埛鏉冮檺鏍¢獙
+ bool userSecuritySwith() throws common::VCIError;
+ // 鏄惁鍚敤鏈哄櫒鏉冮檺鏍¢獙
+ bool ipSecuritySwitch() throws common::VCIError;
+ // 鏄惁榛樿鏈夋潈
+ string defaultHasRight() throws common::VCIError;
- /***************************绯荤粺鍔熻兘妯″潡end**************************/
-
- /**鏃ュ織绠$悊妯″潡**/
- //鑾峰彇鏃ュ織鍒犻櫎閰嶇疆锛宼rue琛ㄧず鑷姩锛宖alse琛ㄧず鎵嬪姩
- bool getIsAutoDelete() throws common::VCIError;
- //鍒濆鍖栦笅鎷夋锛岃幏鍙栭厤缃ソ鐨勫��
- data::LogPeriodInfoList getPeriods() throws common::VCIError;
- //鑾峰彇鏃ュ織椤甸潰鏄剧ず鏉℃暟
- long getPageSize() throws common::VCIError;
- //鑾峰彇褰撳墠鏌ヨ鏃ュ織鐨勬�绘潯鏁�
- long getSumLogRows(string sql) throws common::VCIError;
- //鑾峰彇褰撳墠鏌ヨ鐨勬棩蹇楅泦鍚�
- data::LogInfoList fetchLogInfo(long pageNo, long pagesize,string sql) throws common::VCIError;
- //淇濆瓨鏃ュ織淇濆瓨鏈熼檺
- bool savePeriod(data::SystemCfgInfo period,common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鑾峰彇褰撳墠鏃ュ織淇濆瓨鏈熼檺
- long getCurPeriod(string type) throws common::VCIError;
- //鍒犻櫎鏃ュ織
- bool deleteLog(string deleteDate) throws common::VCIError;
- //鏍规嵁鏌ヨ鏉′欢鑾峰彇鏃ュ織淇℃伅
- data::LogInfoList getLogListByContion(long pageNo,long pagesize,string sql) throws common::VCIError;
-
- /**鑾峰彇鎵�鏈夐儴闂�**/
- data::DeptInfoList fetchDepartmentInfo() throws common::VCIError;
-
- data::DeptInfoList fetchDeptByUserNames(common::data::StringArray userNames) throws common::VCIError;
- /**鏍规嵁id鑾峰彇閮ㄩ棬**/
- data::DeptInfo fetchDepartmentInfoById(string id) throws common::VCIError;
- /**鏍规嵁浜哄憳id鑾峰彇閮ㄩ棬**/
- data::DeptInfo fetchDeptByUserId(string userId) throws common::VCIError;
- data::DeptInfo fetchDeptByDeptName(string deptName) throws common::VCIError;
- data::DeptInfo fetchDeptByParentIdAndName(string parentId,string deptName) throws common::VCIError;
- /**鑾峰彇椤剁骇閮ㄩ棬**/
- data::DeptInfoList fetchDepartmentInfoRoot() throws common::VCIError;
- /**鑾峰彇閮ㄩ棬涓嬬殑瀛愰儴闂�**/
- data::DeptInfoList fetchDepartmentInfoByParentId(string prtoid) throws common::VCIError;
- /**鏍规嵁id鑾峰彇閮ㄩ棬鍙婂叾瀛愰儴闂�**/
- data::DeptInfoList fetchDepartmentInfosById(string id) throws common::VCIError;
- data::DeptInfoList fetchDepartmentInfosBySonId(string id) throws common::VCIError;
- //鏍规嵁閮ㄩ棬id鑾峰彇鐢ㄦ埛淇℃伅
- data::UserInfoList getUserByDeptId(string deptId)throws common::VCIError;
-
- /** 鏍规嵁ID杩斿洖瑙掕壊瀵硅薄**/
- data::RoleInfo fetchRoleInfoById(string roleId) throws common::VCIError;
- data::RoleInfo fetchRoleByName(string name) throws common::VCIError;
- /**鑾峰彇鎵�鏈夌殑瑙掕壊**/
- data::RoleInfoList fetchRoleInfo() throws common::VCIError;
- /**鏍规嵁鐢ㄦ埛绫诲瀷鑾峰彇瑙掕壊**/
- data::RoleInfoList fetchRoleInfoByType(short type) throws common::VCIError;
- /**鏍规嵁瑙掕壊绫诲瀷鑾峰彇瑙掕壊**/
- data::RoleInfoList fetchRoleInfoByRoleType(short type) throws common::VCIError;
- /**閫佹璁惧瑙掕壊**/
- data::RoleInfoList getRoleListByTypeForMeasure(short type) throws common::VCIError;
- /**鏍规嵁鐢ㄦ埛ID鑾峰彇瑙掕壊**/
- data::RoleInfoList fetchRoleInfoByUserId(string userId) throws common::VCIError;
- /**鏍规嵁鐢ㄦ埛鍚嶈幏鍙栬鑹�**/
- data::RoleInfoList fetchRoleInfoByUserName(string userName) throws common::VCIError;
- /**鏍规嵁鐢ㄦ埛鍚嶈幏鍙栬鑹茬殑鍒嗛〉瀹炵幇**/
- data::RoleInfoList fetchRoleInfoByUserNameAndPage(long pageNo,long pageSize,string userName) throws common::VCIError;
- /**鏍规嵁姣旂敤鎴风被鍨嬩綆鐨勮鑹�**/
- data::RoleInfoList fetchRoleInfoByUserType(string userName) throws common::VCIError;
- /**鏍规嵁鐢ㄦ埛鍚嶈幏鍙栬鑹叉�绘暟**/
- long getRoleTotalByUserName(string userName) throws common::VCIError;
-
- /**鏍规嵁鍨嬪彿鑾峰彇璇ュ瀷鍙蜂笅鐨勫瀷鍙锋�诲笀**/
- data::UserInfoList fetchUserInfoByModel(string model) throws common::VCIError;
- /**鏍规嵁鍨嬪彿鑾峰彇璇ュ瀷鍙蜂笅鐨勫瀷鍙锋�诲笀**/
- data::UserInfoList fetchUserInfoByModelId(string modelId) throws common::VCIError;
- /**鑾峰彇鎵�鏈夌殑鎴愬憳**/
- data::UserInfoList fetchUserInfo() throws common::VCIError;
- /**鑾峰彇闄ゅ幓admin锛宒eveloper锛屼笁鍛樺鎵�鏈夌殑鏅�氭垚鍛�**/
- data::UserInfoList fetchUserInfoWithOutSanYuan() throws common::VCIError;
- /**鏍规嵁鏉′欢鏌ヨ鐢ㄦ埛**/
- data::UserInfoList fetchUserInfoByCondition(string searchName ,string searchUserName ,string deptId,
- string roleId, string userName,long pageNo,long pageSize ) throws common::VCIError;
- //add by caill 2016.9.26
- data::UserInfoList fetchUserInfoByConditionUnited(string searchName ,string searchUserName ,string deptId,
- string roleId, string userName,long pageNo,long pageSize ) throws common::VCIError;
- data::UserInfoList fetchNoramlUserInfoByConditionUnited(string searchName ,string searchUserName ,string deptId,
- string roleId, string userName,long pageNo,long pageSize ) throws common::VCIError;
- data::UserInfoList fetchNormalUserInfoByCondition(string searchName ,string searchUserName ,string deptId,
- string roleId, string userName,long pageNo,long pageSize ) throws common::VCIError;
- /**鏍规嵁鏉′欢鑾峰彇浜哄憳鎬绘暟**/
- long getUserTotalByCondition(string searchName ,string searchUserName ,string deptId,
- string roleId, string userName) throws common::VCIError;
-
- long getNormalUserTotalByCondition(string searchName ,string searchUserName ,string deptId,
- string roleId, string userName) throws common::VCIError;
-
- /**鑾峰彇鎵�鏈夌殑鎴愬憳**/
- data::UserInfoList fetchUserInfoByType(short type) throws common::VCIError;
- /**鏍规嵁鐢ㄦ埛鍚嶈幏鍙栨垚鍛�**/
- data::UserInfo fetchUserInfoByName(string userName) throws common::VCIError;
- /**鏍规嵁鏂囦欢鏌淚d鍜屾垚鍛樼被鍨嬭幏鍙栨垚**/
- data::UserInfoList fetchUserInfoByPvolumeId(string pvolumeId , short type) throws common::VCIError;
- /**鏍规嵁瑙掕壊Id鍜屾垚鍛樼被鍨嬭幏鍙栨垚**/
- data::UserInfoList fetchUserInfoByRoleId(string roleId , short type) throws common::VCIError;
- data::UserInfoList fetchUsersByRoleId(string roleId) throws common::VCIError;
- data::UserInfoList fetchUserInfoByDeptAndRole(common::data::StringArray deptIds , common::data::StringArray roleIds) throws common::VCIError;
- /**鍒涘缓鏂囦欢鏌滃拰鐢ㄦ埛鐨勫叧**/
- bool savePvolumeUser(string pvolumId , common::data::StringArray userIds ,common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鍒涘缓瑙掕壊鍜岀敤鎴风殑鍏崇郴**/
- bool saveRight(string roleId , common::data::StringArray userIds ,common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鍒涘缓閮ㄩ棬鍜岀敤鎴风殑鍏崇郴**/
- bool saveRighForDept(string deptId , common::data::StringArray userIds ,common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鍒涘缓瑙掕壊鍜岀敤鎴风殑鍏崇郴**/
- bool saveRights(common::data::StringArray roleIds , common::data::StringArray userIds ,common::data::UserEntityInfo userEntity) throws common::VCIError;
-
- /**鍒涘缓瑙掕壊鍜岀敤鎴风殑鍏崇郴**/
- bool saveUserDept(common::data::StringArray userIds , string deptId ,common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**澧炲姞閮ㄩ棬**/
- string saveDepartment(data::DeptInfo dept,common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鎵归噺淇濆瓨**/
- bool batchSaveDepart(data::DeptInfoList deptInfo,common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**澧炲姞瑙掕壊**/
- string saveRole(data::RoleInfo role,common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鐢ㄤ簬楠岃瘉瑙掕壊鏄惁琚紩鐢�**/
- long checkRoleIsquotedCount(string id )throws common::VCIError;
-
- data::UserInfoList selectUserByRoleId(string id) throws common::VCIError;
- /**澧炲姞鎴愬憳**/
- string saveUser(data::UserInfo user,common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鎵归噺澧炲姞鎴愬憳*/
- bool batchSaveUsers(data::UserInfoList userInfos,common::data::StringArray2D deptAndUserRelation,common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**淇敼閮ㄩ棬**/
- bool updateDepartment(data::DeptInfo dept, common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**淇敼瑙掕壊**/
- bool updateRole(data::RoleInfo role, common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**淇敼鎴愬憳**/
- bool updateUser(data::UserInfo user, common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**淇敼鎴愬憳**/
- bool saveOrUpdateUser(data::UserInfo user, common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鏇存柊閮ㄩ棬鐨勭埗ID**/
- bool updateDeptParentId(string id, string parentId, common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**淇敼鐢ㄦ埛瀵嗙爜**/
- string modifyUserPassword(string idUser, string oldPW, string newPW, common::data::UserEntityInfo userEntity) throws common::VCIError;
-
-
- /**鍒犻櫎閮ㄩ棬**/
- bool deleteDepartment(common::data::StringArray ids , common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鍒犻櫎瑙掕壊**/
- bool deleteRole(common::data::StringArray ids , common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鍒犻櫎鎴愬憳**/
- bool deleteUser(common::data::StringArray ids , common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鍋滅敤/鍚敤**/
- bool stopUsers(common::data::StringArray ids ,bool flag, common::data::UserEntityInfo userEntity) throws common::VCIError;
-
- /**绯荤粺閰嶇疆妯″潡**/
- //淇濆瓨鐗规畩瀛楃鍒嗙被
- string saveSpecialCharClsf(data::SpecialCharClsfInfo specialCharClsf, common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鍒犻櫎鐗规畩瀛楃鍒嗙被
- bool deletSpecialCharClsf(common::data::StringArray ids, common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鏇存柊鐗规畩瀛楃鍒嗙被
- bool updateSpecialCharClsf(data::SpecialCharClsfInfo specialCharClsf, common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鑾峰彇鐗规畩瀛楃鍒嗙被
- data::SpecialCharClsfInfoList getSpecialCharClsfList(long pageNo,long pageSize) throws common::VCIError;
- //鑾峰彇鐗规畩瀛楃鍒嗙被
- data::SpecialCharClsfInfoList getAllSpecialCharClsfList() throws common::VCIError;
-
- //鑾峰彇鐗规畩瀛楃鍒嗙被鎬绘暟
- long getSpecialCharClsTotal()throws common::VCIError;
- //鏍规嵁鍒嗙被鑾峰彇瀛楃
- data::SpecialCharInfoList getBychar(string plscsfoId) throws common::VCIError;
- //淇濆瓨鐗规畩瀛楃
- string saveSpecialChar(data::SpecialCharInfoList specialCharInfos, common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鍒犻櫎鐗规畩瀛楃
- bool deletSpecialChar(common::data::StringArray ids, common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鍒犻櫎PID鐗规畩瀛楃
- bool deleteSpecialCharByParentId(string id, common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鏇存柊鐗规畩瀛楃
- bool updateSpecialChar(data::SpecialCharInfo specialChar, common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鑾峰彇鐗规畩瀛楃
- data::SpecialCharInfoList fetchSpecialChar(string classId) throws common::VCIError;
-
- //鑾峰彇鎵�鏈夌殑瀵嗙爜绛栫暐
- data::PasswordStrategyInfoList fetchAllPasswordStrategy()throws common::VCIError;
- //鑾峰彇瀵嗙爜绛栫暐鐨勫垎椤靛鐞�
- data::PasswordStrategyInfoList fetchAllPasswordStrategyByPage(long pageNo,long pageSize)throws common::VCIError;
- //鑾峰彇瀵嗙爜绛栫暐鎬绘暟
- long getPasswordStrategyTotal()throws common::VCIError;
-
-
- //淇濆瓨瀵嗙爜绛栫暐
- bool savePasswordStrategy(data::PasswordStrategyInfo info, common::data::UserEntityInfo userEntity) throws common::VCIError;
- //淇敼瀵嗙爜绛栫暐
- bool editPasswordStrategy(data::PasswordStrategyInfo info, common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鍒犻櫎瀵嗙爜绛栫暐
- bool deletePasswordStrategy(common::data::StringArray ids, common::data::UserEntityInfo userEntity) throws common::VCIError;
- //楠岃瘉瀵嗙爜绛栫暐鏄惁琚紩鐢�
- long checkPasswordStrategyIsquotedCount(string id)throws common::VCIError;
- //鏍规嵁浜哄憳 鑾峰彇瀵嗙爜绛栫暐
- data::PasswordStrategyInfo fetchPasswordStrategyByUserId(string userId)throws common::VCIError;
-
- // 鏍规嵁鐢ㄦ埛妫�鏌ュ瘑鐮佹槸鍚︾鍚堝瘑鐮佺瓥鐣�
- string checkPasswordStrategyByUserId(string userId, string password, common::data::UserEntityInfo userEnt) throws common::VCIError;
-
- /**鍒涘缓瀵嗙爜绛栫暐鍜岀敤鎴风殑鍏崇郴**/
- bool saveUserPasswordStrateg(common::data::StringArray userIds , string passwordStrategId ,common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鏍规嵁鐧诲綍鐢ㄦ埛鍚嶈幏鍙栫櫥褰曡处鎴蜂俊鎭�**/
- data::UserLogonInfo fetchUserLogonObj(string userId) throws common::VCIError;
- //鑾峰彇鏃堕棿
- long getSystemTime() throws common::VCIError;
- /**鏇存柊鐧诲綍淇℃伅**/
- void updateLogonInfo(string userId,bool flag)throws common::VCIError;
- //瑙i攣
- void deblock(common::data::StringArray ids , common::data::UserEntityInfo userEntity) throws common::VCIError;
-
- //閫氳繃ID鍙栧緱鎿嶄綔绫诲瀷淇℃伅
- data::OperateInfo getOperatetById(string id) throws common::VCIError;
- //绠�鍗曡褰曠郴缁熺櫥鍏�/鐧诲嚭鏃ュ織
- void savelog(string content, common::data::UserEntityInfo userEntity) throws common::VCIError;
- void saveLogV2(string result, string content, string type, short logTypeIntVal, string dataObjOid, common::data::UserEntityInfo userEntity) throws common::VCIError;
- void savelogfail(string content, common::data::UserEntityInfo userEntity) throws common::VCIError;
- //add by caill绠�鍗曡褰曠敤鎴疯閿佸畾鏃ュ織淇℃伅
- void blocklog(string userId, common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鑾峰彇鎵�鏈夌殑瀵嗙爜缁勫悎鏂瑰紡**/
- data::CombinationInfoList fetchAllCombinations() throws common::VCIError;
- /**鍒嗛〉鏌ヨ瀵嗙爜缁勫悎鏂瑰紡**/
- data::CombinationInfoList fetchCombinationsToPage(long pageIndex, long pageSize) throws common::VCIError;
-
- /**娣诲姞瀵嗙爜缁勫悎鏂瑰紡**/
- string saveCombination(data::CombinationInfo combination ,common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**淇敼瀵嗙爜缁勫悎鏂瑰紡**/
- bool updateCombination(data::CombinationInfo combination ,common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鍒犻櫎瀵嗙爜缁勫悎鏂瑰紡**/
- bool deleteCombination(common::data::StringArray ids , common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**閫氳繃鐖秈d 鑾峰彇缁勫悎鏂瑰紡鍙栧�艰寖鍥�**/
- data::CombinationValueInfoList fetchCombinationValuesByParentId(string parentId) throws common::VCIError;
- /**娣诲姞瀵嗙爜缁勫悎鏂瑰紡鍙栧�艰寖鍥�**/
- string saveCombinationValue(data::CombinationValueInfoList combinationValues ,common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**淇敼瀵嗙爜缁勫悎鏂瑰紡鍙栧�艰寖鍥�**/
- bool updateCombinationValue(data::CombinationValueInfo combinationValue, common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鍒犻櫎瀵嗙爜缁勫悎鏂瑰紡鍙栧�艰寖鍥�**/
- bool deletCombinationValues(common::data::StringArray ids , common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鏍规嵁瀵嗙爜绛栫暐id 鑾峰彇鍏宠仈鐨勫瘑鐮佺粍鍚堟柟寮�**/
- data::CombinationInfoList fetchCombinationsByPstId(string pstId) throws common::VCIError;
- /**妫�楠屽瘑鐮佺粍鍚堟柟寮忔槸鍚﹁瀵嗙爜绛栫暐寮曠敤**/
- long checkCombinationIsquotedCount(string combinationd )throws common::VCIError;
-
- /**淇濆瓨涓夊憳鍜屾垚鍛�**/
- bool saveSpecialRole(string roleId , common::data::StringArray userIds ,common::data::UserEntityInfo userEntity) throws common::VCIError;
- //涓夊憳鐧诲綍鐨勬ā鍧椾俊鎭�
- //data::SpecialRoleInfoList getSpecialRoleList() throws common::VCIError;
- //鏌ヨ鎵�鏈夌殑瀛愯妭鐐� add by caill
- common::data::StringArray2D checkLevel() throws common::VCIError;
- //瀵煎叆鍔熻兘妯″潡绠$悊鏁版嵁 add by caill
- bool importModules(data::FunctionInfoList functionInfos,common::data::UserEntityInfo userEntity) throws common::VCIError;
- //淇濆瓨鎿嶄綔妯″潡鍏崇郴瀵硅薄 add by caill
- string saveFunOper(data::FuncOperationInfo funcOperation) throws common::VCIError;
- //add by caill
- bool saveFuncOperation2(data::FuncOperationInfo funcOperation,common::data::UserEntityInfo userEntity) throws common::VCIError;
- //鍒ゆ柇绗竴绾ф湁娌℃湁閲嶅悕鐨勬ā鍧� add by caill
- bool firstLevel(string plName) throws common::VCIError;
- //瑕嗙洊閲嶅悕鐨勭涓�绾� add by caill
- string changeFirstLevel(data::FunctionInfo function,string plName) throws common::VCIError;
- //鍒ゆ柇绗簩绾ф湁娌℃湁閲嶅悕鐨勬ā鍧� add by caill
- bool secondLevel(string plName,string fParentId) throws common::VCIError;
- //瑕嗙洊閲嶅悕鐨勭浜岀骇 add by caill
- string changeSecondLevel(data::FunctionInfo function,string plName,string fParentId) throws common::VCIError;
- //鍒ゆ柇妯″潡涓槸鍚﹀凡缁忓瓨鍦ㄦ鎿嶄綔绫诲瀷 add by caill
- bool selSameOper(string dataOperName,string plFuncOid) throws common::VCIError;
- //瑕嗙洊鎿嶄綔绫诲瀷 add by caill
- bool updateOperation(data::FuncOperationInfo funcOperation,common::data::UserEntityInfo userEntity,string dataOperName,string plFuncOid) throws common::VCIError;
- //
- common::data::StringArray2D getAllDatas(long size) throws common::VCIError;
- //
- long getAllOperitionsNum() throws common::VCIError;
- //
- common::data::StringArray2D getAllOperitions(long size) throws common::VCIError;
- //
- long getAllModelManagementNum() throws common::VCIError;
- //add by caill 2016.1.19鎵归噺澧炲姞瑙掕壊*/
- bool batchSaveRoles(data::RoleInfoList roles,common::data::UserEntityInfo userEntity) throws common::VCIError;
- //淇濆瓨涓�鑸搷浣滅被鍨嬫棩蹇�
- void savelogGeneralOperation(string result, string content, common::data::UserEntityInfo userEntity,string dataId,string plType) throws common::VCIError;
- //鑾峰彇鏁版嵁搴撲俊鎭�
- data::DataSourceInfo getDataSourceInfo() throws common::VCIError;
-
- //add by weidy 2021-1-2 鎶婅阿鍐涙坊鍔犵殑瑙掕壊閫夋嫨绛夋帴鍙f暣鍚堣繘鏉�
- /**鏍规嵁id鑾峰彇閮ㄩ棬**/
- data::DeptInfoList fetchDepartmentInfoByIds(string otherFiterString) throws common::VCIError;
- /****鏍规嵁鏌ヨ鏉′欢鑾峰彇涓嬬骇閮ㄩ棬***/
- data::DeptInfoList fetchChildrenDeptByParentOid(string prtoid,bool iscontains, string otherFiterString) throws common::VCIError;
- /***鑾峰彇閮ㄩ棬鍒楄〃淇℃伅****/
- data::DeptInfoList gridDeptDataGrids(string filter,long pageNo,long pageSize)throws common::VCIError;
-
- long gridDeptDataGridsCount(string filter)throws common::VCIError;
-
- data::RoleInfoList queryRoleInfos(string filter,long pageNo,long pageSize)throws common::VCIError;
-
- long queryRoleInfosCount(string filter)throws common::VCIError;
-
- /****鏍规嵁鏉′欢鏌ヨ闄ゅ幓admin锛宒eveloper锛屼笁鍛樺鎵�鏈夌殑鏅�氭垚鍛�**/
- data::UserInfoList fetchUserInfoByFilterString( string filterString,long pageNo,long pageSize ) throws common::VCIError;
-
- long fetchUserInfoByFilterStringCount( string filterString) throws common::VCIError;
-
- /****鏍规嵁鏉′欢鏌ヨ闄ゅ幓admin锛宒eveloper锛屼笁鍛樺鎵�鏈夌殑鏅�氭垚鍛�**/
- data::UserInfoList fetchUserInfosByFilterStringsql( string filterString) throws common::VCIError;
-
- /**鏍规嵁鐢ㄦ埛鍚嶆壒閲忚幏鍙栨垚鍛�**/
- data::UserInfoList fetchUserInfoByNames(common::data::StringArray userNames) throws common::VCIError;
-
- /**鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鎴愬憳**/
- data::UserInfo getUserObjectByoid(string userOid) throws common::VCIError;
-
- /**鏍规嵁鐢ㄦ埛涓婚敭鎵归噺鑾峰彇鎴愬憳**/
- data::UserInfoList getUserObjectByoids(common::data::StringArray userOid) throws common::VCIError;
-
- //=====================================================================================
- /**涓撲笟淇℃伅鎿嶄綔鎺ュ彛**/
- // 鑾峰彇鎵�鏈変笓涓氫俊鎭�
- data::SpecialtyInfoList getAllSpecialtyInfo() throws common::VCIError;
-
- // 澧炲姞涓撲笟
- string saveSpecialty(data::SpecialtyInfo specialty,common::data::UserEntityInfo userEnt) throws common::VCIError;
-
- /**鎵归噺澧炲姞涓撲笟*/
- bool batchSaveSpecialties(data::SpecialtyInfoList specialties, common::data::UserEntityInfo userEnt) throws common::VCIError;
-
- /**淇敼涓撲笟**/
- bool updateSpecialty(data::SpecialtyInfo specialty, common::data::UserEntityInfo userEnt) throws common::VCIError;
-
- /**鎵归噺淇敼涓撲笟**/
- bool batchUpdateSpecialty(data::SpecialtyInfoList specialties, common::data::UserEntityInfo userEnt) throws common::VCIError;
-
- //鍒犻櫎涓撲笟
- bool deletSpecialty(common::data::StringArray ids, common::data::UserEntityInfo userEnt) throws common::VCIError;
-
- //=====================================================================================
- /**鏈哄櫒瀵嗙骇淇℃伅鎿嶄綔鎺ュ彛**/
- // 鑾峰彇鏈哄櫒瀵嗙骇淇℃伅鎬绘暟
- long getMachSecurityTolal() throws common::VCIError;
- // 鑾峰彇绗﹀悎鏉′欢鐨勬満鍣ㄥ瘑绾т俊鎭�绘暟
- long getMachSecurityTolalByCondition(string name, string ipAddress, short security) throws common::VCIError;
- // 鑾峰彇鎵�鏈夋満鍣ㄥ瘑绾т俊鎭�
- data::MachSecurityInfoList getAllMachSecurity() throws common::VCIError;
- // 鍒嗛〉鏌ヨ鑾峰彇鎵�鏈夋満鍣ㄥ瘑绾т俊鎭�
- data::MachSecurityInfoList fetchMachSecurityByPage(long pageNo, long pageSize)throws common::VCIError;
- // 鍒嗛〉鏌ヨ鑾峰彇鎵�鏈夋満鍣ㄥ瘑绾т俊鎭紝鎸夋潯浠�
- data::MachSecurityInfoList fetchMachSecurityConditionByPage(string name, string ipAddress, short security, long pageNo, long pageSize)throws common::VCIError;
- // 澧炲姞鏈哄櫒瀵嗙骇
- string saveMachSecurity(data::MachSecurityInfo info,common::data::UserEntityInfo userEnt) throws common::VCIError;
- /**鎵归噺澧炲姞鏈哄櫒瀵嗙骇*/
- bool batchSaveMachSecurity(data::MachSecurityInfoList infos, common::data::UserEntityInfo userEnt) throws common::VCIError;
- /**淇敼鏈哄櫒瀵嗙骇**/
- bool updateMachSecurity(data::MachSecurityInfo info, common::data::UserEntityInfo userEnt) throws common::VCIError;
- /**鎵归噺淇敼鏈哄櫒瀵嗙骇**/
- bool batchUpdateMachSecurity(data::MachSecurityInfoList infos, common::data::UserEntityInfo userEnt) throws common::VCIError;
- //鍒犻櫎鏈哄櫒瀵嗙骇
- bool deletMachSecurity(common::data::StringArray ids, common::data::UserEntityInfo userEnt) throws common::VCIError;
- //鑾峰彇鏈哄櫒瀵嗙骇, type=0 鏈娇鐢�
- long getMachSecurity(string ipAddress, short type, common::data::UserEntityInfo userEnt) throws common::VCIError;
- //鑾峰彇鏈哄櫒瀵嗙骇淇℃伅, type=0 鏈娇鐢�
- data::MachSecurityInfo getMachSecurityInfo(string ipAddress, short type, common::data::UserEntityInfo userEnt) throws common::VCIError;
-
- //=====================================================================================
- /**鏁版嵁鎺堟潈鎺ュ彛**/
- //淇濆瓨鏁版嵁鎺堟潈
- bool saveGrand(data::GrandValueArray values) throws common::VCIError;
- //鏌ヨ鏁版嵁鎺堟潈
- data::GrandValueArray queryGrand(string identifier) throws common::VCIError;
- //鍒犻櫎鏁版嵁鎺堟潈
- bool deleteGrand(string ruleName)throws common::VCIError;
- //鍒犻櫎绫诲瀷鏁版嵁鎺堟潈
- bool deleteTypeRuleGrand(string identifier,string ruleName)throws common::VCIError;
-
- // 妫�鏌ユ潈闄�
- string checkRight(data::CheckValue value) throws common::VCIError;
-
- //=====================================================================================
- /**鍗风鐞�**/
- /**璇诲彇鎵�鏈夌殑鍗�**/
- data::PvolumeInfoList getAllPvolumes() throws common::VCIError;
- // 鏌ヨ榛樿鍗�
- data::PvolumeInfo getDefaultVolume() throws common::VCIError;
- // 璇诲彇鎸囧畾鍚嶇О鐨勫嵎
- data::PvolumeInfo getVolumnByName(string volName) throws common::VCIError;
- /**鍒嗛〉璇诲彇鍗�**/
- data::PvolumeInfoList getPvolumesPage(short pageSize, short pageIndex) throws common::VCIError;
- /**鍗峰垱寤�**/
- string savePvolume(data::PvolumeInfo vol, common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鍗蜂慨鏀�**/
- bool updatePvolume(data::PvolumeInfo vol, common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**鍗峰垹闄�**/
- bool deletePvolume(common::data::StringArray ids, common::data::UserEntityInfo userEntity) throws common::VCIError;
- /**妫�鏌ヨ鍒犻櫎鐨勫嵎鏄惁涓洪閫夎矾寰�**/
- bool checkIsvalid(string id) throws common::VCIError;
- /**淇敼鍗凤紝灏嗙郴缁熶腑鐨勫叾浠栧嵎璁剧疆涓洪潪棣栭�� 0**/
- void updatePvolumeInvalid(common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //flag:nonsys鍒犻櫎闈炵郴缁熸ā鍧�
+ //flag:business鍒犻櫎涓氬姟妯″潡
+ bool deleteModules(string flag)throws common::VCIError;
+ common::data::StringArray getClientDeployJarPath() throws common::VCIError;
- }//end interface
- }//method
+ /** AppConfigCategory 瀵硅薄鎺ュ彛 **/
+ // 娣诲姞銆佷繚瀛� AppConfigCategory 瀵硅薄
+ string saveAppConfigCategory(data::AppConfigCategoryInfo info, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ // 淇敼銆佹洿鏂� AppConfigCategory 瀵硅薄
+ bool updateAppConfigCategory(data::AppConfigCategoryInfo info, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ // 鏍规嵁ID鍒犻櫎 AppConfigCategory 瀵硅薄锛堟壒閲忥級
+ bool deleteAppConfigCategory(common::data::StringArray ids, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ // 杩斿洖鍏ㄩ儴 AppConfigCategory 瀵硅薄
+ data::AppConfigCategoryInfoList getAppConfigCategorys(common::data::UserEntityInfo userEntity) throws common::VCIError;
+ // 鏍规嵁ID杩斿洖 AppConfigCategory 瀵硅薄
+ data::AppConfigCategoryInfo getAppConfigCategoryById(string id, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /** AppConfigDetail 瀵硅薄鎺ュ彛 **/
+ // 娣诲姞銆佷繚瀛� AppConfigDetail 瀵硅薄
+ string saveAppConfigDetail(data::AppConfigDetailInfo info, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ // 淇敼銆佹洿鏂� AppConfigDetail 瀵硅薄
+ bool updateAppConfigDetail(data::AppConfigDetailInfo info, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ // 鏍规嵁ID鍒犻櫎 AppConfigDetail 瀵硅薄锛堟壒閲忥級
+ bool deleteAppConfigDetail(common::data::StringArray ids, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ // 杩斿洖鍏ㄩ儴 AppConfigDetail 瀵硅薄
+ data::AppConfigDetailInfoList getAppConfigDetails(common::data::UserEntityInfo userEntity) throws common::VCIError;
+ // 杩斿洖鎸囧畾鍒嗙被鐨勫叏閮� AppConfigDetail 瀵硅薄
+ data::AppConfigDetailInfoList getAppConfigDetailsByCatId(string clsfId, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ data::AppConfigDetailInfoList getAppConfigDetailsByCategory(string catName, common::data::UserEntityInfo userEntity) throws common::VCIError;
+
+ // 鏍规嵁ID杩斿洖 AppConfigDetail 瀵硅薄
+ data::AppConfigDetailInfo getAppConfigDetailById(string id, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ // 鏍规嵁閰嶇疆Key杩斿洖 AppConfigDetail 瀵硅薄
+ data::AppConfigDetailInfo getAppConfigDetailByKey(string key, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ // 鏍规嵁閰嶇疆Key杩斿洖 AppConfigDetail 瀵硅薄
+ data::AppConfigDetailInfoList getAppConfigDetailsByName(string name, common::data::UserEntityInfo userEntity) throws common::VCIError;
+
+ /** 鏍规嵁key鑾峰彇conf.properties涓殑鍙傛暟鍊�
+ fileResourcePath锛氳祫婧愭枃浠惰矾寰�
+ 姣斿锛�/properties/conf.properties锛寈xx.properties 鏂囦欢鍦ㄩ」鐩富鐩綍鐨刾roperties鏂囦欢澶逛笅
+ 鎴栬�咃細properties/xxx.properties锛寈xx.properties 鏂囦欢鍦╯rc/properties/鏂囦欢澶逛笅
+ 濡傛灉浼犲叆绌哄�硷紝鍒欎粠 /properties/conf.properties 涓鍙�
+ key锛�
+ **/
+ string getConfigValue(string key) throws common::VCIError;
+
+ //寰楀埌涓�涓殢鍗崇殑36浣嶆暟
+ string getRandomGUID36() throws common::VCIError;
+
+ /***************************绯荤粺鍔熻兘妯″潡start**************************/
+ //淇濆瓨妯″潡
+ string saveModule(data::FunctionInfo function,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鏇存柊妯″潡
+ string updateModule(data::FunctionInfo function,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鍒犻櫎妯″潡
+ string deleteModule(string moduleId,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鑾峰彇鑷姩鐢熸垚鐨勭紪鍙�
+ //long getAutoModuleNo() throws common::VCIError;
+ //鑾峰彇瀛愮骇妯″潡
+ data::FunctionInfoList getModuleListByParentId(string parentId,bool isAll) throws common::VCIError;
+ data::FunctionInfoList getModuleListByParentIdForBS(string parentId,bool isAll) throws common::VCIError;
+ data::FunctionInfoList getModuleListByParentIdForCS(string parentId,bool isAll) throws common::VCIError;
+ //鑾峰彇鎵�鏈夊瓙绾фā鍧�
+ data::FunctionInfoList getChildrenFunctionsByParentId(string parentId,bool isAll) throws common::VCIError;
+ //鑾峰彇鐢ㄦ埛鏈夋潈闄愮殑瀛愮骇妯″潡鍒楄〃
+ data::FunctionInfoList getModuleListByRoleRight(string parentId,string userName) throws common::VCIError;
+ data::FunctionInfoList getModuleListByRoleRightForBS(string parentId,string userName) throws common::VCIError;
+ //鏍规嵁class鏌ヨ妯″潡瀵硅薄
+ data::FunctionInfo getModuleByClass(string classPath) throws common::VCIError;
+ //鏍规嵁funcOid鏌ヨ妯″潡瀵硅薄
+ data::FunctionInfo getFunctionObjectById(string funcOid) throws common::VCIError;
+ //鏍规嵁妯″潡鍚嶇О鏌ヨ妯″潡瀵硅薄
+ data::FunctionInfo getModuleByName(string moduleName) throws common::VCIError;
+ //妫�鏌ユā鍧椾笅鏄寕鎺ユā鍧楄繕鏄寕鎺ユ搷浣滐紝true涓烘寕鎺ユā鍧�
+ long checkChildObject(string moduleId) throws common::VCIError;
+ //淇濆瓨鎿嶄綔
+ string saveOperate(data::OperateInfo operate,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //淇敼鎿嶄綔
+ string updateOperate(data::OperateInfo operate,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鍒犻櫎鎿嶄綔
+ bool deleteOperate(string id,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鑾峰彇鍏ㄩ儴鎿嶄綔鍒楄〃锛堝弬鏁版ā鍧桰D涓嶄负绌虹殑鏃跺�欒幏鍙栭櫎璇ユā鍧椾笅鎿嶄綔涔嬪鐨勫叏閮ㄦ搷浣滐級
+ data::OperateInfoList getOperateTreeList(string moduleId) throws common::VCIError;
+ //妫�鏌ユ搷浣滄槸鍚﹁寮曠敤
+ long checkOperateIsReferenced(string operateId) throws common::VCIError;
+ //閫氳繃鏍囪瘑鑾峰彇鎿嶄綔
+ data::OperateInfo getOperateByIdentify(string identify) throws common::VCIError;
+ //閫氳繃鍚嶇О鑾峰彇鎿嶄綔
+ data::OperateInfo fetchOperateTypeByName(string name) throws common::VCIError;
+ //鑾峰彇妯″潡涓嬫寕鎺ョ殑鎿嶄綔瀵硅薄 onlyIsValid 鍙傛暟琛ㄧず鏄惁浠呬粎杩斿洖鏄敓鏁堢殑鎿嶄綔 true锛氭槸 false 锛氫笉鏄紙姝ゆ椂杩斿洖妯″潡涓嬪叏閮ㄧ殑鎿嶄綔锛屼粎鍦ㄥ畾涔夋ā鍧椾笅鐨勬搷浣滄椂闇�瑕佽繑鍥炲叏閮ㄧ殑鎿嶄綔锛屽叾瀹冩儏鍐甸渶瑕佸潎鍙渶瑕佽繑鍥炵敓鏁堢殑鎿嶄綔锛�
+ data::FuncOperationInfoList getFuncOperationByModule(string funcitonId,string operateId, bool onlyIsValid) throws common::VCIError;
+ //閫氳繃鎿嶄綔鏍囪瘑鍜屾ā鍧桰D鑾峰彇鎸傛帴鍏崇郴
+ data::FuncOperationInfo getFuncOperationByIdentify(string funcId,string identify) throws common::VCIError;
+ //淇濆瓨妯″潡涓嬬殑鎿嶄綔
+ bool saveFuncOperation(data::FuncOperationInfoList funcOperationInfos,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //淇敼妯″潡涓嬫搷浣滃埆鍚�
+ bool updateFuncOperation(string id, string alias, bool isSelected, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鍒犻櫎妯″潡涓嬬殑鎿嶄綔
+ bool deleteFuncOperation(data::FuncOperationInfo funcOperation,common::data::UserEntityInfo userEntity) throws common::VCIError;
+
+ //淇濆瓨瑙掕壊鏉冮檺,閫氳繃鐢ㄦ埛鍚嶅尯鍒嗘潈闄愮被鍨�
+ bool saveRoleRight(data::RoleRightInfoList roleRightInfos,string roleId,string userName,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //澧炲姞瑙掕壊鏉冮檺,閫氳繃鐢ㄦ埛鍚嶅尯鍒嗘潈闄愮被鍨�
+ bool addRoleRight(data::RoleRightInfoList roleRightInfos,string roleId,string userName,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鑾峰彇瑙掕壊鏉冮檺,閫氳繃鐢ㄦ埛鍚嶅尯鍒嗘潈闄愮被鍨�
+ data::RoleRightInfoList getRoleRightList(string roleId,string userName) throws common::VCIError;
+ //鏍规嵁鎺堟潈瑙掕壊鐨勭被鍨嬭幏鍙栨潈闄�
+ data::RoleRightInfoList getRoleRightListByType(common::data::StringArray rightType) throws common::VCIError;
+ //鍒犻櫎瑙掕壊鏉冮檺锛寃eidy@2018-10-12
+ bool removeRoleRight(data::RoleRightInfoList roleRightInfos,string roleId,string userName,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //娓呯┖瑙掕壊鏉冮檺锛寃eidy@2019-01-24
+ bool clearRoleRight(string roleId,string userName,common::data::UserEntityInfo userEntity, short functionType) throws common::VCIError;
+ //鑾峰彇鐢ㄦ埛瀵瑰綋鍓嶆ā鍧楃殑鏉冮檺鍊�
+ data::RoleRightInfoList getRoleRightByModule(string funcId,string userName) throws common::VCIError;
+ //鑾峰彇褰撳墠鐢ㄦ埛鐨勬潈闄�
+ data::RoleRightInfoList getRoleRightByUserName(string userName) throws common::VCIError;
+ //鑾峰彇褰撳墠鐢ㄦ埛鐨勫叿鏈夌殑鍔熻兘妯″潡鏉冮檺
+ data::RoleRightInfoList getFunctionRoleRightByUserName(string userName) throws common::VCIError;
+
+
+ /***************************绯荤粺鍔熻兘妯″潡end**************************/
+
+ /**鑾峰彇鎵�鏈夐儴闂�**/
+ data::DeptInfoList fetchDepartmentInfo() throws common::VCIError;
+
+ data::DeptInfoList fetchDeptByUserNames(common::data::StringArray userNames) throws common::VCIError;
+ /**鏍规嵁id鑾峰彇閮ㄩ棬**/
+ data::DeptInfo fetchDepartmentInfoById(string id) throws common::VCIError;
+ /**鏍规嵁浜哄憳id鑾峰彇閮ㄩ棬**/
+ data::DeptInfo fetchDeptByUserId(string userId) throws common::VCIError;
+ data::DeptInfo fetchDeptByDeptName(string deptName) throws common::VCIError;
+ data::DeptInfo fetchDeptByParentIdAndName(string parentId,string deptName) throws common::VCIError;
+ /**鑾峰彇椤剁骇閮ㄩ棬**/
+ data::DeptInfoList fetchDepartmentInfoRoot() throws common::VCIError;
+ /**鑾峰彇閮ㄩ棬涓嬬殑瀛愰儴闂�**/
+ data::DeptInfoList fetchDepartmentInfoByParentId(string prtoid) throws common::VCIError;
+ /**鏍规嵁id鑾峰彇閮ㄩ棬鍙婂叾瀛愰儴闂�**/
+ data::DeptInfoList fetchDepartmentInfosById(string id) throws common::VCIError;
+ data::DeptInfoList fetchDepartmentInfosBySonId(string id) throws common::VCIError;
+ //鏍规嵁閮ㄩ棬id鑾峰彇鐢ㄦ埛淇℃伅
+ data::UserInfoList getUserByDeptId(string deptId)throws common::VCIError;
+
+ /** 鏍规嵁ID杩斿洖瑙掕壊瀵硅薄**/
+ data::RoleInfo fetchRoleInfoById(string roleId) throws common::VCIError;
+ data::RoleInfo fetchRoleByName(string name) throws common::VCIError;
+ /**鑾峰彇鎵�鏈夌殑瑙掕壊**/
+ data::RoleInfoList fetchRoleInfo() throws common::VCIError;
+ /**鏍规嵁鐢ㄦ埛绫诲瀷鑾峰彇瑙掕壊**/
+ data::RoleInfoList fetchRoleInfoByType(short type) throws common::VCIError;
+ /**鏍规嵁瑙掕壊绫诲瀷鑾峰彇瑙掕壊**/
+ data::RoleInfoList fetchRoleInfoByRoleType(short type) throws common::VCIError;
+ /**閫佹璁惧瑙掕壊**/
+ data::RoleInfoList getRoleListByTypeForMeasure(short type) throws common::VCIError;
+ /**鏍规嵁鐢ㄦ埛ID鑾峰彇瑙掕壊**/
+ data::RoleInfoList fetchRoleInfoByUserId(string userId) throws common::VCIError;
+ /**鏍规嵁鐢ㄦ埛鍚嶈幏鍙栬鑹�**/
+ data::RoleInfoList fetchRoleInfoByUserName(string userName) throws common::VCIError;
+ /**鏍规嵁鐢ㄦ埛鍚嶈幏鍙栬鑹茬殑鍒嗛〉瀹炵幇**/
+ data::RoleInfoList fetchRoleInfoByUserNameAndPage(long pageNo,long pageSize,string userName) throws common::VCIError;
+ /**鏍规嵁姣旂敤鎴风被鍨嬩綆鐨勮鑹�**/
+ data::RoleInfoList fetchRoleInfoByUserType(string userName) throws common::VCIError;
+ /**鏍规嵁鐢ㄦ埛鍚嶈幏鍙栬鑹叉�绘暟**/
+ long getRoleTotalByUserName(string userName) throws common::VCIError;
+
+ /**鏍规嵁鍨嬪彿鑾峰彇璇ュ瀷鍙蜂笅鐨勫瀷鍙锋�诲笀**/
+ data::UserInfoList fetchUserInfoByModel(string model) throws common::VCIError;
+ /**鏍规嵁鍨嬪彿鑾峰彇璇ュ瀷鍙蜂笅鐨勫瀷鍙锋�诲笀**/
+ data::UserInfoList fetchUserInfoByModelId(string modelId) throws common::VCIError;
+ /**鑾峰彇鎵�鏈夌殑鎴愬憳**/
+ data::UserInfoList fetchUserInfo() throws common::VCIError;
+ /**鑾峰彇闄ゅ幓admin锛宒eveloper锛屼笁鍛樺鎵�鏈夌殑鏅�氭垚鍛�**/
+ data::UserInfoList fetchUserInfoWithOutSanYuan() throws common::VCIError;
+ /**鏍规嵁鏉′欢鏌ヨ鐢ㄦ埛**/
+ data::UserInfoList fetchUserInfoByCondition(string searchName ,string searchUserName ,string deptId,
+ string roleId, string userName,long pageNo,long pageSize ) throws common::VCIError;
+ //add by caill 2016.9.26
+ data::UserInfoList fetchUserInfoByConditionUnited(string searchName ,string searchUserName ,string deptId,
+ string roleId, string userName,long pageNo,long pageSize ) throws common::VCIError;
+ data::UserInfoList fetchNoramlUserInfoByConditionUnited(string searchName ,string searchUserName ,string deptId,
+ string roleId, string userName,long pageNo,long pageSize ) throws common::VCIError;
+ data::UserInfoList fetchNormalUserInfoByCondition(string searchName ,string searchUserName ,string deptId,
+ string roleId, string userName,long pageNo,long pageSize ) throws common::VCIError;
+ /**鏍规嵁鏉′欢鑾峰彇浜哄憳鎬绘暟**/
+ long getUserTotalByCondition(string searchName ,string searchUserName ,string deptId,
+ string roleId, string userName) throws common::VCIError;
+
+ long getNormalUserTotalByCondition(string searchName ,string searchUserName ,string deptId,
+ string roleId, string userName) throws common::VCIError;
+
+ /**鑾峰彇鎵�鏈夌殑鎴愬憳**/
+ data::UserInfoList fetchUserInfoByType(short type) throws common::VCIError;
+ /**鏍规嵁鐢ㄦ埛鍚嶈幏鍙栨垚鍛�**/
+ data::UserInfo fetchUserInfoByName(string userName) throws common::VCIError;
+ /**鏍规嵁鏂囦欢鏌淚d鍜屾垚鍛樼被鍨嬭幏鍙栨垚**/
+ data::UserInfoList fetchUserInfoByPvolumeId(string pvolumeId , short type) throws common::VCIError;
+ /**鏍规嵁瑙掕壊Id鍜屾垚鍛樼被鍨嬭幏鍙栨垚**/
+ data::UserInfoList fetchUserInfoByRoleId(string roleId , short type) throws common::VCIError;
+ data::UserInfoList fetchUsersByRoleId(string roleId) throws common::VCIError;
+ data::UserInfoList fetchUserInfoByDeptAndRole(common::data::StringArray deptIds , common::data::StringArray roleIds) throws common::VCIError;
+ /**鍒涘缓鏂囦欢鏌滃拰鐢ㄦ埛鐨勫叧**/
+ bool savePvolumeUser(string pvolumId , common::data::StringArray userIds ,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**鍒涘缓瑙掕壊鍜岀敤鎴风殑鍏崇郴**/
+ bool saveRight(string roleId , common::data::StringArray userIds ,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**鍒涘缓閮ㄩ棬鍜岀敤鎴风殑鍏崇郴**/
+ bool saveRighForDept(string deptId , common::data::StringArray userIds ,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**鍒涘缓瑙掕壊鍜岀敤鎴风殑鍏崇郴**/
+ bool saveRights(common::data::StringArray roleIds , common::data::StringArray userIds ,common::data::UserEntityInfo userEntity) throws common::VCIError;
+
+ /**鍒涘缓瑙掕壊鍜岀敤鎴风殑鍏崇郴**/
+ bool saveUserDept(common::data::StringArray userIds , string deptId ,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**澧炲姞閮ㄩ棬**/
+ string saveDepartment(data::DeptInfo dept,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**鎵归噺淇濆瓨**/
+ bool batchSaveDepart(data::DeptInfoList deptInfo,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**澧炲姞瑙掕壊**/
+ string saveRole(data::RoleInfo role,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**鐢ㄤ簬楠岃瘉瑙掕壊鏄惁琚紩鐢�**/
+ long checkRoleIsquotedCount(string id )throws common::VCIError;
+
+ data::UserInfoList selectUserByRoleId(string id) throws common::VCIError;
+ /**澧炲姞鎴愬憳**/
+ string saveUser(data::UserInfo user,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**鎵归噺澧炲姞鎴愬憳*/
+ bool batchSaveUsers(data::UserInfoList userInfos,common::data::StringArray2D deptAndUserRelation,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**淇敼閮ㄩ棬**/
+ bool updateDepartment(data::DeptInfo dept, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**淇敼瑙掕壊**/
+ bool updateRole(data::RoleInfo role, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**淇敼鎴愬憳**/
+ bool updateUser(data::UserInfo user, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**淇敼鎴愬憳**/
+ bool saveOrUpdateUser(data::UserInfo user, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**鏇存柊閮ㄩ棬鐨勭埗ID**/
+ bool updateDeptParentId(string id, string parentId, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**淇敼鐢ㄦ埛瀵嗙爜**/
+ string modifyUserPassword(string idUser, string oldPW, string newPW, common::data::UserEntityInfo userEntity) throws common::VCIError;
+
+
+ /**鍒犻櫎閮ㄩ棬**/
+ bool deleteDepartment(common::data::StringArray ids , common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**鍒犻櫎瑙掕壊**/
+ bool deleteRole(common::data::StringArray ids , common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**鍒犻櫎鎴愬憳**/
+ bool deleteUser(common::data::StringArray ids , common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**鍋滅敤/鍚敤**/
+ bool stopUsers(common::data::StringArray ids ,bool flag, common::data::UserEntityInfo userEntity) throws common::VCIError;
+
+ /**绯荤粺閰嶇疆妯″潡**/
+ //淇濆瓨鐗规畩瀛楃鍒嗙被
+ string saveSpecialCharClsf(data::SpecialCharClsfInfo specialCharClsf, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鍒犻櫎鐗规畩瀛楃鍒嗙被
+ bool deletSpecialCharClsf(common::data::StringArray ids, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鏇存柊鐗规畩瀛楃鍒嗙被
+ bool updateSpecialCharClsf(data::SpecialCharClsfInfo specialCharClsf, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鑾峰彇鐗规畩瀛楃鍒嗙被
+ data::SpecialCharClsfInfoList getSpecialCharClsfList(long pageNo,long pageSize) throws common::VCIError;
+ //鑾峰彇鐗规畩瀛楃鍒嗙被
+ data::SpecialCharClsfInfoList getAllSpecialCharClsfList() throws common::VCIError;
+
+ //鑾峰彇鐗规畩瀛楃鍒嗙被鎬绘暟
+ long getSpecialCharClsTotal()throws common::VCIError;
+ //鏍规嵁鍒嗙被鑾峰彇瀛楃
+ data::SpecialCharInfoList getBychar(string plscsfoId) throws common::VCIError;
+ //淇濆瓨鐗规畩瀛楃
+ string saveSpecialChar(data::SpecialCharInfoList specialCharInfos, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鍒犻櫎鐗规畩瀛楃
+ bool deletSpecialChar(common::data::StringArray ids, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鍒犻櫎PID鐗规畩瀛楃
+ bool deleteSpecialCharByParentId(string id, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鏇存柊鐗规畩瀛楃
+ bool updateSpecialChar(data::SpecialCharInfo specialChar, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鑾峰彇鐗规畩瀛楃
+ data::SpecialCharInfoList fetchSpecialChar(string classId) throws common::VCIError;
+
+ //鑾峰彇鎵�鏈夌殑瀵嗙爜绛栫暐
+ data::PasswordStrategyInfoList fetchAllPasswordStrategy()throws common::VCIError;
+ //鑾峰彇瀵嗙爜绛栫暐鐨勫垎椤靛鐞�
+ data::PasswordStrategyInfoList fetchAllPasswordStrategyByPage(long pageNo,long pageSize)throws common::VCIError;
+ //鑾峰彇瀵嗙爜绛栫暐鎬绘暟
+ long getPasswordStrategyTotal()throws common::VCIError;
+
+
+ //淇濆瓨瀵嗙爜绛栫暐
+ bool savePasswordStrategy(data::PasswordStrategyInfo info, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //淇敼瀵嗙爜绛栫暐
+ bool editPasswordStrategy(data::PasswordStrategyInfo info, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鍒犻櫎瀵嗙爜绛栫暐
+ bool deletePasswordStrategy(common::data::StringArray ids, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //楠岃瘉瀵嗙爜绛栫暐鏄惁琚紩鐢�
+ long checkPasswordStrategyIsquotedCount(string id)throws common::VCIError;
+ //鏍规嵁浜哄憳 鑾峰彇瀵嗙爜绛栫暐
+ data::PasswordStrategyInfo fetchPasswordStrategyByUserId(string userId)throws common::VCIError;
+
+ // 鏍规嵁鐢ㄦ埛妫�鏌ュ瘑鐮佹槸鍚︾鍚堝瘑鐮佺瓥鐣�
+ string checkPasswordStrategyByUserId(string userId, string password, common::data::UserEntityInfo userEnt) throws common::VCIError;
+
+ /**鍒涘缓瀵嗙爜绛栫暐鍜岀敤鎴风殑鍏崇郴**/
+ bool saveUserPasswordStrateg(common::data::StringArray userIds , string passwordStrategId ,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**鏍规嵁鐧诲綍鐢ㄦ埛鍚嶈幏鍙栫櫥褰曡处鎴蜂俊鎭�**/
+ data::UserLogonInfo fetchUserLogonObj(string userId) throws common::VCIError;
+ //鑾峰彇鏃堕棿
+ long getSystemTime() throws common::VCIError;
+ /**鏇存柊鐧诲綍淇℃伅**/
+ void updateLogonInfo(string userId,bool flag)throws common::VCIError;
+ //瑙i攣
+ void deblock(common::data::StringArray ids , common::data::UserEntityInfo userEntity) throws common::VCIError;
+
+ //閫氳繃ID鍙栧緱鎿嶄綔绫诲瀷淇℃伅
+ data::OperateInfo getOperatetById(string id) throws common::VCIError;
+
+ /**鑾峰彇鎵�鏈夌殑瀵嗙爜缁勫悎鏂瑰紡**/
+ data::CombinationInfoList fetchAllCombinations() throws common::VCIError;
+ /**鍒嗛〉鏌ヨ瀵嗙爜缁勫悎鏂瑰紡**/
+ data::CombinationInfoList fetchCombinationsToPage(long pageIndex, long pageSize) throws common::VCIError;
+
+ /**娣诲姞瀵嗙爜缁勫悎鏂瑰紡**/
+ string saveCombination(data::CombinationInfo combination ,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**淇敼瀵嗙爜缁勫悎鏂瑰紡**/
+ bool updateCombination(data::CombinationInfo combination ,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**鍒犻櫎瀵嗙爜缁勫悎鏂瑰紡**/
+ bool deleteCombination(common::data::StringArray ids , common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**閫氳繃鐖秈d 鑾峰彇缁勫悎鏂瑰紡鍙栧�艰寖鍥�**/
+ data::CombinationValueInfoList fetchCombinationValuesByParentId(string parentId) throws common::VCIError;
+ /**娣诲姞瀵嗙爜缁勫悎鏂瑰紡鍙栧�艰寖鍥�**/
+ string saveCombinationValue(data::CombinationValueInfoList combinationValues ,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**淇敼瀵嗙爜缁勫悎鏂瑰紡鍙栧�艰寖鍥�**/
+ bool updateCombinationValue(data::CombinationValueInfo combinationValue, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**鍒犻櫎瀵嗙爜缁勫悎鏂瑰紡鍙栧�艰寖鍥�**/
+ bool deletCombinationValues(common::data::StringArray ids , common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**鏍规嵁瀵嗙爜绛栫暐id 鑾峰彇鍏宠仈鐨勫瘑鐮佺粍鍚堟柟寮�**/
+ data::CombinationInfoList fetchCombinationsByPstId(string pstId) throws common::VCIError;
+ /**妫�楠屽瘑鐮佺粍鍚堟柟寮忔槸鍚﹁瀵嗙爜绛栫暐寮曠敤**/
+ long checkCombinationIsquotedCount(string combinationd )throws common::VCIError;
+
+ /**淇濆瓨涓夊憳鍜屾垚鍛�**/
+ bool saveSpecialRole(string roleId , common::data::StringArray userIds ,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //涓夊憳鐧诲綍鐨勬ā鍧椾俊鎭�
+ //data::SpecialRoleInfoList getSpecialRoleList() throws common::VCIError;
+ //鏌ヨ鎵�鏈夌殑瀛愯妭鐐� add by caill
+ common::data::StringArray2D checkLevel() throws common::VCIError;
+ //瀵煎叆鍔熻兘妯″潡绠$悊鏁版嵁 add by caill
+ bool importModules(data::FunctionInfoList functionInfos,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //淇濆瓨鎿嶄綔妯″潡鍏崇郴瀵硅薄 add by caill
+ string saveFunOper(data::FuncOperationInfo funcOperation) throws common::VCIError;
+ //add by caill
+ bool saveFuncOperation2(data::FuncOperationInfo funcOperation,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鍒ゆ柇绗竴绾ф湁娌℃湁閲嶅悕鐨勬ā鍧� add by caill
+ bool firstLevel(string plName) throws common::VCIError;
+ //瑕嗙洊閲嶅悕鐨勭涓�绾� add by caill
+ string changeFirstLevel(data::FunctionInfo function,string plName) throws common::VCIError;
+ //鍒ゆ柇绗簩绾ф湁娌℃湁閲嶅悕鐨勬ā鍧� add by caill
+ bool secondLevel(string plName,string fParentId) throws common::VCIError;
+ //瑕嗙洊閲嶅悕鐨勭浜岀骇 add by caill
+ string changeSecondLevel(data::FunctionInfo function,string plName,string fParentId) throws common::VCIError;
+ //鍒ゆ柇妯″潡涓槸鍚﹀凡缁忓瓨鍦ㄦ鎿嶄綔绫诲瀷 add by caill
+ bool selSameOper(string dataOperName,string plFuncOid) throws common::VCIError;
+ //瑕嗙洊鎿嶄綔绫诲瀷 add by caill
+ bool updateOperation(data::FuncOperationInfo funcOperation,common::data::UserEntityInfo userEntity,string dataOperName,string plFuncOid) throws common::VCIError;
+ //
+ common::data::StringArray2D getAllDatas(long size) throws common::VCIError;
+ //
+ long getAllOperitionsNum() throws common::VCIError;
+ //
+ common::data::StringArray2D getAllOperitions(long size) throws common::VCIError;
+ //
+ long getAllModelManagementNum() throws common::VCIError;
+ //add by caill 2016.1.19鎵归噺澧炲姞瑙掕壊*/
+ bool batchSaveRoles(data::RoleInfoList roles,common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //淇濆瓨涓�鑸搷浣滅被鍨嬫棩蹇�
+ void savelogGeneralOperation(string result, string content, common::data::UserEntityInfo userEntity,string dataId,string plType) throws common::VCIError;
+ //鑾峰彇鏁版嵁搴撲俊鎭�
+ data::DataSourceInfo getDataSourceInfo() throws common::VCIError;
+
+ //add by weidy 2021-1-2 鎶婅阿鍐涙坊鍔犵殑瑙掕壊閫夋嫨绛夋帴鍙f暣鍚堣繘鏉�
+ /**鏍规嵁id鑾峰彇閮ㄩ棬**/
+ data::DeptInfoList fetchDepartmentInfoByIds(string otherFiterString) throws common::VCIError;
+ /****鏍规嵁鏌ヨ鏉′欢鑾峰彇涓嬬骇閮ㄩ棬***/
+ data::DeptInfoList fetchChildrenDeptByParentOid(string prtoid,bool iscontains, string otherFiterString) throws common::VCIError;
+ /***鑾峰彇閮ㄩ棬鍒楄〃淇℃伅****/
+ data::DeptInfoList gridDeptDataGrids(string filter,long pageNo,long pageSize)throws common::VCIError;
+
+ long gridDeptDataGridsCount(string filter)throws common::VCIError;
+
+ data::RoleInfoList queryRoleInfos(string filter,long pageNo,long pageSize)throws common::VCIError;
+
+ long queryRoleInfosCount(string filter)throws common::VCIError;
+
+ /****鏍规嵁鏉′欢鏌ヨ闄ゅ幓admin锛宒eveloper锛屼笁鍛樺鎵�鏈夌殑鏅�氭垚鍛�**/
+ data::UserInfoList fetchUserInfoByFilterString( string filterString,long pageNo,long pageSize ) throws common::VCIError;
+
+ long fetchUserInfoByFilterStringCount( string filterString) throws common::VCIError;
+
+ /****鏍规嵁鏉′欢鏌ヨ闄ゅ幓admin锛宒eveloper锛屼笁鍛樺鎵�鏈夌殑鏅�氭垚鍛�**/
+ data::UserInfoList fetchUserInfosByFilterStringsql( string filterString) throws common::VCIError;
+
+ /**鏍规嵁鐢ㄦ埛鍚嶆壒閲忚幏鍙栨垚鍛�**/
+ data::UserInfoList fetchUserInfoByNames(common::data::StringArray userNames) throws common::VCIError;
+
+ /**鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鎴愬憳**/
+ data::UserInfo getUserObjectByoid(string userOid) throws common::VCIError;
+
+ /**鏍规嵁鐢ㄦ埛涓婚敭鎵归噺鑾峰彇鎴愬憳**/
+ data::UserInfoList getUserObjectByoids(common::data::StringArray userOid) throws common::VCIError;
+
+ //=====================================================================================
+ /**涓撲笟淇℃伅鎿嶄綔鎺ュ彛**/
+ // 鑾峰彇鎵�鏈変笓涓氫俊鎭�
+ data::SpecialtyInfoList getAllSpecialtyInfo() throws common::VCIError;
+
+ // 澧炲姞涓撲笟
+ string saveSpecialty(data::SpecialtyInfo specialty,common::data::UserEntityInfo userEnt) throws common::VCIError;
+
+ /**鎵归噺澧炲姞涓撲笟*/
+ bool batchSaveSpecialties(data::SpecialtyInfoList specialties, common::data::UserEntityInfo userEnt) throws common::VCIError;
+
+ /**淇敼涓撲笟**/
+ bool updateSpecialty(data::SpecialtyInfo specialty, common::data::UserEntityInfo userEnt) throws common::VCIError;
+
+ /**鎵归噺淇敼涓撲笟**/
+ bool batchUpdateSpecialty(data::SpecialtyInfoList specialties, common::data::UserEntityInfo userEnt) throws common::VCIError;
+
+ //鍒犻櫎涓撲笟
+ bool deletSpecialty(common::data::StringArray ids, common::data::UserEntityInfo userEnt) throws common::VCIError;
+
+ //=====================================================================================
+ /**鏈哄櫒瀵嗙骇淇℃伅鎿嶄綔鎺ュ彛**/
+ // 鑾峰彇鏈哄櫒瀵嗙骇淇℃伅鎬绘暟
+ long getMachSecurityTolal() throws common::VCIError;
+ // 鑾峰彇绗﹀悎鏉′欢鐨勬満鍣ㄥ瘑绾т俊鎭�绘暟
+ long getMachSecurityTolalByCondition(string name, string ipAddress, short security) throws common::VCIError;
+ // 鑾峰彇鎵�鏈夋満鍣ㄥ瘑绾т俊鎭�
+ data::MachSecurityInfoList getAllMachSecurity() throws common::VCIError;
+ // 鍒嗛〉鏌ヨ鑾峰彇鎵�鏈夋満鍣ㄥ瘑绾т俊鎭�
+ data::MachSecurityInfoList fetchMachSecurityByPage(long pageNo, long pageSize)throws common::VCIError;
+ // 鍒嗛〉鏌ヨ鑾峰彇鎵�鏈夋満鍣ㄥ瘑绾т俊鎭紝鎸夋潯浠�
+ data::MachSecurityInfoList fetchMachSecurityConditionByPage(string name, string ipAddress, short security, long pageNo, long pageSize)throws common::VCIError;
+ // 澧炲姞鏈哄櫒瀵嗙骇
+ string saveMachSecurity(data::MachSecurityInfo info,common::data::UserEntityInfo userEnt) throws common::VCIError;
+ /**鎵归噺澧炲姞鏈哄櫒瀵嗙骇*/
+ bool batchSaveMachSecurity(data::MachSecurityInfoList infos, common::data::UserEntityInfo userEnt) throws common::VCIError;
+ /**淇敼鏈哄櫒瀵嗙骇**/
+ bool updateMachSecurity(data::MachSecurityInfo info, common::data::UserEntityInfo userEnt) throws common::VCIError;
+ /**鎵归噺淇敼鏈哄櫒瀵嗙骇**/
+ bool batchUpdateMachSecurity(data::MachSecurityInfoList infos, common::data::UserEntityInfo userEnt) throws common::VCIError;
+ //鍒犻櫎鏈哄櫒瀵嗙骇
+ bool deletMachSecurity(common::data::StringArray ids, common::data::UserEntityInfo userEnt) throws common::VCIError;
+ //鑾峰彇鏈哄櫒瀵嗙骇, type=0 鏈娇鐢�
+ long getMachSecurity(string ipAddress, short type, common::data::UserEntityInfo userEnt) throws common::VCIError;
+ //鑾峰彇鏈哄櫒瀵嗙骇淇℃伅, type=0 鏈娇鐢�
+ data::MachSecurityInfo getMachSecurityInfo(string ipAddress, short type, common::data::UserEntityInfo userEnt) throws common::VCIError;
+
+ //=====================================================================================
+ /**鏁版嵁鎺堟潈鎺ュ彛**/
+ //淇濆瓨鏁版嵁鎺堟潈
+ bool saveGrand(data::GrandValueArray values) throws common::VCIError;
+ //鏌ヨ鏁版嵁鎺堟潈
+ data::GrandValueArray queryGrand(string identifier) throws common::VCIError;
+ //鍒犻櫎鏁版嵁鎺堟潈
+ bool deleteGrand(string ruleName)throws common::VCIError;
+ //鍒犻櫎绫诲瀷鏁版嵁鎺堟潈
+ bool deleteTypeRuleGrand(string identifier,string ruleName)throws common::VCIError;
+
+ // 妫�鏌ユ潈闄�
+ string checkRight(data::CheckValue value) throws common::VCIError;
+
+ //=====================================================================================
+ /**鍗风鐞�**/
+ /**璇诲彇鎵�鏈夌殑鍗�**/
+ data::PvolumeInfoList getAllPvolumes() throws common::VCIError;
+ // 鏌ヨ榛樿鍗�
+ data::PvolumeInfo getDefaultVolume() throws common::VCIError;
+ // 璇诲彇鎸囧畾鍚嶇О鐨勫嵎
+ data::PvolumeInfo getVolumnByName(string volName) throws common::VCIError;
+ /**鍒嗛〉璇诲彇鍗�**/
+ data::PvolumeInfoList getPvolumesPage(short pageSize, short pageIndex) throws common::VCIError;
+ /**鍗峰垱寤�**/
+ string savePvolume(data::PvolumeInfo vol, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**鍗蜂慨鏀�**/
+ bool updatePvolume(data::PvolumeInfo vol, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**鍗峰垹闄�**/
+ bool deletePvolume(common::data::StringArray ids, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ /**妫�鏌ヨ鍒犻櫎鐨勫嵎鏄惁涓洪閫夎矾寰�**/
+ bool checkIsvalid(string id) throws common::VCIError;
+ /**淇敼鍗凤紝灏嗙郴缁熶腑鐨勫叾浠栧嵎璁剧疆涓洪潪棣栭�� 0**/
+ void updatePvolumeInvalid(common::data::UserEntityInfo userEntity) throws common::VCIError;
+
+ }//end interface
}//framework
// }}}
diff --git a/Source/Common/PLTSlice/slice/04-workflow.ice b/Source/Common/PLTSlice/slice/04-workflow.ice
index 23ba444..4b13be1 100644
--- a/Source/Common/PLTSlice/slice/04-workflow.ice
+++ b/Source/Common/PLTSlice/slice/04-workflow.ice
@@ -263,303 +263,303 @@
};
- module method {
- interface WorkflowService {
- // 娴佺▼鍒嗙被鐨勫銆佸垹銆佹敼銆佹煡
- data::ProcessCategoryInfoList getProcessCategories(string parentId) throws common::VCIError;
- data::ProcessCategoryInfoList getProcessCategoriesByPage(string parentId,long pageSize,long pageIndex ) throws common::VCIError;
- string saveProcessCategory(data::ProcessCategoryInfo category, common::data::UserEntityInfo userEnt) throws common::VCIError;
- bool updateProcessCategory(data::ProcessCategoryInfo category, common::data::UserEntityInfo userEnt) throws common::VCIError;
- bool deleteProcessCategory(string id, common::data::UserEntityInfo userEnt) throws common::VCIError;
- bool existProcessCategory(string id, string name) throws common::VCIError;
- bool deployProcess(common::data::bytes jbpmImage, string jbpmXml, string graphXml, string processCategoryId, data::ProcessTaskInfoList processTaskInfos, common::data::UserEntityInfo userEnt) throws common::VCIError;
- bool deleteProcessDefinition(string deployId, string pdId, common::data::UserEntityInfo userEnt) throws common::VCIError;
- bool updateProcess(common::data::bytes jbpmImage, string jbpmXml, string graphXml, string processCategoryId, data::ProcessTaskInfoList processTaskInfos, common::data::UserEntityInfo userEnt,string deployId) throws common::VCIError;
-
- // 鏍规嵁娴佺▼妯℃澘閮ㄧ讲ID杩斿洖娴佺▼妯℃澘瀵硅薄
- data::ProcessDefinitionInfo getProcessDefinitionByDeployId(string deployId) throws common::VCIError;
- data::ProcessDefinitionInfoList getProcessDefinitions(string processCategoryId) throws common::VCIError;
- data::ProcessDefinitionInfoList getAllProcessDefinitions() throws common::VCIError;
-
- //缂栫爜涓撶敤
- data::ProcessDefinitionInfoList getProcessDefinitionsForRMCode(string processCategoryId) throws common::VCIError;
- data::ProcessDefinitionInfoList getProcessDefinitionsByPage(string processCategoryId,string name,long pageSize,long pageIndex) throws common::VCIError;
- data::ProcessDefinitionInfoList getProcessDefinitionByProcessDefinitionName(string processCategoryName,string processCategoryId) throws common::VCIError;
- common::data::bytes getProcessResource(string jbpmDeploymentId, string resourceType) throws common::VCIError;
-
- data::ProcessDefinitionInfoList getProcessDefinition(string rmTemplateId, string processType) throws common::VCIError;
- data::ProcessDefinitionInfoList getProcessDefinitionByType(string processType) throws common::VCIError;
- //鑾峰彇娴佺▼瀹氫箟鍒楄〃
- data::ProcessDefinitionInfoList getProcessDefinitionAll() throws common::VCIError;
-
- void saveRMTemplateProcess(string rmTemplateId, common::data::StringArray processTypes, common::data::StringArray jbpmDeployIds, common::data::UserEntityInfo userEnt) throws common::VCIError;
- bool deleteRMTemplateProcess(string rmTemplateId, common::data::UserEntityInfo userEnt) throws common::VCIError;
-
- bool startProcessInstanceByKey(string processDefinitionKey, data::FlowInstanceInfo flowInstance,common::data::StringArray objId,common::data::UserEntityInfo userEnt,common::data::StringArray userName,string outcome) throws common::VCIError;
-
- //鍚姩娴佺▼锛屽垱寤烘祦绋嬪疄渚�
- string startPocessSetUser(string processDefinitionKey, data::FlowInstanceInfo flowInstance,common::data::StringArray objId,common::data::UserEntityInfo userEnt,common::data::StringArray userName,string outcome,common::data::StringArray tasknames,common::data::StringArray2D taskUserNames) throws common::VCIError;
- string startPocessSetUserForVar(string processDefinitionKey, data::FlowInstanceInfo flowInstance,common::data::StringArray objId,common::data::UserEntityInfo userEnt,common::data::StringArray userName,string outcome,common::data::StringArray tasknames,common::data::StringArray2D taskUserNames,common::data::StringArray keys ,common::data::StringArray values) throws common::VCIError;
-
- string startPocessByPLM(string processDefinitionKey, data::FlowInstanceInfo flowInstance,common::data::StringArray objId,common::data::UserEntityInfo userEnt,common::data::StringArray userName,string outcome,common::data::StringArray tasknames,common::data::StringArray2D taskUserNames,data::MapTransfersInfoList mapTransfersInfos) throws common::VCIError;
-
- //娣诲姞鏂板惎鍔ㄦ祦绋嬫帴鍙o紝鏂板鍙傛暟锛氬璞″睘鎬ф暟缁勶紝瀵硅薄灞炴�у搴旂殑鍊间簩缁存暟缁�
- string startPocessByPLMv1(string processDefinitionKey, data::FlowInstanceInfo flowInstance,common::data::StringArray objId,common::data::UserEntityInfo userEnt,common::data::StringArray userName,string outcome,common::data::StringArray tasknames,common::data::StringArray2D taskUserNames,data::MapTransfersInfoList mapTransfersInfos,common::data::StringArray objectProperty,common::data::StringArray2D objectPropertyValues) throws common::VCIError;
-
- //娣诲姞鏂板惎鍔ㄦ祦绋嬫帴鍙o紝鍚姩娴佺▼骞朵笖鎵ц绗竴涓换鍔¤妭鐐�
- string startProcessAndExecuteFirstNode(string processDefinitionKey, data::FlowInstanceInfo flowInstance,common::data::StringArray objId,common::data::UserEntityInfo userEnt,common::data::StringArray userName,string outcome,common::data::StringArray tasknames,common::data::StringArray2D taskUserNames,data::MapTransfersInfoList mapTransfersInfos,common::data::StringArray objectProperty,common::data::StringArray2D objectPropertyValues) throws common::VCIError;
-
- //bool startProcessInstanceByKeyForWuyuan(string processDefinitionKey, data::FlowInstanceInfo flowInstance,common::data::StringArray objId,common::data::UserEntityInfo userEnt,common::data::StringArray userName,string outcome) throws common::VCIError;
- //鏌ヨ寰呭姙浠诲姟鐨勬�绘潯鏁�
- long queryTodoTaskCount(string pluser,string expandSql,common::data::UserEntityInfo userEnt) throws common::VCIError;
- data::FlowTaskInfoList getTodoTaskByUserId(string pluseroid,long first,long pageSize,string taskType,string sql,common::data::UserEntityInfo userEnt)throws common::VCIError;
- data::FlowTaskInfoList getTodoTaskCompositorByUserId(string pluseroid,long first,long pageSize,string taskType,string sql,string orderStr,common::data::UserEntityInfo userEnt)throws common::VCIError;
- //缂栫爜璧勬簮涓撶敤-鏌ヨ璺熻釜浠诲姟
- long queryTraceTaskCount(string pluser,string expandSql,common::data::UserEntityInfo userEnt) throws common::VCIError;
- data::FlowTaskInfoList getTrackTaskByUserId(string pluseroid,long first,long pageSize,string taskType,string querySQL,common::data::UserEntityInfo userEnt)throws common::VCIError;
- //缂栫爜璧勬簮涓撶敤-鏌ヨ宸插姙浠诲姟
- data::FlowTaskInfoList getDoneTaskByUserId(string pluseroid,long first,long pagesize,string taskType,string querySQL,common::data::UserEntityInfo userEnt)throws common::VCIError;
- data::FlowTaskInfoList getDoneTaskCompositorByUserId(string pluseroid,long first,long pagesize,string taskType,string querySQL,string orderStr,common::data::UserEntityInfo userEnt)throws common::VCIError;
- long queryDoneTaskCount(string pluser,string expandSql,common::data::UserEntityInfo userEnt) throws common::VCIError;
-
-
- //鏌ヨ鎶勯�佷汉淇℃伅鎬绘暟
- long queryCCTaskCount(string pluser,common::data::UserEntityInfo userEnt) throws common::VCIError;
- //鎶勯�佷汉淇℃伅鍒楄〃
- data::FlowTaskInfoList getCCTaskByUserId(string pluseroid,long first,long pageSize,common::data::UserEntityInfo userEnt)throws common::VCIError;
-
- //鏌ヨ璺熻釜浠诲姟鐨勬�绘潯鏁�
- //long queryTraceTaskCount(string pluser,common::data::UserEntityInfo userEnt,string expandSql) throws common::VCIError;
- long queryMyTraceProcessCount(string pluser,common::data::UserEntityInfo userEnt,string expandSql) throws common::VCIError;
- //data::FlowTaskInfoList getTrackTaskByUserId(string pluseroid,long first,long pageSize,common::data::UserEntityInfo userEnt,string expandSql)throws common::VCIError;
- data::FlowTaskInfoList getMyTrackProcessByUserId(string pluseroid,long first,long pageSize,common::data::UserEntityInfo userEnt,string expandSql)throws common::VCIError;
- data::FlowTaskInfoList getMyTrackProcessCompositorByUserId(string pluseroid,long first,long pageSize,common::data::UserEntityInfo userEnt,string expandSql, string orderStr)throws common::VCIError;
-
- //鏍规嵁鏁版嵁鏌ヨ娴佺▼瀹炰緥
- data::FlowTaskInfoList getFlowTaskInfoByDataId(string dataId, string tableName)throws common::VCIError;
-
- bool completeTask(string taskId, string outcome, string nextTask,string approvalNote,common::data::UserEntityInfo userEnt,common::data::StringArray userName)throws common::VCIError;
- bool completeTaskForVar(string taskId, string outcome, string nextTask,string approvalNote,common::data::UserEntityInfo userEnt,common::data::StringArray userName,common::data::StringArray keys ,common::data::StringArray values)throws common::VCIError;
- bool completeTaskByPlatform(string taskId, string outcome, string nextTask,string approvalNote,common::data::UserEntityInfo userEnt,common::data::StringArray userName)throws common::VCIError;
- //鏂板瀹屾垚鎺ュ彛,1.澧炲姞瀵硅薄灞炴�ф暟缁勶紝2.瀵硅薄灞炴�у拰灞炴�у�间簩缁存暟缁�
- bool completeTaskByPlatformv1(string taskId, string outcome, string nextTask,string approvalNote,common::data::UserEntityInfo userEnt,common::data::StringArray userName,common::data::StringArray objectProperty,common::data::StringArray2D objectPropertyValues)throws common::VCIError;
- //鎵归噺鎵ц娴佺▼浠诲姟--鏉′欢鏄悓涓�妯℃澘鍚屼竴浠诲姟鑺傜偣
- bool completeTasksByPlatformv1(common::data::StringArray taskId, string outcome, string nextTask,string approvalNote,common::data::UserEntityInfo userEnt,common::data::StringArray userName,common::data::StringArray objectProperty,common::data::StringArray2D objectPropertyValues)throws common::VCIError;
- //璧勬簮缂栫爜鐢ㄧ殑浠诲姟鎻愪氦浜嬩欢
- //void completeTask(string taskId, string outcome,string approvalNote,common::data::StringArray userName,common::data::UserEntityInfo userEnt)throws common::VCIError;
- data::ProcessTaskInfo findTaskPropertyById(string jbpmDeploymentId, string name)throws common::VCIError;
- data::ProcessTaskInfo findTaskPropertyByProcessId(string jbpmDeploymentId)throws common::VCIError;
-
- data::FlowApproveHistoryInfoList getHistoryActivityByProInsId(string processInstanceId)throws common::VCIError;
- data::FlowApproveHistoryInfoList getHistoryActivityByProInsIdbyPLM(string processInstanceId)throws common::VCIError;
-
- common::data::bytes getExecutionImageByExecutionId(string executionId, string taskName)throws common::VCIError;
- common::data::bytes getExecutionImage(string executionId)throws common::VCIError;
-
- data::FlowObjectInfoList getFlowObjectByExecutionId(string executionId)throws common::VCIError;
-
- string getDeploymentIdByExecutionId(string executionId)throws common::VCIError;
-
- data::FlowInstanceInfoList getFlowInstances(string applicant) throws common::VCIError;
- data::FlowInstanceInfoList getFlowInstancesname(string name) throws common::VCIError;
- string saveFlowInstance(data::FlowInstanceInfo flowInstance, common::data::UserEntityInfo userEnt) throws common::VCIError;
-
- void endProcessInstance(string processInstanceId,common::data::UserEntityInfo userEnt)throws common::VCIError;
- void endProcessInstanceByplatform(string processInstanceId,common::data::UserEntityInfo userEnt)throws common::VCIError;
- data::FlowInstanceInfo getFlowInstanceInfo(string executionId)throws common::VCIError;
-
- // 杩斿洖浠昏妭鐐逛笂瀹氫箟鐨勫�欓�変汉瀛楃涓插唴瀹�
- string getNextCandidatesDefineString(string jbpmDeploymentId, string taskName, string outcome)throws common::VCIError;
- //鑾峰彇涓嬩竴浠诲姟鍊欓�変汉
- common::data::StringArray getNextCandidates(string jbpmDeploymentId, string taskName, string outcome)throws common::VCIError;
- common::data::StringArray nextTaskCandidateUsers(string excutionId, string taskName)throws common::VCIError;
- //鑾峰彇涓嬩竴浠诲姟
- common::data::StringArray getNextTaskNames(string jbpmDeploymentId, string taskName, string outcome)throws common::VCIError;
- //鑾峰彇褰撳墠浠诲姟鍊欓�変汉
- common::data::StringArray getCurCandidates(string jbpmDeploymentId, string taskName, string outcome, string executionId)throws common::VCIError;
- common::data::StringArray getAllCandidatesForTask(string jbpmDeploymentId, string taskName, string outcome)throws common::VCIError;
- //濮旀墭浜�
- common::data::StringArray getCurConstituents(string jbpmDeploymentId, string taskName, string outcome)throws common::VCIError;
- //鑾峰彇娴佸悜
- common::data::StringArray getTrainName(string jbpmDeploymentId, string taskName, string outcome)throws common::VCIError;
-
- common::data::bytes getFlowImageByDeployID(string deployID)throws common::VCIError;
- string getDepolymentID(string executionId)throws common::VCIError;
- //data::FlowTaskInfoList getDoneTaskByUserId(string pluseroid,long first,long pagesize,common::data::UserEntityInfo userEnt,string expandSql)throws common::VCIError;
- //long queryDoneTaskCount(string pluser,common::data::UserEntityInfo userEnt,string expandSql) throws common::VCIError;
- //娴佺▼鐩戞帶閮ㄥ垎
- data::FlowTaskInfoList getProcessControlByUserId(string pluseroid,long first,long pagesize,string taskType,string querySQL,common::data::UserEntityInfo userEnt)throws common::VCIError;
- long queryProcessControlCount(string pluser,string taskType,common::data::UserEntityInfo userEnt) throws common::VCIError;
-
- //瀹屾垚娴佺▼
- data::FlowTaskInfoList getDoneProcessByUserId(string pluseroid,long first,long pagesize,string taskType,string querySQL,common::data::UserEntityInfo userEnt)throws common::VCIError;
- long queryDoneProcessCount(string pluser,string taskType,common::data::UserEntityInfo userEnt) throws common::VCIError;
-
- string getTaskPhaseName(string processDefinitionKey,string jbpmdeploymentid, data::FlowInstanceInfo flowInstance,common::data::UserEntityInfo userEnt) throws common::VCIError;
- common::data::StringArray getDeployId(string taskId) throws common::VCIError;
- //鍒ゆ柇key鏄惁閲嶅
- bool checkKey(string name,string keyValue) throws common::VCIError;
-
- // 杩斿洖娴佺▼妯℃澘鐨勭涓�涓换鍔″璞�
- data::ProcessTaskInfo getFirstProcessTask(string jbpmDeploymentId) throws common::VCIError;
- data::ProcessTaskInfo getFirstProcessTaskByExecId(string execId) throws common::VCIError;
- //鑾峰彇娴佺▼涓嬩竴鑺傜偣鏄惁鏄痚nd鑺傜偣
- bool getProcessTaskByTaskName(string taskId,string taskName,string outcome) throws common::VCIError;
- //鏌ヨ鎵�鏈夌殑鍚屾剰浠诲姟浠诲姟鑺傜偣鏁版嵁
- string getAllNoAgreeProcessTaskByTaskName(string taskId,string taskName,string outcome) throws common::VCIError;
- //娴佺▼妯℃澘闅愯棌鑺傜偣
- bool setNodeHide(string deploymentId) throws common::VCIError;
- data::NodeHideInfoList getNodeHideDeploymentId() throws common::VCIError;
- bool deleteHideFlow(string deployId)throws common::VCIError;
- //鏍规嵁鏉′欢鏌ヨ鎸囧畾娴佺▼
- data::FlowTaskInfoList getTaskByCondition(common::data::StringArray values,long first,long pagesize,string objectId,common::data::UserEntityInfo userEnt)throws common::VCIError;
- long queryFlowTaskCount(common::data::StringArray values,string objectId,bool flag ,common::data::UserEntityInfo userEnt) throws common::VCIError;
- //鑾峰彇娴佺▼涓嬩竴浠诲姟鍚嶇О
- string getNextTaskNameByJbpmId(string jbpmDeploymentId,string taskname,string outcome)throws common::VCIError;
- //鑾峰彇娴佺▼涓嬩竴浠诲姟绫诲瀷
- string getNextTaskTypeByJbpmId(string jbpmDeploymentId,string taskname,string outcome)throws common::VCIError;
- //鑾峰彇娴佺▼鍙戣捣浜�
- string getProcessStartUser(string execId)throws common::VCIError;
- //鑾峰彇浠诲姟ID
- string getProcessTaskId(string execId)throws common::VCIError;
+ interface WorkflowService {
+ void test();
- bool setPocessHide(string jbpmdeplotmentId, short status,common::data::UserEntityInfo userEnt) throws common::VCIError;
- //鑾峰彇浠诲姟鎻忚堪淇℃伅
- data::TaskDescInfoList getTaskDescList(string deploymentId,string taskName) throws common::VCIError;
- data::FlowTaskInfoList getTodoTaskByUser(string pluseroid,long first,long pageSize,common::data::UserEntityInfo userEnt)throws common::VCIError;
- common::data::StringArray getNextTask(string executionId, string taskName, string outcome)throws common::VCIError;
- common::data::StringArray getUserNames(string executionId, string taskName, string outcome)throws common::VCIError;
-
- //鑾峰彇绛栫暐鍒楄〃
- data::TaskRevokeInfoList getTaskRevokeList(string deploymentId,string taskName) throws common::VCIError;
- bool saveOrUpdateTasksAssigned(data::TasksAssignedInfo taskAssigned,common::data::UserEntityInfo userEnt) throws common::VCIError;
- //鑾峰彇浠g悊浜哄璞�
- data::TasksAssignedInfo getTasksAssignedByUserName(string userName , common::data::UserEntityInfo userEnt) throws common::VCIError;
- //
- data::TasksAssignedInfoList getAllTasksAssignedByUserName(string userName , common::data::UserEntityInfo userEnt) throws common::VCIError;
- //鍒犻櫎浠g悊浜�
- bool deleteTasksAssignedByUserName(common::data::StringArray userName, common::data::UserEntityInfo userEnt) throws common::VCIError;
- // 鏍规嵁ID鏁扮粍鍒犻櫎濮旀墭
- bool deleteTasksAssignedByIds(common::data::StringArray ids, common::data::UserEntityInfo userEnt) throws common::VCIError;
- //璁剧疆浠诲姟鍊欓�変汉
- void setParticipation(string nextTaskId,common::data::StringArray userNames)throws common::VCIError;
-
- //鑾峰彇涓嬩釜浠诲姟鐨勫鏈夌敤鎴峰寘鍚嚜瀹氫箟鐢ㄦ埛
- common::data::StringArray getAllUserListForTask(string taskName,string deploymentId,string outcome,common::data::StringArray varkey,common::data::StringArray varValue)throws common::VCIError;
+ // 娴佺▼鍒嗙被鐨勫銆佸垹銆佹敼銆佹煡
+ data::ProcessCategoryInfoList getProcessCategories(string parentId) throws common::VCIError;
+ data::ProcessCategoryInfoList getProcessCategoriesByPage(string parentId,long pageSize,long pageIndex ) throws common::VCIError;
+ string saveProcessCategory(data::ProcessCategoryInfo category, common::data::UserEntityInfo userEnt) throws common::VCIError;
+ bool updateProcessCategory(data::ProcessCategoryInfo category, common::data::UserEntityInfo userEnt) throws common::VCIError;
+ bool deleteProcessCategory(string id, common::data::UserEntityInfo userEnt) throws common::VCIError;
+ bool existProcessCategory(string id, string name) throws common::VCIError;
+ bool deployProcess(common::data::bytes jbpmImage, string jbpmXml, string graphXml, string processCategoryId, data::ProcessTaskInfoList processTaskInfos, common::data::UserEntityInfo userEnt) throws common::VCIError;
+ bool deleteProcessDefinition(string deployId, string pdId, common::data::UserEntityInfo userEnt) throws common::VCIError;
+ bool updateProcess(common::data::bytes jbpmImage, string jbpmXml, string graphXml, string processCategoryId, data::ProcessTaskInfoList processTaskInfos, common::data::UserEntityInfo userEnt,string deployId) throws common::VCIError;
+
+ // 鏍规嵁娴佺▼妯℃澘閮ㄧ讲ID杩斿洖娴佺▼妯℃澘瀵硅薄
+ data::ProcessDefinitionInfo getProcessDefinitionByDeployId(string deployId) throws common::VCIError;
+ data::ProcessDefinitionInfoList getProcessDefinitions(string processCategoryId) throws common::VCIError;
+ data::ProcessDefinitionInfoList getAllProcessDefinitions() throws common::VCIError;
+
+ //缂栫爜涓撶敤
+ data::ProcessDefinitionInfoList getProcessDefinitionsForRMCode(string processCategoryId) throws common::VCIError;
+ data::ProcessDefinitionInfoList getProcessDefinitionsByPage(string processCategoryId,string name,long pageSize,long pageIndex) throws common::VCIError;
+ data::ProcessDefinitionInfoList getProcessDefinitionByProcessDefinitionName(string processCategoryName,string processCategoryId) throws common::VCIError;
+ common::data::bytes getProcessResource(string jbpmDeploymentId, string resourceType) throws common::VCIError;
+
+ data::ProcessDefinitionInfoList getProcessDefinition(string rmTemplateId, string processType) throws common::VCIError;
+ data::ProcessDefinitionInfoList getProcessDefinitionByType(string processType) throws common::VCIError;
+ //鑾峰彇娴佺▼瀹氫箟鍒楄〃
+ data::ProcessDefinitionInfoList getProcessDefinitionAll() throws common::VCIError;
+
+ void saveRMTemplateProcess(string rmTemplateId, common::data::StringArray processTypes, common::data::StringArray jbpmDeployIds, common::data::UserEntityInfo userEnt) throws common::VCIError;
+ bool deleteRMTemplateProcess(string rmTemplateId, common::data::UserEntityInfo userEnt) throws common::VCIError;
+
+ bool startProcessInstanceByKey(string processDefinitionKey, data::FlowInstanceInfo flowInstance,common::data::StringArray objId,common::data::UserEntityInfo userEnt,common::data::StringArray userName,string outcome) throws common::VCIError;
+
+ //鍚姩娴佺▼锛屽垱寤烘祦绋嬪疄渚�
+ string startPocessSetUser(string processDefinitionKey, data::FlowInstanceInfo flowInstance,common::data::StringArray objId,common::data::UserEntityInfo userEnt,common::data::StringArray userName,string outcome,common::data::StringArray tasknames,common::data::StringArray2D taskUserNames) throws common::VCIError;
+ string startPocessSetUserForVar(string processDefinitionKey, data::FlowInstanceInfo flowInstance,common::data::StringArray objId,common::data::UserEntityInfo userEnt,common::data::StringArray userName,string outcome,common::data::StringArray tasknames,common::data::StringArray2D taskUserNames,common::data::StringArray keys ,common::data::StringArray values) throws common::VCIError;
+
+ string startPocessByPLM(string processDefinitionKey, data::FlowInstanceInfo flowInstance,common::data::StringArray objId,common::data::UserEntityInfo userEnt,common::data::StringArray userName,string outcome,common::data::StringArray tasknames,common::data::StringArray2D taskUserNames,data::MapTransfersInfoList mapTransfersInfos) throws common::VCIError;
+
+ //娣诲姞鏂板惎鍔ㄦ祦绋嬫帴鍙o紝鏂板鍙傛暟锛氬璞″睘鎬ф暟缁勶紝瀵硅薄灞炴�у搴旂殑鍊间簩缁存暟缁�
+ string startPocessByPLMv1(string processDefinitionKey, data::FlowInstanceInfo flowInstance,common::data::StringArray objId,common::data::UserEntityInfo userEnt,common::data::StringArray userName,string outcome,common::data::StringArray tasknames,common::data::StringArray2D taskUserNames,data::MapTransfersInfoList mapTransfersInfos,common::data::StringArray objectProperty,common::data::StringArray2D objectPropertyValues) throws common::VCIError;
+
+ //娣诲姞鏂板惎鍔ㄦ祦绋嬫帴鍙o紝鍚姩娴佺▼骞朵笖鎵ц绗竴涓换鍔¤妭鐐�
+ string startProcessAndExecuteFirstNode(string processDefinitionKey, data::FlowInstanceInfo flowInstance,common::data::StringArray objId,common::data::UserEntityInfo userEnt,common::data::StringArray userName,string outcome,common::data::StringArray tasknames,common::data::StringArray2D taskUserNames,data::MapTransfersInfoList mapTransfersInfos,common::data::StringArray objectProperty,common::data::StringArray2D objectPropertyValues) throws common::VCIError;
+
+ //bool startProcessInstanceByKeyForWuyuan(string processDefinitionKey, data::FlowInstanceInfo flowInstance,common::data::StringArray objId,common::data::UserEntityInfo userEnt,common::data::StringArray userName,string outcome) throws common::VCIError;
+ //鏌ヨ寰呭姙浠诲姟鐨勬�绘潯鏁�
+ long queryTodoTaskCount(string pluser,string expandSql,common::data::UserEntityInfo userEnt) throws common::VCIError;
+ data::FlowTaskInfoList getTodoTaskByUserId(string pluseroid,long first,long pageSize,string taskType,string sql,common::data::UserEntityInfo userEnt)throws common::VCIError;
+ data::FlowTaskInfoList getTodoTaskCompositorByUserId(string pluseroid,long first,long pageSize,string taskType,string sql,string orderStr,common::data::UserEntityInfo userEnt)throws common::VCIError;
+ //缂栫爜璧勬簮涓撶敤-鏌ヨ璺熻釜浠诲姟
+ long queryTraceTaskCount(string pluser,string expandSql,common::data::UserEntityInfo userEnt) throws common::VCIError;
+ data::FlowTaskInfoList getTrackTaskByUserId(string pluseroid,long first,long pageSize,string taskType,string querySQL,common::data::UserEntityInfo userEnt)throws common::VCIError;
+ //缂栫爜璧勬簮涓撶敤-鏌ヨ宸插姙浠诲姟
+ data::FlowTaskInfoList getDoneTaskByUserId(string pluseroid,long first,long pagesize,string taskType,string querySQL,common::data::UserEntityInfo userEnt)throws common::VCIError;
+ data::FlowTaskInfoList getDoneTaskCompositorByUserId(string pluseroid,long first,long pagesize,string taskType,string querySQL,string orderStr,common::data::UserEntityInfo userEnt)throws common::VCIError;
+ long queryDoneTaskCount(string pluser,string expandSql,common::data::UserEntityInfo userEnt) throws common::VCIError;
+
+
+ //鏌ヨ鎶勯�佷汉淇℃伅鎬绘暟
+ long queryCCTaskCount(string pluser,common::data::UserEntityInfo userEnt) throws common::VCIError;
+ //鎶勯�佷汉淇℃伅鍒楄〃
+ data::FlowTaskInfoList getCCTaskByUserId(string pluseroid,long first,long pageSize,common::data::UserEntityInfo userEnt)throws common::VCIError;
+
+ //鏌ヨ璺熻釜浠诲姟鐨勬�绘潯鏁�
+ //long queryTraceTaskCount(string pluser,common::data::UserEntityInfo userEnt,string expandSql) throws common::VCIError;
+ long queryMyTraceProcessCount(string pluser,common::data::UserEntityInfo userEnt,string expandSql) throws common::VCIError;
+ //data::FlowTaskInfoList getTrackTaskByUserId(string pluseroid,long first,long pageSize,common::data::UserEntityInfo userEnt,string expandSql)throws common::VCIError;
+ data::FlowTaskInfoList getMyTrackProcessByUserId(string pluseroid,long first,long pageSize,common::data::UserEntityInfo userEnt,string expandSql)throws common::VCIError;
+ data::FlowTaskInfoList getMyTrackProcessCompositorByUserId(string pluseroid,long first,long pageSize,common::data::UserEntityInfo userEnt,string expandSql, string orderStr)throws common::VCIError;
+
+ //鏍规嵁鏁版嵁鏌ヨ娴佺▼瀹炰緥
+ data::FlowTaskInfoList getFlowTaskInfoByDataId(string dataId, string tableName)throws common::VCIError;
+
+ bool completeTask(string taskId, string outcome, string nextTask,string approvalNote,common::data::UserEntityInfo userEnt,common::data::StringArray userName)throws common::VCIError;
+ bool completeTaskForVar(string taskId, string outcome, string nextTask,string approvalNote,common::data::UserEntityInfo userEnt,common::data::StringArray userName,common::data::StringArray keys ,common::data::StringArray values)throws common::VCIError;
+ bool completeTaskByPlatform(string taskId, string outcome, string nextTask,string approvalNote,common::data::UserEntityInfo userEnt,common::data::StringArray userName)throws common::VCIError;
+ //鏂板瀹屾垚鎺ュ彛,1.澧炲姞瀵硅薄灞炴�ф暟缁勶紝2.瀵硅薄灞炴�у拰灞炴�у�间簩缁存暟缁�
+ bool completeTaskByPlatformv1(string taskId, string outcome, string nextTask,string approvalNote,common::data::UserEntityInfo userEnt,common::data::StringArray userName,common::data::StringArray objectProperty,common::data::StringArray2D objectPropertyValues)throws common::VCIError;
+ //鎵归噺鎵ц娴佺▼浠诲姟--鏉′欢鏄悓涓�妯℃澘鍚屼竴浠诲姟鑺傜偣
+ bool completeTasksByPlatformv1(common::data::StringArray taskId, string outcome, string nextTask,string approvalNote,common::data::UserEntityInfo userEnt,common::data::StringArray userName,common::data::StringArray objectProperty,common::data::StringArray2D objectPropertyValues)throws common::VCIError;
+ //璧勬簮缂栫爜鐢ㄧ殑浠诲姟鎻愪氦浜嬩欢
+ //void completeTask(string taskId, string outcome,string approvalNote,common::data::StringArray userName,common::data::UserEntityInfo userEnt)throws common::VCIError;
+ data::ProcessTaskInfo findTaskPropertyById(string jbpmDeploymentId, string name)throws common::VCIError;
+ data::ProcessTaskInfo findTaskPropertyByProcessId(string jbpmDeploymentId)throws common::VCIError;
+
+ data::FlowApproveHistoryInfoList getHistoryActivityByProInsId(string processInstanceId)throws common::VCIError;
+ data::FlowApproveHistoryInfoList getHistoryActivityByProInsIdbyPLM(string processInstanceId)throws common::VCIError;
+
+ common::data::bytes getExecutionImageByExecutionId(string executionId, string taskName)throws common::VCIError;
+ common::data::bytes getExecutionImage(string executionId)throws common::VCIError;
+
+ data::FlowObjectInfoList getFlowObjectByExecutionId(string executionId)throws common::VCIError;
+
+ string getDeploymentIdByExecutionId(string executionId)throws common::VCIError;
+
+ data::FlowInstanceInfoList getFlowInstances(string applicant) throws common::VCIError;
+ data::FlowInstanceInfoList getFlowInstancesname(string name) throws common::VCIError;
+ string saveFlowInstance(data::FlowInstanceInfo flowInstance, common::data::UserEntityInfo userEnt) throws common::VCIError;
+
+ void endProcessInstance(string processInstanceId,common::data::UserEntityInfo userEnt)throws common::VCIError;
+ void endProcessInstanceByplatform(string processInstanceId,common::data::UserEntityInfo userEnt)throws common::VCIError;
+ data::FlowInstanceInfo getFlowInstanceInfo(string executionId)throws common::VCIError;
+
+ // 杩斿洖浠昏妭鐐逛笂瀹氫箟鐨勫�欓�変汉瀛楃涓插唴瀹�
+ string getNextCandidatesDefineString(string jbpmDeploymentId, string taskName, string outcome)throws common::VCIError;
+ //鑾峰彇涓嬩竴浠诲姟鍊欓�変汉
+ common::data::StringArray getNextCandidates(string jbpmDeploymentId, string taskName, string outcome)throws common::VCIError;
+ common::data::StringArray nextTaskCandidateUsers(string excutionId, string taskName)throws common::VCIError;
+ //鑾峰彇涓嬩竴浠诲姟
+ common::data::StringArray getNextTaskNames(string jbpmDeploymentId, string taskName, string outcome)throws common::VCIError;
+ //鑾峰彇褰撳墠浠诲姟鍊欓�変汉
+ common::data::StringArray getCurCandidates(string jbpmDeploymentId, string taskName, string outcome, string executionId)throws common::VCIError;
+ common::data::StringArray getAllCandidatesForTask(string jbpmDeploymentId, string taskName, string outcome)throws common::VCIError;
+ //濮旀墭浜�
+ common::data::StringArray getCurConstituents(string jbpmDeploymentId, string taskName, string outcome)throws common::VCIError;
+ //鑾峰彇娴佸悜
+ common::data::StringArray getTrainName(string jbpmDeploymentId, string taskName, string outcome)throws common::VCIError;
+
+ common::data::bytes getFlowImageByDeployID(string deployID)throws common::VCIError;
+ string getDepolymentID(string executionId)throws common::VCIError;
+ //data::FlowTaskInfoList getDoneTaskByUserId(string pluseroid,long first,long pagesize,common::data::UserEntityInfo userEnt,string expandSql)throws common::VCIError;
+ //long queryDoneTaskCount(string pluser,common::data::UserEntityInfo userEnt,string expandSql) throws common::VCIError;
+ //娴佺▼鐩戞帶閮ㄥ垎
+ data::FlowTaskInfoList getProcessControlByUserId(string pluseroid,long first,long pagesize,string taskType,string querySQL,common::data::UserEntityInfo userEnt)throws common::VCIError;
+ long queryProcessControlCount(string pluser,string taskType,common::data::UserEntityInfo userEnt) throws common::VCIError;
+
+ //瀹屾垚娴佺▼
+ data::FlowTaskInfoList getDoneProcessByUserId(string pluseroid,long first,long pagesize,string taskType,string querySQL,common::data::UserEntityInfo userEnt)throws common::VCIError;
+ long queryDoneProcessCount(string pluser,string taskType,common::data::UserEntityInfo userEnt) throws common::VCIError;
+
+ string getTaskPhaseName(string processDefinitionKey,string jbpmdeploymentid, data::FlowInstanceInfo flowInstance,common::data::UserEntityInfo userEnt) throws common::VCIError;
+ common::data::StringArray getDeployId(string taskId) throws common::VCIError;
+ //鍒ゆ柇key鏄惁閲嶅
+ bool checkKey(string name,string keyValue) throws common::VCIError;
+
+ // 杩斿洖娴佺▼妯℃澘鐨勭涓�涓换鍔″璞�
+ data::ProcessTaskInfo getFirstProcessTask(string jbpmDeploymentId) throws common::VCIError;
+ data::ProcessTaskInfo getFirstProcessTaskByExecId(string execId) throws common::VCIError;
+ //鑾峰彇娴佺▼涓嬩竴鑺傜偣鏄惁鏄痚nd鑺傜偣
+ bool getProcessTaskByTaskName(string taskId,string taskName,string outcome) throws common::VCIError;
+ //鏌ヨ鎵�鏈夌殑鍚屾剰浠诲姟浠诲姟鑺傜偣鏁版嵁
+ string getAllNoAgreeProcessTaskByTaskName(string taskId,string taskName,string outcome) throws common::VCIError;
+ //娴佺▼妯℃澘闅愯棌鑺傜偣
+ bool setNodeHide(string deploymentId) throws common::VCIError;
+ data::NodeHideInfoList getNodeHideDeploymentId() throws common::VCIError;
+ bool deleteHideFlow(string deployId)throws common::VCIError;
+ //鏍规嵁鏉′欢鏌ヨ鎸囧畾娴佺▼
+ data::FlowTaskInfoList getTaskByCondition(common::data::StringArray values,long first,long pagesize,string objectId,common::data::UserEntityInfo userEnt)throws common::VCIError;
+ long queryFlowTaskCount(common::data::StringArray values,string objectId,bool flag ,common::data::UserEntityInfo userEnt) throws common::VCIError;
+ //鑾峰彇娴佺▼涓嬩竴浠诲姟鍚嶇О
+ string getNextTaskNameByJbpmId(string jbpmDeploymentId,string taskname,string outcome)throws common::VCIError;
+ //鑾峰彇娴佺▼涓嬩竴浠诲姟绫诲瀷
+ string getNextTaskTypeByJbpmId(string jbpmDeploymentId,string taskname,string outcome)throws common::VCIError;
+ //鑾峰彇娴佺▼鍙戣捣浜�
+ string getProcessStartUser(string execId)throws common::VCIError;
+ //鑾峰彇浠诲姟ID
+ string getProcessTaskId(string execId)throws common::VCIError;
- /** FlowApproveContent 瀵硅薄鎺ュ彛 **/
- // 娣诲姞銆佷繚瀛� FlowApproveContent 瀵硅薄
- bool saveFlowApproveContent(data::FlowApproveContentInfo info, common::data::UserEntityInfo userEnt) throws common::VCIError;
- // 淇敼銆佹洿鏂� FlowApproveContent 瀵硅薄
- bool updateFlowApproveContent(data::FlowApproveContentInfo info, common::data::UserEntityInfo userEnt) throws common::VCIError;
- // 鏍规嵁ID鍒犻櫎 FlowApproveContent 瀵硅薄锛堟壒閲忥級
- bool deleteFlowApproveContent(common::data::StringArray ids, common::data::UserEntityInfo userEnt) throws common::VCIError;
- // 杩斿洖鍏ㄩ儴 FlowApproveContent 瀵硅薄
- data::FlowApproveContentInfoList getFlowApproveContents(common::data::UserEntityInfo userEnt) throws common::VCIError;
- // 鏍规嵁鍒嗛〉鍙傛暟杩斿洖 FlowApproveContentInfo 瀵硅薄
- data::FlowApproveContentInfoList getFlowApproveContentByPageing(data::QueryParamInfo queryParam, common::data::UserEntityInfo userEnt, out long total) throws common::VCIError;
- // 鏍规嵁ID杩斿洖 FlowApproveContent 瀵硅薄
- data::FlowApproveContentInfo getFlowApproveContentById(string id, common::data::UserEntityInfo userEnt) throws common::VCIError;
-
- bool revokeTask(string taskName, string destActivityName,string executionId) throws common::VCIError;
-
- bool appointTask(string destActivityName,string tagActivityName,common::data::StringArray classNames,string executionId,common::data::StringArray userNames) throws common::VCIError;
+ bool setPocessHide(string jbpmdeplotmentId, short status,common::data::UserEntityInfo userEnt) throws common::VCIError;
+ //鑾峰彇浠诲姟鎻忚堪淇℃伅
+ data::TaskDescInfoList getTaskDescList(string deploymentId,string taskName) throws common::VCIError;
+ data::FlowTaskInfoList getTodoTaskByUser(string pluseroid,long first,long pageSize,common::data::UserEntityInfo userEnt)throws common::VCIError;
+ common::data::StringArray getNextTask(string executionId, string taskName, string outcome)throws common::VCIError;
+ common::data::StringArray getUserNames(string executionId, string taskName, string outcome)throws common::VCIError;
+
+ //鑾峰彇绛栫暐鍒楄〃
+ data::TaskRevokeInfoList getTaskRevokeList(string deploymentId,string taskName) throws common::VCIError;
+ bool saveOrUpdateTasksAssigned(data::TasksAssignedInfo taskAssigned,common::data::UserEntityInfo userEnt) throws common::VCIError;
+ //鑾峰彇浠g悊浜哄璞�
+ data::TasksAssignedInfo getTasksAssignedByUserName(string userName , common::data::UserEntityInfo userEnt) throws common::VCIError;
+ //
+ data::TasksAssignedInfoList getAllTasksAssignedByUserName(string userName , common::data::UserEntityInfo userEnt) throws common::VCIError;
+ //鍒犻櫎浠g悊浜�
+ bool deleteTasksAssignedByUserName(common::data::StringArray userName, common::data::UserEntityInfo userEnt) throws common::VCIError;
+ // 鏍规嵁ID鏁扮粍鍒犻櫎濮旀墭
+ bool deleteTasksAssignedByIds(common::data::StringArray ids, common::data::UserEntityInfo userEnt) throws common::VCIError;
+ //璁剧疆浠诲姟鍊欓�変汉
+ void setParticipation(string nextTaskId,common::data::StringArray userNames)throws common::VCIError;
+
+ //鑾峰彇涓嬩釜浠诲姟鐨勫鏈夌敤鎴峰寘鍚嚜瀹氫箟鐢ㄦ埛
+ common::data::StringArray getAllUserListForTask(string taskName,string deploymentId,string outcome,common::data::StringArray varkey,common::data::StringArray varValue)throws common::VCIError;
+
+ /** FlowApproveContent 瀵硅薄鎺ュ彛 **/
+ // 娣诲姞銆佷繚瀛� FlowApproveContent 瀵硅薄
+ bool saveFlowApproveContent(data::FlowApproveContentInfo info, common::data::UserEntityInfo userEnt) throws common::VCIError;
+ // 淇敼銆佹洿鏂� FlowApproveContent 瀵硅薄
+ bool updateFlowApproveContent(data::FlowApproveContentInfo info, common::data::UserEntityInfo userEnt) throws common::VCIError;
+ // 鏍规嵁ID鍒犻櫎 FlowApproveContent 瀵硅薄锛堟壒閲忥級
+ bool deleteFlowApproveContent(common::data::StringArray ids, common::data::UserEntityInfo userEnt) throws common::VCIError;
+ // 杩斿洖鍏ㄩ儴 FlowApproveContent 瀵硅薄
+ data::FlowApproveContentInfoList getFlowApproveContents(common::data::UserEntityInfo userEnt) throws common::VCIError;
+ // 鏍规嵁鍒嗛〉鍙傛暟杩斿洖 FlowApproveContentInfo 瀵硅薄
+ data::FlowApproveContentInfoList getFlowApproveContentByPageing(data::QueryParamInfo queryParam, common::data::UserEntityInfo userEnt, out long total) throws common::VCIError;
+ // 鏍规嵁ID杩斿洖 FlowApproveContent 瀵硅薄
+ data::FlowApproveContentInfo getFlowApproveContentById(string id, common::data::UserEntityInfo userEnt) throws common::VCIError;
- bool appointTask2(string destActivityName,string tagActivityName,common::data::StringArray classNames,string executionId,common::data::StringArray userNames,common::data::UserEntityInfo userEnt) throws common::VCIError;
-
- //鑾峰彇鎵�鏈変换鍔″垪琛�
- common::data::StringArray getAllTaskNames(string jbpmDeploymentId)throws common::VCIError;
- //鑾峰彇褰撳墠浠诲姟鐨勬墍鏈夋祦鍚�
- common::data::StringArray getAllOutComes(string taskID) throws common::VCIError;
- common::data::StringArray getOutComesByTaskName(string jbpmDeploymentId,string taskName) throws common::VCIError;
-
- //鑾峰彇鑷畾涔塙rl璺緞
- string getUrlPath(string jbpmDeploymentId,string taskName)throws common::VCIError;
- common::data::StringArray getTrainsitionUrlPath(string jbpmDeploymentId,string taskName,string trainsitionName)throws common::VCIError;
- //杞氦浠诲姟
- // bool assignTask(string executionId,string username) throws common::VCIError;
- bool assignTask(string fromUsername,string toUsername) throws common::VCIError;
- bool assignTaskByPlatform(string fromUsername,string toUsername) throws common::VCIError;
- bool transmitTask(string taskId,string toUsername,common::data::UserEntityInfo userEnt) throws common::VCIError;
- bool transmitTaskByPlatform(common::data::StringArray taskIds,string toUsername,common::data::UserEntityInfo userEnt) throws common::VCIError;
- //淇濆瓨鎶勯�佷汉
- bool saveTaskCCInfo(data::TaskCCInfoList infoList) throws common::VCIError;
- //鑾峰彇鎶勯�佷汉淇℃伅
- data::TaskCCInfoList getTaskCCInfos(string jbpmDeploymentId) throws common::VCIError;
- //鍒犻櫎鎶勯�佷俊鎭�
- bool deleteTaskCC(string jbpmDeploymentId,string userName) throws common::VCIError;
-
- //鍒涘缓鏂囨。
- void creatTxtFile() throws common::VCIError;
- //璇诲彇鏂囨。
- string readTxtFile() throws common::VCIError;
- //缂栧啓鏂囨。
- void writeTxtFile(data::EventInfoList eventInfoList) throws common::VCIError;
- //淇敼鏂囨。鍐呭
- void replaceTxtByStr(string oldStr,string replaceStr) throws common::VCIError;
- //淇濆瓨瀛愭祦绋嬫ā鏉夸笌鐖舵ā鏉夸箣闂寸殑鍏崇郴
- void saveSubProcess(data::SubprocessTemInfoList subprocessTemInfos);
- //鍒ゆ柇娴佺▼鏄惁琚紩鐢�
- long checkSubprocessQuote(string subProcess);
- //閰嶇疆浠诲姟鍜岀敤鎴峰叧绯�
- void configTaskAndUser(string deploymentId,common::data::StringArray dataIds,common::data::StringArray tasknames,common::data::StringArray2D userNames);
- //閫氳繃娴佺▼瀹氫箟ID鑾峰彇閮ㄧ讲ID
- string getDeployIdByProcessDefintionId(string processDifId);
-
- bool getEndNode(string jbpmDeploymentId,string endTaskName);
- bool isEndNode(string executionId,string endTaskName);
-
- string getNextTaskAssigner(string executionId,string taskName);
- string getNextSubTaskAssigner(string executionId, string taskName, string outcome);
- // 杩斿洖娴佺▼鎵ц鏃剁殑鍙傛暟鍊�
- string getProcessVariable(string executionId, string varName, common::data::UserEntityInfo userEnt)throws common::VCIError;
-
- common::data::StringArray getTasksNameByProcessName(common::data::StringArray processNames,common::data::UserEntityInfo userEnt) throws common::VCIError;
- string searchComplateTask(common::data::StringArray param, common::data::UserEntityInfo userEnt)throws common::VCIError;
-
- data::TasksAssignedInfoList getTasksAssignedByPageing(data::QueryParamInfo queryParam, common::data::UserEntityInfo userEnt, out long total) throws common::VCIError;
- string getTaskId(string currActivityName, string executionId) throws common::VCIError;
-
- bool moveDefinition(string deploymentId , string categoryId) throws common::VCIError;
-
- void loadWorkFlowTemplate(string jbpmDeploymentId) throws common::VCIError;
- //鍒ゆ柇浠诲姟鏄惁鏈夊瓙浠诲姟
- common::data::StringArray getsubTasks(string taskId);
-
- //鑾峰彇娴佺▼閮ㄧ讲id
- string getDeploymentID(string processDefinitionKey);
- //鑾峰彇娴佺▼鍚嶇О
- string getProcessName(string executionid);
-
- void setTaskAndUserForComplete(string executionid,common::data::StringArray tasknames,common::data::StringArray2D taskUserNames, common::data::UserEntityInfo userEnt) throws common::VCIError;
-
- common::data::StringArray getFlowTaskInfoByDataIds(common::data::StringArray dataIds,string tableName) throws common::VCIError;
-
- //娴佺▼浠诲姟瀵硅薄
- data::FlowTaskInfo getFlowTaskInfo(string executionid,string taskid) throws common::VCIError;
-
- string getWorkflowPropertiesValue(string key) throws common::VCIError;
- //add by caill 2016.4.7
- string getEventPropertyValue(string key) throws common::VCIError;
-
- //by zhangxg
- //淇濆瓨
- bool savePlwfinstancetemplate(data::PlwfinstancetemplateInfo plwfinstancetemplate,data::PlwfpersonsetList plwfpersonsetList)throws common::VCIError;
- //
- data::PlwfinstancetemplateList getPlwfinstancetemplate()throws common::VCIError;
- //鏍规嵁涓婚搴撳垎绫诲拰鏄惁榛樿妯℃澘
- data::PlwfinstancetemplateList getPlwfinstancetemplateByClassAndDefault(string plclass, string plisdefault)throws common::VCIError;
- data::PlwfinstancetemplateInfo getPlwfinstancetemplateById(string pid)throws common::VCIError;
- //鍒犻櫎
- bool deletePlwfinstance(data::PlwfinstancetemplateInfo plwfinstancetemplate)throws common::VCIError;
-
- //
- data::PlwfpersonsetList getPlwfpersonset(string tid)throws common::VCIError;
- //鍒犻櫎
- bool deletePlwfpersonset(data::PlwfpersonsetInfo plwfpersonset)throws common::VCIError;
- //閲嶆柊璁剧疆浠诲姟鑺傜偣璐熻矗浜�
- bool resetNodeUser(string executionId, common::data::StringArray taskNames, common::data::StringArray userNames) throws common::VCIError;
- }
+ bool revokeTask(string taskName, string destActivityName,string executionId) throws common::VCIError;
+
+ bool appointTask(string destActivityName,string tagActivityName,common::data::StringArray classNames,string executionId,common::data::StringArray userNames) throws common::VCIError;
+
+ bool appointTask2(string destActivityName,string tagActivityName,common::data::StringArray classNames,string executionId,common::data::StringArray userNames,common::data::UserEntityInfo userEnt) throws common::VCIError;
+
+ //鑾峰彇鎵�鏈変换鍔″垪琛�
+ common::data::StringArray getAllTaskNames(string jbpmDeploymentId)throws common::VCIError;
+ //鑾峰彇褰撳墠浠诲姟鐨勬墍鏈夋祦鍚�
+ common::data::StringArray getAllOutComes(string taskID) throws common::VCIError;
+ common::data::StringArray getOutComesByTaskName(string jbpmDeploymentId,string taskName) throws common::VCIError;
+
+ //鑾峰彇鑷畾涔塙rl璺緞
+ string getUrlPath(string jbpmDeploymentId,string taskName)throws common::VCIError;
+ common::data::StringArray getTrainsitionUrlPath(string jbpmDeploymentId,string taskName,string trainsitionName)throws common::VCIError;
+ //杞氦浠诲姟
+ // bool assignTask(string executionId,string username) throws common::VCIError;
+ bool assignTask(string fromUsername,string toUsername) throws common::VCIError;
+ bool assignTaskByPlatform(string fromUsername,string toUsername) throws common::VCIError;
+ bool transmitTask(string taskId,string toUsername,common::data::UserEntityInfo userEnt) throws common::VCIError;
+ bool transmitTaskByPlatform(common::data::StringArray taskIds,string toUsername,common::data::UserEntityInfo userEnt) throws common::VCIError;
+ //淇濆瓨鎶勯�佷汉
+ bool saveTaskCCInfo(data::TaskCCInfoList infoList) throws common::VCIError;
+ //鑾峰彇鎶勯�佷汉淇℃伅
+ data::TaskCCInfoList getTaskCCInfos(string jbpmDeploymentId) throws common::VCIError;
+ //鍒犻櫎鎶勯�佷俊鎭�
+ bool deleteTaskCC(string jbpmDeploymentId,string userName) throws common::VCIError;
+
+ //鍒涘缓鏂囨。
+ void creatTxtFile() throws common::VCIError;
+ //璇诲彇鏂囨。
+ string readTxtFile() throws common::VCIError;
+ //缂栧啓鏂囨。
+ void writeTxtFile(data::EventInfoList eventInfoList) throws common::VCIError;
+ //淇敼鏂囨。鍐呭
+ void replaceTxtByStr(string oldStr,string replaceStr) throws common::VCIError;
+ //淇濆瓨瀛愭祦绋嬫ā鏉夸笌鐖舵ā鏉夸箣闂寸殑鍏崇郴
+ void saveSubProcess(data::SubprocessTemInfoList subprocessTemInfos);
+ //鍒ゆ柇娴佺▼鏄惁琚紩鐢�
+ long checkSubprocessQuote(string subProcess);
+ //閰嶇疆浠诲姟鍜岀敤鎴峰叧绯�
+ void configTaskAndUser(string deploymentId,common::data::StringArray dataIds,common::data::StringArray tasknames,common::data::StringArray2D userNames);
+ //閫氳繃娴佺▼瀹氫箟ID鑾峰彇閮ㄧ讲ID
+ string getDeployIdByProcessDefintionId(string processDifId);
+
+ bool getEndNode(string jbpmDeploymentId,string endTaskName);
+ bool isEndNode(string executionId,string endTaskName);
+
+ string getNextTaskAssigner(string executionId,string taskName);
+ string getNextSubTaskAssigner(string executionId, string taskName, string outcome);
+ // 杩斿洖娴佺▼鎵ц鏃剁殑鍙傛暟鍊�
+ string getProcessVariable(string executionId, string varName, common::data::UserEntityInfo userEnt)throws common::VCIError;
+
+ common::data::StringArray getTasksNameByProcessName(common::data::StringArray processNames,common::data::UserEntityInfo userEnt) throws common::VCIError;
+ string searchComplateTask(common::data::StringArray param, common::data::UserEntityInfo userEnt)throws common::VCIError;
+
+ data::TasksAssignedInfoList getTasksAssignedByPageing(data::QueryParamInfo queryParam, common::data::UserEntityInfo userEnt, out long total) throws common::VCIError;
+ string getTaskId(string currActivityName, string executionId) throws common::VCIError;
+
+ bool moveDefinition(string deploymentId , string categoryId) throws common::VCIError;
+
+ void loadWorkFlowTemplate(string jbpmDeploymentId) throws common::VCIError;
+ //鍒ゆ柇浠诲姟鏄惁鏈夊瓙浠诲姟
+ common::data::StringArray getsubTasks(string taskId);
+
+ //鑾峰彇娴佺▼閮ㄧ讲id
+ string getDeploymentID(string processDefinitionKey);
+ //鑾峰彇娴佺▼鍚嶇О
+ string getProcessName(string executionid);
+
+ void setTaskAndUserForComplete(string executionid,common::data::StringArray tasknames,common::data::StringArray2D taskUserNames, common::data::UserEntityInfo userEnt) throws common::VCIError;
+
+ common::data::StringArray getFlowTaskInfoByDataIds(common::data::StringArray dataIds,string tableName) throws common::VCIError;
+
+ //娴佺▼浠诲姟瀵硅薄
+ data::FlowTaskInfo getFlowTaskInfo(string executionid,string taskid) throws common::VCIError;
+
+ string getWorkflowPropertiesValue(string key) throws common::VCIError;
+ //add by caill 2016.4.7
+ string getEventPropertyValue(string key) throws common::VCIError;
+
+ //by zhangxg
+ //淇濆瓨
+ bool savePlwfinstancetemplate(data::PlwfinstancetemplateInfo plwfinstancetemplate,data::PlwfpersonsetList plwfpersonsetList)throws common::VCIError;
+ //
+ data::PlwfinstancetemplateList getPlwfinstancetemplate()throws common::VCIError;
+ //鏍规嵁涓婚搴撳垎绫诲拰鏄惁榛樿妯℃澘
+ data::PlwfinstancetemplateList getPlwfinstancetemplateByClassAndDefault(string plclass, string plisdefault)throws common::VCIError;
+ data::PlwfinstancetemplateInfo getPlwfinstancetemplateById(string pid)throws common::VCIError;
+ //鍒犻櫎
+ bool deletePlwfinstance(data::PlwfinstancetemplateInfo plwfinstancetemplate)throws common::VCIError;
+
+ //
+ data::PlwfpersonsetList getPlwfpersonset(string tid)throws common::VCIError;
+ //鍒犻櫎
+ bool deletePlwfpersonset(data::PlwfpersonsetInfo plwfpersonset)throws common::VCIError;
+ //閲嶆柊璁剧疆浠诲姟鑺傜偣璐熻矗浜�
+ bool resetNodeUser(string executionId, common::data::StringArray taskNames, common::data::StringArray userNames) throws common::VCIError;
}
}
// }}}
\ No newline at end of file
diff --git a/Source/Common/PLTSlice/slice/05-omd.ice b/Source/Common/PLTSlice/slice/05-omd.ice
index 57ee207..704a7d2 100644
--- a/Source/Common/PLTSlice/slice/05-omd.ice
+++ b/Source/Common/PLTSlice/slice/05-omd.ice
@@ -707,6 +707,8 @@
// 瀵硅薄妯″瀷瀹氫箟鏈嶅姟
interface OMDService {
+ void test();
+
//鏍规嵁浼犲叆鐨勪笟鍔″璞″悕绉帮紝鑾峰彇瀵硅薄寤烘ā鐨勬墍鏈夋暟鎹紙鍙傛暟涓虹┖鏃讹紝鑾峰彇鎵�鏈夊缓妯℃暟鎹級
data::SystemModelData getSysModelData(common::data::StringArray boTypes) throws common::VCIError;
diff --git a/Source/Common/PLTSlice/slice/06-log.ice b/Source/Common/PLTSlice/slice/06-log.ice
new file mode 100644
index 0000000..859ae08
--- /dev/null
+++ b/Source/Common/PLTSlice/slice/06-log.ice
@@ -0,0 +1,124 @@
+// **********************************************************************
+//
+// Copyright (c) 2008-2023 VCI-Tech, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described the
+// ICE_LICENSE file included this distribution.
+//
+// **********************************************************************
+
+#pragma once
+
+#include "01-common.ice"
+
+[["java:package:com.vci.corba"]]
+["cs:namespace:com.vci.corba"]
+
+
+// module com {
+// module vci {
+// module corba {
+module log {
+ //data
+ module data {
+ // 鏃ュ織绫诲瀷
+ enum LogType {
+ // 鐧诲綍
+ Login = 1,
+ // 鐧诲嚭
+ Logout = 2,
+ // 鎺堟潈
+ Grant = 3,
+ // 涓�鑸搷浣�
+ General = 4,
+ // 闆嗘垚鎿嶄綔
+ Integration = 5,
+ // 閿佸畾鐢ㄦ埛
+ LockUser = 6,
+ // 瑙i攣鐢ㄦ埛
+ UnlockUser = 7,
+ // 鍗锋枃浠朵笂浼�
+ FileUpload = 8,
+ // 鍗锋枃浠朵笅杞�
+ FileDownload = 9
+ };
+
+ /**-----------------------鏃ュ織绠$悊妯″潡-------------------------**/
+ //鏃ュ織淇℃伅
+ struct LogInfo {
+ string puid;//ID
+ string username;//鐢ㄦ埛鍚�
+ string truename;//濮撳悕
+ string userIp;//鐢ㄦ埛IP
+ string result;//鎿嶄綔缁撴灉
+ string content; // 鏃ュ織鍐呭
+ string date;//鎿嶄綔鏃ユ湡
+ string type;//鎿嶄綔绫诲瀷
+ string moduleName;//鎿嶄綔妯″潡
+ string entityDesc;//鎿嶄綔瀵硅薄鐨勬弿杩�
+ string property;//鎿嶄綔鐨勫睘鎬�
+ string previousVal;//鎿嶄綔鍓嶅緱鍊�
+ string newVal;//鎿嶄綔鍚庣殑鍊�
+ string logType;// 鏃ュ織绫诲瀷
+ };
+ sequence<LogInfo> LogInfoList;
+
+ struct RefObj {
+ string oid; // 涓氬姟瀵硅薄OID
+ string btName; // 涓氬姟绫诲瀷
+ string id; // 瀵硅薄ID
+ string name; // 涓氬姟瀵硅薄鍚嶇О
+ };
+ sequence<RefObj> RefObjList;
+
+ //鏃ュ織淇濆瓨鍜屽浠芥湡闄愪俊鎭�
+ struct LogPeriodInfo {
+ string code;//瀵瑰簲鐨勬暟鍊硷紝浠ユ湀涓哄崟浣�
+ string value;//瀵瑰簲鐨勬樉绀哄悕绉�
+ };
+ sequence<LogPeriodInfo> LogPeriodInfoList;
+ };//end data
+
+ interface LogService {
+ // 娴嬭瘯绯荤粺鏄惁鑳借繛閫�
+ bool test() throws common::VCIError;
+
+ /***************************绯荤粺鍔熻兘妯″潡end**************************/
+
+ /**鏃ュ織绠$悊妯″潡**/
+ //淇濆瓨鏃ュ織淇濆瓨鏈熼檺
+ bool savePeriod(string period, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ //鑾峰彇褰撳墠鏃ュ織淇濆瓨鏈熼檺
+ int getCurPeriod() throws common::VCIError;
+ //鑾峰彇鏃ュ織鍒犻櫎閰嶇疆锛宼rue琛ㄧず鑷姩锛宖alse琛ㄧず鎵嬪姩
+ bool getIsAutoDelete() throws common::VCIError;
+ //鍒濆鍖栦笅鎷夋锛岃幏鍙栭厤缃ソ鐨勫��
+ data::LogPeriodInfoList getPeriods() throws common::VCIError;
+ //鑾峰彇鏃ュ織椤甸潰鏄剧ず鏉℃暟
+ long getPageSize() throws common::VCIError;
+ //鑾峰彇褰撳墠鏌ヨ鏃ュ織鐨勬�绘潯鏁�
+ long getSumLogRows(string sql) throws common::VCIError;
+ //鑾峰彇褰撳墠鏌ヨ鐨勬棩蹇楅泦鍚�
+ data::LogInfoList fetchLogInfo(int pageNo, int pagesize, string sql) throws common::VCIError;
+ //鍒犻櫎鏃ュ織
+ bool deleteLog(string deleteDate) throws common::VCIError;
+ //鏍规嵁鏌ヨ鏉′欢鑾峰彇鏃ュ織淇℃伅
+ data::LogInfoList getLogListByContion(int pageNo, int pagesize, string sql) throws common::VCIError;
+
+ // 绠�鍗曡褰曠郴缁熺櫥褰曟棩蹇楋紝success锛氭垚鍔�/澶辫触锛� content锛氬唴瀹�
+ void saveLoginLog(bool success, string content, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ // 璁板綍鐧诲嚭鏃ュ織淇℃伅
+ void saveLogoutLog(string content, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ // 绠�鍗曡褰曠敤鎴疯閿佸畾鏃ュ織淇℃伅
+ void saveLockLog(string userId, common::data::UserEntityInfo userEntity) throws common::VCIError;
+
+ // 璁板綍鏃ュ織
+ void saveLog(string result, string content, string opType, data::LogType logType, string objOid, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ // 璁板綍鏃ュ織
+ void saveObjLog(data::RefObj obj, string opType, string result, data::LogType logType, common::data::UserEntityInfo userEntity) throws common::VCIError;
+ // 鎵归噺瀵硅薄鎿嶄綔璁板綍鏃ュ織
+ void batchSaveObjLog(data::RefObjList objs, string opType, string result, common::data::UserEntityInfo userEntity) throws common::VCIError;
+
+ }//end interface
+}//framework
+// }}}
diff --git a/Source/Common/PLTSlice/slice/07-message.ice b/Source/Common/PLTSlice/slice/07-message.ice
index fa66d52..7a67dc5 100644
--- a/Source/Common/PLTSlice/slice/07-message.ice
+++ b/Source/Common/PLTSlice/slice/07-message.ice
@@ -37,14 +37,25 @@
};
sequence<PLMessage> PLMessageList;
}
+
+ // 娑堟伅璁㈤槄鍥炶皟
+ interface MessageCallback {
+ // 鍙戦�佹秷鎭�氱煡
+ void notify(data::PLMessage msg);
+ // 鍒ゆ柇鎺ュ彛鍏宠仈鐨勫鎴风鏄惁娲荤潃
+ bool isAlive();
+ }
// 娑堟伅鏈嶅姟
interface MessageService {
// 娉ㄥ唽涓氬姟瀵硅薄浜嬩欢娑堟伅
- long regBusinessObjectMessage(string btName, string eventName) throws common::VCIError;
+ //long regBusinessObjectMessage(string btName, string eventName) throws common::VCIError;
// 璁㈤槄浜嬩欢娑堟伅
- bool subscribeMessage(string user, string btName, string eventName) throws common::VCIError;
+ //bool subscribeMessage(string user, string btName, string eventName) throws common::VCIError;
+
+ // 娉ㄥ唽鍥炶皟鎺ュ彛
+ void regMessageCallback(MessageCallback* callback);
// 妫�鏌ユ垜鐨勬秷鎭暟閲�, 鏍规嵁鐘舵�佹煡璇㈡垜鐨勬秷鎭暟閲忥紝濡傛灉涓嶈缃畇tatus锛屽垯鏌ヨ鏈娑堟伅
long checkMessage(string user);
@@ -59,7 +70,7 @@
data::PLMessageList getMessagesByIds(common::data::StringArray msgids) throws common::VCIError;
// 鑾峰彇鎸囧畾鐢ㄦ埛鐨勬墍鏈夋寚瀹氱姸鎬佺殑娑堟伅锛屼笉鎸囧畾鐘舵�佸垯鑾峰彇鎵�鏈夋秷鎭�
- data::PLMessageList getMessagesByPage(string user, string status, long pageNo, long pageSize) throws common::VCIError;
+ data::PLMessageList getMessagesByPage(string user, string status, int pageNo, int pageSize) throws common::VCIError;
// 璁剧疆鎸囧畾娑堟伅鎸囧畾鐢ㄦ埛宸茶
bool setMessageReaded(string user, string msgid) throws common::VCIError;
diff --git a/Source/Common/PLTSlice/slice/08-cache.ice b/Source/Common/PLTSlice/slice/08-cache.ice
new file mode 100644
index 0000000..9f757ef
--- /dev/null
+++ b/Source/Common/PLTSlice/slice/08-cache.ice
@@ -0,0 +1,29 @@
+// **********************************************************************
+//
+// Copyright (c) 2008-2023 VCI-Tech, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described the
+// ICE_LICENSE file included this distribution.
+//
+// **********************************************************************
+
+#pragma once
+
+#include "01-common.ice"
+
+[["java:package:com.vci.corba"]]
+["cs:namespace:com.vci.corba"]
+
+// module com {
+// module vci {
+// module corba {
+module cache{
+ // 缂撳瓨鏈嶅姟
+ interface CacheService{
+ // 閲嶇疆缂撳瓨
+ bool resetCache()throws common::VCIError;
+ // 閲嶇疆鎸囧畾绫诲瀷鐨勭紦瀛�
+ void resetTypeCache(string type) throws common::VCIError;
+ }
+}
+// }}}
\ No newline at end of file
diff --git a/Source/Common/PLTSlice/slice/12-query.ice b/Source/Common/PLTSlice/slice/12-query.ice
index 930aacd..353ef36 100644
--- a/Source/Common/PLTSlice/slice/12-query.ice
+++ b/Source/Common/PLTSlice/slice/12-query.ice
@@ -71,7 +71,8 @@
};
interface ObjectQueryService{
-
+ void test();
+
//鏍规嵁鏌ヨ妯℃澘鍚�, 鏌ヨ妯℃澘鏁版嵁鏌ヨ涓氬姟瀵硅薄
omd::data::BusinessObjectList findBTMObjects(string qtName, string qtText)throws common::VCIError;
//鏍规嵁鏌ヨ妯℃澘鍚�, 鏌ヨ妯℃澘鏁版嵁鏌ヨ涓氬姟瀵硅薄-v2
diff --git a/Source/Common/PLTSlice/slice/14-portal.ice b/Source/Common/PLTSlice/slice/14-portal.ice
index daa3690..ff82772 100644
--- a/Source/Common/PLTSlice/slice/14-portal.ice
+++ b/Source/Common/PLTSlice/slice/14-portal.ice
@@ -165,6 +165,8 @@
};
interface PortalService{
+ void test();
+
//淇濆瓨瑙嗗浘
bool savePortalVI(data::PortalVI pvi)throws common::VCIError;
//鏇存柊瑙嗗浘
diff --git a/Source/Service/BOFactory/build-jar.xml b/Source/Service/BOFactory/build-jar.xml
index 6aa5f1e..a075307 100644
--- a/Source/Service/BOFactory/build-jar.xml
+++ b/Source/Service/BOFactory/build-jar.xml
@@ -2,7 +2,7 @@
<!--classes.jar; src.jar-->
<project name = "platform-BOFactory" default = "build-BOFactory-jar" basedir = ".">
- <property file="build.properties"/>
+ <property file="../../build.properties"/>
<target name="time">
<tstamp>
@@ -30,5 +30,7 @@
<include name="**.jar" />
</fileset>
</copy>
+
+
</target>
</project>
\ No newline at end of file
diff --git a/Source/Service/BOFactory/build.properties b/Source/Service/BOFactory/build.properties
index 4f8a188..c626764 100644
--- a/Source/Service/BOFactory/build.properties
+++ b/Source/Service/BOFactory/build.properties
@@ -9,4 +9,8 @@
service.dir=${lib.dir}/service
client.dir=${lib.dir}/client
+grid.app = ${app_home}/../grid/app
+grid.common=${grid.app}/common
+grid.service=${grid.app}/service
+
platform.version=2024
\ No newline at end of file
diff --git a/Source/Service/BOFactory/dist/BOFService.jar b/Source/Service/BOFactory/dist/BOFService.jar
index 7d26e53..9f309bc 100644
--- a/Source/Service/BOFactory/dist/BOFService.jar
+++ b/Source/Service/BOFactory/dist/BOFService.jar
Binary files differ
diff --git a/Source/Service/BOFactory/src/com/vci/server/BOFactoryBoxService.java b/Source/Service/BOFactory/src/com/vci/server/BOFactoryBoxService.java
index 1cd4368..c8c32b9 100644
--- a/Source/Service/BOFactory/src/com/vci/server/BOFactoryBoxService.java
+++ b/Source/Service/BOFactory/src/com/vci/server/BOFactoryBoxService.java
@@ -3,7 +3,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.vci.server.base.persistence.dao.HibernateSessionFactory;
import com.vci.server.bof.BOFactoryServiceImpl;
+import com.vci.server.mw.ServerContextInterceptor;
import com.zeroc.Ice.Communicator;
import com.zeroc.Ice.Identity;
import com.zeroc.Ice.ObjectAdapter;
@@ -17,18 +19,20 @@
@Override
public void start(String name, Communicator communicator, String[] args) {
- LOGGER.info("start servant: BOFactoryService");
+ LOGGER.info("start servant: " + name);
+
+ HibernateSessionFactory.getConfiguration();
+
// IceBox
// 鍒涘缓objectAdapter锛岃繖閲屽拰service鍚屽悕
_adapter = communicator.createObjectAdapter(name);
+
// 鍒涘缓servant
com.zeroc.Ice.Object object = new BOFactoryServiceImpl();
- id = Util.stringToIdentity(name);
- // _adapter.add(object, communicator.stringToIdentity(name));
- _adapter.add(object, id);
+ _adapter.add(new ServerContextInterceptor(object), Util.stringToIdentity(name));
// 婵�娲�
_adapter.activate();
- LOGGER.info("start servant success: BOFactoryService");
+ LOGGER.info("start servant success: " + name);
}
@Override
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/ServiceFacadeUtil.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/ServiceFacadeUtil.java
index 6d20e89..562d53a 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/ServiceFacadeUtil.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/ServiceFacadeUtil.java
@@ -1,25 +1,14 @@
package com.vci.server.bof.server;
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Map;
-
import org.apache.commons.lang3.StringUtils;
-import org.hibernate.HibernateException;
import com.vci.corba.omd.btm.BtmItem;
import com.vci.corba.omd.data.AttributeValue;
-import com.vci.corba.omd.data.BusinessObject;
import com.vci.corba.omd.data.LinkObject;
import com.vci.server.base.exception.ExceptionLocalHandler;
-import com.vci.server.base.persistence.dao.HibernateSessionFactory;
-import com.vci.server.base.utility.ServerServiceProvider;
import com.vci.server.cache.OMCacheProvider;
import com.vci.common.exception.VciExceptionTool;
import com.vci.corba.common.VCIError;
-import com.vci.corba.common.data.VCIInvocationInfo;
import com.vci.corba.common.data.UserEntityInfo;
-import com.vci.corba.framework.method.FrameworkServicePrx;
-import com.vci.common.log.LogType;
/**
* 瀹氫箟宸ュ叿鏂规硶
@@ -46,21 +35,21 @@
* @param oid锛氬璞ID
* @throws VCIError
*/
- protected void recordLog(String user, String module, String ip, String operation, String type, String objName, String oid) throws VCIError {
- userEntity.userName = user;
- if(module.equalsIgnoreCase(type)){
- userEntity.modules = getBtmShowName(module);
- }else{
- userEntity.modules = module;
- }
- userEntity.ip = ip;
-
- String con = "鎿嶄綔鐨勬暟鎹槸->" + getBtmShowName(type) + ":" + objName;
- //璁板綍鏃ュ織
-
- ServerServiceProvider.getFrameService().savelogGeneralOperation("鎿嶄綔鎴愬姛", con, userEntity, oid, type);
- //LogRecordUtil.writeLog(userEntity, operation, "鎿嶄綔鎴愬姛", "鎿嶄綔鐨勬暟鎹槸->" + getBtmShowName(type) + ":" + objName, LogType.GeneralOperation, oid);
- }
+// protected void recordLog(String user, String module, String ip, String operation, String type, String objName, String oid) throws VCIError {
+// userEntity.userName = user;
+// if(module.equalsIgnoreCase(type)){
+// userEntity.modules = getBtmShowName(module);
+// }else{
+// userEntity.modules = module;
+// }
+// userEntity.ip = ip;
+//
+// String con = "鎿嶄綔鐨勬暟鎹槸->" + getBtmShowName(type) + ":" + objName;
+// //璁板綍鏃ュ織
+//
+// ServerServiceProvider.getFrameService().savelogGeneralOperation("鎿嶄綔鎴愬姛", con, userEntity, oid, type);
+// //LogRecordUtil.writeLog(userEntity, operation, "鎿嶄綔鎴愬姛", "鎿嶄綔鐨勬暟鎹槸->" + getBtmShowName(type) + ":" + objName, LogType.GeneralOperation, oid);
+// }
/**
* 鎵归噺瀛樺偍log
@@ -71,57 +60,59 @@
* @throws SQLException
* @throws VCIError
*/
- protected void batchRecordLog(BusinessObject[] bos, String ip, String operation) throws HibernateException, SQLException, VCIError {
- batchRecordLog(bos,ip,operation,"鎿嶄綔鎴愬姛");
- }
+// protected void batchRecordLog(BusinessObject[] bos, String ip, String operation) throws HibernateException, SQLException, VCIError {
+// //batchRecordLog(bos,ip,operation,"鎿嶄綔鎴愬姛");
+// LogRecordUtil.batchWriteLog(userEntity, bos, operation, "鎿嶄綔鎴愬姛");
+// }
- private void batchRecordLog(BusinessObject[] bos, String ip, String operation,String result) throws HibernateException, SQLException, VCIError{
- if (bos == null || bos.length < 1) {
- return;
- }
-
- VCIInvocationInfo invInfo = HibernateSessionFactory.getVciSessionInfo();
-
- if (StringUtils.isEmpty(invInfo.userName))
- userEntity.userName = bos[0].creator;
- else
- userEntity.userName = invInfo.userName;
-
- userEntity.ip = ip;
-
- String type = bos[0].btName;
- userEntity.modules = getBtmShowName(type);
-
- FrameworkServicePrx fService= ServerServiceProvider.getFrameService();
-
-// ArrayList<String> logList = new ArrayList<String>();
- for (int i = 0; i < bos.length; i++) {
- BusinessObject bo = bos[i];
- String info = StringUtils.isNotBlank(bo.name)?bo.name:(StringUtils.isNotBlank(bo.id)?bo.id:bo.oid);
- String btmShowName = getBtmShowName(bos[i].btName);
-
- try {
- fService.saveLogV2(result, "鎿嶄綔鐨勬暟鎹负->"+ btmShowName + ":" + info, operation, (short)LogType.GeneralOperation.getIntVal(), bos[i].oid, userEntity);
- } catch (VCIError e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
-// logList.add(LogRecordUtil.getLogSql(userEntity, operation, result, "鎿嶄綔鐨勬暟鎹负->"+ btmShowName + ":" + info, LogType.GeneralOperation, bos[i].oid, role, btmShowName));
-// if ((i + 1) % 200 == 0) {
-// LogRecordUtil.batchSaveLog(logList.toArray(new String[logList.size()]));
-// logList.clear();
-// }
- }
-// if (bos.length % 200 != 0) {
-// LogRecordUtil.batchSaveLog(logList.toArray(new String[logList.size()]));
-// logList.clear();
+// private void batchRecordLog(BusinessObject[] bos, String ip, String operation,String result) throws HibernateException, SQLException, VCIError{
+// if (bos == null || bos.length < 1) {
+// return;
// }
- }
+//
+// VCIInvocationInfo invInfo = HibernateSessionFactory.getVciSessionInfo();
+//
+// if (StringUtils.isEmpty(invInfo.userName))
+// userEntity.userName = bos[0].creator;
+// else
+// userEntity.userName = invInfo.userName;
+//
+// userEntity.ip = ip;
+//
+// String type = bos[0].btName;
+// userEntity.modules = getBtmShowName(type);
+//
+// FrameworkServicePrx fService= ServerServiceProvider.getFrameService();
+//
+//// ArrayList<String> logList = new ArrayList<String>();
+// for (int i = 0; i < bos.length; i++) {
+// BusinessObject bo = bos[i];
+// String info = StringUtils.isNotBlank(bo.name)?bo.name:(StringUtils.isNotBlank(bo.id)?bo.id:bo.oid);
+// String btmShowName = getBtmShowName(bos[i].btName);
+//
+// try {
+// LogRecordUtil.writeLog(userEntity, result, "鎿嶄綔鐨勬暟鎹负->"+ btmShowName + ":" + info, operation, (short)LogType.GeneralOperation.getIntVal(), bos[i].oid);
+// //LogRecordUtil.w (result, "鎿嶄綔鐨勬暟鎹负->"+ btmShowName + ":" + info, operation, (short)LogType.GeneralOperation.getIntVal(), bos[i].oid, userEntity);
+// } catch (VCIError e) {
+// // TODO Auto-generated catch block
+// e.printStackTrace();
+// }
+//
+//// logList.add(LogRecordUtil.getLogSql(userEntity, operation, result, "鎿嶄綔鐨勬暟鎹负->"+ btmShowName + ":" + info, LogType.GeneralOperation, bos[i].oid, role, btmShowName));
+//// if ((i + 1) % 200 == 0) {
+//// LogRecordUtil.batchSaveLog(logList.toArray(new String[logList.size()]));
+//// logList.clear();
+//// }
+// }
+//// if (bos.length % 200 != 0) {
+//// LogRecordUtil.batchSaveLog(logList.toArray(new String[logList.size()]));
+//// logList.clear();
+//// }
+// }
- protected void batchFailRecordLog(BusinessObject[] bos, String ip, String operation) throws HibernateException, SQLException, VCIError{
- batchRecordLog(bos,ip,operation,"鎿嶄綔澶辫触");
- }
+// protected void batchFailRecordLog(BusinessObject[] bos, String ip, String operation) throws HibernateException, SQLException, VCIError{
+// batchRecordLog(bos,ip,operation,"鎿嶄綔澶辫触");
+// }
/**
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCUDBOLO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCUDBOLO.java
index 43a0656..c2aeba9 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCUDBOLO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCUDBOLO.java
@@ -6,6 +6,7 @@
import com.vci.corba.omd.data.BusinessObject;
import com.vci.corba.omd.data.LinkObject;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
import com.vci.server.bof.service.LOFactoryService;
@@ -30,11 +31,11 @@
LinkObject[] createLOs = params.getCreateLos();
LinkObject[] updateLOs = params.getUpdateLos();
boolean rs = false;
- VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
- String ip = "127.0.0.1";
- if(info!=null){
- ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
- }
+// VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
+// String ip = "127.0.0.1";
+// if(info!=null){
+// ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
+// }
if(deleteLOs != null && deleteLOs.length > 0) {
LOFactoryService services = LOFactoryService.getInstance();
rs = services.batchDeleteLinkObject(deleteLOs);
@@ -46,10 +47,10 @@
BOFactoryServices services = BOFactoryServices.getInstance();
rs = services.batchDeleteBusinessObject(deleteBOs, 1);
if (!rs) {
- batchFailRecordLog(deleteBOs, ip, "鍒犻櫎");
+ LogRecordUtil.batchWriteLog(deleteBOs, "鍒犻櫎", "鎿嶄綔澶辫触");
return rs;
}
- batchRecordLog(deleteBOs, ip, "鍒犻櫎");
+ LogRecordUtil.batchWriteLog(deleteBOs, "鍒犻櫎");
}
if((createBOs != null && createBOs.length > 0) ||
(createLOs != null && createLOs.length > 0)) {
@@ -57,19 +58,19 @@
BOFactoryServices services = BOFactoryServices.getInstance();
rs = services.batchCreateBusinessObjectWithLink(createBOs, createLOs, ts);
if (!rs) {
- batchFailRecordLog(createBOs, ip, "鍒涘缓");
+ LogRecordUtil.batchWriteLog(createBOs, "鍒涘缓", "鎿嶄綔澶辫触");
return rs;
}
- batchRecordLog(createBOs, ip, "鍒涘缓");
+ LogRecordUtil.batchWriteLog(createBOs, "鍒涘缓");
}
if(updateBOs != null && updateBOs.length > 0) {
BOFactoryServices services = BOFactoryServices.getInstance();
rs = services.batchUpdateBusinessObject(updateBOs);
if (!rs) {
- batchFailRecordLog(updateBOs, ip, "鏇存柊");
+ LogRecordUtil.batchWriteLog(updateBOs, "鏇存柊", "鎿嶄綔澶辫触");
return rs;
}
- batchRecordLog(updateBOs, ip, "鏇存柊");
+ LogRecordUtil.batchWriteLog(updateBOs, "鏇存柊");
}
if(updateLOs != null && updateLOs.length > 0) {
LOFactoryService services = LOFactoryService.getInstance();
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBO.java
index 756649b..12b8b7e 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBO.java
@@ -4,6 +4,7 @@
import com.vci.corba.common.data.VCIInvocationInfo;
import com.vci.corba.omd.data.BusinessObject;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
import com.vci.corba.common.VCIError;
@@ -25,12 +26,12 @@
BOFactoryServices services = BOFactoryServices.getInstance();
BusinessObject[] currentBOs = services.batchCreateBusinessObject(params.getBos(), params.isRevision(), params.isNewVersion());
//鏃ュ織璁板綍
- VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
- String ip = "127.0.0.1";
- if(info!=null){
- ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
- }
- batchRecordLog(currentBOs, ip, "鍒涘缓");
+// VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
+// String ip = "127.0.0.1";
+// if(info!=null){
+// ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
+// }
+ LogRecordUtil.batchWriteLog(currentBOs, "鍒涘缓");
return currentBOs;
} catch (VCIError e) {
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBOLO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBOLO.java
index 18a5c98..1acfde5 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBOLO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBOLO.java
@@ -5,6 +5,7 @@
import com.vci.common.log.ServerWithLog4j;
import com.vci.corba.common.data.VCIInvocationInfo;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
import com.vci.corba.common.VCIError;
@@ -32,7 +33,7 @@
if(info!=null){
ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
}
- batchRecordLog(params.getBos(), ip, "鍒涘缓");
+ LogRecordUtil.batchWriteLog(params.getBos(), "鍒涘缓");
return true;
} catch (VCIError e) {
throw this.getLocalString(e.code, e);
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBOLONoCheckLog.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBOLONoCheckLog.java
index 5b2a401..7dc39b0 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBOLONoCheckLog.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBOLONoCheckLog.java
@@ -5,6 +5,7 @@
import com.vci.common.log.ServerWithLog4j;
import com.vci.corba.common.data.VCIInvocationInfo;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
import com.vci.corba.common.VCIError;
@@ -26,12 +27,12 @@
BOFactoryServices services = BOFactoryServices.getInstance();
StringHolder ts = new StringHolder();
services.batchCreateBusinessObjectWithLinkNoCheck(params.getBos(), params.getLos(), ts);
- VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
- String ip = "127.0.0.1";
- if(info!=null){
- ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
- }
- batchRecordLog(params.getBos(), ip, "鍒涘缓");
+// VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
+// String ip = "127.0.0.1";
+// if(info!=null){
+// ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
+// }
+ LogRecordUtil.batchWriteLog(params.getBos(), "鍒涘缓");
return true;
} catch (VCIError e) {
throw this.getLocalString(e.code, e);
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBOLOTS.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBOLOTS.java
index 6be3788..ed3c9cc 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBOLOTS.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateBOLOTS.java
@@ -2,6 +2,7 @@
import com.vci.corba.common.data.VCIInvocationInfo;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
import com.vci.corba.common.VCIError;
@@ -23,13 +24,13 @@
BOFactoryServices services = BOFactoryServices.getInstance();
services.batchCreateBusinessObjectWithLink(params.getBos(), params.getLos(), params.getTs());
//鏃ュ織璁板綍
- VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
- @SuppressWarnings("unused")
- String ip = "127.0.0.1";
- if(info!=null){
- ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
- }
- batchRecordLog(params.getBos(), ip, "鍒涘缓");
+// VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
+// @SuppressWarnings("unused")
+// String ip = "127.0.0.1";
+// if(info!=null){
+// ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
+// }
+ LogRecordUtil.batchWriteLog(params.getBos(), "鍒涘缓");
return true;
} catch (VCIError e) {
throw this.getLocalString(e.code, e);
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateDeleteBOLO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateDeleteBOLO.java
index e7177c5..1ea9ccd 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateDeleteBOLO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/BatchCreateDeleteBOLO.java
@@ -6,6 +6,7 @@
import com.vci.corba.omd.data.BusinessObject;
import com.vci.corba.omd.data.LinkObject;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
import com.vci.server.bof.service.LOFactoryService;
@@ -28,11 +29,11 @@
LinkObject[] deleteLOs = params.getDeleteLos();
LinkObject[] createLOs = params.getCreateLos();
boolean rs = false;
- VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
- String ip = "127.0.0.1";
- if(info!=null){
- ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
- }
+// VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
+// String ip = "127.0.0.1";
+// if(info!=null){
+// ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
+// }
if(deleteLOs != null && deleteLOs.length > 0) {
LOFactoryService services = LOFactoryService.getInstance();
rs = services.batchDeleteLinkObject(deleteLOs);
@@ -44,10 +45,10 @@
BOFactoryServices services = BOFactoryServices.getInstance();
rs = services.batchDeleteBusinessObject(deleteBOs, 1);
if (!rs) {
- batchFailRecordLog(deleteBOs, ip, "鍒犻櫎");
+ LogRecordUtil.batchWriteLog(deleteBOs, "鍒犻櫎", "鎿嶄綔澶辫触");
return rs;
}
- batchRecordLog(deleteBOs, ip, "鍒犻櫎");
+ LogRecordUtil.batchWriteLog(deleteBOs, "鍒犻櫎");
}
if((createBOs != null && createBOs.length > 0) ||
(createLOs != null && createLOs.length > 0)) {
@@ -55,10 +56,10 @@
BOFactoryServices services = BOFactoryServices.getInstance();
rs = services.batchCreateBusinessObjectWithLink(createBOs, createLOs, ts);
if (!rs) {
- batchFailRecordLog(createBOs, ip, "澧炲姞");
+ LogRecordUtil.batchWriteLog(createBOs, "澧炲姞", "鎿嶄綔澶辫触");
return rs;
}
- batchRecordLog(createBOs, ip, "澧炲姞");
+ LogRecordUtil.batchWriteLog(createBOs, "澧炲姞");
}
return rs;
}
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/CreateBO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/CreateBO.java
index e120f94..0ab4e98 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/CreateBO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/CreateBO.java
@@ -8,6 +8,7 @@
import com.vci.corba.omd.data.BusinessObject;
import com.vci.corba.common.VCIError;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -38,12 +39,13 @@
}
BusinessObject currentBO = services.createBusinessObject(bo, params.isRevision(), params.isNewVersion());
//鏃ュ織璁板綍
- VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
- String ip = "127.0.0.1";
- if(info!=null){
- ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
- }
- recordLog(bo.creator, bo.btName, ip, "鍒涘缓", bo.btName, StringUtils.isNotBlank(bo.name)?bo.name:(StringUtils.isNotBlank(bo.id)?bo.id:bo.oid), bo.oid);
+// VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
+// String ip = "127.0.0.1";
+// if(info!=null){
+// ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
+// }
+ //recordLog(bo.creator, bo.btName, ip, "鍒涘缓", bo.btName, StringUtils.isNotBlank(bo.name)?bo.name:(StringUtils.isNotBlank(bo.id)?bo.id:bo.oid), bo.oid);
+ LogRecordUtil.writeGeneralSuccessLog(bo, "鍒涘缓");
return currentBO;
} catch (VCIError e) {
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/CreateBOLO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/CreateBOLO.java
index 09f23ae..7081dc7 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/CreateBOLO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/CreateBOLO.java
@@ -8,6 +8,7 @@
import com.vci.corba.omd.data.LinkObject;
import com.vci.corba.common.VCIError;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -50,7 +51,8 @@
if(info!=null){
ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
}
- batchRecordLog(bos, ip, "鍒涘缓");
+ //batchRecordLog(bos, ip, "鍒涘缓");
+ LogRecordUtil.batchWriteLog(bos, "鍒涘缓");
return true;
} catch (VCIError e) {
throw this.getLocalString(e.code, e);
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/CreateBOLOTS.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/CreateBOLOTS.java
index cb9cdbe..ce178b7 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/create/CreateBOLOTS.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/create/CreateBOLOTS.java
@@ -6,6 +6,7 @@
import com.vci.corba.omd.data.LinkObject;
import com.vci.corba.common.VCIError;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -48,7 +49,8 @@
if(info!=null){
ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
}
- batchRecordLog(bos, ip, "鍒涘缓");
+ //batchRecordLog(bos, ip, "鍒涘缓");
+ LogRecordUtil.batchWriteLog(bos, "鍒涘缓");
return true;
} catch (VCIError e) {
throw this.getLocalString(e.code, e);
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/delete/BatchDeleteBO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/delete/BatchDeleteBO.java
index 202335d..6021c23 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/delete/BatchDeleteBO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/delete/BatchDeleteBO.java
@@ -2,6 +2,7 @@
import com.vci.corba.common.data.VCIInvocationInfo;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -32,7 +33,8 @@
if(info!=null){
ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
}
- batchRecordLog(params.getBos(), ip, "鍒犻櫎");
+ //batchRecordLog(params.getBos(), ip, "鍒犻櫎");
+ LogRecordUtil.batchWriteLog(params.getBos(), "鍒犻櫎");
} catch (Exception e) {
//e.printStackTrace();
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/delete/DeleteBO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/delete/DeleteBO.java
index 6c16b27..dbc7e91 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/delete/DeleteBO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/delete/DeleteBO.java
@@ -5,6 +5,7 @@
import com.vci.corba.common.data.VCIInvocationInfo;
import com.vci.corba.omd.data.BusinessObject;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -35,7 +36,8 @@
if(info!=null){
ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
}
- recordLog(info.userName, bo.btName, ip, "鍒犻櫎", bo.btName, StringUtils.isNotBlank(bo.name)?bo.name:(StringUtils.isNotBlank(bo.id)?bo.id:bo.oid), bo.oid);
+ //recordLog(info.userName, bo.btName, ip, "鍒犻櫎", bo.btName, StringUtils.isNotBlank(bo.name)?bo.name:(StringUtils.isNotBlank(bo.id)?bo.id:bo.oid), bo.oid);
+ LogRecordUtil.writeGeneralSuccessLog(bo, "鍒犻櫎");
} catch (Exception e) {
//e.printStackTrace();
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/transfer/BatchTransferBO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/transfer/BatchTransferBO.java
index c0a0af8..04fa639 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/transfer/BatchTransferBO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/transfer/BatchTransferBO.java
@@ -5,6 +5,7 @@
import com.vci.corba.omd.lcm.LifeCycle;
import com.vci.corba.omd.lcm.TransitionVO;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.base.utility.ServerServiceProvider;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -15,12 +16,12 @@
import com.vci.corba.common.VCIError;
-public class BatchTransferBO extends ServiceFacadeExecuteHelper{
+public class BatchTransferBO extends ServiceFacadeExecuteHelper {
private static ServiceFacadeExecuteHelper instance = null;
public static ServiceFacadeExecuteHelper getInstance() {
- if(instance == null) {
+ if (instance == null) {
instance = new BatchTransferBO();
}
return instance;
@@ -37,8 +38,7 @@
TransitionVO vo2 = null;
String boLcStatus = bos[i].lcStatus;
if (boLcStatus == null || boLcStatus == "") {
- throw getLocalString("", new VCIError("P0010SOF-00023",
- new String[] { bos[i].name }));
+ throw getLocalString("", new VCIError("P0010SOF-00023", new String[] { bos[i].name }));
// throw getLocalString("", new
// VCIError("褰撳墠鎵�閫夌殑涓氬姟瀵硅薄\"{0}\"鐨勭敓鍛藉懆鏈熺姸鎬佸�间负绌猴紝涓嶇敤鏈夋晥鎵ц璺冭縼鎿嶄綔銆�",new
// String[]{bos[i].name}));
@@ -52,8 +52,7 @@
}
if (curLC == null) {
// TODO:鎻愮ず鍑烘潵
- throw getLocalString("", new VCIError("P0010SOF-00024",
- new String[] { bos[i].name }));
+ throw getLocalString("", new VCIError("P0010SOF-00024", new String[] { bos[i].name }));
}
if (!vos[i].destination.equals("") && !vos[i].connect.equals("")) {
for (int l = 0; l < curLC.routes.length; ++l) {
@@ -66,8 +65,7 @@
}
}
if (vo2 == null) {
- throw getLocalString("", new VCIError("P0010SOF-00027",
- new String[] { vos[i].destination }));
+ throw getLocalString("", new VCIError("P0010SOF-00027", new String[] { vos[i].destination }));
}
} else if (!vos[i].destination.equals("")) {
for (int l = 0; l < curLC.routes.length; ++l) {
@@ -80,8 +78,7 @@
}
}
if (vo2 == null) {
- throw getLocalString("", new VCIError("P0010SOF-00027",
- new String[] { vos[i].destination }));
+ throw getLocalString("", new VCIError("P0010SOF-00027", new String[] { vos[i].destination }));
}
} else if (!vos[i].connect.equals("")) {
for (int l = 0; l < curLC.routes.length; ++l) {
@@ -94,12 +91,10 @@
}
}
if (vo2 == null) {
- throw getLocalString("", new VCIError("P0010SOF-00025",
- new String[] { vos[i].connect }));
+ throw getLocalString("", new VCIError("P0010SOF-00025", new String[] { vos[i].connect }));
}
} else {
- throw getLocalString("", new VCIError("P0010SOF-00026",
- new String[] {}));
+ throw getLocalString("", new VCIError("P0010SOF-00026", new String[] {}));
}
// 鎵ц璺冭縼浜嬩欢
TransitionEventsExcuter excuter = new TransitionEventsExcuter();
@@ -111,20 +106,19 @@
return rs;
}
// 鏃ュ織璁板綍
- VCIInvocationInfo info = HibernateSessionFactory
- .getVciSessionInfo();
- String ip = "127.0.0.1";
- if (info != null) {
- ip = info.clientIPInfo == null || "".equals(info.clientIPInfo) ? "127.0.0.1"
- : info.clientIPInfo;
- }
- batchRecordLog(bos, ip, "璺冭縼");
+// VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
+// String ip = "127.0.0.1";
+// if (info != null) {
+// ip = info.clientIPInfo == null || "".equals(info.clientIPInfo) ? "127.0.0.1" : info.clientIPInfo;
+// }
+ //batchRecordLog(bos, ip, "璺冭縼");
+ LogRecordUtil.batchWriteLog(bos, "璺冭縼");
} catch (Exception e) {
e.printStackTrace();
-
+
throw this.getLocalString("P0010SOF-00008", e);
} catch (Throwable t) {
-
+
t.printStackTrace();
throw this.getLocalString("P0010SOF-00008", t);
}
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/transfer/TransferBO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/transfer/TransferBO.java
index 7d95928..9fa8bfe 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/transfer/TransferBO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/transfer/TransferBO.java
@@ -7,6 +7,7 @@
import com.vci.corba.omd.lcm.LifeCycle;
import com.vci.corba.omd.lcm.TransitionVO;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.base.utility.ServerServiceProvider;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -103,7 +104,9 @@
ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
}
String logInfo = StringUtils.isNotBlank(bo.name)?bo.name:(StringUtils.isNotBlank(bo.id)?bo.id:bo.oid);
- recordLog(bo.modifier, bo.btName,ip, "璺冭縼", bo.btName,logInfo + "鐨勭姸鎬佹敼鍙橈紝浠庛��" + vo.source + "銆戝埌銆�" + vo.destination +"銆�", bo.oid);
+ //recordLog(bo.modifier, bo.btName,ip, "璺冭縼", bo.btName,logInfo + "鐨勭姸鎬佹敼鍙橈紝浠庛��" + vo.source + "銆戝埌銆�" + vo.destination +"銆�", bo.oid);
+ LogRecordUtil.writeGeneralSuccessLog(bo, "璺冭縼");
+
} catch (Exception e) {
e.printStackTrace();
throw this.getLocalString("P0010SOF-00008", e);
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/BatchChangeBOOwner.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/BatchChangeBOOwner.java
index 97fb071..651336c 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/BatchChangeBOOwner.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/BatchChangeBOOwner.java
@@ -2,6 +2,7 @@
import com.vci.corba.common.data.VCIInvocationInfo;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -26,12 +27,13 @@
return rs;
}
//鏃ュ織璁板綍
- VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
- String ip = "127.0.0.1";
- if(info!=null){
- ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
- }
- batchRecordLog(params.getBos(), ip, "鍙樻洿鎵�鏈夎��");
+// VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
+// String ip = "127.0.0.1";
+// if(info!=null){
+// ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
+// }
+ //batchRecordLog(params.getBos(), ip, "鍙樻洿鎵�鏈夎��");
+ LogRecordUtil.batchWriteLog(params.getBos(), "鍙樻洿鎵�鏈夎��");
} catch (Exception e) {
e.printStackTrace();
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/BatchUpdateBO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/BatchUpdateBO.java
index ae6f348..c006945 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/BatchUpdateBO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/BatchUpdateBO.java
@@ -2,6 +2,7 @@
import com.vci.corba.common.data.VCIInvocationInfo;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -26,13 +27,14 @@
return rs;
}
//鏃ュ織璁板綍
- VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
- @SuppressWarnings("unused")
- String ip = "127.0.0.1";
- if(info!=null){
- ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
- }
- batchRecordLog(params.getBos(), ip, "淇敼");
+// VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
+// @SuppressWarnings("unused")
+// String ip = "127.0.0.1";
+// if(info!=null){
+// ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
+// }
+ //batchRecordLog(params.getBos(), ip, "淇敼");
+ LogRecordUtil.batchWriteLog(params.getBos(), "淇敼");
} catch (Exception e) {
e.printStackTrace();
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/ChangeBOOwner.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/ChangeBOOwner.java
index 1c34477..644fc43 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/ChangeBOOwner.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/ChangeBOOwner.java
@@ -5,6 +5,7 @@
import com.vci.corba.common.data.VCIInvocationInfo;
import com.vci.corba.omd.data.BusinessObject;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -36,7 +37,8 @@
ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
}
String logInfo = StringUtils.isNotBlank(bo.name)?bo.name:(StringUtils.isNotBlank(bo.id)?bo.id:bo.oid);
- recordLog(bo.modifier, bo.btName, ip, "鍙樻洿鎵�鏈夎��", bo.btName, logInfo, bo.oid);
+ //recordLog(bo.modifier, bo.btName, ip, "鍙樻洿鎵�鏈夎��", bo.btName, logInfo, bo.oid);
+ LogRecordUtil.writeGeneralSuccessLog(bo, "鍙樻洿鎵�鏈夎��");
} catch (Exception e) {
e.printStackTrace();
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/UpdateBO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/UpdateBO.java
index 4cbdfb1..d8bd2fc 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/UpdateBO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/UpdateBO.java
@@ -6,6 +6,7 @@
import com.vci.corba.omd.data.BusinessObject;
import com.vci.corba.common.VCIError;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -37,7 +38,8 @@
ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
}
String logInfo = StringUtils.isNotBlank(bo.name)?bo.name:(StringUtils.isNotBlank(bo.id)?bo.id:bo.oid);
- recordLog(bo.modifier, bo.btName, ip, "淇敼", bo.btName, logInfo, bo.oid);
+ //recordLog(bo.modifier, bo.btName, ip, "淇敼", bo.btName, logInfo, bo.oid);
+ LogRecordUtil.writeGeneralSuccessLog(bo, "淇敼");
} catch (Exception e) {
e.printStackTrace();
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/BatchCheckInBO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/BatchCheckInBO.java
index 9793eac..0779ee8 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/BatchCheckInBO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/BatchCheckInBO.java
@@ -2,6 +2,7 @@
import com.vci.corba.common.data.VCIInvocationInfo;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -26,12 +27,13 @@
return rs;
}
//鏃ュ織璁板綍
- VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
- String ip = "127.0.0.1";
- if(info!=null){
- ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
- }
- batchRecordLog(params.getBos(), ip, "妫�鍏�");
+// VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
+// String ip = "127.0.0.1";
+// if(info!=null){
+// ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
+// }
+ //batchRecordLog(params.getBos(), ip, "妫�鍏�");
+ LogRecordUtil.batchWriteLog(params.getBos(), "妫�鍏�");
} catch (Exception e) {
//e.printStackTrace();
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/BatchCheckOutBO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/BatchCheckOutBO.java
index 0433b39..1514af6 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/BatchCheckOutBO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/BatchCheckOutBO.java
@@ -2,6 +2,7 @@
import com.vci.corba.common.data.VCIInvocationInfo;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -26,12 +27,13 @@
return rs;
}
//鏃ュ織璁板綍
- VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
- String ip = "127.0.0.1";
- if(info!=null){
- ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
- }
- batchRecordLog(params.getBos(), ip, "妫�鍑�");
+// VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
+// String ip = "127.0.0.1";
+// if(info!=null){
+// ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
+// }
+ //batchRecordLog(params.getBos(), ip, "妫�鍑�");
+ LogRecordUtil.batchWriteLog(params.getBos(), "妫�鍑�");
} catch (Exception e) {
//e.printStackTrace();
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/BatchUndoCheckOutBO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/BatchUndoCheckOutBO.java
index 45c32cc..e8b63ac 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/BatchUndoCheckOutBO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/BatchUndoCheckOutBO.java
@@ -2,6 +2,7 @@
import com.vci.corba.common.data.VCIInvocationInfo;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -26,12 +27,13 @@
return rs;
}
//鏃ュ織璁板綍
- VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
- String ip = "127.0.0.1";
- if(info!=null){
- ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
- }
- batchRecordLog(params.getBos(), ip, "鍙栨秷妫�鍑�");
+// VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo();
+// String ip = "127.0.0.1";
+// if(info!=null){
+// ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
+// }
+ //batchRecordLog(params.getBos(), ip, "鍙栨秷妫�鍑�");
+ LogRecordUtil.batchWriteLog(params.getBos(), "鍙栨秷妫�鍑�");
} catch (Exception e) {
//e.printStackTrace();
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/CheckInBO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/CheckInBO.java
index ddf3f77..d0b211d 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/CheckInBO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/CheckInBO.java
@@ -5,6 +5,7 @@
import com.vci.corba.common.data.VCIInvocationInfo;
import com.vci.corba.omd.data.BusinessObject;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -35,7 +36,8 @@
if(info!=null){
ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
}
- recordLog(bo.modifier, bo.btName, ip, "妫�鍏�", bo.btName, StringUtils.isNotBlank(bo.name)?bo.name:(StringUtils.isNotBlank(bo.id)?bo.id:bo.oid), bo.oid);
+ //recordLog(bo.modifier, bo.btName, ip, "妫�鍏�", bo.btName, StringUtils.isNotBlank(bo.name)?bo.name:(StringUtils.isNotBlank(bo.id)?bo.id:bo.oid), bo.oid);
+ LogRecordUtil.writeGeneralSuccessLog(bo, "妫�鍏�");
} catch (Exception e) {
e.printStackTrace();
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/CheckOutBO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/CheckOutBO.java
index 64ed4f4..3aa147b 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/CheckOutBO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/CheckOutBO.java
@@ -5,6 +5,7 @@
import com.vci.corba.common.data.VCIInvocationInfo;
import com.vci.corba.omd.data.BusinessObject;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -35,7 +36,8 @@
if(info!=null){
ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
}
- recordLog(bo.modifier, bo.btName, ip, "妫�鍑�", bo.btName, StringUtils.isNotBlank(bo.name)?bo.name:(StringUtils.isNotBlank(bo.id)?bo.id:bo.oid), bo.oid);
+ //recordLog(bo.modifier, bo.btName, ip, "妫�鍑�", bo.btName, StringUtils.isNotBlank(bo.name)?bo.name:(StringUtils.isNotBlank(bo.id)?bo.id:bo.oid), bo.oid);
+ LogRecordUtil.writeGeneralSuccessLog(bo, "妫�鍑�");
} catch (Exception e) {
e.printStackTrace();
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/UndoCheckOutBO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/UndoCheckOutBO.java
index 3dd715a..cf32a36 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/UndoCheckOutBO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/check/UndoCheckOutBO.java
@@ -5,6 +5,7 @@
import com.vci.corba.common.data.VCIInvocationInfo;
import com.vci.corba.omd.data.BusinessObject;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryServices;
@@ -35,7 +36,8 @@
if(info!=null){
ip = info.clientIPInfo == null||"".equals(info.clientIPInfo) ?"127.0.0.1":info.clientIPInfo;
}
- recordLog(bo.modifier, bo.btName, ip, "鍙栨秷妫�鍑�", bo.btName, StringUtils.isNotBlank(bo.name)?bo.name:(StringUtils.isNotBlank(bo.id)?bo.id:bo.oid), bo.oid);
+ //recordLog(bo.modifier, bo.btName, ip, "鍙栨秷妫�鍑�", bo.btName, StringUtils.isNotBlank(bo.name)?bo.name:(StringUtils.isNotBlank(bo.id)?bo.id:bo.oid), bo.oid);
+ LogRecordUtil.writeGeneralSuccessLog(bo, "鍙栨秷妫�鍑�");
} catch (Exception e) {
e.printStackTrace();
diff --git a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/revision/BatchRevisionBO.java b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/revision/BatchRevisionBO.java
index 18890bb..baf7b1d 100644
--- a/Source/Service/BOFactory/src/com/vci/server/bof/server/update/revision/BatchRevisionBO.java
+++ b/Source/Service/BOFactory/src/com/vci/server/bof/server/update/revision/BatchRevisionBO.java
@@ -4,6 +4,7 @@
import com.vci.corba.omd.data.BusinessObject;
import com.vci.corba.common.VCIError;
import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.bof.server.ServiceFacadeExecuteHelper;
import com.vci.server.bof.service.BOFactoryBatchServices;
@@ -31,7 +32,8 @@
BusinessObject[] bos = services.batchRevisionBusinessObject(params.getOids(), params.getBtmName(), info.userName);
//鏃ュ織璁板綍
- batchRecordLog(bos, ip, "鍗囩増鏈�");
+ //batchRecordLog(bos, ip, "鍗囩増鏈�");
+ LogRecordUtil.batchWriteLog(bos, "鍗囩増鏈�");
return true;
} catch (VCIError e) {
throw this.getLocalString(e.code, e);
diff --git a/Source/Service/CacheService/.classpath b/Source/Service/CacheService/.classpath
new file mode 100644
index 0000000..4466b6d
--- /dev/null
+++ b/Source/Service/CacheService/.classpath
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry excluding="com/vci/server/CacheServiceMain.java|com/vci/server/cache/delegate/VciCacheServerDelegate.java" kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/PLTCommon"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/ServiceBase"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/PLTSlice"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/ThirdJAR"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Common"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/FrameService"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/OMDService"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/UIService"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/Source/Service/CacheService/.project b/Source/Service/CacheService/.project
new file mode 100644
index 0000000..91f6627
--- /dev/null
+++ b/Source/Service/CacheService/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>CacheService</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+ <filteredResources>
+ <filter>
+ <id>1704940758216</id>
+ <name></name>
+ <type>30</type>
+ <matcher>
+ <id>org.eclipse.core.resources.regexFilterMatcher</id>
+ <arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+ </matcher>
+ </filter>
+ </filteredResources>
+</projectDescription>
diff --git a/Source/Service/CacheService/.settings/com.zeroc.IceBuilderPlugin.prefs b/Source/Service/CacheService/.settings/com.zeroc.IceBuilderPlugin.prefs
new file mode 100644
index 0000000..492ec0d
--- /dev/null
+++ b/Source/Service/CacheService/.settings/com.zeroc.IceBuilderPlugin.prefs
@@ -0,0 +1,2 @@
+builderVersion=4.1
+eclipse.preferences.version=1
diff --git a/Source/Service/CacheService/.settings/org.eclipse.core.resources.prefs b/Source/Service/CacheService/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..e38c3ff
--- /dev/null
+++ b/Source/Service/CacheService/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,5 @@
+eclipse.preferences.version=1
+encoding//src/properties=UTF-8
+encoding//src/properties/RMIPFramework_zhNative.properties=UTF-8
+encoding//src/properties/corba.properties=UTF-8
+encoding/<project>=UTF-8
diff --git a/Source/Service/CacheService/.settings/org.eclipse.ltk.core.refactoring.prefs b/Source/Service/CacheService/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..904a840
--- /dev/null
+++ b/Source/Service/CacheService/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri May 03 17:15:09 CST 2013
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/Source/Service/CacheService/build-jar.xml b/Source/Service/CacheService/build-jar.xml
new file mode 100644
index 0000000..d7d2680
--- /dev/null
+++ b/Source/Service/CacheService/build-jar.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--classes.jar; src.jar-->
+<project name = "platform-CacheService" default = "build-CacheService-jar" basedir = ".">
+
+ <property file="../../build.properties"/>
+
+ <target name="time">
+ <tstamp>
+ <format property="build.time" pattern="yyyy.MM.dd.HH.mm" locale="en"/>
+ </tstamp>
+ </target>
+
+
+ <target name="build-CacheService-jar" depends="time" description="build CacheService jar">
+ <jar jarfile="${dest.dir}/CacheService.jar" compress="true">
+ <manifest>
+ <attribute name="Built-By" value="${user.name}" />
+ <attribute name="Implementation-Title" value="${ant.project.name}" />
+ <attribute name="Built-Time" value="${build.time}" />
+ <attribute name="platform-version" value="${platform.version}" />
+ </manifest>
+ <fileset dir="${basedir}\bin">
+ <include name="com/vci/**" />
+ <include name="properties/hibernate.map.xml" />
+ <include name="properties/VCICatch**.**" />
+ </fileset>
+ </jar>
+ <copy todir="${service.dir}">
+ <fileset dir="${basedir}/dist">
+ <include name="**.jar" />
+ </fileset>
+ </copy>
+
+
+ </target>
+</project>
\ No newline at end of file
diff --git a/Source/Service/CacheService/build.properties b/Source/Service/CacheService/build.properties
new file mode 100644
index 0000000..c626764
--- /dev/null
+++ b/Source/Service/CacheService/build.properties
@@ -0,0 +1,16 @@
+
+src.dir = ${basedir}/src
+dest.dir=${basedir}/dist
+
+#app.dir=${vci_home}
+
+lib.dir = ${app_home}/lib
+common.dir=${lib.dir}/common
+service.dir=${lib.dir}/service
+client.dir=${lib.dir}/client
+
+grid.app = ${app_home}/../grid/app
+grid.common=${grid.app}/common
+grid.service=${grid.app}/service
+
+platform.version=2024
\ No newline at end of file
diff --git a/Source/Service/CacheService/dist/CacheService.jar b/Source/Service/CacheService/dist/CacheService.jar
new file mode 100644
index 0000000..df6f852
--- /dev/null
+++ b/Source/Service/CacheService/dist/CacheService.jar
Binary files differ
diff --git a/Source/Service/CacheService/properties/ServerWithLog4j.properties b/Source/Service/CacheService/properties/ServerWithLog4j.properties
new file mode 100644
index 0000000..0001fd2
--- /dev/null
+++ b/Source/Service/CacheService/properties/ServerWithLog4j.properties
@@ -0,0 +1,10 @@
+log4j.logger.ServerLog=debug,A1,R
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
+log4j.appender.R=org.apache.log4j.RollingFileAppender
+log4j.appender.R.File=server_log.txt
+log4j.appender.R.MaxFileSize=500KB
+log4j.appender.R.MaxBackupIndex=10
+log4j.appender.R.layout=org.apache.log4j.PatternLayout
+log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
\ No newline at end of file
diff --git a/Source/Service/CacheService/properties/corba.properties b/Source/Service/CacheService/properties/corba.properties
new file mode 100644
index 0000000..ce01ee5
--- /dev/null
+++ b/Source/Service/CacheService/properties/corba.properties
@@ -0,0 +1,16 @@
+#corba.properties version by Eclipse
+#Sat Oct 19 14:06:56 CST 2013
+NameService=corbaloc\:\:localhost\:30000/NameService
+InstanceIdentity=PLT-
+
+#jacorb.net.socket_factory.port.min=29990
+#jacorb.net.socket_factory.port.max=29999
+#jacorb.net.server_socket_factory=org.jacorb.orb.factory.PortRangeServerSocketFactory
+#jacorb.net.server_socket_factory.port.min=30001
+#jacorb.net.server_socket_factory.port.max=30110
+jacorb.retries=0
+jacorb.connection.client.idle_timeout=5000
+jacorb.connection.client.connect_timeout=15000
+jacorb.log.default.verbosity=
+
+
diff --git a/Source/Service/CacheService/properties/hibernate.cfg.xml b/Source/Service/CacheService/properties/hibernate.cfg.xml
new file mode 100644
index 0000000..2adc717
--- /dev/null
+++ b/Source/Service/CacheService/properties/hibernate.cfg.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+<hibernate-configuration>
+ <session-factory>
+ <property name="show_sql">true</property>
+ <property name="dialect">org.hibernate.dialect.OracleDialect</property>
+ <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
+
+ <!--<property name="connection.url">jdbc:oracle:thin:@172.16.0.243:1521:orcl</property>
+ <property name="connection.username">vcimes</property>
+ <property name="connection.password">vcimes</property>-->
+
+ <!--<property name="connection.url">jdbc:oracle:thin:@172.16.0.30:1521:orcl</property>-->
+ <!--<property name="connection.url">jdbc:oracle:thin:@36e78i8710.wicp.vip:48639:orcl</property>-->
+ <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
+ <property name="connection.username">dmc</property>
+ <!--<property name="connection.username">mpm2021</property>-->
+ <!--<property name="connection.username">mes112dev</property>-->
+ <property name="connection.password">vcitest</property>
+ <!--<property name="connection.username">mpm112</property>
+ <property name="connection.password">vcitest</property>-->
+
+ <!--property name="hibernate.connection.release_mode">auto</property -->
+
+ <!-- 璁剧疆C3P0 -->
+ <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
+ <property name="hibernate.c3p0.acquireRetryAttempts">30</property>
+ <property name="hibernate.c3p0.acquireIncrement">2</property>
+ <property name="hibernate.c3p0.checkoutTimeout">30000</property>
+ <property name="hibernate.c3p0.idleConnectionTestPeriod">120</property>
+ <property name="hibernate.c3p0.maxIdleTime">180</property>
+ <property name="hibernate.c3p0.initialPoolSize">3</property>
+ <property name="hibernate.c3p0.maxPoolSize">100</property>
+ <property name="hibernate.c3p0.minPoolSize">1</property>
+ <property name="hibernate.c3p0.maxStatements">100</property>
+ <property name="maxStatementsPerConnection">100</property>
+ <property name="hibernate.current_session_context_class">com.vci.server.mw.SessionContext4JBPM</property>
+ <property name="hibernate.connection.isolation">2</property>
+ <property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
+
+ <!-- Hibernate鐨勬槧灏勯厤缃笉鍦ㄦ湰鏂囦欢涓厤缃紝鑰屾槸鍦ㄧ浉搴旂殑鏈嶅姟jar鏂囦欢涓坊鍔� properties/hibernate.map.xml 鏂囦欢杩涜閰嶇疆 -->
+ </session-factory>
+</hibernate-configuration>
\ No newline at end of file
diff --git a/Source/Service/CacheService/src/com/vci/server/CacheBoxService.java b/Source/Service/CacheService/src/com/vci/server/CacheBoxService.java
new file mode 100644
index 0000000..a0bf750
--- /dev/null
+++ b/Source/Service/CacheService/src/com/vci/server/CacheBoxService.java
@@ -0,0 +1,44 @@
+package com.vci.server;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.cache.CacheServerImpl;
+import com.zeroc.Ice.Communicator;
+import com.zeroc.Ice.Identity;
+import com.zeroc.Ice.ObjectAdapter;
+import com.zeroc.Ice.Util;
+import com.zeroc.IceBox.Service;
+
+public class CacheBoxService implements Service {
+ private static final Logger LOGGER = LoggerFactory.getLogger(CacheBoxService.class);
+ protected ObjectAdapter _adapter;
+ protected Identity id;
+
+ @Override
+ public void start(String name, Communicator communicator, String[] args) {
+ LOGGER.info("start servant: CacheService");
+
+ HibernateSessionFactory.getConfiguration();
+
+ // IceBox
+ // 鍒涘缓objectAdapter锛岃繖閲屽拰service鍚屽悕
+ _adapter = communicator.createObjectAdapter(name);
+ // 鍒涘缓servant
+ com.zeroc.Ice.Object object = new CacheServerImpl();
+ id = Util.stringToIdentity(name);
+ // _adapter.add(object, communicator.stringToIdentity(name));
+ _adapter.add(object, id);
+ // 婵�娲�
+ _adapter.activate();
+ LOGGER.info("start servant success: CacheService");
+ }
+
+ @Override
+ public void stop() {
+ LOGGER.info("CacheService stoped, args");
+ _adapter.destroy();
+ }
+
+}
diff --git a/Source/Service/CacheService/src/com/vci/server/cache/CacheServerImpl.java b/Source/Service/CacheService/src/com/vci/server/cache/CacheServerImpl.java
new file mode 100644
index 0000000..54b4131
--- /dev/null
+++ b/Source/Service/CacheService/src/com/vci/server/cache/CacheServerImpl.java
@@ -0,0 +1,169 @@
+package com.vci.server.cache;
+
+import com.vci.common.ServiceNames;
+import com.vci.corba.cache.CacheService;
+import com.vci.corba.common.VCIError;
+import com.vci.server.BaseService;
+import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.framework.cache.AppConfigDetailCatch;
+import com.vci.server.framework.cache.DeptCacheUtil;
+import com.vci.server.framework.cache.RoleCacheUtil;
+import com.vci.server.framework.cache.UserCacheUtil;
+import com.vci.server.framework.cache.VolumeCatch;
+import com.vci.server.omd.attribpool.cache.APServerCacheUtil;
+import com.vci.server.omd.biztype.cache.BizTypeCacheUtil;
+import com.vci.server.omd.enumtype.cache.EnumServerCacheUtil;
+import com.vci.server.omd.lifecycle.cache.LifeCycleCacheUtil;
+import com.vci.server.omd.linktype.cache.LinkTypeCacheUtil;
+import com.vci.server.omd.statepool.cache.StatePoolServerCacheUtil;
+import com.vci.server.omd.versionrule.cache.VRServerCacheUtil;
+import com.vci.server.portal.cache.ActionCacheUtil;
+import com.vci.server.portal.cache.ActionClsCacheUtil;
+import com.vci.server.portal.cache.ActionParamCacheUtil;
+import com.vci.server.portal.cache.ButtonParamCacheUtil;
+import com.vci.server.portal.cache.ComponentBtnCacheUtil;
+import com.vci.server.portal.cache.ComponentCacheUtil;
+import com.vci.server.portal.cache.PortalVICacheUtil;
+import com.vci.server.portal.cache.TabPageCacheUtil;
+import com.vci.server.portal.cache.UIContextCacheUtil;
+import com.zeroc.Ice.Current;
+
+public class CacheServerImpl extends BaseService implements CacheService{
+
+ public CacheServerImpl() {
+
+ initCatch();
+ }
+
+ /**
+ * 鍒濆鍖栫紦瀛�
+ */
+ private void initCatch() {
+
+ System.out.println();
+ System.out.println("############# Init CacheServerImpl Beign #############");
+ System.out.println();
+
+ HibernateSessionFactory.getSession();
+
+ // 妗嗘灦瀵硅薄缂撳瓨
+ AppConfigDetailCatch.InitCatch();
+ UserCacheUtil.initCache();
+ DeptCacheUtil.initCache();
+ RoleCacheUtil.initCache();
+ VolumeCatch.InitCatch();
+
+ // 閮借タ鏄傛ā鍨嬫暟鎹紦瀛�
+ EnumServerCacheUtil.initCache();
+ APServerCacheUtil.initCache();
+ StatePoolServerCacheUtil.initCache();
+ LifeCycleCacheUtil.initCache();
+ VRServerCacheUtil.initCache();
+ BizTypeCacheUtil.initCache();
+ LinkTypeCacheUtil.initCache();
+
+ // UI瀹氫箟缂撳瓨
+ ActionClsCacheUtil.initCache();
+ ActionCacheUtil.initCache();
+ ActionParamCacheUtil.initCache();
+ ComponentCacheUtil.initCache();
+ ComponentBtnCacheUtil.initCache();
+ ButtonParamCacheUtil.initCache();
+ UIContextCacheUtil.initCache();
+ PortalVICacheUtil.initCache();
+ TabPageCacheUtil.initCache();
+
+ System.out.println();
+ System.out.println("############# Init CacheServerImpl End #############");
+ System.out.println();
+ }
+
+
+ @Override
+ public String getServiceName() {
+ return ServiceNames.CACHESERVICE;
+ }
+
+
+ @Override
+ public boolean resetCache(Current current) throws VCIError {
+ initCatch();
+ return true;
+ }
+
+
+ @Override
+ public void resetTypeCache(String type, Current current) throws VCIError {
+ // TODO Auto-generated method stub
+ switch (type) {
+ case "AppConfig":
+ AppConfigDetailCatch.InitCatch();
+ break;
+ case "User":
+ UserCacheUtil.initCache();
+ break;
+ case "Dept":
+ DeptCacheUtil.initCache();
+ break;
+ case "Role":
+ RoleCacheUtil.initCache();
+ break;
+ case "Volume":
+ VolumeCatch.InitCatch();
+ break;
+
+ case "EnumType":
+ EnumServerCacheUtil.initCache();
+ break;
+ case "Attribute":
+ APServerCacheUtil.initCache();
+ break;
+ case "State":
+ StatePoolServerCacheUtil.initCache();
+ break;
+ case "LifeCycle":
+ LifeCycleCacheUtil.initCache();
+ break;
+ case "VerRule":
+ VRServerCacheUtil.initCache();
+ break;
+ case "BizType":
+ BizTypeCacheUtil.initCache();
+ break;
+ case "LinkType":
+ LinkTypeCacheUtil.initCache();
+ break;
+
+ case "ActionCls":
+ ActionClsCacheUtil.initCache();
+ break;
+ case "Action":
+ ActionCacheUtil.initCache();
+ break;
+ case "ActionParam":
+ ActionParamCacheUtil.initCache();
+ break;
+ case "Comonent":
+ ComponentCacheUtil.initCache();
+ break;
+ case "ComponentBtn":
+ ComponentBtnCacheUtil.initCache();
+ break;
+ case "BtnParam":
+ ButtonParamCacheUtil.initCache();
+ break;
+ case "UIContext":
+ UIContextCacheUtil.initCache();
+ break;
+ case "PortalVI":
+ PortalVICacheUtil.initCache();
+ break;
+ case "TabPage":
+ TabPageCacheUtil.initCache();
+ break;
+ }
+ }
+
+
+
+}
diff --git a/Source/Service/CacheService/src/com/vci/server/cache/delegate/VciCacheServerDelegate.java b/Source/Service/CacheService/src/com/vci/server/cache/delegate/VciCacheServerDelegate.java
new file mode 100644
index 0000000..6f91e4e
--- /dev/null
+++ b/Source/Service/CacheService/src/com/vci/server/cache/delegate/VciCacheServerDelegate.java
@@ -0,0 +1,104 @@
+package com.vci.server.cache.delegate;
+
+import java.util.List;
+
+import com.vci.common.exception.VciExceptionTool;
+import com.vci.corba.common.VCIError;
+import com.vci.server.base.exception.ExceptionLocalHandler;
+import com.vci.server.cache.PLCacheRecordService;
+import com.vci.server.cache.object.PLCacheRecordEnt;
+
+public class VciCacheServerDelegate {
+
+ private static volatile VciCacheServerDelegate instance = null;
+
+ private VciCacheServerDelegate() {
+
+ }
+
+ public static VciCacheServerDelegate getInstance() {
+ if (instance == null) {
+ synchronized(VciCacheServerDelegate.class) {
+ if (instance == null) {
+ instance = new VciCacheServerDelegate();
+ }
+ }
+ }
+
+ return instance;
+ }
+
+ public void resetObjType(String objType) {
+ PLCacheRecordService.getInstance().resetObjType(objType);
+ }
+
+ public List<PLCacheRecordEnt> getPLCacheTempEntityByObjType(String objType) throws VCIError {
+ try {
+ return PLCacheRecordService.getInstance().getCacheRecordByObjType(objType);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ throw this.getLocalVciError("VCICacheService-00001", e);
+ }
+ }
+
+ public List<PLCacheRecordEnt> getPLCacheTempEntityByObjType(String objType, long time) throws VCIError {
+ try {
+ return PLCacheRecordService.getInstance().getCacheRecordByObjType(objType, time);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ throw this.getLocalVciError("VCICacheService-00001", e);
+ }
+ }
+
+ public boolean clearCacheTempEntity() throws VCIError {
+ try {
+ return PLCacheRecordService.getInstance().clearCacheRecord();
+ } catch (Throwable e) {
+ e.printStackTrace();
+ throw this.getLocalVciError("VCICacheService-00002", e);
+ }
+ }
+
+ public boolean clearCacheTempEntityByType(String objType) throws VCIError {
+ try {
+ return PLCacheRecordService.getInstance().deleteHisTemp(objType);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ throw this.getLocalVciError("VCICacheService-00002", e);
+ }
+ }
+
+ public boolean deleteHisTemp(String objType) throws VCIError {
+ try {
+ return PLCacheRecordService.getInstance().deleteHisTemp(objType);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ throw this.getLocalVciError("VCICacheService-00003", e);
+ }
+ }
+
+ public boolean deleteHisTempByIDs(String[] ids) throws VCIError {
+ try {
+ return PLCacheRecordService.getInstance().deleteHisTempByIDs(ids);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ throw this.getLocalVciError("VCICacheService-00003", e);
+ }
+ }
+
+
+ private VCIError getLocalVciError(String key, Throwable e) {
+ VCIError error = new VCIError(key, new String[]{VciExceptionTool.getExceptionStr(e), VciExceptionTool.getExceptionDetail(e)});
+ VCIError rsError = ExceptionLocalHandler.getInstance().getLocalString(error, "VCICacheService");
+ return rsError;
+ }
+
+ public long getDataBaseCurrtenttime() throws VCIError {
+ try {
+ return PLCacheRecordService.getInstance().getDataBaseCurrtenttime();
+ } catch (Throwable e) {
+ e.printStackTrace();
+ throw this.getLocalVciError("VCICacheService-00001", e);
+ }
+ }
+}
diff --git a/Source/Service/CacheService/src/properties/ServerWithLog4j.properties b/Source/Service/CacheService/src/properties/ServerWithLog4j.properties
new file mode 100644
index 0000000..144efab
--- /dev/null
+++ b/Source/Service/CacheService/src/properties/ServerWithLog4j.properties
@@ -0,0 +1,10 @@
+log4j.logger.ServerLog=WARN,A1,R
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] [%c] %3x - %m%n
+log4j.appender.R=org.apache.log4j.RollingFileAppender
+log4j.appender.R.File=server_log.txt
+log4j.appender.R.MaxFileSize=5MB
+log4j.appender.R.MaxBackupIndex=10
+log4j.appender.R.layout=org.apache.log4j.PatternLayout
+log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
\ No newline at end of file
diff --git a/Source/Service/CacheService/src/properties/VCICacheService.properties b/Source/Service/CacheService/src/properties/VCICacheService.properties
new file mode 100644
index 0000000..99862d1
--- /dev/null
+++ b/Source/Service/CacheService/src/properties/VCICacheService.properties
@@ -0,0 +1,3 @@
+VCICacheService-00001=\u8BFB\u53D6\u7F13\u5B58\u660E\u7EC6\u4FE1\u606F\u51FA\u9519\uFF0C\u3002{0}
+VCICacheService-00002=\u6E05\u7A7A\u7F13\u5B58\u6570\u636E\u5E93\u8868\u51FA\u9519\uFF01{0}
+VCICacheService-00003=\u5220\u9664\u6307\u5B9A\u7C7B\u578B\u4E0B\u7F13\u5B58\u6570\u636E\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u5220\u9664\u3002{0}
\ No newline at end of file
diff --git a/Source/Service/CacheService/src/properties/VCICacheService_zh.properties b/Source/Service/CacheService/src/properties/VCICacheService_zh.properties
new file mode 100644
index 0000000..99862d1
--- /dev/null
+++ b/Source/Service/CacheService/src/properties/VCICacheService_zh.properties
@@ -0,0 +1,3 @@
+VCICacheService-00001=\u8BFB\u53D6\u7F13\u5B58\u660E\u7EC6\u4FE1\u606F\u51FA\u9519\uFF0C\u3002{0}
+VCICacheService-00002=\u6E05\u7A7A\u7F13\u5B58\u6570\u636E\u5E93\u8868\u51FA\u9519\uFF01{0}
+VCICacheService-00003=\u5220\u9664\u6307\u5B9A\u7C7B\u578B\u4E0B\u7F13\u5B58\u6570\u636E\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u5220\u9664\u3002{0}
\ No newline at end of file
diff --git a/Source/Service/CacheService/src/properties/VCICacheService_zhNative.properties b/Source/Service/CacheService/src/properties/VCICacheService_zhNative.properties
new file mode 100644
index 0000000..99862d1
--- /dev/null
+++ b/Source/Service/CacheService/src/properties/VCICacheService_zhNative.properties
@@ -0,0 +1,3 @@
+VCICacheService-00001=\u8BFB\u53D6\u7F13\u5B58\u660E\u7EC6\u4FE1\u606F\u51FA\u9519\uFF0C\u3002{0}
+VCICacheService-00002=\u6E05\u7A7A\u7F13\u5B58\u6570\u636E\u5E93\u8868\u51FA\u9519\uFF01{0}
+VCICacheService-00003=\u5220\u9664\u6307\u5B9A\u7C7B\u578B\u4E0B\u7F13\u5B58\u6570\u636E\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u5220\u9664\u3002{0}
\ No newline at end of file
diff --git a/Source/Service/CacheService/src/properties/VolumnWithLog4j.properties b/Source/Service/CacheService/src/properties/VolumnWithLog4j.properties
new file mode 100644
index 0000000..1d691f7
--- /dev/null
+++ b/Source/Service/CacheService/src/properties/VolumnWithLog4j.properties
@@ -0,0 +1,12 @@
+log4j.logger.VolumnLog=WARN,A,R
+log4j.appender.A=org.apache.log4j.ConsoleAppender
+log4j.appender.A.layout=org.apache.log4j.PatternLayout
+log4j.appender.A.layout.ConversionPattern=%-4r %-5p [%t] [%c] %3x - %m%n
+log4j.appender.R=org.apache.log4j.RollingFileAppender
+log4j.appender.R.File=./logs/volumn.log
+log4j.appender.R.DataPattern='_'yyyy-MM-dd'.log'
+log4j.appender.R.Append=true
+log4j.appender.R.MaxFileSize=5MB
+log4j.appender.R.MaxBackupIndex=10
+log4j.appender.R.layout=org.apache.log4j.PatternLayout
+log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %-4r [%t] [%c] [%p] %3x - %m%n
\ No newline at end of file
diff --git a/Source/Service/CacheService/src/properties/hibernate.map.xml b/Source/Service/CacheService/src/properties/hibernate.map.xml
new file mode 100644
index 0000000..aba91ac
--- /dev/null
+++ b/Source/Service/CacheService/src/properties/hibernate.map.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<hbmfiles>
+ <!-- framework鏄犲皠鏂囦欢 -->
+ <mapping resource="com/vci/server/framework/hbm/AppConfigCategory.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/AppConfigDetail.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/Combination.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/CombinationValue.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/Department.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/Role.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/User.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/Function.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/Operate.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/RoleRight.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/PasswordStrategy.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/UserLogon.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/SystemCfg.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/SpecialChar.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/SpecialCharClfy.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/MachSecurity.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/Pvolume.hbm.xml"/>
+ <!-- QT鏄犲皠鏂囦欢 -->
+ <mapping resource="com/vci/server/omd/qt/hbm/QT.hbm.xml"/>
+ <!-- portal_START-->
+ <mapping resource="com/vci/server/portal/hbm/PLActionClsEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PLActionParamEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PLTypeActionEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PortalVIEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PLActionEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PLUILayoutEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PLTabPageEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PLTabButtonEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PLCommandParameterEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PLPageDefinationEntity.hbm.xml"/>
+</hbmfiles>
\ No newline at end of file
diff --git a/Source/Service/FrameService/.classpath b/Source/Service/FrameService/.classpath
index 5d98c3c..61afe98 100644
--- a/Source/Service/FrameService/.classpath
+++ b/Source/Service/FrameService/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry excluding="com/vci/server/framework/delegate/SpecialRoleDelegate.java|com/vci/server/framework/systemConfig/specialRole/|com/vci/server/FrameServiceMain.java|com/vci/server/common/PinyinCommon.java|com/vci/server/framework/systemConfig/log/LogAutoControlUtil.java|com/vci/server/framework/volume/VolumeManagerImpl.java|com/vci/server/VolumeFactoryBoxService.java" kind="src" path="src"/>
+ <classpathentry excluding="com/vci/server/framework/delegate/SpecialRoleDelegate.java|com/vci/server/framework/systemConfig/specialRole/|com/vci/server/common/PinyinCommon.java|com/vci/server/framework/systemConfig/log/LogAutoControlUtil.java|com/vci/server/framework/volume/VolumeManagerImpl.java|com/vci/server/VolumeFactoryBoxService.java|com/vci/server/framework/systemConfig/log/Log.java|com/vci/server/framework/systemConfig/log/LogDAO.java|com/vci/server/framework/systemConfig/log/LogDAOImpl.java|com/vci/server/framework/systemConfig/log/LogPeriod.java|com/vci/server/framework/systemConfig/log/LogRecordUtil.java|com/vci/server/framework/systemConfig/log/LogService.java|com/vci/server/framework/delegate/LogManagementDelegate.java" kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry combineaccessrules="false" kind="src" path="/PLTCommon"/>
<classpathentry combineaccessrules="false" kind="src" path="/ServiceBase"/>
diff --git a/Source/Service/FrameService/build-jar.xml b/Source/Service/FrameService/build-jar.xml
index 5d88d55..5dbf735 100644
--- a/Source/Service/FrameService/build-jar.xml
+++ b/Source/Service/FrameService/build-jar.xml
@@ -2,7 +2,7 @@
<!--classes.jar; src.jar-->
<project name = "platform-FrameService" default = "build-FrameService-jar" basedir = ".">
- <property file="build.properties"/>
+ <property file="../../build.properties"/>
<target name="time">
<tstamp>
@@ -30,5 +30,7 @@
<include name="**.jar" />
</fileset>
</copy>
+
+
</target>
</project>
\ No newline at end of file
diff --git a/Source/Service/FrameService/build.properties b/Source/Service/FrameService/build.properties
index 4f8a188..c626764 100644
--- a/Source/Service/FrameService/build.properties
+++ b/Source/Service/FrameService/build.properties
@@ -9,4 +9,8 @@
service.dir=${lib.dir}/service
client.dir=${lib.dir}/client
+grid.app = ${app_home}/../grid/app
+grid.common=${grid.app}/common
+grid.service=${grid.app}/service
+
platform.version=2024
\ No newline at end of file
diff --git a/Source/Service/FrameService/dist/FrameService.jar b/Source/Service/FrameService/dist/FrameService.jar
index 75783a6..fcdfd6e 100644
--- a/Source/Service/FrameService/dist/FrameService.jar
+++ b/Source/Service/FrameService/dist/FrameService.jar
Binary files differ
diff --git a/Source/Service/FrameService/src/com/vci/server/FrameBoxService.java b/Source/Service/FrameService/src/com/vci/server/FrameBoxService.java
index 404bc67..65a0bdd 100644
--- a/Source/Service/FrameService/src/com/vci/server/FrameBoxService.java
+++ b/Source/Service/FrameService/src/com/vci/server/FrameBoxService.java
@@ -1,9 +1,11 @@
package com.vci.server;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+import com.vci.server.base.log.PltLogger;
+import com.vci.server.base.persistence.dao.HibernateSessionFactory;
import com.vci.server.framework.FrameworkServiceImpl;
+import com.vci.server.mw.ServerContextInterceptor;
import com.zeroc.Ice.Communicator;
import com.zeroc.Ice.Identity;
import com.zeroc.Ice.ObjectAdapter;
@@ -11,24 +13,27 @@
import com.zeroc.IceBox.Service;
public class FrameBoxService implements Service {
- private static final Logger LOGGER = LoggerFactory.getLogger(FrameBoxService.class);
+ //private static final Logger LOGGER = LoggerFactory.getLogger(FrameBoxService.class);
+ private static final PltLogger LOGGER = new PltLogger(FrameBoxService.class.getName());
protected ObjectAdapter _adapter;
protected Identity id;
@Override
public void start(String name, Communicator communicator, String[] args) {
- LOGGER.info("start servant: FrameworkService");
+ LOGGER.info("start servant: " + name);
+
+ HibernateSessionFactory.getConfiguration();
+
// IceBox
+ Util.setProcessLogger(LOGGER);
// 鍒涘缓objectAdapter锛岃繖閲屽拰service鍚屽悕
_adapter = communicator.createObjectAdapter(name);
// 鍒涘缓servant
com.zeroc.Ice.Object object = new FrameworkServiceImpl();
- id = Util.stringToIdentity(name);
- // _adapter.add(object, communicator.stringToIdentity(name));
- _adapter.add(object, id);
+ _adapter.add(new ServerContextInterceptor(object), Util.stringToIdentity(name));
// 婵�娲�
_adapter.activate();
- LOGGER.info("start servant success: FrameworkService");
+ LOGGER.info("start servant success: " + name);
}
@Override
diff --git a/Source/Service/FrameService/src/com/vci/server/FrameServiceMain.java b/Source/Service/FrameService/src/com/vci/server/FrameServiceMain.java
new file mode 100644
index 0000000..0301c78
--- /dev/null
+++ b/Source/Service/FrameService/src/com/vci/server/FrameServiceMain.java
@@ -0,0 +1,10 @@
+package com.vci.server;
+
+
+public class FrameServiceMain {
+
+ public static void main(String[] args) {
+
+ }
+
+}
diff --git a/Source/Service/FrameService/src/com/vci/server/framework/FrameworkServiceImpl.java b/Source/Service/FrameService/src/com/vci/server/framework/FrameworkServiceImpl.java
index 92ed536..a8da329 100644
--- a/Source/Service/FrameService/src/com/vci/server/framework/FrameworkServiceImpl.java
+++ b/Source/Service/FrameService/src/com/vci/server/framework/FrameworkServiceImpl.java
@@ -1,6 +1,7 @@
package com.vci.server.framework;
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
import com.vci.common.ServiceNames;
@@ -17,8 +18,6 @@
import com.vci.corba.framework.data.DeptInfo;
import com.vci.corba.framework.data.FuncOperationInfo;
import com.vci.corba.framework.data.FunctionInfo;
-import com.vci.corba.framework.data.LogInfo;
-import com.vci.corba.framework.data.LogPeriodInfo;
import com.vci.corba.framework.data.MachSecurityInfo;
import com.vci.corba.framework.data.OperateInfo;
import com.vci.corba.framework.data.PasswordStrategyInfo;
@@ -27,31 +26,23 @@
import com.vci.corba.framework.data.RoleRightInfo;
import com.vci.corba.framework.data.SpecialCharClsfInfo;
import com.vci.corba.framework.data.SpecialCharInfo;
-//import com.vci.corba.framework.data.SpecialRoleInfo;
import com.vci.corba.framework.data.SpecialtyInfo;
-import com.vci.corba.framework.data.SystemCfgInfo;
import com.vci.corba.common.data.UserEntityInfo;
import com.vci.corba.framework.data.UserInfo;
import com.vci.corba.framework.data.UserLogonInfo;
-import com.vci.corba.framework.method.FrameworkService;
+import com.vci.corba.framework.FrameworkService;
import com.vci.server.BaseService;
import com.vci.corba.framework.data.CheckValue;
import com.vci.corba.framework.data.GrandValue;
-import com.vci.server.framework.appConfig.AppConfigDetailCatch;
-import com.vci.server.framework.cache.DeptCacheUtil;
-import com.vci.server.framework.cache.RoleCacheUtil;
-import com.vci.server.framework.cache.UserCacheUtil;
import com.vci.server.framework.delegate.AppConfigCategoryDelegate;
import com.vci.server.framework.delegate.AppConfigDetailDelegate;
import com.vci.server.framework.delegate.DataTypeRightDelegate;
import com.vci.server.framework.delegate.FuncOperationDelegate;
import com.vci.server.framework.delegate.FunctionDelegate;
-import com.vci.server.framework.delegate.LogManagementDelegate;
import com.vci.server.framework.delegate.MachSecurityDelegate;
import com.vci.server.framework.delegate.OperateDelegate;
import com.vci.server.framework.delegate.RightManagementDelegate;
import com.vci.server.framework.delegate.RoleRightDelegate;
-//import com.vci.server.framework.delegate.SpecialRoleDelegate;
import com.vci.server.framework.delegate.SystemCfgDelegate;
import com.vci.server.framework.volume.delegate.PvolumeDelegate;
import com.zeroc.Ice.Current;
@@ -69,10 +60,10 @@
private RightManagementDelegate rightmanagementDelegate = new RightManagementDelegate(); //鏉冮檺鐨刣elegate
public FrameworkServiceImpl() {
- AppConfigDetailCatch.InitCatch();
- UserCacheUtil.initCache();
- DeptCacheUtil.initCache();
- RoleCacheUtil.initCache();
+// AppConfigDetailCatch.InitCatch();
+// UserCacheUtil.initCache();
+// DeptCacheUtil.initCache();
+// RoleCacheUtil.initCache();
}
@@ -84,6 +75,11 @@
@Override
public boolean test(com.zeroc.Ice.Current current) {
+ String op = current.operation;
+ String adapter = current.adapter.getName();
+ String id = current.id.name;
+ String time = new Date().toString();
+ System.out.println(String.format("== %s [FrameworkService.test] (adapter=%s, id=%s, op=%s)", time, adapter, id, op));
return true;
}
@@ -119,59 +115,59 @@
}
- /*-------------------鏃ュ織绠$悊妯″潡---------------------*/
-
- /**
- * 鍒濆鍖栨棩蹇楁ā鍧楁椂妫�鏌ユ槸鍚﹂厤缃簡鑷姩鍒犻櫎
- */
- @Override
- public boolean getIsAutoDelete(com.zeroc.Ice.Current current) throws VCIError {
- LogManagementDelegate logDel = new LogManagementDelegate();
- boolean res = false;
- res = logDel.getIsAutoDelete();
- return res;
- }
-
-
-
- /**
- * 鑾峰彇閰嶇疆濂界殑鏃ュ織鏌ヨ椤甸潰鏄剧ず鏉℃暟
- */
- @Override
- public long getPageSize(com.zeroc.Ice.Current current) throws VCIError {
- LogManagementDelegate logDel = new LogManagementDelegate();
- return logDel.getPageSize();
- }
-
- /**
- * 鑾峰彇褰撳墠鏌ヨ鏃ュ織鐨勬�绘潯锟�?
- */
- @Override
- public long getSumLogRows(String sql, com.zeroc.Ice.Current current) throws VCIError {
- LogManagementDelegate logDel = new LogManagementDelegate();
- return logDel.getSumLogRows(sql);
- }
-
-
-
- /**
- * 鑾峰彇褰撳墠淇濆瓨/澶囦唤鏈熼檺
- */
- @Override
- public long getCurPeriod(String type, com.zeroc.Ice.Current current) throws VCIError {
- LogManagementDelegate logDel = new LogManagementDelegate();
- return logDel.getCurPeriod(type);
- }
-
- /**
- * 鎵嬪姩鍒犻櫎鏃ュ織
- */
- @Override
- public boolean deleteLog(String deleteDate, com.zeroc.Ice.Current current) throws VCIError {
- LogManagementDelegate logDel = new LogManagementDelegate();
- return logDel.deleteLog(deleteDate);
- }
-
+// /*-------------------鏃ュ織绠$悊妯″潡---------------------*/
+//
+// /**
+// * 鍒濆鍖栨棩蹇楁ā鍧楁椂妫�鏌ユ槸鍚﹂厤缃簡鑷姩鍒犻櫎
+// */
+// @Override
+// public boolean getIsAutoDelete(com.zeroc.Ice.Current current) throws VCIError {
+// LogManagementDelegate logDel = new LogManagementDelegate();
+// boolean res = false;
+// res = logDel.getIsAutoDelete();
+// return res;
+// }
+//
+//
+//
+// /**
+// * 鑾峰彇閰嶇疆濂界殑鏃ュ織鏌ヨ椤甸潰鏄剧ず鏉℃暟
+// */
+// @Override
+// public long getPageSize(com.zeroc.Ice.Current current) throws VCIError {
+// LogManagementDelegate logDel = new LogManagementDelegate();
+// return logDel.getPageSize();
+// }
+//
+// /**
+// * 鑾峰彇褰撳墠鏌ヨ鏃ュ織鐨勬�绘潯锟�?
+// */
+// @Override
+// public long getSumLogRows(String sql, com.zeroc.Ice.Current current) throws VCIError {
+// LogManagementDelegate logDel = new LogManagementDelegate();
+// return logDel.getSumLogRows(sql);
+// }
+//
+//
+//
+// /**
+// * 鑾峰彇褰撳墠淇濆瓨/澶囦唤鏈熼檺
+// */
+// @Override
+// public long getCurPeriod(String type, com.zeroc.Ice.Current current) throws VCIError {
+// LogManagementDelegate logDel = new LogManagementDelegate();
+// return logDel.getCurPeriod(type);
+// }
+//
+// /**
+// * 鎵嬪姩鍒犻櫎鏃ュ織
+// */
+// @Override
+// public boolean deleteLog(String deleteDate, com.zeroc.Ice.Current current) throws VCIError {
+// LogManagementDelegate logDel = new LogManagementDelegate();
+// return logDel.deleteLog(deleteDate);
+// }
+//
/**
@@ -836,33 +832,33 @@
public void deblock(String[] ids,UserEntityInfo userEntityInfo, com.zeroc.Ice.Current current) throws VCIError {
rightmanagementDelegate.deblock(ids,userEntityInfo);
}
+//
+// @Override
+// public LogPeriodInfo[] getPeriods(com.zeroc.Ice.Current current) throws VCIError {
+// LogManagementDelegate logDel = new LogManagementDelegate();
+// return logDel.getPeriods();
+// }
- @Override
- public LogPeriodInfo[] getPeriods(com.zeroc.Ice.Current current) throws VCIError {
- LogManagementDelegate logDel = new LogManagementDelegate();
- return logDel.getPeriods();
- }
-
- @Override
- public LogInfo[] fetchLogInfo(long pageNo, long pagesize, String sql, com.zeroc.Ice.Current current)
- throws VCIError {
- LogManagementDelegate logDel = new LogManagementDelegate();
- return logDel.fetchLogInfo((int)pageNo,(int)pagesize,sql);
- }
-
- @Override
- public LogInfo[] getLogListByContion(long pageNo, long pagesize, String sql, com.zeroc.Ice.Current current)
- throws VCIError {
- LogManagementDelegate logDelegate = new LogManagementDelegate();
- return logDelegate.getLogListByContion((int)pageNo,(int)pagesize,sql);
- }
-
- @Override
- public boolean savePeriod(SystemCfgInfo period,
- UserEntityInfo userEntityInfo, com.zeroc.Ice.Current current) throws VCIError {
- LogManagementDelegate logDelegate = new LogManagementDelegate();
- return logDelegate.savePeriod(period,userEntityInfo);
- }
+// @Override
+// public LogInfo[] fetchLogInfo(long pageNo, long pagesize, String sql, com.zeroc.Ice.Current current)
+// throws VCIError {
+// LogManagementDelegate logDel = new LogManagementDelegate();
+// return logDel.fetchLogInfo((int)pageNo,(int)pagesize,sql);
+// }
+//
+// @Override
+// public LogInfo[] getLogListByContion(long pageNo, long pagesize, String sql, com.zeroc.Ice.Current current)
+// throws VCIError {
+// LogManagementDelegate logDelegate = new LogManagementDelegate();
+// return logDelegate.getLogListByContion((int)pageNo,(int)pagesize,sql);
+// }
+//
+// @Override
+// public boolean savePeriod(SystemCfgInfo period,
+// UserEntityInfo userEntityInfo, com.zeroc.Ice.Current current) throws VCIError {
+// LogManagementDelegate logDelegate = new LogManagementDelegate();
+// return logDelegate.savePeriod(period,userEntityInfo);
+// }
@Override
public OperateInfo fetchOperateTypeByName(String name, com.zeroc.Ice.Current current) throws VCIError {
@@ -879,21 +875,21 @@
return rightmanagementDelegate.getRoleListByTypeForMeasure(type);
}
- @Override
- public void savelog(String message, UserEntityInfo userEntityInfo, com.zeroc.Ice.Current current) throws VCIError {
- rightmanagementDelegate.savelog(message, userEntityInfo);
- }
- @Override
- public void saveLogV2(String result, String message, String type, short logTypeIntVal, String dataObjOid, UserEntityInfo userEntityInfo, com.zeroc.Ice.Current current) throws VCIError {
- rightmanagementDelegate.saveLogV2(result, message, type, logTypeIntVal, dataObjOid, userEntityInfo);
- }
-
- @Override
- public void savelogfail(String message, UserEntityInfo userEntityInfo, com.zeroc.Ice.Current current)
- throws VCIError {
- rightmanagementDelegate.savelogfail(message, userEntityInfo);
-
- }
+// @Override
+// public void savelog(String message, UserEntityInfo userEntityInfo, com.zeroc.Ice.Current current) throws VCIError {
+// rightmanagementDelegate.savelog(message, userEntityInfo);
+// }
+// @Override
+// public void saveLogV2(String result, String message, String type, short logTypeIntVal, String dataObjOid, UserEntityInfo userEntityInfo, com.zeroc.Ice.Current current) throws VCIError {
+// rightmanagementDelegate.saveLogV2(result, message, type, logTypeIntVal, dataObjOid, userEntityInfo);
+// }
+//
+// @Override
+// public void savelogfail(String message, UserEntityInfo userEntityInfo, com.zeroc.Ice.Current current)
+// throws VCIError {
+// rightmanagementDelegate.savelogfail(message, userEntityInfo);
+//
+// }
@Override
public RoleInfo[] fetchRoleInfoByUserNameAndPage(long pageNo, long pageSize,
@@ -1285,13 +1281,13 @@
}
return true;
}
- @Override
- public void blocklog(String userId, UserEntityInfo userEntityInfo, com.zeroc.Ice.Current current)
- throws VCIError {
- rightmanagementDelegate.blocklog(userId, userEntityInfo);
- // TODO Auto-generated method stub
-
- }
+// @Override
+// public void blocklog(String userId, UserEntityInfo userEntityInfo, com.zeroc.Ice.Current current)
+// throws VCIError {
+// rightmanagementDelegate.blocklog(userId, userEntityInfo);
+// // TODO Auto-generated method stub
+//
+// }
@Override
public UserInfo[] fetchUserInfoByConditionUnited(String searchName,
diff --git a/Source/Service/FrameService/src/com/vci/server/framework/cache/AppConfigDetailCatch.java b/Source/Service/FrameService/src/com/vci/server/framework/cache/AppConfigDetailCatch.java
new file mode 100644
index 0000000..ace9aa4
--- /dev/null
+++ b/Source/Service/FrameService/src/com/vci/server/framework/cache/AppConfigDetailCatch.java
@@ -0,0 +1,172 @@
+package com.vci.server.framework.cache;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.HibernateException;
+
+import com.alibaba.fastjson.JSONObject;
+import com.vci.corba.framework.data.AppConfigDetailInfo;
+import com.vci.server.base.persistence.dao.HibernateCallback;
+import com.vci.server.base.persistence.dao.HibernateTemplate;
+import com.vci.server.cache.CacheNames;
+import com.vci.server.cache.redis.RedisUtil;
+import com.vci.server.framework.appConfig.AppConfigDetail;
+import com.vci.server.framework.appConfig.AppConfigDetailDaoImpl;
+import com.vci.server.framework.appConfig.AppConfigUtils;
+
+public final class AppConfigDetailCatch {//extends BaseCacheTimer {
+
+ public synchronized static void refreshCache() {
+ clearCatch();
+ InitCatch();
+ }
+
+
+ public synchronized static void InitCatch()
+ {
+ clearCatch();
+
+ List<AppConfigDetail> lstDetail = instalGetAppConfigDetails();
+ for (AppConfigDetail item : lstDetail){
+ setAppConfig(AppConfigUtils.convertConfigToConfigInfo(item));
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private static List<AppConfigDetail> instalGetAppConfigDetails(){
+ return (List<AppConfigDetail>)new HibernateTemplate().run(new HibernateCallback(){
+ public Object execute() throws HibernateException {
+ AppConfigDetailDaoImpl impl = new AppConfigDetailDaoImpl();
+ return impl.loadAll();
+ }
+ });
+ }
+
+ public synchronized static void clearCatch(){
+ RedisUtil.getInstance().del(CacheNames.APPCONFIGS);
+ }
+
+ public static void setAppConfig(AppConfigDetailInfo item) {
+
+ String jsonObj = JSONObject.toJSONString(item);
+
+ RedisUtil.getInstance().hset(CacheNames.APPCONFIGS, item.key.toLowerCase(), jsonObj);
+ RedisUtil.getInstance().hset(CacheNames.APPCONFIGS, "MAP-" + item.id.toLowerCase(), item.key);
+ }
+
+
+ public static void delConfig(String key) {
+ if (StringUtils.isBlank(key))
+ return;
+
+ RedisUtil.getInstance().hdel(CacheNames.APPCONFIGS, key.toLowerCase());
+ }
+
+ public static void delConfigById(String id) {
+ if (StringUtils.isBlank(id))
+ return;
+
+ String key = RedisUtil.getInstance().hget(CacheNames.APPCONFIGS, "MAP-" + id.toLowerCase());
+
+ RedisUtil.getInstance().hdel(CacheNames.APPCONFIGS, "MAP-" + id.toLowerCase());
+ if (StringUtils.isBlank(key))
+ return;
+
+ RedisUtil.getInstance().hdel(CacheNames.APPCONFIGS, key.toLowerCase());
+ }
+// /**
+// * 杩斿洖鍏ㄩ儴鐨� AppConfigDetail 瀵硅薄
+// */
+// public List<AppConfigDetail> getAppConfigDetails(){
+// refreshCache();
+//
+// return _lstDetail;
+// }
+
+// /**
+// * 鏍规嵁 ID 杩斿洖 AppConfigDetail 瀵硅薄
+// * @param ids AppConfigDetail 瀵硅薄鐨� ID 鍒楄〃
+// */
+// public synchronized AppConfigDetail getAppConfigDetailById(final String id){
+// refreshCache();
+//
+// if (_mapId2Detail.containsKey(id))
+// return _mapId2Detail.get(id);
+//
+// return null;
+// }
+//
+// /**
+// * 鏍规嵁涓婚敭鑾峰彇AppConfigDetail
+// * @param key
+// * @return
+// */
+// public AppConfigDetail getAppConfigDetailByKey(final String key){
+// refreshCache();
+//
+// if (_mapKey2Detail.containsKey(key))
+// return _mapKey2Detail.get(key);
+//
+// return null;
+// }
+//
+// public List<AppConfigDetail> getAppConfigDetailsByIds(final String[] clsfIds){
+// refreshCache();
+//
+// List<String> lstId = Arrays.asList(clsfIds);
+//
+// List<AppConfigDetail> list = new ArrayList<AppConfigDetail>();
+// for (AppConfigDetail item : _lstDetail){
+// if (lstId.contains(item.getCategoryId())){
+// list.add(item);
+// }
+// }
+//
+// return list;
+// }
+//
+// public List<AppConfigDetail> getAppConfigDetailsByCatId(final String clsfId){
+// refreshCache();
+//
+// List<AppConfigDetail> list = new ArrayList<AppConfigDetail>();
+// for (AppConfigDetail item : _lstDetail){
+// if (item.getCategoryId().equals(clsfId)){
+// list.add(item);
+// }
+// }
+//
+// return list;
+// }
+//
+// public List<AppConfigDetail> getAppConfigDetailsByCategory(final String catName){
+// refreshCache();
+//
+// AppConfigCategoryService catSrv = new AppConfigCategoryService(new UserEntity());
+// AppConfigCategory cat = catSrv.getAppConfigCategoryByName(catName);
+// if (cat == null)
+// return new ArrayList<AppConfigDetail>();
+//
+// List<AppConfigDetail> list = new ArrayList<AppConfigDetail>();
+// for (AppConfigDetail item : _lstDetail){
+// if (item.getCategoryId().equals(cat.getId())){
+// list.add(item);
+// }
+// }
+//
+// return list;
+// }
+//
+// public List<AppConfigDetail> getAppConfigDetailsByName(final String name){
+// refreshCache();
+//
+// List<AppConfigDetail> list = new ArrayList<AppConfigDetail>();
+// for (AppConfigDetail item : _lstDetail){
+// if (item.getName().equals(name)){
+// list.add(item);
+// }
+// }
+//
+// return list;
+// }
+}
diff --git a/Source/Service/FrameService/src/com/vci/server/framework/cache/VolumeCatch.java b/Source/Service/FrameService/src/com/vci/server/framework/cache/VolumeCatch.java
new file mode 100644
index 0000000..47f7dc3
--- /dev/null
+++ b/Source/Service/FrameService/src/com/vci/server/framework/cache/VolumeCatch.java
@@ -0,0 +1,106 @@
+package com.vci.server.framework.cache;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.HibernateException;
+
+import com.alibaba.fastjson.JSONObject;
+import com.vci.common.log.ServerWithLog4j;
+import com.vci.corba.framework.data.PvolumeInfo;
+import com.vci.server.base.persistence.dao.HibernateCallback;
+import com.vci.server.base.persistence.dao.HibernateTemplate;
+import com.vci.server.cache.CacheNames;
+import com.vci.server.cache.VolumeCacheProvider;
+import com.vci.server.cache.redis.RedisUtil;
+import com.vci.server.framework.volume.dao.Pvolume;
+import com.vci.server.framework.volume.dao.PvolumeDaoImp;
+
+
+public class VolumeCatch {
+ private static VolumeCatch _instance = null;
+//
+// private static String CACHENAME = "VOLUME";
+//
+ private static VolumeCatch getInstance(){
+ if (_instance == null){
+ _instance = new VolumeCatch();
+ }
+
+ return _instance;
+ }
+
+//
+// private VolumeCatch(){
+// super(CACHENAME);
+// InitCatch();
+// }
+
+
+ public synchronized static void InitCatch()
+ {
+ clearCatch();
+
+ getInstance().InitVolumes();
+ }
+
+
+ public static void clearCatch() {
+ RedisUtil.getInstance().del(CacheNames.VOLUMES);
+ }
+
+// public synchronized static void refreshCache() {
+// try {
+// clearCatch();
+// InitCatch();
+// }catch (Throwable e) {
+// ServerWithLog4j.logger.error("VolumeCatch-refreshCache", e);
+// //throw getLocalVciError("P0010PLMAP-00012", e);
+// }
+// }
+
+ public static void setVolume(PvolumeInfo item) {
+ if (item == null)
+ return;
+
+ String jsonObj = JSONObject.toJSONString(item);
+
+ RedisUtil.getInstance().hset(CacheNames.VOLUMES, item.name.toLowerCase(), jsonObj);
+ }
+
+
+ public static void delVolume(String vol) {
+ if (StringUtils.isBlank(vol))
+ return;
+
+ RedisUtil.getInstance().hdel(CacheNames.VOLUMES, vol.toLowerCase());
+ }
+
+
+ @SuppressWarnings("unchecked")
+ private void InitVolumes() {
+ List<Pvolume> lstVolume = (List<Pvolume>) new HibernateTemplate().run(new HibernateCallback() {
+ public Object execute() throws HibernateException {
+ PvolumeDaoImp impl = new PvolumeDaoImp();
+ String hsql = "from Pvolume p order by p.name";
+ return impl.findEntities(hsql);
+ }
+ });
+
+ for (Pvolume item : lstVolume){
+ setVolume(changePvolumeToPvolumeInfo(item));
+ }
+ }
+
+ private PvolumeInfo changePvolumeToPvolumeInfo(Pvolume pvolume) {
+ PvolumeInfo pvoInfo = new PvolumeInfo();
+ pvoInfo.id = pvolume.getId() == null ? "" : pvolume.getId();
+ pvoInfo.name = pvolume.getName() == null ? "" : pvolume.getName();
+ pvoInfo.service = pvolume.getService() == null ? "" : pvolume.getService();
+ pvoInfo.host = pvolume.getHost() == null ? "" : pvolume.getHost();
+ pvoInfo.type = (short)(pvolume.getType() == 0 ? 0 : 1);
+ pvoInfo.path = pvolume.getPath() == null ? "" : pvolume.getPath();
+ pvoInfo.isvalid = pvolume.getIsvalid();
+ return pvoInfo;
+ }
+}
diff --git a/Source/Service/FrameService/src/com/vci/server/framework/delegate/AppConfigDetailDelegate.java b/Source/Service/FrameService/src/com/vci/server/framework/delegate/AppConfigDetailDelegate.java
index e170178..80da78a 100644
--- a/Source/Service/FrameService/src/com/vci/server/framework/delegate/AppConfigDetailDelegate.java
+++ b/Source/Service/FrameService/src/com/vci/server/framework/delegate/AppConfigDetailDelegate.java
@@ -15,9 +15,9 @@
import com.vci.server.framework.appConfig.AppConfigCategory;
import com.vci.server.framework.appConfig.AppConfigCategoryService;
import com.vci.server.framework.appConfig.AppConfigDetail;
-import com.vci.server.framework.appConfig.AppConfigDetailCatch;
import com.vci.server.framework.appConfig.AppConfigDetailService;
import com.vci.server.framework.appConfig.AppConfigUtils;
+import com.vci.server.framework.cache.AppConfigDetailCatch;
/**
* AppConfigDetail Delegate Server
*
diff --git a/Source/Service/FrameService/src/com/vci/server/framework/delegate/MachSecurityDelegate.java b/Source/Service/FrameService/src/com/vci/server/framework/delegate/MachSecurityDelegate.java
index e2dd7a1..d61f211 100644
--- a/Source/Service/FrameService/src/com/vci/server/framework/delegate/MachSecurityDelegate.java
+++ b/Source/Service/FrameService/src/com/vci/server/framework/delegate/MachSecurityDelegate.java
@@ -7,13 +7,13 @@
import com.vci.server.base.utility.LogHelper;
-import com.vci.server.framework.systemConfig.log.LogRecordUtil;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.framework.systemConfig.security.MachSecurity;
import com.vci.server.framework.systemConfig.security.MachSecurityService;
-import com.vci.common.log.LogType;
import com.vci.common.utility.ObjectUtility;
import com.vci.corba.common.VCIError;
import com.vci.corba.framework.data.MachSecurityInfo;
+import com.vci.corba.log.data.LogType;
import com.vci.corba.common.data.UserEntityInfo;
import com.vci.server.base.delegate.BaseDelegate;
@@ -131,7 +131,7 @@
service.saveMachSecurity(security);
String log = String.format("娣诲姞鏈哄櫒瀵嗙骇锛�%s [%s]", security.getName(), LogHelper.toNewLogString(security));
- LogRecordUtil.writeLog(userEntity, "娣诲姞", "鎴愬姛", log, LogType.GeneralOperation, security.getId());
+ LogRecordUtil.writeLog(userInfo, "娣诲姞", "鎴愬姛", log, LogType.General, security.getId());
} catch (Exception e) {
throw new VCIError("120315", new String[0]);
}
@@ -161,7 +161,7 @@
machService.saveMachSecurities(securities);
String log = String.format("娣诲姞鏈哄櫒瀵嗙骇瀵硅薄锛�%s", String.join(";", ids));
- LogRecordUtil.writeLog(userEntity, "娣诲姞", "鎴愬姛", log, LogType.GeneralOperation, id);
+ LogRecordUtil.writeLog(userInfo, "娣诲姞", "鎴愬姛", log, LogType.General, id);
} catch (Exception e) {
throw new VCIError("120316", new String[0]);
}
@@ -170,8 +170,8 @@
}
- public boolean updateMachSecurity(MachSecurityInfo info, UserEntityInfo userEnt) throws VCIError {
- this.setUserEntityInfo(userEnt);
+ public boolean updateMachSecurity(MachSecurityInfo info, UserEntityInfo userInfo) throws VCIError {
+ this.setUserEntityInfo(userInfo);
boolean rs = true;
MachSecurity ent = changeInfoToEntity(info);
@@ -187,9 +187,9 @@
LogHelper.toUpdataLogString(old, ent));
if (rs)
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "鎴愬姛", log, LogType.GeneralOperation, ent.getId());
+ LogRecordUtil.writeLog(userInfo, "鏇存柊", "鎴愬姛", log, LogType.General, ent.getId());
else
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "澶辫触", log, LogType.GeneralOperation, ent.getId());
+ LogRecordUtil.writeLog(userInfo, "鏇存柊", "澶辫触", log, LogType.General, ent.getId());
return rs;
@@ -199,8 +199,8 @@
}
- public boolean batchUpdateMachSecurity(MachSecurityInfo[] infos, UserEntityInfo userEnt) throws VCIError {
- this.setUserEntityInfo(userEnt);
+ public boolean batchUpdateMachSecurity(MachSecurityInfo[] infos, UserEntityInfo userInfo) throws VCIError {
+ this.setUserEntityInfo(userInfo);
MachSecurity[] securities = new MachSecurity[infos.length];
String[] ids = new String[infos.length];
@@ -216,11 +216,11 @@
MachSecurityService machService = new MachSecurityService(userEntity);
machService.updateMachSecurities(securities);
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "鎴愬姛", log, LogType.GeneralOperation, ids[0]);
+ LogRecordUtil.writeLog(userInfo, "鏇存柊", "鎴愬姛", log, LogType.General, ids[0]);
return true;
} catch (Exception e) {
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "澶辫触", log, LogType.GeneralOperation, ids[0]);
+ LogRecordUtil.writeLog(userInfo, "鏇存柊", "澶辫触", log, LogType.General, ids[0]);
throw new VCIError("120318", new String[0]);
}
}
diff --git a/Source/Service/FrameService/src/com/vci/server/framework/delegate/RightManagementDelegate.java b/Source/Service/FrameService/src/com/vci/server/framework/delegate/RightManagementDelegate.java
index dfcb0e0..b1f2f43 100644
--- a/Source/Service/FrameService/src/com/vci/server/framework/delegate/RightManagementDelegate.java
+++ b/Source/Service/FrameService/src/com/vci/server/framework/delegate/RightManagementDelegate.java
@@ -1,13 +1,10 @@
package com.vci.server.framework.delegate;
import java.text.Collator;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
-import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
@@ -22,9 +19,11 @@
import com.vci.corba.common.data.UserEntityInfo;
import com.vci.corba.framework.data.UserInfo;
import com.vci.corba.framework.data.UserLogonInfo;
+import com.vci.corba.log.data.LogType;
import com.vci.server.base.delegate.BaseDelegate;
import com.vci.server.base.delegate.UserEntityDelegate;
import com.vci.server.base.utility.LogHelper;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.cache.OrgCacheProvider;
import com.vci.server.common.ThreeDES;
import com.vci.server.framework.Logon.SessionInfo;
@@ -33,7 +32,6 @@
import com.vci.server.framework.cache.UserCacheUtil;
import com.vci.server.framework.interfac.SingleLogonInterface;
import com.vci.server.framework.interfac.TokenLogonInterface;
-import com.vci.server.framework.systemConfig.log.LogRecordUtil;
import com.vci.server.framework.systemConfig.stafforgmanage.combination.Combination;
import com.vci.server.framework.systemConfig.stafforgmanage.combination.CombinationService;
import com.vci.server.framework.systemConfig.stafforgmanage.combination.CombinationValue;
@@ -50,10 +48,7 @@
import com.vci.server.framework.systemConfig.stafforgmanage.user.UserLogon;
import com.vci.server.framework.systemConfig.stafforgmanage.user.UserService;
import com.vci.server.framework.utils.ObjectConvert;
-//import com.vci.common.LoginInfoDTO;
-import com.vci.common.log.LogType;
import com.vci.common.log.ServerWithLog4j;
-import com.vci.common.objects.UserEntity;
import com.vci.common.utility.ObjectUtility;
/**
@@ -182,10 +177,12 @@
UserInfo ui = fetchUserInfoByName(userName);
if (ui != null && ui.status == 0 && ui.pwd.equals(password)) {
res = ui;
+ LogRecordUtil.saveLoginLog(true, "鐧婚檰鎴愬姛", userEntityInfo);
+ } else {
+ //System.out.println("===========鐢ㄦ埛=" + res.userName + "锛� 鐘舵��=" + res.status);
+ // else
+ LogRecordUtil.saveLogoutLog("鐧婚檰澶辫触", userEntityInfo);
}
- //System.out.println("===========鐢ㄦ埛=" + res.userName + "锛� 鐘舵��=" + res.status);
- // else
- // LogRecordUtil.writeLog(userEntity, "鐧婚檰", "鐧婚檰澶辫触", LogType.Login, "");
} catch (Exception e) {
ServerWithLog4j.logger.error(e);
@@ -1157,7 +1154,7 @@
// log.append("鐢ㄦ埛鍚嶏細");
// User user = (User) userService.getUserInfoList(id).get(0);
// log.append("[" + user.getUserName() + "]");
-// LogRecordUtil.writeLog(userEntity, "鍚戞枃浠舵煖鍒嗛厤鎴愬憳", "鎴愬姛", log.toString(), LogType.GeneralOperation,
+// LogRecordUtil.writeLog(userEntity, "鍚戞枃浠舵煖鍒嗛厤鎴愬憳", "鎴愬姛", log.toString(), LogType.General,
// pvolume.getId());
// }
// } catch (Exception e) {
@@ -1182,7 +1179,7 @@
*/
public boolean saveRight(String roleId, String[] userIds, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ //UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
RoleService roleService = new RoleService();
UserService userService = new UserService();
@@ -1217,7 +1214,7 @@
// log.append("鐢ㄦ埛:");
User user = (User) userService.getUserInfoList(id).get(0);
log.append("[" + user.getUserName() + "(" + user.getTrueName() + ")]");
- LogRecordUtil.writeLog(userEntity, "瑙掕壊澧炲姞鎴愬憳", "鎴愬姛", log.toString(), LogType.GeneralOperation, role.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "瑙掕壊澧炲姞鎴愬憳", "鎴愬姛", log.toString(), LogType.General, role.getId());
}
// 鍒犻櫎鐨勪汉鍛�
@@ -1226,7 +1223,7 @@
log.append(role.getLogInfo() + "->[鍑忓皯鐢ㄦ埛]->");
// log.append("鐢ㄦ埛:");
log.append("[" + u.getUserName() + "(" + u.getTrueName() + ")]");
- LogRecordUtil.writeLog(userEntity, "瑙掕壊鍑忓皯鎴愬憳", "鎴愬姛", log.toString(), LogType.GeneralOperation, role.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "瑙掕壊鍑忓皯鎴愬憳", "鎴愬姛", log.toString(), LogType.General, role.getId());
}
// for(String id : userIds){
@@ -1235,10 +1232,10 @@
// log.append("鐢ㄦ埛鍚嶏細");
// User user = (User)userService.getUserInfoList(id).get(0);
// log.append("["+user.getUserName()+"]");
-// LogRecordUtil.writeLog(userEntity, "鍚戣鑹插垎閰嶆垚鍛�", log.toString(), LogType.GeneralOperation, role.getId());
+// LogRecordUtil.writeLog(userEntity, "鍚戣鑹插垎閰嶆垚鍛�", log.toString(), LogType.General, role.getId());
// }
// LogRecordUtil.writeLog(userEntity, "鍚戣鑹插垎閰嶆垚鍛�", role.getLogInfo() + ",瑙掕壊鍙戠敓鍙樺寲",
- // LogType.GeneralOperation, role.getId());
+ // LogType.General, role.getId());
} catch (Exception e) {
throw new VCIError("120306", new String[0]);
}
@@ -1257,7 +1254,7 @@
*/
public boolean saveSpecialRole(String roleId, String[] userIds, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
RoleService roleService = new RoleService();
UserService userService = new UserService();
@@ -1287,7 +1284,7 @@
// log.append("鐢ㄦ埛:");
User user = (User) userService.getUserInfoList(id).get(0);
log.append("[" + user.getUserName() + "(" + user.getTrueName() + ")]");
- LogRecordUtil.writeLog(userEntity, "瑙掕壊澧炲姞鎴愬憳", "鎴愬姛", log.toString(), LogType.GeneralOperation, role.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "瑙掕壊澧炲姞鎴愬憳", "鎴愬姛", log.toString(), LogType.General, role.getId());
}
@@ -1297,7 +1294,7 @@
// log.append("鐢ㄦ埛鍚嶏細");
// User user = (User)userService.getUserInfoList(id).get(0);
// log.append("["+user.getUserName()+"]");
-// LogRecordUtil.writeLog(userEntity, "瑙掕壊鍒嗛厤鎴愬憳", log.toString(), LogType.GeneralOperation,role.getId());
+// LogRecordUtil.writeLog(userEntity, "瑙掕壊鍒嗛厤鎴愬憳", log.toString(), LogType.General,role.getId());
// }
} catch (Exception e) {
throw new VCIError("120306", new String[0]);
@@ -1321,7 +1318,7 @@
*/
public boolean saveRighForDept(String deptId, String[] userIds, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
DepartmentService deptService = new DepartmentService();
@@ -1356,7 +1353,7 @@
// log.append("鐢ㄦ埛:");
User user = (User) userService.getUserInfoList(id).get(0);
log.append("[" + user.getUserName() + "(" + user.getTrueName() + ")]");
- LogRecordUtil.writeLog(userEntity, "閮ㄩ棬澧炲姞鎴愬憳", "鎴愬姛", log.toString(), LogType.GeneralOperation, deptId);
+ LogRecordUtil.writeLog(userEntityInfo, "閮ㄩ棬澧炲姞鎴愬憳", "鎴愬姛", log.toString(), LogType.General, deptId);
}
// 鍒犻櫎鐨勪汉鍛�
@@ -1365,7 +1362,7 @@
log.append("[").append(deptPath).append("]->[鍑忓皯鐢ㄦ埛]->");
// log.append("鐢ㄦ埛:");
log.append("[" + u.getUserName() + "(" + u.getTrueName() + ")]");
- LogRecordUtil.writeLog(userEntity, "閮ㄩ棬鍑忓皯鎴愬憳", "鎴愬姛", log.toString(), LogType.GeneralOperation, deptId);
+ LogRecordUtil.writeLog(userEntityInfo, "閮ㄩ棬鍑忓皯鎴愬憳", "鎴愬姛", log.toString(), LogType.General, deptId);
}
} catch (Exception e) {
throw new VCIError("120111", new String[0]);
@@ -1376,7 +1373,7 @@
public boolean saveRights(String[] roleIds, String[] userIds, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
UserService userService = new UserService();
RoleService roleService = new RoleService();
@@ -1395,8 +1392,8 @@
log.append("->");
for (String roleId : roleIds) {
Role role = roleService.selectRole(roleId);
- LogRecordUtil.writeLog(userEntity, "鎴愬憳鍒嗛厤瑙掕壊", "鎴愬姛", log.toString() + "[" + role.getName() + "]",
- LogType.GeneralOperation, "瑙掕壊ID:" + roleId + " 鐢ㄦ埛ID:" + userId);
+ LogRecordUtil.writeLog(userEntityInfo, "鎴愬憳鍒嗛厤瑙掕壊", "鎴愬姛", log.toString() + "[" + role.getName() + "]",
+ LogType.General, "瑙掕壊ID:" + roleId + " 鐢ㄦ埛ID:" + userId);
}
}
@@ -1409,7 +1406,7 @@
public boolean saveUserDept(String[] userIds, String deptId, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
UserService userService = new UserService();
DepartmentService departmentService = new DepartmentService();
@@ -1441,7 +1438,7 @@
log.append("[").append(deptPath).append("]");
// log.append("["+user.getUserName()+"]");
}
- LogRecordUtil.writeLog(userEntity, "鐢ㄦ埛鍒嗛厤閮ㄩ棬", "鎴愬姛", log.toString(), LogType.GeneralOperation,
+ LogRecordUtil.writeLog(userEntityInfo, "鐢ㄦ埛鍒嗛厤閮ㄩ棬", "鎴愬姛", log.toString(), LogType.General,
"閮ㄩ棬ID:" + deptId + " 鐢ㄦ埛id锛�" + userId);
}
} catch (Exception e) {
@@ -1496,18 +1493,18 @@
String id = ObjectUtility.getNewObjectID36();
department.setId(id);
}
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
DepartmentService departmentService = new DepartmentService();
UserEntityDelegate.setUserEntityToService(departmentService, userEntityInfo);
departmentService.saveDepartment(department);
// LogRecordUtil.writeLog(userEntity, "娣诲姞", department.getLogInfo(),
- // LogType.GeneralOperation,department.getId());
+ // LogType.General,department.getId());
DeptCacheUtil.getInstance().setObject(departmentInfo);
String log = String.format("娣诲姞閮ㄩ棬锛�%s [%s]", department.getName(), LogHelper.toNewLogString(department));
- LogRecordUtil.writeLog(userEntity, "娣诲姞", "鎴愬姛", log, LogType.GeneralOperation, department.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "娣诲姞", "鎴愬姛", log, LogType.General, department.getId());
} catch (Exception e) {
throw new VCIError("120109", new String[0]);
}
@@ -1561,7 +1558,7 @@
Role role = ObjectConvert.changeRoleInfoToRole(roleInfo);
String id = ObjectUtility.getNewObjectID36();
role.setId(id);
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
RoleService roleService = new RoleService();
UserEntityDelegate.setUserEntityToService(roleService, userEntityInfo);
@@ -1570,10 +1567,10 @@
RoleCacheUtil.getInstance().setObject(role);
String log = String.format("娣诲姞瑙掕壊锛�%s [%s]", role.getName(), LogHelper.toNewLogString(role));
- LogRecordUtil.writeLog(userEntity, "娣诲姞", "鎴愬姛", log, LogType.GeneralOperation, role.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "娣诲姞", "鎴愬姛", log, LogType.General, role.getId());
// LogRecordUtil.writeLog(userEntity, "娣诲姞", role.getLogInfo(),
- // LogType.GeneralOperation,role.getId());
+ // LogType.General,role.getId());
} catch (Exception e) {
//e.printStackTrace();
ServerWithLog4j.logger.error(e);
@@ -1619,7 +1616,7 @@
} else {
id = user.getId();
}
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
UserService userService = new UserService();
UserEntityDelegate.setUserEntityToService(userService, userEntityInfo);
@@ -1628,10 +1625,10 @@
UserCacheUtil.getInstance().setObject(userInfo);
String log = String.format("娣诲姞鐢ㄦ埛锛�%s [%s]", user.getUserName(), LogHelper.toNewLogString(user));
- LogRecordUtil.writeLog(userEntity, "娣诲姞", "鎴愬姛", log, LogType.GeneralOperation, user.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "娣诲姞", "鎴愬姛", log, LogType.General, user.getId());
// LogRecordUtil.writeLog(userEntity, "娣诲姞", user.getLogInfo(),
- // LogType.GeneralOperation,user.getId());
+ // LogType.General,user.getId());
} catch (Exception e) {
//e.printStackTrace();
ServerWithLog4j.logger.error(e);
@@ -1655,7 +1652,7 @@
public boolean updateDepartment(DeptInfo deptInfo, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
Department departmentAfter = ObjectConvert.changeDepartmentInfoToDepartment(deptInfo);
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
DepartmentService departmentService = new DepartmentService();
UserEntityDelegate.setUserEntityToService(departmentService, userEntityInfo);
@@ -1672,9 +1669,9 @@
DeptCacheUtil.getInstance().setObject(deptInfo);
if (rs)
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "鎴愬姛", log, LogType.GeneralOperation, departmentAfter.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "鏇存柊", "鎴愬姛", log, LogType.General, departmentAfter.getId());
else
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "澶辫触", log, LogType.GeneralOperation, departmentAfter.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "鏇存柊", "澶辫触", log, LogType.General, departmentAfter.getId());
} catch (Exception e) {
//e.printStackTrace();
@@ -1699,7 +1696,7 @@
public boolean updateRole(RoleInfo roleInfo, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
Role role = ObjectConvert.changeRoleInfoToRole(roleInfo);
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
RoleService roleService = new RoleService();
UserEntityDelegate.setUserEntityToService(roleService, userEntityInfo);
@@ -1715,7 +1712,7 @@
// StringBuilder log = new StringBuilder();
// log.append("鏇存柊鍓嶏細"+roleBefroe.getLogInfo());
// log.append(" 鏇存柊鍚庯細"+role.getLogInfo());
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "鎴愬姛", log, LogType.GeneralOperation, role.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "鏇存柊", "鎴愬姛", log, LogType.General, role.getId());
} catch (Exception e) {
//e.printStackTrace();
ServerWithLog4j.logger.error(e);
@@ -1776,7 +1773,7 @@
public boolean updateUser(UserInfo userInfo, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
User user = ObjectConvert.changeUserInfoToUser(userInfo);
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
UserService userService = new UserService();
UserEntityDelegate.setUserEntityToService(userService, userEntityInfo);
@@ -1788,7 +1785,7 @@
userService.updateUser(user);
UserCacheUtil.getInstance().setObject(userInfo);
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "鎴愬姛", log, LogType.GeneralOperation, user.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "鏇存柊", "鎴愬姛", log, LogType.General, user.getId());
} catch (Exception e) {
//e.printStackTrace();
ServerWithLog4j.logger.error(e);
@@ -1816,7 +1813,7 @@
public String modifyUserPassword(String idUser, String oldPW, String newPW, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
String error = "";
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
UserService userService = new UserService();
UserEntityDelegate.setUserEntityToService(userService, userEntityInfo);
@@ -1824,7 +1821,7 @@
if (StringUtils.isEmpty(user.getId())) {
error = String.format("鐢ㄦ埛ID鏃犳晥:", idUser);
- LogRecordUtil.writeLog(userEntity, "淇敼瀵嗙爜", "澶辫触", error, LogType.GeneralOperation, user.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "淇敼瀵嗙爜", "澶辫触", error, LogType.General, user.getId());
return error;
}
@@ -1835,7 +1832,7 @@
oldPW = des.getEncString(oldPW);
if (!user.getPassword().equals(oldPW)) {
error = String.format("鏇存敼[%s]瀵嗙爜澶辫触锛岃緭鍏ユ棫瀵嗙爜涓嶆纭紒", user.getUserName());
- LogRecordUtil.writeLog(userEntity, "淇敼瀵嗙爜", "澶辫触", error, LogType.GeneralOperation, user.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "淇敼瀵嗙爜", "澶辫触", error, LogType.General, user.getId());
return error;
//throw new VCIError("120405", new String[] {"鏃у瘑鐮佽緭鍏ヤ笉姝g‘锛�"});
}
@@ -1843,7 +1840,7 @@
error = checkPasswordStrategyByUserId(idUser, newPW);
if (!StringUtils.isEmpty(error)) {
- LogRecordUtil.writeLog(userEntity, "淇敼瀵嗙爜", "澶辫触", "鏇存敼鐢ㄦ埛瀵嗙爜锛�" + user.getUserName() + "; " + error, LogType.GeneralOperation, user.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "淇敼瀵嗙爜", "澶辫触", "鏇存敼鐢ㄦ埛瀵嗙爜锛�" + user.getUserName() + "; " + error, LogType.General, user.getId());
return error;
}
@@ -1853,7 +1850,7 @@
if (!rs) {
error = "淇敼鐢ㄦ埛瀵嗙爜澶辫触";
- LogRecordUtil.writeLog(userEntity, "淇敼瀵嗙爜", "澶辫触", "鏇存敼鐢ㄦ埛瀵嗙爜锛�%s" + user.getUserName() +"; " + error, LogType.GeneralOperation, user.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "淇敼瀵嗙爜", "澶辫触", "鏇存敼鐢ㄦ埛瀵嗙爜锛�%s" + user.getUserName() +"; " + error, LogType.General, user.getId());
return error;
}
@@ -1862,7 +1859,7 @@
log = String.format("鏇存敼鐢ㄦ埛瀵嗙爜锛�%s", user.getUserName());
- LogRecordUtil.writeLog(userEntity, "淇敼瀵嗙爜", "鎴愬姛", log, LogType.GeneralOperation, user.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "淇敼瀵嗙爜", "鎴愬姛", log, LogType.General, user.getId());
} catch (VCIError e) {
throw e;
} catch (Exception e) {
@@ -1995,7 +1992,7 @@
public boolean deleteDepartment(String[] id, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
// List<Department> list = new ArrayList<Department>();
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
DepartmentService departmentService = new DepartmentService();
UserEntityDelegate.setUserEntityToService(departmentService, userEntityInfo);
@@ -2012,7 +2009,7 @@
Iterator<String> it = map.keySet().iterator();
while (it.hasNext()) {
String deptId = it.next();
- LogRecordUtil.writeLog(userEntity, "鍒犻櫎", "鎴愬姛", deptId, LogType.GeneralOperation, map.get(deptId));
+ LogRecordUtil.writeLog(userEntityInfo, "鍒犻櫎", "鎴愬姛", deptId, LogType.General, map.get(deptId));
}
} catch (Exception e) {
@@ -2025,7 +2022,7 @@
public boolean updateDeptParentId(String id, String parentId, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
DepartmentService departmentService = new DepartmentService();
UserEntityDelegate.setUserEntityToService(departmentService, userEntityInfo);
@@ -2038,7 +2035,7 @@
DeptCacheUtil.getInstance().setObject(dept);
if (rs) {
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "鎴愬姛", parentId, LogType.GeneralOperation, id);
+ LogRecordUtil.writeLog(userEntityInfo, "鏇存柊", "鎴愬姛", parentId, LogType.General, id);
}
} catch (Exception e) {
@@ -2063,7 +2060,7 @@
*/
public boolean deleteRole(String[] ids, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
RoleService roleService = new RoleService();
UserEntityDelegate.setUserEntityToService(roleService, userEntityInfo);
@@ -2078,7 +2075,7 @@
String id = it.next();
RoleCacheUtil.getInstance().delObject(id);
- LogRecordUtil.writeLog(userEntity, "鍒犻櫎", "鎴愬姛", map.get(id), LogType.GeneralOperation, id);
+ LogRecordUtil.writeLog(userEntityInfo, "鍒犻櫎", "鎴愬姛", map.get(id), LogType.General, id);
}
} catch (Exception e) {
//e.printStackTrace();
@@ -2103,7 +2100,7 @@
*/
public boolean deleteUser(String[] ids, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
UserService userService = new UserService();
UserEntityDelegate.setUserEntityToService(userService, userEntityInfo);
@@ -2119,7 +2116,7 @@
Iterator<String> it = map.keySet().iterator();
while (it.hasNext()) {
String id = it.next();
- LogRecordUtil.writeLog(userEntity, "鍒犻櫎", "鎴愬姛", map.get(id), LogType.GeneralOperation, id);
+ LogRecordUtil.writeLog(userEntityInfo, "鍒犻櫎", "鎴愬姛", map.get(id), LogType.General, id);
}
} catch (Exception e) {
//e.printStackTrace();
@@ -2144,7 +2141,7 @@
*/
public boolean stopUsers(String[] id, boolean flag, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
UserService userService = new UserService();
UserEntityDelegate.setUserEntityToService(userService, userEntityInfo);
@@ -2159,7 +2156,7 @@
user.setStatus(flag ? (short)1 : (short)0);
UserCacheUtil.getInstance().setObject(user);
- LogRecordUtil.writeLog(userEntity, "鍋滅敤銆佸惎鐢�", rs ? "鎴愬姛" : "澶辫触", log.toString(), LogType.GeneralOperation, user.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "鍋滅敤銆佸惎鐢�", rs ? "鎴愬姛" : "澶辫触", log.toString(), LogType.General, user.getId());
}
} catch (Exception e) {
@@ -2295,13 +2292,13 @@
public boolean savePasswordStrategy(PasswordStrategyInfo info, //String[] combinationIds,
UserEntityInfo userEntityInfo) throws VCIError {
boolean res = false;
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
PasswordStrategyService srv = new PasswordStrategyService();
UserEntityDelegate.setUserEntityToService(srv, userEntityInfo);
PasswordStrategy passwordStrategy = ObjectConvert.changePassStrategyInfoToEntity(info);
res = srv.savePasswordStrategy(passwordStrategy);
- LogRecordUtil.writeLog(userEntity, "娣诲姞", "鎴愬姛", passwordStrategy.getLogInfo(), LogType.GeneralOperation,
+ LogRecordUtil.writeLog(userEntityInfo, "娣诲姞", "鎴愬姛", passwordStrategy.getLogInfo(), LogType.General,
passwordStrategy.getId());
} catch (Exception e) {
//e.printStackTrace();
@@ -2314,7 +2311,7 @@
public boolean editPasswordStrategy(PasswordStrategyInfo info, UserEntityInfo userEntityInfo) throws VCIError {
boolean res = true;
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
PasswordStrategyService srv = new PasswordStrategyService();
UserEntityDelegate.setUserEntityToService(srv, userEntityInfo);
@@ -2328,7 +2325,7 @@
res = srv.updatePasswordStrategy(passwordStrategy);
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "鎴愬姛", log.toString(), LogType.GeneralOperation,
+ LogRecordUtil.writeLog(userEntityInfo, "鏇存柊", "鎴愬姛", log.toString(), LogType.General,
passwordStrategyBefore.getId());
} catch (Exception e) {
//e.printStackTrace();
@@ -2340,7 +2337,7 @@
public boolean deletePasswordStrategy(String[] ids, UserEntityInfo userEntityInfo) throws VCIError {
boolean res = true;
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
PasswordStrategyService srv = new PasswordStrategyService();
UserEntityDelegate.setUserEntityToService(srv, userEntityInfo);
@@ -2353,7 +2350,7 @@
Iterator<String> it = map.keySet().iterator();
while (it.hasNext()) {
String logKey = it.next();
- LogRecordUtil.writeLog(userEntity, "鍒犻櫎", "鎴愬姛", logKey, LogType.GeneralOperation, map.get(logKey));
+ LogRecordUtil.writeLog(userEntityInfo, "鍒犻櫎", "鎴愬姛", logKey, LogType.General, map.get(logKey));
}
} catch (Exception e) {
//e.printStackTrace();
@@ -2390,7 +2387,7 @@
public boolean saveUserPasswordStrateg(String[] userIds, String passwordStrategId, UserEntityInfo userEntityInfo)
throws VCIError {
boolean rs = true;
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
UserService userService = new UserService();
PasswordStrategyService srv = new PasswordStrategyService();
@@ -2408,7 +2405,7 @@
rs = userService.saveUserPasswordStrateg(userId, passwordStrategId);
log.append("->");
log.append(passwordStrategy.getLogInfo());
- LogRecordUtil.writeLog(userEntity, "涓烘垚鍛樺垎閰嶅瘑鐮佺瓥鐣�", "鎴愬姛", log.toString(), LogType.GeneralOperation,
+ LogRecordUtil.writeLog(userEntityInfo, "涓烘垚鍛樺垎閰嶅瘑鐮佺瓥鐣�", "鎴愬姛", log.toString(), LogType.General,
userId + "瀵嗙爜绛栫暐ID:" + passwordStrategId);
}
} catch (Exception e) {
@@ -2469,7 +2466,7 @@
}
public void deblock(String[] ids, UserEntityInfo userEntityInfo) throws VCIError {
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
UserService userSrv = new UserService();
UserEntityDelegate.setUserEntityToService(userSrv, userEntityInfo);
@@ -2477,10 +2474,10 @@
for (String userId : ids) {
User user = (User) userSrv.getUserObjectByoid(userId);
// LogRecordUtil.writeLog(userEntity, "璐︽埛瑙i攣", "["+user.getLogInfo()+"]",
- // LogType.GeneralOperation, userId);
+ // LogType.General, userId);
// add by caill 2016.9.13
- LogRecordUtil.writeLog(userEntity, LogType.UnlockUser.getLabel(), "瑙i攣鎴愬姛", "[" + user.getLogInfo() + "]",
+ LogRecordUtil.writeLog(userEntityInfo, "瑙i攣鐢ㄦ埛", "瑙i攣鎴愬姛", "[" + user.getLogInfo() + "]",
LogType.UnlockUser, userId);
}
} catch (Exception ex) {
@@ -2490,47 +2487,47 @@
}
}
- /**
- * 绠�鍗曡褰曠郴缁熺櫥鍏ャ�佺櫥鍑烘棩锟�?
- * <p>
- * Description:
- * </p>
- *
- * @author wangxl
- * @time 2012-12-27
- * @param message
- * @param userEntityInfo
- * @throws VCIError
- */
- public void savelog(String message, UserEntityInfo userEntityInfo) throws VCIError {
- userEntityInfo.modules = "鐧诲綍妯″潡";// add by liujw
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
- User user = ObjectConvert.changeUserInfoToUser(fetchUserInfoByName(userEntity.getUserName()));
- LogRecordUtil.writeLog(userEntity, message, "鐧诲綍鎴愬姛", message,
- "鐧诲叆".equals(message) ? LogType.Login : LogType.Logout, user.getId());
- }
-
- public void saveLogV2(String result, String message, String type, int logTypeIntVal, String dataObjOid,
- UserEntityInfo userEntityInfo) throws VCIError {
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
- LogType logType = LogType.getByIntVal(logTypeIntVal);
- LogRecordUtil.writeLog(userEntity, type, result, message, logType, dataObjOid);
- }
-
- public void savelogfail(String message, UserEntityInfo userEntityInfo) throws VCIError {
- userEntityInfo.modules = "鐧诲綍妯″潡";
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
- User user = ObjectConvert.changeUserInfoToUser(fetchUserInfoByName(userEntity.getUserName()));
- LogRecordUtil.writeLog(userEntity, "鐧诲叆", "鐧诲綍澶辫触", message, LogType.Login, user.getId());
- }
-
- // add by caill start 2016.9.13绠�鍗曡褰曠敤鎴疯閿佸畾鐨勬棩蹇�
- public void blocklog(String userId, UserEntityInfo userEntityInfo) throws VCIError {
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
- User user = ObjectConvert.changeUserInfoToUser(fetchUserInfoByName(userEntity.getUserName()));
- LogRecordUtil.writeLog(userEntity, LogType.LockUser.getLabel(), "鐢ㄦ埛閿佸畾",
- "[" + user.getLogInfo() + "]" + "鍦ㄨ繛缁緭鍏ュ娆″瘑鐮侀敊璇悗瀵艰嚧璐︽埛琚攣瀹�", LogType.LockUser, userId);
- }
+// /**
+// * 绠�鍗曡褰曠郴缁熺櫥鍏ャ�佺櫥鍑烘棩锟�?
+// * <p>
+// * Description:
+// * </p>
+// *
+// * @author wangxl
+// * @time 2012-12-27
+// * @param message
+// * @param userEntityInfo
+// * @throws VCIError
+// */
+// public void savelog(String message, UserEntityInfo userEntityInfo) throws VCIError {
+// userEntityInfo.modules = "鐧诲綍妯″潡";// add by liujw
+// // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+// User user = ObjectConvert.changeUserInfoToUser(fetchUserInfoByName(userEntity.getUserName()));
+// LogRecordUtil.writeLog(userEntityInfo, message, "鐧诲綍鎴愬姛", message,
+// "鐧诲叆".equals(message) ? LogType.Login : LogType.Logout, user.getId());
+// }
+//
+// public void saveLogV2(String result, String message, String type, int logTypeIntVal, String dataObjOid,
+// UserEntityInfo userEntityInfo) throws VCIError {
+// // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+// LogType logType = LogType.getByIntVal(logTypeIntVal);
+// LogRecordUtil.writeLog(userEntityInfo, type, result, message, logType, dataObjOid);
+// }
+//
+// public void savelogfail(String message, UserEntityInfo userEntityInfo) throws VCIError {
+// userEntityInfo.modules = "鐧诲綍妯″潡";
+// // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+// User user = ObjectConvert.changeUserInfoToUser(fetchUserInfoByName(userEntity.getUserName()));
+// LogRecordUtil.writeLog(userEntityInfo, "鐧诲叆", "鐧诲綍澶辫触", message, LogType.Login, user.getId());
+// }
+//
+// // add by caill start 2016.9.13绠�鍗曡褰曠敤鎴疯閿佸畾鐨勬棩蹇�
+// public void blocklog(String userId, UserEntityInfo userEntityInfo) throws VCIError {
+// // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+// User user = ObjectConvert.changeUserInfoToUser(fetchUserInfoByName(userEntity.getUserName()));
+// LogRecordUtil.writeLog(userEntityInfo, LogType.LockUser.getLabel(), "鐢ㄦ埛閿佸畾",
+// "[" + user.getLogInfo() + "]" + "鍦ㄨ繛缁緭鍏ュ娆″瘑鐮侀敊璇悗瀵艰嚧璐︽埛琚攣瀹�", LogType.LockUser, userId);
+// }
/**
* 鑾峰彇鎵�鏈夊瘑鐮佺粍鍚堟柟锟�?
@@ -2590,12 +2587,12 @@
Combination comb = changeCombinationInfoToCombination(info);
String id = ObjectUtility.getNewObjectID36();
comb.setId(id);
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
CombinationService service = new CombinationService();
UserEntityDelegate.setUserEntityToService(service, userEntityInfo);
service.saveCombination(comb);
- LogRecordUtil.writeLog(userEntity, "娣诲姞", "鎴愬姛", comb.getLogInfo(), LogType.GeneralOperation, comb.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "娣诲姞", "鎴愬姛", comb.getLogInfo(), LogType.General, comb.getId());
} catch (Exception e) {
throw new VCIError("120502", new String[0]);
}
@@ -2605,7 +2602,7 @@
public boolean updateCombination(CombinationInfo info, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
Combination comb = changeCombinationInfoToCombination(info);
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
CombinationService service = new CombinationService();
UserEntityDelegate.setUserEntityToService(service, userEntityInfo);
@@ -2614,7 +2611,7 @@
StringBuilder log = new StringBuilder();
log.append("鏇存柊鍓嶏細" + combinationBefore.getLogInfo());
log.append(" 鏇存柊鍚庯細" + comb.getLogInfo());
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "鎴愬姛", log.toString(), LogType.GeneralOperation, comb.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "鏇存柊", "鎴愬姛", log.toString(), LogType.General, comb.getId());
} catch (Exception e) {
throw new VCIError("120503", new String[0]);
}
@@ -2623,7 +2620,7 @@
public boolean deleteCombination(String[] id, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
CombinationService service = new CombinationService();
UserEntityDelegate.setUserEntityToService(service, userEntityInfo);
@@ -2636,7 +2633,7 @@
Iterator<String> it = map.keySet().iterator();
while (it.hasNext()) {
String logKey = it.next();
- LogRecordUtil.writeLog(userEntity, "鍒犻櫎", "鎴愬姛", logKey, LogType.GeneralOperation, map.get(logKey));
+ LogRecordUtil.writeLog(userEntityInfo, "鍒犻櫎", "鎴愬姛", logKey, LogType.General, map.get(logKey));
}
} catch (Exception e) {
throw new VCIError("120504", new String[0]);
@@ -2664,7 +2661,7 @@
@SuppressWarnings("unchecked")
public String saveCombinationValue(CombinationValueInfo[] valueInfos, UserEntityInfo userEntityInfo)
throws VCIError {
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
CombinationValueService service = new CombinationValueService();
int length = valueInfos.length;
@@ -2687,7 +2684,7 @@
service.saveCombinationValue(combinationValues);
for (CombinationValue value : combinationValues) {
- LogRecordUtil.writeLog(userEntity, "娣诲姞", "鎴愬姛", value.getLogInfo(), LogType.GeneralOperation, value.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "娣诲姞", "鎴愬姛", value.getLogInfo(), LogType.General, value.getId());
}
;
@@ -2702,7 +2699,7 @@
throws VCIError {
boolean rs = true;
CombinationValue combVal = changeCombinationValueInfoToVal(valueInfo);
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
CombinationValueService service = new CombinationValueService();
// add by liujw
@@ -2720,7 +2717,7 @@
log.append("鏇存柊鍓嶏細" + combinationValueBefroe.getLogInfo());
log.append(" 鏇存柊鍚庯細" + combVal.getLogInfo());
rs = service.updateCombinationValue(combVal);
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "鎴愬姛", log.toString(), LogType.GeneralOperation, combVal.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "鏇存柊", "鎴愬姛", log.toString(), LogType.General, combVal.getId());
} catch (Exception e) {
throw new VCIError("120508", new String[0]);
}
@@ -2729,7 +2726,7 @@
public boolean deletCombinationValues(String[] id, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
try {
CombinationValueService service = new CombinationValueService();
CombinationService combinService = new CombinationService();
@@ -2755,7 +2752,7 @@
}
}
rs = service.deleteCombinationValueByMQL(id);
- LogRecordUtil.writeLog(userEntity, "鍒犻櫎", "鎴愬姛", log.toString(), LogType.GeneralOperation,
+ LogRecordUtil.writeLog(userEntityInfo, "鍒犻櫎", "鎴愬姛", log.toString(), LogType.General,
combinIds.toString() + valuesIds.toString());
} catch (Exception e) {
e.printStackTrace();
@@ -2934,8 +2931,8 @@
*/
public void savelogGeneralOperation(String result, String message, UserEntityInfo userEntityInfo, String dataId, String plType)
throws VCIError {
- UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
- LogRecordUtil.writeLog(userEntity, plType, result, message, LogType.GeneralOperation, dataId);
+ // UserEntity userEntity = ObjectConvert.changeUserEntityInfoToUserEntity(userEntityInfo);
+ LogRecordUtil.writeLog(userEntityInfo, plType, result, message, LogType.General, dataId);
}
/****
diff --git a/Source/Service/FrameService/src/com/vci/server/framework/delegate/RoleRightDelegate.java b/Source/Service/FrameService/src/com/vci/server/framework/delegate/RoleRightDelegate.java
index a0c829b..a166a60 100644
--- a/Source/Service/FrameService/src/com/vci/server/framework/delegate/RoleRightDelegate.java
+++ b/Source/Service/FrameService/src/com/vci/server/framework/delegate/RoleRightDelegate.java
@@ -4,21 +4,20 @@
import java.util.Date;
import java.util.List;
-import org.apache.commons.lang3.StringUtils;
-
-import com.vci.common.log.LogType;
import com.vci.common.log.ServerWithLog4j;
import com.vci.common.utility.ObjectUtility;
import com.vci.corba.common.VCIError;
import com.vci.corba.framework.data.RoleRightInfo;
+import com.vci.corba.log.data.LogType;
import com.vci.corba.common.data.UserEntityInfo;
-import com.vci.corba.framework.data.UserInfo;
+import com.vci.corba.framework.data.RoleInfo;
import com.vci.server.base.delegate.BaseDelegate;
+import com.vci.server.base.utility.LogRecordUtil;
+import com.vci.server.cache.OrgCacheProvider;
import com.vci.server.framework.funcmng.function.Function;
import com.vci.server.framework.funcmng.function.FunctionService;
import com.vci.server.framework.right.roleRight.RoleRight;
import com.vci.server.framework.right.roleRight.RoleRightService;
-import com.vci.server.framework.systemConfig.log.LogRecordUtil;
import com.vci.server.framework.systemConfig.stafforgmanage.role.Role;
import com.vci.server.framework.systemConfig.stafforgmanage.role.RoleService;
@@ -70,7 +69,8 @@
//roleRights[i].setRightType(rightType);
}
- Role role = roleService.selectRole(roleId);
+ RoleInfo role = OrgCacheProvider.getRole(roleId);
+ //Role role = OrgCacheProvider.getRole(roleId);
if (roleRights.length > 0) {
res = service.saveRoleRight(roleRights, roleId, rightType);
try {
@@ -88,15 +88,15 @@
}
}
sb.append("绛夊叡璁�" + roleRightInfos.length + "涓潈闄�");
- logInfo = "鎿嶄綔鐨勮鑹蹭俊鎭负:" + role.getLogInfo() + ",鏉冮檺鍖呮嫭:" + sb.toString();
+ logInfo = "鎿嶄綔鐨勮鑹蹭俊鎭负:瑙掕壊[" + role.name + "],鏉冮檺鍖呮嫭:" + sb.toString();
} else {
- logInfo = "鎿嶄綔鐨勮鑹蹭俊鎭负:" + role.getLogInfo();
+ logInfo = "鎿嶄綔鐨勮鑹蹭俊鎭负:瑙掕壊[" + role.name + "]";
}
if (res)
- LogRecordUtil.writeLog(userEntity, "鎺堟潈", "鎴愬姛", logInfo, LogType.GrantPrivileges, role.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "鎺堟潈", "鎴愬姛", logInfo, LogType.Grant, role.id);
else
- LogRecordUtil.writeLog(userEntity, "鎺堟潈", "澶辫触", logInfo, LogType.GrantPrivileges, role.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "鎺堟潈", "澶辫触", logInfo, LogType.Grant, role.id);
} catch (Exception e) {
//e.printStackTrace();
@@ -106,7 +106,7 @@
} catch (Exception e) {
//e.printStackTrace();
ServerWithLog4j.logger.error(e);
- LogRecordUtil.writeLog(userEntity, "鎺堟潈", "鍔熻兘妯″潡鎺堟潈澶辫触锛�", e.getMessage(), LogType.GrantPrivileges, roleId);
+ LogRecordUtil.writeLog(userEntityInfo, "鎺堟潈", "鍔熻兘妯″潡鎺堟潈澶辫触锛�", e.getMessage(), LogType.Grant, roleId);
throw new VCIError("0", new String[] { e.getMessage() });
}
return res;
@@ -150,16 +150,16 @@
res = service.removeRoleRight(roleRights, roleId);
if (res)
- LogRecordUtil.writeLog(userEntity, "鎺堟潈", "鎴愬姛", role.getLogInfo(), LogType.GrantPrivileges, role.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "鎺堟潈", "鎴愬姛", role.getLogInfo(), LogType.Grant, role.getId());
else
- LogRecordUtil.writeLog(userEntity, "鎺堟潈", "澶辫触", role.getLogInfo(), LogType.GrantPrivileges, role.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "鎺堟潈", "澶辫触", role.getLogInfo(), LogType.Grant, role.getId());
}
} catch (Exception e) {
//e.printStackTrace();
ServerWithLog4j.logger.error(e);
// LogRecordUtil.writeLog(userEntity, "鎺堟潈",
- // "鍔熻兘妯″潡鎺堟潈澶辫触锛�",LogType.GrantPrivileges);
+ // "鍔熻兘妯″潡鎺堟潈澶辫触锛�",LogType.Grant);
throw new VCIError("0", new String[0]);
}
return res;
@@ -201,12 +201,12 @@
Role role = roleService.selectRole(roleId);
res = service.reAddRoleRight(roleRights, roleId, rightType);
- LogRecordUtil.writeLog(userEntity, "澧炲姞鎺堟潈", "鎴愬姛", role.getLogInfo(), LogType.GrantPrivileges, role.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "澧炲姞鎺堟潈", "鎴愬姛", role.getLogInfo(), LogType.Grant, role.getId());
} catch (Exception e) {
//e.printStackTrace();
ServerWithLog4j.logger.error(e);
// LogRecordUtil.writeLog(userEntity, "鎺堟潈",
- // "鍔熻兘妯″潡鎺堟潈澶辫触锛�",LogType.GrantPrivileges);
+ // "鍔熻兘妯″潡鎺堟潈澶辫触锛�",LogType.Grant);
throw new VCIError("0", new String[0]);
}
return res;
@@ -239,14 +239,14 @@
Role role = roleService.selectRole(roleId);
res = service.reAddRoleRightWithNoCheck(roleRights, rightType);
if (res)
- LogRecordUtil.writeLog(userEntity, "澧炲姞鎺堟潈", "鎴愬姛", role.getLogInfo(), LogType.GrantPrivileges, role.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "澧炲姞鎺堟潈", "鎴愬姛", role.getLogInfo(), LogType.Grant, role.getId());
else
- LogRecordUtil.writeLog(userEntity, "澧炲姞鎺堟潈", "澶辫触", role.getLogInfo(), LogType.GrantPrivileges, role.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "澧炲姞鎺堟潈", "澶辫触", role.getLogInfo(), LogType.Grant, role.getId());
} catch (Exception e) {
//e.printStackTrace();
ServerWithLog4j.logger.error(e);
// LogRecordUtil.writeLog(userEntity, "鎺堟潈",
- // "鍔熻兘妯″潡鎺堟潈澶辫触锛�",LogType.GrantPrivileges);
+ // "鍔熻兘妯″潡鎺堟潈澶辫触锛�",LogType.Grant);
throw new VCIError("0", new String[0]);
}
return res;
diff --git a/Source/Service/FrameService/src/com/vci/server/framework/delegate/SystemCfgDelegate.java b/Source/Service/FrameService/src/com/vci/server/framework/delegate/SystemCfgDelegate.java
index 34841a9..559db31 100644
--- a/Source/Service/FrameService/src/com/vci/server/framework/delegate/SystemCfgDelegate.java
+++ b/Source/Service/FrameService/src/com/vci/server/framework/delegate/SystemCfgDelegate.java
@@ -7,7 +7,6 @@
import org.apache.commons.lang3.StringUtils;
-import com.vci.common.log.LogType;
import com.vci.common.objects.UserEntity;
import com.vci.common.resource.CommonProperties;
import com.vci.common.utility.ObjectUtility;
@@ -17,12 +16,13 @@
import com.vci.corba.framework.data.SpecialCharClsfInfo;
import com.vci.corba.framework.data.SpecialCharInfo;
import com.vci.corba.framework.data.SystemCfgInfo;
+import com.vci.corba.log.data.LogType;
import com.vci.corba.common.data.UserEntityInfo;
import com.vci.server.base.delegate.BaseDelegate;
import com.vci.server.base.delegate.UserEntityDelegate;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.framework.systemConfig.SystemCfg;
import com.vci.server.framework.systemConfig.SystemCfgService;
-import com.vci.server.framework.systemConfig.log.LogRecordUtil;
import com.vci.server.framework.systemConfig.specialchar.SpecialChar;
import com.vci.server.framework.systemConfig.specialchar.SpecialCharService;
import com.vci.server.framework.systemConfig.specialcharclsf.SpecialCharClsf;
@@ -101,13 +101,13 @@
}
String id = ObjectUtility.getNewObjectID36();
specialCharClsfInfo.id = id;
- UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
+ //UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
try {
SpecialCharClsf special = changeSpecialCharClsfInfoToSpecialCharClsf(specialCharClsfInfo);
specialCharClsfService.saveSpecialCharClsf(special);
- LogRecordUtil.writeLog(userEntity, "娣诲姞", "鎴愬姛", special.getLogInfo(),LogType.GeneralOperation,special.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "娣诲姞", "鎴愬姛", special.getLogInfo(),LogType.General,special.getId());
} catch (Exception e) {
- //LogRecordUtil.writeLog(userEntity, "鐗规畩瀛楃鍒嗙被", "娣诲姞澶辫触锛�",LogType.GeneralOperation);
+ //LogRecordUtil.writeLog(userEntity, "鐗规畩瀛楃鍒嗙被", "娣诲姞澶辫触锛�",LogType.General);
e.printStackTrace();
throw new VCIError("150008", new String[]{});
}
@@ -124,7 +124,7 @@
SpecialCharClsfService specialCharClsfService = new SpecialCharClsfService();
SpecialCharClsf checkSpecialCharClsf = specialCharClsfService.selectSpecialCharClsfByName(specialCharClsfInfo.name);
UserEntityDelegate.setUserEntityToService(specialCharClsfService, userEntityInfo);
- UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
+ //UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
if (checkSpecialCharClsf != null && !checkSpecialCharClsf.getId().equals(specialCharClsfInfo.id)) {
throw new VCIError("10063", new String[]{});
}
@@ -135,7 +135,7 @@
StringBuilder logres = new StringBuilder();
logres.append("鏇存柊鍓嶏細"+speciaBefore.getLogInfo());
logres.append(" 鏇存柊鍚�:"+specia.getLogInfo());
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "鎴愬姛", logres.toString(), LogType.GeneralOperation,specia.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "鏇存柊", "鎴愬姛", logres.toString(), LogType.General,specia.getId());
} catch (Exception e) {
e.printStackTrace();
throw new VCIError("150012", new String[]{});
@@ -230,7 +230,7 @@
*/
public boolean deletSpecialCharClsf(String[] ids, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
- UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
+ //UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
SpecialCharClsfService specialCharClsfService = new SpecialCharClsfService();
try {
UserEntityDelegate.setUserEntityToService(specialCharClsfService, userEntityInfo);
@@ -243,10 +243,10 @@
Iterator<String> it = map.keySet().iterator();
while(it.hasNext()){
String speciaId = it.next();
- LogRecordUtil.writeLog(userEntity, "鍒犻櫎", "鎴愬姛", speciaId, LogType.GeneralOperation,map.get(speciaId));
+ LogRecordUtil.writeLog(userEntityInfo, "鍒犻櫎", "鎴愬姛", speciaId, LogType.General,map.get(speciaId));
}
} catch (Exception e) {
- //LogRecordUtil.writeLog(userEntity, "鐗规畩瀛楃鍒嗙被", "鍒犻櫎澶辫触锛�",LogType.GeneralOperation);
+ //LogRecordUtil.writeLog(userEntity, "鐗规畩瀛楃鍒嗙被", "鍒犻櫎澶辫触锛�",LogType.General);
e.printStackTrace();
throw new VCIError("150002", new String[]{});
}
@@ -262,7 +262,7 @@
SpecialCharService specialCharService = new SpecialCharService();
int length = specialCharInfos.length;
UserEntityDelegate.setUserEntityToService(specialCharService, userEntityInfo);
- UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
+ //UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
for (int i = 0; i < length; i++) {
SpecialChar checksPecialChar = specialCharService.getSepcialCharByClsfIdAndVal(specialCharInfos[i].parentId, specialCharInfos[i].value);
if (checksPecialChar != null) {
@@ -275,9 +275,9 @@
try {
SpecialChar specia = changeSpecialCharInfoToSpecialChar(specialCharInfos[i]);
specialCharService.saveSpecialChar(specia);
- LogRecordUtil.writeLog(userEntity, "娣诲姞", "鎴愬姛", specia.getLogInfo(),LogType.GeneralOperation,specia.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "娣诲姞", "鎴愬姛", specia.getLogInfo(),LogType.General,specia.getId());
} catch (Exception e) {
- //LogRecordUtil.writeLog(userEntity, "鐗规畩瀛楃", "娣诲姞澶辫触锛�",LogType.GeneralOperation);
+ //LogRecordUtil.writeLog(userEntity, "鐗规畩瀛楃", "娣诲姞澶辫触锛�",LogType.General);
e.printStackTrace();
throw new VCIError("150006", new String[]{});
}
@@ -294,7 +294,7 @@
SpecialCharService specialCharService = new SpecialCharService();
UserEntityDelegate.setUserEntityToService(specialCharService, userEntityInfo);
SpecialChar checksPecialChar = specialCharService.getSepcialCharByClsfIdAndVal(specialCharInfo.parentId, specialCharInfo.value);
- UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
+ //UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
if (checksPecialChar != null && !checksPecialChar.getId().equals(specialCharInfo.id)) {
throw new VCIError("10062", new String[]{});
}
@@ -305,9 +305,9 @@
StringBuilder logres = new StringBuilder();
logres.append("鏇存柊鍓嶏細"+speciaBefore.getLogInfo());
logres.append(" 鏇存柊鍚�:"+specia.getLogInfo());
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "鎴愬姛", logres.toString(), LogType.GeneralOperation,specia.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "鏇存柊", "鎴愬姛", logres.toString(), LogType.General,specia.getId());
} catch (Exception e) {
- //LogRecordUtil.writeLog(userEntity, "鐗规畩瀛楃", "淇敼澶辫触锛�",LogType.GeneralOperation);
+ //LogRecordUtil.writeLog(userEntity, "鐗规畩瀛楃", "淇敼澶辫触锛�",LogType.General);
e.printStackTrace();
throw new VCIError("150010", new String[]{});
}
@@ -322,7 +322,7 @@
public boolean deletSpecialChar(String[] ids, UserEntityInfo userEntityInfo) throws VCIError {
boolean rs = true;
SpecialCharService specialCharService = new SpecialCharService();
- UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
+ //UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
try {
UserEntityDelegate.setUserEntityToService(specialCharService, userEntityInfo);
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
@@ -334,9 +334,9 @@
Iterator<String> it = map.keySet().iterator();
while(it.hasNext()){
String logKey = it.next();
- LogRecordUtil.writeLog(userEntity, "鍒犻櫎", "鎴愬姛", logKey, LogType.GeneralOperation,map.get(logKey)); }
+ LogRecordUtil.writeLog(userEntityInfo, "鍒犻櫎", "鎴愬姛", logKey, LogType.General,map.get(logKey)); }
} catch (Exception e) {
- //LogRecordUtil.writeLog(userEntity, "鐗规畩瀛楃", "鍒犻櫎澶辫触锛�",LogType.GeneralOperation);
+ //LogRecordUtil.writeLog(userEntity, "鐗规畩瀛楃", "鍒犻櫎澶辫触锛�",LogType.General);
e.printStackTrace();
throw new VCIError("150001", new String[]{});
}
diff --git a/Source/Service/FrameService/src/com/vci/server/framework/right/roleRight/RoleRightService.java b/Source/Service/FrameService/src/com/vci/server/framework/right/roleRight/RoleRightService.java
index 25537ea..eb25cd5 100644
--- a/Source/Service/FrameService/src/com/vci/server/framework/right/roleRight/RoleRightService.java
+++ b/Source/Service/FrameService/src/com/vci/server/framework/right/roleRight/RoleRightService.java
@@ -57,7 +57,7 @@
}
String hql = "delete RoleRight where roleId = ? and rightType=?";
- impl.createQuery(hql, new Object[] { roleId.trim(), rightType });
+ impl.createQuery(hql, new Object[] { roleId.trim(), (short)rightType });
return true;
}
});
@@ -76,7 +76,7 @@
// 娉ㄩ噴鏍规嵁rightType鍒犻櫎瑙掕壊鏉冮檺锛岄伩鍏嶇鐞嗗憳瑙掕壊鍜屾櫘閫氱敤鎴疯鑹茬浉浜掑奖鍝�
String hql = "delete RoleRight where rightType = ? and roleId = ? ";
Object[] values = new Object[2];
- values[0] = rightType;
+ values[0] = (short)rightType;
values[1] = roleId;
impl.createQuery(hql, values);
@@ -176,7 +176,7 @@
private void prepareCreateBOPsmt(PreparedStatement pst, RoleRight roleRight) throws SQLException {
pst.setString(1, roleRight.getRoleId());
pst.setString(2, roleRight.getFuncId());
- pst.setLong(3, roleRight.getRightType());
+ pst.setShort(3, roleRight.getRightType());
pst.setLong(4, roleRight.getRightValue());
pst.setString(5, roleRight.getCreateUser());
pst.setTimestamp(6, new Timestamp(roleRight.getCreateTime().getTime()));
@@ -201,7 +201,7 @@
/** 鑾峰彇鎵�閫夎鑹插凡鏈夌殑妯″潡鎺堟潈 **/
String hql = "from RoleRight where rightType = ? and roleId = ? ";
Object[] values = new Object[2];
- values[0] = rightType;
+ values[0] = (short)rightType;
values[1] = roleId;
List<RoleRight> myRoleRights = impl.findEntites(hql, values);
List<String> funcIds = new ArrayList<String>();
@@ -241,15 +241,16 @@
return (List<RoleRight>) new HibernateTemplate().run(new HibernateCallback() {
public Object execute() throws HibernateException {
RoleRightDaoImpl impl = new RoleRightDaoImpl();
- String hql = "from RoleRight where rightType = ? and roleId = ? ";
+ String hql = "";
if (rightType == 0) {
hql = "from RoleRight where roleId = ? ";
Object[] values = new Object[1];
values[0] = roleId;
return impl.findEntites(hql, values);
} else {
+ hql = "from RoleRight where rightType = ? and roleId = ? ";
Object[] values = new Object[2];
- values[0] = rightType;
+ values[0] = (short)rightType;
values[1] = roleId;
return impl.findEntites(hql, values);
}
diff --git a/Source/Service/FrameService/src/com/vci/server/framework/systemConfig/stafforgmanage/dept/DepartmentService.java b/Source/Service/FrameService/src/com/vci/server/framework/systemConfig/stafforgmanage/dept/DepartmentService.java
index ddfd812..30310ac 100644
--- a/Source/Service/FrameService/src/com/vci/server/framework/systemConfig/stafforgmanage/dept/DepartmentService.java
+++ b/Source/Service/FrameService/src/com/vci/server/framework/systemConfig/stafforgmanage/dept/DepartmentService.java
@@ -5,16 +5,11 @@
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
import java.util.List;
-import java.util.Map;
-
import org.apache.commons.lang3.StringUtils;
import org.hibernate.HibernateException;
import com.vci.common.objects.UserEntity;
-import com.vci.common.utility.ObjectUtility;
import com.vci.server.base.persistence.dao.BaseService;
import com.vci.server.base.persistence.dao.HibernateCallback;
import com.vci.server.base.persistence.dao.HibernateCallbackExt;
diff --git a/Source/Service/FrameService/src/com/vci/server/framework/volume/VolumeManagerImpl.java b/Source/Service/FrameService/src/com/vci/server/framework/volume/VolumeManagerImpl.java
index 22dca8a..abe43ab 100644
--- a/Source/Service/FrameService/src/com/vci/server/framework/volume/VolumeManagerImpl.java
+++ b/Source/Service/FrameService/src/com/vci/server/framework/volume/VolumeManagerImpl.java
@@ -7,7 +7,7 @@
import com.vci.corba.framework.data.PvolumeInfo;
import com.vci.server.BaseService;
import com.vci.server.framework.volume.delegate.PvolumeDelegate;
-import com.vci.server.framework.volume.service.VolumeCatch;
+import com.vci.server.framework.cache.VolumeCatch;
import com.zeroc.Ice.Current;
/**
diff --git a/Source/Service/FrameService/src/com/vci/server/framework/volume/delegate/PvolumeDelegate.java b/Source/Service/FrameService/src/com/vci/server/framework/volume/delegate/PvolumeDelegate.java
index f93917e..39a7d6f 100644
--- a/Source/Service/FrameService/src/com/vci/server/framework/volume/delegate/PvolumeDelegate.java
+++ b/Source/Service/FrameService/src/com/vci/server/framework/volume/delegate/PvolumeDelegate.java
@@ -5,19 +5,19 @@
import java.util.List;
import org.apache.commons.lang3.StringUtils;
-import com.vci.common.log.LogType;
import com.vci.common.objects.UserEntity;
import com.vci.common.utility.ObjectUtility;
import com.vci.corba.common.VCIError;
import com.vci.corba.common.data.UserEntityInfo;
import com.vci.corba.framework.data.PvolumeInfo;
+import com.vci.corba.log.data.LogType;
import com.vci.server.base.delegate.BaseDelegate;
import com.vci.server.base.delegate.UserEntityDelegate;
+import com.vci.server.base.utility.LogRecordUtil;
import com.vci.server.cache.VolumeCacheProvider;
-import com.vci.server.framework.systemConfig.log.LogRecordUtil;
+import com.vci.server.framework.cache.VolumeCatch;
import com.vci.server.framework.volume.dao.Pvolume;
import com.vci.server.framework.volume.service.PvolumeService;
-import com.vci.server.framework.volume.service.VolumeCatch;
public class PvolumeDelegate extends BaseDelegate {
@@ -46,14 +46,14 @@
}
Pvolume pvolume = changePvolumeInfoToPvolume(pvolumeInfo);
- UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
+ //UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
try {
//createFileCabinet(pvolume.getPath());
boolean success = pvoSer.savePvolume(pvolume);
if (success) {
VolumeCatch.setVolume(pvolumeInfo);
}
- LogRecordUtil.writeLog(userEntity, "娣诲姞", success ? "娣诲姞鎴愬姛" : "娣诲姞澶辫触", pvolume.getLogInfo(),LogType.GeneralOperation,pvolume.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "娣诲姞", success ? "娣诲姞鎴愬姛" : "娣诲姞澶辫触", pvolume.getLogInfo(),LogType.General,pvolume.getId());
} catch (Exception e) {
throw new VCIError("310100",new String[0]);
}
@@ -135,7 +135,7 @@
UserEntityDelegate.setUserEntityToService(pvoSer, userEntityInfo);
Pvolume pvolume = changePvolumeInfoToPvolume(pvoInfo);
- UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
+ //UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
try{
Pvolume pvolumeBefore = pvoSer.getProlumeById(pvolume.getId());
boolean success = pvoSer.updatePvolume(pvolume);
@@ -145,9 +145,9 @@
StringBuilder logres = new StringBuilder();
logres.append("鏇存柊鍓嶏細"+pvolumeBefore.getLogInfo());
logres.append("鏇存柊鍚庯細"+pvolume.getLogInfo());
- LogRecordUtil.writeLog(userEntity, "鏇存柊", success ? "淇敼鎴愬姛" : "淇敼澶辫触", logres.toString(), LogType.GeneralOperation,pvolumeBefore.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "鏇存柊", success ? "淇敼鎴愬姛" : "淇敼澶辫触", logres.toString(), LogType.General,pvolumeBefore.getId());
}catch(Exception e){
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "淇敼澶辫触", e.getMessage(), LogType.GeneralOperation, pvoInfo.id);
+ LogRecordUtil.writeLog(userEntityInfo, "鏇存柊", "淇敼澶辫触", e.getMessage(), LogType.General, pvoInfo.id);
throw new VCIError("310103", new String[0]);
}
@@ -163,7 +163,7 @@
*/
public boolean deletePvolume(String[] ids, UserEntityInfo userEntityInfo) throws VCIError {
UserEntityDelegate.setUserEntityToService(pvoSer, userEntityInfo);
- UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
+ //UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
try {
List<Pvolume> list = new ArrayList<Pvolume>();
@@ -176,7 +176,7 @@
for (Pvolume vol : list) {
String volId = vol.getId();
VolumeCatch.delVolume(vol.getName());
- LogRecordUtil.writeLog(userEntity, "鍒犻櫎", "鍒犻櫎鎴愬姛", volId, LogType.GeneralOperation, vol.getLogInfo());
+ LogRecordUtil.writeLog(userEntityInfo, "鍒犻櫎", "鍒犻櫎鎴愬姛", volId, LogType.General, vol.getLogInfo());
}
} catch (Exception e) {
throw new VCIError("310104", new String[0]);
@@ -191,7 +191,7 @@
public void updatePvolumeInvalid(UserEntityInfo userEntityInfo)throws VCIError{
UserEntityDelegate.setUserEntityToService(pvoSer, userEntityInfo);
- UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
+ //UserEntity userEntity = changeUserEntityInfoToUserEntity(userEntityInfo);
Pvolume pvo = pvoSer.getIsvalidVolumeName();
try{
@@ -202,10 +202,10 @@
logres.append("鏇存柊鍓嶏細"+pvo.getLogInfo()+"涓洪閫夎矾寰勶紒");
pvo.setIsvalid(false);
logres.append(" 鏇存柊鍚�:"+pvo.getLogInfo()+"涓嶄负棣栭�夎矾寰�");
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "淇敼鎴愬姛", logres.toString(), LogType.GeneralOperation,pvo.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "鏇存柊", "淇敼鎴愬姛", logres.toString(), LogType.General,pvo.getId());
}
}catch(Exception e){
- LogRecordUtil.writeLog(userEntity, "鏇存柊", "淇敼澶辫触", e.getMessage(), LogType.GeneralOperation,pvo.getId());
+ LogRecordUtil.writeLog(userEntityInfo, "鏇存柊", "淇敼澶辫触", e.getMessage(), LogType.General,pvo.getId());
throw new VCIError("310105", new String[0]);
}
}
diff --git a/Source/Service/FrameService/src/properties/hibernate.map.xml b/Source/Service/FrameService/src/properties/hibernate.map.xml
index e7e61b2..58f9d5c 100644
--- a/Source/Service/FrameService/src/properties/hibernate.map.xml
+++ b/Source/Service/FrameService/src/properties/hibernate.map.xml
@@ -16,7 +16,6 @@
<mapping resource="com/vci/server/framework/hbm/SystemCfg.hbm.xml"/>
<mapping resource="com/vci/server/framework/hbm/SpecialChar.hbm.xml"/>
<mapping resource="com/vci/server/framework/hbm/SpecialCharClfy.hbm.xml"/>
- <mapping resource="com/vci/server/framework/hbm/Log.hbm.xml"/>
<mapping resource="com/vci/server/framework/hbm/MachSecurity.hbm.xml"/>
<mapping resource="com/vci/server/framework/hbm/Pvolume.hbm.xml"/>
</hbmfiles>
\ No newline at end of file
diff --git a/Source/Service/LogService/.classpath b/Source/Service/LogService/.classpath
new file mode 100644
index 0000000..ecb703c
--- /dev/null
+++ b/Source/Service/LogService/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry excluding="com/vci/server/framework/delegate/SpecialRoleDelegate.java|com/vci/server/framework/systemConfig/specialRole/|com/vci/server/common/PinyinCommon.java|com/vci/server/framework/systemConfig/log/LogAutoControlUtil.java|com/vci/server/framework/volume/VolumeManagerImpl.java|com/vci/server/VolumeFactoryBoxService.java|com/vci/server/log/utils/LogRecordUtil.java" kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/PLTCommon"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/ServiceBase"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/ThirdJAR"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/PLTSlice"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Common"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/Source/Service/LogService/.project b/Source/Service/LogService/.project
new file mode 100644
index 0000000..414332c
--- /dev/null
+++ b/Source/Service/LogService/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>LogService</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+ <filteredResources>
+ <filter>
+ <id>1704940758247</id>
+ <name></name>
+ <type>30</type>
+ <matcher>
+ <id>org.eclipse.core.resources.regexFilterMatcher</id>
+ <arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+ </matcher>
+ </filter>
+ </filteredResources>
+</projectDescription>
diff --git a/Source/Service/LogService/build-jar.xml b/Source/Service/LogService/build-jar.xml
new file mode 100644
index 0000000..53577a7
--- /dev/null
+++ b/Source/Service/LogService/build-jar.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--classes.jar; src.jar-->
+<project name = "platform-LogService" default = "build-LogService-jar" basedir = ".">
+
+ <property file="../../build.properties"/>
+
+ <target name="time">
+ <tstamp>
+ <format property="build.time" pattern="yyyy.MM.dd.HH.mm" locale="en"/>
+ </tstamp>
+ </target>
+
+
+ <target name="build-LogService-jar" depends="time" description="build LogService jar">
+ <jar jarfile="${dest.dir}/LogService.jar" compress="true">
+ <manifest>
+ <attribute name="Built-By" value="${user.name}" />
+ <attribute name="Implementation-Title" value="${ant.project.name}" />
+ <attribute name="Built-Time" value="${build.time}" />
+ <attribute name="platform-version" value="${platform.version}" />
+ </manifest>
+ <fileset dir="${basedir}\bin">
+ <include name="com/vci/**" />
+ <include name="properties/hibernate.map.xml" />
+ <include name="properties/RMIP**.**" />
+ </fileset>
+ </jar>
+ <copy todir="${service.dir}">
+ <fileset dir="${basedir}/dist">
+ <include name="**.jar" />
+ </fileset>
+ </copy>
+
+
+ </target>
+</project>
\ No newline at end of file
diff --git a/Source/Service/LogService/build.properties b/Source/Service/LogService/build.properties
new file mode 100644
index 0000000..c626764
--- /dev/null
+++ b/Source/Service/LogService/build.properties
@@ -0,0 +1,16 @@
+
+src.dir = ${basedir}/src
+dest.dir=${basedir}/dist
+
+#app.dir=${vci_home}
+
+lib.dir = ${app_home}/lib
+common.dir=${lib.dir}/common
+service.dir=${lib.dir}/service
+client.dir=${lib.dir}/client
+
+grid.app = ${app_home}/../grid/app
+grid.common=${grid.app}/common
+grid.service=${grid.app}/service
+
+platform.version=2024
\ No newline at end of file
diff --git a/Source/Service/LogService/dist/LogService.jar b/Source/Service/LogService/dist/LogService.jar
new file mode 100644
index 0000000..5bccd28
--- /dev/null
+++ b/Source/Service/LogService/dist/LogService.jar
Binary files differ
diff --git a/Source/Service/LogService/properties/ServerWithLog4j.properties b/Source/Service/LogService/properties/ServerWithLog4j.properties
new file mode 100644
index 0000000..0001fd2
--- /dev/null
+++ b/Source/Service/LogService/properties/ServerWithLog4j.properties
@@ -0,0 +1,10 @@
+log4j.logger.ServerLog=debug,A1,R
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
+log4j.appender.R=org.apache.log4j.RollingFileAppender
+log4j.appender.R.File=server_log.txt
+log4j.appender.R.MaxFileSize=500KB
+log4j.appender.R.MaxBackupIndex=10
+log4j.appender.R.layout=org.apache.log4j.PatternLayout
+log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
\ No newline at end of file
diff --git a/Source/Service/LogService/properties/Timer.properties b/Source/Service/LogService/properties/Timer.properties
new file mode 100644
index 0000000..983f50f
--- /dev/null
+++ b/Source/Service/LogService/properties/Timer.properties
@@ -0,0 +1,5 @@
+time_schedule_count=1
+time_type_0=day
+time_schedule_0=com.vci.rmip.timer.server.FirstTimer
+start_time_0=2013/12/24 14\:00\:00
+time_period_0=1
diff --git a/Source/Service/LogService/properties/volume.properties b/Source/Service/LogService/properties/volume.properties
new file mode 100644
index 0000000..fc16f35
--- /dev/null
+++ b/Source/Service/LogService/properties/volume.properties
@@ -0,0 +1,12 @@
+#鍗锋湇鍔�
+volumnservicecount=1
+volumn.service0.name=VolumnFactoryService
+volumn.service0.class=com.vci.rmip.volumn.server.impl.VolumnFactoryImpl
+historyCopyCount=3
+#isReadOnly=false
+
+#鏂囦欢浼犺緭鍧楀ぇ灏忥紝1024鐨勫�嶆暟
+blockLength=32
+
+#鏂囦欢鏄惁鍔犲瘑
+isFileEncry=true
diff --git a/Source/Service/LogService/src/com/vci/server/LogBoxService.java b/Source/Service/LogService/src/com/vci/server/LogBoxService.java
new file mode 100644
index 0000000..713d8c0
--- /dev/null
+++ b/Source/Service/LogService/src/com/vci/server/LogBoxService.java
@@ -0,0 +1,45 @@
+package com.vci.server;
+
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+import com.vci.server.base.log.PltLogger;
+import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.log.LogServiceImpl;
+import com.vci.server.mw.ServerContextInterceptor;
+import com.zeroc.Ice.Communicator;
+import com.zeroc.Ice.Identity;
+import com.zeroc.Ice.ObjectAdapter;
+import com.zeroc.Ice.Util;
+import com.zeroc.IceBox.Service;
+
+public class LogBoxService implements Service {
+ //private static final Logger LOGGER = LoggerFactory.getLogger(FrameBoxService.class);
+ private static final PltLogger LOGGER = new PltLogger(LogBoxService.class.getName());
+ protected ObjectAdapter _adapter;
+ protected Identity id;
+
+ @Override
+ public void start(String name, Communicator communicator, String[] args) {
+ LOGGER.info("start servant: " + name);
+
+ HibernateSessionFactory.getConfiguration();
+
+ // IceBox
+ Util.setProcessLogger(LOGGER);
+ // 鍒涘缓objectAdapter锛岃繖閲屽拰service鍚屽悕
+ _adapter = communicator.createObjectAdapter(name);
+ // 鍒涘缓servant
+ com.zeroc.Ice.Object object = new LogServiceImpl();
+ _adapter.add(new ServerContextInterceptor(object), Util.stringToIdentity(name));
+ // 婵�娲�
+ _adapter.activate();
+ LOGGER.info("start servant success: " + name);
+ }
+
+ @Override
+ public void stop() {
+ LOGGER.info("FrameworkService stoped, args");
+ _adapter.destroy();
+ }
+
+}
diff --git a/Source/Service/LogService/src/com/vci/server/LogServiceMain.java b/Source/Service/LogService/src/com/vci/server/LogServiceMain.java
new file mode 100644
index 0000000..7450571
--- /dev/null
+++ b/Source/Service/LogService/src/com/vci/server/LogServiceMain.java
@@ -0,0 +1,10 @@
+package com.vci.server;
+
+
+public class LogServiceMain {
+
+ public static void main(String[] args) {
+
+ }
+
+}
diff --git a/Source/Service/LogService/src/com/vci/server/log/LogServiceImpl.java b/Source/Service/LogService/src/com/vci/server/log/LogServiceImpl.java
new file mode 100644
index 0000000..f629e49
--- /dev/null
+++ b/Source/Service/LogService/src/com/vci/server/log/LogServiceImpl.java
@@ -0,0 +1,175 @@
+package com.vci.server.log;
+
+import java.util.Date;
+import com.vci.common.ServiceNames;
+import com.vci.corba.common.VCIError;
+import com.vci.corba.common.data.UserEntityInfo;
+import com.vci.corba.log.LogService;
+import com.vci.corba.log.data.LogInfo;
+import com.vci.corba.log.data.LogPeriodInfo;
+import com.vci.corba.log.data.LogType;
+import com.vci.corba.log.data.RefObj;
+import com.vci.server.BaseService;
+import com.vci.server.log.delegate.LogManagementDelegate;
+
+
+import com.zeroc.Ice.Current;
+
+/**
+ * <p>Title: </p>
+ * <p>Copyright: Copyright (c) 2011</p>
+ * <p>Company: VCI</p>
+ * @author Administrator
+ * @time 2011-6-3
+ * @version 1.0
+ */
+public class LogServiceImpl extends BaseService implements LogService {
+
+
+ public LogServiceImpl() {
+// AppConfigDetailCatch.InitCatch();
+// UserCacheUtil.initCache();
+// DeptCacheUtil.initCache();
+// RoleCacheUtil.initCache();
+ }
+
+
+ @Override
+ public String getServiceName() {
+ return ServiceNames.LOGSERVICE;
+ }
+
+
+ @Override
+ public boolean test(com.zeroc.Ice.Current current) {
+ String op = current.operation;
+ String adapter = current.adapter.getName();
+ String id = current.id.name;
+ String time = new Date().toString();
+ System.out.println(String.format("== %s [FrameworkService.test] (adapter=%s, id=%s, op=%s)", time, adapter, id, op));
+
+ return true;
+ }
+
+
+
+ /*-------------------鏃ュ織绠$悊妯″潡---------------------*/
+ @Override
+ public boolean savePeriod(String period, UserEntityInfo userEntity, Current current) throws VCIError {
+ return new LogManagementDelegate().savePeriod(period, userEntity);
+ }
+
+ /**
+ * 鑾峰彇褰撳墠淇濆瓨/澶囦唤鏈熼檺
+ */
+ @Override
+ public int getCurPeriod(com.zeroc.Ice.Current current) throws VCIError {
+ LogManagementDelegate logDel = new LogManagementDelegate();
+ return logDel.getCurPeriod();
+ }
+
+ /**
+ * 鍒濆鍖栨棩蹇楁ā鍧楁椂妫�鏌ユ槸鍚﹂厤缃簡鑷姩鍒犻櫎
+ */
+ @Override
+ public boolean getIsAutoDelete(com.zeroc.Ice.Current current) throws VCIError {
+ LogManagementDelegate logDel = new LogManagementDelegate();
+ boolean res = false;
+ res = logDel.getIsAutoDelete();
+ return res;
+ }
+
+
+
+ /**
+ * 鑾峰彇閰嶇疆濂界殑鏃ュ織鏌ヨ椤甸潰鏄剧ず鏉℃暟
+ */
+ @Override
+ public long getPageSize(com.zeroc.Ice.Current current) throws VCIError {
+ LogManagementDelegate logDel = new LogManagementDelegate();
+ return logDel.getPageSize();
+ }
+
+ /**
+ * 鑾峰彇褰撳墠鏌ヨ鏃ュ織鐨勬�绘潯锟�?
+ */
+ @Override
+ public long getSumLogRows(String sql, com.zeroc.Ice.Current current) throws VCIError {
+ LogManagementDelegate logDel = new LogManagementDelegate();
+ return logDel.getSumLogRows(sql);
+ }
+
+
+ /**
+ * 鎵嬪姩鍒犻櫎鏃ュ織
+ */
+ @Override
+ public boolean deleteLog(String deleteDate, com.zeroc.Ice.Current current) throws VCIError {
+ LogManagementDelegate logDel = new LogManagementDelegate();
+ return logDel.deleteLog(deleteDate);
+ }
+
+
+
+ @Override
+ public LogPeriodInfo[] getPeriods(com.zeroc.Ice.Current current) throws VCIError {
+ LogManagementDelegate logDel = new LogManagementDelegate();
+ return logDel.getPeriods();
+ }
+
+ @Override
+ public LogInfo[] fetchLogInfo(int pageNo, int pagesize, String sql, com.zeroc.Ice.Current current)
+ throws VCIError {
+ LogManagementDelegate logDel = new LogManagementDelegate();
+ return logDel.fetchLogInfo(pageNo, pagesize,sql);
+ }
+
+ @Override
+ public LogInfo[] getLogListByContion(int pageNo, int pagesize, String sql, com.zeroc.Ice.Current current)
+ throws VCIError {
+ LogManagementDelegate logDelegate = new LogManagementDelegate();
+ return logDelegate.getLogListByContion((int)pageNo,(int)pagesize,sql);
+ }
+
+ @Override
+ public void saveLoginLog(boolean success, String message, UserEntityInfo userEntityInfo, com.zeroc.Ice.Current current) throws VCIError {
+ new LogManagementDelegate().saveLoginLog(success, message, userEntityInfo);
+ }
+
+ @Override
+ public void saveLogoutLog(String message, UserEntityInfo userEntityInfo, com.zeroc.Ice.Current current)
+ throws VCIError {
+ new LogManagementDelegate().saveLogoutLog(message, userEntityInfo);
+ }
+
+ @Override
+ public void saveLockLog(String userId, UserEntityInfo userEntity, Current current) throws VCIError {
+ new LogManagementDelegate().saveLockUserLog(userId, userEntity);
+ }
+
+ @Override
+ public void saveLog(String result, String message, String type, LogType logType, String dataObjOid, UserEntityInfo userEntityInfo, com.zeroc.Ice.Current current) throws VCIError {
+ new LogManagementDelegate().saveLogV2(result, message, type, logType, dataObjOid, userEntityInfo);
+ }
+
+
+ @Override
+ public void saveObjLog(RefObj obj, String opType, String result, LogType logType, UserEntityInfo userEntity,
+ Current current) throws VCIError {
+ new LogManagementDelegate().saveObjLog(obj, opType, result, logType, userEntity);
+ }
+
+ @Override
+ public void batchSaveObjLog(RefObj[] objs, String opType, String result, UserEntityInfo userEntity, Current current)
+ throws VCIError {
+ new LogManagementDelegate().batchSaveObjLog(objs, opType, result, userEntity);
+ }
+
+
+// @Override
+// public boolean savePeriod(String period, UserEntityInfo userEntity, Current current) throws VCIError {
+// new LogManagementDelegate().savePeriod(period, userEntity);
+// }
+
+
+}
diff --git a/Source/Service/LogService/src/com/vci/server/log/dao/LogAutoControlUtil.java b/Source/Service/LogService/src/com/vci/server/log/dao/LogAutoControlUtil.java
new file mode 100644
index 0000000..3165e4b
--- /dev/null
+++ b/Source/Service/LogService/src/com/vci/server/log/dao/LogAutoControlUtil.java
@@ -0,0 +1,313 @@
+package com.vci.server.log.dao;
+
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.Transaction;
+
+//import com.vci.client.common.excel.SheetDataSet;
+import com.vci.common.log.ServerWithLog4j;
+import com.vci.common.resource.CommonProperties;
+//import com.vci.corba.framework.FrameworkServicePrx;
+import com.vci.corba.framework.data.UserInfo;
+import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.cache.OrgCacheProvider;
+import com.vci.server.log.objects.Log;
+
+
+public class LogAutoControlUtil {
+
+ private Timer timer = null;
+ private TimerTask timerTask = null;
+ private final String AUTO_DELETE_RATE = "log.autoDelete.rate";//鑷姩鍒犻櫎鎵ц棰戠巼
+ private final String AUTO_DELETE_TIME = "log.autoDelete.time";//姣忓ぉ鍚姩鑷姩浠诲姟鐨勬椂闂�
+ private final String LOG_SAVE_PERIOD = "logSavePeriod";//鏃ュ織淇濆瓨鏈熼檺
+ private final String AUTO_DELETE_BACK_PATH = "log.autoDelete.backPath";//澶囦唤鐨勬枃浠跺す
+ private Calendar cal = Calendar.getInstance();
+ private long period = 24*60*60*1000;//鎵ц鍛ㄦ湡锛岄厤缃枃浠堕噷閰嶇疆锛岃繖閲屽垵濮嬪寲涓�1澶�
+ private static LogAutoControlUtil instance = null;
+
+ public synchronized static LogAutoControlUtil getInstance(){
+ if(instance == null){
+ instance = new LogAutoControlUtil();
+ }
+ return instance;
+ }
+
+ /**
+ * 鑷姩浠诲姟鐨勫叆鍙�
+ */
+ public void startLogDeleteMonitoring(){
+ timer = new Timer();
+ timerTask = new TimerTask(){
+ @Override
+ public void run() {
+ autoDeleteTask();//鎵ц鑷姩鍒犻櫎
+ }
+
+ };
+ period = this.getPeriod() == 0 ? period : this.getPeriod();//濡傛灉鏃犻厤缃紝鍒欎娇鐢ㄩ粯璁ゅ��
+ int year = cal.get(Calendar.YEAR);//骞�
+ int month = cal.get(Calendar.MONTH);//鏈�
+ int day = cal.get(Calendar.DAY_OF_MONTH);//鏃�
+ int times[] = this.getTimeOfDay();//鏃跺垎绉掍负鎵嬪姩閰嶇疆鐨�
+ int hour = times[0];//鏃�
+ int minute = times[1];//鍒�
+ int seconds = times[2];//绉�
+ Calendar calendar = new GregorianCalendar(year,month,day,hour,minute,seconds);
+ timer.scheduleAtFixedRate(timerTask, calendar.getTime(), period);
+ }
+
+ /**
+ * 鑾峰彇鐢ㄦ埛閰嶇疆鐨勬墽琛岃捣濮嬫椂闂�
+ * @return
+ */
+ private int[] getTimeOfDay(){
+ String times = "";
+ int time[] = new int[3];
+ times = CommonProperties.getStringProperty(AUTO_DELETE_TIME);
+ String temp[] = times.split("::");
+ if(temp.length >=3){
+ time[0] = Integer.parseInt(temp[0]);
+ time[1] = Integer.parseInt(temp[1]);
+ time[2] = Integer.parseInt(temp[2]);
+ }
+ return time;
+ }
+
+ /**
+ * 鍙栧緱閰嶇疆鐨勮嚜鍔ㄤ换鍔℃墽琛屽懆鏈�
+ * @return
+ */
+ private long getPeriod(){
+ String days = "";
+ long res = 0;
+ days = CommonProperties.getStringProperty(AUTO_DELETE_RATE);
+ if(!days.equals("")&&days != null){
+ res = Long.valueOf(days);
+ }
+ return res*24*60*60*1000;//杞寲鎴愭绉�
+ }
+
+ /**
+ * 鑷姩浠诲姟鎵ц鐨勬牳蹇冩柟娉�
+ */
+ private void autoDeleteTask(){
+ ServerWithLog4j.logger.info("鏃ュ織鍒犻櫎鑷姩浠诲姟鍚姩...................");
+ LogService logSrv = new LogService();
+ int curPeriod = logSrv.getCurPeriod(LOG_SAVE_PERIOD);//鑾峰彇褰撳墠璁剧疆鏈熼檺
+ if(curPeriod<1){
+ return ;
+ }
+ StringBuffer whereSql = new StringBuffer();
+ boolean flag = false;
+ whereSql.append(" trunc(PLDATE) < add_months(trunc(sysdate),"+(-curPeriod)+")");
+ //瀵煎嚭excel
+ //鍏堟煡璇㈠嚭鏉ョ殑鏁版嵁
+ List<?> logList = logSrv.getLogListBySql(whereSql.toString());
+ long logCount = logList.size();//鏌ユ壘鍑鸿秴鍑烘湡闄愮殑鏃ュ織
+ ServerWithLog4j.logger.info("闇�瑕佸垹闄ょ殑鏃ュ織鏉℃暟涓猴細"+logCount);
+
+ List<List<Log>> logCollection = switchListForOracleIn((List<Log>)logList,60000);
+ String excelFilePrefix = "鑷姩澶囦唤鏃ュ織" + (new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));
+ if(logCount != 0){
+ for(int i = 0 ; i < logCollection.size() ; i++){
+ List<Log> logs = logCollection.get(i);
+ try{
+ writeLog2Excel(logs,excelFilePrefix,i);
+ }catch(Exception e){
+ e.printStackTrace();
+ ServerWithLog4j.logger.error("澶囦唤鏃ュ織鏂囦欢鍑洪敊",e);
+ }
+ }
+ Transaction t = HibernateSessionFactory.getSession().beginTransaction();
+
+ String sql = "delete from pllog where pltype<>'鍒犻櫎鏃ュ織' and "+whereSql.toString();
+ flag = logSrv.deleteLogBySql(sql, curPeriod);
+ t.commit();
+ ServerWithLog4j.logger.info("鍒犻櫎鏃ュ織"+(flag == true?"鎴愬姛锛�":"澶辫触锛�"));
+ }
+ ServerWithLog4j.logger.info("鏃ュ織鍒犻櫎鑷姩浠诲姟閫�鍑�...................");
+ }
+
+ private void writeLog2Excel(List<Log> logs,String excelFilePrefix,int sub) throws Exception{
+ String excel = excelFilePrefix + "_" + sub + ".xls";
+
+ //杞崲涓轰簩缁存暟缁�
+ List<String[]> lstData = new ArrayList<String[]>();
+ String[][] data = new String[logs.size()+1][8];
+ //data[0] = new String[]{"鐢ㄦ埛鍚�","濮撳悕","鐢ㄦ埛IP","妯″潡","鎿嶄綔","鏃堕棿","鎿嶄綔缁撴灉","鎻忚堪"};
+ lstData.add(new String[]{"鐢ㄦ埛鍚�","濮撳悕","鐢ㄦ埛IP","妯″潡","鎿嶄綔","鏃堕棿","鎿嶄綔缁撴灉","鎻忚堪"});
+ //闇�瑕佹煡璇㈢敤鎴风殑淇℃伅
+// List<String> userIdList = new ArrayList<String>();
+// for(Log log : logs){
+// String userName = log.getUsername();
+// if(!userIdList.contains(userName)){
+// userIdList.add(userName);
+// }
+// };
+// List<List<String>> userIdCollection = switchListForOracleIn(userIdList,500);
+ Map<String,String> userInfoMap = new HashMap<String,String>();
+
+
+// for(List<String> userIds :userIdCollection ){
+// UserInfo[] userInfos = new RightManagementDelegate().fetchUserInfoByNames(userIds.toArray(new String[0]));
+// if(userInfos.length > 0 ){
+// for(int i = 0 ; i < userInfos.length; i ++){
+// UserInfo user = userInfos[i];
+// userInfoMap.put(user.userName, user.trueName);
+// }
+// }
+// }
+
+ String userName = "";
+
+ for(int i = 0 ; i < logs.size(); i++){
+ Log log = logs.get(i);
+ String[] row = new String[8];
+ row[0] = log.getUsername();
+
+ userName = userInfoMap.get(log.getUsername());
+ if (StringUtils.isBlank(userName)) {
+ UserInfo user = OrgCacheProvider.getUser(log.getUsername());
+ if (user != null)
+ userName = user.trueName;
+ else
+ userName = "";
+
+ userInfoMap.put(log.getUsername(), userName);
+ }
+
+ row[1] = userName;
+ row[2] = log.getUserIp();
+ row[3] = log.getModule();
+ row[4] = log.getType();
+ row[5] = date2Str(log.getDate(),"yyyy-MM-dd HH:mm:ss");//鏃堕棿
+ String result = "鎿嶄綔鎴愬姛";
+ String memo = log.getResult();
+ if(StringUtils.isNotBlank(memo)){
+ boolean hasResult =false;
+ if(memo.startsWith("鎿嶄綔") && memo.length()>4){
+ result = memo.substring(0,4);
+ hasResult = true;
+ }
+ if((memo.startsWith("鐧诲叆") || memo.startsWith("鐧诲嚭"))&& memo.length()>4){
+ result = memo.substring(0,4);
+ hasResult = true;
+ }
+ if(memo.length()>5 && hasResult){
+ memo = memo.substring(5);
+ }else{
+ //memo = "";
+ }
+ }
+ row[6]=result;//缁撴灉
+ row[7]=memo;//鎻忚堪
+ //data[i+1] = row;
+ lstData.add(row);
+ }
+
+ //澶勭悊鏂囦欢
+ String tempFolderPath = CommonProperties.getStringProperty(AUTO_DELETE_BACK_PATH);
+ if(StringUtils.isBlank(tempFolderPath)){
+ tempFolderPath = this.getClass().getResource("/").getPath() + File.separator + "logsBack";
+ }
+ File folder = new File(tempFolderPath);
+ if(!folder.exists()){
+ folder.mkdirs();
+ }
+ File excelFile = new File(tempFolderPath+ File.separator +excel);
+ excelFile.createNewFile();
+
+ //SheetDataSet ds = new SheetDataSet();
+ //ds.setDataSet(lstData);
+ //ds.setSheet("鏃ュ織澶囦唤");
+
+ //ExcelDocumentUtils.writeExcelDocument(excelFile.getPath(), "鏃ュ織澶囦唤", ds);
+
+ ServerWithLog4j.logger.info("瀵煎嚭" + logs.size() + "鏉℃棩蹇楀埌excel鏂囦欢:" +excelFile.getAbsolutePath() );
+ }
+
+ /**
+ * 鏃堕棿杞崲
+ * @param d
+ * @param formate
+ * @return
+ */
+ private String date2Str(Date d,String formate){
+ SimpleDateFormat sdf = new SimpleDateFormat(formate);
+ return sdf.format(d);
+ }
+
+ /**
+ * oracle in 鏌ヨ涓嶈兘瓒呰繃1000锛岃浆鎹竴涓嬮泦鍚�
+ * 鐢变簬SQL璇彞1000涓彲鑳藉緢闀匡紝瓒呰繃oracle10g锛屾墍浠ョ壓鐗叉�ц兘鍒嗛厤涓�500涓暟缁�
+ * @param list 闇�瑕佽浆鎹㈢殑鍒楄〃鍐呭
+ * @return 鍒嗙粍鍚庣殑list
+ */
+ private <T> List<List<T>> switchListForOracleIn(List<T> list,int size) {
+ List<List<T>> listHasList = new ArrayList<List<T>>();
+ if(list == null){
+ return listHasList;
+ }
+ List<T> newList = new ArrayList<T>();
+ for(Object obj : list){
+ //涓轰簡璁﹍ist杩樺彲浠ユ坊鍔犲唴瀹癸紝鍥犱负浣跨敤sublist鍚庯紝list涓嶈兘鍐岮dd浜�
+ newList.add((T)obj);
+ }
+ int muti = 1;
+ if(newList.size() >size){
+ int balance = newList.size()%size;
+ muti = (newList.size() - balance)/size + (balance == 0?0:1);
+ }
+ for(int i = 0 ; i < muti; i ++){
+ int start = i*size;
+ int end = start + size;
+ if(i == muti-1 || end >newList.size() ){
+ end = newList.size();
+ }
+ List subList = newList.subList(start,end);
+ listHasList.add(subList);
+ }
+ return listHasList;
+ }
+
+
+ public static void main(String[] args){
+
+// Thread t1 = new Thread(){
+// public void run(){
+// LogAutoControlUtil.getInstance().startLogDeleteMonitoring();
+// System.err.println("Thread1..........................");
+// }
+// };
+//
+// Thread t2 = new Thread(){
+// Timer time = new Timer();
+// public void run(){
+// System.err.println("Thread2..........................");
+// time.schedule(new TimerTask(){
+// int i = 0;
+// @Override
+// public void run() {
+// System.err.println("i="+i++);
+// }
+//
+// }, 1000,1000);
+// }
+// };
+// t1.start();
+// t2.start();
+ }
+//
+}
diff --git a/Source/Service/LogService/src/com/vci/server/log/dao/LogDAO.java b/Source/Service/LogService/src/com/vci/server/log/dao/LogDAO.java
new file mode 100644
index 0000000..c66229c
--- /dev/null
+++ b/Source/Service/LogService/src/com/vci/server/log/dao/LogDAO.java
@@ -0,0 +1,8 @@
+package com.vci.server.log.dao;
+
+import com.vci.server.base.persistence.dao.GenericDao;
+import com.vci.server.log.objects.Log;
+
+public interface LogDAO extends GenericDao<Log, String> {
+
+}
diff --git a/Source/Service/LogService/src/com/vci/server/log/dao/LogDAOImpl.java b/Source/Service/LogService/src/com/vci/server/log/dao/LogDAOImpl.java
new file mode 100644
index 0000000..d098366
--- /dev/null
+++ b/Source/Service/LogService/src/com/vci/server/log/dao/LogDAOImpl.java
@@ -0,0 +1,8 @@
+package com.vci.server.log.dao;
+
+import com.vci.server.base.persistence.dao.GenericHibernateDao;
+import com.vci.server.log.objects.Log;
+
+public class LogDAOImpl extends GenericHibernateDao<Log, String> implements LogDAO {
+
+}
diff --git a/Source/Service/LogService/src/com/vci/server/log/dao/LogService.java b/Source/Service/LogService/src/com/vci/server/log/dao/LogService.java
new file mode 100644
index 0000000..e4204eb
--- /dev/null
+++ b/Source/Service/LogService/src/com/vci/server/log/dao/LogService.java
@@ -0,0 +1,572 @@
+package com.vci.server.log.dao;
+
+import java.net.UnknownHostException;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import org.hibernate.HibernateException;
+import org.hibernate.criterion.Order;
+import org.hibernate.type.Type;
+
+import com.vci.common.resource.CommonProperties;
+import com.vci.common.utility.ObjectUtility;
+import com.vci.corba.common.data.VCIInvocationInfo;
+import com.vci.server.base.persistence.dao.BaseService;
+import com.vci.server.base.persistence.dao.HibernateCallback;
+import com.vci.server.base.persistence.dao.HibernateCallbackExt;
+import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.base.persistence.dao.HibernateTemplate;
+import com.vci.server.log.objects.Log;
+import com.vci.server.log.objects.LogPeriod;
+
+
+/**
+ * 鏃ュ織妯″潡鎻愪緵鏈嶅姟鐨凷ervice
+ * @author xiong fei
+ * @time 2011-06-16
+ */
+public class LogService extends BaseService {
+
+ private final String LOG_DELETE_AUTO = "log.delete.auto";//閰嶇疆鏃ュ織鏄惁杩涜鑷姩鍒犻櫎
+ private final String LOG_SAVE_PERIODS = "log.save.periods";//閰嶇疆鐨勬棩蹇椾繚瀛樻湡闄愪笅鎷夋鐨勫��
+ private final String LOG_QUERY_PAGESIZE = "log.query.pagesize";//閰嶇疆鐨勬棩蹇楅〉闈㈡樉绀烘潯鏁�
+
+ public LogService() {
+ AlterTable();
+ }
+
+ /*
+ * 鏃ュ織琛ㄥ鍔犳棩蹇楀唴瀹瑰瓧娈�
+ */
+ private void AlterTable() {
+ String sql = "SELECT COUNT(1) as COLNUM FROM USER_TAB_COLUMNS WHERE TABLE_NAME='PLLOG' AND COLUMN_NAME='PLCONTENT'";
+ Connection connection = HibernateSessionFactory.getSessionConnection();
+ PreparedStatement pst = null;
+ ResultSet rs = null;
+
+ try {
+ pst = connection.prepareStatement(sql);
+ rs = pst.executeQuery();
+
+ int count = 0;
+ while(rs.next()){
+ count = rs.getInt("COLNUM");
+ }
+ rs.close();
+ rs = null;
+ pst.close();
+ pst = null;
+
+ if (count == 0) {
+ sql = "ALTER TABLE PLLOG ADD PLCONTENT VARCHAR2(1000)";
+ pst = connection.prepareStatement(sql);
+ pst.execute();
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (rs != null) {
+ rs.close();
+ }
+
+ if(pst != null) {
+ pst.close();
+ }
+ } catch (Exception e2) {
+ e2.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * 鑾峰彇鏃ュ織鍒犻櫎閰嶇疆
+ * @return true琛ㄧず鑷姩鍒犻櫎锛宖alse琛ㄧず鎵嬪姩鍒犻櫎
+ */
+ public boolean getIsAutoDelete() {
+ boolean res = false;
+ String isAuto = CommonProperties.getStringProperty(LOG_DELETE_AUTO);
+ if(isAuto.equals("Y")){
+ res = true;
+ }
+ return res;
+ }
+
+ /**
+ * 鑾峰彇閰嶇疆濂界殑淇濆瓨鍜屽浠芥湡闄愮殑涓嬫媺妗嗙殑鍊�
+ * @return
+ */
+ public LogPeriod[] getPeriods() {
+ String periods = CommonProperties.getStringProperty(LOG_SAVE_PERIODS);
+ String[] period = periods.split("::");
+ LogPeriod[] res = new LogPeriod[period.length];
+ for(int i = 0;i<period.length;i++){
+ String[] temp = period[i].split("#");
+ LogPeriod obj = new LogPeriod();
+ obj.setCode(temp[0]);
+ obj.setValue(temp[1]);
+ res[i] = obj;
+ }
+ return res;
+ }
+
+ /**
+ * 鑾峰彇閰嶇疆濂界殑鏃ュ織椤甸潰鏄剧ず鏉℃暟
+ * @return
+ */
+ public int getPageSize() {
+ String pageSize = CommonProperties.getStringProperty(LOG_QUERY_PAGESIZE);
+ if(pageSize == null){//濡傛灉鑾峰彇澶辫触锛岃繑鍥�0
+ return 0;
+ } else {
+ return Integer.parseInt(pageSize);
+ }
+ }
+
+ /**
+ * 淇濆瓨鏃ュ織
+ * <p>Description:淇濆瓨鏃ュ織 </p>
+ *
+ * @author xf
+ * @time 2012-6-1
+ */
+ public void saveLog(final Log log){
+ new HibernateTemplate().run(new HibernateCallback() {
+ @Override
+ public Object execute() throws HibernateException {
+ LogDAOImpl impl = new LogDAOImpl();
+ impl.save(log);
+ return true;
+ }
+ });
+ }
+
+ /**
+ * 鑾峰彇鏈鏌ヨ鏃ュ織鎬绘暟
+ * @param sql 鍓嶅彴鏉′欢鏌ヨ鐨凷QL
+ * @return 鏃ュ織鎬绘暟
+ */
+ public long getSumLogRows(final String sql) {
+ return (Long)new HibernateTemplate().run(new HibernateCallback() {
+
+ public Object execute() throws HibernateException {
+ LogDAOImpl impl = new LogDAOImpl();
+ return impl.getCountForLog(sql);
+ }
+ });
+ }
+
+ /**
+ * 浣跨敤SQL鑾峰彇鏃ュ織鐨勫垪琛�
+ * @param sql sql璇彞
+ * @return 鏃ュ織鐨勫璞�
+ */
+ public List<?> getLogListBySql(final String sql){
+ return (List<?>)new HibernateTemplate().runExt(new HibernateCallbackExt() {
+
+ public Object execute(Connection connection) throws HibernateException,
+ SQLException {
+ LogDAOImpl impl = new LogDAOImpl();
+ return impl.findEntites("from Log where " + sql + " order by date desc ",new String[0]);
+ }
+ });
+ }
+ /**
+ * 鍒嗛〉鏌ヨ锛岃幏鍙栨湰娆℃煡璇㈢殑鏃ュ織闆嗗悎
+ * @param pageNO 褰撳墠椤垫暟
+ * @param PageSize 椤甸潰澶у皬
+ * @return
+ */
+ public List<?> getLogList(final int pageNo,final int pageSize,final String sql){
+ return (List<?>)new HibernateTemplate().runExt(new HibernateCallbackExt() {
+
+ public Object execute(Connection connection) throws HibernateException,
+ SQLException {
+ LogDAOImpl impl = new LogDAOImpl();
+ Order order = Order.desc("date");//鎸夋椂闂存帓搴�
+ return impl.findList(pageNo, pageSize,sql,order);
+ }
+ });
+ }
+
+ public List<?> getLogListByContion(final int pageNo,final int pageSize,final String sql){
+ return (List<?>)new HibernateTemplate().run(new HibernateCallback() {
+ @Override
+ public Object execute() throws HibernateException {
+ int V_PAGE_ROWNUM_START = (pageNo - 1) * pageSize;
+ int V_PAGE_ROWNUM_END = (pageNo ) * pageSize;
+
+ LogDAOImpl impl = new LogDAOImpl();
+ StringBuffer sb = new StringBuffer();
+ sb.append(" SELECT * FROM ( ");
+ sb.append(" SELECT ROW_.*,ROWNUM RN FROM ( ");
+ sb.append(" select * from pllog P WHERE ");
+ sb.append(sql);
+ sb.append(" ORDER BY PLDATE DESC ");
+ sb.append(" ) ROW_ ");
+ sb.append(" )WHERE RN <= ");
+ sb.append(V_PAGE_ROWNUM_END);
+ sb.append(" AND RN > ");
+ sb.append(V_PAGE_ROWNUM_START);
+ return impl.findEntites(sb.toString(), new String[]{}, "P", Log.class);
+ }
+ });
+ }
+
+
+ /**
+ * 閫氳繃SQL璇彞鎵ц鏃ュ織鍒犻櫎锛屾晥鐜囨洿楂�
+ * @param sql
+ * @return
+ */
+ public boolean deleteLogBySql(final String sql, final long curPeriod){
+ return (Boolean)new HibernateTemplate().run(new HibernateCallback() {
+ public Object execute() throws HibernateException {
+ LogDAOImpl impl = new LogDAOImpl();
+ impl.createSQLQuery(sql, new String[0]);
+
+ String result = "鍒犻櫎 " + curPeriod + " 涓湀涔嬪墠鐨勬棩蹇� ";
+ writeLogDeleteLog("logAutoDeleter", getServerIP(), result, impl);
+
+ return true;
+ }
+ });
+ }
+
+ private String getServerIP(){
+ String ip = "127.0.0.1";
+ try {
+ ip = java.net.InetAddress.getLocalHost().getHostAddress();
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+ }
+ return ip;
+ }
+
+ /**
+ * 淇濆瓨鏃ュ織淇濆瓨/澶囦唤鏈熼檺
+ * @param sysCfg 绯荤粺閰嶇疆琛ㄧ殑瀵硅薄
+ * @return
+ */
+// public boolean savePeriod(final SystemCfg sysCfg) {
+// private final String LOG_SAVE_PERIOD = "logSavePeriod";//鏃ュ織淇濆瓨鏈熼檺
+//
+// return (Boolean)new HibernateTemplate().run(new HibernateCallback() {
+// public Object execute() throws HibernateException {
+// SystemCfgDAOImpl impl = new SystemCfgDAOImpl();
+// String sql = "from SystemCfg s where s.name = '"+sysCfg.getName()+"'";
+// SystemCfg temp = impl.findEntity(sql);
+// if(temp == null) {//濡傛灉涓嶅瓨鍦ㄩ厤缃紝鎻掑叆
+// sysCfg.setUserEntity(userEntity);
+// impl.save(sysCfg);
+// } else {//濡傛灉瀛樺湪閰嶇疆锛屾洿鏂�
+// temp.setName(sysCfg.getName());
+// temp.setValue(sysCfg.getValue());
+// temp.setUserEntity(userEntity);
+// impl.update(temp);
+// }
+// return true;
+// }
+// });
+// }
+
+ public boolean savePeriod(String type, String period) {
+
+ try {
+ Connection connection = HibernateSessionFactory.getSessionConnection();
+
+ String sql = "update PLSYSTEMCONF set plvalue = ? where plname =?";
+ PreparedStatement pst = connection.prepareStatement(sql);
+
+ pst.setString(1, period);
+ pst.setString(1, type);
+
+ int count = pst.executeUpdate();
+ pst.close();
+
+ boolean res = false;
+ if (count == 0) {
+ sql = "insert PLSYSTEMCONF set (PLOID, PLNAME, PLVALUE) value (?, ?, ?)";
+ pst = connection.prepareStatement(sql);
+ pst.setString(1, ObjectUtility.getNewObjectID36());
+ pst.setString(2, type);
+ pst.setString(3, period);
+
+ res = pst.execute();
+ pst.close();
+ } else {
+ res = true;
+ }
+
+ return res;
+ }catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ /**
+ * 鑾峰彇淇濆瓨/澶囦唤鏈熼檺鍊�
+ * @param type
+ * @return
+ * @throws SQLException
+ */
+ public int getCurPeriod(final String type) {
+ try {
+ Connection connection = HibernateSessionFactory.getSessionConnection();
+
+ String sql = "select PLVALUE from PLSYSTEMCONF where plname =?";
+ PreparedStatement pst = connection.prepareStatement(sql);
+
+ pst.setString(1, type);
+
+ int curPeriod = 0;
+ ResultSet rs = pst.executeQuery();
+ if (rs.next()) {
+ String value = rs.getString("PLVALUE");
+ if (value != null) {
+ curPeriod = Integer.parseInt(value);
+ }
+ }
+ pst.close();
+
+ return curPeriod;
+ } catch (SQLException e) {
+ e.printStackTrace();
+ return 0;
+ }
+ }
+
+// public int getCurPeriod(final String type) {
+// return (Integer)new HibernateTemplate().run(new HibernateCallback() {
+// public Object execute() throws HibernateException {
+// SystemCfgDAOImpl impl = new SystemCfgDAOImpl();
+// SystemCfg sysCfg = new SystemCfg();
+// int curPeriod = 0;
+// String sql = " from SystemCfg s where s.name ='"+type+"'";
+// sysCfg = impl.findEntity(sql);
+// if(sysCfg != null){
+// curPeriod = Integer.parseInt(sysCfg.getValue());
+// }
+// return curPeriod;
+// }
+// });
+// }
+
+ /**
+ * 鎵嬪姩鍒犻櫎鏃ュ織
+ * @param deleteDate 鎵�閫夋棩鏈燂紝灏嗗垹闄よ鏃ユ湡涔嬪墠鐨勬棩蹇�
+ * @return
+ */
+ public boolean deleteLog(final String deleteDate) {
+ return (Boolean)new HibernateTemplate().run(new HibernateCallback() {
+ public Object execute() throws HibernateException {
+ LogDAOImpl impl = new LogDAOImpl();
+ String delDate = deleteDate;
+ String sql = "delete from pllog where pltype<>'鍒犻櫎' and plmodule<>'鏃ュ織绠$悊' and pllogtype<>'涓�鑸搷浣�' and pldate <= to_date('"+delDate+"','yyyy-MM-dd') ";
+
+ if(deleteDate.contains("##")){
+ String[] vvs = deleteDate.split("##");
+ delDate = vvs[0];
+ sql = "delete from pllog where pltype<>'鍒犻櫎' and plmodule<>'鏃ュ織绠$悊' and pllogtype<>'涓�鑸搷浣�' and pldate <= to_date('"+delDate+"','yyyy-MM-dd') and " + vvs[1];
+ }
+
+ impl.createSQLQuery(sql);
+
+ VCIInvocationInfo vcii = HibernateSessionFactory.getVciSessionInfo();
+ String result = "鍒犻櫎 " + delDate + " 涔嬪墠鐨勬棩蹇� ";
+ writeLogDeleteLog(vcii.userName, vcii.clientIPInfo, result, impl);
+ return true;
+ }
+ });
+ }
+
+
+ /**
+ * 璁板綍鏃ュ織鍒犻櫎鐨勬棩蹇�
+ */
+ public void writeLogDeleteLog(String userName, String ip, String result, LogDAOImpl impl){
+ if(impl == null){
+ impl = new LogDAOImpl();
+ }
+ String sql = "insert into pllog(ploid, pluser, plip, plresult, pldate, pltype, plmodule, pllogtype) " +
+ "values(" +
+ "get_uuid()," +
+ "'" + userName + "'," +
+ "'" + ip + "'," +
+ "'" + result + "'," +
+ "sysdate," +
+ "'" + "鍒犻櫎" + "'," +
+ "'" + "鏃ュ織绠$悊" + "'," +
+ "'" + "涓�鑸搷浣�" + "'" +
+ ")";
+ impl.createSQLQuery(sql);
+ }
+// /**
+// * 鍒犻櫎鏃ュ織
+// * @param list
+// * @return
+// */
+// public boolean deleteLog(final List<Log> list) {
+// return (Boolean)new HibernateTemplate().run(new HibernateCallback() {
+// public Object execute() throws HibernateException {
+// LogDAOImpl impl = new LogDAOImpl();
+// for(Log entity:list){
+// impl.delete(entity);
+// }
+// return true;
+// }
+// });
+// }
+//
+ /**
+ * 鏍规嵁妯″潡鐨勬簮璺緞杩斿洖妯″潡鐨勫埆鍚�
+ * @param modulePath
+ * @return
+ */
+ public String getModuleAlias(final String modulePath){
+ return (String)new HibernateTemplate().run(new HibernateCallback() {
+ @Override
+ public Object execute() throws HibernateException {
+ String res = "";
+ LogDAOImpl impl = new LogDAOImpl();
+ String sql = "SELECT T.PLALIASNAME FROM PLFUNCTION T WHERE T.PLRESOURCEC = ?";
+ Object[] values = { modulePath };
+ LinkedHashMap<String, org.hibernate.type.Type> map = new LinkedHashMap<String, Type>();
+ map.put("PLALIASNAME", org.hibernate.type.StringType.INSTANCE);
+ List<String> list = impl.findEntitesBySQL(sql, values, map);
+ if(list.size() != 0){
+// Object[] data = list.get(0);
+// if(data != null && data.length > 0){
+// res = (String) data[0];
+// }
+ res = list.get(0);
+ if(res == null || "null".equals(res)) {
+ res = "";
+ }
+ }
+ return res;
+ }
+ });
+ }
+
+ /**
+ * 鏍规嵁妯″潡鐨勬簮璺緞杩斿洖瑙掕壊鍚嶇О
+ *
+ */
+ /*public String getRoleName(final String modulePath,final String userName){
+ return (String)new HibernateTemplate().run(new HibernateCallback() {
+ @Override
+ public Object execute() throws HibernateException {
+ String res = "";
+ LogDAOImpl impl = new LogDAOImpl();
+ StringBuilder logSql = new StringBuilder();
+ logSql.append(" select pr.plname from plrole pr where pr.pluid in ( ");
+ logSql.append(" select r.plroleoid from Plroleright r where r.plfuncoid in ( ");
+ logSql.append(" select pf.ploid from plfunction pf where pf.plresourcec = ");
+ logSql.append(" ? ");
+ logSql.append(" )");
+ logSql.append(" )");
+ logSql.append(" intersect ");
+ logSql.append(" select pr.plname from plrole pr where pr.pluid in ( ");
+ logSql.append(" select ur.plroleuid from pluserrole ur where ur.pluseruid in ( ");
+ logSql.append(" select pu.pluid from pluser pu where pu.plusername= ");
+ logSql.append(" ? ");
+ logSql.append(" ) ");
+ logSql.append(" ) ");
+ Object[] values = { modulePath, userName};
+ LinkedHashMap<String, org.hibernate.type.Type> map = new LinkedHashMap<String, Type>();
+ List<String> list = impl.findEntitesBySQL(logSql.toString(), values, map);
+ if(list.size() != 0){
+ res = list.get(0);
+ if(res == null || "null".equals(res)) {
+ res = "";
+ }
+ }
+ return res;
+ }
+ });
+ }*/
+
+ public String getRoleName(final String modulePath,final String userName){
+ return (String)new HibernateTemplate().runExt(new HibernateCallbackExt() {
+ @Override
+ public Object execute(Connection paramConnection)
+ throws HibernateException, SQLException {
+ String res = "";
+ LogDAOImpl impl = new LogDAOImpl();
+ StringBuilder logSql = new StringBuilder();
+ logSql.append(" select pr.plname from plrole pr where pr.pluid in ( ");
+ logSql.append(" select r.plroleoid from Plroleright r where r.plfuncoid in ( ");
+ logSql.append(" select pf.ploid from plfunction pf where pf.plresourcec = ");
+ logSql.append(" ? ");
+ logSql.append(" )");
+ logSql.append(" )");
+ logSql.append(" intersect ");
+ logSql.append(" select pr.plname from plrole pr where pr.pluid in ( ");
+ logSql.append(" select ur.plroleuid from pluserrole ur where ur.pluseruid in ( ");
+ logSql.append(" select pu.pluid from pluser pu where pu.plusername= ");
+ logSql.append(" ? ");
+ logSql.append(" ) ");
+ logSql.append(" ) ");
+ Object[] values = { modulePath, userName};
+ LinkedHashMap<String, org.hibernate.type.Type> map = new LinkedHashMap<String, Type>();
+ List<String> list = impl.findEntitesBySQL(logSql.toString(), values, map);
+ if(list.size() != 0){
+ res = list.get(0);
+ }else{
+ res =getMessage(paramConnection,userName);
+ }
+ return res;
+ }
+ });
+ }
+
+ public String getMessage(Connection paramConnection,String userName){
+ String res = "";
+ StringBuilder logSql = new StringBuilder();
+ logSql.append(" select pr.plname ,pr.pltype from plrole pr where pr.pluid in ( ");
+ logSql.append(" select ur.plroleuid from pluserrole ur where ur.pluseruid in ( ");
+ logSql.append(" select pu.pluid from pluser pu where pu.plusername= ");
+ logSql.append(" '"+userName+"' ");
+ logSql.append(" ) ");
+ logSql.append(" ) ");
+ PreparedStatement pstmt = null;
+ ResultSet rs = null;
+ try {
+ pstmt = paramConnection.prepareStatement(logSql.toString());
+ rs = pstmt.executeQuery();
+ LinkedHashMap<String, String> value = new LinkedHashMap<String, String>();
+ while(rs.next()){
+ value.put(rs.getString(2),rs.getString(1));
+ }
+ if(value.get("1")!=null){
+ res = value.get("1");
+ }else{
+ res = value.get("2");
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (rs != null) {
+ rs.close();
+ }
+
+ if(pstmt != null) {
+ pstmt.close();
+ }
+ } catch (Exception e2) {
+ e2.printStackTrace();
+ }
+ }
+ return res;
+ }
+
+}
diff --git a/Source/Service/LogService/src/com/vci/server/log/delegate/LogManagementDelegate.java b/Source/Service/LogService/src/com/vci/server/log/delegate/LogManagementDelegate.java
new file mode 100644
index 0000000..8ac2cbc
--- /dev/null
+++ b/Source/Service/LogService/src/com/vci/server/log/delegate/LogManagementDelegate.java
@@ -0,0 +1,460 @@
+package com.vci.server.log.delegate;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+
+import com.vci.common.utility.ObjectUtility;
+import com.vci.corba.common.VCIError;
+import com.vci.corba.log.data.LogInfo;
+import com.vci.corba.log.data.LogPeriodInfo;
+import com.vci.corba.log.data.LogType;
+import com.vci.corba.log.data.RefObj;
+import com.vci.corba.omd.btm.BtmItem;
+import com.vci.corba.common.data.UserEntityInfo;
+import com.vci.corba.framework.data.UserInfo;
+import com.vci.server.cache.OMCacheProvider;
+import com.vci.server.cache.OrgCacheProvider;
+import com.vci.server.log.objects.Log;
+import com.vci.server.log.objects.LogPeriod;
+import com.vci.server.log.utils.LogTypeUtil;
+import com.vci.server.log.dao.LogService;
+
+public class LogManagementDelegate {
+ private final String LOG_SAVE_PERIOD = "logSavePeriod";//鏃ュ織淇濆瓨鏈熼檺
+ private static LogService logSrv = new LogService();
+
+ /**
+ * 鍦ㄥ垵濮嬪寲鏃ュ織妯″潡鏃讹紝妫�鏌ユ槸鍚﹂厤缃簡鑷姩鍒犻櫎
+ * @return true琛ㄧず璁剧疆浜嗚嚜鍔ㄥ垹闄�
+ * @throws VCIError
+ */
+ public boolean getIsAutoDelete() throws VCIError {
+ boolean res = false;
+ try {
+ LogService logSrv = new LogService();
+ res = logSrv.getIsAutoDelete();
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new VCIError("140101", new String[]{});//鑾峰彇鏃ュ織鍒犻櫎閰嶇疆鍑洪敊锛岃閲嶈瘯锛�
+ }
+ return res ;
+ }
+
+ /**
+ * 鍒濆鍖栨棩蹇楁ā鍧楁椂锛岃幏鍙栦繚瀛樻湡闄愬拰澶囦唤鏈熼檺涓嬫媺妗嗗垪琛�
+ * @return 閰嶇疆濂界殑鏈熼檺鍊肩殑闆嗗悎
+ * @throws VCIError
+ */
+ public LogPeriodInfo[] getPeriods() throws VCIError {
+ LogPeriod[] periods = null;
+ LogPeriodInfo[] infos = null;
+ try {
+ LogService logSrv = new LogService();
+ periods = logSrv.getPeriods();
+ if(periods!=null) {
+ infos = new LogPeriodInfo[periods.length];
+ for(int i=0;i<periods.length;i++) {
+ infos[i] = changePeriodObjToInfo(periods[i]);
+ }
+ } else {
+ infos = new LogPeriodInfo[0];
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new VCIError("140102", new String[]{});//鑾峰彇鏃ュ織閰嶇疆鏈熼檺鍑洪敊锛岃閲嶈瘯锛�
+ }
+ return infos;
+ }
+
+ /**
+ * 鑾峰彇鏃ュ織椤甸潰鏄剧ず鏉℃暟
+ * @return
+ * @throws VCIError
+ */
+ public int getPageSize() throws VCIError {
+ int pageSize = 0;
+ try {
+ LogService logSrv = new LogService();
+ pageSize = logSrv.getPageSize();
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new VCIError("140103", new String[]{});//鑾峰彇鏃ュ織椤甸潰鏄剧ず鏉℃暟鍑洪敊锛岃閲嶈瘯锛�
+ }
+ return pageSize;
+ }
+
+ /**
+ * 鑾峰彇褰撳墠鏌ヨ鏃ュ織鎬绘暟
+ * @param sql 甯︽潯浠剁殑鏌ヨ璇彞
+ * @return
+ * @throws VCIError
+ */
+ public long getSumLogRows(String sql) throws VCIError {
+ long sumRows = 0;
+ try {
+ LogService logSrv = new LogService();
+ sumRows = logSrv.getSumLogRows(sql);
+ }catch (Exception e) {
+ e.printStackTrace();
+ throw new VCIError("140104", new String[]{});//鑾峰彇鏈鏌ヨ鏃ュ織鎬绘暟鍑洪敊锛岃閲嶈瘯锛�
+ }
+ return sumRows ;
+ }
+
+ /**
+ * 鑾峰彇鍏ㄩ儴鏃ュ織淇℃伅
+ * @return
+ */
+ public LogInfo[] fetchLogInfo(int pageNo,int pageSize,String sql) throws VCIError{
+ LogInfo[] logInfos = null;
+ try {
+ LogService logSrv = new LogService();
+ List<?> list = logSrv.getLogList(pageNo, pageSize,sql);
+ logInfos = new LogInfo[list.size()];
+ //Set<String> userIds = new HashSet<String>();
+ for(int i = 0;i < list.size();i++){
+ logInfos[i] = this.changeLogToLogInfo((Log)list.get(i));
+
+ UserInfo user = OrgCacheProvider.getUser(logInfos[i].username);
+ if (user != null)
+ logInfos[i].truename = user.trueName;
+ }
+
+// if(userIds.size()>0){
+// UserInfo[] userInfos = new RightManagementDelegate().fetchUserInfoByNames(userIds.toArray(new String[0]));
+// Map<String,String> userInfoMap = new HashMap<String,String>();
+// if(userInfos.length > 0 ){
+// for(int i = 0 ; i < userInfos.length; i ++){
+// UserInfo user = userInfos[i];
+// userInfoMap.put(user.userName, user.trueName);
+// }
+// }
+// for(int i = 0 ; i < logInfos.length ; i ++){
+// String userId = logInfos[i].username;
+// if(userInfoMap.containsKey(userId)){
+// logInfos[i].truename = userInfoMap.get(userId);
+// }
+// }
+// }
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new VCIError("140105", new String[]{});//鏌ヨ鏃ュ織鍑洪敊锛岃閲嶈瘯锛�
+ }
+ return logInfos;
+ }
+
+ /**
+ * 鏍规嵁鏌ヨ鏉′欢鑾峰彇鏃ュ織淇℃伅
+ * <p>Description: </p>
+ *
+ * @author Administrator
+ * @time 2013-1-2
+ * @param pageNo
+ * @param pageSize
+ * @param sql
+ * @return
+ * @throws VCIError
+ */
+ public LogInfo[] getLogListByContion(int pageNo,int pageSize,String sql) throws VCIError{
+ LogInfo[] logInfos = null;
+ try {
+ LogService logSrv = new LogService();
+ List<?> list = logSrv.getLogListByContion(pageNo, pageSize,sql);
+ logInfos = new LogInfo[list.size()];
+ //Set<String> userIds = new HashSet<String>();
+ for(int i = 0;i < list.size();i++){
+ logInfos[i] = this.changeLogToLogInfo((Log)list.get(i));
+
+ UserInfo user = OrgCacheProvider.getUser(logInfos[i].username);
+ if (user != null)
+ logInfos[i].truename = user.trueName;
+ //userIds.add(logInfos[i].username);
+ }
+// if(userIds.size()>0){
+// UserInfo[] userInfos = new RightManagementDelegate().fetchUserInfoByNames(userIds.toArray(new String[0]));
+// Map<String,String> userInfoMap = new HashMap<String,String>();
+// if(userInfos.length > 0 ){
+// for(int i = 0 ; i < userInfos.length; i ++){
+// UserInfo user = userInfos[i];
+// userInfoMap.put(user.userName, user.trueName);
+// }
+// }
+// for(int i = 0 ; i < logInfos.length ; i ++){
+// String userId = logInfos[i].username;
+// if(userInfoMap.containsKey(userId)){
+// logInfos[i].truename = userInfoMap.get(userId);
+// }
+// }
+// }
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new VCIError("140105", new String[]{});//鏌ヨ鏃ュ織鍑洪敊锛岃閲嶈瘯锛�
+ }
+ return logInfos;
+ }
+
+ /**
+ * 淇濆瓨鏃ュ織淇濆瓨/澶囦唤鏈熼檺
+ * @param info 绯荤粺閰嶇疆琛ㄧ殑瀵硅薄
+ * @return
+ */
+ public boolean savePeriod(String period, UserEntityInfo userEnt) throws VCIError{
+ boolean res = false;
+ String id = ObjectUtility.getNewObjectID36();
+ try {
+ LogService logSrv = new LogService();
+ //info.id = id;
+ //UserEntityDelegate.setUserEntityToService(logSrv, userEnt);
+ res = logSrv.savePeriod(LOG_SAVE_PERIOD, period);
+ return res ;
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new VCIError("140106", new String[]{});//淇濆瓨鏈熼檺鍑洪敊锛岃閲嶈瘯锛�
+ }
+ }
+
+ /**
+ * 鑾峰彇淇濆瓨/澶囦唤鏈熼檺鍊�
+ * @param type
+ * @return
+ * @throws VCIError
+ */
+ public int getCurPeriod() throws VCIError{
+ int period = 0;
+ try {
+ LogService logSrv = new LogService();
+ period = logSrv.getCurPeriod(LOG_SAVE_PERIOD);
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new VCIError("140107", new String[]{});//鑾峰彇鏈熼檺鏁板�煎嚭閿欙紝璇烽噸璇曪紒
+ }
+ return period;
+ }
+
+ public boolean deleteLog(String deleteDate) throws VCIError {
+ boolean res = false;
+ try {
+ LogService logSrv = new LogService();
+ res = logSrv.deleteLog(deleteDate);
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new VCIError("140108", new String[]{});//鍒犻櫎鏃ュ織鍑洪敊锛岃閲嶈瘯锛�
+ }
+ return res;
+ }
+
+
+ /**
+ * 绠�鍗曡褰曠郴缁熺櫥鍏ャ�佺櫥鍑烘棩锟�?
+ * <p>
+ * Description:
+ * </p>
+ *
+ * @author wangxl
+ * @time 2012-12-27
+ * @param message
+ * @param userEntityInfo
+ * @throws VCIError
+ */
+ public void saveLoginLog(boolean success, String message, UserEntityInfo userEntityInfo) throws VCIError {
+ userEntityInfo.modules = "鐧诲綍妯″潡";// add by liujw
+
+ UserInfo user = OrgCacheProvider.getUser(userEntityInfo.userName);
+
+ if (user == null)
+ return;
+
+ String result = success ? "鐧诲綍鎴愬姛" : "鐧诲綍澶辫触";
+ writeLog(userEntityInfo, "鐧诲綍", message, result, LogType.Login, user.id);
+ }
+
+
+ public void saveLogoutLog(String message, UserEntityInfo userEntityInfo) throws VCIError {
+ userEntityInfo.modules = "鐧诲綍妯″潡";
+
+ UserInfo user = OrgCacheProvider.getUser(userEntityInfo.userName);
+ if (user == null)
+ return;
+
+ writeLog(userEntityInfo, "鐧诲嚭", "鐧诲綍鎴愬姛", message, LogType.Logout, user.id);
+ }
+
+ /**
+ * 璁板綍鏃ュ織
+ * @param result
+ * @param message
+ * @param type
+ * @param logTypeIntVal
+ * @param dataObjOid
+ * @param userEntityInfo
+ * @throws VCIError
+ */
+ public void saveLogV2(String result, String message, String type, LogType logType, String dataObjOid,
+ UserEntityInfo userEntityInfo) throws VCIError {
+
+ //LogType logType = LogType.getByIntVal(logTypeIntVal);
+
+ writeLog(userEntityInfo, type, result, message, logType, dataObjOid);
+ }
+
+
+ public void saveObjLog(RefObj obj, String opType, String result, LogType logType, UserEntityInfo userEnt) {
+
+ String info = StringUtils.isNotBlank(obj.name) ? obj.name : (StringUtils.isNotBlank(obj.id) ? obj.id : obj.oid);
+ String btLabel = getBtmLabel(obj.btName);
+ userEnt.modules = btLabel;
+
+ writeLog(userEnt, opType, result, "鎿嶄綔鐨勬暟鎹负->"+ btLabel + ":" + info, logType, obj.oid);
+ }
+
+
+ public void batchSaveObjLog(RefObj[] objs, String opType, String result, UserEntityInfo userEnt) {
+ if (objs == null || objs.length < 1) {
+ return;
+ }
+
+ for (int i = 0; i < objs.length; i++) {
+ RefObj ro = objs[i];
+ String info = StringUtils.isNotBlank(ro.name) ? ro.name : (StringUtils.isNotBlank(ro.id) ? ro.id : ro.oid);
+ String btLabel = getBtmLabel(ro.btName);
+ userEnt.modules = btLabel;
+
+ writeLog(userEnt, opType, result, "鎿嶄綔鐨勬暟鎹负->"+ btLabel + ":" + info, LogType.General, ro.oid);
+ }
+ }
+
+// private void writeLog(UserEntity userEntity, String optType, String result, String content, LogType logType, String dataObjId) {
+// try {
+// Log log = new Log();
+// log.setId(ObjectUtility.getNewObjectID36());
+// log.setDate(new Date());
+// log.setUserIp(userEntity.getIp());
+//
+// log.setUsername(userEntity.getUserName());
+// log.setResult(result);
+// log.setContent(content);
+// log.setType(optType);
+//
+// String module = userEntity.getModule();
+// if (StringUtils.isEmpty(module))
+// module = "log";
+//
+// log.setModule(module);
+// log.setLogType(logType.getLabel());
+// log.setObjId(dataObjId);
+// String roleName = "";//logSrv.getRoleName(userEntity.getModule(),userEntity.getUserName());
+// log.setRoleName(roleName);
+//
+// logSrv.saveLog(log);
+//
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+// }
+
+ private void writeLog(UserEntityInfo userInfo, String optType, String result, String content, LogType logType, String dataObjId) {
+ try {
+ Log log = new Log();
+ log.setId(ObjectUtility.getNewObjectID36());
+ log.setDate(new Date());
+ log.setUserIp(userInfo.ip);
+
+ log.setUsername(userInfo.userName);
+ log.setResult(result);
+ log.setContent(content);
+ log.setType(optType);
+
+ String module = userInfo.modules;
+ if (StringUtils.isEmpty(module))
+ module = "log";
+
+ log.setModule(module);
+ log.setLogType(LogTypeUtil.getLabel(logType));
+ log.setObjId(dataObjId);
+ String roleName = "";//logSrv.getRoleName(userEntity.getModule(),userEntity.getUserName());
+ log.setRoleName(roleName);
+
+ logSrv.saveLog(log);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ // 绠�鍗曡褰曠敤鎴疯閿佸畾鐨勬棩蹇�
+ public void saveLockUserLog(String userId, UserEntityInfo userEntityInfo) throws VCIError {
+ UserInfo user = OrgCacheProvider.getUserByID(userId);
+ if (user == null)
+ return;
+
+ writeLog(userEntityInfo, LogTypeUtil.getLabel(LogType.LockUser), "鐢ㄦ埛閿佸畾",
+ user.userName + "[" + user.trueName + "]" + "鍦ㄨ繛缁緭鍏ュ娆″瘑鐮侀敊璇悗瀵艰嚧璐︽埛琚攣瀹�", LogType.LockUser, userId);
+ }
+
+ /**
+ * period
+ * 鏈嶅姟鍣ㄧ瀵硅薄杞垚CORBA瀵硅薄
+ * @param obj
+ * @return
+ */
+ private LogPeriodInfo changePeriodObjToInfo(LogPeriod obj) {
+ LogPeriodInfo info = new LogPeriodInfo();
+ info.code = obj.getCode()==null?"":obj.getCode();
+ info.value = obj.getValue()==null?"":obj.getValue();
+ return info;
+ }
+
+ /**
+ * 绯荤粺閰嶇疆
+ * CORBA瀵硅薄杞垚鏈嶅姟鍣ㄧ瀵硅薄
+ * @param info
+ * @return
+ */
+// private SystemCfg changeSysCfgInfoToObj(SystemCfgInfo info) {
+// SystemCfg sys = new SystemCfg();
+// sys.setId(info.id);
+// sys.setName(info.name);
+// sys.setValue(info.value);
+// return sys;
+// }
+
+ /**
+ * Log
+ * 鏈嶅姟鍣ㄧ瀵硅薄杞垚CORBA瀵硅薄
+ * @param obj
+ * @return
+ */
+ public LogInfo changeLogToLogInfo(Log obj){
+ LogInfo info = new LogInfo();
+ info.puid = obj.getId() == null?"":obj.getId();
+ info.type = obj.getType() == null?"":obj.getType();
+ info.date = obj.getDate() == null?"":new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(obj.getDate());
+ info.username = obj.getUsername() == null?"":obj.getUsername();
+ info.userIp = obj.getUserIp() == null?"":obj.getUserIp();
+ info.entityDesc = obj.getEntityDesc() == null?"":obj.getEntityDesc();
+ info.property = obj.getProperty() == null?"":obj.getProperty();
+ info.previousVal = obj.getPreviousVal() == null?"":obj.getPreviousVal();
+ info.newVal = obj.getNewVal() == null?"":obj.getNewVal();
+ info.result = obj.getResult() == null?"":obj.getResult();
+ info.moduleName = obj.getModule() == null?"":obj.getModule();
+ info.logType = obj.getLogType() == null ? "" : obj.getLogType();
+ return info;
+ }
+
+ /**
+ * 鑾峰彇绫诲瀷Label
+ * @param btName
+ * @return
+ */
+ private String getBtmLabel(String btName) {
+ BtmItem bt = OMCacheProvider.getBizType(btName);
+ if (bt != null)
+ return bt.label;
+
+ return btName;
+ }
+
+}
diff --git a/Source/Service/LogService/src/com/vci/server/log/hbm/Log.hbm.xml b/Source/Service/LogService/src/com/vci/server/log/hbm/Log.hbm.xml
new file mode 100644
index 0000000..ca3e8f6
--- /dev/null
+++ b/Source/Service/LogService/src/com/vci/server/log/hbm/Log.hbm.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+"-//Hibernate/Hibernate Mapping DTD//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping>
+ <class
+ name="com.vci.server.log.objects.Log"
+ table="PLLOG"
+ dynamic-update="true"
+ dynamic-insert="true"
+ lazy="false"
+ >
+
+ <id
+ name="id"
+ column="PLOID"
+ type="java.lang.String"
+ >
+ <generator class="assigned" />
+ </id>
+ <property
+ name="date"
+ type="java.util.Date"
+ column="PLDATE"
+ />
+ <property
+ name="type"
+ type="java.lang.String"
+ column="PLTYPE"
+ />
+ <property
+ name="entityDesc"
+ type="java.lang.String"
+ column="PLENTITYDESC"
+ />
+ <property
+ name="property"
+ type="java.lang.String"
+ column="PLPROPERTY"
+ />
+ <property
+ name="previousVal"
+ type="java.lang.String"
+ column="PLPREVIOUSVAL"
+ />
+ <property
+ name="newVal"
+ type="java.lang.String"
+ column="PLNEWVAL"
+ />
+ <property
+ name="username"
+ type="java.lang.String"
+ column="PLUSER"
+ />
+ <property
+ name="userIp"
+ type="java.lang.String"
+ column="PLIP"
+ />
+ <property
+ name="result"
+ type="java.lang.String"
+ column="PLRESULT"
+ />
+ <property
+ name="module"
+ type="java.lang.String"
+ column="PLMODULE"
+ />
+ <property
+ name="logType"
+ type="java.lang.String"
+ column="PLLOGTYPE"
+ />
+ <property
+ name="objId"
+ type="java.lang.String"
+ column="PLOBJID"
+ />
+ <property
+ name="roleName"
+ type="java.lang.String"
+ column="PLROLENAME"
+ />
+ <property
+ name="content"
+ type="java.lang.String"
+ column="PLCONTENT"
+ />
+ </class>
+</hibernate-mapping>
\ No newline at end of file
diff --git a/Source/Service/LogService/src/com/vci/server/log/objects/Log.java b/Source/Service/LogService/src/com/vci/server/log/objects/Log.java
new file mode 100644
index 0000000..4c37e1c
--- /dev/null
+++ b/Source/Service/LogService/src/com/vci/server/log/objects/Log.java
@@ -0,0 +1,123 @@
+package com.vci.server.log.objects;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+public class Log implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -2896915397284485099L;
+
+ private String id;//ID
+ private String username;//鎿嶄綔鐢ㄦ埛鍚嶇О
+ private String roleName;//鎿嶄綔鐢ㄦ埛妯″潡鎵�灞炶鑹�
+ private String userIp;//鎿嶄綔鐢ㄦ埛IP
+ private String result;//鎿嶄綔缁撴灉
+ private String content;//鏃ュ織鍐呭
+ private Date date;//鎿嶄綔鏃ユ湡
+ private String type;//鎿嶄綔绫诲瀷
+ private String module;//鎿嶄綔妯″潡
+ private String entityDesc;//鎿嶄綔瀵硅薄鐨勬弿杩�
+ private String property;//鎿嶄綔鐨勫睘鎬�
+ private String previousVal;//鎿嶄綔鍓嶇殑鍊�
+ private String newVal;//鎿嶄綔鍚庣殑鍊�
+ private String logType = "";
+ private String objId = "";//鎿嶄綔鏁版嵁瀵硅薄ID
+
+ public String getId() {
+ return id;
+ }
+ public void setId(String id) {
+ this.id = id;
+ }
+ public String getUsername() {
+ return username;
+ }
+ public void setUsername(String username) {
+ this.username = username;
+ }
+ public String getUserIp() {
+ return userIp;
+ }
+ public void setUserIp(String userIp) {
+ this.userIp = userIp;
+ }
+ public String getResult() {
+ return result;
+ }
+ public void setResult(String result) {
+ this.result = result;
+ }
+
+ public String getContent() {
+ return content;
+ }
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public Date getDate() {
+ return date;
+ }
+ public void setDate(Date date) {
+ this.date = date;
+ }
+ public String getType() {
+ return type;
+ }
+ public void setType(String type) {
+ this.type = type;
+ }
+ public String getModule() {
+ return module;
+ }
+ public void setModule(String module) {
+ this.module = module;
+ }
+ public String getEntityDesc() {
+ return entityDesc;
+ }
+ public void setEntityDesc(String entityDesc) {
+ this.entityDesc = entityDesc;
+ }
+ public String getProperty() {
+ return property;
+ }
+ public void setProperty(String property) {
+ this.property = property;
+ }
+ public String getPreviousVal() {
+ return previousVal;
+ }
+ public void setPreviousVal(String previousVal) {
+ this.previousVal = previousVal;
+ }
+ public String getNewVal() {
+ return newVal;
+ }
+ public void setNewVal(String newVal) {
+ this.newVal = newVal;
+ }
+ public String getLogType() {
+ return logType;
+ }
+ public void setLogType(String logType) {
+ this.logType = logType;
+ }
+ public String getObjId() {
+ return objId;
+ }
+ public void setObjId(String objId) {
+ this.objId = objId;
+ }
+ public String getRoleName() {
+ return roleName;
+ }
+ public void setRoleName(String roleName) {
+ this.roleName = roleName;
+ }
+
+}
diff --git a/Source/Service/LogService/src/com/vci/server/log/objects/LogPeriod.java b/Source/Service/LogService/src/com/vci/server/log/objects/LogPeriod.java
new file mode 100644
index 0000000..c1e80bf
--- /dev/null
+++ b/Source/Service/LogService/src/com/vci/server/log/objects/LogPeriod.java
@@ -0,0 +1,26 @@
+package com.vci.server.log.objects;
+
+/**
+ * 鐢ㄦ潵瀛樺偍淇濆瓨鏈熼檺鍜屽浠芥湡闄愪笅鎷夋鍒楄〃鍊肩殑瀹炰綋绫�
+ * @author xiongfei
+ * @time 2011-06-16
+ */
+public class LogPeriod {
+
+ private String code; //瀵瑰簲鐨勬暟瀛楋紝浠ユ湀涓哄崟浣�
+ private String value;//瀵瑰簲鐨勬樉绀哄悕绉�
+ public String getCode() {
+ return code;
+ }
+ public void setCode(String code) {
+ this.code = code;
+ }
+ public String getValue() {
+ return value;
+ }
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+
+}
diff --git a/Source/Service/LogService/src/com/vci/server/log/utils/LogTypeUtil.java b/Source/Service/LogService/src/com/vci/server/log/utils/LogTypeUtil.java
new file mode 100644
index 0000000..edad0a2
--- /dev/null
+++ b/Source/Service/LogService/src/com/vci/server/log/utils/LogTypeUtil.java
@@ -0,0 +1,31 @@
+package com.vci.server.log.utils;
+
+import com.vci.corba.log.data.LogType;
+
+public class LogTypeUtil {
+
+ public static String getLabel(LogType type) {
+ switch (type) {
+ case Login:
+ return "鐧诲綍";
+ case Logout:
+ return "鐧诲嚭";
+ case Grant:
+ return "鎺堟潈";
+ case General:
+ return "涓�鑸搷浣�";
+ case Integration:
+ return "闆嗘垚鎿嶄綔";
+ case LockUser:
+ return "閿佸畾鐢ㄦ埛";
+ case UnlockUser:
+ return "瑙i攣鐢ㄦ埛";
+ case FileUpload:
+ return "鍗锋枃浠朵笂浼�";
+ case FileDownload:
+ return "鍗锋枃浠朵笅杞�";
+ default:
+ return "";
+ }
+ }
+}
diff --git a/Source/Service/LogService/src/properties/RMIPFramework.properties b/Source/Service/LogService/src/properties/RMIPFramework.properties
new file mode 100644
index 0000000..f5444ac
--- /dev/null
+++ b/Source/Service/LogService/src/properties/RMIPFramework.properties
@@ -0,0 +1,796 @@
+\ufeff#\u5173\u95edFrame\u63d0\u793a\u5bf9\u8bdd\u6846\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.exit.system=\u9000\u51FA\u7CFB\u7EDF
+rmip.framework.systemFunctionTree.businessFunctionModel=\u4E1A\u52A1\u529F\u80FD\u6A21\u5757
+rmip.framework.logManagementModel=\u65E5\u5FD7\u7BA1\u7406\u6A21\u5757
+rmip.framework.exit.confirm=\u786E\u5B9A\u8981\u9000\u51FA\u7CFB\u7EDF\u5417\uFF1F
+rmip.framework.button.confirm=\u786E\u5B9A
+rmip.framework.button.cancel=\u53D6\u6D88
+
+#Menu\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.menu.file=\u7CFB\u7EDF
+rmip.framework.menu.file.relogon=\u91CD\u65B0\u767B\u5F55
+rmip.framework.menu.file.update.password=\u66F4\u6539\u5BC6\u7801
+rmip.framework.menu.file.exit=\u9000\u51FA
+rmip.framework.menu.file.reloadCache=\u5237\u65B0\u7F13\u5B58
+rmip.framework.menu.file.importAll=\u4E00\u952E\u5BFC\u5165
+rmip.framework.menu.file.exportAll=\u4E00\u952E\u5BFC\u51FA
+rmip.framework.menu.help=\u5E2E\u52A9
+rmip.framework.menu.help.use=\u4F7F\u7528\u5E2E\u52A9
+rmip.framework.menu.about=\u5173\u4E8E
+rmip.framework.reload.title=\u91CD\u65B0\u767B\u9646
+rmip.framework.reload.message=\u60A8\u786E\u5B9A\u8981\u91CD\u65B0\u767B\u9646\u5417?
+
+
+#\u63d0\u793a\u5bf9\u8bdd\u6846\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.info.message.dialog.title=\u4FE1\u606F\u63D0\u793A
+rmip.framework.error.message.dialog.title=\u9519\u8BEF\u63D0\u793A
+rmip.framework.warn.message.dialog.title=\u8B66\u544A\u63D0\u793A
+rmip.framework.friend.message.dialog.title=\u6E29\u99A8\u63D0\u793A
+rmip.framework.friend.message.dialog.message=\u60A8\u786E\u5B9A\u6267\u884C\u6B64\u64CD\u4F5C\u5417\uFF1F
+
+#Frame\u9875\u9762\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.system.name=VCI-Tech Innovation Platform
+rmip.framework.current.user=\u5F53\u524D\u7528\u6237\:
+
+#\u767b\u5f55\u9875\u9762\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.logon.name=\u7528\u6237\u540D\uFF1A
+rmip.framework.logon.password=\u5BC6\u7801\uFF1A
+rmip.framework.logon.new.passwork=\u65B0\u5BC6\u7801\uFF1A
+rmip.framework.logon.confirm.password=\u65B0\u5BC6\u7801\u786E\u8BA4\uFF1A
+rmip.framework.modify.password=\u4FEE\u6539\u5BC6\u7801
+
+rmip.framework.logon.isSave.password=\u662F\u5426\u4FDD\u5B58\u7528\u6237\u7684\u5BC6\u7801
+rmip.framework.logon.button.logon=\u767B\u5F55
+rmip.framework.logon.name.isNotNull=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A\!
+rmip.framework.logon.password.isNotNull=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A\!
+rmip.framework.logon.welcome.msg=\u6B22\u8FCE\u4F7F\u7528VCI-Tech Innovation Platform
+
+
+
+########################################################################
+##\u7cfb\u7edf\u914d\u7f6e\u6a21\u5757\u56fd\u9645\u5316\u4fe1\u606f
+########################################################################
+##\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.systemConfigModule = \u7CFB\u7EDF\u914D\u7F6E\u7BA1\u7406
+rmip.framework.sysconfig.specialChar = \u7279\u6B8A\u5B57\u7B26
+rmip.framework.sysconfig.attrManagement = \u5C5E\u6027\u7BA1\u7406
+rmip.framework.sysconfig.specialCharClsf = \u7279\u6B8A\u5B57\u7B26\u5206\u7C7B
+rmip.framework.sysconfig.unit = \u5355\u4F4D
+rmip.framework.sysconfig.name = \u540D\u79F0\uFF1A
+rmip.framework.sysconfig.desc = \u63CF\u8FF0\uFF1A
+rmip.framework.sysconfig.add = \u589E\u52A0
+rmip.framework.sysconfig.modify = \u4FEE\u6539
+rmip.framework.sysconfig.delete = \u5220\u9664
+rmip.framework.sysconfig.value = \u503C
+rmip.framework.sysconfig.sort = \u6392\u5E8F
+rmip.framework.sysconfig.valueName = \u540D\u79F0
+rmip.framework.sysconfig.modifyCharAlert1 = \u8BF7\u9009\u62E9\u8981\u4FEE\u6539\u7684\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.modifyCharAlert2 = \u8981\u4FEE\u6539\u7684\u503C\u53EA\u80FD\u662F\u4E00\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.modifyCharAlert3 = \u8BF7\u9009\u4E2D\u8981\u4FEE\u6539\u7684\u5B57\u7B26\u8FDB\u884C\u4FEE\u6539\u64CD\u4F5C\uFF01
+rmip.framework.sysconfig.valueAlert = \u503C\u4E0D\u80FD\u4E3A\u7A7A\uFF01
+rmip.framework.sysconfig.addCharAlert1 = \u6DFB\u52A0\u7684 '
+rmip.framework.sysconfig.addCharAlert2 = ' \u5B57\u7B26\u4E0D\u80FD\u6DFB\u52A0\u591A\u4E2A\uFF0C\u8BF7\u4FEE\u6539\uFF01
+rmip.framework.sysconfig.modifySuccess = \u4FEE\u6539\u6210\u529F\!
+rmip.framework.sysconfig.deleteAttrAlert=\u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u5C5E\u6027\!
+rmip.framework.sysconfig.deleteAttrAlert1=\u5C5E\u6027\u5DF2\u88AB\u5F15\u7528,\u4E0D\u80FD\u5220\u9664\!
+rmip.framework.sysconfig.deleteCharAlert1 = \u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.deleteCharAlert2 = \u5220\u9664\u5931\u8D25\uFF0C\u4E0D\u5E94\u8BE5\u5305\u542B\u7B2C '
+rmip.framework.sysconfig.deleteCharAlert3 = ' \u884C
+rmip.framework.sysconfig.deleteCharAlert4 = \u7B2C '
+rmip.framework.sysconfig.deleteCharAlert5 = ' \u5217\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.framework.sysconfig.deleteConfirm = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u5B57\u7B26\u5417\uFF1F
+rmip.framework.sysconfig.warmTip = \u6E29\u99A8\u63D0\u793A
+rmip.framework.sysconfig.selectDeleteNode = \u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u8282\u70B9\uFF01
+rmip.framework.sysconfig.deleteClsfAlert = \u9009\u62E9\u5220\u9664\u7684\u8282\u70B9\u5305\u62EC\u975E\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u8282\u70B9\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.framework.sysconfig.deleteClsfConfirm = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u5206\u7C7B\u5417?
+rmip.framework.sysconfig.nameAlert = \u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.sysconfig.nameLengthAlert = \u540D\u79F0\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.descLengthAlert = \u63CF\u8FF0\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7255\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.internalnameAlert = \u5185\u90E8\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.sysconfig.internalnameLenghAlert = \u5185\u90E8\u540D\u79F0\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.internalnameLeeter = \u5185\u90E8\u540D\u79F0\u53EA\u80FD\u4E3A\u5B57\u6BCD\u5F00\u5934\uFF0C\u8BF7\u66F4\u6539\uFF01
+rmip.framework.sysconfig.attrLengthAlert = \u957F\u5EA6\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.sysconfig.attrLengthIsNum = \u957F\u5EA6\u53EA\u80FD\u4E3A\u6570\u5B57\uFF0C\u8BF7\u91CD\u586B\u5199\uFF01
+rmip.framework.sysconfig.attrLengthMax = \u957F\u5EA6\u4E3A1~4000\u4E4B\u95F4\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.sysconfig.query = \u67E5\u8BE2
+rmip.framework.sysconfig.allAttr = \u6240\u6709\u5C5E\u6027
+rmip.framework.sysconfig.defaultValue = \u9ED8\u8BA4\u503C\:
+rmip.framework.sysconfig.isEmpty = \u53EF\u4EE5\u4E3A\u7A7A\:
+rmip.framework.sysconfig.isGroup = \u662F\u5426\u96C6\u56E2\u5C5E\u6027\:
+rmip.framework.sysconfig.groupAttr = \u96C6\u56E2\u5C5E\u6027
+rmip.framework.sysconfig.groupAppendAttr = \u96C6\u56E2\u9644\u52A0\u5C5E\u6027
+rmip.framework.sysconfig.enterpriseAttr = \u4F01\u4E1A\u5C5E\u6027
+rmip.framework.sysconfig.isKey = \u662F\u5426\u5173\u952E\u5C5E\u6027\:
+rmip.framework.sysconfig.dataType = \u6570\u636E\u7C7B\u578B\uFF1A
+rmip.framework.sysconfig.valueRange = \u53D6\u503C\u8303\u56F4
+rmip.framework.sysconfig.attrrule=\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\uFF1A
+rmip.framework.sysconfig.attLengh=\u957F\u5EA6\uFF1A
+rmip.framework.sysconfig.isOnly=\u56FA\u6709\u5C5E\u6027
+rmip.framework.sysconfig.internalname=\u5185\u90E8\u540D\u79F0\uFF1A
+rmip.framework.sysconfig.queryAlert = \u6CA1\u6709\u7B26\u5408\u67E5\u8BE2\u8981\u6C42\u7684\u8BB0\u5F55\!
+rmip.framework.sysconfig.defaultValLengthAlert = \u9ED8\u8BA4\u503C\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7255\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.valueRangeNotNull = \u53D6\u503C\u8303\u56F4\u503C\u4E0D\u80FD\u4E3A\u7A7A\uFF01
+rmip.framework.sysconfig.valueRangeLengthAlert = \u53D6\u503C\u8303\u56F4\u503C\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.valueRangeLength = \u53D6\u503C\u8303\u56F4\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7\u5C5E\u6027\u957F\u5EA6\uFF01
+rmip.framework.sysconfig.valRangeModifyAlert = \u8BF7\u9009\u4E2D\u8981\u4FEE\u6539\u7684\u53D6\u503C\u8303\u56F4\u8FDB\u884C\u4FEE\u6539\u64CD\u4F5C\uFF01
+rmip.framework.sysconfig.selectRootNode = \u8BF7\u5148\u9009\u62E9\u6839\u8282\u70B9\!
+rmip.framework.sysconfig.selectAttrNode = \u8BF7\u5148\u9009\u62E9\u5C5E\u6027\u8282\u70B9\!
+rmip.framework.sysconfig.deleteAttrConfirm = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u5C5E\u6027\u5417?
+rmip.framework.sysconfig.selectDeleteValRange = \u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u53D6\u503C\u8303\u56F4\uFF01
+rmip.framework.sysconfig.deleteValRangeConfirm = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u53D6\u503C\u8303\u56F4\u5417\uFF1F
+rmip.framework.sysconfig.modifyValFail = \u8981\u4FEE\u6539\u7684\u503C\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4FEE\u6539\u5931\u8D25\uFF01
+rmip.framework.sysconfig.addValFail = \u8981\u6DFB\u52A0\u7684\u503C\u5DF2\u7ECF\u5B58\u5728\uFF0C\u6DFB\u52A0\u5931\u8D25\uFF01
+rmip.framework.sysconfig.updateordelete=\u662F\u5C5E\u6027\u9ED8\u8BA4\u503C,\u4E0D\u53EF\u5220\u9664\u6216\u4FEE\u6539\!
+rmip.framework.sysconfig.defaultvaluewrong=\u5C5E\u6027\u9ED8\u8BA4\u503C\u4E0D\u80FD\u901A\u8FC7\u5C5E\u6027\u89C4\u5219\u6821\u9A8C,\u683C\u5F0F\u4E0D\u6B63\u786E,\u8BF7\u4FEE\u6539\!
+rmip.framework.sysconfig.scopeValueWrong=\u53D6\u503C\u8303\u56F4\u503C\u4E0D\u80FD\u901A\u8FC7\u5C5E\u6027\u89C4\u5219\u6821\u9A8C,\u683C\u5F0F\u4E0D\u6B63\u786E,\u8BF7\u4FEE\u6539\!
+rmip.framework.sysconfig.attrRangeIsUsed=\u7684\u53D6\u503C\u8303\u56F4\u5DF2\u7ECF\u88AB\u5F15\u7528,\u4E0D\u80FD\u5220\u9664\u6216\u4FEE\u6539\!
+rmip.framework.sysconfig.firstSelectAttrNode=\u8BF7\u9009\u62E9\u5C5E\u6027\u518D\u6DFB\u52A0\u5C5E\u6027\u503C\!
+rmip.framework.sysconfig.attrRangeNameError=\u53D6\u503C\u8303\u56F4\u7684\u540D\u79F0\u5728\u8BE5\u5C5E\u6027\u4E0B\u5DF2\u7ECF\u5B58\u5728,\u8BF7\u66F4\u6539\!
+rmip.framework.sysconfig.attrRangeNameError1=\u53D6\u503C\u8303\u56F4\u540D\u79F0\u4E0D\u80FD\u8D85\u8FC7128\u4E2A\u5B57\u7B26\!
+rmip.framework.sysconfig.attrGroupAlert=\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.submit=\u63D0\u4EA4
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.cancel=\u53D6\u6D88
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.moveup=\u4E0A\u79FB
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.down=\u4E0B\u79FB
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.top=\u6700\u4E0A\u7AEF
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.bottom=\u6700\u4E0B\u7AEF
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.attrRange=\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u6392\u5E8F
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.range=\u5C5E\u6027\u503C
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.selecttoup=\u8BF7\u9009\u62E9\u5C5E\u6027\u503C\u8FDB\u884C\u4E0A\u79FB\u64CD\u4F5C\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.selectonlyone=\u6BCF\u6B21\u53EA\u5141\u8BB8\u9009\u62E9\u4E00\u6761\u5C5E\u6027\u503C\u8FDB\u884C\u64CD\u4F5C\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.selectisnull=\u8BF7\u9009\u62E9\u5C5E\u6027\u503C\u8FDB\u884C\u64CD\u4F5C\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.selecttodown=\u8BF7\u9009\u62E9\u5C5E\u6027\u503C\u8FDB\u884C\u4E0B\u79FB\u64CD\u4F5C\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.existup=\u5C5E\u6027\u503C\u5DF2\u7ECF\u5728\u6700\u4E0A\u7AEF\uFF0C\u4E0D\u5141\u8BB8\u79FB\u52A8\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.existdown=\u5C5E\u6027\u503C\u5DF2\u7ECF\u5728\u6700\u4E0B\u7AEF\uFF0C\u4E0D\u5141\u8BB8\u79FB\u52A8\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.success=\u4FDD\u5B58\u6210\u529F\uFF01
+
+##Icon\u56fe\u6807\u9009\u62e9\u7a97\u4f53
+com.vci.rmip.framework.client.common.IconSelectDialog.btnOk=\u786E\u5B9A
+com.vci.rmip.framework.client.common.IconSelectDialog.btnCancel=\u53D6\u6D88
+
+com.vci.rmip.allcommon\u3002IconSelectDialog.btnOk=\u786E\u5B9A
+com.vci.rmip.allcommon\u3002IconSelectDialog.btnCancel=\u53D6\u6D88
+##\u5f02\u5e38\u9519\u8bef\u4fe1\u606f
+150001 = \u5220\u9664\u7279\u6B8A\u5B57\u7B26\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150002 = \u5220\u9664\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150003 = \u83B7\u53D6\u7279\u6B8A\u5B57\u7B26\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150004 = \u83B7\u53D6\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150005 = \u8981\u4FDD\u6301\u7684\u7279\u6B8A\u5B57\u7B26\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150006 = \u4FDD\u5B58\u7279\u6B8A\u5B57\u7B26\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150007 = \u8981\u4FDD\u5B58\u7684\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150008 = \u4FDD\u5B58\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150009 = \u66F4\u65B0\u540E\u7684\u7279\u6B8A\u5B57\u7B26\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150010 = \u66F4\u65B0\u7279\u6B8A\u5B57\u7B26\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150011 = \u66F4\u65B0\u540E\u7684\u7279\u6B8A\u5B57\u7B26\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150012 = \u66F4\u65B0\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150101 = \u5220\u9664\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150102 = \u5220\u9664\u5C5E\u6027\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150103 = \u83B7\u53D6\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150104 = \u83B7\u53D6\u5C5E\u6027\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150105 = \u6B64\u53D6\u503C\u8303\u56F4\u5DF2\u7ECF\u5B58\u5728
+150106 = \u4FDD\u5B58\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150107 = \u4FDD\u5B58\u7684\u5C5E\u6027\u5B58\u5728\u91CD\u590D\u6570\u636E\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150108 = \u4FDD\u5B58\u5C5E\u6027\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150109 = \u66F4\u65B0\u540E\u7684\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150110 = \u66F4\u65B0\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150111 = \u66F4\u65B0\u540E\u7684\u5C5E\u6027\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150112 = \u66F4\u65B0\u5C5E\u6027\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150113 = \u8FDE\u63A5\u670D\u52A1\u5668\u65F6\u53D1\u751F\u5F02\u5E38\uFF01
+150114 = \u67E5\u8BE2\u5C5E\u6027\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150115 = \u5220\u9664\u6216\u4FEE\u6539\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150116 = \u5C5E\u6027\u7684\u5185\u90E8\u540D\u79F0\u5B58\u5728\u91CD\u590D\uFF01
+10060=\u8981\u6DFB\u52A0\u7684\u7279\u6B8A\u5B57\u7B26\u5728\u8BE5\u5206\u7C7B\u4E0B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4FDD\u5B58\u5931\u8D25\uFF01
+10062=\u8981\u4FEE\u6539\u7684\u7279\u6B8A\u5B57\u7B26\u5728\u8BE5\u5206\u7C7B\u4E0B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4FDD\u5B58\u5931\u8D25\uFF01
+10061=\u8981\u521B\u5EFA\u7684\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4FDD\u5B58\u5931\u8D25\uFF01
+10063=\u8981\u4FEE\u6539\u7684\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4FDD\u5B58\u5931\u8D25\uFF01
+150117=\u83B7\u53D6\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u53D1\u751F\u9519\u8BEF\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+150120=\u540C\u4E00\u4E2A\u5C5E\u6027\u5206\u7C7B\u4E0B\u7684\u5C5E\u6027\u5916\u90E8\u540D\u79F0\u5B58\u5728\u91CD\u590D,\u8BF7\u4FEE\u6539\!
+150121=\u540C\u4E00\u4E2A\u5C5E\u6027\u5206\u7C7B\u4E0B\u7684\u5C5E\u6027\u5185\u90E8\u540D\u79F0\u5B58\u5728\u91CD\u590D,\u8BF7\u4FEE\u6539\!
+150122=\u8BE5\u5C5E\u6027\u5DF2\u7ECF\u88AB\u6A21\u677F\u5F15\u7528,\u4E14\u6A21\u677F\u8868\u4E2D\u5B58\u5728\u6570\u636E.\u4FEE\u6539\u540E\u7684\u5C5E\u6027\u957F\u5EA6\u4E0D\u80FD\u5C0F\u4E8E\u4FEE\u6539\u524D\u957F\u5EA6\!
+150123=\u8BE5\u5C5E\u6027\u5DF2\u7ECF\u5B58\u5728\u53D6\u503C\u8303\u56F4,\u4FEE\u6539\u540E\u7684\u5C5E\u6027\u957F\u5EA6\u4E0D\u80FD\u5C0F\u4E8E\u4FEE\u6539\u524D\u957F\u5EA6\!
+
+########################################################################
+##\u7cfb\u7edf\u914d\u7f6e\u6a21\u5757\u56fd\u9645\u5316\u4fe1\u606f END
+########################################################################
+
+
+########################################################################
+##\u89c4\u5219\u7ba1\u7406\u6a21\u5757\u56fd\u9645\u5316\u4fe1\u606f
+########################################################################
+##\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.ruleManagementModule = \u89C4\u5219\u7BA1\u7406
+rmip.framework.rMTypeTemplateModule = \u8D44\u6E90\u7C7B\u578B\u6A21\u677F\u7BA1\u7406
+##\u5f02\u5e38\u9519\u8bef\u4fe1\u606f
+########################################################################
+##\u89c4\u5219\u7ba1\u7406\u6a21\u5757\u56fd\u9645\u5316\u4fe1\u606f END
+########################################################################
+-10000=\u65E0\u6CD5\u8FDE\u63A5\u5230\u670D\u52A1\u5668\uFF0C\u8BF7\u68C0\u67E5\n1\:JacORB\u670D\u52A1\u662F\u5426\u6B63\u5E38\u542F\u52A8\uFF0C\n1\:\u4E3B\u670D\u52A1\u662F\u5426\u6B63\u5E38\u542F\u52A8\uFF0C\n1\:\u68C0\u67E5\u662F\u5426\u6709\u9632\u706B\u5899\u5BF9\u7A0B\u5E8F\u7AEF\u53E3\u8FDB\u884C\u4E86\u9650\u5236\uFF01
+-99999=\u6587\u4EF6\u7B2C{0}\u884C\u7B2C{1}\u5217\u683C\u5F0F\u9519\u8BEF\uFF0C\u8BF7\u5C06\u5176\u4FEE\u6539\u4E3A\u5B57\u7B26\u4E32\u7C7B\u578B\u3002
+
+100001=\u65E0\u6CD5\u83B7\u53D6\u767B\u5F55\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100002=\u65E0\u6CD5\u83B7\u53D6\u6846\u67B6\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100003=\u65E0\u6CD5\u83B7\u53D6CODE\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100004=\u65E0\u6CD5\u83B7\u53D6RM\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100005=\u65E0\u6CD5\u83B7\u53D6BOM\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100006=\u65E0\u6CD5\u83B7\u53D6workFlow\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100007=\u65E0\u6CD5\u83B7\u53D6simpleNews\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100008=\u65E0\u6CD5\u83B7\u53D6EquipmentService\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100009=\u65E0\u6CD5\u83B7\u53D6Bom\u96C6\u6210\u670D\u52A1\uFF0C\u8BF7\u91CD\u542F\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458.
+100010=\u65E0\u6CD5\u83B7\u53D6014\u96C6\u6210\u670D\u52A1\uFF0C\u8BF7\u91CD\u542F\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458.
+#############################################
+## \u6a21\u5757\u6743\u9650\u914d\u7f6e
+## \u7cfb\u7edf\u6a21\u5757\u6784\u5efa
+##
+#############################################
+#\u7cfb\u7edf\u6a21\u5757\u6784\u5efa
+#\u6a21\u5757\u663e\u793a\u4fe1\u606f
+rmip.framework.systemFunctionTree.systemFunctionModel = \u7BA1\u7406\u529F\u80FD\u6A21\u5757
+rmip.framework.systemFunctionTree.root = \u7CFB\u7EDF\u529F\u80FD\u6A21\u5757\u7BA1\u7406
+rmip.framework.systemFunctionTree.title = \u6A21\u5757\u7BA1\u7406
+
+rmip.framework.systemFunctionTree.modelManagment.isValid = \u662F\u5426\u6709\u6548
+rmip.framework.systemFunctionTree.modelManagment.modelName = \u6A21\u5757\u540D\:
+rmip.framework.systemFunctionTree.modelManagment.description = \u63CF\u8FF0\:
+rmip.framework.systemFunctionTree.modelManagment.addButton = \u589E\u52A0
+rmip.framework.systemFunctionTree.modelManagment.modifyButton = \u4FEE\u6539
+rmip.framework.systemFunctionTree.modelManagment.deleteButton = \u5220\u9664
+rmip.framework.systemFunctionTree.modelManagment.addOperationTypeButton = \u589E\u52A0\u64CD\u4F5C\u7C7B\u578B
+rmip.framework.systemFunctionTree.modelManagment.delNonSysBtn = \u5220\u9664\u975E\u7CFB\u7EDF\u6A21\u5757
+rmip.framework.systemFunctionTree.modelManagment.delBusiBtn = \u5220\u9664\u4E1A\u52A1\u6A21\u5757
+
+rmip.framework.systemFunctionTree.dialog.title = \u64CD\u4F5C\u7C7B\u578B\u5206\u7C7B
+rmip.framework.systemFunctionTree.dialog.type = \u64CD\u4F5C\u5206\u7C7B
+rmip.framework.systemFunctionTree.dialog.okButton = \u786E\u8BA4
+rmip.framework.systemFunctionTree.dialog.cancelButton = \u53D6\u6D88
+
+rmip.framework.systemFunctionTree.root.notSelect = \u8BF7\u9009\u62E9\u8282\u70B9\u8FDB\u884C\u64CD\u4F5C\!
+rmip.framework.systemFunctionTree.root.delete = \u6839\u8282\u70B9\u65E0\u6CD5\u5220\u9664\!
+rmip.framework.systemFunctionTree.modelName.duplicate = \u6A21\u5757\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\!
+rmip.framework.systemFunctionTree.model.delete = \u8BF7\u9009\u62E9\u6A21\u5757\u8282\u70B9\u8FDB\u884C\u5220\u9664\u64CD\u4F5C\!
+rmip.framework.systemFunctionTree.model.deleteQuery = \u4F60\u786E\u5B9A\u8981\u5220\u9664\u9009\u62E9\u7684\u6570\u636E\u548C\u5B50\u8282\u70B9\u6570\u636E\uFF0C\u4EE5\u53CA\u529F\u80FD\u6A21\u5757\u6388\u6743\u5417\uFF1F
+rmip.framework.systemFunctionTree.model.relation = \u6A21\u5757\u6216\u5B50\u6A21\u5757\u88AB\u5F15\u7528\uFF0C\u65E0\u6CD5\u5220\u9664\!
+rmip.framework.systemFunctionTree.modelNmae.isNull = \u6A21\u5757\u540D\u79F0\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\!
+rmip.framework.systemFunctionTree.modelNmae.lenght = \u6A21\u5757\u540D\u79F0\u957F\u5EA6\u8D85\u8FC7\u89C4\u5B9A\u8303\u56F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\!
+rmip.framework.systemFunctionTree.desc.lenght = \u63CF\u8FF0\u5927\u5C0F\u8D85\u8FC7\u89C4\u5B9A\u8303\u56F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\!
+rmip.framework.systemFunctionTree.model.modifyInfo = \u6A21\u5757\u4FE1\u606F\u4FEE\u6539\u6210\u529F\!
+rmip.framework.systemFunctionTree.model.operateTypeInfo = \u8BF7\u9009\u62E9\u64CD\u4F5C\u7C7B\u578B\u8FDB\u884C\u64CD\u4F5C\uFF01
+rmip.framework.systemFunctionTree.model.operateTypeRight = \u8BF7\u9009\u62E9\u6B63\u786E\u7684\u64CD\u4F5C\u7C7B\u578B\u8FDB\u884C\u64CD\u4F5C\uFF01
+rmip.framework.systemFunctionTree.cs.lenght = C/S\u529F\u80FD\u6A21\u5757\u8DEF\u5F84\u957F\u5EA6\u8D85\u8FC7\u89C4\u5B9A\u8303\u56F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.systemFunctionTree.cs.name = C/S\u529F\u80FD\u6A21\u5757\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A\uFF01
+rmip.framework.systemFunctionTree.notnet.lenght=.NET\u529F\u80FD\u6A21\u5757\u8DEF\u5F84\u957F\u5EA6\u8D85\u8FC7\u89C4\u5B9A\u8303\u56F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.systemFunctionTree.mobile.lenght=Mobile\u529F\u80FD\u6A21\u5757\u8DEF\u5F84\u957F\u5EA6\u8D85\u8FC7\u89C4\u5B9A\u8303\u56F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+
+#\u5f02\u5e38\u4fe1\u606f
+110000 = \u521B\u5EFA\u6A21\u5757\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110001 = \u68C0\u7D22\u6A21\u5757\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110002 = \u5220\u9664\u6A21\u5757\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110003 = \u66F4\u65B0\u6A21\u5757\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110004 = corba\u5BF9\u8C61\u548C\u5B9E\u4F53\u7C7B\u8F6C\u6362\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110005 = \u66F4\u65B0\u6A21\u5757\u6811\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110006 = \u5220\u9664\u975E\u7CFB\u7EDF\u6A21\u5757\u6216\u4E1A\u52A1\u6A21\u5757\u51FA\u9519\uFF01
+################################################################
+## Tab\u9875\u4fe1\u606f \u6743\u9650\u914d\u7f6e\u6a21\u5757
+#\u64cd\u4f5c\u7c7b\u578b
+rmip.framework.operateType.operateTypeModel.file=\u64CD\u4F5C\u7C7B\u578B\u7BA1\u7406
+rmip.framework.operateType.operateTypeLab.file=\u64CD\u4F5C\u7C7B\u578B
+rmip.framework.operateType.designationLab.file=\u540D\u79F0
+rmip.framework.operateType.typeLab.file=\u7C7B\u578B
+rmip.framework.operateType.identifyingLab.file=\u6807\u8BC6
+rmip.framework.operateType.describeLab.file=\u63CF\u8FF0
+rmip.framework.operateType.addButton.file=\u6DFB\u52A0
+rmip.framework.operateType.updateButton.file=\u4FEE\u6539
+rmip.framework.moudelConfig.file=\u7CFB\u7EDF\u6A21\u5757\u914D\u7F6E
+rmip.framework.operateType.delButton.file=\u5220\u9664
+rmip.framework.operateType.savesusses.message=\u6DFB\u52A0\u6210\u529F\!
+rmip.framework.operateType.savefail.message=\u6DFB\u52A0\u5931\u8D25\!
+rmip.framework.operateType.updatesusses.message=\u4FEE\u6539\u6210\u529F\!
+rmip.framework.operateType.updatefail.message=\u4FEE\u6539\u5931\u8D25\!
+rmip.framework.operateType.deletesusses.message=\u5220\u9664\u6210\u529F\!
+rmip.framework.operateType.deletefail.message=\u5220\u9664\u5931\u8D25\!
+rmip.framework.operateType.designationTextNotNull.message=\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\!
+rmip.framework.operateType.designationTextLength.message=\u540D\u79F0\u4E0D\u80FD\u592A\u957F\!
+rmip.framework.operateType.describeTextAreaLength.message=\u63CF\u8FF0\u4E0D\u80FD\u8D85\u8FC7255\u5B57\!
+rmip.framework.operateType.treeNode.message=\u8BF7\u9009\u62E9\u4E00\u4E2A\u8282\u70B9\!
+rmip.framework.operateType.nameIsExist.message=\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\!
+rmip.framework.operateType.operateTypeIsExist.message=\u64CD\u4F5C\u7C7B\u578B\u6B63\u5728\u88AB\u4F7F\u7528\u4E0D\u80FD\u5220\u9664\!
+rmip.framework.operateType.operateTypeIsExistNoChange.message=\u64CD\u4F5C\u7C7B\u578B\u6B63\u5728\u88AB\u4F7F\u7528\u4E0D\u80FD\u4FEE\u6539\!
+rmip.framework.operateType.operateTypeIsChoice.message=\u8BF7\u9009\u62E9\u64CD\u4F5C\u7C7B\u578B\!
+rmip.framework.operateType.modelIsChoice.message=\u8BF7\u9009\u62E9\u6A21\u5757\!
+rmip.framework.operateType.typeIsChoice.message=\u8BF7\u9009\u62E9\u7C7B\u578B\!
+rmip.framework.operateType.identifyingIsChoice.message=\u6807\u8BC6\u4E0D\u80FD\u4E3A\u7A7A\!
+rmip.framework.operateType.identifyingIsTooLong.message=\u6807\u8BC6\u5B57\u7B26\u4E0D\u80FD\u8D85\u8FC7128\u5B57\u7B26\uFF01
+rmip.framework.operateType.identifyingIsExist.message=\u6807\u8BC6\u5DF2\u7ECF\u5B58\u5728\!
+rmip.framework.operateType.aliasTextNotNull.message=\u522B\u540D\u4E0D\u80FD\u4E3A\u7A7A\!
+rmip.framework.operateType.aliasTextLength.message=\u522B\u540D\u7684\u5B57\u7B26\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7128\u5B57\u7B26\uFF01
+rmip.framework.sysConfNode.sysConfModel=\u7CFB\u7EDF\u914D\u7F6E\u9879\u7BA1\u7406
+rmip.framework.sysConfNode.sysConfClsfModel=\u914D\u7F6E\u5206\u7C7B\u7BA1\u7406
+rmip.framework.sysConfNode.sysMonitor=\u7CFB\u7EDF\u76D1\u63A7\u7BA1\u7406
+
+#\u5f02\u5e38\u4fe1\u606f
+110100 = \u521B\u5EFA\u64CD\u4F5C\u7C7B\u578B\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110101 = \u68C0\u7D22\u64CD\u4F5C\u7C7B\u578B\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110102 = \u5220\u9664\u64CD\u4F5C\u7C7B\u578B\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110103 = \u66F4\u65B0\u64CD\u4F5C\u7C7B\u578B\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110104 = \u68C0\u7D22\u5E94\u7528\u6570\u636E\u64CD\u4F5C\u8868\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110105 = \u68C0\u7D22\u64CD\u4F5C\u7C7B\u578B\u6811\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110106 = \u68C0\u7D22\u64CD\u4F5C\u7C7B\u578B\u6811\u8282\u70B9\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110107 = \u68C0\u7D22\u529F\u80FD\u5E94\u7528\u8868\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+#\u7279\u6b8a\u6570\u636e\u5bf9\u8c61
+rmip.framework.specialData.specialDataModel.file=\u7279\u6B8A\u6570\u636E\u7BA1\u7406
+rmip.framework.specialData.specialDataLab.file=\u6570\u636E\u5BF9\u8C61
+rmip.framework.specialData.designationLab.file=\u540D\u79F0
+rmip.framework.specialData.modelLab.file=\u6A21\u5757
+rmip.framework.specialData.describe.file=\u63CF\u8FF0
+rmip.framework.specialData.operateTypeLab.file=\u64CD\u4F5C\u7C7B\u578B(*\u8BF7\u6309\u4F4FCtrl\u8FDB\u884C\u591A\u9009)
+rmip.framework.specialData.addButton.file=\u6DFB\u52A0
+rmip.framework.specialData.updateButton.file=\u4FEE\u6539
+rmip.framework.specialData.delButton.file=\u5220\u9664
+rmip.framework.workFlowNode.workFlowModelfile=\u6D41\u7A0B\u914D\u7F6E\u7BA1\u7406
+#\u6d41\u7a0b\u914d\u7f6e
+com.vci.rmip.framework.client.rightConfig.workflow.WorkFlowConfPanel.deleteConfirmMessage = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u6570\u636E\u5417\uFF1F\u5220\u9664\u540E\u7684\u6570\u636E\u4E0D\u53EF\u6062\u590D\uFF01
+com.vci.rmip.framework.client.rightConfig.workflow.AssignProcessDialog.selectProcess = \u9009\u62E9\u6D41\u7A0B\u6A21\u677F
+com.vci.rmip.framework.client.rightConfig.workflow.AssignProcessDialog.btnOk = \u786E\u5B9A
+com.vci.rmip.framework.client.rightConfig.workflow.AssignProcessDialog.btnCancel = \u53D6\u6D88
+com.vci.rmip.framework.client.rightConfig.workflow.AssignProcessDialog.treeRootNodeName = \u6D41\u7A0B\u6A21\u677F
+com.vci.rmip.framework.client.rightConfig.workflow.AssignProcessDialog.plsSelectProcessDefinition = \u8BF7\u9009\u62E9\u6D41\u7A0B\u6A21\u677F\uFF01
+#\u4eba\u5458\u7ec4\u7ec7\u7ba1\u7406\u6807\u7b7e
+rmip.framework.menu.staffOrgManage=\u4EBA\u5458\u7EC4\u7EC7\u7BA1\u7406
+
+#\u5f02\u5e38\u4fe1\u606f
+110200 = \u521B\u5EFA\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110201 = \u68C0\u7D22\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110202 = \u5220\u9664\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110203 = \u66F4\u65B0\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110204 = \u68C0\u7D22\u5E94\u7528\u6570\u636E\u64CD\u4F5C\u8868\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110205 = \u68C0\u7D22\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u6811\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110206 = \u68C0\u7D22\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u6811\u8282\u70B9\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110207 = \u68C0\u7D22\u529F\u80FD\u5E94\u7528\u8868\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110208 = \u68C0\u7D22\u64CD\u4F5C\u7C7B\u578B\u5217\u8868\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110209 = \u4FDD\u5B58\u5E94\u7528\u6570\u636E\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110211 = \u66F4\u65B0\u5E94\u7528\u6570\u636E\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110212 = \u5220\u9664\u5E94\u7528\u6570\u636E\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+rmip.stafforg.menu.staffOrg=\u4EBA\u5458\u7EC4\u7EC7
+rmip.stafforg.menu.department=\u90E8\u95E8
+rmip.stafforg.menu.group=\u7EC4
+rmip.stafforg.menu.role=\u89D2\u8272
+rmip.stafforg.menu.staff=\u6210\u5458
+rmip.stafforg.menu.name1=\u3010\u603B\u6570\uFF1A
+rmip.stafforg.menu.name2=\u3011
+rmip.stafforg.logal.name=\u540D\u79F0\uFF1A
+rmip.stafforg.logal.num=\u7F16\u53F7\uFF1A
+rmip.stafforg.logal.desc=\u63CF\u8FF0\uFF1A
+rmip.stafforg.logal.username=\u8D26\u53F7\uFF1A
+rmip.stafforg.logal.security=\u5BC6\u7EA7\uFF1A
+rmip.stafforg.logal.password=\u5BC6\u7801\uFF1A
+rmip.stafforg.logal.confpassword=\u786E\u8BA4\u5BC6\u7801\uFF1A
+rmip.stafforg.logal.department=\u90E8\u95E8\uFF1A
+rmip.stafforg.logal.firstname=\u59D3\u540D\uFF1A
+rmip.stafforg.logal.lastname=\u540D\u5B57\uFF1A
+rmip.stafforg.logal.empno=\u7F16\u53F7\uFF1A
+rmip.stafforg.logal.duty=\u804C\u52A1\uFF1A
+rmip.stafforg.logal.email=\u7535\u5B50\u90AE\u4EF6\uFF1A
+rmip.stafforg.logal.businessTel=\u5546\u52A1\u7535\u8BDD\uFF1A
+rmip.stafforg.logal.homephone=\u5BB6\u5EAD\u7535\u8BDD\uFF1A
+rmip.stafforg.logal.mobelphone=\u79FB\u52A8\u7535\u8BDD\uFF1A
+rmip.stafforg.logal.businessfax=\u5546\u52A1\u4F20\u771F\uFF1A
+rmip.stafforg.logal.rolelist=\u73B0\u6709\u89D2\u8272\:
+rmip.stafforg.logal.choosedrolelist=\u62E5\u6709\u89D2\u8272\:
+rmip.stafforg.logal.grouplist=\u73B0\u6709\u7EC4\:
+rmip.stafforg.logal.choosedgrouplist=\u6240\u5C5E\u7EC4\:
+rmip.stafforg.logal.roling=\u5206\u914D\u89D2\u8272
+rmip.stafforg.logal.grouping=\u5206\u914D\u7EC4\u7EC7
+rmip.stafforg.operate.add=\u589E\u52A0
+rmip.stafforg.operate.modify=\u4FEE\u6539
+rmip.stafforg.operate.delete=\u5220\u9664
+rmip.stafforg.operate.syn=\u540C\u6B65
+rmip.stafforg.operate.grouping=\u5206\u914D\u7EC4\u7EC7
+rmip.stafforg.operate.roling=\u5206\u914D\u89D2\u8272
+rmip.stafforg.operate.conform=\u786E\u5B9A
+rmip.stafforg.operate.cancel=\u53D6\u6D88
+rmip.stafforg.operate.toselectgroup=\u8BF7\u9009\u62E9\u8981\u589E\u52A0\u7684\u7EC4\uFF01
+rmip.stafforg.operate.toreselectgroup=\u8981\u589E\u52A0\u7684\u7EC4\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.toremovegroup=\u8BF7\u9009\u62E9\u8981\u79FB\u9664\u7684\u7EC4\uFF01
+rmip.stafforg.operate.toselectrole=\u8BF7\u9009\u62E9\u8981\u589E\u52A0\u7684\u89D2\u8272\uFF01
+rmip.stafforg.operate.toreselectrole=\u8981\u589E\u52A0\u7684\u89D2\u8272\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.toremoverole=\u8BF7\u9009\u62E9\u8981\u79FB\u9664\u7684\u89D2\u8272\uFF01
+rmip.stafforg.operate.toadddeptname=\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\uFF01
+rmip.stafforg.operate.nameerror=\u540D\u79F0\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.descerror=\u63CF\u8FF0\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E255\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.deptnameerror=\u90E8\u95E8\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.numtoolong=\u7F16\u53F7\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E64\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\!
+rmip.stafforg.operate.rolenameerror=\u89D2\u8272\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.groupnameerror=\u7EC4\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.updateok=\u4FEE\u6539\u6210\u529F\uFF01
+rmip.stafforg.operate.toselectdel=\u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u8282\u70B9\uFF01
+rmip.stafforg.operate.syndeptselect=\u8BF7\u9009\u4E2D\u8981\u540C\u6B65\u7684\u90E8\u95E8\uFF01
+rmip.stafforg.operate.syndept.selectone=\u53EA\u80FD\u9009\u62E9\u4E00\u4E2A\u90E8\u95E8\u8282\u70B9\u8FDB\u884C\u540C\u6B65\uFF01
+rmip.stafforg.operate.syndept.success=\u90E8\u95E8\u540C\u6B65\u6210\u529F\uFF01
+rmip.stafforg.operate.toreselectdeldept=\u9009\u62E9\u5220\u9664\u7684\u8282\u70B9\u5305\u62EC\u975E\u90E8\u95E8\u8282\u70B9\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.toshowdeldepterror1=\u9009\u62E9\u5220\u9664\u7684\u90E8\u95E8\u8282\u70B9\u4E2D
+rmip.stafforg.operate.toshowdeleteerror=\u88AB\u7528\u6237
+rmip.stafforg.operate.toshowdeleteerror1=\u5F15\u7528\uFF0C\u8BF7\u89E3\u9664\u5173\u7CFB\u540E\u518D\u8FDB\u884C\u5220\u9664\u64CD\u4F5C\uFF01
+rmip.stafforg.operate.conformdeldept=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u90E8\u95E8\u5417\uFF1F
+rmip.stafforg.operate.toreselectdelgroup=\u9009\u62E9\u5220\u9664\u7684\u8282\u70B9\u5305\u62EC\u975E\u7EC4\u8282\u70B9\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.conformdelgroup=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u7EC4\u8282\u70B9\u5417\uFF1F
+rmip.stafforg.operate.toshowdelgrouperror1=\u9009\u62E9\u5220\u9664\u7684\u7EC4\u8282\u70B9\u4E2D
+rmip.stafforg.operate.toreselectdelrole=\u9009\u62E9\u5220\u9664\u7684\u8282\u70B9\u4E2D\u5305\u62EC\u975E\u89D2\u8272\u51E0\u70B9\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.conformdelrole=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u89D2\u8272\u5417\uFF1F
+rmip.stafforg.operate.toshowdelroleerror1=\u9009\u62E9\u5220\u9664\u7684\u89D2\u8272\u8282\u70B9\u4E2D
+rmip.stafforg.operate.toshowdelusererror=\u9009\u62E9\u5220\u9664\u7684\u8282\u70B9\u5305\u62EC\u975E\u7528\u6237\u8282\u70B9\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.conformdeluser=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u6210\u5458\u5417\uFF1F
+rmip.stafforg.operate.usernameerror1=\u7528\u6237\u540D\uFF1Aadmin\u662F\u4FDD\u7559\u7528\u6237\uFF0C\u8BF7\u6539\u6210\u5176\u5B83\u540D\u79F0\uFF01
+rmip.stafforg.operate.usernameerror2=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\uFF01
+rmip.stafforg.operate.usernameerror3=\u7528\u6237\u540D\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.usernameerror4=\u7528\u6237\u540D\u53EA\u80FD\u4E3A\u6570\u5B57\u5B57\u6BCD\u6216\u8005\u4E0B\u5212\u7EBF\uFF01
+rmip.stafforg.operate.usernameerror5=\u7528\u6237\u540D\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.pwderror1=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\uFF01
+rmip.stafforg.operate.conformpwderror=\u786E\u8BA4\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\uFF01
+rmip.stafforg.operate.pwderror2=\u5BC6\u7801\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.pwderror3=\u5BC6\u7801\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.pwderror4=\u5BC6\u7801\u53EA\u80FD\u4E3A\u6570\u5B57\u5B57\u6BCD\u6216\u8005\u4E0B\u5212\u7EBF\uFF01
+rmip.stafforg.operate.firstnameerror=\u59D3\u6C0F\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC764\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.firstnameerror1=\u6210\u5458\u7684\u59D3\u6C0F\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u8F93\u5165\uFF01
+rmip.stafforg.operate.lastnameerror=\u540D\u5B57\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC764\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.lastnameerror1=\u6210\u5458\u7684\u540D\u5B57\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u8F93\u5165\uFF01
+rmip.stafforg.operate.dutyerror=\u804C\u52A1\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.emailerror=\u7535\u5B50\u90AE\u4EF6\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199
+rmip.stafforg.operate.emailerror1=\u7535\u5B50\u90AE\u4EF6\u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.telerror=\u6240\u6709\u7535\u8BDD\u957F\u5EA6\u90FD\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC764\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u68C0\u67E5\u5E76\u4FEE\u6539\uFF01
+rmip.stafforg.operate.businessfaxerror=\u5546\u52A1\u4F20\u771F\u957F\u5EA6\u90FD\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC764\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.businessfaxerror1=\u5546\u52A1\u4F20\u771F\u53EA\u80FD\u4E3A\u6570\u5B57\u4E0E'-'\u7684\u7EC4\u5408\uFF01
+rmip.stafforg.operate.homephoneerror=\u5BB6\u5EAD\u7535\u8BDD\u53EA\u80FD\u4E3A\u6570\u5B57\u4E0E'-'\u7684\u7EC4\u5408\uFF01
+rmip.stafforg.operate.businesstelerror=\u5546\u52A1\u7535\u8BDD\u53EA\u80FD\u4E3A\u6570\u5B57\u4E0E'-'\u7684\u7EC4\u5408\uFF01
+rmip.stafforg.operate.mobelerror=\u79FB\u52A8\u7535\u8BDD\u53EA\u80FD\u4E3A\u6570\u5B57\u4E0E'-'\u7684\u7EC4\u5408\uFF01
+rmip.stafforg.operate.loginerror=\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF\uFF01\n\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.stafforg.operate.empnonull=\u7F16\u53F7\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\uFF01
+rmip.stafforg.operate.empnotoolong=\u7F16\u53F7\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.empnorepeat=\u7F16\u53F7\u91CD\u590D\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.deptIdnull=\u90E8\u95E8\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u82E5\u7CFB\u7EDF\u4E2D\u6CA1\u6709\u90E8\u95E8\uFF0C\u8BF7\u5148\u521B\u5EFA\u90E8\u95E8\uFF01
+rmip.stafforg.operate.numcannotchange=\u8BE5\u90E8\u95E8\u5DF2\u7ECF\u88AB\u540C\u6B65\uFF0C\u4E0D\u80FD\u5BF9\u5176\u7F16\u53F7\u8FDB\u884C\u4FEE\u6539\uFF01
+rmip.stafforg.operate.usercreateok=\u7528\u6237\u6210\u529F\u6DFB\u52A0\u5230\u7CFB\u7EDF\uFF01
+rmip.stafforg.operate.useredit1=\u8BF7\u94A9\u9009\u8981\u8FDB\u884C\u4FEE\u6539\u7684\u6210\u5458\!
+rmip.stafforg.operate.useredit2=\u4E00\u6B21\u53EA\u80FD\u5BF9\u4E00\u4E2A\u6210\u5458\u8FDB\u884C\u4FEE\u6539\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\!
+rmip.stafforg.operate.userdelete1=\u8BF7\u94A9\u9009\u8981\u5220\u9664\u7684\u6210\u5458\!
+rmip.stafforg.operate.userdelete2=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u6240\u9009\u62E9\u7684\u6210\u5458\u5417?
+rmip.stafforg.operate.deptedit1=\u8BF7\u94A9\u9009\u8981\u8FDB\u884C\u4FEE\u6539\u7684\u5BF9\u8C61\!
+rmip.stafforg.operate.deptedit2=\u4E00\u6B21\u53EA\u80FD\u5BF9\u4E00\u4E2A\u5BF9\u8C61\u8FDB\u884C\u4FEE\u6539\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\!
+rmip.stafforg.operate.deptdelete1=\u8BF7\u94A9\u9009\u8981\u5220\u9664\u7684\u5BF9\u8C61\!
+rmip.stafforg.operate.deptdelete2=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u6240\u9009\u62E9\u7684\u5BF9\u8C61\u5417?
+rmip.stafforg.operate.pwdgroupdelete=\u786E\u5B9A\u8981\u5220\u9664\u6240\u9009\u62E9\u7684\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u5417?
+rmip.stafforg.operate.deptselect=\u60A8\u8981\u5220\u9664\u7684\u6D41\u7A0B\u6A21\u677F\u5DF2\u7ECF\u88AB\u5F15\u7528\uFF0C\u8BF7\u5148\u89E3\u9664\u5173\u7CFB\uFF0C\u5728\u8FDB\u884C\u5220\u9664\u64CD\u4F5C\uFF01
+
+## Tab\u9875 \u4eba\u5458\u7ec4\u7ec7\u5f02\u5e38\u4fe1\u606f
+120101=\u83B7\u53D6\u6240\u6709\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120102=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u6240\u6709\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120103=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u9876\u7EA7\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120104=\u83B7\u53D6\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120105=\u83B7\u53D6\u9876\u7EA7\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120106=\u83B7\u53D6\u90E8\u95E8\u4E0B\u7684\u5B50\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120107=\u83B7\u53D6\u90E8\u95E8\u53CA\u5176\u5B50\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120108=\u5220\u9664\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120109=\u589E\u52A0\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120110=\u4FEE\u6539\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120111=\u4FEE\u6539\u4EBA\u5458\u4E0E\u90E8\u95E8\u5173\u7CFB\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u4E0E\u7BA1\u7406\u5458\u8054\u7CFB\!
+120201=\u83B7\u53D6\u516C\u53F8\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120202=\u83B7\u53D6\u9876\u7EA7\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120203=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u9876\u7EA7\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120204=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120205=\u83B7\u53D6\u7EC4\u4E0B\u7684\u5B50\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120206=\u83B7\u53D6\u7EC4\u53CA\u5176\u5B50\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120207=\u5220\u9664\u516C\u53F8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120208=\u589E\u52A0\u516C\u53F8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120209=\u4FEE\u6539\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120301=\u83B7\u53D6\u6240\u6709\u89D2\u8272\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120302=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u89D2\u8272\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120303=\u5220\u9664\u89D2\u8272\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120304=\u589E\u52A0\u89D2\u8272\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120305=\u4FEE\u6539\u89D2\u8272\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120306=\u4FDD\u5B58\u4EBA\u5458\u4E0E\u89D2\u8272\u7684\u5173\u7CFB\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\!
+120307=\u9A8C\u8BC1\u89D2\u8272\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u4E0E\u7BA1\u7406\u5458\u8054\u7CFB\!
+120308=\u6839\u636E\u7528\u6237\u540D\u83B7\u53D6\u5173\u8054\u89D2\u8272\u603B\u6570\u65F6\u53D1\u751F\u9519\u8BEF\uFF0C\u8BF7\u4E0E\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120401=\u83B7\u53D6\u4EBA\u5458\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120402=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u6240\u6709\u6210\u5458\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120403=\u5220\u9664\u4EBA\u5458\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120404=\u589E\u52A0\u4EBA\u5458\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120405=\u4FEE\u6539\u4EBA\u5458\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120406=\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120407=\u767B\u5F55\u65F6\u83B7\u53D6\u7528\u6237\u767B\u5F55\u4FE1\u606F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120408=\u90E8\u95E8\u540C\u6B65\u65F6\u51FA\u9519\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120409=\u66F4\u65B0\u90E8\u95E8\u540C\u6B65\u72B6\u6001\u65F6\u51FA\u9519\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120410=\u90E8\u95E8\u5DF2\u7ECF\u540C\u6B65\u5B8C\u6210\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\u8981\u540C\u6B65\u7684\u90E8\u95E8\uFF01
+120411=\u6839\u636E\u90E8\u95E8\u83B7\u53D6\u5BF9\u5E94\u7684\u4EBA\u5458\u4FE1\u606F\u65F6\u51FA\u9519\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120412=\u5728\u8FDB\u884C\u505C\u7528/\u542F\u7528\u64CD\u4F5C\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u67E5\u770B\!
+120413=\u6839\u636E\u6761\u4EF6\u83B7\u53D6\u4EBA\u5458\u603B\u6570\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+120414=\u5E73\u53F0\u5BA2\u6237\u7AEF\u53EA\u5141\u8BB8\u7BA1\u7406\u5458\u767B\u5F55\uFF01
+
+120501=\u83B7\u53D6\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120502=\u6DFB\u52A0\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120503=\u66F4\u65B0\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120504=\u5220\u9664\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120505=\u83B7\u53D6\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u53D6\u503C\u8303\u56F4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120506=\u6DFB\u52A0\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u53D6\u503C\u8303\u56F4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120507=\u6DFB\u52A0\u7684\u53D6\u503C\u8303\u56F4\u503C\u5728\u8BE5\u7EC4\u5408\u65B9\u5F0F\u4E0B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u6DFB\u52A0\u5931\u8D25\uFF01
+120508=\u66F4\u65B0\u5BC6\u7801\u7EC4\u5408\u53D6\u503C\u8303\u56F4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120509=\u5220\u9664\u5BC6\u7801\u7EC4\u5408\u53D6\u503C\u8303\u56F4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120510=\u66F4\u65B0\u7279\u6B8A\u5B57\u7B26\u7684\u53D6\u503C\u5728\u8BE5\u5206\u7C7B\u4E0B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u6DFB\u52A0\u5931\u8D25\uFF01
+120601=\u8BFB\u53D6\u7528\u6237\u6743\u9650\u51FA\u9519\uFF01
+120701=\u8BFB\u53D6\u6240\u6709\u5B50\u6A21\u5757\u4FE1\u606F\u51FA\u9519\uFF01
+
+#################################################
+####\u65e5\u5fd7\u7ba1\u7406
+#################################################
+rmip.framework.log.adminLog=\u7BA1\u7406\u5458\u65E5\u5FD7
+rmip.framework.log.userLog=\u666E\u901A\u7528\u6237\u65E5\u5FD7
+rmip.framework.log.startDate=\u67E5\u8BE2\u65E5\u671F\uFF1A\u7531
+rmip.framework.log.to=\u5230
+rmip.framework.log.operateType=\u64CD\u4F5C\u7C7B\u578B
+rmip.framework.log.create=\u521B\u5EFA
+rmip.framework.log.update=\u4FEE\u6539
+rmip.framework.log.delete=\u5220\u9664
+rmip.framework.log.operateUser=\u64CD\u4F5C\u7528\u6237\uFF1A
+rmip.framework.log.savePeriod=\u4FDD\u5B58\u671F\u9650\uFF1A
+rmip.framework.log.backupPeriod=\u5907\u4EFD\u671F\u9650\uFF1A
+rmip.framework.log.save=\u4FDD\u5B58
+rmip.framework.log.selectDate=\u8BF7\u9009\u62E9\u65E5\u671F\uFF1A
+rmip.framework.log.firstPage=\u9996\u9875
+rmip.framework.log.prePage=\u4E0A\u4E00\u9875
+rmip.framework.log.nextPage=\u4E0B\u4E00\u9875
+rmip.framework.log.lastPage=\u5C3E\u9875
+rmip.framework.log.query=\u67E5\u8BE2
+rmip.framework.log.export=\u5BFC\u51FA
+rmip.framework.log.logDelete=\u65E5\u5FD7\u5220\u9664
+rmip.framework.log.logBackup=\u65E5\u5FD7\u5907\u4EFD
+rmip.framework.log.date=\u65F6\u95F4
+rmip.framework.log.user=\u7528\u6237
+rmip.framework.log.userIp=\u7528\u6237IP
+rmip.framework.log.operateObj=\u64CD\u4F5C\u5BF9\u8C61
+rmip.framework.log.operateModule=\u64CD\u4F5C\u6A21\u5757
+rmip.framework.log.objID=\u5BF9\u8C61ID
+rmip.framework.log.objDesc=\u63CF\u8FF0
+rmip.framework.log.objAttr=\u5BF9\u8C61\u5C5E\u6027
+rmip.framework.log.previousValue=\u64CD\u4F5C\u524D\u7684\u503C
+rmip.framework.log.newValue=\u64CD\u4F5C\u540E\u7684\u503C
+rmip.framework.log.pageSizeAlert=\u83B7\u53D6\u9875\u9762\u663E\u793A\u6761\u6570\u914D\u7F6E\u51FA\u9519\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\uFF0C\u6B64\u5904\u9ED8\u8BA4\u66F4\u6539\u9875\u9762\u663E\u793A\u6761\u6570\u4E3A10\uFF01
+rmip.framework.log.pageInfo1=\u603B\u5171\u6709
+rmip.framework.log.pageInfo2=\u6761\u8BB0\u5F55,\u5171
+rmip.framework.log.pageInfo3=\u9875,\u5F53\u524D\u4E3A\u7B2C
+rmip.framework.log.pageInfo4=\u9875
+rmip.framework.log.savePeriodAlert=\u4FDD\u5B58\u671F\u9650\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u9009\u62E9\uFF01
+rmip.framework.log.saveSuccess=\u4FDD\u5B58\u6210\u529F
+rmip.framework.log.exportSuccess=\u5BFC\u51FA\u6210\u529F
+rmip.framework.log.deleteDateAlert=\u8BF7\u9009\u62E9\u5220\u9664\u65E5\u671F\uFF01
+rmip.framework.log.deleteLogConfirm=\u5C06\u5220\u9664\u6240\u9009\u65E5\u671F\u4E4B\u524D\u7684\u65E5\u5FD7\uFF0C\u786E\u8BA4\u6267\u884C\u5220\u9664\uFF1F
+rmip.framework.log.deleteSuccess=\u5220\u9664\u6210\u529F
+rmip.framework.log.backupPeriodAlert=\u5907\u4EFD\u671F\u9650\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u9009\u62E9\uFF01
+rmip.framework.log.exportPath=\u5BFC\u51FA\u4F4D\u7F6E
+rmip.framework.log.exportFile=\u5BFC\u51FA\u6587\u4EF6
+rmip.framework.log.exportFile.fail=\u6CA1\u6709\u8981\u5230\u51FA\u7684\u6570\u636E\uFF01
+140101=\u83B7\u53D6\u65E5\u5FD7\u5220\u9664\u914D\u7F6E\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140102=\u83B7\u53D6\u65E5\u5FD7\u914D\u7F6E\u671F\u9650\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140103=\u83B7\u53D6\u65E5\u5FD7\u9875\u9762\u663E\u793A\u6761\u6570\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140104=\u83B7\u53D6\u672C\u6B21\u67E5\u8BE2\u65E5\u5FD7\u603B\u6570\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140105=\u67E5\u8BE2\u65E5\u5FD7\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140106=\u4FDD\u5B58\u671F\u9650\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140107=\u83B7\u53D6\u671F\u9650\u6570\u503C\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140108=\u5220\u9664\u65E5\u5FD7\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140109=\u8BB0\u5F55\u65E5\u5FD7\u51FA\u9519\uFF0C\u767B\u5F55\u4FE1\u606F\u53EF\u80FD\u4E3A\u7A7A\!
+
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.logDelete=\u65E5\u5FD7\u5220\u9664\uFF1A
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.autoDelete=\u81EA\u52A8\u5220\u9664
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.manualDelete=\u624B\u52A8\u5220\u9664
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.savePeriod=\u4FDD\u5B58\u671F\u9650\uFF1A
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.saveBtn=\u4FDD\u5B58
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.logBasicConf=\u65E5\u5FD7\u57FA\u7840\u914D\u7F6E
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.deleteDateAlert=\u8BF7\u9009\u62E9\u5220\u9664\u65E5\u671F\uFF01
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.deleteLogConfirm=\u5C06\u5220\u9664\u6240\u9009\u65E5\u671F\u4E4B\u524D\u7684\u65E5\u5FD7\uFF0C\u786E\u8BA4\u6267\u884C\u5220\u9664\uFF1F
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.deleteSuccess=\u5220\u9664\u6210\u529F
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.savePeriodAlert=\u4FDD\u5B58\u671F\u9650\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u9009\u62E9\uFF01
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.saveSuccess=\u4FDD\u5B58\u6210\u529F
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.selectDate=\u8BF7\u9009\u62E9\u65E5\u671F\uFF1A
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.delete=\u5220\u9664
+##########################################################################
+
+#############################################
+## \u6a21\u5757\u6743\u9650\u5206\u914d
+##
+##
+#############################################
+rmip.framework.rightdistribution.title.name = \u6743\u9650\u5206\u914D
+rmip.framework.rightdistribution.file = \u6743\u9650\u5206\u914D\u7BA1\u7406
+#\u6570\u636e\u6388\u6743
+rmip.framework.rightdistribution.datadistribute.name = \u6570\u636E\u6388\u6743
+rmip.framework.rightdistribution.datadistribute.title.name = \u540D\u79F0\uFF1A
+rmip.framework.rightdistribution.datadistribute.title.desc = \u63CF\u8FF0\uFF1A
+rmip.framework.rightdistribution.datadistribute.title.policyname = \u7B56\u7565\u57FA\u672C\u4FE1\u606F
+rmip.framework.rightdistribution.datadistribute.btnSubmit.name = \u63D0\u4EA4
+rmip.framework.rightdistribution.datadistribute.btnDeletePolicy.name = \u5220\u9664\u7B56\u7565\u5BF9\u8C61
+rmip.framework.rightdistribution.datadistribute.policyconf.name = \u7B56\u7565\u6743\u9650\u914D\u7F6E
+
+rmip.framework.rightdistribution.datadistribute.create.name = \u521B\u5EFA\u8005
+rmip.framework.rightdistribution.datadistribute.role.name = \u540C\u89D2\u8272\u7528\u6237
+rmip.framework.rightdistribution.datadistribute.normal.name = \u666E\u901A\u7528\u6237
+rmip.framework.rightdistribution.datadistribute.admin.name = \u7BA1\u7406\u5458
+
+rmip.framework.rightdistribution.datadistribute.table.checkbox = \u9009\u62E9
+rmip.framework.rightdistribution.datadistribute.table.name = \u89D2\u8272
+
+rmip.framework.rightdistribution.datadistribute.input.check.name.null = \u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF01
+rmip.framework.rightdistribution.datadistribute.input.check.name.length = \u540D\u79F0\u957F\u5EA6\u592A\u957F\uFF01
+rmip.framework.rightdistribution.datadistribute.input.check.desc.length = \u63CF\u8FF0\u957F\u5EA6\u592A\u957F\uFF01
+
+rmip.framework.rightdistribution.savepolicy.success = \u64CD\u4F5C\u6210\u529F\!
+rmip.framework.rightdistribution.savepolicy.error = \u64CD\u4F5C\u7684\u8FC7\u7A0B\u4E2D\u51FA\u73B0\u9519\u8BEF\!
+rmip.framework.rightdistribution.datadistribute.delete.policydata = \u8BF7\u5148\u9009\u62E9\u8981\u5220\u9664\u7684\u6570\u636E\!
+rmip.framework.rightdistribution.datadistribute.delete.query = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u6240\u9009\u62E9\u7684\u6570\u636E\u5417?(\u6CE8\u610F\:\u5220\u9664\u540E\u4E0D\u53EF\u6062\u590D,\u786E\u5B9A\u8981\u5220\u9664?)
+rmip.framework.rightdistribution.data = \u6CA1\u6709\u6570\u636E\u9879,\u4E0D\u80FD\u63D0\u4EA4\!
+rmip.framework.rightdistribution.delete.selectnode = \u8BF7\u9009\u4E2D\u8282\u70B9\u5220\u9664\uFF01
+rmip.framework.rightdistribution.delete.fail = \u5220\u9664\u6570\u636E\u7B56\u7565\u5931\u8D25\uFF01
+rmip.framework.rightdistribution.strategyconf.isnull = \u6570\u636E\u7B56\u7565\u914D\u7F6E\u4E3A\u7A7A\uFF0C\u4E0D\u5141\u8BB8\u63D0\u4EA4\uFF01
+rmip.framework.rightdistribution.datastrategy.name = \u7B56\u7565\u540D\u79F0\u91CD\u590D\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+#\u5f02\u5e38\u4fe1\u606f
+130000 = \u7B56\u7565\u914D\u7F6E\u5931\u8D25\uFF01
+130001 = \u83B7\u53D6\u7B56\u7565\u6570\u636E\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+130002 = \u83B7\u53D6\u6570\u636E\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+130003 = \u5220\u9664\u6570\u636E\u7B56\u7565\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+130004 = \u540C\u4E00\u4E2A\u89D2\u8272\u7528\u6237\uFF0C\u4E0D\u80FD\u6388\u6743\u591A\u6B21\uFF01
+
+#\u6a21\u5757\u6743\u9650\u914d\u7f6e
+rmip.framework.rightdistribution.moduleRight.name = \u6A21\u5757\u6743\u9650\u914D\u7F6E
+rmip.framework.rightdistribution.moduleRight.moduleTree = \u529F\u80FD\u6A21\u5757
+rmip.framework.rightdistribution.moduleRight.RoleList = \u89D2\u8272
+rmip.framework.rightdistribution.moduleRight.addButton.file=\u6388\u6743
+rmip.framework.rightdistribution.moduleRight.updateButton.file=\u4FEE\u6539
+rmip.framework.rightdistribution.moduleRight.delButton.file=\u91CD\u7F6E
+rmip.framework.rightdistribution.moduleRight.removeButton.file=\u79FB\u9664\u6743\u9650
+rmip.framework.rightdistribution.moduleRight.clearButton.file=\u6E05\u7A7A\u6743\u9650
+rmip.framework.rightdistribution.moduleRight.roleListNotNull.message=\u8BF7\u9009\u62E9\u4E00\u4E2A\u89D2\u8272\uFF01
+rmip.framework.rightdistribution.moduleRight.changes.message=\u60A8\u8FD8\u6CA1\u6709\u4FDD\u5B58\uFF0C\u786E\u5B9A\u653E\u5F03\u5F53\u524D\u64CD\u4F5C\u5417\uFF1F
+#----\u8865\u5145\u6dfb\u52a0\u6388\u6743\u529f\u80fd
+rmip.framework.rightdistribution.moduleRight.reAddButton.file=\u589E\u52A0\u6388\u6743
+rmip.framework.rightdistribution.moduleRight.lookButton.file=\u67E5\u770B\u6388\u6743
+
+#\u5f02\u5e38\u4fe1\u606f
+130100 = \u4FDD\u5B58\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+130101 = \u68C0\u7D22\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+
+#\u7279\u6b8a\u6570\u636e\u6388\u6743 \u9875\u9762\u663e\u793a\u4fe1\u606f
+rmip.framework.rightdistribution.specialdatadistribute.name=\u7279\u6B8A\u6570\u636E\u6388\u6743
+rmip.framework.rightdistribution.specialdatadistribute.add=\u52A0\u4E00\u884C
+rmip.framework.rightdistribution.specialdatadistribute.submit=\u63D0\u4EA4
+rmip.framework.rightdistribution.specialdatadistribute.delete=\u51CF\u4E00\u884C
+rmip.framework.rightdistribution.specialdatadistribute.ok=\u64CD\u4F5C\u6210\u529F\uFF01
+rmip.framework.rightdistribution.specialdatadistribute.remove=\u8BF7\u9009\u62E9\u8981\u79FB\u9664\u7684\u9879\uFF01
+rmip.framework.rightdistribution.specialdatadistribute.conformremove=\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u6570\u636E\u5417?\n\u5220\u9664\u540E\u4E0D\u53EF\u6062\u590D,\u786E\u5B9A?
+rmip.framework.rightdistribution.specialdatadistribute.redeploy=\u8981\u63D0\u4EA4\u7684\u6570\u636E\u4E2D\u5B58\u5728\u91CD\u590D\u7684\u914D\u7F6E\uFF0C\n\u8BF7\u8BF7\u68C0\u67E5\u540E\u91CD\u65B0\u914D\u7F6E\uFF01
+rmip.framework.rightdistribution.specialdatadistribute.deployedwrong=\u6B64\u6A21\u5757\u914D\u7F6E\u6709\u8BEF\uFF01
+rmip.framework.rightdistribution.specialdatadistribute.norule=\u7CFB\u7EDF\u4E2D\u6CA1\u6709\u5BF9\u5E94\u7684\u89C4\u5219\uFF0C\u8BF7\u627E\u7BA1\u7406\u5458\u914D\u7F6E\uFF01
+rmip.framework.rightdistribution.specialdatadistribute.norole=\u7CFB\u7EDF\u4E2D\u6CA1\u6709\u8981\u8FDB\u884C\u6743\u9650\u5206\u914D\u7684\u89D2\u8272\uFF0C\u8BF7\u5148\u521B\u5EFA\u89D2\u8272\u3002
+
+#\u7279\u6b8a\u6570\u636e\u6388\u6743 \u5f02\u5e38\u4fe1\u606f
+110501=\u5206\u914D\u7279\u6B8A\u6570\u636E\u6743\u9650\u65F6\u51FA\u73B0\u5F02\u5E38\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110502=\u83B7\u53D6\u7279\u6B8A\u6570\u636E\u914D\u6743\u9650\u65F6\u51FA\u73B0\u5F02\u5E38\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110503=\u5220\u9664\u7279\u6B8A\u6570\u636E\u6743\u9650\u65F6\u51FA\u73B0\u5F02\u5E38\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110504=\u4ECEconfig.priperties\u6587\u4EF6\u4E2D\u83B7\u53D6\u914D\u7F6E\u4FE1\u606F\u9519\u8BEF\uFF0C/n\u8BF7\u68C0\u67E5\u662F\u5426\u6709\u76F8\u5173\u914D\u7F6E\uFF01
+
+#\u4fee\u6539\u5bc6\u7801 \u5f39\u51fa\u9519\u8bef\u63d0\u793a\u4fe1\u606f
+rmip.framework.logon.changepwd.notnull=\u586B\u5199\u6846\u4E0D\u80FD\u6709\u7A7A\u503C\uFF0C\u8BF7\u8F93\u5165\uFF01
+rmip.framework.logon.changepwd.notsame=\u60A8\u8F93\u5165\u7684\u5BC6\u7801\u4E0E\u767B\u5F55\u5BC6\u7801\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.logon.changepwd.notsame1=\u786E\u8BA4\u5BC6\u7801\u4E0E\u4FEE\u6539\u5BC6\u7801\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.logon.changepwd.error=\u5BC6\u7801\u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.logon.changepwd.nochange=\u5BC6\u7801\u524D\u540E\u6CA1\u6709\u6539\u53D8\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.logon.changepwd.fail=\u64CD\u4F5C\u5931\u8D25\uFF01
+rmip.framework.logon.changepwd.success=\u5BC6\u7801\u4FEE\u6539\u6210\u529F\!
+rmip.framework.logon.password.lengthIsTen = \u5BC6\u7801\u957F\u5EA6\u4E0D\u80FD\u5C0F\u4E8E10\uFF01
+rmip.framework.logon.password.levelIsLow = \u5BC6\u7801\u5B89\u5168\u7EA7\u522B\u592A\u4F4E\uFF01
+#\u89c4\u5219\u7ba1\u7406
+rmip.framework.ruleManager.title=\u89C4\u5219\u7BA1\u7406
+rmip.framework.ruleManager.name=\u540D\u79F0
+rmip.framework.ruleManager.desc=\u63CF\u8FF0
+rmip.framework.ruleManager.pipelining=\u6D41\u6C34\u65B9\u5F0F
+rmip.framework.ruleManager.documentDescription=\u8BF4\u660E\u6587\u6863
+rmip.framework.ruleManager.browsing.button=\u6D4F\u89C8
+rmip.framework.ruleManager.upload.button=\u4E0A\u4F20
+rmip.framework.ruleManager.add.button=\u589E\u52A0
+rmip.framework.ruleManager.update.button=\u4FEE\u6539
+rmip.framework.ruleManager.del.button=\u5220\u9664
+rmip.framework.ruleManager.ruleInfo=\u89C4\u5219\u5217\u8868
+rmip.framework.ruleManager.codeRule=\u7F16\u7801\u89C4\u5219\u7801\u6BB5
+rmip.framework.ruleManager.nameAlert=\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.ruleManager.nameisexist=\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.ruleManager.flowtypeAlert=\u6D41\u6C34\u65B9\u5F0F\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u9009\u62E9\uFF01
+rmip.framework.codesection.title=\u89C4\u5219\u7801\u6BB5
+rmip.framework.codesection.addButton=\u6DFB\u52A0
+rmip.framework.codesection.cancelButton=\u53D6\u6D88
+rmip.framework.codesection.nameLengthAlert = \u540D\u79F0\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.codesection.descLengthAlert = \u63CF\u8FF0\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7255\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.codesection.selectRootNode = \u8BF7\u5148\u9009\u62E9\u6839\u8282\u70B9\!
+rmip.framework.ruleManager.modifySuccess = \u4FEE\u6539\u6210\u529F\!
+rmip.framework.ruleManager.selectDeleteNode = \u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u8282\u70B9\uFF01
+rmip.framework.ruleManager.selectRuleNode = \u8BF7\u9009\u62E9\u8981\u6E05\u9664\u7684\u89C4\u5219\uFF01
+rmip.framework.ruleManager.meaasge.donotdelete = \u5DF2\u7ECF\u5B58\u5728\u89C4\u5219\u4E0D\u80FD\u5220\u9664\uFF01
+
+rmip.framework.editOnlyOne= \u6BCF\u6B21\u53EA\u80FD\u4FEE\u6539\u4E00\u6761\u6570\u636E\!
+rmip.framework.editObject= \u8BF7\u9009\u62E9\u4FEE\u6539\u6570\u636E\!
+rmip.framework.deleteObject= \u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u5BF9\u8C61\u5417?
+rmip.framework.AttributeGroupPanel.deleteAttributeGroup= \u9009\u4E2D\u7684\u5C5E\u6027\u5206\u7C7B\u5305\u542B\u5C5E\u6027\uFF0C\u4E0D\u53EF\u4EE5\u5220\u9664\uFF01
+
+#\u8d44\u6e90\u7c7b\u578b\u6a21\u677f\u7ba1\u7406
+rmip.framework.RMTypeTemplateModule=\u8D44\u6E90\u7C7B\u578B\u6A21\u677F\u7BA1\u7406
+#\u8d44\u6e90\u6570\u636e\u5206\u7c7b
+rmip.framework.RMTypeModule=\u8D44\u6E90\u6570\u636E\u7BA1\u7406
+#\u4f18\u9009\u5e93
+rmip.framework.RMPreferLibraryModule=\u4F18\u9009\u5E93
+#\u67e5\u8be2
+rmip.sherch.RMSherchModel=\u67E5\u8BE2
+
+106001=\u4E3B\u952E\u91CD\u590D\uFF0C\u8BF7\u4FEE\u6539\u540E\u63D0\u4EA4\uFF01
+106002=\u65B0\u5EFA\u914D\u7F6E\u9879\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u521B\u5EFA\uFF01
+106003=\u66F4\u6539\u914D\u7F6E\u9879\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u4FEE\u6539\uFF01
+106004=\u5220\u9664\u914D\u7F6E\u9879\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u914D\u7F6E\uFF01
+106005=\u83B7\u53D6\u6240\u6709\u914D\u7F6E\u9879\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u83B7\u53D6\uFF01
+106006=\u83B7\u53D6\u914D\u7F6E\u9879\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u83B7\u53D6\uFF01
+
+
+107001=\u540D\u79F0\u91CD\u590D\uFF0C\u8BF7\u4FEE\u6539\u540E\u63D0\u4EA4\uFF01
+107002=\u65B0\u5EFA\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u521B\u5EFA\uFF01
+107003=\u4FEE\u6539\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u4FEE\u6539\uFF01
+107004=\u5220\u9664\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u5220\u9664\uFF01
+107005=\u83B7\u53D6\u6240\u6709\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u83B7\u53D6\uFF01
+107006=\u83B7\u53D6\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u83B7\u53D6\uFF01
+107007=\u5206\u7C7B\u4E0B\u5B58\u5728\u914D\u7F6E\u9879\uFF0C\u4E0D\u80FD\u5220\u9664\uFF01
+
+
+555555=\u83B7\u53D6\u5BC6\u7801\u7B56\u7565\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555556=\u4FDD\u5B58\u5BC6\u7801\u7B56\u7565\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555557=\u4FEE\u6539\u5BC6\u7801\u7B56\u7565\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555558=\u5220\u9664\u5BC6\u7801\u7B56\u7565\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555559=\u83B7\u53D6\u5BC6\u7EA7\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555560=\u4FDD\u5B58\u5BC6\u7EA7\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555561=\u4FEE\u6539\u5BC6\u7EA7\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555562=\u9A8C\u8BC1\u5BC6\u7EA7\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555563=\u5220\u9664\u5BC6\u7EA7\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555565=\u9A8C\u8BC1\u5BC6\u7801\u7B56\u7565\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555564=\u4FDD\u5B58\u5BC6\u7EA7\u7B56\u7565\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555566=\u83B7\u53D6\u5BC6\u7EA7\u7B56\u7565\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555567=\u4FDD\u5B58\u4EBA\u5458-\u5BC6\u7EA7\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555568=\u83B7\u53D6\u4EBA\u5458\u767B\u5F55\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\!
+555569=\u83B7\u53D6\u670D\u52A1\u5668\u5F53\u524D\u65F6\u95F4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\!
+555570=\u4FEE\u6539\u4EBA\u5458\u767B\u5F55\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\!
+555571=\u4E3A\u4EBA\u5458\u89E3\u9501\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\!
+
+
+##\u5c5e\u6027\u6821\u9a8c\u89c4\u5219
+210601=\u4FDD\u5B58\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+210602=\u66F4\u65B0\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+210603=\u5220\u9664\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+210604=\u83B7\u53D6\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+210605=\u8BE5\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u5DF2\u7ECF\u88AB\u5F15\u7528\uFF0C\u65E0\u6CD5\u8FDB\u884C\u5F53\u524D\u64CD\u4F5C\uFF01
+
+150118=\u4E3A\u5C5E\u6027\u914D\u7F6E\u6821\u9A8C\u89C4\u5219\u65F6\u7CFB\u7EDF\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\!
+150119=\u6E05\u9664\u5C5E\u6027\u7684\u6821\u9A8C\u89C4\u5219\u65F6\u7CFB\u7EDF\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\!
+
+
+##\u5c5e\u6027\u540c\u4e49\u8bcd\u914d\u7f6e
+220101=\u521B\u5EFA\u5C5E\u6027\u540C\u4E49\u8BCD\u914D\u7F6E\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u67E5\u627E\u539F\u56E0\!
+220102=\u4FEE\u6539\u5C5E\u6027\u540C\u4E49\u8BCD\u914D\u7F6E\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u67E5\u627E\u539F\u56E0\!
+220103=\u5220\u9664\u5C5E\u6027\u540C\u4E49\u8BCD\u914D\u7F6E\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u67E5\u627E\u539F\u56E0\!
+220104=\u83B7\u53D6\u5C5E\u6027\u540C\u4E49\u8BCD\u914D\u7F6E\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u67E5\u627E\u539F\u56E0\!
+
+0=\u529F\u80FD\u6A21\u5757\u6388\u6743\u5931\u8D25\!
+
+LogonHandler.userNameNotExists=\u7528\u6237\u540D\u4E0D\u5B58\u5728\uFF01
+LogonHandler.userNameOrPwdWrong=\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF\uFF01
+LogonHandler.userSecretNotMatchMachineSecret=\u7528\u6237\u5BC6\u7EA7\u4E0E\u673A\u5668\u5BC6\u7EA7\u4E0D\u5339\u914D\uFF0C\u767B\u5F55\u5931\u8D25\uFF01
+LogonHandler.userIsLockedPleaseWaitSomeTimeToTry=\u7528\u6237\u5DF2\u7ECF\u88AB\u9501\u5B9A\uFF0C\u8BF7\u7B49 {0} \u5206\u949F\u540E\u518D\u5C1D\u8BD5\u767B\u5F55\uFF0C\u6216\u8005\u627E\u7BA1\u7406\u5458\u89E3\u9501\uFF01
+LogonHandler.userLoginWrongTooMuch=\u767B\u9646\u9519\u8BEF\u6B21\u6570\u8FC7\u591A\uFF0C\u767B\u5165\u7CFB\u7EDF\u5931\u8D25\uFF01\u7528\u6237\u5DF2\u88AB\u9501\u5B9A\uFF01
+LogonHandler.userIsDisabled=\u60A8\u7684\u5E10\u6237\u5DF2\u88AB\u505C\u7528,\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\uFF01
+LogonHandler.userPwdIsInitPleaseChange=\u60A8\u7684\u5BC6\u7801\u662F\u7BA1\u7406\u5458\u521D\u59CB\u7684\u5BC6\u7801\uFF0C\u9700\u8981\u4FEE\u6539\u5BC6\u7801\u624D\u80FD\u8FDB\u884C\u5176\u5B83\u64CD\u4F5C\uFF01
+LogonHandler.userPwdIsExpiredPleaseChange=\u60A8\u7684\u5BC6\u7801\u5DF2\u7ECF\u8FC7\u671F,\u8BF7\u8FDB\u884C\u4FEE\u6539\uFF01
+LogonHandler.userPwdStagIsUpdatePleaseChange=\u60A8\u7684\u5BC6\u7801\u7B56\u7565\u5DF2\u7ECF\u4FEE\u6539\uFF0C\u9700\u8981\u4FEE\u6539\u5BC6\u7801\u624D\u80FD\u8FDB\u884C\u5176\u5B83\u64CD\u4F5C\uFF01
+LogonHandler.userPwdHasSomeDayExpire=\u60A8\u7684\u5BC6\u7801\u6709\u6548\u671F\u8FD8\u6709 {0} \u5929,\u8BF7\u6CE8\u610F\u4FEE\u6539\uFF01
+LogonHandler.logDataIsTooMuch=\u65E5\u5FD7\u5B58\u50A8\u5C06\u6EE1\uFF0C\u8BF7\u53CA\u65F6\u6E05\u7406\uFF01
+LogonHandler.logonModule=\u767B\u5F55\u6A21\u5757
+LogonHandler.logon=\u767B\u5165
+LogonHandler.userIpNotMatch=\u5F53\u524D\u673A\u5668\u7684IP\u5BC6\u7EA7\u4E0D\u7B26\u5408\u5BC6\u7EA7\u8981\u6C42
+LogonHandler.userIsNotThree=\u5F53\u524D\u767B\u5F55\u7528\u6237\u975E\u4E09\u5458\u7528\u6237
+
diff --git a/Source/Service/LogService/src/properties/RMIPFramework_zh.properties b/Source/Service/LogService/src/properties/RMIPFramework_zh.properties
new file mode 100644
index 0000000..067061e
--- /dev/null
+++ b/Source/Service/LogService/src/properties/RMIPFramework_zh.properties
@@ -0,0 +1,798 @@
+\ufeff#\u5173\u95edFrame\u63d0\u793a\u5bf9\u8bdd\u6846\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.exit.system=\u9000\u51FA\u7CFB\u7EDF
+rmip.framework.logManagementModel=\u65E5\u5FD7\u7BA1\u7406\u6A21\u5757
+rmip.framework.exit.confirm=\u786E\u5B9A\u8981\u9000\u51FA\u7CFB\u7EDF\u5417\uFF1F
+rmip.framework.button.confirm=\u786E\u5B9A
+rmip.framework.button.cancel=\u53D6\u6D88
+
+#Menu\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.menu.file=\u7CFB\u7EDF
+rmip.framework.menu.file.relogon=\u91CD\u65B0\u767B\u5F55
+rmip.framework.menu.file.update.password=\u66F4\u6539\u5BC6\u7801
+rmip.framework.menu.file.exit=\u9000\u51FA
+rmip.framework.menu.file.reloadCache=\u5237\u65B0\u7F13\u5B58
+rmip.framework.menu.file.importAll=\u4E00\u952E\u5BFC\u5165
+rmip.framework.menu.file.exportAll=\u4E00\u952E\u5BFC\u51FA
+rmip.framework.menu.help=\u5E2E\u52A9
+rmip.framework.menu.help.use=\u4F7F\u7528\u5E2E\u52A9
+rmip.framework.menu.about=\u5173\u4E8E
+rmip.framework.reload.title=\u91CD\u65B0\u767B\u9646
+rmip.framework.reload.message=\u60A8\u786E\u5B9A\u8981\u91CD\u65B0\u767B\u9646\u5417?
+
+
+#\u63d0\u793a\u5bf9\u8bdd\u6846\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.info.message.dialog.title=\u4FE1\u606F\u63D0\u793A
+rmip.framework.error.message.dialog.title=\u9519\u8BEF\u63D0\u793A
+rmip.framework.warn.message.dialog.title=\u8B66\u544A\u63D0\u793A
+rmip.framework.friend.message.dialog.title=\u6E29\u99A8\u63D0\u793A
+rmip.framework.friend.message.dialog.message=\u60A8\u786E\u5B9A\u6267\u884C\u6B64\u64CD\u4F5C\u5417\uFF1F
+
+#Frame\u9875\u9762\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.system.name=VCI-Tech Innovation Platform
+rmip.framework.current.user=\u5F53\u524D\u7528\u6237\:
+
+#\u767b\u5f55\u9875\u9762\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.logon.name=\u7528\u6237\u540D\uFF1A
+rmip.framework.logon.password=\u5BC6\u7801\uFF1A
+rmip.framework.logon.new.passwork=\u65B0\u5BC6\u7801\uFF1A
+rmip.framework.logon.confirm.password=\u65B0\u5BC6\u7801\u786E\u8BA4\uFF1A
+rmip.framework.modify.password=\u4FEE\u6539\u5BC6\u7801
+
+rmip.framework.logon.isSave.password=\u662F\u5426\u4FDD\u5B58\u7528\u6237\u7684\u5BC6\u7801
+rmip.framework.logon.button.logon=\u767B\u5F55
+rmip.framework.logon.name.isNotNull=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A\!
+rmip.framework.logon.password.isNotNull=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A\!
+rmip.framework.logon.welcome.msg=\u6B22\u8FCE\u4F7F\u7528VCI-Tech Innovation Platform
+
+
+
+########################################################################
+##\u7cfb\u7edf\u914d\u7f6e\u6a21\u5757\u56fd\u9645\u5316\u4fe1\u606f
+########################################################################
+##\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.systemConfigModule = \u7CFB\u7EDF\u914D\u7F6E\u7BA1\u7406
+rmip.framework.sysconfig.specialChar = \u7279\u6B8A\u5B57\u7B26
+rmip.framework.sysconfig.attrManagement = \u5C5E\u6027\u7BA1\u7406
+rmip.framework.sysconfig.specialCharClsf = \u7279\u6B8A\u5B57\u7B26\u5206\u7C7B
+rmip.framework.sysconfig.unit = \u5355\u4F4D
+rmip.framework.sysconfig.name = \u540D\u79F0\uFF1A
+rmip.framework.sysconfig.desc = \u63CF\u8FF0\uFF1A
+rmip.framework.sysconfig.add = \u589E\u52A0
+rmip.framework.sysconfig.modify = \u4FEE\u6539
+rmip.framework.sysconfig.delete = \u5220\u9664
+rmip.framework.sysconfig.value = \u503C
+rmip.framework.sysconfig.sort = \u6392\u5E8F
+rmip.framework.sysconfig.valueName = \u540D\u79F0
+rmip.framework.sysconfig.modifyCharAlert1 = \u8BF7\u9009\u62E9\u8981\u4FEE\u6539\u7684\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.modifyCharAlert2 = \u8981\u4FEE\u6539\u7684\u503C\u53EA\u80FD\u662F\u4E00\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.modifyCharAlert3 = \u8BF7\u9009\u4E2D\u8981\u4FEE\u6539\u7684\u5B57\u7B26\u8FDB\u884C\u4FEE\u6539\u64CD\u4F5C\uFF01
+rmip.framework.sysconfig.valueAlert = \u503C\u4E0D\u80FD\u4E3A\u7A7A\uFF01
+rmip.framework.sysconfig.addCharAlert1 = \u6DFB\u52A0\u7684 '
+rmip.framework.sysconfig.addCharAlert2 = ' \u5B57\u7B26\u4E0D\u80FD\u6DFB\u52A0\u591A\u4E2A\uFF0C\u8BF7\u4FEE\u6539\uFF01
+rmip.framework.sysconfig.modifySuccess = \u4FEE\u6539\u6210\u529F\!
+rmip.framework.sysconfig.deleteAttrAlert=\u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u5C5E\u6027\!
+rmip.framework.sysconfig.deleteAttrAlert1=\u5C5E\u6027\u5DF2\u88AB\u5F15\u7528,\u4E0D\u80FD\u5220\u9664\!
+rmip.framework.sysconfig.deleteCharAlert1 = \u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.deleteCharAlert2 = \u5220\u9664\u5931\u8D25\uFF0C\u4E0D\u5E94\u8BE5\u5305\u542B\u7B2C '
+rmip.framework.sysconfig.deleteCharAlert3 = ' \u884C
+rmip.framework.sysconfig.deleteCharAlert4 = \u7B2C '
+rmip.framework.sysconfig.deleteCharAlert5 = ' \u5217\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.framework.sysconfig.deleteConfirm = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u5B57\u7B26\u5417\uFF1F
+rmip.framework.sysconfig.warmTip = \u6E29\u99A8\u63D0\u793A
+rmip.framework.sysconfig.selectDeleteNode = \u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u8282\u70B9\uFF01
+rmip.framework.sysconfig.deleteClsfAlert = \u9009\u62E9\u5220\u9664\u7684\u8282\u70B9\u5305\u62EC\u975E\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u8282\u70B9\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.framework.sysconfig.deleteClsfConfirm = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u5206\u7C7B\u5417?
+rmip.framework.sysconfig.nameAlert = \u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.sysconfig.nameLengthAlert = \u540D\u79F0\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.descLengthAlert = \u63CF\u8FF0\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7255\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.internalnameAlert = \u5185\u90E8\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.sysconfig.internalnameLenghAlert = \u5185\u90E8\u540D\u79F0\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.internalnameLeeter = \u5185\u90E8\u540D\u79F0\u53EA\u80FD\u4E3A\u5B57\u6BCD\u5F00\u5934\uFF0C\u8BF7\u66F4\u6539\uFF01
+rmip.framework.sysconfig.attrLengthAlert = \u957F\u5EA6\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.sysconfig.attrLengthIsNum = \u957F\u5EA6\u53EA\u80FD\u4E3A\u6570\u5B57\uFF0C\u8BF7\u91CD\u586B\u5199\uFF01
+rmip.framework.sysconfig.attrLengthMax = \u957F\u5EA6\u4E3A1~4000\u4E4B\u95F4\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.sysconfig.query = \u67E5\u8BE2
+rmip.framework.sysconfig.allAttr = \u6240\u6709\u5C5E\u6027
+rmip.framework.sysconfig.defaultValue = \u9ED8\u8BA4\u503C\:
+rmip.framework.sysconfig.isEmpty = \u53EF\u4EE5\u4E3A\u7A7A\:
+rmip.framework.sysconfig.isGroup = \u662F\u5426\u96C6\u56E2\u5C5E\u6027\:
+rmip.framework.sysconfig.groupAttr = \u96C6\u56E2\u5C5E\u6027
+rmip.framework.sysconfig.groupAppendAttr = \u96C6\u56E2\u9644\u52A0\u5C5E\u6027
+rmip.framework.sysconfig.enterpriseAttr = \u4F01\u4E1A\u5C5E\u6027
+rmip.framework.sysconfig.isKey = \u662F\u5426\u5173\u952E\u5C5E\u6027\:
+rmip.framework.sysconfig.dataType = \u6570\u636E\u7C7B\u578B\uFF1A
+rmip.framework.sysconfig.valueRange = \u53D6\u503C\u8303\u56F4
+rmip.framework.sysconfig.attrrule=\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\uFF1A
+rmip.framework.sysconfig.attLengh=\u957F\u5EA6\uFF1A
+rmip.framework.sysconfig.isOnly=\u56FA\u6709\u5C5E\u6027
+rmip.framework.sysconfig.internalname=\u5185\u90E8\u540D\u79F0\uFF1A
+rmip.framework.sysconfig.queryAlert = \u6CA1\u6709\u7B26\u5408\u67E5\u8BE2\u8981\u6C42\u7684\u8BB0\u5F55\!
+rmip.framework.sysconfig.defaultValLengthAlert = \u9ED8\u8BA4\u503C\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7255\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.valueRangeNotNull = \u53D6\u503C\u8303\u56F4\u503C\u4E0D\u80FD\u4E3A\u7A7A\uFF01
+rmip.framework.sysconfig.valueRangeLengthAlert = \u53D6\u503C\u8303\u56F4\u503C\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.valueRangeLength = \u53D6\u503C\u8303\u56F4\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7\u5C5E\u6027\u957F\u5EA6\uFF01
+rmip.framework.sysconfig.valRangeModifyAlert = \u8BF7\u9009\u4E2D\u8981\u4FEE\u6539\u7684\u53D6\u503C\u8303\u56F4\u8FDB\u884C\u4FEE\u6539\u64CD\u4F5C\uFF01
+rmip.framework.sysconfig.selectRootNode = \u8BF7\u5148\u9009\u62E9\u6839\u8282\u70B9\!
+rmip.framework.sysconfig.selectAttrNode = \u8BF7\u5148\u9009\u62E9\u5C5E\u6027\u8282\u70B9\!
+rmip.framework.sysconfig.deleteAttrConfirm = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u5C5E\u6027\u5417?
+rmip.framework.sysconfig.selectDeleteValRange = \u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u53D6\u503C\u8303\u56F4\uFF01
+rmip.framework.sysconfig.deleteValRangeConfirm = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u53D6\u503C\u8303\u56F4\u5417\uFF1F
+rmip.framework.sysconfig.modifyValFail = \u8981\u4FEE\u6539\u7684\u503C\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4FEE\u6539\u5931\u8D25\uFF01
+rmip.framework.sysconfig.addValFail = \u8981\u6DFB\u52A0\u7684\u503C\u5DF2\u7ECF\u5B58\u5728\uFF0C\u6DFB\u52A0\u5931\u8D25\uFF01
+rmip.framework.sysconfig.updateordelete=\u662F\u5C5E\u6027\u9ED8\u8BA4\u503C,\u4E0D\u53EF\u5220\u9664\u6216\u4FEE\u6539\!
+rmip.framework.sysconfig.defaultvaluewrong=\u5C5E\u6027\u9ED8\u8BA4\u503C\u4E0D\u80FD\u901A\u8FC7\u5C5E\u6027\u89C4\u5219\u6821\u9A8C,\u683C\u5F0F\u4E0D\u6B63\u786E,\u8BF7\u4FEE\u6539\!
+rmip.framework.sysconfig.scopeValueWrong=\u53D6\u503C\u8303\u56F4\u503C\u4E0D\u80FD\u901A\u8FC7\u5C5E\u6027\u89C4\u5219\u6821\u9A8C,\u683C\u5F0F\u4E0D\u6B63\u786E,\u8BF7\u4FEE\u6539\!
+rmip.framework.sysconfig.attrRangeIsUsed=\u7684\u53D6\u503C\u8303\u56F4\u5DF2\u7ECF\u88AB\u5F15\u7528,\u4E0D\u80FD\u5220\u9664\u6216\u4FEE\u6539\!
+rmip.framework.sysconfig.firstSelectAttrNode=\u8BF7\u9009\u62E9\u5C5E\u6027\u518D\u6DFB\u52A0\u5C5E\u6027\u503C\!
+rmip.framework.sysconfig.attrRangeNameError=\u53D6\u503C\u8303\u56F4\u7684\u540D\u79F0\u5728\u8BE5\u5C5E\u6027\u4E0B\u5DF2\u7ECF\u5B58\u5728,\u8BF7\u66F4\u6539\!
+rmip.framework.sysconfig.attrRangeNameError1=\u53D6\u503C\u8303\u56F4\u540D\u79F0\u4E0D\u80FD\u8D85\u8FC7128\u4E2A\u5B57\u7B26\!
+rmip.framework.sysconfig.attrGroupAlert=\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.submit=\u63D0\u4EA4
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.cancel=\u53D6\u6D88
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.moveup=\u4E0A\u79FB
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.down=\u4E0B\u79FB
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.top=\u6700\u4E0A\u7AEF
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.bottom=\u6700\u4E0B\u7AEF
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.attrRange=\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u6392\u5E8F
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.range=\u5C5E\u6027\u503C
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.selecttoup=\u8BF7\u9009\u62E9\u5C5E\u6027\u503C\u8FDB\u884C\u4E0A\u79FB\u64CD\u4F5C\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.selectonlyone=\u6BCF\u6B21\u53EA\u5141\u8BB8\u9009\u62E9\u4E00\u6761\u5C5E\u6027\u503C\u8FDB\u884C\u64CD\u4F5C\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.selectisnull=\u8BF7\u9009\u62E9\u5C5E\u6027\u503C\u8FDB\u884C\u64CD\u4F5C\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.selecttodown=\u8BF7\u9009\u62E9\u5C5E\u6027\u503C\u8FDB\u884C\u4E0B\u79FB\u64CD\u4F5C\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.existup=\u5C5E\u6027\u503C\u5DF2\u7ECF\u5728\u6700\u4E0A\u7AEF\uFF0C\u4E0D\u5141\u8BB8\u79FB\u52A8\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.existdown=\u5C5E\u6027\u503C\u5DF2\u7ECF\u5728\u6700\u4E0B\u7AEF\uFF0C\u4E0D\u5141\u8BB8\u79FB\u52A8\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.success=\u4FDD\u5B58\u6210\u529F\uFF01
+
+##Icon\u56fe\u6807\u9009\u62e9\u7a97\u4f53
+com.vci.rmip.framework.client.common.IconSelectDialog.btnOk=\u786E\u5B9A
+com.vci.rmip.framework.client.common.IconSelectDialog.btnCancel=\u53D6\u6D88
+
+com.vci.rmip.allcommon\u3002IconSelectDialog.btnOk=\u786E\u5B9A
+com.vci.rmip.allcommon\u3002IconSelectDialog.btnCancel=\u53D6\u6D88
+##\u5f02\u5e38\u9519\u8bef\u4fe1\u606f
+150001 = \u5220\u9664\u7279\u6B8A\u5B57\u7B26\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150002 = \u5220\u9664\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150003 = \u83B7\u53D6\u7279\u6B8A\u5B57\u7B26\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150004 = \u83B7\u53D6\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150005 = \u8981\u4FDD\u6301\u7684\u7279\u6B8A\u5B57\u7B26\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150006 = \u4FDD\u5B58\u7279\u6B8A\u5B57\u7B26\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150007 = \u8981\u4FDD\u5B58\u7684\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150008 = \u4FDD\u5B58\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150009 = \u66F4\u65B0\u540E\u7684\u7279\u6B8A\u5B57\u7B26\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150010 = \u66F4\u65B0\u7279\u6B8A\u5B57\u7B26\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150011 = \u66F4\u65B0\u540E\u7684\u7279\u6B8A\u5B57\u7B26\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150012 = \u66F4\u65B0\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150101 = \u5220\u9664\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150102 = \u5220\u9664\u5C5E\u6027\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150103 = \u83B7\u53D6\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150104 = \u83B7\u53D6\u5C5E\u6027\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150105 = \u6B64\u53D6\u503C\u8303\u56F4\u5DF2\u7ECF\u5B58\u5728
+150106 = \u4FDD\u5B58\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150107 = \u4FDD\u5B58\u7684\u5C5E\u6027\u5B58\u5728\u91CD\u590D\u6570\u636E\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150108 = \u4FDD\u5B58\u5C5E\u6027\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150109 = \u66F4\u65B0\u540E\u7684\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150110 = \u66F4\u65B0\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150111 = \u66F4\u65B0\u540E\u7684\u5C5E\u6027\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150112 = \u66F4\u65B0\u5C5E\u6027\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150113 = \u8FDE\u63A5\u670D\u52A1\u5668\u65F6\u53D1\u751F\u5F02\u5E38\uFF01
+150114 = \u67E5\u8BE2\u5C5E\u6027\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150115 = \u5220\u9664\u6216\u4FEE\u6539\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150116 = \u5C5E\u6027\u7684\u5185\u90E8\u540D\u79F0\u5B58\u5728\u91CD\u590D\uFF01
+10060=\u8981\u6DFB\u52A0\u7684\u7279\u6B8A\u5B57\u7B26\u5728\u8BE5\u5206\u7C7B\u4E0B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4FDD\u5B58\u5931\u8D25\uFF01
+10062=\u8981\u4FEE\u6539\u7684\u7279\u6B8A\u5B57\u7B26\u5728\u8BE5\u5206\u7C7B\u4E0B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4FDD\u5B58\u5931\u8D25\uFF01
+10061=\u8981\u521B\u5EFA\u7684\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4FDD\u5B58\u5931\u8D25\uFF01
+10063=\u8981\u4FEE\u6539\u7684\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4FDD\u5B58\u5931\u8D25\uFF01
+150117=\u83B7\u53D6\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u53D1\u751F\u9519\u8BEF\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+150120=\u540C\u4E00\u4E2A\u5C5E\u6027\u5206\u7C7B\u4E0B\u7684\u5C5E\u6027\u5916\u90E8\u540D\u79F0\u5B58\u5728\u91CD\u590D,\u8BF7\u4FEE\u6539\!
+150121=\u540C\u4E00\u4E2A\u5C5E\u6027\u5206\u7C7B\u4E0B\u7684\u5C5E\u6027\u5185\u90E8\u540D\u79F0\u5B58\u5728\u91CD\u590D,\u8BF7\u4FEE\u6539\!
+150122=\u8BE5\u5C5E\u6027\u5DF2\u7ECF\u88AB\u6A21\u677F\u5F15\u7528,\u4E14\u6A21\u677F\u8868\u4E2D\u5B58\u5728\u6570\u636E.\u4FEE\u6539\u540E\u7684\u5C5E\u6027\u957F\u5EA6\u4E0D\u80FD\u5C0F\u4E8E\u4FEE\u6539\u524D\u957F\u5EA6\!
+150123=\u8BE5\u5C5E\u6027\u5DF2\u7ECF\u5B58\u5728\u53D6\u503C\u8303\u56F4,\u4FEE\u6539\u540E\u7684\u5C5E\u6027\u957F\u5EA6\u4E0D\u80FD\u5C0F\u4E8E\u4FEE\u6539\u524D\u957F\u5EA6\!
+
+########################################################################
+##\u7cfb\u7edf\u914d\u7f6e\u6a21\u5757\u56fd\u9645\u5316\u4fe1\u606f END
+########################################################################
+
+
+########################################################################
+##\u89c4\u5219\u7ba1\u7406\u6a21\u5757\u56fd\u9645\u5316\u4fe1\u606f
+########################################################################
+##\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.ruleManagementModule = \u89C4\u5219\u7BA1\u7406
+rmip.framework.rMTypeTemplateModule = \u8D44\u6E90\u7C7B\u578B\u6A21\u677F\u7BA1\u7406
+##\u5f02\u5e38\u9519\u8bef\u4fe1\u606f
+########################################################################
+##\u89c4\u5219\u7ba1\u7406\u6a21\u5757\u56fd\u9645\u5316\u4fe1\u606f END
+########################################################################
+-10000=\u65E0\u6CD5\u8FDE\u63A5\u5230\u670D\u52A1\u5668\uFF0C\u8BF7\u68C0\u67E5\n1\:JacORB\u670D\u52A1\u662F\u5426\u6B63\u5E38\u542F\u52A8\uFF0C\n1\:\u4E3B\u670D\u52A1\u662F\u5426\u6B63\u5E38\u542F\u52A8\uFF0C\n1\:\u68C0\u67E5\u662F\u5426\u6709\u9632\u706B\u5899\u5BF9\u7A0B\u5E8F\u7AEF\u53E3\u8FDB\u884C\u4E86\u9650\u5236\uFF01
+-99999=\u6587\u4EF6\u7B2C{0}\u884C\u7B2C{1}\u5217\u683C\u5F0F\u9519\u8BEF\uFF0C\u8BF7\u5C06\u5176\u4FEE\u6539\u4E3A\u5B57\u7B26\u4E32\u7C7B\u578B\u3002
+
+100001=\u65E0\u6CD5\u83B7\u53D6\u767B\u5F55\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100002=\u65E0\u6CD5\u83B7\u53D6\u6846\u67B6\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100003=\u65E0\u6CD5\u83B7\u53D6CODE\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100004=\u65E0\u6CD5\u83B7\u53D6RM\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100005=\u65E0\u6CD5\u83B7\u53D6BOM\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100006=\u65E0\u6CD5\u83B7\u53D6workFlow\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100007=\u65E0\u6CD5\u83B7\u53D6simpleNews\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100008=\u65E0\u6CD5\u83B7\u53D6EquipmentService\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100009=\u65E0\u6CD5\u83B7\u53D6Bom\u96C6\u6210\u670D\u52A1\uFF0C\u8BF7\u91CD\u542F\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458.
+100010=\u65E0\u6CD5\u83B7\u53D6014\u96C6\u6210\u670D\u52A1\uFF0C\u8BF7\u91CD\u542F\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458.
+#############################################
+## \u6a21\u5757\u6743\u9650\u914d\u7f6e
+## \u7cfb\u7edf\u6a21\u5757\u6784\u5efa
+##
+#############################################
+#\u7cfb\u7edf\u6a21\u5757\u6784\u5efa
+#\u6a21\u5757\u663e\u793a\u4fe1\u606f
+rmip.framework.systemFunctionTree.systemFunctionModel = \u7BA1\u7406\u529F\u80FD\u6A21\u5757
+rmip.framework.systemFunctionTree.businessFunctionModel=\u4E1A\u52A1\u529F\u80FD\u6A21\u5757
+rmip.framework.systemFunctionTree.root = \u7CFB\u7EDF\u529F\u80FD\u6A21\u5757\u7BA1\u7406
+rmip.framework.systemFunctionTree.title = \u6A21\u5757\u7BA1\u7406
+
+rmip.framework.systemFunctionTree.modelManagment.isValid = \u662F\u5426\u6709\u6548
+rmip.framework.systemFunctionTree.modelManagment.modelName = \u6A21\u5757\u540D\:
+rmip.framework.systemFunctionTree.modelManagment.description = \u63CF\u8FF0\:
+rmip.framework.systemFunctionTree.modelManagment.addButton = \u589E\u52A0
+rmip.framework.systemFunctionTree.modelManagment.modifyButton = \u4FEE\u6539
+rmip.framework.systemFunctionTree.modelManagment.deleteButton = \u5220\u9664
+rmip.framework.systemFunctionTree.modelManagment.addOperationTypeButton = \u589E\u52A0\u64CD\u4F5C\u7C7B\u578B
+rmip.framework.systemFunctionTree.modelManagment.delNonSysBtn = \u5220\u9664\u975E\u7CFB\u7EDF\u6A21\u5757
+rmip.framework.systemFunctionTree.modelManagment.delBusiBtn = \u5220\u9664\u4E1A\u52A1\u6A21\u5757
+
+rmip.framework.systemFunctionTree.dialog.title = \u64CD\u4F5C\u7C7B\u578B\u5206\u7C7B
+rmip.framework.systemFunctionTree.dialog.type = \u64CD\u4F5C\u5206\u7C7B
+rmip.framework.systemFunctionTree.dialog.okButton = \u786E\u8BA4
+rmip.framework.systemFunctionTree.dialog.cancelButton = \u53D6\u6D88
+
+rmip.framework.systemFunctionTree.root.notSelect = \u8BF7\u9009\u62E9\u8282\u70B9\u8FDB\u884C\u64CD\u4F5C\!
+rmip.framework.systemFunctionTree.root.delete = \u6839\u8282\u70B9\u65E0\u6CD5\u5220\u9664\!
+rmip.framework.systemFunctionTree.modelName.duplicate = \u6A21\u5757\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\!
+rmip.framework.systemFunctionTree.model.delete = \u8BF7\u9009\u62E9\u6A21\u5757\u8282\u70B9\u8FDB\u884C\u5220\u9664\u64CD\u4F5C\!
+rmip.framework.systemFunctionTree.model.deleteQuery = \u4F60\u786E\u5B9A\u8981\u5220\u9664\u9009\u62E9\u7684\u6570\u636E\u548C\u5B50\u8282\u70B9\u6570\u636E\uFF0C\u4EE5\u53CA\u529F\u80FD\u6A21\u5757\u6388\u6743\u5417\uFF1F
+rmip.framework.systemFunctionTree.model.relation = \u6A21\u5757\u6216\u5B50\u6A21\u5757\u88AB\u5F15\u7528\uFF0C\u65E0\u6CD5\u5220\u9664\!
+rmip.framework.systemFunctionTree.modelNmae.isNull = \u6A21\u5757\u540D\u79F0\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\!
+rmip.framework.systemFunctionTree.modelNmae.lenght = \u6A21\u5757\u540D\u79F0\u957F\u5EA6\u8D85\u8FC7\u89C4\u5B9A\u8303\u56F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\!
+rmip.framework.systemFunctionTree.desc.lenght = \u63CF\u8FF0\u5927\u5C0F\u8D85\u8FC7\u89C4\u5B9A\u8303\u56F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\!
+rmip.framework.systemFunctionTree.model.modifyInfo = \u6A21\u5757\u4FE1\u606F\u4FEE\u6539\u6210\u529F\!
+rmip.framework.systemFunctionTree.model.operateTypeInfo = \u8BF7\u9009\u62E9\u64CD\u4F5C\u7C7B\u578B\u8FDB\u884C\u64CD\u4F5C\uFF01
+rmip.framework.systemFunctionTree.model.operateTypeRight = \u8BF7\u9009\u62E9\u6B63\u786E\u7684\u64CD\u4F5C\u7C7B\u578B\u8FDB\u884C\u64CD\u4F5C\uFF01
+rmip.framework.systemFunctionTree.cs.lenght = C/S\u529F\u80FD\u6A21\u5757\u8DEF\u5F84\u957F\u5EA6\u8D85\u8FC7\u89C4\u5B9A\u8303\u56F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.systemFunctionTree.cs.name = C/S\u529F\u80FD\u6A21\u5757\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A\uFF01
+rmip.framework.systemFunctionTree.notnet.lenght=.NET\u529F\u80FD\u6A21\u5757\u8DEF\u5F84\u957F\u5EA6\u8D85\u8FC7\u89C4\u5B9A\u8303\u56F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.systemFunctionTree.mobile.lenght=Mobile\u529F\u80FD\u6A21\u5757\u8DEF\u5F84\u957F\u5EA6\u8D85\u8FC7\u89C4\u5B9A\u8303\u56F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+
+#\u5f02\u5e38\u4fe1\u606f
+110000 = \u521B\u5EFA\u6A21\u5757\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110001 = \u68C0\u7D22\u6A21\u5757\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110002 = \u5220\u9664\u6A21\u5757\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110003 = \u66F4\u65B0\u6A21\u5757\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110004 = corba\u5BF9\u8C61\u548C\u5B9E\u4F53\u7C7B\u8F6C\u6362\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110005 = \u66F4\u65B0\u6A21\u5757\u6811\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110006 = \u5220\u9664\u975E\u7CFB\u7EDF\u6A21\u5757\u6216\u4E1A\u52A1\u6A21\u5757\u51FA\u9519\uFF01
+################################################################
+## Tab\u9875\u4fe1\u606f \u6743\u9650\u914d\u7f6e\u6a21\u5757
+#\u64cd\u4f5c\u7c7b\u578b
+rmip.framework.operateType.operateTypeModel.file=\u64CD\u4F5C\u7C7B\u578B\u7BA1\u7406
+rmip.framework.operateType.operateTypeLab.file=\u64CD\u4F5C\u7C7B\u578B
+rmip.framework.operateType.designationLab.file=\u540D\u79F0
+rmip.framework.operateType.typeLab.file=\u7C7B\u578B
+rmip.framework.operateType.identifyingLab.file=\u6807\u8BC6
+rmip.framework.operateType.describeLab.file=\u63CF\u8FF0
+rmip.framework.operateType.addButton.file=\u6DFB\u52A0
+rmip.framework.operateType.updateButton.file=\u4FEE\u6539
+rmip.framework.moudelConfig.file=\u7CFB\u7EDF\u6A21\u5757\u914D\u7F6E
+rmip.framework.operateType.delButton.file=\u5220\u9664
+rmip.framework.operateType.savesusses.message=\u6DFB\u52A0\u6210\u529F\!
+rmip.framework.operateType.savefail.message=\u6DFB\u52A0\u5931\u8D25\!
+rmip.framework.operateType.updatesusses.message=\u4FEE\u6539\u6210\u529F\!
+rmip.framework.operateType.updatefail.message=\u4FEE\u6539\u5931\u8D25\!
+rmip.framework.operateType.deletesusses.message=\u5220\u9664\u6210\u529F\!
+rmip.framework.operateType.deletefail.message=\u5220\u9664\u5931\u8D25\!
+rmip.framework.operateType.designationTextNotNull.message=\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\!
+rmip.framework.operateType.designationTextLength.message=\u540D\u79F0\u4E0D\u80FD\u592A\u957F\!
+rmip.framework.operateType.describeTextAreaLength.message=\u63CF\u8FF0\u4E0D\u80FD\u8D85\u8FC7255\u5B57\!
+rmip.framework.operateType.treeNode.message=\u8BF7\u9009\u62E9\u4E00\u4E2A\u8282\u70B9\!
+rmip.framework.operateType.nameIsExist.message=\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\!
+rmip.framework.operateType.operateTypeIsExist.message=\u64CD\u4F5C\u7C7B\u578B\u6B63\u5728\u88AB\u4F7F\u7528\u4E0D\u80FD\u5220\u9664\!
+rmip.framework.operateType.operateTypeIsExistNoChange.message=\u64CD\u4F5C\u7C7B\u578B\u6B63\u5728\u88AB\u4F7F\u7528\u4E0D\u80FD\u4FEE\u6539\!
+rmip.framework.operateType.operateTypeIsChoice.message=\u8BF7\u9009\u62E9\u64CD\u4F5C\u7C7B\u578B\!
+rmip.framework.operateType.modelIsChoice.message=\u8BF7\u9009\u62E9\u6A21\u5757\!
+rmip.framework.operateType.typeIsChoice.message=\u8BF7\u9009\u62E9\u7C7B\u578B\!
+rmip.framework.operateType.identifyingIsChoice.message=\u6807\u8BC6\u4E0D\u80FD\u4E3A\u7A7A\!
+rmip.framework.operateType.identifyingIsTooLong.message=\u6807\u8BC6\u5B57\u7B26\u4E0D\u80FD\u8D85\u8FC7128\u5B57\u7B26\uFF01
+rmip.framework.operateType.identifyingIsExist.message=\u6807\u8BC6\u5DF2\u7ECF\u5B58\u5728\!
+rmip.framework.operateType.aliasTextNotNull.message=\u522B\u540D\u4E0D\u80FD\u4E3A\u7A7A\!
+rmip.framework.operateType.aliasTextLength.message=\u522B\u540D\u7684\u5B57\u7B26\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7128\u5B57\u7B26\uFF01
+rmip.framework.sysConfNode.sysConfModel=\u7CFB\u7EDF\u914D\u7F6E\u9879\u7BA1\u7406
+rmip.framework.sysConfNode.sysConfClsfModel=\u914D\u7F6E\u5206\u7C7B\u7BA1\u7406
+rmip.framework.sysConfNode.sysMonitor=\u7CFB\u7EDF\u8FD0\u884C\u76D1\u63A7
+
+#\u5f02\u5e38\u4fe1\u606f
+110100 = \u521B\u5EFA\u64CD\u4F5C\u7C7B\u578B\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110101 = \u68C0\u7D22\u64CD\u4F5C\u7C7B\u578B\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110102 = \u5220\u9664\u64CD\u4F5C\u7C7B\u578B\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110103 = \u66F4\u65B0\u64CD\u4F5C\u7C7B\u578B\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110104 = \u68C0\u7D22\u5E94\u7528\u6570\u636E\u64CD\u4F5C\u8868\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110105 = \u68C0\u7D22\u64CD\u4F5C\u7C7B\u578B\u6811\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110106 = \u68C0\u7D22\u64CD\u4F5C\u7C7B\u578B\u6811\u8282\u70B9\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110107 = \u68C0\u7D22\u529F\u80FD\u5E94\u7528\u8868\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+#\u7279\u6b8a\u6570\u636e\u5bf9\u8c61
+rmip.framework.specialData.specialDataModel.file=\u7279\u6B8A\u6570\u636E\u7BA1\u7406
+rmip.framework.specialData.specialDataLab.file=\u6570\u636E\u5BF9\u8C61
+rmip.framework.specialData.designationLab.file=\u540D\u79F0
+rmip.framework.specialData.modelLab.file=\u6A21\u5757
+rmip.framework.specialData.describe.file=\u63CF\u8FF0
+rmip.framework.specialData.operateTypeLab.file=\u64CD\u4F5C\u7C7B\u578B(*\u8BF7\u6309\u4F4FCtrl\u8FDB\u884C\u591A\u9009)
+rmip.framework.specialData.addButton.file=\u6DFB\u52A0
+rmip.framework.specialData.updateButton.file=\u4FEE\u6539
+rmip.framework.specialData.delButton.file=\u5220\u9664
+rmip.framework.workFlowNode.workFlowModelfile=\u6D41\u7A0B\u914D\u7F6E\u7BA1\u7406
+#\u6d41\u7a0b\u914d\u7f6e
+com.vci.rmip.framework.client.rightConfig.workflow.WorkFlowConfPanel.deleteConfirmMessage = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u6570\u636E\u5417\uFF1F\u5220\u9664\u540E\u7684\u6570\u636E\u4E0D\u53EF\u6062\u590D\uFF01
+com.vci.rmip.framework.client.rightConfig.workflow.AssignProcessDialog.selectProcess = \u9009\u62E9\u6D41\u7A0B\u6A21\u677F
+com.vci.rmip.framework.client.rightConfig.workflow.AssignProcessDialog.btnOk = \u786E\u5B9A
+com.vci.rmip.framework.client.rightConfig.workflow.AssignProcessDialog.btnCancel = \u53D6\u6D88
+com.vci.rmip.framework.client.rightConfig.workflow.AssignProcessDialog.treeRootNodeName = \u6D41\u7A0B\u6A21\u677F
+com.vci.rmip.framework.client.rightConfig.workflow.AssignProcessDialog.plsSelectProcessDefinition = \u8BF7\u9009\u62E9\u6D41\u7A0B\u6A21\u677F\uFF01
+#\u4eba\u5458\u7ec4\u7ec7\u7ba1\u7406\u6807\u7b7e
+rmip.framework.menu.staffOrgManage=\u4EBA\u5458\u7EC4\u7EC7\u7BA1\u7406
+
+#\u5f02\u5e38\u4fe1\u606f
+110200 = \u521B\u5EFA\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110201 = \u68C0\u7D22\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110202 = \u5220\u9664\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110203 = \u66F4\u65B0\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110204 = \u68C0\u7D22\u5E94\u7528\u6570\u636E\u64CD\u4F5C\u8868\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110205 = \u68C0\u7D22\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u6811\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110206 = \u68C0\u7D22\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u6811\u8282\u70B9\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110207 = \u68C0\u7D22\u529F\u80FD\u5E94\u7528\u8868\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110208 = \u68C0\u7D22\u64CD\u4F5C\u7C7B\u578B\u5217\u8868\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110209 = \u4FDD\u5B58\u5E94\u7528\u6570\u636E\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110211 = \u66F4\u65B0\u5E94\u7528\u6570\u636E\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110212 = \u5220\u9664\u5E94\u7528\u6570\u636E\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+rmip.stafforg.menu.staffOrg=\u4EBA\u5458\u7EC4\u7EC7
+rmip.stafforg.menu.department=\u90E8\u95E8
+rmip.stafforg.menu.group=\u7EC4
+rmip.stafforg.menu.role=\u89D2\u8272
+rmip.stafforg.menu.staff=\u6210\u5458
+rmip.stafforg.menu.name1=\u3010\u603B\u6570\uFF1A
+rmip.stafforg.menu.name2=\u3011
+rmip.stafforg.logal.name=\u540D\u79F0\uFF1A
+rmip.stafforg.logal.num=\u7F16\u53F7\uFF1A
+rmip.stafforg.logal.desc=\u63CF\u8FF0\uFF1A
+rmip.stafforg.logal.username=\u8D26\u53F7\uFF1A
+rmip.stafforg.logal.security=\u5BC6\u7EA7\uFF1A
+rmip.stafforg.logal.password=\u5BC6\u7801\uFF1A
+rmip.stafforg.logal.confpassword=\u786E\u8BA4\u5BC6\u7801\uFF1A
+rmip.stafforg.logal.department=\u90E8\u95E8\uFF1A
+rmip.stafforg.logal.firstname=\u59D3\u540D\uFF1A
+rmip.stafforg.logal.lastname=\u540D\u5B57\uFF1A
+rmip.stafforg.logal.empno=\u7F16\u53F7\uFF1A
+rmip.stafforg.logal.duty=\u804C\u52A1\uFF1A
+rmip.stafforg.logal.email=\u7535\u5B50\u90AE\u4EF6\uFF1A
+rmip.stafforg.logal.businessTel=\u5546\u52A1\u7535\u8BDD\uFF1A
+rmip.stafforg.logal.homephone=\u5BB6\u5EAD\u7535\u8BDD\uFF1A
+rmip.stafforg.logal.mobelphone=\u79FB\u52A8\u7535\u8BDD\uFF1A
+rmip.stafforg.logal.businessfax=\u5546\u52A1\u4F20\u771F\uFF1A
+rmip.stafforg.logal.rolelist=\u73B0\u6709\u89D2\u8272\:
+rmip.stafforg.logal.choosedrolelist=\u62E5\u6709\u89D2\u8272\:
+rmip.stafforg.logal.grouplist=\u73B0\u6709\u7EC4\:
+rmip.stafforg.logal.choosedgrouplist=\u6240\u5C5E\u7EC4\:
+rmip.stafforg.logal.roling=\u5206\u914D\u89D2\u8272
+rmip.stafforg.logal.grouping=\u5206\u914D\u7EC4\u7EC7
+rmip.stafforg.operate.add=\u589E\u52A0
+rmip.stafforg.operate.modify=\u4FEE\u6539
+rmip.stafforg.operate.delete=\u5220\u9664
+rmip.stafforg.operate.syn=\u540C\u6B65
+rmip.stafforg.operate.grouping=\u5206\u914D\u7EC4\u7EC7
+rmip.stafforg.operate.roling=\u5206\u914D\u89D2\u8272
+rmip.stafforg.operate.conform=\u786E\u5B9A
+rmip.stafforg.operate.cancel=\u53D6\u6D88
+rmip.stafforg.operate.toselectgroup=\u8BF7\u9009\u62E9\u8981\u589E\u52A0\u7684\u7EC4\uFF01
+rmip.stafforg.operate.toreselectgroup=\u8981\u589E\u52A0\u7684\u7EC4\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.toremovegroup=\u8BF7\u9009\u62E9\u8981\u79FB\u9664\u7684\u7EC4\uFF01
+rmip.stafforg.operate.toselectrole=\u8BF7\u9009\u62E9\u8981\u589E\u52A0\u7684\u89D2\u8272\uFF01
+rmip.stafforg.operate.toreselectrole=\u8981\u589E\u52A0\u7684\u89D2\u8272\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.toremoverole=\u8BF7\u9009\u62E9\u8981\u79FB\u9664\u7684\u89D2\u8272\uFF01
+rmip.stafforg.operate.toadddeptname=\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\uFF01
+rmip.stafforg.operate.nameerror=\u540D\u79F0\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.descerror=\u63CF\u8FF0\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E255\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.deptnameerror=\u90E8\u95E8\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.numtoolong=\u7F16\u53F7\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E64\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\!
+rmip.stafforg.operate.rolenameerror=\u89D2\u8272\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.groupnameerror=\u7EC4\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.updateok=\u4FEE\u6539\u6210\u529F\uFF01
+rmip.stafforg.operate.toselectdel=\u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u8282\u70B9\uFF01
+rmip.stafforg.operate.syndeptselect=\u8BF7\u9009\u4E2D\u8981\u540C\u6B65\u7684\u90E8\u95E8\uFF01
+rmip.stafforg.operate.syndept.selectone=\u53EA\u80FD\u9009\u62E9\u4E00\u4E2A\u90E8\u95E8\u8282\u70B9\u8FDB\u884C\u540C\u6B65\uFF01
+rmip.stafforg.operate.syndept.success=\u90E8\u95E8\u540C\u6B65\u6210\u529F\uFF01
+rmip.stafforg.operate.toreselectdeldept=\u9009\u62E9\u5220\u9664\u7684\u8282\u70B9\u5305\u62EC\u975E\u90E8\u95E8\u8282\u70B9\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.toshowdeldepterror1=\u9009\u62E9\u5220\u9664\u7684\u90E8\u95E8\u8282\u70B9\u4E2D
+rmip.stafforg.operate.toshowdeleteerror=\u88AB\u7528\u6237
+rmip.stafforg.operate.toshowdeleteerror1=\u5F15\u7528\uFF0C\u8BF7\u89E3\u9664\u5173\u7CFB\u540E\u518D\u8FDB\u884C\u5220\u9664\u64CD\u4F5C\uFF01
+rmip.stafforg.operate.conformdeldept=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u90E8\u95E8\u5417\uFF1F
+rmip.stafforg.operate.toreselectdelgroup=\u9009\u62E9\u5220\u9664\u7684\u8282\u70B9\u5305\u62EC\u975E\u7EC4\u8282\u70B9\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.conformdelgroup=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u7EC4\u8282\u70B9\u5417\uFF1F
+rmip.stafforg.operate.toshowdelgrouperror1=\u9009\u62E9\u5220\u9664\u7684\u7EC4\u8282\u70B9\u4E2D
+rmip.stafforg.operate.toreselectdelrole=\u9009\u62E9\u5220\u9664\u7684\u8282\u70B9\u4E2D\u5305\u62EC\u975E\u89D2\u8272\u51E0\u70B9\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.conformdelrole=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u89D2\u8272\u5417\uFF1F
+rmip.stafforg.operate.toshowdelroleerror1=\u9009\u62E9\u5220\u9664\u7684\u89D2\u8272\u8282\u70B9\u4E2D
+rmip.stafforg.operate.toshowdelusererror=\u9009\u62E9\u5220\u9664\u7684\u8282\u70B9\u5305\u62EC\u975E\u7528\u6237\u8282\u70B9\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.conformdeluser=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u6210\u5458\u5417\uFF1F
+rmip.stafforg.operate.usernameerror1=\u7528\u6237\u540D\uFF1Aadmin\u662F\u4FDD\u7559\u7528\u6237\uFF0C\u8BF7\u6539\u6210\u5176\u5B83\u540D\u79F0\uFF01
+rmip.stafforg.operate.usernameerror2=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\uFF01
+rmip.stafforg.operate.usernameerror3=\u7528\u6237\u540D\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.usernameerror4=\u7528\u6237\u540D\u53EA\u80FD\u4E3A\u6570\u5B57\u5B57\u6BCD\u6216\u8005\u4E0B\u5212\u7EBF\uFF01
+rmip.stafforg.operate.usernameerror5=\u7528\u6237\u540D\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.pwderror1=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\uFF01
+rmip.stafforg.operate.conformpwderror=\u786E\u8BA4\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\uFF01
+rmip.stafforg.operate.pwderror2=\u5BC6\u7801\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.pwderror3=\u5BC6\u7801\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.pwderror4=\u5BC6\u7801\u53EA\u80FD\u4E3A\u6570\u5B57\u5B57\u6BCD\u6216\u8005\u4E0B\u5212\u7EBF\uFF01
+rmip.stafforg.operate.firstnameerror=\u59D3\u6C0F\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC764\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.firstnameerror1=\u6210\u5458\u7684\u59D3\u6C0F\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u8F93\u5165\uFF01
+rmip.stafforg.operate.lastnameerror=\u540D\u5B57\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC764\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.lastnameerror1=\u6210\u5458\u7684\u540D\u5B57\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u8F93\u5165\uFF01
+rmip.stafforg.operate.dutyerror=\u804C\u52A1\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.emailerror=\u7535\u5B50\u90AE\u4EF6\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199
+rmip.stafforg.operate.emailerror1=\u7535\u5B50\u90AE\u4EF6\u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.telerror=\u6240\u6709\u7535\u8BDD\u957F\u5EA6\u90FD\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC764\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u68C0\u67E5\u5E76\u4FEE\u6539\uFF01
+rmip.stafforg.operate.businessfaxerror=\u5546\u52A1\u4F20\u771F\u957F\u5EA6\u90FD\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC764\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.businessfaxerror1=\u5546\u52A1\u4F20\u771F\u53EA\u80FD\u4E3A\u6570\u5B57\u4E0E'-'\u7684\u7EC4\u5408\uFF01
+rmip.stafforg.operate.homephoneerror=\u5BB6\u5EAD\u7535\u8BDD\u53EA\u80FD\u4E3A\u6570\u5B57\u4E0E'-'\u7684\u7EC4\u5408\uFF01
+rmip.stafforg.operate.businesstelerror=\u5546\u52A1\u7535\u8BDD\u53EA\u80FD\u4E3A\u6570\u5B57\u4E0E'-'\u7684\u7EC4\u5408\uFF01
+rmip.stafforg.operate.mobelerror=\u79FB\u52A8\u7535\u8BDD\u53EA\u80FD\u4E3A\u6570\u5B57\u4E0E'-'\u7684\u7EC4\u5408\uFF01
+rmip.stafforg.operate.loginerror=\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF\uFF01\n\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.stafforg.operate.empnonull=\u7F16\u53F7\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\uFF01
+rmip.stafforg.operate.empnotoolong=\u7F16\u53F7\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.empnorepeat=\u7F16\u53F7\u91CD\u590D\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.deptIdnull=\u90E8\u95E8\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u82E5\u7CFB\u7EDF\u4E2D\u6CA1\u6709\u90E8\u95E8\uFF0C\u8BF7\u5148\u521B\u5EFA\u90E8\u95E8\uFF01
+rmip.stafforg.operate.numcannotchange=\u8BE5\u90E8\u95E8\u5DF2\u7ECF\u88AB\u540C\u6B65\uFF0C\u4E0D\u80FD\u5BF9\u5176\u7F16\u53F7\u8FDB\u884C\u4FEE\u6539\uFF01
+rmip.stafforg.operate.usercreateok=\u7528\u6237\u6210\u529F\u6DFB\u52A0\u5230\u7CFB\u7EDF\uFF01
+rmip.stafforg.operate.useredit1=\u8BF7\u94A9\u9009\u8981\u8FDB\u884C\u4FEE\u6539\u7684\u6210\u5458\!
+rmip.stafforg.operate.useredit2=\u4E00\u6B21\u53EA\u80FD\u5BF9\u4E00\u4E2A\u6210\u5458\u8FDB\u884C\u4FEE\u6539\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\!
+rmip.stafforg.operate.userdelete1=\u8BF7\u94A9\u9009\u8981\u5220\u9664\u7684\u6210\u5458\!
+rmip.stafforg.operate.userdelete2=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u6240\u9009\u62E9\u7684\u6210\u5458\u5417?
+rmip.stafforg.operate.deptedit1=\u8BF7\u94A9\u9009\u8981\u8FDB\u884C\u4FEE\u6539\u7684\u5BF9\u8C61\!
+rmip.stafforg.operate.deptedit2=\u4E00\u6B21\u53EA\u80FD\u5BF9\u4E00\u4E2A\u5BF9\u8C61\u8FDB\u884C\u4FEE\u6539\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\!
+rmip.stafforg.operate.deptdelete1=\u8BF7\u94A9\u9009\u8981\u5220\u9664\u7684\u5BF9\u8C61\!
+rmip.stafforg.operate.deptdelete2=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u6240\u9009\u62E9\u7684\u5BF9\u8C61\u5417?
+rmip.stafforg.operate.pwdgroupdelete=\u786E\u5B9A\u8981\u5220\u9664\u6240\u9009\u62E9\u7684\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u5417?
+rmip.stafforg.operate.deptselect=\u60A8\u8981\u5220\u9664\u7684\u6D41\u7A0B\u6A21\u677F\u5DF2\u7ECF\u88AB\u5F15\u7528\uFF0C\u8BF7\u5148\u89E3\u9664\u5173\u7CFB\uFF0C\u5728\u8FDB\u884C\u5220\u9664\u64CD\u4F5C\uFF01
+
+## Tab\u9875 \u4eba\u5458\u7ec4\u7ec7\u5f02\u5e38\u4fe1\u606f
+120101=\u83B7\u53D6\u6240\u6709\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120102=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u6240\u6709\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120103=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u9876\u7EA7\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120104=\u83B7\u53D6\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120105=\u83B7\u53D6\u9876\u7EA7\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120106=\u83B7\u53D6\u90E8\u95E8\u4E0B\u7684\u5B50\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120107=\u83B7\u53D6\u90E8\u95E8\u53CA\u5176\u5B50\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120108=\u5220\u9664\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120109=\u589E\u52A0\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120110=\u4FEE\u6539\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120111=\u4FEE\u6539\u4EBA\u5458\u4E0E\u90E8\u95E8\u5173\u7CFB\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u4E0E\u7BA1\u7406\u5458\u8054\u7CFB\!
+120201=\u83B7\u53D6\u516C\u53F8\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120202=\u83B7\u53D6\u9876\u7EA7\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120203=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u9876\u7EA7\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120204=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120205=\u83B7\u53D6\u7EC4\u4E0B\u7684\u5B50\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120206=\u83B7\u53D6\u7EC4\u53CA\u5176\u5B50\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120207=\u5220\u9664\u516C\u53F8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120208=\u589E\u52A0\u516C\u53F8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120209=\u4FEE\u6539\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120301=\u83B7\u53D6\u6240\u6709\u89D2\u8272\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120302=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u89D2\u8272\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120303=\u5220\u9664\u89D2\u8272\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120304=\u589E\u52A0\u89D2\u8272\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120305=\u4FEE\u6539\u89D2\u8272\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120306=\u4FDD\u5B58\u4EBA\u5458\u4E0E\u89D2\u8272\u7684\u5173\u7CFB\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\!
+120307=\u9A8C\u8BC1\u89D2\u8272\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u4E0E\u7BA1\u7406\u5458\u8054\u7CFB\!
+120308=\u6839\u636E\u7528\u6237\u540D\u83B7\u53D6\u5173\u8054\u89D2\u8272\u603B\u6570\u65F6\u53D1\u751F\u9519\u8BEF\uFF0C\u8BF7\u4E0E\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120401=\u83B7\u53D6\u4EBA\u5458\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120402=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u6240\u6709\u6210\u5458\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120403=\u5220\u9664\u4EBA\u5458\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120404=\u589E\u52A0\u4EBA\u5458\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120405=\u4FEE\u6539\u4EBA\u5458\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120406=\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120407=\u767B\u5F55\u65F6\u83B7\u53D6\u7528\u6237\u767B\u5F55\u4FE1\u606F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120408=\u90E8\u95E8\u540C\u6B65\u65F6\u51FA\u9519\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120409=\u66F4\u65B0\u90E8\u95E8\u540C\u6B65\u72B6\u6001\u65F6\u51FA\u9519\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120410=\u90E8\u95E8\u5DF2\u7ECF\u540C\u6B65\u5B8C\u6210\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\u8981\u540C\u6B65\u7684\u90E8\u95E8\uFF01
+120411=\u6839\u636E\u90E8\u95E8\u83B7\u53D6\u5BF9\u5E94\u7684\u4EBA\u5458\u4FE1\u606F\u65F6\u51FA\u9519\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120412=\u5728\u8FDB\u884C\u505C\u7528/\u542F\u7528\u64CD\u4F5C\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u67E5\u770B\!
+120413=\u6839\u636E\u6761\u4EF6\u83B7\u53D6\u4EBA\u5458\u603B\u6570\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+120414=\u5E73\u53F0\u5BA2\u6237\u7AEF\u53EA\u5141\u8BB8\u7BA1\u7406\u5458\u767B\u5F55\uFF01
+
+120501=\u83B7\u53D6\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120502=\u6DFB\u52A0\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120503=\u66F4\u65B0\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120504=\u5220\u9664\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120505=\u83B7\u53D6\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u53D6\u503C\u8303\u56F4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120506=\u6DFB\u52A0\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u53D6\u503C\u8303\u56F4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120507=\u6DFB\u52A0\u7684\u53D6\u503C\u8303\u56F4\u503C\u5728\u8BE5\u7EC4\u5408\u65B9\u5F0F\u4E0B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u6DFB\u52A0\u5931\u8D25\uFF01
+120508=\u66F4\u65B0\u5BC6\u7801\u7EC4\u5408\u53D6\u503C\u8303\u56F4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120509=\u5220\u9664\u5BC6\u7801\u7EC4\u5408\u53D6\u503C\u8303\u56F4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120510=\u66F4\u65B0\u7279\u6B8A\u5B57\u7B26\u7684\u53D6\u503C\u5728\u8BE5\u5206\u7C7B\u4E0B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u6DFB\u52A0\u5931\u8D25\uFF01
+120601=\u8BFB\u53D6\u7528\u6237\u6743\u9650\u51FA\u9519\uFF01
+120701=\u8BFB\u53D6\u6240\u6709\u5B50\u6A21\u5757\u4FE1\u606F\u51FA\u9519\uFF01
+
+
+#################################################
+####\u65e5\u5fd7\u7ba1\u7406
+#################################################
+rmip.framework.log.adminLog=\u7BA1\u7406\u5458\u65E5\u5FD7
+rmip.framework.log.userLog=\u666E\u901A\u7528\u6237\u65E5\u5FD7
+rmip.framework.log.startDate=\u67E5\u8BE2\u65E5\u671F\uFF1A\u7531
+rmip.framework.log.to=\u5230
+rmip.framework.log.operateType=\u64CD\u4F5C\u7C7B\u578B
+rmip.framework.log.create=\u521B\u5EFA
+rmip.framework.log.update=\u4FEE\u6539
+rmip.framework.log.delete=\u5220\u9664
+rmip.framework.log.operateUser=\u64CD\u4F5C\u7528\u6237\uFF1A
+rmip.framework.log.savePeriod=\u4FDD\u5B58\u671F\u9650\uFF1A
+rmip.framework.log.backupPeriod=\u5907\u4EFD\u671F\u9650\uFF1A
+rmip.framework.log.save=\u4FDD\u5B58
+rmip.framework.log.selectDate=\u8BF7\u9009\u62E9\u65E5\u671F\uFF1A
+rmip.framework.log.firstPage=\u9996\u9875
+rmip.framework.log.prePage=\u4E0A\u4E00\u9875
+rmip.framework.log.nextPage=\u4E0B\u4E00\u9875
+rmip.framework.log.lastPage=\u5C3E\u9875
+rmip.framework.log.query=\u67E5\u8BE2
+rmip.framework.log.export=\u5BFC\u51FA
+rmip.framework.log.logDelete=\u65E5\u5FD7\u5220\u9664
+rmip.framework.log.logBackup=\u65E5\u5FD7\u5907\u4EFD
+rmip.framework.log.date=\u65F6\u95F4
+rmip.framework.log.user=\u7528\u6237
+rmip.framework.log.userIp=\u7528\u6237IP
+rmip.framework.log.operateObj=\u64CD\u4F5C\u5BF9\u8C61
+rmip.framework.log.operateModule=\u64CD\u4F5C\u6A21\u5757
+rmip.framework.log.objID=\u5BF9\u8C61ID
+rmip.framework.log.objDesc=\u63CF\u8FF0
+rmip.framework.log.objAttr=\u5BF9\u8C61\u5C5E\u6027
+rmip.framework.log.previousValue=\u64CD\u4F5C\u524D\u7684\u503C
+rmip.framework.log.newValue=\u64CD\u4F5C\u540E\u7684\u503C
+rmip.framework.log.pageSizeAlert=\u83B7\u53D6\u9875\u9762\u663E\u793A\u6761\u6570\u914D\u7F6E\u51FA\u9519\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\uFF0C\u6B64\u5904\u9ED8\u8BA4\u66F4\u6539\u9875\u9762\u663E\u793A\u6761\u6570\u4E3A10\uFF01
+rmip.framework.log.pageInfo1=\u603B\u5171\u6709
+rmip.framework.log.pageInfo2=\u6761\u8BB0\u5F55,\u5171
+rmip.framework.log.pageInfo3=\u9875,\u5F53\u524D\u4E3A\u7B2C
+rmip.framework.log.pageInfo4=\u9875
+rmip.framework.log.savePeriodAlert=\u4FDD\u5B58\u671F\u9650\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u9009\u62E9\uFF01
+rmip.framework.log.saveSuccess=\u4FDD\u5B58\u6210\u529F
+rmip.framework.log.exportSuccess=\u5BFC\u51FA\u6210\u529F
+rmip.framework.log.deleteDateAlert=\u8BF7\u9009\u62E9\u5220\u9664\u65E5\u671F\uFF01
+rmip.framework.log.deleteLogConfirm=\u5C06\u5220\u9664\u6240\u9009\u65E5\u671F\u4E4B\u524D\u7684\u65E5\u5FD7\uFF0C\u786E\u8BA4\u6267\u884C\u5220\u9664\uFF1F
+rmip.framework.log.deleteSuccess=\u5220\u9664\u6210\u529F
+rmip.framework.log.backupPeriodAlert=\u5907\u4EFD\u671F\u9650\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u9009\u62E9\uFF01
+rmip.framework.log.exportPath=\u5BFC\u51FA\u4F4D\u7F6E
+rmip.framework.log.exportFile=\u5BFC\u51FA\u6587\u4EF6
+rmip.framework.log.exportFile.fail=\u6CA1\u6709\u8981\u5230\u51FA\u7684\u6570\u636E\uFF01
+140101=\u83B7\u53D6\u65E5\u5FD7\u5220\u9664\u914D\u7F6E\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140102=\u83B7\u53D6\u65E5\u5FD7\u914D\u7F6E\u671F\u9650\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140103=\u83B7\u53D6\u65E5\u5FD7\u9875\u9762\u663E\u793A\u6761\u6570\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140104=\u83B7\u53D6\u672C\u6B21\u67E5\u8BE2\u65E5\u5FD7\u603B\u6570\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140105=\u67E5\u8BE2\u65E5\u5FD7\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140106=\u4FDD\u5B58\u671F\u9650\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140107=\u83B7\u53D6\u671F\u9650\u6570\u503C\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140108=\u5220\u9664\u65E5\u5FD7\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140109=\u8BB0\u5F55\u65E5\u5FD7\u51FA\u9519\uFF0C\u767B\u5F55\u4FE1\u606F\u53EF\u80FD\u4E3A\u7A7A\!
+
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.logDelete=\u65E5\u5FD7\u5220\u9664\uFF1A
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.autoDelete=\u81EA\u52A8\u5220\u9664
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.manualDelete=\u624B\u52A8\u5220\u9664
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.savePeriod=\u4FDD\u5B58\u671F\u9650\uFF1A
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.saveBtn=\u4FDD\u5B58
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.logBasicConf=\u65E5\u5FD7\u57FA\u7840\u914D\u7F6E
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.deleteDateAlert=\u8BF7\u9009\u62E9\u5220\u9664\u65E5\u671F\uFF01
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.deleteLogConfirm=\u5C06\u5220\u9664\u6240\u9009\u65E5\u671F\u4E4B\u524D\u7684\u65E5\u5FD7\uFF0C\u786E\u8BA4\u6267\u884C\u5220\u9664\uFF1F
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.deleteSuccess=\u5220\u9664\u6210\u529F
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.savePeriodAlert=\u4FDD\u5B58\u671F\u9650\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u9009\u62E9\uFF01
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.saveSuccess=\u4FDD\u5B58\u6210\u529F
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.selectDate=\u8BF7\u9009\u62E9\u65E5\u671F\uFF1A
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.delete=\u5220\u9664
+##########################################################################
+
+#############################################
+## \u6a21\u5757\u6743\u9650\u5206\u914d
+##
+##
+#############################################
+rmip.framework.rightdistribution.title.name = \u6743\u9650\u5206\u914D
+rmip.framework.rightdistribution.file = \u6743\u9650\u5206\u914D\u7BA1\u7406
+#\u6570\u636e\u6388\u6743
+rmip.framework.rightdistribution.datadistribute.name = \u6570\u636E\u6388\u6743
+rmip.framework.rightdistribution.datadistribute.title.name = \u540D\u79F0\uFF1A
+rmip.framework.rightdistribution.datadistribute.title.desc = \u63CF\u8FF0\uFF1A
+rmip.framework.rightdistribution.datadistribute.title.policyname = \u7B56\u7565\u57FA\u672C\u4FE1\u606F
+rmip.framework.rightdistribution.datadistribute.btnSubmit.name = \u63D0\u4EA4
+rmip.framework.rightdistribution.datadistribute.btnDeletePolicy.name = \u5220\u9664\u7B56\u7565\u5BF9\u8C61
+rmip.framework.rightdistribution.datadistribute.policyconf.name = \u7B56\u7565\u6743\u9650\u914D\u7F6E
+
+rmip.framework.rightdistribution.datadistribute.create.name = \u521B\u5EFA\u8005
+rmip.framework.rightdistribution.datadistribute.role.name = \u540C\u89D2\u8272\u7528\u6237
+rmip.framework.rightdistribution.datadistribute.normal.name = \u666E\u901A\u7528\u6237
+rmip.framework.rightdistribution.datadistribute.admin.name = \u7BA1\u7406\u5458
+
+rmip.framework.rightdistribution.datadistribute.table.checkbox = \u9009\u62E9
+rmip.framework.rightdistribution.datadistribute.table.name = \u89D2\u8272
+
+rmip.framework.rightdistribution.datadistribute.input.check.name.null = \u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF01
+rmip.framework.rightdistribution.datadistribute.input.check.name.length = \u540D\u79F0\u957F\u5EA6\u592A\u957F\uFF01
+rmip.framework.rightdistribution.datadistribute.input.check.desc.length = \u63CF\u8FF0\u957F\u5EA6\u592A\u957F\uFF01
+
+rmip.framework.rightdistribution.savepolicy.success = \u64CD\u4F5C\u6210\u529F\!
+rmip.framework.rightdistribution.savepolicy.error = \u64CD\u4F5C\u7684\u8FC7\u7A0B\u4E2D\u51FA\u73B0\u9519\u8BEF\!
+rmip.framework.rightdistribution.datadistribute.delete.policydata = \u8BF7\u5148\u9009\u62E9\u8981\u5220\u9664\u7684\u6570\u636E\!
+rmip.framework.rightdistribution.datadistribute.delete.query = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u6240\u9009\u62E9\u7684\u6570\u636E\u5417?(\u6CE8\u610F\:\u5220\u9664\u540E\u4E0D\u53EF\u6062\u590D,\u786E\u5B9A\u8981\u5220\u9664?)
+rmip.framework.rightdistribution.data = \u6CA1\u6709\u6570\u636E\u9879,\u4E0D\u80FD\u63D0\u4EA4\!
+rmip.framework.rightdistribution.delete.selectnode = \u8BF7\u9009\u4E2D\u8282\u70B9\u5220\u9664\uFF01
+rmip.framework.rightdistribution.delete.fail = \u5220\u9664\u6570\u636E\u7B56\u7565\u5931\u8D25\uFF01
+rmip.framework.rightdistribution.strategyconf.isnull = \u6570\u636E\u7B56\u7565\u914D\u7F6E\u4E3A\u7A7A\uFF0C\u4E0D\u5141\u8BB8\u63D0\u4EA4\uFF01
+rmip.framework.rightdistribution.datastrategy.name = \u7B56\u7565\u540D\u79F0\u91CD\u590D\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+#\u5f02\u5e38\u4fe1\u606f
+130000 = \u7B56\u7565\u914D\u7F6E\u5931\u8D25\uFF01
+130001 = \u83B7\u53D6\u7B56\u7565\u6570\u636E\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+130002 = \u83B7\u53D6\u6570\u636E\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+130003 = \u5220\u9664\u6570\u636E\u7B56\u7565\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+130004 = \u540C\u4E00\u4E2A\u89D2\u8272\u7528\u6237\uFF0C\u4E0D\u80FD\u6388\u6743\u591A\u6B21\uFF01
+
+#\u6a21\u5757\u6743\u9650\u914d\u7f6e
+rmip.framework.rightdistribution.moduleRight.name = \u6A21\u5757\u6743\u9650\u914D\u7F6E
+rmip.framework.rightdistribution.moduleRight.moduleTree = \u529F\u80FD\u6A21\u5757
+rmip.framework.rightdistribution.moduleRight.RoleList = \u89D2\u8272
+rmip.framework.rightdistribution.moduleRight.addButton.file=\u6388\u6743
+rmip.framework.rightdistribution.moduleRight.updateButton.file=\u4FEE\u6539
+rmip.framework.rightdistribution.moduleRight.delButton.file=\u91CD\u7F6E
+rmip.framework.rightdistribution.moduleRight.removeButton.file=\u79FB\u9664\u6743\u9650
+rmip.framework.rightdistribution.moduleRight.clearButton.file=\u6E05\u7A7A\u6743\u9650
+rmip.framework.rightdistribution.moduleRight.roleListNotNull.message=\u8BF7\u9009\u62E9\u4E00\u4E2A\u89D2\u8272\uFF01
+rmip.framework.rightdistribution.moduleRight.changes.message=\u60A8\u8FD8\u6CA1\u6709\u4FDD\u5B58\uFF0C\u786E\u5B9A\u653E\u5F03\u5F53\u524D\u64CD\u4F5C\u5417\uFF1F
+#----\u8865\u5145\u6dfb\u52a0\u6388\u6743\u529f\u80fd
+rmip.framework.rightdistribution.moduleRight.reAddButton.file=\u589E\u52A0\u6388\u6743
+rmip.framework.rightdistribution.moduleRight.lookButton.file=\u67E5\u770B\u6388\u6743
+
+#\u5f02\u5e38\u4fe1\u606f
+130100 = \u4FDD\u5B58\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+130101 = \u68C0\u7D22\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+
+#\u7279\u6b8a\u6570\u636e\u6388\u6743 \u9875\u9762\u663e\u793a\u4fe1\u606f
+rmip.framework.rightdistribution.specialdatadistribute.name=\u7279\u6B8A\u6570\u636E\u6388\u6743
+rmip.framework.rightdistribution.specialdatadistribute.add=\u52A0\u4E00\u884C
+rmip.framework.rightdistribution.specialdatadistribute.submit=\u63D0\u4EA4
+rmip.framework.rightdistribution.specialdatadistribute.delete=\u51CF\u4E00\u884C
+rmip.framework.rightdistribution.specialdatadistribute.ok=\u64CD\u4F5C\u6210\u529F\uFF01
+rmip.framework.rightdistribution.specialdatadistribute.remove=\u8BF7\u9009\u62E9\u8981\u79FB\u9664\u7684\u9879\uFF01
+rmip.framework.rightdistribution.specialdatadistribute.conformremove=\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u6570\u636E\u5417?\n\u5220\u9664\u540E\u4E0D\u53EF\u6062\u590D,\u786E\u5B9A?
+rmip.framework.rightdistribution.specialdatadistribute.redeploy=\u8981\u63D0\u4EA4\u7684\u6570\u636E\u4E2D\u5B58\u5728\u91CD\u590D\u7684\u914D\u7F6E\uFF0C\n\u8BF7\u8BF7\u68C0\u67E5\u540E\u91CD\u65B0\u914D\u7F6E\uFF01
+rmip.framework.rightdistribution.specialdatadistribute.deployedwrong=\u6B64\u6A21\u5757\u914D\u7F6E\u6709\u8BEF\uFF01
+rmip.framework.rightdistribution.specialdatadistribute.norule=\u7CFB\u7EDF\u4E2D\u6CA1\u6709\u5BF9\u5E94\u7684\u89C4\u5219\uFF0C\u8BF7\u627E\u7BA1\u7406\u5458\u914D\u7F6E\uFF01
+rmip.framework.rightdistribution.specialdatadistribute.norole=\u7CFB\u7EDF\u4E2D\u6CA1\u6709\u8981\u8FDB\u884C\u6743\u9650\u5206\u914D\u7684\u89D2\u8272\uFF0C\u8BF7\u5148\u521B\u5EFA\u89D2\u8272\u3002
+
+#\u7279\u6b8a\u6570\u636e\u6388\u6743 \u5f02\u5e38\u4fe1\u606f
+110501=\u5206\u914D\u7279\u6B8A\u6570\u636E\u6743\u9650\u65F6\u51FA\u73B0\u5F02\u5E38\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110502=\u83B7\u53D6\u7279\u6B8A\u6570\u636E\u914D\u6743\u9650\u65F6\u51FA\u73B0\u5F02\u5E38\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110503=\u5220\u9664\u7279\u6B8A\u6570\u636E\u6743\u9650\u65F6\u51FA\u73B0\u5F02\u5E38\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110504=\u4ECEconfig.priperties\u6587\u4EF6\u4E2D\u83B7\u53D6\u914D\u7F6E\u4FE1\u606F\u9519\u8BEF\uFF0C/n\u8BF7\u68C0\u67E5\u662F\u5426\u6709\u76F8\u5173\u914D\u7F6E\uFF01
+
+#\u4fee\u6539\u5bc6\u7801 \u5f39\u51fa\u9519\u8bef\u63d0\u793a\u4fe1\u606f
+rmip.framework.logon.changepwd.notnull=\u586B\u5199\u6846\u4E0D\u80FD\u6709\u7A7A\u503C\uFF0C\u8BF7\u8F93\u5165\uFF01
+rmip.framework.logon.changepwd.notsame=\u60A8\u8F93\u5165\u7684\u5BC6\u7801\u4E0E\u767B\u5F55\u5BC6\u7801\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.logon.changepwd.notsame1=\u786E\u8BA4\u5BC6\u7801\u4E0E\u4FEE\u6539\u5BC6\u7801\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.logon.changepwd.error=\u5BC6\u7801\u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.logon.changepwd.nochange=\u5BC6\u7801\u524D\u540E\u6CA1\u6709\u6539\u53D8\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.logon.changepwd.fail=\u64CD\u4F5C\u5931\u8D25\uFF01
+rmip.framework.logon.changepwd.success=\u5BC6\u7801\u4FEE\u6539\u6210\u529F\!
+rmip.framework.logon.password.lengthIsTen = \u5BC6\u7801\u957F\u5EA6\u4E0D\u80FD\u5C0F\u4E8E10\uFF01
+rmip.framework.logon.password.levelIsLow = \u5BC6\u7801\u5B89\u5168\u7EA7\u522B\u592A\u4F4E\uFF01
+#\u89c4\u5219\u7ba1\u7406
+rmip.framework.ruleManager.title=\u89C4\u5219\u7BA1\u7406
+rmip.framework.ruleManager.name=\u540D\u79F0
+rmip.framework.ruleManager.desc=\u63CF\u8FF0
+rmip.framework.ruleManager.pipelining=\u6D41\u6C34\u65B9\u5F0F
+rmip.framework.ruleManager.documentDescription=\u8BF4\u660E\u6587\u6863
+rmip.framework.ruleManager.browsing.button=\u6D4F\u89C8
+rmip.framework.ruleManager.upload.button=\u4E0A\u4F20
+rmip.framework.ruleManager.add.button=\u589E\u52A0
+rmip.framework.ruleManager.update.button=\u4FEE\u6539
+rmip.framework.ruleManager.del.button=\u5220\u9664
+rmip.framework.ruleManager.ruleInfo=\u89C4\u5219\u5217\u8868
+rmip.framework.ruleManager.codeRule=\u7F16\u7801\u89C4\u5219\u7801\u6BB5
+rmip.framework.ruleManager.nameAlert=\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.ruleManager.nameisexist=\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.ruleManager.flowtypeAlert=\u6D41\u6C34\u65B9\u5F0F\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u9009\u62E9\uFF01
+rmip.framework.codesection.title=\u89C4\u5219\u7801\u6BB5
+rmip.framework.codesection.addButton=\u6DFB\u52A0
+rmip.framework.codesection.cancelButton=\u53D6\u6D88
+rmip.framework.codesection.nameLengthAlert = \u540D\u79F0\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.codesection.descLengthAlert = \u63CF\u8FF0\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7255\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.codesection.selectRootNode = \u8BF7\u5148\u9009\u62E9\u6839\u8282\u70B9\!
+rmip.framework.ruleManager.modifySuccess = \u4FEE\u6539\u6210\u529F\!
+rmip.framework.ruleManager.selectDeleteNode = \u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u8282\u70B9\uFF01
+rmip.framework.ruleManager.selectRuleNode = \u8BF7\u9009\u62E9\u8981\u6E05\u9664\u7684\u89C4\u5219\uFF01
+rmip.framework.ruleManager.meaasge.donotdelete = \u5DF2\u7ECF\u5B58\u5728\u89C4\u5219\u4E0D\u80FD\u5220\u9664\uFF01
+
+rmip.framework.editOnlyOne= \u6BCF\u6B21\u53EA\u80FD\u4FEE\u6539\u4E00\u6761\u6570\u636E\!
+rmip.framework.editObject= \u8BF7\u9009\u62E9\u4FEE\u6539\u6570\u636E\!
+rmip.framework.deleteObject= \u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u5BF9\u8C61\u5417?
+rmip.framework.AttributeGroupPanel.deleteAttributeGroup= \u9009\u4E2D\u7684\u5C5E\u6027\u5206\u7C7B\u5305\u542B\u5C5E\u6027\uFF0C\u4E0D\u53EF\u4EE5\u5220\u9664\uFF01
+
+#\u8d44\u6e90\u7c7b\u578b\u6a21\u677f\u7ba1\u7406
+rmip.framework.RMTypeTemplateModule=\u8D44\u6E90\u7C7B\u578B\u6A21\u677F\u7BA1\u7406
+#\u8d44\u6e90\u6570\u636e\u5206\u7c7b
+rmip.framework.RMTypeModule=\u8D44\u6E90\u6570\u636E\u7BA1\u7406
+#\u4f18\u9009\u5e93
+rmip.framework.RMPreferLibraryModule=\u4F18\u9009\u5E93
+#\u67e5\u8be2
+rmip.sherch.RMSherchModel=\u67E5\u8BE2
+
+106001=\u4E3B\u952E\u91CD\u590D\uFF0C\u8BF7\u4FEE\u6539\u540E\u63D0\u4EA4\uFF01
+106002=\u65B0\u5EFA\u914D\u7F6E\u9879\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u521B\u5EFA\uFF01
+106003=\u66F4\u6539\u914D\u7F6E\u9879\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u4FEE\u6539\uFF01
+106004=\u5220\u9664\u914D\u7F6E\u9879\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u914D\u7F6E\uFF01
+106005=\u83B7\u53D6\u6240\u6709\u914D\u7F6E\u9879\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u83B7\u53D6\uFF01
+106006=\u83B7\u53D6\u914D\u7F6E\u9879\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u83B7\u53D6\uFF01
+
+
+107001=\u540D\u79F0\u91CD\u590D\uFF0C\u8BF7\u4FEE\u6539\u540E\u63D0\u4EA4\uFF01
+107002=\u65B0\u5EFA\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u521B\u5EFA\uFF01
+107003=\u4FEE\u6539\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u4FEE\u6539\uFF01
+107004=\u5220\u9664\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u5220\u9664\uFF01
+107005=\u83B7\u53D6\u6240\u6709\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u83B7\u53D6\uFF01
+107006=\u83B7\u53D6\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u83B7\u53D6\uFF01
+107007=\u5206\u7C7B\u4E0B\u5B58\u5728\u914D\u7F6E\u9879\uFF0C\u4E0D\u80FD\u5220\u9664\uFF01
+
+
+555555=\u83B7\u53D6\u5BC6\u7801\u7B56\u7565\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555556=\u4FDD\u5B58\u5BC6\u7801\u7B56\u7565\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555557=\u4FEE\u6539\u5BC6\u7801\u7B56\u7565\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555558=\u5220\u9664\u5BC6\u7801\u7B56\u7565\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555559=\u83B7\u53D6\u5BC6\u7EA7\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555560=\u4FDD\u5B58\u5BC6\u7EA7\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555561=\u4FEE\u6539\u5BC6\u7EA7\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555562=\u9A8C\u8BC1\u5BC6\u7EA7\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555563=\u5220\u9664\u5BC6\u7EA7\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555565=\u9A8C\u8BC1\u5BC6\u7801\u7B56\u7565\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555564=\u4FDD\u5B58\u5BC6\u7EA7\u7B56\u7565\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555566=\u83B7\u53D6\u5BC6\u7EA7\u7B56\u7565\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555567=\u4FDD\u5B58\u4EBA\u5458-\u5BC6\u7EA7\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555568=\u83B7\u53D6\u4EBA\u5458\u767B\u5F55\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\!
+555569=\u83B7\u53D6\u670D\u52A1\u5668\u5F53\u524D\u65F6\u95F4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\!
+555570=\u4FEE\u6539\u4EBA\u5458\u767B\u5F55\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\!
+555571=\u4E3A\u4EBA\u5458\u89E3\u9501\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\!
+
+
+##\u5c5e\u6027\u6821\u9a8c\u89c4\u5219
+210601=\u4FDD\u5B58\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+210602=\u66F4\u65B0\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+210603=\u5220\u9664\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+210604=\u83B7\u53D6\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+210605=\u8BE5\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u5DF2\u7ECF\u88AB\u5F15\u7528\uFF0C\u65E0\u6CD5\u8FDB\u884C\u5F53\u524D\u64CD\u4F5C\uFF01
+
+150118=\u4E3A\u5C5E\u6027\u914D\u7F6E\u6821\u9A8C\u89C4\u5219\u65F6\u7CFB\u7EDF\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\!
+150119=\u6E05\u9664\u5C5E\u6027\u7684\u6821\u9A8C\u89C4\u5219\u65F6\u7CFB\u7EDF\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\!
+
+
+##\u5c5e\u6027\u540c\u4e49\u8bcd\u914d\u7f6e
+220101=\u521B\u5EFA\u5C5E\u6027\u540C\u4E49\u8BCD\u914D\u7F6E\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u67E5\u627E\u539F\u56E0\!
+220102=\u4FEE\u6539\u5C5E\u6027\u540C\u4E49\u8BCD\u914D\u7F6E\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u67E5\u627E\u539F\u56E0\!
+220103=\u5220\u9664\u5C5E\u6027\u540C\u4E49\u8BCD\u914D\u7F6E\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u67E5\u627E\u539F\u56E0\!
+220104=\u83B7\u53D6\u5C5E\u6027\u540C\u4E49\u8BCD\u914D\u7F6E\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u67E5\u627E\u539F\u56E0\!
+
+0=\u529F\u80FD\u6A21\u5757\u6388\u6743\u5931\u8D25\!
+
+LogonHandler.userNameNotExists=\u7528\u6237\u540D\u4E0D\u5B58\u5728\uFF01
+LogonHandler.userNameOrPwdWrong=\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF\uFF01
+LogonHandler.userSecretNotMatchMachineSecret=\u7528\u6237\u5BC6\u7EA7\u4E0E\u673A\u5668\u5BC6\u7EA7\u4E0D\u5339\u914D\uFF0C\u767B\u5F55\u5931\u8D25\uFF01
+LogonHandler.userIsLockedPleaseWaitSomeTimeToTry=\u7528\u6237\u5DF2\u7ECF\u88AB\u9501\u5B9A\uFF0C\u8BF7\u7B49 {0} \u5206\u949F\u540E\u518D\u5C1D\u8BD5\u767B\u5F55\uFF0C\u6216\u8005\u627E\u7BA1\u7406\u5458\u89E3\u9501\uFF01
+LogonHandler.userLoginWrongTooMuch=\u767B\u9646\u9519\u8BEF\u6B21\u6570\u8FC7\u591A\uFF0C\u767B\u5165\u7CFB\u7EDF\u5931\u8D25\uFF01\u7528\u6237\u5DF2\u88AB\u9501\u5B9A\uFF01
+LogonHandler.userIsDisabled=\u60A8\u7684\u5E10\u6237\u5DF2\u88AB\u505C\u7528,\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\uFF01
+LogonHandler.userPwdIsInitPleaseChange=\u60A8\u7684\u5BC6\u7801\u662F\u7BA1\u7406\u5458\u521D\u59CB\u7684\u5BC6\u7801\uFF0C\u9700\u8981\u4FEE\u6539\u5BC6\u7801\u624D\u80FD\u8FDB\u884C\u5176\u5B83\u64CD\u4F5C\uFF01
+LogonHandler.userPwdIsExpiredPleaseChange=\u60A8\u7684\u5BC6\u7801\u5DF2\u7ECF\u8FC7\u671F,\u8BF7\u8FDB\u884C\u4FEE\u6539\uFF01
+LogonHandler.userPwdStagIsUpdatePleaseChange=\u60A8\u7684\u5BC6\u7801\u7B56\u7565\u5DF2\u7ECF\u4FEE\u6539\uFF0C\u9700\u8981\u4FEE\u6539\u5BC6\u7801\u624D\u80FD\u8FDB\u884C\u5176\u5B83\u64CD\u4F5C\uFF01
+LogonHandler.userPwdHasSomeDayExpire=\u60A8\u7684\u5BC6\u7801\u6709\u6548\u671F\u8FD8\u6709 {0} \u5929,\u8BF7\u6CE8\u610F\u4FEE\u6539\uFF01
+LogonHandler.logDataIsTooMuch=\u65E5\u5FD7\u5B58\u50A8\u5C06\u6EE1\uFF0C\u8BF7\u53CA\u65F6\u6E05\u7406\uFF01
+LogonHandler.logonModule=\u767B\u5F55\u6A21\u5757
+LogonHandler.logon=\u767B\u5165
+LogonHandler.userIpNotMatch=\u5F53\u524D\u673A\u5668\u7684IP\u5BC6\u7EA7\u4E0D\u7B26\u5408\u5BC6\u7EA7\u8981\u6C42
+LogonHandler.userIsNotThree=\u5F53\u524D\u767B\u5F55\u7528\u6237\u975E\u4E09\u5458\u7528\u6237
+
+
diff --git a/Source/Service/LogService/src/properties/RMIPFramework_zhNative.properties b/Source/Service/LogService/src/properties/RMIPFramework_zhNative.properties
new file mode 100644
index 0000000..d672f45
--- /dev/null
+++ b/Source/Service/LogService/src/properties/RMIPFramework_zhNative.properties
@@ -0,0 +1,793 @@
+锘縗ufeff#\u5173\u95edFrame\u63d0\u793a\u5bf9\u8bdd\u6846\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.exit.system=\u9000\u51FA\u7CFB\u7EDF
+rmip.framework.logManagementModel=\u65E5\u5FD7\u7BA1\u7406\u6A21\u5757
+rmip.framework.exit.confirm=\u786E\u5B9A\u8981\u9000\u51FA\u7CFB\u7EDF\u5417\uFF1F
+rmip.framework.button.confirm=\u786E\u5B9A
+rmip.framework.button.cancel=\u53D6\u6D88
+
+#Menu\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.menu.file=\u7CFB\u7EDF
+rmip.framework.menu.file.relogon=\u91CD\u65B0\u767B\u5F55
+rmip.framework.menu.file.update.password=\u66F4\u6539\u5BC6\u7801
+rmip.framework.menu.file.exit=\u9000\u51FA
+rmip.framework.menu.file.reloadCache=\u5237\u65B0\u7F13\u5B58
+rmip.framework.menu.file.importAll=\u4E00\u952E\u5BFC\u5165
+rmip.framework.menu.file.emportAll=\u4E00\u952E\u5BFC\u51FA
+rmip.framework.menu.help=\u5E2E\u52A9
+rmip.framework.menu.help.use=\u4F7F\u7528\u5E2E\u52A9
+rmip.framework.menu.about=\u5173\u4E8E
+rmip.framework.reload.title=\u91CD\u65B0\u767B\u9646
+rmip.framework.reload.message=\u60A8\u786E\u5B9A\u8981\u91CD\u65B0\u767B\u9646\u5417?
+
+
+#\u63d0\u793a\u5bf9\u8bdd\u6846\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.info.message.dialog.title=\u4FE1\u606F\u63D0\u793A
+rmip.framework.error.message.dialog.title=\u9519\u8BEF\u63D0\u793A
+rmip.framework.warn.message.dialog.title=\u8B66\u544A\u63D0\u793A
+rmip.framework.friend.message.dialog.title=\u6E29\u99A8\u63D0\u793A
+rmip.framework.friend.message.dialog.message=\u60A8\u786E\u5B9A\u6267\u884C\u6B64\u64CD\u4F5C\u5417\uFF1F
+
+#Frame\u9875\u9762\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.system.name=VCI-Tech Innovation Platform
+rmip.framework.current.user=\u5F53\u524D\u7528\u6237\:
+
+#\u767b\u5f55\u9875\u9762\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.logon.name=\u7528\u6237\u540D\uFF1A
+rmip.framework.logon.password=\u5BC6\u7801\uFF1A
+rmip.framework.logon.new.passwork=\u65B0\u5BC6\u7801\uFF1A
+rmip.framework.logon.confirm.password=\u65B0\u5BC6\u7801\u786E\u8BA4\uFF1A
+rmip.framework.modify.password=\u4FEE\u6539\u5BC6\u7801
+
+rmip.framework.logon.isSave.password=\u662F\u5426\u4FDD\u5B58\u7528\u6237\u7684\u5BC6\u7801
+rmip.framework.logon.button.logon=\u767B\u5F55
+rmip.framework.logon.name.isNotNull=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A\!
+rmip.framework.logon.password.isNotNull=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A\!
+rmip.framework.logon.welcome.msg=\u6B22\u8FCE\u4F7F\u7528 VCI-Tech Innovation Platform
+
+
+
+########################################################################
+##\u7cfb\u7edf\u914d\u7f6e\u6a21\u5757\u56fd\u9645\u5316\u4fe1\u606f
+########################################################################
+##\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.systemConfigModule = \u7CFB\u7EDF\u914D\u7F6E\u7BA1\u7406
+rmip.framework.sysconfig.specialChar = \u7279\u6B8A\u5B57\u7B26
+rmip.framework.sysconfig.attrManagement = \u5C5E\u6027\u7BA1\u7406
+rmip.framework.sysconfig.specialCharClsf = \u7279\u6B8A\u5B57\u7B26\u5206\u7C7B
+rmip.framework.sysconfig.unit = \u5355\u4F4D
+rmip.framework.sysconfig.name = \u540D\u79F0\uFF1A
+rmip.framework.sysconfig.desc = \u63CF\u8FF0\uFF1A
+rmip.framework.sysconfig.add = \u589E\u52A0
+rmip.framework.sysconfig.modify = \u4FEE\u6539
+rmip.framework.sysconfig.delete = \u5220\u9664
+rmip.framework.sysconfig.value = \u503C
+rmip.framework.sysconfig.sort = \u6392\u5E8F
+rmip.framework.sysconfig.valueName = \u540D\u79F0
+rmip.framework.sysconfig.modifyCharAlert1 = \u8BF7\u9009\u62E9\u8981\u4FEE\u6539\u7684\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.modifyCharAlert2 = \u8981\u4FEE\u6539\u7684\u503C\u53EA\u80FD\u662F\u4E00\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.modifyCharAlert3 = \u8BF7\u9009\u4E2D\u8981\u4FEE\u6539\u7684\u5B57\u7B26\u8FDB\u884C\u4FEE\u6539\u64CD\u4F5C\uFF01
+rmip.framework.sysconfig.valueAlert = \u503C\u4E0D\u80FD\u4E3A\u7A7A\uFF01
+rmip.framework.sysconfig.addCharAlert1 = \u6DFB\u52A0\u7684 '
+rmip.framework.sysconfig.addCharAlert2 = ' \u5B57\u7B26\u4E0D\u80FD\u6DFB\u52A0\u591A\u4E2A\uFF0C\u8BF7\u4FEE\u6539\uFF01
+rmip.framework.sysconfig.modifySuccess = \u4FEE\u6539\u6210\u529F\!
+rmip.framework.sysconfig.deleteAttrAlert=\u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u5C5E\u6027\!
+rmip.framework.sysconfig.deleteAttrAlert1=\u5C5E\u6027\u5DF2\u88AB\u5F15\u7528,\u4E0D\u80FD\u5220\u9664\!
+rmip.framework.sysconfig.deleteCharAlert1 = \u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.deleteCharAlert2 = \u5220\u9664\u5931\u8D25\uFF0C\u4E0D\u5E94\u8BE5\u5305\u542B\u7B2C '
+rmip.framework.sysconfig.deleteCharAlert3 = ' \u884C
+rmip.framework.sysconfig.deleteCharAlert4 = \u7B2C '
+rmip.framework.sysconfig.deleteCharAlert5 = ' \u5217\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.framework.sysconfig.deleteConfirm = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u5B57\u7B26\u5417\uFF1F
+rmip.framework.sysconfig.warmTip = \u6E29\u99A8\u63D0\u793A
+rmip.framework.sysconfig.selectDeleteNode = \u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u8282\u70B9\uFF01
+rmip.framework.sysconfig.deleteClsfAlert = \u9009\u62E9\u5220\u9664\u7684\u8282\u70B9\u5305\u62EC\u975E\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u8282\u70B9\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.framework.sysconfig.deleteClsfConfirm = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u5206\u7C7B\u5417?
+rmip.framework.sysconfig.nameAlert = \u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.sysconfig.nameLengthAlert = \u540D\u79F0\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.descLengthAlert = \u63CF\u8FF0\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7255\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.internalnameAlert = \u5185\u90E8\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.sysconfig.internalnameLenghAlert = \u5185\u90E8\u540D\u79F0\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.internalnameLeeter = \u5185\u90E8\u540D\u79F0\u53EA\u80FD\u4E3A\u5B57\u6BCD\u5F00\u5934\uFF0C\u8BF7\u66F4\u6539\uFF01
+rmip.framework.sysconfig.attrLengthAlert = \u957F\u5EA6\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.sysconfig.attrLengthIsNum = \u957F\u5EA6\u53EA\u80FD\u4E3A\u6570\u5B57\uFF0C\u8BF7\u91CD\u586B\u5199\uFF01
+rmip.framework.sysconfig.attrLengthMax = \u957F\u5EA6\u4E3A1~4000\u4E4B\u95F4\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.sysconfig.query = \u67E5\u8BE2
+rmip.framework.sysconfig.allAttr = \u6240\u6709\u5C5E\u6027
+rmip.framework.sysconfig.defaultValue = \u9ED8\u8BA4\u503C\:
+rmip.framework.sysconfig.isEmpty = \u53EF\u4EE5\u4E3A\u7A7A\:
+rmip.framework.sysconfig.isGroup = \u662F\u5426\u96C6\u56E2\u5C5E\u6027\:
+rmip.framework.sysconfig.groupAttr = \u96C6\u56E2\u5C5E\u6027
+rmip.framework.sysconfig.groupAppendAttr = \u96C6\u56E2\u9644\u52A0\u5C5E\u6027
+rmip.framework.sysconfig.enterpriseAttr = \u4F01\u4E1A\u5C5E\u6027
+rmip.framework.sysconfig.isKey = \u662F\u5426\u5173\u952E\u5C5E\u6027\:
+rmip.framework.sysconfig.dataType = \u6570\u636E\u7C7B\u578B\uFF1A
+rmip.framework.sysconfig.valueRange = \u53D6\u503C\u8303\u56F4
+rmip.framework.sysconfig.attrrule=\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\uFF1A
+rmip.framework.sysconfig.attLengh=\u957F\u5EA6\uFF1A
+rmip.framework.sysconfig.isOnly=\u56FA\u6709\u5C5E\u6027
+rmip.framework.sysconfig.internalname=\u5185\u90E8\u540D\u79F0\uFF1A
+rmip.framework.sysconfig.queryAlert = \u6CA1\u6709\u7B26\u5408\u67E5\u8BE2\u8981\u6C42\u7684\u8BB0\u5F55\!
+rmip.framework.sysconfig.defaultValLengthAlert = \u9ED8\u8BA4\u503C\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7255\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.valueRangeNotNull = \u53D6\u503C\u8303\u56F4\u503C\u4E0D\u80FD\u4E3A\u7A7A\uFF01
+rmip.framework.sysconfig.valueRangeLengthAlert = \u53D6\u503C\u8303\u56F4\u503C\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.sysconfig.valueRangeLength = \u53D6\u503C\u8303\u56F4\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7\u5C5E\u6027\u957F\u5EA6\uFF01
+rmip.framework.sysconfig.valRangeModifyAlert = \u8BF7\u9009\u4E2D\u8981\u4FEE\u6539\u7684\u53D6\u503C\u8303\u56F4\u8FDB\u884C\u4FEE\u6539\u64CD\u4F5C\uFF01
+rmip.framework.sysconfig.selectRootNode = \u8BF7\u5148\u9009\u62E9\u6839\u8282\u70B9\!
+rmip.framework.sysconfig.selectAttrNode = \u8BF7\u5148\u9009\u62E9\u5C5E\u6027\u8282\u70B9\!
+rmip.framework.sysconfig.deleteAttrConfirm = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u5C5E\u6027\u5417?
+rmip.framework.sysconfig.selectDeleteValRange = \u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u53D6\u503C\u8303\u56F4\uFF01
+rmip.framework.sysconfig.deleteValRangeConfirm = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u53D6\u503C\u8303\u56F4\u5417\uFF1F
+rmip.framework.sysconfig.modifyValFail = \u8981\u4FEE\u6539\u7684\u503C\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4FEE\u6539\u5931\u8D25\uFF01
+rmip.framework.sysconfig.addValFail = \u8981\u6DFB\u52A0\u7684\u503C\u5DF2\u7ECF\u5B58\u5728\uFF0C\u6DFB\u52A0\u5931\u8D25\uFF01
+rmip.framework.sysconfig.updateordelete=\u662F\u5C5E\u6027\u9ED8\u8BA4\u503C,\u4E0D\u53EF\u5220\u9664\u6216\u4FEE\u6539\!
+rmip.framework.sysconfig.defaultvaluewrong=\u5C5E\u6027\u9ED8\u8BA4\u503C\u4E0D\u80FD\u901A\u8FC7\u5C5E\u6027\u89C4\u5219\u6821\u9A8C,\u683C\u5F0F\u4E0D\u6B63\u786E,\u8BF7\u4FEE\u6539\!
+rmip.framework.sysconfig.scopeValueWrong=\u53D6\u503C\u8303\u56F4\u503C\u4E0D\u80FD\u901A\u8FC7\u5C5E\u6027\u89C4\u5219\u6821\u9A8C,\u683C\u5F0F\u4E0D\u6B63\u786E,\u8BF7\u4FEE\u6539\!
+rmip.framework.sysconfig.attrRangeIsUsed=\u7684\u53D6\u503C\u8303\u56F4\u5DF2\u7ECF\u88AB\u5F15\u7528,\u4E0D\u80FD\u5220\u9664\u6216\u4FEE\u6539\!
+rmip.framework.sysconfig.firstSelectAttrNode=\u8BF7\u9009\u62E9\u5C5E\u6027\u518D\u6DFB\u52A0\u5C5E\u6027\u503C\!
+rmip.framework.sysconfig.attrRangeNameError=\u53D6\u503C\u8303\u56F4\u7684\u540D\u79F0\u5728\u8BE5\u5C5E\u6027\u4E0B\u5DF2\u7ECF\u5B58\u5728,\u8BF7\u66F4\u6539\!
+rmip.framework.sysconfig.attrRangeNameError1=\u53D6\u503C\u8303\u56F4\u540D\u79F0\u4E0D\u80FD\u8D85\u8FC7128\u4E2A\u5B57\u7B26\!
+rmip.framework.sysconfig.attrGroupAlert=\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.submit=\u63D0\u4EA4
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.cancel=\u53D6\u6D88
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.moveup=\u4E0A\u79FB
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.down=\u4E0B\u79FB
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.top=\u6700\u4E0A\u7AEF
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.bottom=\u6700\u4E0B\u7AEF
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.attrRange=\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u6392\u5E8F
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.range=\u5C5E\u6027\u503C
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.selecttoup=\u8BF7\u9009\u62E9\u5C5E\u6027\u503C\u8FDB\u884C\u4E0A\u79FB\u64CD\u4F5C\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.selectonlyone=\u6BCF\u6B21\u53EA\u5141\u8BB8\u9009\u62E9\u4E00\u6761\u5C5E\u6027\u503C\u8FDB\u884C\u64CD\u4F5C\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.selectisnull=\u8BF7\u9009\u62E9\u5C5E\u6027\u503C\u8FDB\u884C\u64CD\u4F5C\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.selecttodown=\u8BF7\u9009\u62E9\u5C5E\u6027\u503C\u8FDB\u884C\u4E0B\u79FB\u64CD\u4F5C\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.existup=\u5C5E\u6027\u503C\u5DF2\u7ECF\u5728\u6700\u4E0A\u7AEF\uFF0C\u4E0D\u5141\u8BB8\u79FB\u52A8\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.existdown=\u5C5E\u6027\u503C\u5DF2\u7ECF\u5728\u6700\u4E0B\u7AEF\uFF0C\u4E0D\u5141\u8BB8\u79FB\u52A8\uFF01
+com.vci.rmip.framework.client.systemConfig.attribute.AttrRangeSortDialog.success=\u4FDD\u5B58\u6210\u529F\uFF01
+
+##Icon\u56fe\u6807\u9009\u62e9\u7a97\u4f53
+com.vci.rmip.framework.client.common.IconSelectDialog.btnOk=\u786E\u5B9A
+com.vci.rmip.framework.client.common.IconSelectDialog.btnCancel=\u53D6\u6D88
+
+com.vci.rmip.allcommon\u3002IconSelectDialog.btnOk=\u786E\u5B9A
+com.vci.rmip.allcommon\u3002IconSelectDialog.btnCancel=\u53D6\u6D88
+##\u5f02\u5e38\u9519\u8bef\u4fe1\u606f
+150001 = \u5220\u9664\u7279\u6B8A\u5B57\u7B26\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150002 = \u5220\u9664\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150003 = \u83B7\u53D6\u7279\u6B8A\u5B57\u7B26\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150004 = \u83B7\u53D6\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150005 = \u8981\u4FDD\u6301\u7684\u7279\u6B8A\u5B57\u7B26\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150006 = \u4FDD\u5B58\u7279\u6B8A\u5B57\u7B26\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150007 = \u8981\u4FDD\u5B58\u7684\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150008 = \u4FDD\u5B58\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150009 = \u66F4\u65B0\u540E\u7684\u7279\u6B8A\u5B57\u7B26\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150010 = \u66F4\u65B0\u7279\u6B8A\u5B57\u7B26\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150011 = \u66F4\u65B0\u540E\u7684\u7279\u6B8A\u5B57\u7B26\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150012 = \u66F4\u65B0\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150101 = \u5220\u9664\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150102 = \u5220\u9664\u5C5E\u6027\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150103 = \u83B7\u53D6\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150104 = \u83B7\u53D6\u5C5E\u6027\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150105 = \u6B64\u53D6\u503C\u8303\u56F4\u5DF2\u7ECF\u5B58\u5728
+150106 = \u4FDD\u5B58\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150107 = \u4FDD\u5B58\u7684\u5C5E\u6027\u5B58\u5728\u91CD\u590D\u6570\u636E\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150108 = \u4FDD\u5B58\u5C5E\u6027\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150109 = \u66F4\u65B0\u540E\u7684\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150110 = \u66F4\u65B0\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150111 = \u66F4\u65B0\u540E\u7684\u5C5E\u6027\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01
+150112 = \u66F4\u65B0\u5C5E\u6027\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150113 = \u8FDE\u63A5\u670D\u52A1\u5668\u65F6\u53D1\u751F\u5F02\u5E38\uFF01
+150114 = \u67E5\u8BE2\u5C5E\u6027\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150115 = \u5220\u9664\u6216\u4FEE\u6539\u5C5E\u6027\u53D6\u503C\u8303\u56F4\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+150116 = \u5C5E\u6027\u7684\u5185\u90E8\u540D\u79F0\u5B58\u5728\u91CD\u590D\uFF01
+10060=\u8981\u6DFB\u52A0\u7684\u7279\u6B8A\u5B57\u7B26\u5728\u8BE5\u5206\u7C7B\u4E0B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4FDD\u5B58\u5931\u8D25\uFF01
+10062=\u8981\u4FEE\u6539\u7684\u7279\u6B8A\u5B57\u7B26\u5728\u8BE5\u5206\u7C7B\u4E0B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4FDD\u5B58\u5931\u8D25\uFF01
+10061=\u8981\u521B\u5EFA\u7684\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4FDD\u5B58\u5931\u8D25\uFF01
+10063=\u8981\u4FEE\u6539\u7684\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4FDD\u5B58\u5931\u8D25\uFF01
+150117=\u83B7\u53D6\u7279\u6B8A\u5B57\u7B26\u5206\u7C7B\u53D1\u751F\u9519\u8BEF\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+150120=\u540C\u4E00\u4E2A\u5C5E\u6027\u5206\u7C7B\u4E0B\u7684\u5C5E\u6027\u5916\u90E8\u540D\u79F0\u5B58\u5728\u91CD\u590D,\u8BF7\u4FEE\u6539\!
+150121=\u540C\u4E00\u4E2A\u5C5E\u6027\u5206\u7C7B\u4E0B\u7684\u5C5E\u6027\u5185\u90E8\u540D\u79F0\u5B58\u5728\u91CD\u590D,\u8BF7\u4FEE\u6539\!
+150122=\u8BE5\u5C5E\u6027\u5DF2\u7ECF\u88AB\u6A21\u677F\u5F15\u7528,\u4E14\u6A21\u677F\u8868\u4E2D\u5B58\u5728\u6570\u636E.\u4FEE\u6539\u540E\u7684\u5C5E\u6027\u957F\u5EA6\u4E0D\u80FD\u5C0F\u4E8E\u4FEE\u6539\u524D\u957F\u5EA6\!
+150123=\u8BE5\u5C5E\u6027\u5DF2\u7ECF\u5B58\u5728\u53D6\u503C\u8303\u56F4,\u4FEE\u6539\u540E\u7684\u5C5E\u6027\u957F\u5EA6\u4E0D\u80FD\u5C0F\u4E8E\u4FEE\u6539\u524D\u957F\u5EA6\!
+
+########################################################################
+##\u7cfb\u7edf\u914d\u7f6e\u6a21\u5757\u56fd\u9645\u5316\u4fe1\u606f END
+########################################################################
+
+
+########################################################################
+##\u89c4\u5219\u7ba1\u7406\u6a21\u5757\u56fd\u9645\u5316\u4fe1\u606f
+########################################################################
+##\u56fd\u9645\u5316\u4fe1\u606f
+rmip.framework.ruleManagementModule = \u89C4\u5219\u7BA1\u7406
+rmip.framework.rMTypeTemplateModule = \u8D44\u6E90\u7C7B\u578B\u6A21\u677F\u7BA1\u7406
+##\u5f02\u5e38\u9519\u8bef\u4fe1\u606f
+########################################################################
+##\u89c4\u5219\u7ba1\u7406\u6a21\u5757\u56fd\u9645\u5316\u4fe1\u606f END
+########################################################################
+-10000=\u65E0\u6CD5\u8FDE\u63A5\u5230\u670D\u52A1\u5668\uFF0C\u8BF7\u68C0\u67E5\n1\:JacORB\u670D\u52A1\u662F\u5426\u6B63\u5E38\u542F\u52A8\uFF0C\n1\:\u4E3B\u670D\u52A1\u662F\u5426\u6B63\u5E38\u542F\u52A8\uFF0C\n1\:\u68C0\u67E5\u662F\u5426\u6709\u9632\u706B\u5899\u5BF9\u7A0B\u5E8F\u7AEF\u53E3\u8FDB\u884C\u4E86\u9650\u5236\uFF01
+-99999=\u6587\u4EF6\u7B2C{0}\u884C\u7B2C{1}\u5217\u683C\u5F0F\u9519\u8BEF\uFF0C\u8BF7\u5C06\u5176\u4FEE\u6539\u4E3A\u5B57\u7B26\u4E32\u7C7B\u578B\u3002
+
+100001=\u65E0\u6CD5\u83B7\u53D6\u767B\u5F55\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100002=\u65E0\u6CD5\u83B7\u53D6\u6846\u67B6\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100003=\u65E0\u6CD5\u83B7\u53D6CODE\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100004=\u65E0\u6CD5\u83B7\u53D6RM\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100005=\u65E0\u6CD5\u83B7\u53D6BOM\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100006=\u65E0\u6CD5\u83B7\u53D6workFlow\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100007=\u65E0\u6CD5\u83B7\u53D6simpleNews\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100008=\u65E0\u6CD5\u83B7\u53D6EquipmentService\u670D\u52A1\uFF0C\u8BF7\u91CD\u65B0\u542F\u52A8\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u3002
+100009=\u65E0\u6CD5\u83B7\u53D6Bom\u96C6\u6210\u670D\u52A1\uFF0C\u8BF7\u91CD\u542F\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458.
+100010=\u65E0\u6CD5\u83B7\u53D6014\u96C6\u6210\u670D\u52A1\uFF0C\u8BF7\u91CD\u542F\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458.
+#############################################
+## \u6a21\u5757\u6743\u9650\u914d\u7f6e
+## \u7cfb\u7edf\u6a21\u5757\u6784\u5efa
+##
+#############################################
+#\u7cfb\u7edf\u6a21\u5757\u6784\u5efa
+#\u6a21\u5757\u663e\u793a\u4fe1\u606f
+rmip.framework.systemFunctionTree.systemFunctionModel = \u7BA1\u7406\u529F\u80FD\u6A21\u5757
+rmip.framework.systemFunctionTree.businessFunctionModel=\u4E1A\u52A1\u529F\u80FD\u6A21\u5757
+rmip.framework.systemFunctionTree.root = \u7CFB\u7EDF\u529F\u80FD\u6A21\u5757\u7BA1\u7406
+rmip.framework.systemFunctionTree.title = \u6A21\u5757\u7BA1\u7406
+
+rmip.framework.systemFunctionTree.modelManagment.isValid = \u662F\u5426\u6709\u6548
+rmip.framework.systemFunctionTree.modelManagment.modelName = \u6A21\u5757\u540D\:
+rmip.framework.systemFunctionTree.modelManagment.description = \u63CF\u8FF0\:
+rmip.framework.systemFunctionTree.modelManagment.addButton = \u589E\u52A0
+rmip.framework.systemFunctionTree.modelManagment.modifyButton = \u4FEE\u6539
+rmip.framework.systemFunctionTree.modelManagment.deleteButton = \u5220\u9664
+rmip.framework.systemFunctionTree.modelManagment.addOperationTypeButton = \u589E\u52A0\u64CD\u4F5C\u7C7B\u578B
+rmip.framework.systemFunctionTree.modelManagment.delNonSysBtn = \u5220\u9664\u975E\u7CFB\u7EDF\u6A21\u5757
+rmip.framework.systemFunctionTree.modelManagment.delBusiBtn = \u5220\u9664\u4E1A\u52A1\u6A21\u5757
+
+rmip.framework.systemFunctionTree.dialog.title = \u64CD\u4F5C\u7C7B\u578B\u5206\u7C7B
+rmip.framework.systemFunctionTree.dialog.type = \u64CD\u4F5C\u5206\u7C7B
+rmip.framework.systemFunctionTree.dialog.okButton = \u786E\u8BA4
+rmip.framework.systemFunctionTree.dialog.cancelButton = \u53D6\u6D88
+
+rmip.framework.systemFunctionTree.root.notSelect = \u8BF7\u9009\u62E9\u8282\u70B9\u8FDB\u884C\u64CD\u4F5C\!
+rmip.framework.systemFunctionTree.root.delete = \u6839\u8282\u70B9\u65E0\u6CD5\u5220\u9664\!
+rmip.framework.systemFunctionTree.modelName.duplicate = \u6A21\u5757\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\!
+rmip.framework.systemFunctionTree.model.delete = \u8BF7\u9009\u62E9\u6A21\u5757\u8282\u70B9\u8FDB\u884C\u5220\u9664\u64CD\u4F5C\!
+rmip.framework.systemFunctionTree.model.deleteQuery = \u4F60\u786E\u5B9A\u8981\u5220\u9664\u9009\u62E9\u7684\u6570\u636E\u548C\u5B50\u8282\u70B9\u6570\u636E\uFF0C\u4EE5\u53CA\u529F\u80FD\u6A21\u5757\u6388\u6743\u5417\uFF1F
+rmip.framework.systemFunctionTree.model.relation = \u6A21\u5757\u6216\u5B50\u6A21\u5757\u88AB\u5F15\u7528\uFF0C\u65E0\u6CD5\u5220\u9664\!
+rmip.framework.systemFunctionTree.modelNmae.isNull = \u6A21\u5757\u540D\u79F0\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\!
+rmip.framework.systemFunctionTree.modelNmae.lenght = \u6A21\u5757\u540D\u79F0\u957F\u5EA6\u8D85\u8FC7\u89C4\u5B9A\u8303\u56F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\!
+rmip.framework.systemFunctionTree.desc.lenght = \u63CF\u8FF0\u5927\u5C0F\u8D85\u8FC7\u89C4\u5B9A\u8303\u56F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\!
+rmip.framework.systemFunctionTree.model.modifyInfo = \u6A21\u5757\u4FE1\u606F\u4FEE\u6539\u6210\u529F\!
+rmip.framework.systemFunctionTree.model.operateTypeInfo = \u8BF7\u9009\u62E9\u64CD\u4F5C\u7C7B\u578B\u8FDB\u884C\u64CD\u4F5C\uFF01
+rmip.framework.systemFunctionTree.model.operateTypeRight = \u8BF7\u9009\u62E9\u6B63\u786E\u7684\u64CD\u4F5C\u7C7B\u578B\u8FDB\u884C\u64CD\u4F5C\uFF01
+rmip.framework.systemFunctionTree.cs.lenght = C/S\u529F\u80FD\u6A21\u5757\u8DEF\u5F84\u957F\u5EA6\u8D85\u8FC7\u89C4\u5B9A\u8303\u56F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.systemFunctionTree.cs.name = C/S\u529F\u80FD\u6A21\u5757\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A\uFF01
+rmip.framework.systemFunctionTree.notnet.lenght=.NET\u529F\u80FD\u6A21\u5757\u8DEF\u5F84\u957F\u5EA6\u8D85\u8FC7\u89C4\u5B9A\u8303\u56F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.systemFunctionTree.mobile.lenght=Mobile\u529F\u80FD\u6A21\u5757\u8DEF\u5F84\u957F\u5EA6\u8D85\u8FC7\u89C4\u5B9A\u8303\u56F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+
+#\u5f02\u5e38\u4fe1\u606f
+110000 = \u521B\u5EFA\u6A21\u5757\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110001 = \u68C0\u7D22\u6A21\u5757\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110002 = \u5220\u9664\u6A21\u5757\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110003 = \u66F4\u65B0\u6A21\u5757\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110004 = corba\u5BF9\u8C61\u548C\u5B9E\u4F53\u7C7B\u8F6C\u6362\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110005 = \u66F4\u65B0\u6A21\u5757\u6811\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110006 = \u5220\u9664\u975E\u7CFB\u7EDF\u6A21\u5757\u6216\u4E1A\u52A1\u6A21\u5757\u51FA\u9519\uFF01
+################################################################
+## Tab\u9875\u4fe1\u606f \u6743\u9650\u914d\u7f6e\u6a21\u5757
+#\u64cd\u4f5c\u7c7b\u578b
+rmip.framework.operateType.operateTypeModel.file=\u64CD\u4F5C\u7C7B\u578B\u7BA1\u7406
+rmip.framework.operateType.operateTypeLab.file=\u64CD\u4F5C\u7C7B\u578B
+rmip.framework.operateType.designationLab.file=\u540D\u79F0
+rmip.framework.operateType.typeLab.file=\u7C7B\u578B
+rmip.framework.operateType.identifyingLab.file=\u6807\u8BC6
+rmip.framework.operateType.describeLab.file=\u63CF\u8FF0
+rmip.framework.operateType.addButton.file=\u6DFB\u52A0
+rmip.framework.operateType.updateButton.file=\u4FEE\u6539
+rmip.framework.moudelConfig.file=\u7CFB\u7EDF\u6A21\u5757\u914D\u7F6E
+rmip.framework.operateType.delButton.file=\u5220\u9664
+rmip.framework.operateType.savesusses.message=\u6DFB\u52A0\u6210\u529F\!
+rmip.framework.operateType.savefail.message=\u6DFB\u52A0\u5931\u8D25\!
+rmip.framework.operateType.updatesusses.message=\u4FEE\u6539\u6210\u529F\!
+rmip.framework.operateType.updatefail.message=\u4FEE\u6539\u5931\u8D25\!
+rmip.framework.operateType.deletesusses.message=\u5220\u9664\u6210\u529F\!
+rmip.framework.operateType.deletefail.message=\u5220\u9664\u5931\u8D25\!
+rmip.framework.operateType.designationTextNotNull.message=\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\!
+rmip.framework.operateType.designationTextLength.message=\u540D\u79F0\u4E0D\u80FD\u592A\u957F\!
+rmip.framework.operateType.describeTextAreaLength.message=\u63CF\u8FF0\u4E0D\u80FD\u8D85\u8FC7255\u5B57\!
+rmip.framework.operateType.treeNode.message=\u8BF7\u9009\u62E9\u4E00\u4E2A\u8282\u70B9\!
+rmip.framework.operateType.nameIsExist.message=\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\!
+rmip.framework.operateType.operateTypeIsExist.message=\u64CD\u4F5C\u7C7B\u578B\u6B63\u5728\u88AB\u4F7F\u7528\u4E0D\u80FD\u5220\u9664\!
+rmip.framework.operateType.operateTypeIsExistNoChange.message=\u64CD\u4F5C\u7C7B\u578B\u6B63\u5728\u88AB\u4F7F\u7528\u4E0D\u80FD\u4FEE\u6539\!
+rmip.framework.operateType.operateTypeIsChoice.message=\u8BF7\u9009\u62E9\u64CD\u4F5C\u7C7B\u578B\!
+rmip.framework.operateType.modelIsChoice.message=\u8BF7\u9009\u62E9\u6A21\u5757\!
+rmip.framework.operateType.typeIsChoice.message=\u8BF7\u9009\u62E9\u7C7B\u578B\!
+rmip.framework.operateType.identifyingIsChoice.message=\u6807\u8BC6\u4E0D\u80FD\u4E3A\u7A7A\!
+rmip.framework.operateType.identifyingIsTooLong.message=\u6807\u8BC6\u5B57\u7B26\u4E0D\u80FD\u8D85\u8FC7128\u5B57\u7B26\uFF01
+rmip.framework.operateType.identifyingIsExist.message=\u6807\u8BC6\u5DF2\u7ECF\u5B58\u5728\!
+rmip.framework.operateType.aliasTextNotNull.message=\u522B\u540D\u4E0D\u80FD\u4E3A\u7A7A\!
+rmip.framework.operateType.aliasTextLength.message=\u522B\u540D\u7684\u5B57\u7B26\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7128\u5B57\u7B26\uFF01
+rmip.framework.sysConfNode.sysConfModel=\u7CFB\u7EDF\u914D\u7F6E\u9879\u7BA1\u7406
+rmip.framework.sysConfNode.sysConfClsfModel=\u914D\u7F6E\u5206\u7C7B\u7BA1\u7406
+rmip.framework.sysConfNode.sysMonitor=\u7CFB\u7EDF\u76D1\u63A7\u7BA1\u7406
+
+#\u5f02\u5e38\u4fe1\u606f
+110100 = \u521B\u5EFA\u64CD\u4F5C\u7C7B\u578B\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110101 = \u68C0\u7D22\u64CD\u4F5C\u7C7B\u578B\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110102 = \u5220\u9664\u64CD\u4F5C\u7C7B\u578B\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110103 = \u66F4\u65B0\u64CD\u4F5C\u7C7B\u578B\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110104 = \u68C0\u7D22\u5E94\u7528\u6570\u636E\u64CD\u4F5C\u8868\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110105 = \u68C0\u7D22\u64CD\u4F5C\u7C7B\u578B\u6811\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110106 = \u68C0\u7D22\u64CD\u4F5C\u7C7B\u578B\u6811\u8282\u70B9\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110107 = \u68C0\u7D22\u529F\u80FD\u5E94\u7528\u8868\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+#\u7279\u6b8a\u6570\u636e\u5bf9\u8c61
+rmip.framework.specialData.specialDataModel.file=\u7279\u6B8A\u6570\u636E\u7BA1\u7406
+rmip.framework.specialData.specialDataLab.file=\u6570\u636E\u5BF9\u8C61
+rmip.framework.specialData.designationLab.file=\u540D\u79F0
+rmip.framework.specialData.modelLab.file=\u6A21\u5757
+rmip.framework.specialData.describe.file=\u63CF\u8FF0
+rmip.framework.specialData.operateTypeLab.file=\u64CD\u4F5C\u7C7B\u578B(*\u8BF7\u6309\u4F4FCtrl\u8FDB\u884C\u591A\u9009)
+rmip.framework.specialData.addButton.file=\u6DFB\u52A0
+rmip.framework.specialData.updateButton.file=\u4FEE\u6539
+rmip.framework.specialData.delButton.file=\u5220\u9664
+rmip.framework.workFlowNode.workFlowModelfile=\u6D41\u7A0B\u914D\u7F6E\u7BA1\u7406
+#\u6d41\u7a0b\u914d\u7f6e
+com.vci.rmip.framework.client.rightConfig.workflow.WorkFlowConfPanel.deleteConfirmMessage = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u6570\u636E\u5417\uFF1F\u5220\u9664\u540E\u7684\u6570\u636E\u4E0D\u53EF\u6062\u590D\uFF01
+com.vci.rmip.framework.client.rightConfig.workflow.AssignProcessDialog.selectProcess = \u9009\u62E9\u6D41\u7A0B\u6A21\u677F
+com.vci.rmip.framework.client.rightConfig.workflow.AssignProcessDialog.btnOk = \u786E\u5B9A
+com.vci.rmip.framework.client.rightConfig.workflow.AssignProcessDialog.btnCancel = \u53D6\u6D88
+com.vci.rmip.framework.client.rightConfig.workflow.AssignProcessDialog.treeRootNodeName = \u6D41\u7A0B\u6A21\u677F
+com.vci.rmip.framework.client.rightConfig.workflow.AssignProcessDialog.plsSelectProcessDefinition = \u8BF7\u9009\u62E9\u6D41\u7A0B\u6A21\u677F\uFF01
+#\u4eba\u5458\u7ec4\u7ec7\u7ba1\u7406\u6807\u7b7e
+rmip.framework.menu.staffOrgManage=\u4EBA\u5458\u7EC4\u7EC7\u7BA1\u7406
+
+#\u5f02\u5e38\u4fe1\u606f
+110200 = \u521B\u5EFA\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110201 = \u68C0\u7D22\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110202 = \u5220\u9664\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110203 = \u66F4\u65B0\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110204 = \u68C0\u7D22\u5E94\u7528\u6570\u636E\u64CD\u4F5C\u8868\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110205 = \u68C0\u7D22\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u6811\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110206 = \u68C0\u7D22\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u6811\u8282\u70B9\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110207 = \u68C0\u7D22\u529F\u80FD\u5E94\u7528\u8868\u4FE1\u606F\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110208 = \u68C0\u7D22\u64CD\u4F5C\u7C7B\u578B\u5217\u8868\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110209 = \u4FDD\u5B58\u5E94\u7528\u6570\u636E\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110211 = \u66F4\u65B0\u5E94\u7528\u6570\u636E\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110212 = \u5220\u9664\u5E94\u7528\u6570\u636E\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+rmip.stafforg.menu.staffOrg=\u4EBA\u5458\u7EC4\u7EC7
+rmip.stafforg.menu.department=\u90E8\u95E8
+rmip.stafforg.menu.group=\u7EC4
+rmip.stafforg.menu.role=\u89D2\u8272
+rmip.stafforg.menu.staff=\u6210\u5458
+rmip.stafforg.menu.name1=\u3010\u603B\u6570\uFF1A
+rmip.stafforg.menu.name2=\u3011
+rmip.stafforg.logal.name=\u540D\u79F0\uFF1A
+rmip.stafforg.logal.num=\u7F16\u53F7\uFF1A
+rmip.stafforg.logal.desc=\u63CF\u8FF0\uFF1A
+rmip.stafforg.logal.username=\u8D26\u53F7\uFF1A
+rmip.stafforg.logal.security=\u5BC6\u7EA7\uFF1A
+rmip.stafforg.logal.password=\u5BC6\u7801\uFF1A
+rmip.stafforg.logal.confpassword=\u786E\u8BA4\u5BC6\u7801\uFF1A
+rmip.stafforg.logal.department=\u90E8\u95E8\uFF1A
+rmip.stafforg.logal.firstname=\u59D3\u540D\uFF1A
+rmip.stafforg.logal.lastname=\u540D\u5B57\uFF1A
+rmip.stafforg.logal.empno=\u7F16\u53F7\uFF1A
+rmip.stafforg.logal.duty=\u804C\u52A1\uFF1A
+rmip.stafforg.logal.email=\u7535\u5B50\u90AE\u4EF6\uFF1A
+rmip.stafforg.logal.businessTel=\u5546\u52A1\u7535\u8BDD\uFF1A
+rmip.stafforg.logal.homephone=\u5BB6\u5EAD\u7535\u8BDD\uFF1A
+rmip.stafforg.logal.mobelphone=\u79FB\u52A8\u7535\u8BDD\uFF1A
+rmip.stafforg.logal.businessfax=\u5546\u52A1\u4F20\u771F\uFF1A
+rmip.stafforg.logal.rolelist=\u73B0\u6709\u89D2\u8272\:
+rmip.stafforg.logal.choosedrolelist=\u62E5\u6709\u89D2\u8272\:
+rmip.stafforg.logal.grouplist=\u73B0\u6709\u7EC4\:
+rmip.stafforg.logal.choosedgrouplist=\u6240\u5C5E\u7EC4\:
+rmip.stafforg.logal.roling=\u5206\u914D\u89D2\u8272
+rmip.stafforg.logal.grouping=\u5206\u914D\u7EC4\u7EC7
+rmip.stafforg.operate.add=\u589E\u52A0
+rmip.stafforg.operate.modify=\u4FEE\u6539
+rmip.stafforg.operate.delete=\u5220\u9664
+rmip.stafforg.operate.syn=\u540C\u6B65
+rmip.stafforg.operate.grouping=\u5206\u914D\u7EC4\u7EC7
+rmip.stafforg.operate.roling=\u5206\u914D\u89D2\u8272
+rmip.stafforg.operate.conform=\u786E\u5B9A
+rmip.stafforg.operate.cancel=\u53D6\u6D88
+rmip.stafforg.operate.toselectgroup=\u8BF7\u9009\u62E9\u8981\u589E\u52A0\u7684\u7EC4\uFF01
+rmip.stafforg.operate.toreselectgroup=\u8981\u589E\u52A0\u7684\u7EC4\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.toremovegroup=\u8BF7\u9009\u62E9\u8981\u79FB\u9664\u7684\u7EC4\uFF01
+rmip.stafforg.operate.toselectrole=\u8BF7\u9009\u62E9\u8981\u589E\u52A0\u7684\u89D2\u8272\uFF01
+rmip.stafforg.operate.toreselectrole=\u8981\u589E\u52A0\u7684\u89D2\u8272\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.toremoverole=\u8BF7\u9009\u62E9\u8981\u79FB\u9664\u7684\u89D2\u8272\uFF01
+rmip.stafforg.operate.toadddeptname=\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\uFF01
+rmip.stafforg.operate.nameerror=\u540D\u79F0\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.descerror=\u63CF\u8FF0\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E255\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.deptnameerror=\u90E8\u95E8\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.numtoolong=\u7F16\u53F7\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E64\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\!
+rmip.stafforg.operate.rolenameerror=\u89D2\u8272\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.groupnameerror=\u7EC4\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.updateok=\u4FEE\u6539\u6210\u529F\uFF01
+rmip.stafforg.operate.toselectdel=\u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u8282\u70B9\uFF01
+rmip.stafforg.operate.syndeptselect=\u8BF7\u9009\u4E2D\u8981\u540C\u6B65\u7684\u90E8\u95E8\uFF01
+rmip.stafforg.operate.syndept.selectone=\u53EA\u80FD\u9009\u62E9\u4E00\u4E2A\u90E8\u95E8\u8282\u70B9\u8FDB\u884C\u540C\u6B65\uFF01
+rmip.stafforg.operate.syndept.success=\u90E8\u95E8\u540C\u6B65\u6210\u529F\uFF01
+rmip.stafforg.operate.toreselectdeldept=\u9009\u62E9\u5220\u9664\u7684\u8282\u70B9\u5305\u62EC\u975E\u90E8\u95E8\u8282\u70B9\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.toshowdeldepterror1=\u9009\u62E9\u5220\u9664\u7684\u90E8\u95E8\u8282\u70B9\u4E2D
+rmip.stafforg.operate.toshowdeleteerror=\u88AB\u7528\u6237
+rmip.stafforg.operate.toshowdeleteerror1=\u5F15\u7528\uFF0C\u8BF7\u89E3\u9664\u5173\u7CFB\u540E\u518D\u8FDB\u884C\u5220\u9664\u64CD\u4F5C\uFF01
+rmip.stafforg.operate.conformdeldept=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u90E8\u95E8\u5417\uFF1F
+rmip.stafforg.operate.toreselectdelgroup=\u9009\u62E9\u5220\u9664\u7684\u8282\u70B9\u5305\u62EC\u975E\u7EC4\u8282\u70B9\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.conformdelgroup=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u7EC4\u8282\u70B9\u5417\uFF1F
+rmip.stafforg.operate.toshowdelgrouperror1=\u9009\u62E9\u5220\u9664\u7684\u7EC4\u8282\u70B9\u4E2D
+rmip.stafforg.operate.toreselectdelrole=\u9009\u62E9\u5220\u9664\u7684\u8282\u70B9\u4E2D\u5305\u62EC\u975E\u89D2\u8272\u51E0\u70B9\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.conformdelrole=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u89D2\u8272\u5417\uFF1F
+rmip.stafforg.operate.toshowdelroleerror1=\u9009\u62E9\u5220\u9664\u7684\u89D2\u8272\u8282\u70B9\u4E2D
+rmip.stafforg.operate.toshowdelusererror=\u9009\u62E9\u5220\u9664\u7684\u8282\u70B9\u5305\u62EC\u975E\u7528\u6237\u8282\u70B9\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\uFF01
+rmip.stafforg.operate.conformdeluser=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u6210\u5458\u5417\uFF1F
+rmip.stafforg.operate.usernameerror1=\u7528\u6237\u540D\uFF1Aadmin\u662F\u4FDD\u7559\u7528\u6237\uFF0C\u8BF7\u6539\u6210\u5176\u5B83\u540D\u79F0\uFF01
+rmip.stafforg.operate.usernameerror2=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\uFF01
+rmip.stafforg.operate.usernameerror3=\u7528\u6237\u540D\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.usernameerror4=\u7528\u6237\u540D\u53EA\u80FD\u4E3A\u6570\u5B57\u5B57\u6BCD\u6216\u8005\u4E0B\u5212\u7EBF\uFF01
+rmip.stafforg.operate.usernameerror5=\u7528\u6237\u540D\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.pwderror1=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\uFF01
+rmip.stafforg.operate.conformpwderror=\u786E\u8BA4\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\uFF01
+rmip.stafforg.operate.pwderror2=\u5BC6\u7801\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.pwderror3=\u5BC6\u7801\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.pwderror4=\u5BC6\u7801\u53EA\u80FD\u4E3A\u6570\u5B57\u5B57\u6BCD\u6216\u8005\u4E0B\u5212\u7EBF\uFF01
+rmip.stafforg.operate.firstnameerror=\u59D3\u6C0F\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC764\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.firstnameerror1=\u6210\u5458\u7684\u59D3\u6C0F\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u8F93\u5165\uFF01
+rmip.stafforg.operate.lastnameerror=\u540D\u5B57\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC764\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.lastnameerror1=\u6210\u5458\u7684\u540D\u5B57\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u8F93\u5165\uFF01
+rmip.stafforg.operate.dutyerror=\u804C\u52A1\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.emailerror=\u7535\u5B50\u90AE\u4EF6\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199
+rmip.stafforg.operate.emailerror1=\u7535\u5B50\u90AE\u4EF6\u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.telerror=\u6240\u6709\u7535\u8BDD\u957F\u5EA6\u90FD\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC764\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u68C0\u67E5\u5E76\u4FEE\u6539\uFF01
+rmip.stafforg.operate.businessfaxerror=\u5546\u52A1\u4F20\u771F\u957F\u5EA6\u90FD\u4E0D\u80FD\u5927\u4E8E\u8D85\u8FC764\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.businessfaxerror1=\u5546\u52A1\u4F20\u771F\u53EA\u80FD\u4E3A\u6570\u5B57\u4E0E'-'\u7684\u7EC4\u5408\uFF01
+rmip.stafforg.operate.homephoneerror=\u5BB6\u5EAD\u7535\u8BDD\u53EA\u80FD\u4E3A\u6570\u5B57\u4E0E'-'\u7684\u7EC4\u5408\uFF01
+rmip.stafforg.operate.businesstelerror=\u5546\u52A1\u7535\u8BDD\u53EA\u80FD\u4E3A\u6570\u5B57\u4E0E'-'\u7684\u7EC4\u5408\uFF01
+rmip.stafforg.operate.mobelerror=\u79FB\u52A8\u7535\u8BDD\u53EA\u80FD\u4E3A\u6570\u5B57\u4E0E'-'\u7684\u7EC4\u5408\uFF01
+rmip.stafforg.operate.loginerror=\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF\uFF01\n\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.stafforg.operate.empnonull=\u7F16\u53F7\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\uFF01
+rmip.stafforg.operate.empnotoolong=\u7F16\u53F7\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E128\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.empnorepeat=\u7F16\u53F7\u91CD\u590D\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.stafforg.operate.deptIdnull=\u90E8\u95E8\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u82E5\u7CFB\u7EDF\u4E2D\u6CA1\u6709\u90E8\u95E8\uFF0C\u8BF7\u5148\u521B\u5EFA\u90E8\u95E8\uFF01
+rmip.stafforg.operate.numcannotchange=\u8BE5\u90E8\u95E8\u5DF2\u7ECF\u88AB\u540C\u6B65\uFF0C\u4E0D\u80FD\u5BF9\u5176\u7F16\u53F7\u8FDB\u884C\u4FEE\u6539\uFF01
+rmip.stafforg.operate.usercreateok=\u7528\u6237\u6210\u529F\u6DFB\u52A0\u5230\u7CFB\u7EDF\uFF01
+rmip.stafforg.operate.useredit1=\u8BF7\u94A9\u9009\u8981\u8FDB\u884C\u4FEE\u6539\u7684\u6210\u5458\!
+rmip.stafforg.operate.useredit2=\u4E00\u6B21\u53EA\u80FD\u5BF9\u4E00\u4E2A\u6210\u5458\u8FDB\u884C\u4FEE\u6539\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\!
+rmip.stafforg.operate.userdelete1=\u8BF7\u94A9\u9009\u8981\u5220\u9664\u7684\u6210\u5458\!
+rmip.stafforg.operate.userdelete2=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u6240\u9009\u62E9\u7684\u6210\u5458\u5417?
+rmip.stafforg.operate.deptedit1=\u8BF7\u94A9\u9009\u8981\u8FDB\u884C\u4FEE\u6539\u7684\u5BF9\u8C61\!
+rmip.stafforg.operate.deptedit2=\u4E00\u6B21\u53EA\u80FD\u5BF9\u4E00\u4E2A\u5BF9\u8C61\u8FDB\u884C\u4FEE\u6539\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\!
+rmip.stafforg.operate.deptdelete1=\u8BF7\u94A9\u9009\u8981\u5220\u9664\u7684\u5BF9\u8C61\!
+rmip.stafforg.operate.deptdelete2=\u60A8\u786E\u5B9A\u8981\u5220\u9664\u6240\u9009\u62E9\u7684\u5BF9\u8C61\u5417?
+rmip.stafforg.operate.pwdgroupdelete=\u786E\u5B9A\u8981\u5220\u9664\u6240\u9009\u62E9\u7684\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u5417?
+rmip.stafforg.operate.deptselect=\u60A8\u8981\u5220\u9664\u7684\u6D41\u7A0B\u6A21\u677F\u5DF2\u7ECF\u88AB\u5F15\u7528\uFF0C\u8BF7\u5148\u89E3\u9664\u5173\u7CFB\uFF0C\u5728\u8FDB\u884C\u5220\u9664\u64CD\u4F5C\uFF01
+
+## Tab\u9875 \u4eba\u5458\u7ec4\u7ec7\u5f02\u5e38\u4fe1\u606f
+120101=\u83B7\u53D6\u6240\u6709\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120102=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u6240\u6709\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120103=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u9876\u7EA7\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120104=\u83B7\u53D6\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120105=\u83B7\u53D6\u9876\u7EA7\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120106=\u83B7\u53D6\u90E8\u95E8\u4E0B\u7684\u5B50\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120107=\u83B7\u53D6\u90E8\u95E8\u53CA\u5176\u5B50\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120108=\u5220\u9664\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120109=\u589E\u52A0\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120110=\u4FEE\u6539\u90E8\u95E8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120111=\u4FEE\u6539\u4EBA\u5458\u4E0E\u90E8\u95E8\u5173\u7CFB\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u4E0E\u7BA1\u7406\u5458\u8054\u7CFB\!
+120201=\u83B7\u53D6\u516C\u53F8\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120202=\u83B7\u53D6\u9876\u7EA7\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120203=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u9876\u7EA7\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120204=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120205=\u83B7\u53D6\u7EC4\u4E0B\u7684\u5B50\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120206=\u83B7\u53D6\u7EC4\u53CA\u5176\u5B50\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120207=\u5220\u9664\u516C\u53F8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120208=\u589E\u52A0\u516C\u53F8\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120209=\u4FEE\u6539\u7EC4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120301=\u83B7\u53D6\u6240\u6709\u89D2\u8272\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120302=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u89D2\u8272\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120303=\u5220\u9664\u89D2\u8272\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120304=\u589E\u52A0\u89D2\u8272\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120305=\u4FEE\u6539\u89D2\u8272\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120306=\u4FDD\u5B58\u4EBA\u5458\u4E0E\u89D2\u8272\u7684\u5173\u7CFB\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\!
+120307=\u9A8C\u8BC1\u89D2\u8272\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u4E0E\u7BA1\u7406\u5458\u8054\u7CFB\!
+120308=\u6839\u636E\u7528\u6237\u540D\u83B7\u53D6\u5173\u8054\u89D2\u8272\u603B\u6570\u65F6\u53D1\u751F\u9519\u8BEF\uFF0C\u8BF7\u4E0E\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120401=\u83B7\u53D6\u4EBA\u5458\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120402=\u6839\u636E\u7528\u6237\u7C7B\u578B\u83B7\u53D6\u6240\u6709\u6210\u5458\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120403=\u5220\u9664\u4EBA\u5458\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120404=\u589E\u52A0\u4EBA\u5458\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120405=\u4FEE\u6539\u4EBA\u5458\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120406=\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120407=\u767B\u5F55\u65F6\u83B7\u53D6\u7528\u6237\u767B\u5F55\u4FE1\u606F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120408=\u90E8\u95E8\u540C\u6B65\u65F6\u51FA\u9519\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120409=\u66F4\u65B0\u90E8\u95E8\u540C\u6B65\u72B6\u6001\u65F6\u51FA\u9519\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120410=\u90E8\u95E8\u5DF2\u7ECF\u540C\u6B65\u5B8C\u6210\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\u8981\u540C\u6B65\u7684\u90E8\u95E8\uFF01
+120411=\u6839\u636E\u90E8\u95E8\u83B7\u53D6\u5BF9\u5E94\u7684\u4EBA\u5458\u4FE1\u606F\u65F6\u51FA\u9519\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120412=\u5728\u8FDB\u884C\u505C\u7528/\u542F\u7528\u64CD\u4F5C\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u67E5\u770B\!
+120413=\u6839\u636E\u6761\u4EF6\u83B7\u53D6\u4EBA\u5458\u603B\u6570\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+120414=\u5E73\u53F0\u5BA2\u6237\u7AEF\u53EA\u5141\u8BB8\u7BA1\u7406\u5458\u767B\u5F55\uFF01
+
+120501=\u83B7\u53D6\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120502=\u6DFB\u52A0\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120503=\u66F4\u65B0\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120504=\u5220\u9664\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120505=\u83B7\u53D6\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u53D6\u503C\u8303\u56F4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120506=\u6DFB\u52A0\u5BC6\u7801\u7EC4\u5408\u65B9\u5F0F\u53D6\u503C\u8303\u56F4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120507=\u6DFB\u52A0\u7684\u53D6\u503C\u8303\u56F4\u503C\u5728\u8BE5\u7EC4\u5408\u65B9\u5F0F\u4E0B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u6DFB\u52A0\u5931\u8D25\uFF01
+120508=\u66F4\u65B0\u5BC6\u7801\u7EC4\u5408\u53D6\u503C\u8303\u56F4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120509=\u5220\u9664\u5BC6\u7801\u7EC4\u5408\u53D6\u503C\u8303\u56F4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u4E0E\u7CFB\u7EDF\u7BA1\u7406\u5458\u8054\u7CFB\uFF01
+120510=\u66F4\u65B0\u7279\u6B8A\u5B57\u7B26\u7684\u53D6\u503C\u5728\u8BE5\u5206\u7C7B\u4E0B\u5DF2\u7ECF\u5B58\u5728\uFF0C\u6DFB\u52A0\u5931\u8D25\uFF01
+120601=\u8BFB\u53D6\u7528\u6237\u6743\u9650\u51FA\u9519\uFF01
+120701=\u8BFB\u53D6\u6240\u6709\u5B50\u6A21\u5757\u4FE1\u606F\u51FA\u9519\uFF01
+
+#################################################
+####\u65e5\u5fd7\u7ba1\u7406
+#################################################
+rmip.framework.log.adminLog=\u7BA1\u7406\u5458\u65E5\u5FD7
+rmip.framework.log.userLog=\u666E\u901A\u7528\u6237\u65E5\u5FD7
+rmip.framework.log.startDate=\u67E5\u8BE2\u65E5\u671F\uFF1A\u7531
+rmip.framework.log.to=\u5230
+rmip.framework.log.operateType=\u64CD\u4F5C\u7C7B\u578B
+rmip.framework.log.create=\u521B\u5EFA
+rmip.framework.log.update=\u4FEE\u6539
+rmip.framework.log.delete=\u5220\u9664
+rmip.framework.log.operateUser=\u64CD\u4F5C\u7528\u6237\uFF1A
+rmip.framework.log.savePeriod=\u4FDD\u5B58\u671F\u9650\uFF1A
+rmip.framework.log.backupPeriod=\u5907\u4EFD\u671F\u9650\uFF1A
+rmip.framework.log.save=\u4FDD\u5B58
+rmip.framework.log.selectDate=\u8BF7\u9009\u62E9\u65E5\u671F\uFF1A
+rmip.framework.log.firstPage=\u9996\u9875
+rmip.framework.log.prePage=\u4E0A\u4E00\u9875
+rmip.framework.log.nextPage=\u4E0B\u4E00\u9875
+rmip.framework.log.lastPage=\u5C3E\u9875
+rmip.framework.log.query=\u67E5\u8BE2
+rmip.framework.log.export=\u5BFC\u51FA
+rmip.framework.log.logDelete=\u65E5\u5FD7\u5220\u9664
+rmip.framework.log.logBackup=\u65E5\u5FD7\u5907\u4EFD
+rmip.framework.log.date=\u65F6\u95F4
+rmip.framework.log.user=\u7528\u6237
+rmip.framework.log.userIp=\u7528\u6237IP
+rmip.framework.log.operateObj=\u64CD\u4F5C\u5BF9\u8C61
+rmip.framework.log.operateModule=\u64CD\u4F5C\u6A21\u5757
+rmip.framework.log.objID=\u5BF9\u8C61ID
+rmip.framework.log.objDesc=\u63CF\u8FF0
+rmip.framework.log.objAttr=\u5BF9\u8C61\u5C5E\u6027
+rmip.framework.log.previousValue=\u64CD\u4F5C\u524D\u7684\u503C
+rmip.framework.log.newValue=\u64CD\u4F5C\u540E\u7684\u503C
+rmip.framework.log.pageSizeAlert=\u83B7\u53D6\u9875\u9762\u663E\u793A\u6761\u6570\u914D\u7F6E\u51FA\u9519\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\uFF0C\u6B64\u5904\u9ED8\u8BA4\u66F4\u6539\u9875\u9762\u663E\u793A\u6761\u6570\u4E3A10\uFF01
+rmip.framework.log.pageInfo1=\u603B\u5171\u6709
+rmip.framework.log.pageInfo2=\u6761\u8BB0\u5F55,\u5171
+rmip.framework.log.pageInfo3=\u9875,\u5F53\u524D\u4E3A\u7B2C
+rmip.framework.log.pageInfo4=\u9875
+rmip.framework.log.savePeriodAlert=\u4FDD\u5B58\u671F\u9650\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u9009\u62E9\uFF01
+rmip.framework.log.saveSuccess=\u4FDD\u5B58\u6210\u529F
+rmip.framework.log.exportSuccess=\u5BFC\u51FA\u6210\u529F
+rmip.framework.log.deleteDateAlert=\u8BF7\u9009\u62E9\u5220\u9664\u65E5\u671F\uFF01
+rmip.framework.log.deleteLogConfirm=\u5C06\u5220\u9664\u6240\u9009\u65E5\u671F\u4E4B\u524D\u7684\u65E5\u5FD7\uFF0C\u786E\u8BA4\u6267\u884C\u5220\u9664\uFF1F
+rmip.framework.log.deleteSuccess=\u5220\u9664\u6210\u529F
+rmip.framework.log.backupPeriodAlert=\u5907\u4EFD\u671F\u9650\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u9009\u62E9\uFF01
+rmip.framework.log.exportPath=\u5BFC\u51FA\u4F4D\u7F6E
+rmip.framework.log.exportFile=\u5BFC\u51FA\u6587\u4EF6
+rmip.framework.log.exportFile.fail=\u6CA1\u6709\u8981\u5230\u51FA\u7684\u6570\u636E\uFF01
+140101=\u83B7\u53D6\u65E5\u5FD7\u5220\u9664\u914D\u7F6E\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140102=\u83B7\u53D6\u65E5\u5FD7\u914D\u7F6E\u671F\u9650\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140103=\u83B7\u53D6\u65E5\u5FD7\u9875\u9762\u663E\u793A\u6761\u6570\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140104=\u83B7\u53D6\u672C\u6B21\u67E5\u8BE2\u65E5\u5FD7\u603B\u6570\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140105=\u67E5\u8BE2\u65E5\u5FD7\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140106=\u4FDD\u5B58\u671F\u9650\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140107=\u83B7\u53D6\u671F\u9650\u6570\u503C\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140108=\u5220\u9664\u65E5\u5FD7\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+140109=\u8BB0\u5F55\u65E5\u5FD7\u51FA\u9519\uFF0C\u767B\u5F55\u4FE1\u606F\u53EF\u80FD\u4E3A\u7A7A\!
+
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.logDelete=\u65E5\u5FD7\u5220\u9664\uFF1A
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.autoDelete=\u81EA\u52A8\u5220\u9664
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.manualDelete=\u624B\u52A8\u5220\u9664
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.savePeriod=\u4FDD\u5B58\u671F\u9650\uFF1A
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.saveBtn=\u4FDD\u5B58
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.logBasicConf=\u65E5\u5FD7\u57FA\u7840\u914D\u7F6E
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.deleteDateAlert=\u8BF7\u9009\u62E9\u5220\u9664\u65E5\u671F\uFF01
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.deleteLogConfirm=\u5C06\u5220\u9664\u6240\u9009\u65E5\u671F\u4E4B\u524D\u7684\u65E5\u5FD7\uFF0C\u786E\u8BA4\u6267\u884C\u5220\u9664\uFF1F
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.deleteSuccess=\u5220\u9664\u6210\u529F
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.savePeriodAlert=\u4FDD\u5B58\u671F\u9650\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u9009\u62E9\uFF01
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.saveSuccess=\u4FDD\u5B58\u6210\u529F
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.selectDate=\u8BF7\u9009\u62E9\u65E5\u671F\uFF1A
+com.vci.rmip.framework.client.systemConfig.log.LogBasicConfPanel.delete=\u5220\u9664
+##########################################################################
+
+#############################################
+## \u6a21\u5757\u6743\u9650\u5206\u914d
+##
+##
+#############################################
+rmip.framework.rightdistribution.title.name = \u6743\u9650\u5206\u914D
+rmip.framework.rightdistribution.file = \u6743\u9650\u5206\u914D\u7BA1\u7406
+#\u6570\u636e\u6388\u6743
+rmip.framework.rightdistribution.datadistribute.name = \u6570\u636E\u6388\u6743
+rmip.framework.rightdistribution.datadistribute.title.name = \u540D\u79F0\uFF1A
+rmip.framework.rightdistribution.datadistribute.title.desc = \u63CF\u8FF0\uFF1A
+rmip.framework.rightdistribution.datadistribute.title.policyname = \u7B56\u7565\u57FA\u672C\u4FE1\u606F
+rmip.framework.rightdistribution.datadistribute.btnSubmit.name = \u63D0\u4EA4
+rmip.framework.rightdistribution.datadistribute.btnDeletePolicy.name = \u5220\u9664\u7B56\u7565\u5BF9\u8C61
+rmip.framework.rightdistribution.datadistribute.policyconf.name = \u7B56\u7565\u6743\u9650\u914D\u7F6E
+
+rmip.framework.rightdistribution.datadistribute.create.name = \u521B\u5EFA\u8005
+rmip.framework.rightdistribution.datadistribute.role.name = \u540C\u89D2\u8272\u7528\u6237
+rmip.framework.rightdistribution.datadistribute.normal.name = \u666E\u901A\u7528\u6237
+rmip.framework.rightdistribution.datadistribute.admin.name = \u7BA1\u7406\u5458
+
+rmip.framework.rightdistribution.datadistribute.table.checkbox = \u9009\u62E9
+rmip.framework.rightdistribution.datadistribute.table.name = \u89D2\u8272
+
+rmip.framework.rightdistribution.datadistribute.input.check.name.null = \u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF01
+rmip.framework.rightdistribution.datadistribute.input.check.name.length = \u540D\u79F0\u957F\u5EA6\u592A\u957F\uFF01
+rmip.framework.rightdistribution.datadistribute.input.check.desc.length = \u63CF\u8FF0\u957F\u5EA6\u592A\u957F\uFF01
+
+rmip.framework.rightdistribution.savepolicy.success = \u64CD\u4F5C\u6210\u529F\!
+rmip.framework.rightdistribution.savepolicy.error = \u64CD\u4F5C\u7684\u8FC7\u7A0B\u4E2D\u51FA\u73B0\u9519\u8BEF\!
+rmip.framework.rightdistribution.datadistribute.delete.policydata = \u8BF7\u5148\u9009\u62E9\u8981\u5220\u9664\u7684\u6570\u636E\!
+rmip.framework.rightdistribution.datadistribute.delete.query = \u60A8\u786E\u5B9A\u8981\u5220\u9664\u6240\u9009\u62E9\u7684\u6570\u636E\u5417?(\u6CE8\u610F\:\u5220\u9664\u540E\u4E0D\u53EF\u6062\u590D,\u786E\u5B9A\u8981\u5220\u9664?)
+rmip.framework.rightdistribution.data = \u6CA1\u6709\u6570\u636E\u9879,\u4E0D\u80FD\u63D0\u4EA4\!
+rmip.framework.rightdistribution.delete.selectnode = \u8BF7\u9009\u4E2D\u8282\u70B9\u5220\u9664\uFF01
+rmip.framework.rightdistribution.delete.fail = \u5220\u9664\u6570\u636E\u7B56\u7565\u5931\u8D25\uFF01
+rmip.framework.rightdistribution.strategyconf.isnull = \u6570\u636E\u7B56\u7565\u914D\u7F6E\u4E3A\u7A7A\uFF0C\u4E0D\u5141\u8BB8\u63D0\u4EA4\uFF01
+rmip.framework.rightdistribution.datastrategy.name = \u7B56\u7565\u540D\u79F0\u91CD\u590D\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+#\u5f02\u5e38\u4fe1\u606f
+130000 = \u7B56\u7565\u914D\u7F6E\u5931\u8D25\uFF01
+130001 = \u83B7\u53D6\u7B56\u7565\u6570\u636E\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+130002 = \u83B7\u53D6\u6570\u636E\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+130003 = \u5220\u9664\u6570\u636E\u7B56\u7565\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\uFF01
+130004 = \u540C\u4E00\u4E2A\u89D2\u8272\u7528\u6237\uFF0C\u4E0D\u80FD\u6388\u6743\u591A\u6B21\uFF01
+
+#\u6a21\u5757\u6743\u9650\u914d\u7f6e
+rmip.framework.rightdistribution.moduleRight.name = \u6A21\u5757\u6743\u9650\u914D\u7F6E
+rmip.framework.rightdistribution.moduleRight.moduleTree = \u529F\u80FD\u6A21\u5757
+rmip.framework.rightdistribution.moduleRight.RoleList = \u89D2\u8272
+rmip.framework.rightdistribution.moduleRight.addButton.file=\u6388\u6743
+rmip.framework.rightdistribution.moduleRight.updateButton.file=\u4FEE\u6539
+rmip.framework.rightdistribution.moduleRight.delButton.file=\u91CD\u7F6E
+rmip.framework.rightdistribution.moduleRight.roleListNotNull.message=\u8BF7\u9009\u62E9\u4E00\u4E2A\u89D2\u8272\uFF01
+rmip.framework.rightdistribution.moduleRight.changes.message=\u60A8\u8FD8\u6CA1\u6709\u4FDD\u5B58\uFF0C\u786E\u5B9A\u653E\u5F03\u5F53\u524D\u64CD\u4F5C\u5417\uFF1F
+#----\u8865\u5145\u6dfb\u52a0\u6388\u6743\u529f\u80fd
+rmip.framework.rightdistribution.moduleRight.reAddButton.file=\u589E\u52A0\u6388\u6743
+rmip.framework.rightdistribution.moduleRight.lookButton.file=\u67E5\u770B\u6388\u6743
+
+#\u5f02\u5e38\u4fe1\u606f
+130100 = \u4FDD\u5B58\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+130101 = \u68C0\u7D22\u7279\u6B8A\u6570\u636E\u5BF9\u8C61\u4FE1\u606F\u5931\u8D25\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+
+#\u7279\u6b8a\u6570\u636e\u6388\u6743 \u9875\u9762\u663e\u793a\u4fe1\u606f
+rmip.framework.rightdistribution.specialdatadistribute.name=\u7279\u6B8A\u6570\u636E\u6388\u6743
+rmip.framework.rightdistribution.specialdatadistribute.add=\u52A0\u4E00\u884C
+rmip.framework.rightdistribution.specialdatadistribute.submit=\u63D0\u4EA4
+rmip.framework.rightdistribution.specialdatadistribute.delete=\u51CF\u4E00\u884C
+rmip.framework.rightdistribution.specialdatadistribute.ok=\u64CD\u4F5C\u6210\u529F\uFF01
+rmip.framework.rightdistribution.specialdatadistribute.remove=\u8BF7\u9009\u62E9\u8981\u79FB\u9664\u7684\u9879\uFF01
+rmip.framework.rightdistribution.specialdatadistribute.conformremove=\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u6570\u636E\u5417?\n\u5220\u9664\u540E\u4E0D\u53EF\u6062\u590D,\u786E\u5B9A?
+rmip.framework.rightdistribution.specialdatadistribute.redeploy=\u8981\u63D0\u4EA4\u7684\u6570\u636E\u4E2D\u5B58\u5728\u91CD\u590D\u7684\u914D\u7F6E\uFF0C\n\u8BF7\u8BF7\u68C0\u67E5\u540E\u91CD\u65B0\u914D\u7F6E\uFF01
+rmip.framework.rightdistribution.specialdatadistribute.deployedwrong=\u6B64\u6A21\u5757\u914D\u7F6E\u6709\u8BEF\uFF01
+rmip.framework.rightdistribution.specialdatadistribute.norule=\u7CFB\u7EDF\u4E2D\u6CA1\u6709\u5BF9\u5E94\u7684\u89C4\u5219\uFF0C\u8BF7\u627E\u7BA1\u7406\u5458\u914D\u7F6E\uFF01
+rmip.framework.rightdistribution.specialdatadistribute.norole=\u7CFB\u7EDF\u4E2D\u6CA1\u6709\u8981\u8FDB\u884C\u6743\u9650\u5206\u914D\u7684\u89D2\u8272\uFF0C\u8BF7\u5148\u521B\u5EFA\u89D2\u8272\u3002
+
+#\u7279\u6b8a\u6570\u636e\u6388\u6743 \u5f02\u5e38\u4fe1\u606f
+110501=\u5206\u914D\u7279\u6B8A\u6570\u636E\u6743\u9650\u65F6\u51FA\u73B0\u5F02\u5E38\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110502=\u83B7\u53D6\u7279\u6B8A\u6570\u636E\u914D\u6743\u9650\u65F6\u51FA\u73B0\u5F02\u5E38\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110503=\u5220\u9664\u7279\u6B8A\u6570\u636E\u6743\u9650\u65F6\u51FA\u73B0\u5F02\u5E38\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+110504=\u4ECEconfig.priperties\u6587\u4EF6\u4E2D\u83B7\u53D6\u914D\u7F6E\u4FE1\u606F\u9519\u8BEF\uFF0C/n\u8BF7\u68C0\u67E5\u662F\u5426\u6709\u76F8\u5173\u914D\u7F6E\uFF01
+
+#\u4fee\u6539\u5bc6\u7801 \u5f39\u51fa\u9519\u8bef\u63d0\u793a\u4fe1\u606f
+rmip.framework.logon.changepwd.notnull=\u586B\u5199\u6846\u4E0D\u80FD\u6709\u7A7A\u503C\uFF0C\u8BF7\u8F93\u5165\uFF01
+rmip.framework.logon.changepwd.notsame=\u60A8\u8F93\u5165\u7684\u5BC6\u7801\u4E0E\u767B\u5F55\u5BC6\u7801\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.logon.changepwd.notsame1=\u786E\u8BA4\u5BC6\u7801\u4E0E\u4FEE\u6539\u5BC6\u7801\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.logon.changepwd.error=\u5BC6\u7801\u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.logon.changepwd.nochange=\u5BC6\u7801\u524D\u540E\u6CA1\u6709\u6539\u53D8\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01
+rmip.framework.logon.changepwd.fail=\u64CD\u4F5C\u5931\u8D25\uFF01
+rmip.framework.logon.changepwd.success=\u5BC6\u7801\u4FEE\u6539\u6210\u529F\!
+rmip.framework.logon.password.lengthIsTen = \u5BC6\u7801\u957F\u5EA6\u4E0D\u80FD\u5C0F\u4E8E10\uFF01
+rmip.framework.logon.password.levelIsLow = \u5BC6\u7801\u5B89\u5168\u7EA7\u522B\u592A\u4F4E\uFF01
+#\u89c4\u5219\u7ba1\u7406
+rmip.framework.ruleManager.title=\u89C4\u5219\u7BA1\u7406
+rmip.framework.ruleManager.name=\u540D\u79F0
+rmip.framework.ruleManager.desc=\u63CF\u8FF0
+rmip.framework.ruleManager.pipelining=\u6D41\u6C34\u65B9\u5F0F
+rmip.framework.ruleManager.documentDescription=\u8BF4\u660E\u6587\u6863
+rmip.framework.ruleManager.browsing.button=\u6D4F\u89C8
+rmip.framework.ruleManager.upload.button=\u4E0A\u4F20
+rmip.framework.ruleManager.add.button=\u589E\u52A0
+rmip.framework.ruleManager.update.button=\u4FEE\u6539
+rmip.framework.ruleManager.del.button=\u5220\u9664
+rmip.framework.ruleManager.ruleInfo=\u89C4\u5219\u5217\u8868
+rmip.framework.ruleManager.codeRule=\u7F16\u7801\u89C4\u5219\u7801\u6BB5
+rmip.framework.ruleManager.nameAlert=\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.ruleManager.nameisexist=\u540D\u79F0\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\uFF01
+rmip.framework.ruleManager.flowtypeAlert=\u6D41\u6C34\u65B9\u5F0F\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u9009\u62E9\uFF01
+rmip.framework.codesection.title=\u89C4\u5219\u7801\u6BB5
+rmip.framework.codesection.addButton=\u6DFB\u52A0
+rmip.framework.codesection.cancelButton=\u53D6\u6D88
+rmip.framework.codesection.nameLengthAlert = \u540D\u79F0\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7128\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.codesection.descLengthAlert = \u63CF\u8FF0\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7255\u4E2A\u5B57\u7B26\uFF01
+rmip.framework.codesection.selectRootNode = \u8BF7\u5148\u9009\u62E9\u6839\u8282\u70B9\!
+rmip.framework.ruleManager.modifySuccess = \u4FEE\u6539\u6210\u529F\!
+rmip.framework.ruleManager.selectDeleteNode = \u8BF7\u9009\u62E9\u8981\u5220\u9664\u7684\u8282\u70B9\uFF01
+rmip.framework.ruleManager.selectRuleNode = \u8BF7\u9009\u62E9\u8981\u6E05\u9664\u7684\u89C4\u5219\uFF01
+rmip.framework.ruleManager.meaasge.donotdelete = \u5DF2\u7ECF\u5B58\u5728\u89C4\u5219\u4E0D\u80FD\u5220\u9664\uFF01
+
+rmip.framework.editOnlyOne= \u6BCF\u6B21\u53EA\u80FD\u4FEE\u6539\u4E00\u6761\u6570\u636E\!
+rmip.framework.editObject= \u8BF7\u9009\u62E9\u4FEE\u6539\u6570\u636E\!
+rmip.framework.deleteObject= \u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684\u5BF9\u8C61\u5417?
+rmip.framework.AttributeGroupPanel.deleteAttributeGroup= \u9009\u4E2D\u7684\u5C5E\u6027\u5206\u7C7B\u5305\u542B\u5C5E\u6027\uFF0C\u4E0D\u53EF\u4EE5\u5220\u9664\uFF01
+
+#\u8d44\u6e90\u7c7b\u578b\u6a21\u677f\u7ba1\u7406
+rmip.framework.RMTypeTemplateModule=\u8D44\u6E90\u7C7B\u578B\u6A21\u677F\u7BA1\u7406
+#\u8d44\u6e90\u6570\u636e\u5206\u7c7b
+rmip.framework.RMTypeModule=\u8D44\u6E90\u6570\u636E\u7BA1\u7406
+#\u4f18\u9009\u5e93
+rmip.framework.RMPreferLibraryModule=\u4F18\u9009\u5E93
+#\u67e5\u8be2
+rmip.sherch.RMSherchModel=\u67E5\u8BE2
+
+106001=\u4E3B\u952E\u91CD\u590D\uFF0C\u8BF7\u4FEE\u6539\u540E\u63D0\u4EA4\uFF01
+106002=\u65B0\u5EFA\u914D\u7F6E\u9879\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u521B\u5EFA\uFF01
+106003=\u66F4\u6539\u914D\u7F6E\u9879\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u4FEE\u6539\uFF01
+106004=\u5220\u9664\u914D\u7F6E\u9879\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u914D\u7F6E\uFF01
+106005=\u83B7\u53D6\u6240\u6709\u914D\u7F6E\u9879\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u83B7\u53D6\uFF01
+106006=\u83B7\u53D6\u914D\u7F6E\u9879\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u83B7\u53D6\uFF01
+
+
+107001=\u540D\u79F0\u91CD\u590D\uFF0C\u8BF7\u4FEE\u6539\u540E\u63D0\u4EA4\uFF01
+107002=\u65B0\u5EFA\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u521B\u5EFA\uFF01
+107003=\u4FEE\u6539\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u4FEE\u6539\uFF01
+107004=\u5220\u9664\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u5220\u9664\uFF01
+107005=\u83B7\u53D6\u6240\u6709\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u83B7\u53D6\uFF01
+107006=\u83B7\u53D6\u5206\u7C7B\u51FA\u9519\uFF0C\u8BF7\u91CD\u65B0\u83B7\u53D6\uFF01
+107007=\u5206\u7C7B\u4E0B\u5B58\u5728\u914D\u7F6E\u9879\uFF0C\u4E0D\u80FD\u5220\u9664\uFF01
+
+
+555555=\u83B7\u53D6\u5BC6\u7801\u7B56\u7565\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555556=\u4FDD\u5B58\u5BC6\u7801\u7B56\u7565\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555557=\u4FEE\u6539\u5BC6\u7801\u7B56\u7565\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555558=\u5220\u9664\u5BC6\u7801\u7B56\u7565\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555559=\u83B7\u53D6\u5BC6\u7EA7\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555560=\u4FDD\u5B58\u5BC6\u7EA7\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555561=\u4FEE\u6539\u5BC6\u7EA7\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555562=\u9A8C\u8BC1\u5BC6\u7EA7\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555563=\u5220\u9664\u5BC6\u7EA7\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555565=\u9A8C\u8BC1\u5BC6\u7801\u7B56\u7565\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555564=\u4FDD\u5B58\u5BC6\u7EA7\u7B56\u7565\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555566=\u83B7\u53D6\u5BC6\u7EA7\u7B56\u7565\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555567=\u4FDD\u5B58\u4EBA\u5458-\u5BC6\u7EA7\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38,\u8BF7\u68C0\u67E5\!
+555568=\u83B7\u53D6\u4EBA\u5458\u767B\u5F55\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\!
+555569=\u83B7\u53D6\u670D\u52A1\u5668\u5F53\u524D\u65F6\u95F4\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\!
+555570=\u4FEE\u6539\u4EBA\u5458\u767B\u5F55\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\!
+555571=\u4E3A\u4EBA\u5458\u89E3\u9501\u65F6\u7CFB\u7EDF\u53D1\u751F\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\!
+
+
+##\u5c5e\u6027\u6821\u9a8c\u89c4\u5219
+210601=\u4FDD\u5B58\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+210602=\u66F4\u65B0\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+210603=\u5220\u9664\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+210604=\u83B7\u53D6\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\uFF01
+210605=\u8BE5\u5C5E\u6027\u6821\u9A8C\u89C4\u5219\u5DF2\u7ECF\u88AB\u5F15\u7528\uFF0C\u65E0\u6CD5\u8FDB\u884C\u5F53\u524D\u64CD\u4F5C\uFF01
+
+150118=\u4E3A\u5C5E\u6027\u914D\u7F6E\u6821\u9A8C\u89C4\u5219\u65F6\u7CFB\u7EDF\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\!
+150119=\u6E05\u9664\u5C5E\u6027\u7684\u6821\u9A8C\u89C4\u5219\u65F6\u7CFB\u7EDF\u51FA\u9519\uFF0C\u8BF7\u67E5\u627E\u539F\u56E0\!
+
+
+##\u5c5e\u6027\u540c\u4e49\u8bcd\u914d\u7f6e
+220101=\u521B\u5EFA\u5C5E\u6027\u540C\u4E49\u8BCD\u914D\u7F6E\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u67E5\u627E\u539F\u56E0\!
+220102=\u4FEE\u6539\u5C5E\u6027\u540C\u4E49\u8BCD\u914D\u7F6E\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u67E5\u627E\u539F\u56E0\!
+220103=\u5220\u9664\u5C5E\u6027\u540C\u4E49\u8BCD\u914D\u7F6E\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u67E5\u627E\u539F\u56E0\!
+220104=\u83B7\u53D6\u5C5E\u6027\u540C\u4E49\u8BCD\u914D\u7F6E\u4FE1\u606F\u65F6\u7CFB\u7EDF\u53D1\u751F\u9519\u8BEF,\u8BF7\u67E5\u627E\u539F\u56E0\!
+
+0=\u529F\u80FD\u6A21\u5757\u6388\u6743\u5931\u8D25\!
+
+LogonHandler.userNameNotExists=\u7528\u6237\u540D\u4E0D\u5B58\u5728\uFF01
+LogonHandler.userNameOrPwdWrong=\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF\uFF01
+LogonHandler.userSecretNotMatchMachineSecret=\u7528\u6237\u5BC6\u7EA7\u4E0E\u673A\u5668\u5BC6\u7EA7\u4E0D\u5339\u914D\uFF0C\u767B\u5F55\u5931\u8D25\uFF01
+LogonHandler.userIsLockedPleaseWaitSomeTimeToTry=\u7528\u6237\u5DF2\u7ECF\u88AB\u9501\u5B9A\uFF0C\u8BF7\u7B49 {0} \u5206\u949F\u540E\u518D\u5C1D\u8BD5\u767B\u5F55\uFF0C\u6216\u8005\u627E\u7BA1\u7406\u5458\u89E3\u9501\uFF01
+LogonHandler.userLoginWrongTooMuch=\u767B\u9646\u9519\u8BEF\u6B21\u6570\u8FC7\u591A\uFF0C\u767B\u5165\u7CFB\u7EDF\u5931\u8D25\uFF01\u7528\u6237\u5DF2\u88AB\u9501\u5B9A\uFF01
+LogonHandler.userIsDisabled=\u60A8\u7684\u5E10\u6237\u5DF2\u88AB\u505C\u7528,\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\uFF01
+LogonHandler.userPwdIsInitPleaseChange=\u60A8\u7684\u5BC6\u7801\u662F\u7BA1\u7406\u5458\u521D\u59CB\u7684\u5BC6\u7801\uFF0C\u9700\u8981\u4FEE\u6539\u5BC6\u7801\u624D\u80FD\u8FDB\u884C\u5176\u5B83\u64CD\u4F5C\uFF01
+LogonHandler.userPwdIsExpiredPleaseChange=\u60A8\u7684\u5BC6\u7801\u5DF2\u7ECF\u8FC7\u671F,\u8BF7\u8FDB\u884C\u4FEE\u6539\uFF01
+LogonHandler.userPwdStagIsUpdatePleaseChange=\u60A8\u7684\u5BC6\u7801\u7B56\u7565\u5DF2\u7ECF\u4FEE\u6539\uFF0C\u9700\u8981\u4FEE\u6539\u5BC6\u7801\u624D\u80FD\u8FDB\u884C\u5176\u5B83\u64CD\u4F5C\uFF01
+LogonHandler.userPwdHasSomeDayExpire=\u60A8\u7684\u5BC6\u7801\u6709\u6548\u671F\u8FD8\u6709 {0} \u5929,\u8BF7\u6CE8\u610F\u4FEE\u6539\uFF01
+LogonHandler.logDataIsTooMuch=\u65E5\u5FD7\u5B58\u50A8\u5C06\u6EE1\uFF0C\u8BF7\u53CA\u65F6\u6E05\u7406\uFF01
+LogonHandler.logonModule=\u767B\u5F55\u6A21\u5757
+LogonHandler.logon=\u767B\u5165
+LogonHandler.userIpNotMatch=\u5F53\u524D\u673A\u5668\u7684IP\u5BC6\u7EA7\u4E0D\u7B26\u5408\u5BC6\u7EA7\u8981\u6C42
+LogonHandler.userIsNotThree=\u5F53\u524D\u767B\u5F55\u7528\u6237\u975E\u4E09\u5458\u7528\u6237
diff --git a/Source/Service/LogService/src/properties/ServerWithLog4j.properties b/Source/Service/LogService/src/properties/ServerWithLog4j.properties
new file mode 100644
index 0000000..144efab
--- /dev/null
+++ b/Source/Service/LogService/src/properties/ServerWithLog4j.properties
@@ -0,0 +1,10 @@
+log4j.logger.ServerLog=WARN,A1,R
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] [%c] %3x - %m%n
+log4j.appender.R=org.apache.log4j.RollingFileAppender
+log4j.appender.R.File=server_log.txt
+log4j.appender.R.MaxFileSize=5MB
+log4j.appender.R.MaxBackupIndex=10
+log4j.appender.R.layout=org.apache.log4j.PatternLayout
+log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
\ No newline at end of file
diff --git a/Source/Service/LogService/src/properties/hibernate.map.xml b/Source/Service/LogService/src/properties/hibernate.map.xml
new file mode 100644
index 0000000..879e452
--- /dev/null
+++ b/Source/Service/LogService/src/properties/hibernate.map.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<hbmfiles>
+ <!-- log鏄犲皠鏂囦欢 -->
+ <mapping resource="com/vci/server/log/hbm/Log.hbm.xml"/>
+</hbmfiles>
\ No newline at end of file
diff --git a/Source/Service/OMDService/build-jar.xml b/Source/Service/OMDService/build-jar.xml
index 3d6aa59..8baed0a 100644
--- a/Source/Service/OMDService/build-jar.xml
+++ b/Source/Service/OMDService/build-jar.xml
@@ -2,7 +2,7 @@
<!--classes.jar; src.jar-->
<project name = "platform-OMDService" default = "build-OMDService-jar" basedir = ".">
- <property file="build.properties"/>
+ <property file="../../build.properties"/>
<target name="time">
<tstamp>
@@ -30,5 +30,7 @@
<include name="**.jar" />
</fileset>
</copy>
+
+
</target>
</project>
\ No newline at end of file
diff --git a/Source/Service/OMDService/build.properties b/Source/Service/OMDService/build.properties
index 4f8a188..c626764 100644
--- a/Source/Service/OMDService/build.properties
+++ b/Source/Service/OMDService/build.properties
@@ -9,4 +9,8 @@
service.dir=${lib.dir}/service
client.dir=${lib.dir}/client
+grid.app = ${app_home}/../grid/app
+grid.common=${grid.app}/common
+grid.service=${grid.app}/service
+
platform.version=2024
\ No newline at end of file
diff --git a/Source/Service/OMDService/dist/OMDService.jar b/Source/Service/OMDService/dist/OMDService.jar
index 7d5355d..4e4ff3e 100644
--- a/Source/Service/OMDService/dist/OMDService.jar
+++ b/Source/Service/OMDService/dist/OMDService.jar
Binary files differ
diff --git a/Source/Service/OMDService/src/com/vci/server/OMDBoxService.java b/Source/Service/OMDService/src/com/vci/server/OMDBoxService.java
index 5e58af5..ecb00cd 100644
--- a/Source/Service/OMDService/src/com/vci/server/OMDBoxService.java
+++ b/Source/Service/OMDService/src/com/vci/server/OMDBoxService.java
@@ -3,6 +3,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.mw.ServerContextInterceptor;
import com.vci.server.omd.OMDServiceImpl;
import com.zeroc.Ice.Communicator;
import com.zeroc.Ice.Identity;
@@ -17,18 +19,19 @@
@Override
public void start(String name, Communicator communicator, String[] args) {
- LOGGER.info("start servant: OQService");
+ LOGGER.info("start servant: " + name);
+
+ HibernateSessionFactory.getConfiguration();
+
// IceBox
// 鍒涘缓objectAdapter锛岃繖閲屽拰service鍚屽悕
_adapter = communicator.createObjectAdapter(name);
// 鍒涘缓servant
com.zeroc.Ice.Object object = new OMDServiceImpl();
- id = Util.stringToIdentity(name);
- // _adapter.add(object, communicator.stringToIdentity(name));
- _adapter.add(object, id);
+ _adapter.add(new ServerContextInterceptor(object), Util.stringToIdentity(name));
// 婵�娲�
_adapter.activate();
- LOGGER.info("start servant success: OQService");
+ LOGGER.info("start servant success: " + name);
}
@Override
diff --git a/Source/Service/OMDService/src/com/vci/server/omd/OMDServiceImpl.java b/Source/Service/OMDService/src/com/vci/server/omd/OMDServiceImpl.java
index 8988be7..40f8c59 100644
--- a/Source/Service/OMDService/src/com/vci/server/omd/OMDServiceImpl.java
+++ b/Source/Service/OMDService/src/com/vci/server/omd/OMDServiceImpl.java
@@ -10,27 +10,23 @@
import com.vci.corba.omd.tim.TypeIndexServicePrx;
import com.vci.corba.omd.OMDService;
import com.vci.corba.omd.atm.AttPoolServicePrx;
+
+import java.util.Date;
+
import com.vci.common.ServiceNames;
import com.vci.corba.common.VCIError;
import com.vci.corba.omd.vrm.VersionRuleServicePrx;
import com.vci.server.BaseService;
import com.vci.server.omd.attribpool.APServiceImpl;
-import com.vci.server.omd.attribpool.cache.APServerCacheUtil;
import com.vci.server.omd.biztype.BTMServiceImpl;
-import com.vci.server.omd.biztype.cache.BizTypeCacheUtil;
import com.vci.server.omd.delegate.SystemConfDelegate;
import com.vci.server.omd.enumtype.EnumServiceImpl;
-import com.vci.server.omd.enumtype.cache.EnumServerCacheUtil;
import com.vci.server.omd.lifecycle.LifeCycleServiceImpl;
-import com.vci.server.omd.lifecycle.cache.LifeCycleCacheUtil;
import com.vci.server.omd.linktype.LinkTypeServiceImpl;
-import com.vci.server.omd.linktype.cache.LinkTypeCacheUtil;
import com.vci.server.omd.qt.QTDefineServiceImpl;
import com.vci.server.omd.statepool.StatePoolServiceImpl;
-import com.vci.server.omd.statepool.cache.StatePoolServerCacheUtil;
import com.vci.server.omd.typeindex.TypeIndexServiceImpl;
import com.vci.server.omd.versionrule.VersionRuleServiceImpl;
-import com.vci.server.omd.versionrule.cache.VRServerCacheUtil;
import com.zeroc.Ice.Current;
public class OMDServiceImpl extends BaseService implements OMDService {
@@ -46,13 +42,13 @@
private QTDServicePrx _qtdService = null;
public OMDServiceImpl() {
- EnumServerCacheUtil.initCache();
- APServerCacheUtil.initCache();
- StatePoolServerCacheUtil.initCache();
- LifeCycleCacheUtil.initCache();
- VRServerCacheUtil.initCache();
- BizTypeCacheUtil.initCache();
- LinkTypeCacheUtil.initCache();
+// EnumServerCacheUtil.initCache();
+// APServerCacheUtil.initCache();
+// StatePoolServerCacheUtil.initCache();
+// LifeCycleCacheUtil.initCache();
+// VRServerCacheUtil.initCache();
+// BizTypeCacheUtil.initCache();
+// LinkTypeCacheUtil.initCache();
}
@Override
@@ -61,6 +57,15 @@
}
@Override
+ public void test(com.zeroc.Ice.Current current) {
+ String op = current.operation;
+ String adapter = current.adapter.getName();
+ String id = current.id.name;
+ String time = new Date().toString();
+ System.out.println(String.format("== %s [OMDService.test] (adapter=%s, id=%s, op=%s)", time, adapter, id, op));
+ }
+
+ @Override
public SystemModelData getSysModelData(String[] boTypes, Current current) throws VCIError {
try {
return SystemConfDelegate.getInstance().getAllConfigurationData(new String[0]);
diff --git a/Source/Service/OMDService/src/com/vci/server/omd/qt/QTDefineBoxService.java b/Source/Service/OMDService/src/com/vci/server/omd/qt/QTDefineBoxService.java
index 941e563..b683b80 100644
--- a/Source/Service/OMDService/src/com/vci/server/omd/qt/QTDefineBoxService.java
+++ b/Source/Service/OMDService/src/com/vci/server/omd/qt/QTDefineBoxService.java
@@ -19,7 +19,7 @@
LOGGER.info("start servant: QTDService");
// IceBox
// 鍒涘缓objectAdapter锛岃繖閲屽拰service鍚屽悕
- _adapter = communicator.createObjectAdapter(name);
+ _adapter = communicator.createObjectAdapter(name + "Adapter");
// 鍒涘缓servant
com.zeroc.Ice.Object object = new QTDefineServiceImpl();
id = Util.stringToIdentity(name);
diff --git a/Source/Service/OMDService/src/com/vci/server/omd/qt/QTDefineServiceImpl.java b/Source/Service/OMDService/src/com/vci/server/omd/qt/QTDefineServiceImpl.java
index 5acdf85..513089c 100644
--- a/Source/Service/OMDService/src/com/vci/server/omd/qt/QTDefineServiceImpl.java
+++ b/Source/Service/OMDService/src/com/vci/server/omd/qt/QTDefineServiceImpl.java
@@ -10,7 +10,7 @@
import com.vci.corba.omd.qtm.QTDService;
import com.vci.corba.omd.qtm.QTInfo;
-public class QTDefineServiceImpl extends BaseService implements QTDService{
+public class QTDefineServiceImpl implements QTDService{
// private DateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd");
@@ -24,11 +24,6 @@
public QTDefineServiceImpl() {
QTDServerCacheUtil.initCache();
- }
-
- @Override
- public String getServiceName() {
- return ServiceNames.QTDSERVICE;
}
/**
diff --git a/Source/Service/OQService/build-jar.xml b/Source/Service/OQService/build-jar.xml
index ccca016..4fa4c98 100644
--- a/Source/Service/OQService/build-jar.xml
+++ b/Source/Service/OQService/build-jar.xml
@@ -2,7 +2,7 @@
<!--classes.jar; src.jar-->
<project name = "platform-OQService" default = "build-OQService-jar" basedir = ".">
- <property file="build.properties"/>
+ <property file="../../build.properties"/>
<target name="time">
<tstamp>
@@ -30,5 +30,7 @@
<include name="**.jar" />
</fileset>
</copy>
+
+
</target>
</project>
\ No newline at end of file
diff --git a/Source/Service/OQService/build.properties b/Source/Service/OQService/build.properties
index 4f8a188..c626764 100644
--- a/Source/Service/OQService/build.properties
+++ b/Source/Service/OQService/build.properties
@@ -9,4 +9,8 @@
service.dir=${lib.dir}/service
client.dir=${lib.dir}/client
+grid.app = ${app_home}/../grid/app
+grid.common=${grid.app}/common
+grid.service=${grid.app}/service
+
platform.version=2024
\ No newline at end of file
diff --git a/Source/Service/OQService/dist/OQService.jar b/Source/Service/OQService/dist/OQService.jar
index 82a3e7a..9a2ac1a 100644
--- a/Source/Service/OQService/dist/OQService.jar
+++ b/Source/Service/OQService/dist/OQService.jar
Binary files differ
diff --git a/Source/Service/OQService/src/com/vci/server/ObjectQueryBoxService.java b/Source/Service/OQService/src/com/vci/server/ObjectQueryBoxService.java
index 82510b3..224b4a4 100644
--- a/Source/Service/OQService/src/com/vci/server/ObjectQueryBoxService.java
+++ b/Source/Service/OQService/src/com/vci/server/ObjectQueryBoxService.java
@@ -3,6 +3,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.mw.ServerContextInterceptor;
import com.vci.server.query.ObjectQueryServiceImpl;
import com.zeroc.Ice.Communicator;
import com.zeroc.Ice.Identity;
@@ -17,18 +19,19 @@
@Override
public void start(String name, Communicator communicator, String[] args) {
- LOGGER.info("start servant: OMDService");
+ LOGGER.info("start servant: " + name);
+
+ HibernateSessionFactory.getConfiguration();
+
// IceBox
// 鍒涘缓objectAdapter锛岃繖閲屽拰service鍚屽悕
_adapter = communicator.createObjectAdapter(name);
// 鍒涘缓servant
com.zeroc.Ice.Object object = new ObjectQueryServiceImpl();
- id = Util.stringToIdentity(name);
- // _adapter.add(object, communicator.stringToIdentity(name));
- _adapter.add(object, id);
+ _adapter.add(new ServerContextInterceptor(object), Util.stringToIdentity(name));
// 婵�娲�
_adapter.activate();
- LOGGER.info("start servant success: OMDService");
+ LOGGER.info("start servant success: " + name);
}
@Override
diff --git a/Source/Service/OQService/src/com/vci/server/query/ObjectQueryServiceImpl.java b/Source/Service/OQService/src/com/vci/server/query/ObjectQueryServiceImpl.java
index f1b5b2b..f86216b 100644
--- a/Source/Service/OQService/src/com/vci/server/query/ObjectQueryServiceImpl.java
+++ b/Source/Service/OQService/src/com/vci/server/query/ObjectQueryServiceImpl.java
@@ -1,5 +1,7 @@
package com.vci.server.query;
+import java.util.Date;
+
import org.omg.CORBA.IntHolder;
import com.vci.server.BaseService;
@@ -30,6 +32,16 @@
return ServiceNames.OQSERVICE;
}
+
+ @Override
+ public void test(com.zeroc.Ice.Current current) {
+ String op = current.operation;
+ String adapter = current.adapter.getName();
+ String id = current.id.name;
+ String time = new Date().toString();
+ System.out.println(String.format("== %s [ObjectQueryService.test] (adapter=%s, id=%s, op=%s)", time, adapter, id, op));
+ }
+
/**
* 鏍规嵁鏌ヨ妯℃澘鍚�, 鏌ヨ妯℃澘鍐呭鏌ヨ涓氬姟瀵硅薄
*/
diff --git a/Source/Service/OQService/src/com/vci/server/query/parsers/Parser.java b/Source/Service/OQService/src/com/vci/server/query/parsers/Parser.java
index 4253388..9d8d07c 100644
--- a/Source/Service/OQService/src/com/vci/server/query/parsers/Parser.java
+++ b/Source/Service/OQService/src/com/vci/server/query/parsers/Parser.java
@@ -2,6 +2,7 @@
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -1082,32 +1083,46 @@
arExtAttr.add("CURRENTUSER.ID=" + vcii.userID);
arExtAttr.add("CURRENTUSER.NAME=" + vcii.userName);
arExtAttr.add("CURRENTUSER.SECRETGRADE=" + vcii.secretGrade);
- if (vcii.groupNames.length > 0)
+ if (vcii.groupNames != null && vcii.groupNames.length > 0)
arExtAttr.add("CURRENTUSER.GROUPNUM=" + vcii.groupNames[0]);
}
- arExtAttr.addAll(Arrays.asList(extAttribs));
- extAttribs = arExtAttr.toArray(new String[0]);
+ if (extAttribs != null)
+ Collections.addAll(arExtAttr, extAttribs);
+// extAttribs = arExtAttr.toArray(new String[0]);
- value.users = users;
- value.roles = getStringFormArray(roleNames);
- if(groupNames.length > 0){
+ if (users != null)
+ value.users = users;
+ else
+ value.users = "";
+
+ if (roleNames != null)
+ value.roles = String.join(",", roleNames);
+ else
+ value.roles = "";
+
+ if(groupNames != null && groupNames.length > 0){
value.userGroups = groupNames[0];
}
- value.paramValues = getStringFormArray(extAttribs);
+ value.paramValues = String.join(",", arExtAttr);
return value;
}
- private String getStringFormArray(String[] array){
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < array.length; i++) {
- sb.append(array[i]);
- if(i != array.length - 1){
- sb.append(",");
- }
- }
- return sb.toString();
- }
+// private String getStringFormArray(Collection<String> array){
+// if (array == null)
+// return "";
+//
+// return String.join(",", array);
+//
+//// StringBuilder sb = new StringBuilder();
+//// for (int i = 0; i < array.size(); i++) {
+//// sb.append(array.);
+//// if(i != array.length - 1){
+//// sb.append(",");
+//// }
+//// }
+//// return sb.toString();
+// }
/**
* 鑾峰彇鎺掑簭鏉′欢
diff --git a/Source/Service/ServiceBase/build-jar.xml b/Source/Service/ServiceBase/build-jar.xml
index d46d62f..e7f3032 100644
--- a/Source/Service/ServiceBase/build-jar.xml
+++ b/Source/Service/ServiceBase/build-jar.xml
@@ -2,7 +2,7 @@
<!--classes.jar; src.jar-->
<project name = "platform-ServiceBase" default = "build-ServiceBase-jar" basedir = ".">
- <property file="build.properties"/>
+ <property file="../../build.properties"/>
<target name="time">
<tstamp>
@@ -30,5 +30,7 @@
<include name="**.jar" />
</fileset>
</copy>
+
+
</target>
</project>
\ No newline at end of file
diff --git a/Source/Service/ServiceBase/build.properties b/Source/Service/ServiceBase/build.properties
index 4f8a188..c626764 100644
--- a/Source/Service/ServiceBase/build.properties
+++ b/Source/Service/ServiceBase/build.properties
@@ -9,4 +9,8 @@
service.dir=${lib.dir}/service
client.dir=${lib.dir}/client
+grid.app = ${app_home}/../grid/app
+grid.common=${grid.app}/common
+grid.service=${grid.app}/service
+
platform.version=2024
\ No newline at end of file
diff --git a/Source/Service/ServiceBase/dist/ServiceBase.jar b/Source/Service/ServiceBase/dist/ServiceBase.jar
index d72d5ed..b4bbe99 100644
--- a/Source/Service/ServiceBase/dist/ServiceBase.jar
+++ b/Source/Service/ServiceBase/dist/ServiceBase.jar
Binary files differ
diff --git a/Source/Service/ServiceBase/src/com/vci/server/PltIceBoxServer.java b/Source/Service/ServiceBase/src/com/vci/server/PltIceBoxServer.java
new file mode 100644
index 0000000..05f2681
--- /dev/null
+++ b/Source/Service/ServiceBase/src/com/vci/server/PltIceBoxServer.java
@@ -0,0 +1,140 @@
+package com.vci.server;
+
+import com.vci.server.base.log.PltLogger;
+import com.zeroc.Ice.Communicator;
+import com.zeroc.Ice.InitializationData;
+import com.zeroc.Ice.Util;
+import com.zeroc.IceBox.ServiceManagerI;
+
+public class PltIceBoxServer {
+ static class ShutdownHook extends Thread
+ {
+ private com.zeroc.Ice.Communicator _communicator;
+ private final java.lang.Object _doneMutex = new java.lang.Object();
+ private boolean _done = false;
+
+ ShutdownHook(com.zeroc.Ice.Communicator communicator)
+ {
+ _communicator = communicator;
+ }
+
+ @Override
+ public void run()
+ {
+ _communicator.shutdown();
+
+ synchronized(_doneMutex)
+ {
+ //
+ // Wait on the server to finish shutting down before exiting the ShutdownHook. This ensures
+ // that all IceBox services have had a chance to shutdown cleanly before the JVM terminates.
+ //
+ while(!_done)
+ {
+ try
+ {
+ _doneMutex.wait();
+ }
+ catch(InterruptedException ex)
+ {
+ break;
+ }
+ }
+ }
+ }
+
+ public void done()
+ {
+ synchronized(_doneMutex)
+ {
+ _done = true;
+ _doneMutex.notify();
+ }
+ }
+ }
+
+ private static void usage()
+ {
+ System.err.println("Usage: com.zeroc.IceBox.Server [options] --Ice.Config=<file>\n");
+ System.err.println(
+ "Options:\n" +
+ "-h, --help Show this message.\n" +
+ "-v, --version Display the Ice version."
+ );
+ }
+
+ public static void main(String[] args) {
+// InitializationData initData = new InitializationData();
+// initData.properties = Util.createProperties();
+// initData.properties.setProperty("Ice.Admin.DelayCreation", "1");
+// initData.logger = new Sl4jLogerI("system");
+
+// Server server = new Server();
+// System.exit(server.main("IceBox.Server", args, initData));
+
+ int status = 0;
+ java.util.List<String> argSeq = new java.util.ArrayList<String>();
+
+ InitializationData initData = new InitializationData();
+ initData.properties = Util.createProperties();
+ initData.properties.setProperty("Ice.Admin.DelayCreation", "1");
+ initData.logger = new PltLogger("system");
+ ShutdownHook shutdownHook = null;
+
+ try(Communicator communicator = Util.initialize(args, initData, argSeq))
+ {
+ shutdownHook = new ShutdownHook(communicator);
+ Runtime.getRuntime().addShutdownHook(shutdownHook);
+
+ status = run(communicator, argSeq);
+ }
+ finally
+ {
+ if(shutdownHook != null)
+ {
+ shutdownHook.done();
+ }
+ }
+
+ System.exit(status);
+
+ }
+
+ private static int run(Communicator communicator, java.util.List<String> argSeq)
+ {
+ final String prefix = "IceBox.Service.";
+ com.zeroc.Ice.Properties properties = communicator.getProperties();
+ java.util.Map<String, String> services = properties.getPropertiesForPrefix(prefix);
+
+ java.util.List<String> iceBoxArgs = new java.util.ArrayList<String>(argSeq);
+
+ for(String key : services.keySet())
+ {
+ String name = key.substring(prefix.length());
+ iceBoxArgs.removeIf(v -> v.startsWith("--" + name));
+ }
+
+ for(String arg : iceBoxArgs)
+ {
+ if(arg.equals("-h") || arg.equals("--help"))
+ {
+ usage();
+ return 0;
+ }
+ else if(arg.equals("-v") || arg.equals("--version"))
+ {
+ System.out.println(com.zeroc.Ice.Util.stringVersion());
+ return 0;
+ }
+ else
+ {
+ System.err.println("IceBox.Server: unknown option `" + arg + "'");
+ usage();
+ return 1;
+ }
+ }
+
+ ServiceManagerI serviceManagerImpl = new ServiceManagerI(communicator, argSeq.toArray(new String[0]));
+ return serviceManagerImpl.run();
+ }
+}
diff --git a/Source/Service/ServiceBase/src/com/vci/server/base/log/PltLogger.java b/Source/Service/ServiceBase/src/com/vci/server/base/log/PltLogger.java
new file mode 100644
index 0000000..049c557
--- /dev/null
+++ b/Source/Service/ServiceBase/src/com/vci/server/base/log/PltLogger.java
@@ -0,0 +1,54 @@
+package com.vci.server.base.log;
+
+import org.slf4j.LoggerFactory;
+import com.zeroc.Ice.Logger;
+
+public class PltLogger implements com.zeroc.Ice.Logger {
+ private final org.slf4j.Logger logger;
+
+ public PltLogger(String name) {
+ logger = LoggerFactory.getLogger(name);
+ }
+
+ public void info(String message) {
+ logger.info(message);
+
+ }
+
+ @Override
+ public void print(String message) {
+ logger.info(message);
+
+ }
+
+ public void debug(String category, String message) {
+ logger.debug(category + " " + message);
+ }
+
+ @Override
+ public void trace(String category, String message) {
+ logger.debug(category + " " + message);
+ }
+
+ @Override
+ public void warning(String message) {
+ logger.warn(message);
+ }
+
+ @Override
+ public void error(String message) {
+ logger.error(message);
+
+ }
+
+ @Override
+ public Logger cloneWithPrefix(String prefix) {
+ return new PltLogger(prefix);
+ }
+
+ @Override
+ public String getPrefix() {
+
+ return logger.getName();
+ }
+}
diff --git a/Source/Service/ServiceBase/src/com/vci/server/base/persistence/dao/HibernateSessionFactory.java b/Source/Service/ServiceBase/src/com/vci/server/base/persistence/dao/HibernateSessionFactory.java
index 45654ab..1c40df4 100644
--- a/Source/Service/ServiceBase/src/com/vci/server/base/persistence/dao/HibernateSessionFactory.java
+++ b/Source/Service/ServiceBase/src/com/vci/server/base/persistence/dao/HibernateSessionFactory.java
@@ -1,15 +1,11 @@
package com.vci.server.base.persistence.dao;
import java.io.File;
-import java.io.IOException;
import java.io.InputStream;
-import java.net.URL;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
-import java.util.Enumeration;
import java.util.List;
-import java.util.ArrayList;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
@@ -44,8 +40,8 @@
*/
//private static final Log log = LogFactory.getLog(HibernateSessionFactory.class);
private static String CONFIG_FILE_LOCATION="properties/hibernate.cfg.xml";
- //private static String MAP_FILE_RESOURCE="/properties/hibernate.map.xml";
- private static String MAP_FILE_RESOURCE="hibernate.map.xml";
+ private static String MAP_FILE_RESOURCE="/properties/hibernate.map.xml";
+ //private static String MAP_FILE_RESOURCE="hibernate.map.xml";
private static final ThreadLocal<VciSession> threadLocal = new ThreadLocal<VciSession>();
private static Configuration configuration = new Configuration();
@@ -61,7 +57,9 @@
configuration.configure(file);
- //loadHbmFiles();
+ ServerWithLog4j.logger.info("鍔犺浇Hibernate瀵硅薄鏄犲皠:Begin");
+ loadHbmFiles();
+ ServerWithLog4j.logger.info("鍔犺浇Hibernate瀵硅薄鏄犲皠:End");
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
@@ -130,7 +128,9 @@
File file = new File(CONFIG_FILE_LOCATION);
configuration.configure(file);
+ ServerWithLog4j.logger.info("鍔犺浇Hibernate瀵硅薄鏄犲皠:Begin");
loadHbmFiles();
+ ServerWithLog4j.logger.info("鍔犺浇Hibernate瀵硅薄鏄犲皠:End");
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
@@ -235,16 +235,16 @@
}
private static void loadHbmFiles() {
- ServerWithLog4j.logger.info("鍔犺浇Hibernate瀵硅薄鏄犲皠");
try {
- List<InputStream> iss = loadResources(MAP_FILE_RESOURCE, HibernateSessionFactory.class.getClassLoader());
- //InputStream is = HibernateSessionFactory.class.getResourceAsStream(MAP_FILE_RESOURCE);
- //if (is != null)
- for (InputStream is : iss)
+ //List<InputStream> iss = loadResources(MAP_FILE_RESOURCE, HibernateSessionFactory.class.getClassLoader());
+ //List<InputStream> iss = loadResources(MAP_FILE_RESOURCE, null);
+ InputStream is = HibernateSessionFactory.class.getResourceAsStream(MAP_FILE_RESOURCE);
+ //for (InputStream is : iss)
+ if (is != null)
{
SAXReader reader = new SAXReader();
Document doc;
- doc = reader.read(is);
+ doc = reader.read(is);
Element root = doc.getRootElement();
List<?> lst = root.elements("mapping");
@@ -260,20 +260,19 @@
// TODO Auto-generated catch block
e.printStackTrace();
ServerWithLog4j.logger.error("鍔犺浇瀵硅薄鏄犲皠澶辫触", e);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
}
}
- private static List<InputStream> loadResources(final String name, final ClassLoader classLoader) throws IOException {
- final List<InputStream> list = new ArrayList<InputStream>();
- final Enumeration<URL> systemResources =
- (classLoader == null ? ClassLoader.getSystemClassLoader() : classLoader)
- .getResources(name);
- while (systemResources.hasMoreElements()) {
- list.add(systemResources.nextElement().openStream());
- }
- return list;
- }
+// private static List<InputStream> loadResources(final String name, final ClassLoader classLoader) throws IOException {
+// final List<InputStream> list = new ArrayList<InputStream>();
+// final Enumeration<URL> systemResources =
+// (classLoader == null ? ClassLoader.getSystemClassLoader() : classLoader)
+// .getResources(name);
+// while (systemResources.hasMoreElements()) {
+// ServerWithLog4j.logger.info(MAP_FILE_RESOURCE + ":" + systemResources.nextElement().getPath());
+//
+// list.add(systemResources.nextElement().openStream());
+// }
+// return list;
+// }
}
diff --git a/Source/Service/ServiceBase/src/com/vci/server/base/utility/LogRecordUtil.java b/Source/Service/ServiceBase/src/com/vci/server/base/utility/LogRecordUtil.java
new file mode 100644
index 0000000..3f2fe21
--- /dev/null
+++ b/Source/Service/ServiceBase/src/com/vci/server/base/utility/LogRecordUtil.java
@@ -0,0 +1,216 @@
+package com.vci.server.base.utility;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.vci.common.objects.UserEntity;
+import com.vci.corba.common.VCIError;
+import com.vci.corba.log.LogServicePrx;
+import com.vci.corba.log.data.LogType;
+import com.vci.corba.log.data.RefObj;
+import com.vci.corba.omd.data.BusinessObject;
+import com.vci.corba.common.data.UserEntityInfo;
+import com.vci.corba.common.data.VCIInvocationInfo;
+import com.vci.server.base.delegate.UserEntityDelegate;
+import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+
+public class LogRecordUtil {
+
+ public static void saveLoginLog(boolean success, String content, UserEntityInfo userEnt) throws VCIError{
+
+ if (userEnt == null)
+ userEnt = getUserEntity();
+
+ LogServicePrx logService = ServerServiceProvider.getLogService();
+
+ logService.saveLoginLog(success, content, userEnt);
+ }
+
+ public static void saveLogoutLog(String content, UserEntityInfo userEnt) throws VCIError{
+ if (userEnt == null)
+ userEnt = getUserEntity();
+
+ LogServicePrx logService = ServerServiceProvider.getLogService();
+
+ logService.saveLogoutLog(content, userEnt);
+ }
+
+ /**
+ * 鏃ュ織璁板綍
+ * @param userEntity 鐢ㄦ埛瀵硅薄
+ * @param optType 鎿嶄綔绫诲埆
+ * @param resContent 鎿嶄綔缁撴瀯
+ * @param logType 鏃ュ織绫诲瀷
+ * @throws VCIError
+ */
+ public static void writeLog(UserEntity userEnt, String optType, String result, String content, LogType logType,String dataObjId) throws VCIError{
+
+ LogServicePrx logService = ServerServiceProvider.getLogService();
+
+ logService.saveLog(result, content, optType, logType, dataObjId, UserEntityDelegate.changeUserEntityToInfo(userEnt));
+ }
+
+ /**
+ * 鏃ュ織璁板綍
+ * @param optType
+ * @param result
+ * @param content
+ * @param logType
+ * @param dataObjId
+ * @throws VCIError
+ */
+ public static void writeGeneralSuccessLog(BusinessObject bo, String optType) throws VCIError{
+ writeGeneralLog(bo, optType, "鎿嶄綔鎴愬姛");
+ }
+
+ public static void writeGeneralFailLog(BusinessObject bo, String optType) throws VCIError{
+ writeGeneralLog(bo, optType, "鎿嶄綔澶辫触");
+ }
+
+ public static void writeGeneralLog(BusinessObject bo, String optType, String result) throws VCIError{
+
+ UserEntityInfo userEnt = getUserEntity();
+
+ LogServicePrx logService = ServerServiceProvider.getLogService();
+
+ String logInfo = StringUtils.isNotBlank(bo.name)?bo.name:(StringUtils.isNotBlank(bo.id)?bo.id:bo.oid);
+
+ logService.saveLog(result, logInfo, optType, LogType.General, bo.id, userEnt);
+ }
+
+ private static UserEntityInfo getUserEntity() {
+ //鏃ュ織璁板綍
+ VCIInvocationInfo viinfo = HibernateSessionFactory.getVciSessionInfo();
+ String ip = "127.0.0.1";
+ if(viinfo!=null){
+ ip = viinfo.clientIPInfo == null||"".equals(viinfo.clientIPInfo) ? "127.0.0.1" : viinfo.clientIPInfo;
+ }
+
+ UserEntityInfo userEnt = new UserEntityInfo();
+ userEnt.userName = viinfo.userName;
+ userEnt.ip = ip;
+ return userEnt;
+ }
+
+ /**
+ * 鏃ュ織璁板綍
+ * @param userEnt
+ * @param optType
+ * @param result
+ * @param content
+ * @param logType
+ * @param dataObjId
+ * @throws VCIError
+ */
+ public static void writeLog(UserEntityInfo userEnt, String optType, String result, String content, LogType logType,String dataObjId) throws VCIError{
+
+ LogServicePrx logService = ServerServiceProvider.getLogService();
+
+ logService.saveLog(result, content, optType, logType, dataObjId, userEnt);
+ }
+
+// protected void recordLog(String user, String module, String ip, String operation, String type, String objName, String oid) throws VCIError {
+// userEntity.userName = user;
+// if(module.equalsIgnoreCase(type)){
+// userEntity.modules = getBtmShowName(module);
+// }else{
+// userEntity.modules = module;
+// }
+// userEntity.ip = ip;
+//
+// String con = "鎿嶄綔鐨勬暟鎹槸->" + getBtmShowName(type) + ":" + objName;
+// //璁板綍鏃ュ織
+//
+// ServerServiceProvider.getFrameService().savelogGeneralOperation("鎿嶄綔鎴愬姛", con, userEntity, oid, type);
+// //LogRecordUtil.writeLog(userEntity, operation, "鎿嶄綔鎴愬姛", "鎿嶄綔鐨勬暟鎹槸->" + getBtmShowName(type) + ":" + objName, LogType.GeneralOperation, oid);
+// }
+
+ /**
+ * 鎵归噺瀛樺偍瀵硅薄鎿嶄綔鏃ュ織
+ * @param userEnt
+ * @param bos
+ * @param operation
+ * @param result
+ * @throws VCIError
+ */
+ public static void batchWriteLog(UserEntityInfo userEnt, BusinessObject[] bos, String operation, String result) throws VCIError{
+ if (bos == null || bos.length < 1) {
+ return;
+ }
+
+ LogServicePrx logService = ServerServiceProvider.getLogService();
+
+ userEnt.modules = "bo";
+
+ RefObj[] ros = new RefObj[bos.length];
+ for (int i = 0; i < bos.length; i++) {
+ BusinessObject bo = bos[i];
+
+ RefObj ro = new RefObj();
+ ro.oid = bo.oid;
+ ro.btName = bo.btName;
+ ro.name = bo.name;
+ ro.id = bo.id;
+
+ ros[i] = ro;
+ }
+
+ try {
+ logService.batchSaveObjLog(ros, operation, result, userEnt);
+ } catch (VCIError e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 鎵归噺淇濆瓨瀵硅薄鎿嶄綔鏃ュ織
+ * @param bos
+ * @param operation
+ * @param result
+ * @throws VCIError
+ */
+ public static void batchWriteLog(BusinessObject[] bos, String operation) throws VCIError{
+ batchWriteLog(bos, operation, "鎿嶄綔鎴愬姛");
+ }
+
+ public static void batchWriteLog(BusinessObject[] bos, String operation, String result) throws VCIError{
+ if (bos == null || bos.length < 1) {
+ return;
+ }
+
+ //鏃ュ織璁板綍
+ VCIInvocationInfo viinfo = HibernateSessionFactory.getVciSessionInfo();
+ String ip = "127.0.0.1";
+ if(viinfo!=null){
+ ip = viinfo.clientIPInfo == null||"".equals(viinfo.clientIPInfo) ?"127.0.0.1":viinfo.clientIPInfo;
+ }
+
+ UserEntityInfo userEnt = new UserEntityInfo();
+ userEnt.userName = viinfo.userName;
+ userEnt.ip = ip;
+
+ LogServicePrx logService = ServerServiceProvider.getLogService();
+
+ userEnt.modules = "bo";
+
+ RefObj[] ros = new RefObj[bos.length];
+ for (int i = 0; i < bos.length; i++) {
+ RefObj ro = new RefObj();
+
+ BusinessObject bo = bos[i];
+
+ ro.oid = bo.oid;
+ ro.btName = bo.btName;
+ ro.name = bo.name;
+ ro.id = bo.id;
+
+ ros[i] = ro;
+ }
+
+ try {
+ logService.batchSaveObjLog(ros, operation, result, userEnt);
+ } catch (VCIError e) {
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/Source/Service/ServiceBase/src/com/vci/server/base/utility/ServerServiceProvider.java b/Source/Service/ServiceBase/src/com/vci/server/base/utility/ServerServiceProvider.java
index 21ac8dc..5af0ce8 100644
--- a/Source/Service/ServiceBase/src/com/vci/server/base/utility/ServerServiceProvider.java
+++ b/Source/Service/ServiceBase/src/com/vci/server/base/utility/ServerServiceProvider.java
@@ -7,12 +7,13 @@
import com.vci.common.resource.IceClientProperties;
import com.vci.corba.common.VCIError;
import com.vci.corba.bofactory.BOFactoryServicePrx;
-import com.vci.corba.framework.method.FrameworkServicePrx;
+import com.vci.corba.framework.FrameworkServicePrx;
+import com.vci.corba.log.LogServicePrx;
import com.vci.corba.omd.OMDServicePrx;
import com.vci.corba.portal.PortalServicePrx;
import com.vci.corba.query.ObjectQueryServicePrx;
import com.vci.corba.volume.VolumeServicePrx;
-import com.vci.corba.workflow.method.WorkflowServicePrx;
+import com.vci.corba.workflow.WorkflowServicePrx;
import com.zeroc.Ice.Communicator;
import com.zeroc.Ice.Current;
import com.zeroc.Ice.ObjectPrx;
@@ -65,6 +66,45 @@
}
/**
+ * 鑾峰彇绯荤粺璇ユ鏋舵湇鍔′唬鐞�
+ * @return
+ */
+ public static LogServicePrx getLogService(Current current) {
+ try {
+ ObjectPrx prx = getObjectByName(current.adapter.getCommunicator(), ServiceNames.LOGSERVICE);
+
+ LogServicePrx prxTemp = LogServicePrx.uncheckedCast(prx);
+ return prxTemp.ice_context(current.ctx);
+ } catch (Exception e) {
+ //e.printStackTrace();
+ ServerWithLog4j.logger.error(e);
+ }
+
+ return null;
+ }
+
+ /**
+ * 鑾峰彇绯荤粺璇ユ鏋舵湇鍔′唬鐞�
+ * @return
+ * @throws Exception
+ */
+ public static LogServicePrx getLogService() throws VCIError {
+ try {
+ Current current = threadLocal.get();
+ if (current == null)
+ throw new VCIError("ServerServiceProvider-0001", new String[] {"鑾峰彇褰撳墠涓婁笅鏂囧け璐ワ紒"});
+
+ ObjectPrx prx = getObjectByName(current.adapter.getCommunicator(), ServiceNames.LOGSERVICE);
+
+ LogServicePrx prxTemp = LogServicePrx.uncheckedCast(prx);
+ return prxTemp.ice_context(current.ctx);
+ } catch (VCIError e) {
+ //e.printStackTrace();
+ ServerWithLog4j.logger.error(e);
+ throw e;
+ }
+ }
+ /**
* 鑾峰彇绯荤粺鎺堟潈璁よ瘉妗嗘灦鏈嶅姟浠g悊
* @return
*/
diff --git a/Source/Service/ServiceBase/src/com/vci/server/cache/OrgCacheProvider.java b/Source/Service/ServiceBase/src/com/vci/server/cache/OrgCacheProvider.java
index afc9eb4..9ef3aae 100644
--- a/Source/Service/ServiceBase/src/com/vci/server/cache/OrgCacheProvider.java
+++ b/Source/Service/ServiceBase/src/com/vci/server/cache/OrgCacheProvider.java
@@ -22,6 +22,18 @@
return JSONObject.parseObject(json, UserInfo.class);
}
+ public static UserInfo getUserByID(String userId) {
+ String userName = RedisUtil.getInstance().hget(CacheNames.USERS, userId);
+ if (StringUtils.isBlank(userName))
+ return null;
+
+ String json = RedisUtil.getInstance().hget(CacheNames.USERS, userName.toLowerCase());
+ if (StringUtils.isBlank(json))
+ return null;
+
+ return JSONObject.parseObject(json, UserInfo.class);
+ }
+
public static UserInfo[] getUsers(String[] names) {
List<UserInfo> lstObj = new ArrayList<UserInfo>();
diff --git a/Source/Service/ServiceBase/src/com/vci/server/mw/ServerContextInterceptor.java b/Source/Service/ServiceBase/src/com/vci/server/mw/ServerContextInterceptor.java
index 3ee3573..5e68c54 100644
--- a/Source/Service/ServiceBase/src/com/vci/server/mw/ServerContextInterceptor.java
+++ b/Source/Service/ServiceBase/src/com/vci/server/mw/ServerContextInterceptor.java
@@ -50,9 +50,9 @@
String op = current.operation;
-// if (_lstOP.contains(op)) {
-// return _servant.ice_dispatch(request);
-// }
+ if (_lstOP.contains(op)) {
+ return _servant.ice_dispatch(request);
+ }
String serviceName = "";
if (_servant instanceof BaseService) {
diff --git a/Source/Service/ServiceBase/src/properties/logback.xml b/Source/Service/ServiceBase/src/properties/logback.xml
new file mode 100644
index 0000000..d9f13eb
--- /dev/null
+++ b/Source/Service/ServiceBase/src/properties/logback.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="true" >
+ <appender name="Console-Appender" class="ch.qos.logback.core.ConsoleAppender">
+ <layout>
+ <pattern>%msg%n</pattern>
+ </layout>
+ </appender>
+ <root>
+ <appender-ref ref="Console-Appender" />
+ </root>
+</configuration>
\ No newline at end of file
diff --git a/Source/Service/UIService/build-jar.xml b/Source/Service/UIService/build-jar.xml
index 0803d70..696a8d3 100644
--- a/Source/Service/UIService/build-jar.xml
+++ b/Source/Service/UIService/build-jar.xml
@@ -2,7 +2,7 @@
<!--classes.jar; src.jar-->
<project name = "platform-UIService" default = "build-UIService-jar" basedir = ".">
- <property file="build.properties"/>
+ <property file="../../build.properties"/>
<target name="time">
<tstamp>
@@ -30,5 +30,7 @@
<include name="**.jar" />
</fileset>
</copy>
+
+
</target>
</project>
\ No newline at end of file
diff --git a/Source/Service/UIService/build.properties b/Source/Service/UIService/build.properties
index 4f8a188..c626764 100644
--- a/Source/Service/UIService/build.properties
+++ b/Source/Service/UIService/build.properties
@@ -9,4 +9,8 @@
service.dir=${lib.dir}/service
client.dir=${lib.dir}/client
+grid.app = ${app_home}/../grid/app
+grid.common=${grid.app}/common
+grid.service=${grid.app}/service
+
platform.version=2024
\ No newline at end of file
diff --git a/Source/Service/UIService/dist/UIService.jar b/Source/Service/UIService/dist/UIService.jar
index 1168791..cc79c97 100644
--- a/Source/Service/UIService/dist/UIService.jar
+++ b/Source/Service/UIService/dist/UIService.jar
Binary files differ
diff --git a/Source/Service/UIService/src/com/vci/server/UIBoxService.java b/Source/Service/UIService/src/com/vci/server/UIBoxService.java
index 5f60485..07c35b2 100644
--- a/Source/Service/UIService/src/com/vci/server/UIBoxService.java
+++ b/Source/Service/UIService/src/com/vci/server/UIBoxService.java
@@ -3,6 +3,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.mw.ServerContextInterceptor;
import com.vci.server.portal.PortalServiceImpl;
import com.zeroc.Ice.Communicator;
import com.zeroc.Ice.Identity;
@@ -17,18 +19,19 @@
@Override
public void start(String name, Communicator communicator, String[] args) {
- LOGGER.info("start servant: UIService");
+ LOGGER.info("start servant: " + name);
+
+ HibernateSessionFactory.getConfiguration();
+
// IceBox
// 鍒涘缓objectAdapter锛岃繖閲屽拰service鍚屽悕
_adapter = communicator.createObjectAdapter(name);
// 鍒涘缓servant
com.zeroc.Ice.Object object = new PortalServiceImpl();
- id = Util.stringToIdentity(name);
- // _adapter.add(object, communicator.stringToIdentity(name));
- _adapter.add(object, id);
+ _adapter.add(new ServerContextInterceptor(object), Util.stringToIdentity(name));
// 婵�娲�
_adapter.activate();
- LOGGER.info("start servant success: UIService");
+ LOGGER.info("start servant success: " + name);
}
@Override
diff --git a/Source/Service/UIService/src/com/vci/server/portal/PortalServiceImpl.java b/Source/Service/UIService/src/com/vci/server/portal/PortalServiceImpl.java
index 2df6d3b..fcb5be6 100644
--- a/Source/Service/UIService/src/com/vci/server/portal/PortalServiceImpl.java
+++ b/Source/Service/UIService/src/com/vci/server/portal/PortalServiceImpl.java
@@ -1,5 +1,7 @@
package com.vci.server.portal;
+import java.util.Date;
+
import org.omg.CORBA.IntHolder;
import com.vci.corba.portal.PortalService;
@@ -17,16 +19,6 @@
import com.vci.server.BaseService;
import com.vci.server.base.exception.ExceptionLocalHandler;
import com.vci.server.portal.delegate.PortalServiceDelegate;
-import com.vci.server.portal.cache.ActionCacheUtil;
-import com.vci.server.portal.cache.ActionClsCacheUtil;
-import com.vci.server.portal.cache.ActionParamCacheUtil;
-import com.vci.server.portal.cache.ButtonParamCacheUtil;
-import com.vci.server.portal.cache.ComponentBtnCacheUtil;
-import com.vci.server.portal.cache.ComponentCacheUtil;
-import com.vci.server.portal.cache.PortalVICacheUtil;
-import com.vci.server.portal.cache.TabPageCacheUtil;
-import com.vci.server.portal.cache.UIContextCacheUtil;
-//import com.vci.server.portal.delegate.IPortalServiceDelegate;
import com.zeroc.Ice.Current;
import com.vci.common.ServiceNames;
import com.vci.common.exception.VciExceptionTool;
@@ -37,15 +29,15 @@
PortalServiceDelegate delegate = null;
public PortalServiceImpl() {
- ActionClsCacheUtil.initCache();
- ActionCacheUtil.initCache();
- ActionParamCacheUtil.initCache();
- ComponentCacheUtil.initCache();
- ComponentBtnCacheUtil.initCache();
- ButtonParamCacheUtil.initCache();
- UIContextCacheUtil.initCache();
- PortalVICacheUtil.initCache();
- TabPageCacheUtil.initCache();
+// ActionClsCacheUtil.initCache();
+// ActionCacheUtil.initCache();
+// ActionParamCacheUtil.initCache();
+// ComponentCacheUtil.initCache();
+// ComponentBtnCacheUtil.initCache();
+// ButtonParamCacheUtil.initCache();
+// UIContextCacheUtil.initCache();
+// PortalVICacheUtil.initCache();
+// TabPageCacheUtil.initCache();
}
private VCIError getLocalVciError(String key, Throwable e) {
@@ -64,6 +56,16 @@
return ServiceNames.UISERVICE;
}
+ @Override
+ public void test(com.zeroc.Ice.Current current) {
+ String op = current.operation;
+ String adapter = current.adapter.getName();
+ String id = current.id.name;
+ String time = new Date().toString();
+ System.out.println(String.format("== %s [PortalService.test] (adapter=%s, id=%s, op=%s)", time, adapter, id, op));
+ }
+
+
/**
* 淇濆瓨瑙嗗浘
*/
diff --git a/Source/Service/UIService/src/com/vci/server/portal/cache/ActionCacheUtil.java b/Source/Service/UIService/src/com/vci/server/portal/cache/ActionCacheUtil.java
index 7e9fa59..e6a7081 100644
--- a/Source/Service/UIService/src/com/vci/server/portal/cache/ActionCacheUtil.java
+++ b/Source/Service/UIService/src/com/vci/server/portal/cache/ActionCacheUtil.java
@@ -153,7 +153,7 @@
public void setTypeAction(PLTypeAction typeAction) {
- String temp = RedisUtil.getInstance().hget(getName(), typeAction.typeName.toLowerCase());
+ String temp = RedisUtil.getInstance().hget(getName(), "MAP-" + typeAction.typeName.toLowerCase());
if (StringUtils.isBlank(temp))
return;
@@ -162,7 +162,7 @@
if (!lstOid.contains(typeAction.plOId)) {
lstOid.add(typeAction.plOId);
- RedisUtil.getInstance().hset(getName(), typeAction.typeName.toLowerCase(), String.join(";", lstOid));
+ RedisUtil.getInstance().hset(getName(), "MAP-" + typeAction.typeName.toLowerCase(), String.join(";", lstOid));
}
}
diff --git a/Source/Service/UIService/src/com/vci/server/portal/cache/PortalVICacheUtil.java b/Source/Service/UIService/src/com/vci/server/portal/cache/PortalVICacheUtil.java
index 2d9e193..cd2e611 100644
--- a/Source/Service/UIService/src/com/vci/server/portal/cache/PortalVICacheUtil.java
+++ b/Source/Service/UIService/src/com/vci/server/portal/cache/PortalVICacheUtil.java
@@ -120,12 +120,12 @@
for (String key : mapTemp.keySet()) {
List<String> lstTemp = mapTemp.get(key);
- RedisUtil.getInstance().hset(getName(), "MAP-" + key, String.join(";", lstTemp));
+ RedisUtil.getInstance().hset(getName(), TYPEMAP + key, String.join(";", lstTemp));
}
}
public PortalVI[] getPortalVIArrayByTypeName(String typeName) throws VCIError {
- String temp = RedisUtil.getInstance().hget(getName(), "MAP-" + typeName);
+ String temp = RedisUtil.getInstance().hget(getName(), TYPEMAP + typeName);
if (StringUtils.isBlank(temp))
return new PortalVI[0];
@@ -199,7 +199,7 @@
}
public PortalVI[] getPortalVIByObjTypeAndLikeName(String typeName, String viName) throws VCIError {
- String temp = RedisUtil.getInstance().hget(getName(), typeName);
+ String temp = RedisUtil.getInstance().hget(getName(), TYPEMAP + typeName);
if (StringUtils.isBlank(temp))
return new PortalVI[0];
@@ -216,7 +216,7 @@
}
public PortalVI getPortalVIByCondition(String typeName, int sheetType, String sheetName) throws VCIError {
- String temp = RedisUtil.getInstance().hget(getName(), typeName);
+ String temp = RedisUtil.getInstance().hget(getName(), TYPEMAP + typeName);
if (StringUtils.isBlank(temp))
return null;
@@ -233,7 +233,7 @@
}
public int getPortalVICountByCondition(String typeName, int sheetType, String sheetName) throws VCIError {
- String temp = RedisUtil.getInstance().hget(getName(), typeName);
+ String temp = RedisUtil.getInstance().hget(getName(), TYPEMAP + typeName);
if (StringUtils.isBlank(temp))
return 0;
diff --git a/Source/Service/UIService/src/com/vci/server/portal/cache/UICacheBaseUtil.java b/Source/Service/UIService/src/com/vci/server/portal/cache/UICacheBaseUtil.java
index ca6f6ae..da7f3fe 100644
--- a/Source/Service/UIService/src/com/vci/server/portal/cache/UICacheBaseUtil.java
+++ b/Source/Service/UIService/src/com/vci/server/portal/cache/UICacheBaseUtil.java
@@ -10,6 +10,7 @@
import com.vci.server.cache.redis.RedisUtil;
public abstract class UICacheBaseUtil<T> {//extends BaseCacheTimer {
+ protected static String TYPEMAP = "MAP-";
private String _cacheName = null;
private Class<T> _classType = null;
@@ -34,7 +35,7 @@
String[] keys = map.keySet().toArray(new String[0]);
for (int i = 0; i < keys.length; i++) {
- if (keys[i].startsWith("MAP-"))
+ if (keys[i].startsWith(TYPEMAP))
continue;
String json = map.get(keys[i]);
diff --git a/Source/Service/VciServiceMain/.classpath b/Source/Service/VciServiceMain/.classpath
index 0ba54a4..8e6822c 100644
--- a/Source/Service/VciServiceMain/.classpath
+++ b/Source/Service/VciServiceMain/.classpath
@@ -15,5 +15,7 @@
<classpathentry combineaccessrules="false" kind="src" path="/WFService"/>
<classpathentry combineaccessrules="false" kind="src" path="/WFWorkItem"/>
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Common"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/CacheService"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/LogService"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/Source/Service/VciServiceMain/build.xml b/Source/Service/VciServiceMain/build.xml
index 05f51a3..0ea452d 100644
--- a/Source/Service/VciServiceMain/build.xml
+++ b/Source/Service/VciServiceMain/build.xml
@@ -2,7 +2,7 @@
<!--classes.jar; src.jar-->
<project name = "platform-ServiceMain" default = "build-ServiceMain-jar" basedir = ".">
- <property file="build.properties"/>
+ <property file="../../build.properties"/>
<target name="time">
<tstamp>
diff --git a/Source/Service/VciServiceMain/dist/VciServiceMain.jar b/Source/Service/VciServiceMain/dist/VciServiceMain.jar
index 4311374..aef2c46 100644
--- a/Source/Service/VciServiceMain/dist/VciServiceMain.jar
+++ b/Source/Service/VciServiceMain/dist/VciServiceMain.jar
Binary files differ
diff --git a/Source/Service/VciServiceMain/logs/server_log.log b/Source/Service/VciServiceMain/logs/server_log.log
index ddd299a..e46f361 100644
--- a/Source/Service/VciServiceMain/logs/server_log.log
+++ b/Source/Service/VciServiceMain/logs/server_log.log
@@ -38570,3 +38570,1465 @@
[INFO ] 2024-02-23 11:03:13 [main] ServiceManagerMain:71 - OQService started
[INFO ] 2024-02-23 11:03:13 [main] ServiceManagerMain:71 - FrameService started
[INFO ] 2024-02-23 11:03:13 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-02-27 11:42:23 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-02-27 11:42:23 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-02-27 11:42:23 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-02-27 11:42:23 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-02-27 11:42:26 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-02-27 11:42:27 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-02-27 11:42:27 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-02-27 11:42:31 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-02-27 11:42:31 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-02-27 11:42:31 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-02-27 11:42:31 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-02-27 11:42:31 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-02-27 11:43:06 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[ERROR] 2024-02-27 11:47:05 [Ice.ThreadPool.Server-0] ServerContextInterceptor:95 - dispatch exec throwable exception
+com.vci.corba.common.VCIError: null
+ at com.vci.server.bof.delegate.FactoryBaseDelegate.getLocalString(FactoryBaseDelegate.java:22) ~[bin/:?]
+ at com.vci.server.bof.delegate.BOFactoryServerDelegate.getInfoBusinessObject(BOFactoryServerDelegate.java:189) ~[bin/:?]
+ at com.vci.server.bof.BOFactoryServiceImpl.readBusinessObject(BOFactoryServiceImpl.java:100) ~[bin/:?]
+ at com.vci.corba.bofactory.BOFactoryService._iceD_readBusinessObject(BOFactoryService.java:673) ~[bin/:?]
+ at com.vci.corba.bofactory.BOFactoryService._iceDispatch(BOFactoryService.java:2188) ~[bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) ~[icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+[INFO ] 2024-02-27 13:32:27 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-02-27 13:32:27 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-02-27 13:32:27 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-02-27 13:32:28 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-02-27 13:32:31 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-02-27 13:32:32 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-02-27 13:32:32 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-02-27 13:32:38 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-02-27 13:32:38 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-02-27 13:32:38 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-02-27 13:32:39 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-02-27 13:32:39 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-02-27 14:26:54 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-02-27 14:26:54 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-02-27 14:26:54 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-02-27 14:26:55 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-02-27 14:26:59 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-02-27 14:27:01 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-02-27 14:27:01 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-02-27 14:27:06 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-02-27 14:27:06 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-02-27 14:27:06 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-02-27 14:27:07 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-02-27 14:27:07 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-02-27 17:46:14 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-02-27 17:46:14 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-02-27 17:46:14 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-02-27 17:46:15 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-02-27 17:46:17 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-02-27 17:46:18 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-02-27 17:46:19 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-02-27 17:46:23 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-02-27 17:46:23 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-02-27 17:46:23 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-02-27 17:46:23 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-02-27 17:46:23 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-02-27 17:47:28 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-02-27 17:47:28 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-02-27 17:47:28 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-02-27 17:47:28 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-02-27 17:47:31 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-02-27 17:47:33 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-02-27 17:47:33 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-02-27 17:47:37 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-02-27 17:47:37 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-02-27 17:47:37 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-02-27 17:47:38 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-02-27 17:47:38 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-02-28 09:21:34 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-02-28 09:21:35 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-02-28 09:21:35 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-02-28 09:21:35 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-02-28 09:21:39 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-02-28 09:21:41 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-02-28 09:21:41 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-02-28 09:21:47 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-02-28 09:21:47 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-02-28 09:21:47 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-02-28 09:21:48 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-02-28 09:21:48 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-02-28 11:45:18 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-02-28 11:45:18 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-02-28 11:45:18 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-02-28 11:45:19 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-02-28 11:45:22 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-02-28 11:45:23 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-02-28 11:45:24 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-02-28 11:45:28 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-02-28 11:45:28 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-02-28 11:45:28 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-02-28 11:45:28 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-02-28 11:45:28 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-02-28 14:45:45 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-02-28 14:45:45 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-02-28 14:45:48 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-02-28 14:45:48 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-02-28 14:45:50 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-02-28 14:45:50 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-02-28 14:45:50 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-02-28 14:45:54 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-02-28 14:45:54 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-02-28 14:45:54 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-02-28 14:45:54 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-02-28 14:45:54 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-02-28 16:01:46 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-02-28 16:01:47 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-02-28 16:01:53 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-02-28 16:01:53 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-02-28 16:01:54 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-02-28 16:01:54 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-02-28 16:01:54 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-02-28 16:01:58 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-02-28 16:01:58 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-02-28 16:01:58 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-02-28 16:01:58 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-02-28 16:01:58 [main] ServiceManagerMain:75 - Service Started!
+[ERROR] 2024-02-28 16:02:42 [Ice.ThreadPool.Server-0] ServerContextInterceptor:95 - dispatch exec throwable exception
+com.vci.corba.common.VCIError: null
+ at com.vci.server.bof.delegate.FactoryBaseDelegate.getLocalString(FactoryBaseDelegate.java:22) ~[bin/:?]
+ at com.vci.server.bof.delegate.BOFactoryServerDelegate.getBatchBusinessObjects(BOFactoryServerDelegate.java:251) ~[bin/:?]
+ at com.vci.server.bof.BOFactoryServiceImpl.batchGetBusinessObjects(BOFactoryServiceImpl.java:129) ~[bin/:?]
+ at com.vci.corba.bofactory.BOFactoryService._iceD_batchGetBusinessObjects(BOFactoryService.java:757) ~[bin/:?]
+ at com.vci.corba.bofactory.BOFactoryService._iceDispatch(BOFactoryService.java:2091) ~[bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) ~[icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+[ERROR] 2024-02-28 17:00:38 [Ice.ThreadPool.Server-0] ObjectQueryServiceDelegate:513 - queryBySql Error
+org.hibernate.exception.SQLGrammarException: could not execute query
+ at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2545) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.list(Loader.java:2271) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.query.delegate.ObjectQueryServiceDelegate.queryBySql(ObjectQueryServiceDelegate.java:499) [bin/:?]
+ at com.vci.server.query.ObjectQueryServiceImpl.queryBySql(ObjectQueryServiceImpl.java:137) [bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceD_queryBySql(ObjectQueryService.java:408) [bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceDispatch(ObjectQueryService.java:634) [bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) [icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+Caused by: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 鍛戒护鏈纭粨鏉�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQuery(Loader.java:802) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2542) ~[hibernate3.jar:3.6.10.Final]
+ ... 21 more
+Caused by: oracle.jdbc.OracleDatabaseException: ORA-00933: SQL 鍛戒护鏈纭粨鏉�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:498) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQuery(Loader.java:802) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2542) ~[hibernate3.jar:3.6.10.Final]
+ ... 21 more
+[ERROR] 2024-02-28 17:00:38 [Ice.ThreadPool.Server-0] ServerContextInterceptor:95 - dispatch exec throwable exception
+com.vci.corba.common.VCIError: null
+ at com.vci.server.query.delegate.ObjectQueryServiceDelegate.getLocalVciError(ObjectQueryServiceDelegate.java:59) ~[bin/:?]
+ at com.vci.server.query.delegate.ObjectQueryServiceDelegate.queryBySql(ObjectQueryServiceDelegate.java:514) ~[bin/:?]
+ at com.vci.server.query.ObjectQueryServiceImpl.queryBySql(ObjectQueryServiceImpl.java:137) ~[bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceD_queryBySql(ObjectQueryService.java:408) ~[bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceDispatch(ObjectQueryService.java:634) ~[bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) ~[icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+[INFO ] 2024-02-29 15:30:10 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-02-29 15:30:10 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-02-29 15:30:15 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-02-29 15:30:15 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-02-29 15:30:17 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-02-29 15:30:17 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-02-29 15:30:17 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-02-29 15:30:21 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-02-29 15:30:21 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-02-29 15:30:21 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-02-29 15:30:21 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-02-29 15:30:21 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-02-29 15:57:25 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-02-29 15:57:26 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-02-29 15:57:29 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-02-29 15:57:29 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-02-29 15:57:31 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-02-29 15:57:31 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-02-29 15:57:31 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-02-29 15:57:36 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-02-29 15:57:36 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-02-29 15:57:36 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-02-29 15:57:36 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-02-29 15:57:36 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-02-29 16:23:26 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[ERROR] 2024-02-29 16:27:20 [Ice.ThreadPool.Server-0] ObjectQueryServiceDelegate:415 - findTotalCount Error
+org.hibernate.exception.SQLGrammarException: could not execute query
+ at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2545) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.list(Loader.java:2271) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.query.delegate.ObjectQueryServiceDelegate.findTotalCount(ObjectQueryServiceDelegate.java:410) [bin/:?]
+ at com.vci.server.query.ObjectQueryServiceImpl.findTotalCount(ObjectQueryServiceImpl.java:129) [bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceD_findTotalCount(ObjectQueryService.java:385) [bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceDispatch(ObjectQueryService.java:598) [bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) [icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "R"."MAINWORKSHOP": 鏍囪瘑绗︽棤鏁�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQuery(Loader.java:802) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2542) ~[hibernate3.jar:3.6.10.Final]
+ ... 21 more
+Caused by: oracle.jdbc.OracleDatabaseException: ORA-00904: "R"."MAINWORKSHOP": 鏍囪瘑绗︽棤鏁�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:498) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQuery(Loader.java:802) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2542) ~[hibernate3.jar:3.6.10.Final]
+ ... 21 more
+[ERROR] 2024-02-29 16:27:20 [Ice.ThreadPool.Server-0] ServerContextInterceptor:95 - dispatch exec throwable exception
+com.vci.corba.common.VCIError: null
+ at com.vci.server.query.delegate.ObjectQueryServiceDelegate.getLocalVciError(ObjectQueryServiceDelegate.java:59) ~[bin/:?]
+ at com.vci.server.query.delegate.ObjectQueryServiceDelegate.findTotalCount(ObjectQueryServiceDelegate.java:416) ~[bin/:?]
+ at com.vci.server.query.ObjectQueryServiceImpl.findTotalCount(ObjectQueryServiceImpl.java:129) ~[bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceD_findTotalCount(ObjectQueryService.java:385) ~[bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceDispatch(ObjectQueryService.java:598) ~[bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) ~[icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+[ERROR] 2024-02-29 16:28:04 [Ice.ThreadPool.Server-0] ObjectQueryServiceDelegate:415 - findTotalCount Error
+org.hibernate.exception.SQLGrammarException: could not execute query
+ at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2545) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.list(Loader.java:2271) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.query.delegate.ObjectQueryServiceDelegate.findTotalCount(ObjectQueryServiceDelegate.java:410) [bin/:?]
+ at com.vci.server.query.ObjectQueryServiceImpl.findTotalCount(ObjectQueryServiceImpl.java:129) [bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceD_findTotalCount(ObjectQueryService.java:385) [bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceDispatch(ObjectQueryService.java:598) [bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) [icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "R"."MAINWORKSHOP": 鏍囪瘑绗︽棤鏁�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQuery(Loader.java:802) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2542) ~[hibernate3.jar:3.6.10.Final]
+ ... 21 more
+Caused by: oracle.jdbc.OracleDatabaseException: ORA-00904: "R"."MAINWORKSHOP": 鏍囪瘑绗︽棤鏁�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:498) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQuery(Loader.java:802) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2542) ~[hibernate3.jar:3.6.10.Final]
+ ... 21 more
+[ERROR] 2024-02-29 16:29:04 [Ice.ThreadPool.Server-0] ObjectQueryServiceDelegate:415 - findTotalCount Error
+org.hibernate.exception.SQLGrammarException: could not execute query
+ at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2545) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.list(Loader.java:2271) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.query.delegate.ObjectQueryServiceDelegate.findTotalCount(ObjectQueryServiceDelegate.java:410) [bin/:?]
+ at com.vci.server.query.ObjectQueryServiceImpl.findTotalCount(ObjectQueryServiceImpl.java:129) [bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceD_findTotalCount(ObjectQueryService.java:385) [bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceDispatch(ObjectQueryService.java:598) [bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) [icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "R"."MAINWORKSHOP": 鏍囪瘑绗︽棤鏁�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQuery(Loader.java:802) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2542) ~[hibernate3.jar:3.6.10.Final]
+ ... 21 more
+Caused by: oracle.jdbc.OracleDatabaseException: ORA-00904: "R"."MAINWORKSHOP": 鏍囪瘑绗︽棤鏁�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:498) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQuery(Loader.java:802) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2542) ~[hibernate3.jar:3.6.10.Final]
+ ... 21 more
+[ERROR] 2024-02-29 16:30:23 [Ice.ThreadPool.Server-0] ServerContextInterceptor:95 - dispatch exec throwable exception
+com.vci.corba.common.VCIError: null
+ at com.vci.server.query.delegate.ObjectQueryServiceDelegate.getLocalVciError(ObjectQueryServiceDelegate.java:59) ~[bin/:?]
+ at com.vci.server.query.delegate.ObjectQueryServiceDelegate.findTotalCount(ObjectQueryServiceDelegate.java:416) ~[bin/:?]
+ at com.vci.server.query.ObjectQueryServiceImpl.findTotalCount(ObjectQueryServiceImpl.java:129) ~[bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceD_findTotalCount(ObjectQueryService.java:385) ~[bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceDispatch(ObjectQueryService.java:598) ~[bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) ~[icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+[ERROR] 2024-02-29 16:53:50 [Ice.ThreadPool.Server-0] ObjectQueryServiceDelegate:415 - findTotalCount Error
+org.hibernate.exception.SQLGrammarException: could not execute query
+ at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2545) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.list(Loader.java:2271) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.query.delegate.ObjectQueryServiceDelegate.findTotalCount(ObjectQueryServiceDelegate.java:380) [bin/:?]
+ at com.vci.server.query.ObjectQueryServiceImpl.findTotalCount(ObjectQueryServiceImpl.java:129) [bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceD_findTotalCount(ObjectQueryService.java:385) [bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceDispatch(ObjectQueryService.java:598) [bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) [icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+Caused by: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 鍛戒护鏈纭粨鏉�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQuery(Loader.java:802) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2542) ~[hibernate3.jar:3.6.10.Final]
+ ... 21 more
+Caused by: oracle.jdbc.OracleDatabaseException: ORA-00933: SQL 鍛戒护鏈纭粨鏉�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:498) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQuery(Loader.java:802) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2542) ~[hibernate3.jar:3.6.10.Final]
+ ... 21 more
+[ERROR] 2024-02-29 16:55:47 [Ice.ThreadPool.Server-0] ServerContextInterceptor:95 - dispatch exec throwable exception
+com.vci.corba.common.VCIError: null
+ at com.vci.server.query.delegate.ObjectQueryServiceDelegate.getLocalVciError(ObjectQueryServiceDelegate.java:59) ~[bin/:?]
+ at com.vci.server.query.delegate.ObjectQueryServiceDelegate.findTotalCount(ObjectQueryServiceDelegate.java:416) ~[bin/:?]
+ at com.vci.server.query.ObjectQueryServiceImpl.findTotalCount(ObjectQueryServiceImpl.java:129) ~[bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceD_findTotalCount(ObjectQueryService.java:385) ~[bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceDispatch(ObjectQueryService.java:598) ~[bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) ~[icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+[ERROR] 2024-02-29 16:56:00 [Ice.ThreadPool.Server-0] ObjectQueryServiceDelegate:415 - findTotalCount Error
+org.hibernate.exception.SQLGrammarException: could not execute query
+ at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2545) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.list(Loader.java:2271) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.query.delegate.ObjectQueryServiceDelegate.findTotalCount(ObjectQueryServiceDelegate.java:380) [bin/:?]
+ at com.vci.server.query.ObjectQueryServiceImpl.findTotalCount(ObjectQueryServiceImpl.java:129) [bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceD_findTotalCount(ObjectQueryService.java:385) [bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceDispatch(ObjectQueryService.java:598) [bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) [icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+Caused by: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 鍛戒护鏈纭粨鏉�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQuery(Loader.java:802) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2542) ~[hibernate3.jar:3.6.10.Final]
+ ... 21 more
+Caused by: oracle.jdbc.OracleDatabaseException: ORA-00933: SQL 鍛戒护鏈纭粨鏉�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:498) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQuery(Loader.java:802) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2542) ~[hibernate3.jar:3.6.10.Final]
+ ... 21 more
+[ERROR] 2024-02-29 16:56:22 [Ice.ThreadPool.Server-0] ServerContextInterceptor:95 - dispatch exec throwable exception
+com.vci.corba.common.VCIError: null
+ at com.vci.server.query.delegate.ObjectQueryServiceDelegate.getLocalVciError(ObjectQueryServiceDelegate.java:59) ~[bin/:?]
+ at com.vci.server.query.delegate.ObjectQueryServiceDelegate.findTotalCount(ObjectQueryServiceDelegate.java:416) ~[bin/:?]
+ at com.vci.server.query.ObjectQueryServiceImpl.findTotalCount(ObjectQueryServiceImpl.java:129) ~[bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceD_findTotalCount(ObjectQueryService.java:385) ~[bin/:?]
+ at com.vci.corba.query.ObjectQueryService._iceDispatch(ObjectQueryService.java:598) ~[bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) ~[icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+[INFO ] 2024-03-01 10:08:12 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-01 10:08:13 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-03-01 10:08:18 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-03-01 10:08:18 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-03-01 10:08:20 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-03-01 10:08:20 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-03-01 10:08:20 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-03-01 10:08:24 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-03-01 10:08:24 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-03-01 10:08:24 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-03-01 10:08:24 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-03-01 10:08:24 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-03-01 10:09:51 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-01 10:09:52 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-03-01 10:09:55 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-03-01 10:09:55 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-03-01 10:09:55 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-03-01 10:09:56 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-03-01 10:09:56 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-03-01 10:09:58 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-03-01 10:09:58 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-03-01 10:09:58 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-03-01 10:09:58 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-03-01 10:09:58 [main] ServiceManagerMain:75 - Service Started!
+[ERROR] 2024-03-01 10:21:25 [Ice.ThreadPool.Server-0] LinkTypeServerDelegate:129 - modifyLinkType
+org.hibernate.exception.SQLGrammarException: could not execute native bulk manipulation query
+ at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:219) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SessionImpl.executeNativeUpdate(SessionImpl.java:1310) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:396) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.omd.ddlTool.DDLHelper.executeSql(DDLHelper.java:46) ~[bin/:?]
+ at com.vci.server.omd.linktype.service.LTService.modifyLinkTypeTable(LTService.java:918) ~[bin/:?]
+ at com.vci.server.omd.linktype.delegate.LinkTypeServerDelegate.modifyLinkType(LinkTypeServerDelegate.java:122) [bin/:?]
+ at com.vci.server.omd.linktype.LinkTypeServiceImpl.modifyLinkType(LinkTypeServiceImpl.java:33) [bin/:?]
+ at com.vci.corba.omd.ltm.LinkTypeService._iceD_modifyLinkType(LinkTypeService.java:177) [bin/:?]
+ at com.vci.corba.omd.ltm.LinkTypeService._iceDispatch(LinkTypeService.java:795) [bin/:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "ACCEPTOR": 鏍囪瘑绗︽棤鏁�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:910) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1119) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeLargeUpdate(OraclePreparedStatement.java:3865) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3845) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1061) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:210) ~[hibernate3.jar:3.6.10.Final]
+ ... 16 more
+Caused by: oracle.jdbc.OracleDatabaseException: ORA-00904: "ACCEPTOR": 鏍囪瘑绗︽棤鏁�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:498) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:910) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1119) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeLargeUpdate(OraclePreparedStatement.java:3865) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3845) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1061) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:210) ~[hibernate3.jar:3.6.10.Final]
+ ... 16 more
+[INFO ] 2024-03-01 10:27:08 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-01 10:27:08 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-03-01 10:27:12 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-03-01 10:27:12 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-03-01 10:27:13 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-03-01 10:27:14 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-03-01 10:27:14 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-03-01 10:27:19 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-03-01 10:27:19 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-03-01 10:27:19 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-03-01 10:27:19 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-03-01 10:27:19 [main] ServiceManagerMain:75 - Service Started!
+[ERROR] 2024-03-01 13:37:19 [Ice.ThreadPool.Server-0] HibernateTemplate:32 - HibernateTemplate.run
+org.hibernate.exception.SQLGrammarException: could not execute query
+ at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2545) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.list(Loader.java:2271) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:459) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:365) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:890) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.base.persistence.dao.GenericHibernateDao.findEntity(GenericHibernateDao.java:518) ~[bin/:?]
+ at com.vci.server.framework.funcmng.function.FunctionService$13.execute(FunctionService.java:458) ~[bin/:?]
+ at com.vci.server.base.persistence.dao.HibernateTemplate.run(HibernateTemplate.java:25) [bin/:?]
+ at com.vci.server.framework.funcmng.function.FunctionService.getFunctionObjectById(FunctionService.java:452) [bin/:?]
+ at com.vci.server.framework.delegate.FunctionDelegate.getFunctionObjectById(FunctionDelegate.java:242) [bin/:?]
+ at com.vci.server.framework.FrameworkServiceImpl.getFunctionObjectById(FrameworkServiceImpl.java:747) [bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceD_getFunctionObjectById(FrameworkService.java:1992) [bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceDispatch(FrameworkService.java:7539) [bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) [icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "MODULENO": 鏍囪瘑绗︽棤鏁�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQuery(Loader.java:802) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2542) ~[hibernate3.jar:3.6.10.Final]
+ ... 27 more
+Caused by: oracle.jdbc.OracleDatabaseException: ORA-00904: "MODULENO": 鏍囪瘑绗︽棤鏁�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:498) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQuery(Loader.java:802) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2542) ~[hibernate3.jar:3.6.10.Final]
+ ... 27 more
+[ERROR] 2024-03-01 13:37:19 [Ice.ThreadPool.Server-0] FunctionDelegate:248 - java.lang.RuntimeException: org.hibernate.exception.SQLGrammarException: could not execute query
+[ERROR] 2024-03-01 13:37:19 [Ice.ThreadPool.Server-0] ServerContextInterceptor:95 - dispatch exec throwable exception
+com.vci.corba.common.VCIError: null
+ at com.vci.server.framework.delegate.FunctionDelegate.getFunctionObjectById(FunctionDelegate.java:249) ~[bin/:?]
+ at com.vci.server.framework.FrameworkServiceImpl.getFunctionObjectById(FrameworkServiceImpl.java:747) ~[bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceD_getFunctionObjectById(FrameworkService.java:1992) ~[bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceDispatch(FrameworkService.java:7539) ~[bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) ~[icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+[ERROR] 2024-03-01 13:37:19 [Ice.ThreadPool.Server-0] HibernateTemplate:32 - HibernateTemplate.run
+org.hibernate.exception.SQLGrammarException: could not execute query
+ at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2545) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.list(Loader.java:2271) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:459) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:365) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:890) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.base.persistence.dao.GenericHibernateDao.findEntity(GenericHibernateDao.java:518) ~[bin/:?]
+ at com.vci.server.framework.funcmng.function.FunctionService$13.execute(FunctionService.java:458) ~[bin/:?]
+ at com.vci.server.base.persistence.dao.HibernateTemplate.run(HibernateTemplate.java:25) [bin/:?]
+ at com.vci.server.framework.funcmng.function.FunctionService.getFunctionObjectById(FunctionService.java:452) [bin/:?]
+ at com.vci.server.framework.delegate.FunctionDelegate.getFunctionObjectById(FunctionDelegate.java:242) [bin/:?]
+ at com.vci.server.framework.FrameworkServiceImpl.getFunctionObjectById(FrameworkServiceImpl.java:747) [bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceD_getFunctionObjectById(FrameworkService.java:1992) [bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceDispatch(FrameworkService.java:7539) [bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) [icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "MODULENO": 鏍囪瘑绗︽棤鏁�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQuery(Loader.java:802) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2542) ~[hibernate3.jar:3.6.10.Final]
+ ... 27 more
+Caused by: oracle.jdbc.OracleDatabaseException: ORA-00904: "MODULENO": 鏍囪瘑绗︽棤鏁�
+
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:498) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822) ~[ojdbc8.jar:12.2.0.1.0]
+ at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165) ~[ojdbc8.jar:12.2.0.1.0]
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) ~[c3p0-0.9.1.jar:0.9.1]
+ at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQuery(Loader.java:802) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.loader.Loader.doList(Loader.java:2542) ~[hibernate3.jar:3.6.10.Final]
+ ... 27 more
+[ERROR] 2024-03-01 13:37:19 [Ice.ThreadPool.Server-0] FunctionDelegate:248 - java.lang.RuntimeException: org.hibernate.exception.SQLGrammarException: could not execute query
+[ERROR] 2024-03-01 13:37:19 [Ice.ThreadPool.Server-0] ServerContextInterceptor:95 - dispatch exec throwable exception
+com.vci.corba.common.VCIError: null
+ at com.vci.server.framework.delegate.FunctionDelegate.getFunctionObjectById(FunctionDelegate.java:249) ~[bin/:?]
+ at com.vci.server.framework.FrameworkServiceImpl.getFunctionObjectById(FrameworkServiceImpl.java:747) ~[bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceD_getFunctionObjectById(FrameworkService.java:1992) ~[bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceDispatch(FrameworkService.java:7539) ~[bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) ~[icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+[INFO ] 2024-03-01 14:22:47 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-01 14:22:47 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-03-01 14:22:50 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-03-01 14:22:50 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-03-01 14:22:52 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-03-01 14:22:52 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-03-01 14:22:52 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-03-01 14:22:57 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-03-01 14:22:57 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-03-01 14:22:57 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-03-01 14:22:57 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-03-01 14:22:57 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-03-01 14:23:48 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-01 14:23:48 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-03-01 14:23:52 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-03-01 14:23:52 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-03-01 14:23:53 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-03-01 14:23:54 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-03-01 14:23:54 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-03-01 14:23:58 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-03-01 14:23:58 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-03-01 14:23:58 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-03-01 14:23:58 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-03-01 14:23:58 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-03-01 17:03:13 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-01 17:03:14 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-03-01 17:03:17 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-03-01 17:03:17 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-03-01 17:03:18 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-03-01 17:03:18 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-03-01 17:03:18 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-03-01 17:03:20 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-03-01 17:03:20 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-03-01 17:03:21 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-03-01 17:03:21 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-03-01 17:03:21 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-03-04 13:45:05 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-04 13:45:14 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-04 13:45:15 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-03-04 13:45:18 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-03-04 13:45:18 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-03-04 13:45:20 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-03-04 13:45:20 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-03-04 13:45:20 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-03-04 13:45:24 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-03-04 13:45:24 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-03-04 13:45:24 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-03-04 13:45:24 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-03-04 13:45:24 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-03-04 13:46:14 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-04 13:46:15 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-03-04 13:46:19 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-03-04 13:46:19 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-03-04 13:46:20 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-03-04 13:46:21 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-03-04 13:46:21 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-03-04 13:46:24 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-03-04 13:46:24 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-03-04 13:46:24 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-03-04 13:46:24 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-03-04 13:46:24 [main] ServiceManagerMain:75 - Service Started!
+[ERROR] 2024-03-04 13:48:42 [Ice.ThreadPool.Server-0] HibernateTemplate:32 - HibernateTemplate.run
+java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Short
+ at org.hibernate.type.descriptor.java.ShortTypeDescriptor.unwrap(ShortTypeDescriptor.java:33) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.type.descriptor.sql.SmallIntTypeDescriptor$1.doBind(SmallIntTypeDescriptor.java:52) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:91) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:283) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:278) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.param.PositionalParameterSpecification.bind(PositionalParameterSpecification.java:68) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:93) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.hql.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:423) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.engine.query.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:283) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1288) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:117) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.base.persistence.dao.GenericHibernateDao.createQuery(GenericHibernateDao.java:220) ~[bin/:?]
+ at com.vci.server.framework.right.roleRight.RoleRightService$2.execute(RoleRightService.java:81) ~[bin/:?]
+ at com.vci.server.base.persistence.dao.HibernateTemplate.run(HibernateTemplate.java:25) [bin/:?]
+ at com.vci.server.framework.right.roleRight.RoleRightService.saveRoleRight(RoleRightService.java:72) [bin/:?]
+ at com.vci.server.framework.delegate.RoleRightDelegate.saveRoleRight(RoleRightDelegate.java:75) [bin/:?]
+ at com.vci.server.framework.FrameworkServiceImpl.saveRoleRight(FrameworkServiceImpl.java:672) [bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceD_saveRoleRight(FrameworkService.java:2365) [bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceDispatch(FrameworkService.java:7839) [bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) [icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+[ERROR] 2024-03-04 13:49:41 [Ice.ThreadPool.Server-0] RoleRightDelegate:108 - java.lang.RuntimeException: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Short
+[ERROR] 2024-03-04 13:49:41 [Ice.ThreadPool.Server-0] ServerContextInterceptor:95 - dispatch exec throwable exception
+com.vci.corba.common.VCIError: null
+ at com.vci.server.framework.delegate.RoleRightDelegate.saveRoleRight(RoleRightDelegate.java:110) ~[bin/:?]
+ at com.vci.server.framework.FrameworkServiceImpl.saveRoleRight(FrameworkServiceImpl.java:672) ~[bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceD_saveRoleRight(FrameworkService.java:2365) ~[bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceDispatch(FrameworkService.java:7839) ~[bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) ~[icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+[ERROR] 2024-03-04 13:50:21 [Ice.ThreadPool.Server-0] HibernateTemplate:32 - HibernateTemplate.run
+java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Short
+ at org.hibernate.type.descriptor.java.ShortTypeDescriptor.unwrap(ShortTypeDescriptor.java:33) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.type.descriptor.sql.SmallIntTypeDescriptor$1.doBind(SmallIntTypeDescriptor.java:52) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:91) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:283) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:278) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.param.PositionalParameterSpecification.bind(PositionalParameterSpecification.java:68) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:93) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.hql.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:423) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.engine.query.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:283) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1288) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:117) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.base.persistence.dao.GenericHibernateDao.createQuery(GenericHibernateDao.java:220) ~[bin/:?]
+ at com.vci.server.framework.right.roleRight.RoleRightService$2.execute(RoleRightService.java:81) ~[bin/:?]
+ at com.vci.server.base.persistence.dao.HibernateTemplate.run(HibernateTemplate.java:25) [bin/:?]
+ at com.vci.server.framework.right.roleRight.RoleRightService.saveRoleRight(RoleRightService.java:72) [bin/:?]
+ at com.vci.server.framework.delegate.RoleRightDelegate.saveRoleRight(RoleRightDelegate.java:75) [bin/:?]
+ at com.vci.server.framework.FrameworkServiceImpl.saveRoleRight(FrameworkServiceImpl.java:672) [bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceD_saveRoleRight(FrameworkService.java:2365) [bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceDispatch(FrameworkService.java:7839) [bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) [icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+[INFO ] 2024-03-04 13:50:39 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-04 13:50:39 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-03-04 13:50:42 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-03-04 13:50:42 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-03-04 13:50:43 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-03-04 13:50:43 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-03-04 13:50:43 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-03-04 13:50:46 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-03-04 13:50:46 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-03-04 13:50:46 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-03-04 13:50:46 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-03-04 13:50:46 [main] ServiceManagerMain:75 - Service Started!
+[ERROR] 2024-03-04 13:52:00 [Ice.ThreadPool.Server-0] HibernateTemplate:32 - HibernateTemplate.run
+java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Short
+ at org.hibernate.type.descriptor.java.ShortTypeDescriptor.unwrap(ShortTypeDescriptor.java:33) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.type.descriptor.sql.SmallIntTypeDescriptor$1.doBind(SmallIntTypeDescriptor.java:52) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:91) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:283) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:278) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.param.PositionalParameterSpecification.bind(PositionalParameterSpecification.java:68) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:93) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.hql.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:423) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.engine.query.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:283) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1288) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:117) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.base.persistence.dao.GenericHibernateDao.createQuery(GenericHibernateDao.java:220) ~[bin/:?]
+ at com.vci.server.framework.right.roleRight.RoleRightService$2.execute(RoleRightService.java:81) ~[bin/:?]
+ at com.vci.server.base.persistence.dao.HibernateTemplate.run(HibernateTemplate.java:25) [bin/:?]
+ at com.vci.server.framework.right.roleRight.RoleRightService.saveRoleRight(RoleRightService.java:72) [bin/:?]
+ at com.vci.server.framework.delegate.RoleRightDelegate.saveRoleRight(RoleRightDelegate.java:75) [bin/:?]
+ at com.vci.server.framework.FrameworkServiceImpl.saveRoleRight(FrameworkServiceImpl.java:672) [bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceD_saveRoleRight(FrameworkService.java:2365) [bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceDispatch(FrameworkService.java:7839) [bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) [icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+[ERROR] 2024-03-04 13:52:00 [Ice.ThreadPool.Server-0] RoleRightDelegate:108 - java.lang.RuntimeException: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Short
+[ERROR] 2024-03-04 13:52:00 [Ice.ThreadPool.Server-0] ServerContextInterceptor:95 - dispatch exec throwable exception
+com.vci.corba.common.VCIError: null
+ at com.vci.server.framework.delegate.RoleRightDelegate.saveRoleRight(RoleRightDelegate.java:110) ~[bin/:?]
+ at com.vci.server.framework.FrameworkServiceImpl.saveRoleRight(FrameworkServiceImpl.java:672) ~[bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceD_saveRoleRight(FrameworkService.java:2365) ~[bin/:?]
+ at com.vci.corba.framework.method.FrameworkService._iceDispatch(FrameworkService.java:7839) ~[bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) ~[icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
+[INFO ] 2024-03-04 14:12:01 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-04 14:12:02 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-03-04 14:12:10 [main] ServiceManagerMain:71 - FrameService started
+[INFO ] 2024-03-04 14:12:10 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-03-04 14:12:12 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-03-04 14:12:12 [main] ServiceManagerMain:71 - OMDService started
+[INFO ] 2024-03-04 14:12:12 [main] ServiceManagerMain:71 - OQService started
+[INFO ] 2024-03-04 14:12:17 [main] ServiceManagerMain:71 - UIService started
+[INFO ] 2024-03-04 14:12:17 [main] ServiceManagerMain:71 - BOFService started
+[INFO ] 2024-03-04 14:12:17 [main] ServiceManagerMain:71 - WFService started
+[INFO ] 2024-03-04 14:12:17 [main] ServiceManagerMain:71 - DefaultVolumeService started
+[INFO ] 2024-03-04 14:12:17 [main] ServiceManagerMain:75 - Service Started!
+[INFO ] 2024-03-20 14:18:22 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-20 14:20:13 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-20 14:20:53 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-20 14:38:00 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-20 14:38:58 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-20 15:01:12 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-20 15:01:36 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�7銆戜釜鏈嶅姟
+[INFO ] 2024-03-20 15:01:41 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-03-20 15:01:45 [main] ServiceManagerMain:74 - FrameService started
+[INFO ] 2024-03-20 15:01:45 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-03-20 15:01:46 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-03-20 15:01:47 [main] ServiceManagerMain:74 - OMDService started
+[INFO ] 2024-03-20 15:01:47 [main] ServiceManagerMain:74 - OQService started
+[INFO ] 2024-03-20 15:01:50 [main] ServiceManagerMain:74 - UIService started
+[INFO ] 2024-03-20 15:01:51 [main] ServiceManagerMain:74 - BOFService started
+[INFO ] 2024-03-20 15:01:51 [main] ServiceManagerMain:74 - WFService started
+[INFO ] 2024-03-20 15:01:51 [main] ServiceManagerMain:74 - DefaultVolumeService started
+[INFO ] 2024-03-20 15:01:51 [main] ServiceManagerMain:78 - Service Started!
+[INFO ] 2024-03-26 15:21:50 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�8銆戜釜鏈嶅姟
+[INFO ] 2024-03-26 15:22:19 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�8銆戜釜鏈嶅姟
+[INFO ] 2024-03-26 15:22:41 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�8銆戜釜鏈嶅姟
+[INFO ] 2024-03-26 15:22:42 [main] HibernateSessionFactory:58 - Init Hibernate
+[INFO ] 2024-03-26 15:22:48 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-03-26 15:22:49 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-03-26 15:22:53 [main] ServiceManagerMain:74 - CacheService started
+[INFO ] 2024-03-26 15:22:53 [main] ServiceManagerMain:74 - FrameService started
+[INFO ] 2024-03-26 15:22:53 [main] ServiceManagerMain:74 - OMDService started
+[INFO ] 2024-03-26 15:22:54 [main] ServiceManagerMain:74 - OQService started
+[INFO ] 2024-03-26 15:22:54 [main] ServiceManagerMain:74 - UIService started
+[INFO ] 2024-03-26 15:22:54 [main] ServiceManagerMain:74 - BOFService started
+[INFO ] 2024-03-26 15:22:54 [main] ServiceManagerMain:74 - WFService started
+[INFO ] 2024-03-26 15:22:54 [main] ServiceManagerMain:74 - DefaultVolumeService started
+[INFO ] 2024-03-26 15:22:54 [main] ServiceManagerMain:78 - Service Started!
+[INFO ] 2024-04-12 17:42:25 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�9銆戜釜鏈嶅姟
+[INFO ] 2024-04-12 17:42:26 [main] HibernateSessionFactory:54 - Init Hibernate
+[ERROR] 2024-04-12 17:42:26 [main] HibernateSessionFactory:66 - Error Creating SessionFactory
+org.hibernate.MappingNotFoundException: resource: com/vci/server/framework/hbm/Log.hbm.xml not found
+ at org.hibernate.cfg.Configuration.addResource(Configuration.java:799) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:2344) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:2310) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2290) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2243) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.configure(Configuration.java:2216) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.base.persistence.dao.HibernateSessionFactory.<clinit>(HibernateSessionFactory.java:58) [bin/:?]
+ at com.vci.server.cache.CacheServerImpl.initCatch(CacheServerImpl.java:47) [bin/:?]
+ at com.vci.server.cache.CacheServerImpl.<init>(CacheServerImpl.java:35) [bin/:?]
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_261]
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) [?:1.8.0_261]
+ at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [?:1.8.0_261]
+ at java.lang.reflect.Constructor.newInstance(Constructor.java:423) [?:1.8.0_261]
+ at java.lang.Class.newInstance(Class.java:442) [?:1.8.0_261]
+ at com.vci.server.ServiceManagerMain.main(ServiceManagerMain.java:64) [bin/:?]
+[ERROR] 2024-04-12 17:42:26 [main] HibernateSessionFactory:137 - Error Rebuild SessionFactory
+org.hibernate.MappingNotFoundException: resource: com/vci/server/framework/hbm/Log.hbm.xml not found
+ at org.hibernate.cfg.Configuration.addResource(Configuration.java:799) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:2344) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:2310) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2290) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2243) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.configure(Configuration.java:2216) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.base.persistence.dao.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:129) [bin/:?]
+ at com.vci.server.base.persistence.dao.HibernateSessionFactory.getSession(HibernateSessionFactory.java:88) [bin/:?]
+ at com.vci.server.cache.CacheServerImpl.initCatch(CacheServerImpl.java:47) [bin/:?]
+ at com.vci.server.cache.CacheServerImpl.<init>(CacheServerImpl.java:35) [bin/:?]
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_261]
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) [?:1.8.0_261]
+ at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [?:1.8.0_261]
+ at java.lang.reflect.Constructor.newInstance(Constructor.java:423) [?:1.8.0_261]
+ at java.lang.Class.newInstance(Class.java:442) [?:1.8.0_261]
+ at com.vci.server.ServiceManagerMain.main(ServiceManagerMain.java:64) [bin/:?]
+[INFO ] 2024-04-12 17:43:07 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�9銆戜釜鏈嶅姟
+[INFO ] 2024-04-12 17:43:08 [main] HibernateSessionFactory:54 - Init Hibernate
+[ERROR] 2024-04-12 17:43:08 [main] HibernateSessionFactory:66 - Error Creating SessionFactory
+org.hibernate.MappingNotFoundException: resource: com/vci/server/log/hbm/Log.hbm.xml not found
+ at org.hibernate.cfg.Configuration.addResource(Configuration.java:799) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:2344) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:2310) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2290) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2243) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.configure(Configuration.java:2216) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.base.persistence.dao.HibernateSessionFactory.<clinit>(HibernateSessionFactory.java:58) [bin/:?]
+ at com.vci.server.cache.CacheServerImpl.initCatch(CacheServerImpl.java:47) [bin/:?]
+ at com.vci.server.cache.CacheServerImpl.<init>(CacheServerImpl.java:35) [bin/:?]
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_261]
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) [?:1.8.0_261]
+ at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [?:1.8.0_261]
+ at java.lang.reflect.Constructor.newInstance(Constructor.java:423) [?:1.8.0_261]
+ at java.lang.Class.newInstance(Class.java:442) [?:1.8.0_261]
+ at com.vci.server.ServiceManagerMain.main(ServiceManagerMain.java:64) [bin/:?]
+[ERROR] 2024-04-12 17:43:08 [main] HibernateSessionFactory:137 - Error Rebuild SessionFactory
+org.hibernate.MappingNotFoundException: resource: com/vci/server/log/hbm/Log.hbm.xml not found
+ at org.hibernate.cfg.Configuration.addResource(Configuration.java:799) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:2344) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:2310) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2290) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2243) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.configure(Configuration.java:2216) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.base.persistence.dao.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:129) [bin/:?]
+ at com.vci.server.base.persistence.dao.HibernateSessionFactory.getSession(HibernateSessionFactory.java:88) [bin/:?]
+ at com.vci.server.cache.CacheServerImpl.initCatch(CacheServerImpl.java:47) [bin/:?]
+ at com.vci.server.cache.CacheServerImpl.<init>(CacheServerImpl.java:35) [bin/:?]
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_261]
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) [?:1.8.0_261]
+ at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [?:1.8.0_261]
+ at java.lang.reflect.Constructor.newInstance(Constructor.java:423) [?:1.8.0_261]
+ at java.lang.Class.newInstance(Class.java:442) [?:1.8.0_261]
+ at com.vci.server.ServiceManagerMain.main(ServiceManagerMain.java:64) [bin/:?]
+[INFO ] 2024-04-12 17:43:39 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�9銆戜釜鏈嶅姟
+[INFO ] 2024-04-12 17:43:39 [main] HibernateSessionFactory:54 - Init Hibernate
+[INFO ] 2024-04-12 17:43:40 [main] HibernateSessionFactory:60 - 鍔犺浇Hibernate瀵硅薄鏄犲皠:Begin
+[INFO ] 2024-04-12 17:43:40 [main] HibernateSessionFactory:62 - 鍔犺浇Hibernate瀵硅薄鏄犲皠:End
+[ERROR] 2024-04-12 17:43:40 [main] HibernateSessionFactory:66 - Error Creating SessionFactory
+org.hibernate.InvalidMappingException: Could not parse mapping document from resource com/vci/server/framework/hbm/AppConfigCategory.hbm.xml
+ at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:4009) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXmlQueue(Configuration.java:3998) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3986) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1398) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1856) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.base.persistence.dao.HibernateSessionFactory.<clinit>(HibernateSessionFactory.java:64) [bin/:?]
+ at com.vci.server.cache.CacheServerImpl.initCatch(CacheServerImpl.java:47) [bin/:?]
+ at com.vci.server.cache.CacheServerImpl.<init>(CacheServerImpl.java:35) [bin/:?]
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_261]
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) [?:1.8.0_261]
+ at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [?:1.8.0_261]
+ at java.lang.reflect.Constructor.newInstance(Constructor.java:423) [?:1.8.0_261]
+ at java.lang.Class.newInstance(Class.java:442) [?:1.8.0_261]
+ at com.vci.server.ServiceManagerMain.main(ServiceManagerMain.java:64) [bin/:?]
+Caused by: org.hibernate.DuplicateMappingException: Duplicate class/entity mapping com.vci.server.framework.appConfig.AppConfigCategory
+ at org.hibernate.cfg.Configuration$MappingsImpl.addClass(Configuration.java:3179) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:178) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:4006) ~[hibernate3.jar:3.6.10.Final]
+ ... 13 more
+[INFO ] 2024-04-12 17:43:40 [main] HibernateSessionFactory:131 - 鍔犺浇Hibernate瀵硅薄鏄犲皠:Begin
+[INFO ] 2024-04-12 17:43:40 [main] HibernateSessionFactory:133 - 鍔犺浇Hibernate瀵硅薄鏄犲皠:End
+[ERROR] 2024-04-12 17:43:40 [main] HibernateSessionFactory:137 - Error Rebuild SessionFactory
+org.hibernate.InvalidMappingException: Could not parse mapping document from resource com/vci/server/framework/hbm/AppConfigCategory.hbm.xml
+ at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:4009) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXmlQueue(Configuration.java:3998) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3986) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1398) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1856) ~[hibernate3.jar:3.6.10.Final]
+ at com.vci.server.base.persistence.dao.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:135) [bin/:?]
+ at com.vci.server.base.persistence.dao.HibernateSessionFactory.getSession(HibernateSessionFactory.java:88) [bin/:?]
+ at com.vci.server.cache.CacheServerImpl.initCatch(CacheServerImpl.java:47) [bin/:?]
+ at com.vci.server.cache.CacheServerImpl.<init>(CacheServerImpl.java:35) [bin/:?]
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_261]
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) [?:1.8.0_261]
+ at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [?:1.8.0_261]
+ at java.lang.reflect.Constructor.newInstance(Constructor.java:423) [?:1.8.0_261]
+ at java.lang.Class.newInstance(Class.java:442) [?:1.8.0_261]
+ at com.vci.server.ServiceManagerMain.main(ServiceManagerMain.java:64) [bin/:?]
+Caused by: org.hibernate.DuplicateMappingException: Duplicate class/entity mapping com.vci.server.framework.appConfig.AppConfigCategory
+ at org.hibernate.cfg.Configuration$MappingsImpl.addClass(Configuration.java:3179) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:178) ~[hibernate3.jar:3.6.10.Final]
+ at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:4006) ~[hibernate3.jar:3.6.10.Final]
+ ... 14 more
+[INFO ] 2024-04-12 17:47:04 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�9銆戜釜鏈嶅姟
+[INFO ] 2024-04-12 17:47:05 [main] HibernateSessionFactory:54 - Init Hibernate
+[INFO ] 2024-04-12 17:47:05 [main] HibernateSessionFactory:60 - 鍔犺浇Hibernate瀵硅薄鏄犲皠:Begin
+[INFO ] 2024-04-12 17:56:56 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�9銆戜釜鏈嶅姟
+[INFO ] 2024-04-12 17:57:04 [main] HibernateSessionFactory:54 - Init Hibernate
+[INFO ] 2024-04-12 17:57:04 [main] HibernateSessionFactory:60 - 鍔犺浇Hibernate瀵硅薄鏄犲皠:Begin
+[INFO ] 2024-04-12 17:57:24 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�9銆戜釜鏈嶅姟
+[INFO ] 2024-04-12 17:57:30 [main] HibernateSessionFactory:54 - Init Hibernate
+[INFO ] 2024-04-12 17:57:30 [main] HibernateSessionFactory:60 - 鍔犺浇Hibernate瀵硅薄鏄犲皠:Begin
+[INFO ] 2024-04-12 17:57:30 [main] HibernateSessionFactory:62 - 鍔犺浇Hibernate瀵硅薄鏄犲皠:End
+[INFO ] 2024-04-12 17:57:51 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�9銆戜釜鏈嶅姟
+[INFO ] 2024-04-12 17:57:52 [main] HibernateSessionFactory:54 - Init Hibernate
+[INFO ] 2024-04-12 17:57:52 [main] HibernateSessionFactory:60 - 鍔犺浇Hibernate瀵硅薄鏄犲皠:Begin
+[INFO ] 2024-04-12 17:57:52 [main] HibernateSessionFactory:62 - 鍔犺浇Hibernate瀵硅薄鏄犲皠:End
+[INFO ] 2024-04-12 17:57:55 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-04-12 17:57:56 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-04-12 17:58:00 [main] ServiceManagerMain:74 - CacheService started
+[INFO ] 2024-04-12 17:58:00 [main] ServiceManagerMain:74 - LogService started
+[INFO ] 2024-04-12 17:58:00 [main] ServiceManagerMain:74 - FrameService started
+[INFO ] 2024-04-12 17:58:00 [main] ServiceManagerMain:74 - OMDService started
+[INFO ] 2024-04-12 17:58:00 [main] ServiceManagerMain:74 - OQService started
+[INFO ] 2024-04-12 17:58:00 [main] ServiceManagerMain:74 - UIService started
+[INFO ] 2024-04-12 17:58:00 [main] ServiceManagerMain:74 - BOFService started
+[INFO ] 2024-04-12 17:58:00 [main] ServiceManagerMain:74 - WFService started
+[INFO ] 2024-04-12 17:58:00 [main] ServiceManagerMain:74 - DefaultVolumeService started
+[INFO ] 2024-04-12 17:58:00 [main] ServiceManagerMain:78 - Service Started!
+[INFO ] 2024-04-12 17:59:14 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�9銆戜釜鏈嶅姟
+[INFO ] 2024-04-12 17:59:15 [main] HibernateSessionFactory:54 - Init Hibernate
+[INFO ] 2024-04-12 17:59:15 [main] HibernateSessionFactory:60 - 鍔犺浇Hibernate瀵硅薄鏄犲皠:Begin
+[INFO ] 2024-04-12 17:59:15 [main] HibernateSessionFactory:62 - 鍔犺浇Hibernate瀵硅薄鏄犲皠:End
+[INFO ] 2024-04-12 17:59:18 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-04-12 17:59:19 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-04-12 17:59:23 [main] ServiceManagerMain:74 - CacheService started
+[INFO ] 2024-04-12 17:59:23 [main] ServiceManagerMain:74 - LogService started
+[INFO ] 2024-04-12 17:59:23 [main] ServiceManagerMain:74 - FrameService started
+[INFO ] 2024-04-12 17:59:23 [main] ServiceManagerMain:74 - OMDService started
+[INFO ] 2024-04-12 17:59:23 [main] ServiceManagerMain:74 - OQService started
+[INFO ] 2024-04-12 17:59:23 [main] ServiceManagerMain:74 - UIService started
+[INFO ] 2024-04-12 17:59:23 [main] ServiceManagerMain:74 - BOFService started
+[INFO ] 2024-04-12 17:59:23 [main] ServiceManagerMain:74 - WFService started
+[INFO ] 2024-04-12 17:59:23 [main] ServiceManagerMain:74 - DefaultVolumeService started
+[INFO ] 2024-04-12 17:59:23 [main] ServiceManagerMain:78 - Service Started!
+[INFO ] 2024-04-12 18:04:46 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�9銆戜釜鏈嶅姟
+[INFO ] 2024-04-12 18:04:46 [main] HibernateSessionFactory:54 - Init Hibernate
+[INFO ] 2024-04-12 18:04:46 [main] HibernateSessionFactory:60 - 鍔犺浇Hibernate瀵硅薄鏄犲皠:Begin
+[INFO ] 2024-04-12 18:04:46 [main] HibernateSessionFactory:62 - 鍔犺浇Hibernate瀵硅薄鏄犲皠:End
+[INFO ] 2024-04-12 18:04:50 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-04-12 18:04:51 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-04-12 18:04:56 [main] ServiceManagerMain:74 - CacheService started
+[INFO ] 2024-04-12 18:04:56 [main] ServiceManagerMain:74 - LogService started
+[INFO ] 2024-04-12 18:04:56 [main] ServiceManagerMain:74 - FrameService started
+[INFO ] 2024-04-12 18:04:56 [main] ServiceManagerMain:74 - OMDService started
+[INFO ] 2024-04-12 18:04:56 [main] ServiceManagerMain:74 - OQService started
+[INFO ] 2024-04-12 18:04:56 [main] ServiceManagerMain:74 - UIService started
+[INFO ] 2024-04-12 18:04:56 [main] ServiceManagerMain:74 - BOFService started
+[INFO ] 2024-04-12 18:04:56 [main] ServiceManagerMain:74 - WFService started
+[INFO ] 2024-04-12 18:04:56 [main] ServiceManagerMain:74 - DefaultVolumeService started
+[INFO ] 2024-04-12 18:04:56 [main] ServiceManagerMain:78 - Service Started!
+[INFO ] 2024-04-12 18:07:50 [main] ServiceManagerMain:39 - 鍏遍厤缃簡銆�9銆戜釜鏈嶅姟
+[INFO ] 2024-04-12 18:07:51 [main] HibernateSessionFactory:54 - Init Hibernate
+[INFO ] 2024-04-12 18:07:51 [main] HibernateSessionFactory:60 - 鍔犺浇Hibernate瀵硅薄鏄犲皠:Begin
+[INFO ] 2024-04-12 18:07:51 [main] HibernateSessionFactory:62 - 鍔犺浇Hibernate瀵硅薄鏄犲皠:End
+[INFO ] 2024-04-12 18:07:54 [main] HibernateSessionFactory:221 - DB driveName=Oracle JDBC driver; DB ProductName=Oracle
+[INFO ] 2024-04-12 18:07:54 [main] VRService:144 - select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plversionrule t
+[INFO ] 2024-04-12 18:07:59 [main] ServiceManagerMain:74 - CacheService started
+[INFO ] 2024-04-12 18:07:59 [main] ServiceManagerMain:74 - LogService started
+[INFO ] 2024-04-12 18:07:59 [main] ServiceManagerMain:74 - FrameService started
+[INFO ] 2024-04-12 18:07:59 [main] ServiceManagerMain:74 - OMDService started
+[INFO ] 2024-04-12 18:07:59 [main] ServiceManagerMain:74 - OQService started
+[INFO ] 2024-04-12 18:07:59 [main] ServiceManagerMain:74 - UIService started
+[INFO ] 2024-04-12 18:07:59 [main] ServiceManagerMain:74 - BOFService started
+[INFO ] 2024-04-12 18:07:59 [main] ServiceManagerMain:74 - WFService started
+[INFO ] 2024-04-12 18:07:59 [main] ServiceManagerMain:74 - DefaultVolumeService started
+[INFO ] 2024-04-12 18:07:59 [main] ServiceManagerMain:78 - Service Started!
+[ERROR] 2024-04-12 18:16:52 [Ice.ThreadPool.Server-0] ServerContextInterceptor:95 - dispatch exec throwable exception
+com.vci.corba.common.VCIError: null
+ at com.vci.server.framework.delegate.AppConfigDetailDelegate.getAppConfigDetailByKey(AppConfigDetailDelegate.java:180) ~[bin/:?]
+ at com.vci.server.framework.delegate.SystemCfgDelegate.getConfigValue(SystemCfgDelegate.java:37) ~[bin/:?]
+ at com.vci.server.framework.FrameworkServiceImpl.getConfigValue(FrameworkServiceImpl.java:114) ~[bin/:?]
+ at com.vci.corba.framework.FrameworkService._iceD_getConfigValue(FrameworkService.java:1658) ~[bin/:?]
+ at com.vci.corba.framework.FrameworkService._iceDispatch(FrameworkService.java:7143) ~[bin/:?]
+ at com.zeroc.Ice.Object.ice_dispatch(Object.java:144) ~[icegridgui.jar:?]
+ at com.vci.server.mw.ServerContextInterceptor.dispatch(ServerContextInterceptor.java:87) [bin/:?]
+ at com.zeroc.Ice.DispatchInterceptor._iceDispatch(DispatchInterceptor.java:41) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.Incoming.invoke(Incoming.java:222) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.invokeAll(ConnectionI.java:2723) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.dispatch(ConnectionI.java:1302) [icegridgui.jar:?]
+ at com.zeroc.Ice.ConnectionI.message(ConnectionI.java:1213) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.run(ThreadPool.java:410) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool.access$500(ThreadPool.java:7) [icegridgui.jar:?]
+ at com.zeroc.IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:784) [icegridgui.jar:?]
+ at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
diff --git a/Source/Service/VciServiceMain/properties/hibernate.cfg.xml b/Source/Service/VciServiceMain/properties/hibernate.cfg.xml
index 73d9224..2f1a271 100644
--- a/Source/Service/VciServiceMain/properties/hibernate.cfg.xml
+++ b/Source/Service/VciServiceMain/properties/hibernate.cfg.xml
@@ -10,7 +10,7 @@
<property name="connection.password">vcimes</property>-->
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
- <property name="connection.username">mpm550new</property>
+ <property name="connection.username">plt2024</property>
<property name="connection.password">vcitest</property>
<!--<property name="connection.username">mpm112</property>
<property name="connection.password">vcitest</property>-->
@@ -48,9 +48,10 @@
<mapping resource="com/vci/server/framework/hbm/SystemCfg.hbm.xml"/>
<mapping resource="com/vci/server/framework/hbm/SpecialChar.hbm.xml"/>
<mapping resource="com/vci/server/framework/hbm/SpecialCharClfy.hbm.xml"/>
- <mapping resource="com/vci/server/framework/hbm/Log.hbm.xml"/>
<mapping resource="com/vci/server/framework/hbm/MachSecurity.hbm.xml"/>
<mapping resource="com/vci/server/framework/hbm/Pvolume.hbm.xml"/>
+
+ <mapping resource="com/vci/server/log/hbm/Log.hbm.xml"/>
<!-- QT鏄犲皠鏂囦欢 -->
<mapping resource="com/vci/server/omd/qt/hbm/QT.hbm.xml"/>
diff --git a/Source/Service/VciServiceMain/properties/service.xml b/Source/Service/VciServiceMain/properties/service.xml
index 96936a9..b664714 100644
--- a/Source/Service/VciServiceMain/properties/service.xml
+++ b/Source/Service/VciServiceMain/properties/service.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Services>
- <!-- <ServiceTempl name="CacheService" entry="com.vci.server.cache.CacheServerImpl" description="缂撳瓨鏈嶅姟" /> -->
+ <ServiceTempl name="CacheService" entry="com.vci.server.cache.CacheServerImpl" description="缂撳瓨鏈嶅姟" />
+ <ServiceTempl entry="com.vci.server.log.LogServiceImpl" description="鏃ュ織鏈嶅姟" />
<ServiceTempl entry="com.vci.server.framework.FrameworkServiceImpl" description="绯荤粺妗嗘灦鏈嶅姟" />
<ServiceTempl entry="com.vci.server.omd.OMDServiceImpl" description="瀵硅薄妯″瀷瀹氫箟鏈嶅姟" />
<!-- <ServiceTempl name="QTDServer" entry="com.vci.server.qt.QTDefineServiceImpl" description="鏌ヨ妯℃澘瀹氫箟鏈嶅姟" />-->
diff --git a/Source/Service/VciServiceMain/src/com/vci/server/ServiceManagerMain.java b/Source/Service/VciServiceMain/src/com/vci/server/ServiceManagerMain.java
index 0552f19..f2f14eb 100644
--- a/Source/Service/VciServiceMain/src/com/vci/server/ServiceManagerMain.java
+++ b/Source/Service/VciServiceMain/src/com/vci/server/ServiceManagerMain.java
@@ -3,7 +3,6 @@
import org.apache.commons.lang3.StringUtils;
import com.vci.common.log.ServerWithLog4j;
-import com.vci.server.BaseService;
import com.vci.server.conf.IceServerProperties;
import com.vci.server.conf.ServiceConf;
import com.vci.server.conf.ServiceTempl;
@@ -15,7 +14,8 @@
public class ServiceManagerMain {
-
+ private static final String locatorKey = "--Ice.Default.Locator";
+
public static void main(String[] args) {
System.out.println("");
System.out.println("\t***************************************************************");
@@ -45,6 +45,9 @@
if (!StringUtils.isBlank(value))
initData.properties.setProperty("Ice.MessageSizeMax", value);
+ value = IceServerProperties.Endpoints();
+ initData.properties.setProperty(locatorKey, value);
+
try(Communicator communicator = Util.initialize(initData))
{
// Shut down the communicator on Ctrl+C
diff --git a/Source/Service/VolumeService/build-jar.xml b/Source/Service/VolumeService/build-jar.xml
index f2cd044..21ee1b5 100644
--- a/Source/Service/VolumeService/build-jar.xml
+++ b/Source/Service/VolumeService/build-jar.xml
@@ -2,7 +2,7 @@
<!--classes.jar; src.jar-->
<project name = "platform-VolumeService" default = "build-VolumeService-jar" basedir = ".">
- <property file="build.properties"/>
+ <property file="../../build.properties"/>
<target name="time">
<tstamp>
@@ -30,5 +30,7 @@
<include name="**.jar" />
</fileset>
</copy>
+
+
</target>
</project>
\ No newline at end of file
diff --git a/Source/Service/VolumeService/build.properties b/Source/Service/VolumeService/build.properties
index 4f8a188..c626764 100644
--- a/Source/Service/VolumeService/build.properties
+++ b/Source/Service/VolumeService/build.properties
@@ -9,4 +9,8 @@
service.dir=${lib.dir}/service
client.dir=${lib.dir}/client
+grid.app = ${app_home}/../grid/app
+grid.common=${grid.app}/common
+grid.service=${grid.app}/service
+
platform.version=2024
\ No newline at end of file
diff --git a/Source/Service/VolumeService/dist/VolumeService.jar b/Source/Service/VolumeService/dist/VolumeService.jar
index 440eeb2..42e673a 100644
--- a/Source/Service/VolumeService/dist/VolumeService.jar
+++ b/Source/Service/VolumeService/dist/VolumeService.jar
Binary files differ
diff --git a/Source/Service/VolumeService/src/com/vci/server/VolumeBoxService.java b/Source/Service/VolumeService/src/com/vci/server/VolumeBoxService.java
new file mode 100644
index 0000000..ee51484
--- /dev/null
+++ b/Source/Service/VolumeService/src/com/vci/server/VolumeBoxService.java
@@ -0,0 +1,40 @@
+package com.vci.server;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.vci.server.mw.ServerContextInterceptor;
+import com.vci.server.volume.VolumeServiceImpl;
+import com.zeroc.Ice.Communicator;
+import com.zeroc.Ice.Identity;
+import com.zeroc.Ice.ObjectAdapter;
+import com.zeroc.Ice.Util;
+import com.zeroc.IceBox.Service;
+
+public class VolumeBoxService implements Service {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(VolumeBoxService.class);
+ protected ObjectAdapter _adapter;
+ protected Identity id;
+
+ @Override
+ public void start(String name, Communicator communicator, String[] args) {
+ LOGGER.info("start servant: " + name);
+ // IceBox
+ // 鍒涘缓objectAdapter锛岃繖閲屽拰service鍚屽悕
+ _adapter = communicator.createObjectAdapter(name);
+ // 鍒涘缓servant
+ com.zeroc.Ice.Object object = new VolumeServiceImpl();
+ _adapter.add(object, Util.stringToIdentity(name));
+ // 婵�娲�
+ _adapter.activate();
+ LOGGER.info("start servant success: " + name);
+ }
+
+ @Override
+ public void stop() {
+ LOGGER.info("VolumeService stoped, args");
+ _adapter.destroy();
+ }
+
+}
diff --git a/Source/Service/WFService/build-jar.xml b/Source/Service/WFService/build-jar.xml
index a94d5d9..3d7d80a 100644
--- a/Source/Service/WFService/build-jar.xml
+++ b/Source/Service/WFService/build-jar.xml
@@ -2,7 +2,7 @@
<!--classes.jar; src.jar-->
<project name = "platform-WFService" default = "build-WFService-jar" basedir = ".">
- <property file="build.properties"/>
+ <property file="../../build.properties"/>
<target name="time">
<tstamp>
@@ -34,5 +34,7 @@
<include name="**.jar" />
</fileset>
</copy>
+
+
</target>
</project>
\ No newline at end of file
diff --git a/Source/Service/WFService/build.properties b/Source/Service/WFService/build.properties
index 4f8a188..c626764 100644
--- a/Source/Service/WFService/build.properties
+++ b/Source/Service/WFService/build.properties
@@ -9,4 +9,8 @@
service.dir=${lib.dir}/service
client.dir=${lib.dir}/client
+grid.app = ${app_home}/../grid/app
+grid.common=${grid.app}/common
+grid.service=${grid.app}/service
+
platform.version=2024
\ No newline at end of file
diff --git a/Source/Service/WFService/dist/WFService.jar b/Source/Service/WFService/dist/WFService.jar
index 43c8e1a..b62ea36 100644
--- a/Source/Service/WFService/dist/WFService.jar
+++ b/Source/Service/WFService/dist/WFService.jar
Binary files differ
diff --git a/Source/Service/WFService/src/com/vci/server/WorkflowBoxService.java b/Source/Service/WFService/src/com/vci/server/WorkflowBoxService.java
index 1622b58..4b3f48e 100644
--- a/Source/Service/WFService/src/com/vci/server/WorkflowBoxService.java
+++ b/Source/Service/WFService/src/com/vci/server/WorkflowBoxService.java
@@ -3,6 +3,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.vci.server.base.persistence.dao.HibernateSessionFactory;
+import com.vci.server.mw.ServerContextInterceptor;
import com.vci.server.workflow.WorkflowServiceImpl;
import com.zeroc.Ice.Communicator;
import com.zeroc.Ice.Identity;
@@ -17,18 +19,19 @@
@Override
public void start(String name, Communicator communicator, String[] args) {
- LOGGER.info("start servant: WorkflowService");
+ LOGGER.info("start servant: " + name);
+
+ HibernateSessionFactory.getConfiguration();
+
// IceBox
// 鍒涘缓objectAdapter锛岃繖閲屽拰service鍚屽悕
_adapter = communicator.createObjectAdapter(name);
// 鍒涘缓servant
com.zeroc.Ice.Object object = new WorkflowServiceImpl();
- id = Util.stringToIdentity(name);
- // _adapter.add(object, communicator.stringToIdentity(name));
- _adapter.add(object, id);
+ _adapter.add(new ServerContextInterceptor(object), Util.stringToIdentity(name));
// 婵�娲�
_adapter.activate();
- LOGGER.info("start servant success: WorkflowService");
+ LOGGER.info("start servant success: " + name);
}
@Override
diff --git a/Source/Service/WFService/src/com/vci/server/workflow/WorkflowServiceImpl.java b/Source/Service/WFService/src/com/vci/server/workflow/WorkflowServiceImpl.java
index 42b7c55..2d7bea3 100644
--- a/Source/Service/WFService/src/com/vci/server/workflow/WorkflowServiceImpl.java
+++ b/Source/Service/WFService/src/com/vci/server/workflow/WorkflowServiceImpl.java
@@ -1,6 +1,7 @@
package com.vci.server.workflow;
import java.io.IOException;
+import java.util.Date;
import java.util.List;
import org.omg.CORBA.LongHolder;
@@ -26,7 +27,7 @@
import com.vci.corba.workflow.data.TaskDescInfo;
import com.vci.corba.workflow.data.TaskRevokeInfo;
import com.vci.corba.workflow.data.TasksAssignedInfo;
-import com.vci.corba.workflow.method.WorkflowService;
+import com.vci.corba.workflow.WorkflowService;
import com.vci.server.BaseService;
import com.vci.server.workflow.common.resouce.EventProperties;
import com.vci.server.workflow.common.resouce.WorkflowProperties;
@@ -68,6 +69,16 @@
public String getServiceName() {
return ServiceNames.WFSERVICE;
}
+
+ @Override
+ public void test(com.zeroc.Ice.Current current) {
+ String op = current.operation;
+ String adapter = current.adapter.getName();
+ String id = current.id.name;
+ String time = new Date().toString();
+ System.out.println(String.format("== %s [WorkflowService.test] (adapter=%s, id=%s, op=%s)", time, adapter, id, op));
+ }
+
@Override
public ProcessCategoryInfo[] getProcessCategories(String parentId, Current current) throws VCIError {
diff --git a/Source/Service/WFService/src/com/vci/server/workflow/server/interfaceImpl/WorkFlowUserParserImpl.java b/Source/Service/WFService/src/com/vci/server/workflow/server/interfaceImpl/WorkFlowUserParserImpl.java
index 6c01b97..4c47f78 100644
--- a/Source/Service/WFService/src/com/vci/server/workflow/server/interfaceImpl/WorkFlowUserParserImpl.java
+++ b/Source/Service/WFService/src/com/vci/server/workflow/server/interfaceImpl/WorkFlowUserParserImpl.java
@@ -9,7 +9,7 @@
import com.vci.corba.framework.data.DeptInfo;
import com.vci.corba.framework.data.RoleInfo;
import com.vci.corba.framework.data.UserInfo;
-import com.vci.corba.framework.method.FrameworkServicePrx;
+import com.vci.corba.framework.FrameworkServicePrx;
import com.vci.server.base.utility.ServerServiceProvider;
import com.vci.server.workflow.server.interfaces.IWorkflowUserService;
diff --git a/Source/Service/WFWorkItem/build-jar.xml b/Source/Service/WFWorkItem/build-jar.xml
index 9ff8029..72b1c42 100644
--- a/Source/Service/WFWorkItem/build-jar.xml
+++ b/Source/Service/WFWorkItem/build-jar.xml
@@ -2,7 +2,7 @@
<!--classes.jar; src.jar-->
<project name = "platform-WFPlugins" default = "build-WFPlugins-jar" basedir = ".">
- <property file="build.properties"/>
+ <property file="../../build.properties"/>
<target name="time">
<tstamp>
@@ -28,5 +28,7 @@
<include name="**.jar" />
</fileset>
</copy>
+
+
</target>
</project>
\ No newline at end of file
diff --git a/Source/Service/WFWorkItem/build.properties b/Source/Service/WFWorkItem/build.properties
index 4f8a188..c626764 100644
--- a/Source/Service/WFWorkItem/build.properties
+++ b/Source/Service/WFWorkItem/build.properties
@@ -9,4 +9,8 @@
service.dir=${lib.dir}/service
client.dir=${lib.dir}/client
+grid.app = ${app_home}/../grid/app
+grid.common=${grid.app}/common
+grid.service=${grid.app}/service
+
platform.version=2024
\ No newline at end of file
diff --git a/Source/Service/WFWorkItem/dist/WFPlugins.jar b/Source/Service/WFWorkItem/dist/WFPlugins.jar
index 1a87556..40dcf32 100644
--- a/Source/Service/WFWorkItem/dist/WFPlugins.jar
+++ b/Source/Service/WFWorkItem/dist/WFPlugins.jar
Binary files differ
diff --git a/Source/Service/build-service/build-service.xml b/Source/Service/build-service/build-service.xml
index 5dcf983..b138b48 100644
--- a/Source/Service/build-service/build-service.xml
+++ b/Source/Service/build-service/build-service.xml
@@ -3,7 +3,7 @@
<project name = "platform-AllService" default = "build-allservice-jar" basedir = ".">
- <target name="build-allservice-jar" depends="ServiceBase,FrameService,OMDService,OQService,UIService,BOFactory,VolumeService,WFService,ServiceMain"/>
+ <target name="build-allservice-jar" depends="ServiceBase,FrameService,LogService,CacheService,OMDService,OQService,UIService,BOFactory,VolumeService,WFService,ServiceMain"/>
<!-- <target name="Auth2Service">
<ant antfile="${basedir}/../Auth2Service/build-jar.xml" dir="${basedir}/../Auth2Service" target="build-Auth2Service-jar"/>
@@ -16,10 +16,14 @@
<target name="FrameService">
<ant antfile="${basedir}/../FrameService/build-jar.xml" dir="${basedir}/../FrameService" target="build-FrameService-jar"/>
</target>
+
+ <target name="LogService">
+ <ant antfile="${basedir}/../LogService/build-jar.xml" dir="${basedir}/../LogService" target="build-LogService-jar"/>
+ </target>
- <!-- <target name="CacheService">
+ <target name="CacheService">
<ant antfile="${basedir}/../CacheService/build-jar.xml" dir="${basedir}/../CacheService" target="build-CacheService-jar"/>
- </target>-->
+ </target>
<target name="OMDService">
<ant antfile="${basedir}/../OMDService/build-jar.xml" dir="${basedir}/../OMDService" target="build-OMDService-jar"/>
diff --git a/Source/ThirdPart/DBSync/dbsync/.classpath b/Source/ThirdPart/DBSync/dbsync/.classpath
new file mode 100644
index 0000000..1191683
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/.classpath
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Source/DBSync/lib/c3p0-0.9.1.1.jar"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Source/DBSync/lib/commons-logging-1.1.1.jar"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Source/DBSync/lib/dom4j-1.6.1.jar"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Source/DBSync/lib/hamcrest-core-1.3.jar"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Source/DBSync/lib/junit-4.12.jar"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Source/DBSync/lib/log4j-1.2.17.jar"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Source/DBSync/lib/mssql-jdbc-6.2.0.jre8.jar"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Source/DBSync/lib/mysql-connector-java-5.1.22.jar"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Source/DBSync/lib/ojdbc6.jar"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Source/DBSync/lib/quartz-2.1.3.jar"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Source/DBSync/lib/slf4j-api-1.7.2.jar"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Source/DBSync/lib/slf4j-log4j12-1.7.2.jar"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Source/DBSync/lib/xml-apis-1.0.b2.jar"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Bin/libs/base/rmip-system-client.jar"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Bin/libs/base/rmip-system-common.jar"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Bin/libs/base/VCIBase-client.jar"/>
+ <classpathentry kind="lib" path="E:/Workspace/VCI-PLT/PLT2020/Bin/libs/base/VCIBase-common.jar"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/VCI_THIRDLIB"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/Source/ThirdPart/DBSync/dbsync/.project b/Source/ThirdPart/DBSync/dbsync/.project
new file mode 100644
index 0000000..4cfce3c
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>dbsync</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/Source/ThirdPart/DBSync/dbsync/.settings/org.eclipse.jdt.core.prefs b/Source/ThirdPart/DBSync/dbsync/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..8000cd6
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+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.6
diff --git a/Source/ThirdPart/DBSync/dbsync/build-jar.xml b/Source/ThirdPart/DBSync/dbsync/build-jar.xml
new file mode 100644
index 0000000..f73acaa
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/build-jar.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--classes.jar; src.jar-->
+<project name = "dbsync" default = "build-jar" basedir = ".">
+
+ <property file="build.properties"/>
+
+ <target name="time">
+ <tstamp>
+ <format property="build.time" pattern="yyyy.MM.dd.HH.mm" locale="en"/>
+ </tstamp>
+ </target>
+
+
+ <target name="build-jar" depends="time" description="build dbsync jar">
+ <jar jarfile="${basedir}/dist/dbsync.jar" compress="true">
+ <manifest>
+ <attribute name="Built-By" value="${user.name}" />
+ <attribute name="Implementation-Title" value="${ant.project.name}" />
+ <attribute name="Built-Time" value="${build.time}" />
+ </manifest>
+ <fileset dir="${basedir}\bin">
+ <include name="**" />
+ </fileset>
+ </jar>
+ </target>
+</project>
\ No newline at end of file
diff --git a/Source/ThirdPart/DBSync/dbsync/build.properties b/Source/ThirdPart/DBSync/dbsync/build.properties
new file mode 100644
index 0000000..47d1291
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/build.properties
@@ -0,0 +1,5 @@
+#classes.jar; src.jar
+
+src.dir = ${basedir}/src
+
+dist.dir=${basedir}/dist
diff --git a/Source/ThirdPart/DBSync/dbsync/dist/dbsync.jar b/Source/ThirdPart/DBSync/dbsync/dist/dbsync.jar
new file mode 100644
index 0000000..64c5137
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/dist/dbsync.jar
Binary files differ
diff --git a/Source/ThirdPart/DBSync/dbsync/properties/dbSynclog4j.properties b/Source/ThirdPart/DBSync/dbsync/properties/dbSynclog4j.properties
new file mode 100644
index 0000000..70017aa
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/properties/dbSynclog4j.properties
@@ -0,0 +1,23 @@
+#\u5b9a\u4e493\u4e2a\u8f93\u51fa\u7aef
+log4j.rootCategory=ALL,A1,A2
+
+#\u5b9a\u4e49A1\u8f93\u51fa\u5230\u63a7\u5236\u5668
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+#\u5b9a\u4e49A1\u7684\u5e03\u5c40\u6a21\u5f0f\u4e3aPaternLayout
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.console.Target=System.out
+# \u5b9a\u4e49A1\u7684\u8f93\u51fa\u683c\u5f0f
+log4j.appender.A1.layout.ConversionPattern=[%d{yyyy-MM-dd hh:mm:ss}]:%p [%t] (%F:%L) - %m%n
+
+#\u5b9a\u4e49A2\u8f93\u51fa\u5230\u6587\u4ef6
+log4j.appender.A2=org.apache.log4j.RollingFileAppender
+#\u5b9a\u4e49A2\u8f93\u51fa\u5230\u54ea\u4e2a\u6587\u4ef6
+log4j.appender.A2.File=./logs/dbSync.log
+#\u5b9a\u4e49A2\u8f93\u51fa\u6587\u4ef6\u7684\u6700\u5927\u957f\u5ea6
+log4j.appender.A2.MaxFileSize = 10MB
+#\u5b9a\u4e49A2\u7684\u5907\u4efd\u6587\u4ef6\u6570
+log4j.appender.A2.MaxBackupIndex = 10
+#\u5b9a\u4e49A2\u7684\u5e03\u5c40\u6a21\u5f0f\u4e3aPatternLayout
+log4j.appender.A2.layout=org.apache.log4j.PatternLayout
+#\u5b9a\u4e49A2\u7684\u8f93\u51fa\u6a21\u5f0f
+log4j.appender.A2.layout.ConversionPattern=[%d{yyyy-MM-dd hh:mm:ss}]:%p %t %c - %m%n
diff --git a/Source/ThirdPart/DBSync/dbsync/properties/dbjobs---.xml b/Source/ThirdPart/DBSync/dbsync/properties/dbjobs---.xml
new file mode 100644
index 0000000..5aa6981
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/properties/dbjobs---.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<root>
+ <code>4500000001</code>
+<!-- <source>
+ <url>jdbc:mysql://10.2.2.231:3306/guanxing_medical</url>
+ <username>root</username>
+ <password>root</password>
+ <dbtype>mysql</dbtype>
+ <driver>com.mysql.jdbc.Driver</driver>
+ </source>
+ <dest>
+ <url>jdbc:mysql://127.0.0.1:3306/guanxing_medical</url>
+ <username>root</username>
+ <password>root</password>
+ <dbtype>mysql</dbtype>
+ <driver>com.mysql.jdbc.Driver</driver>
+ </dest> -->
+ <source>
+ <url>jdbc:oracle:thin:@127.0.0.1:1521:orcl</url>
+ <username>mpm205</username>
+ <password>vcitest</password>
+ <dbtype>oracle</dbtype>
+ <driver>oracle.jdbc.driver.OracleDriver</driver>
+ </source>
+ <dest>
+ <url>jdbc:oracle:thin:@127.0.0.1:1521:orcl</url>
+ <username>MPM205_REL</username>
+ <password>vcitest</password>
+ <dbtype>oracle</dbtype>
+ <driver>oracle.jdbc.driver.OracleDriver</driver>
+ </dest>
+ <jobs>
+ <!-- <job>
+ <name>pluser</name>
+ <cron>0/300 * * * * ?</cron>
+ <srcSql>select pluid, plusername, plpassword, pltruename, plemail, pldesc, plusertype, plstatus, plpwdupdatetime, plcreatetime, plcreateuser, plupdatetime, plupdateuser, pllicensors, plsecretgrade, plisdeptleader from PLUSER</srcSql>
+ <destTable>pluser</destTable>
+ <destTableFields>pluid, plusername, plpassword, pltruename, plemail, pldesc, plusertype, plstatus, plpwdupdatetime, plcreatetime, plcreateuser, plupdatetime, plupdateuser, pllicensors, plsecretgrade, plisdeptleader</destTableFields>
+ <destTableKey>pluid</destTableKey>
+ <destTableUpdate>plusername, plpassword, pltruename, plemail, pldesc, plusertype, plstatus, plpwdupdatetime, plcreatetime, plcreateuser, plupdatetime, plupdateuser, pllicensors, plsecretgrade, plisdeptleader</destTableUpdate>
+ </job> -->
+ <job>
+ <name>PSM鏁版嵁鍚屾</name>
+ <cron>0 12/3 * * * ?</cron>
+ <item>
+ <name>PLATFORMBTM_PART</name>
+ <direction>true</direction>
+ <operate>both</operate>
+ <srcSql>select oid,revisionoid,nameoid,btmname,islastr,isfirstr,islastv,isfirstv,creator,createtime,lastmodifier,lastmodifytime,revisionrule,versionrule,revisionseq,revisionvalue,versionseq,versionvalue,lctid,lcstatus,ts,id,name,description,owner,checkinby,checkintime,checkoutby,checkouttime,copyfromversion,code,parttype,weight,unit,virtualsource,virtualsourcemdv,bizdomain,gz,keyinfos,materialname,materialspecs,materialtrademark,ownproduct,partsource,secretgrade,thumbnailpath,usematerial,partsofttype,pointlinetype,designedby,storepath,districtidentifer,manufactureunit,materialbz,materialsize,ppartsofttype,ms,techrequirements from PLATFORMBTM_PART</srcSql>
+ <destTable>PLATFORMBTM_PART</destTable>
+ <destTableFields>oid,revisionoid,nameoid,btmname,islastr,isfirstr,islastv,isfirstv,creator,createtime,lastmodifier,lastmodifytime,revisionrule,versionrule,revisionseq,revisionvalue,versionseq,versionvalue,lctid,lcstatus,ts,id,name,description,owner,checkinby,checkintime,checkoutby,checkouttime,copyfromversion,code,parttype,weight,unit,virtualsource,virtualsourcemdv,bizdomain,gz,keyinfos,materialname,materialspecs,materialtrademark,ownproduct,partsource,secretgrade,thumbnailpath,usematerial,partsofttype,pointlinetype,designedby,storepath,districtidentifer,manufactureunit,materialbz,materialsize,ppartsofttype,ms,techrequirements</destTableFields>
+ <destTableKey>oid</destTableKey>
+ <destTableUpdate>revisionoid,nameoid,btmname,islastr,isfirstr,islastv,isfirstv,creator,createtime,lastmodifier,lastmodifytime,revisionrule,versionrule,revisionseq,revisionvalue,versionseq,versionvalue,lctid,lcstatus,ts,id,name,description,owner,checkinby,checkintime,checkoutby,checkouttime,copyfromversion,code,parttype,weight,unit,virtualsource,virtualsourcemdv,bizdomain,gz,keyinfos,materialname,materialspecs,materialtrademark,ownproduct,partsource,secretgrade,thumbnailpath,usematerial,partsofttype,pointlinetype,designedby,storepath,districtidentifer,manufactureunit,materialbz,materialsize,ppartsofttype,ms,techrequirements</destTableUpdate>
+ </item>
+ <item>
+ <name>PLATFORMBTM_PARTINSTANCE</name>
+ <direction>true</direction>
+ <operate>both</operate>
+ <srcSql>select oid, revisionoid, nameoid, btmname, islastr, isfirstr, islastv, isfirstv, creator, createtime, lastmodifier, lastmodifytime, revisionrule, versionrule, revisionseq, revisionvalue, versionseq, versionvalue, lctid, lcstatus, ts, id, name, description, owner, checkinby, checkintime, checkoutby, checkouttime, copyfromversion, cadtoken, lmtoken, partoid, pointlinepath, cadposition, lmposition, fpartoid, sourceoid, enduser from PLATFORMBTM_PARTINSTANCE</srcSql>
+ <destTable>PLATFORMBTM_PARTINSTANCE</destTable>
+ <destTableFields>oid, revisionoid, nameoid, btmname, islastr, isfirstr, islastv, isfirstv, creator, createtime, lastmodifier, lastmodifytime, revisionrule, versionrule, revisionseq, revisionvalue, versionseq, versionvalue, lctid, lcstatus, ts, id, name, description, owner, checkinby, checkintime, checkoutby, checkouttime, copyfromversion, cadtoken, lmtoken, partoid, pointlinepath, cadposition, lmposition, fpartoid, sourceoid, enduser</destTableFields>
+ <destTableKey>oid</destTableKey>
+ <destTableUpdate>revisionoid, nameoid, btmname, islastr, isfirstr, islastv, isfirstv, creator, createtime, lastmodifier, lastmodifytime, revisionrule, versionrule, revisionseq, revisionvalue, versionseq, versionvalue, lctid, lcstatus, ts, id, name, description, owner, checkinby, checkintime, checkoutby, checkouttime, copyfromversion, cadtoken, lmtoken, partoid, pointlinepath, cadposition, lmposition, fpartoid, sourceoid, enduser</destTableUpdate>
+ </item>
+ <item>
+ <name>PLATFORMLT_PBOM</name>
+ <direction>true</direction>
+ <operate>both</operate>
+ <srcSql>select oid, creator, createtime, lastmodifier, lastmodifytime, f_oid, f_revisionoid, f_nameoid, f_btwname, t_oid, t_revisionoid, t_nameoid, t_btwname, ts, sequence, dboid, snapshotoid, countstr, unit, measureunit, quantity, valid, bompath, sourcepos from PLATFORMLT_PBOM</srcSql>
+ <destTable>PLATFORMLT_PBOM</destTable>
+ <destTableFields>oid, creator, createtime, lastmodifier, lastmodifytime, f_oid, f_revisionoid, f_nameoid, f_btwname, t_oid, t_revisionoid, t_nameoid, t_btwname, ts, sequence, dboid, snapshotoid, countstr, unit, measureunit, quantity, valid, bompath, sourcepos</destTableFields>
+ <destTableKey>oid</destTableKey>
+ <destTableUpdate>creator, createtime, lastmodifier, lastmodifytime, f_oid, f_revisionoid, f_nameoid, f_btwname, t_oid, t_revisionoid, t_nameoid, t_btwname, ts, sequence, dboid, snapshotoid, countstr, unit, measureunit, quantity, valid, bompath, sourcepos</destTableUpdate>
+ </item>
+ </job>
+ </jobs>
+</root>
\ No newline at end of file
diff --git a/Source/ThirdPart/DBSync/dbsync/properties/dbjobs.xml b/Source/ThirdPart/DBSync/dbsync/properties/dbjobs.xml
new file mode 100644
index 0000000..cf2aad0
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/properties/dbjobs.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<root>
+ <code>4500000001</code>
+<!-- <source>
+ <url>jdbc:mysql://10.2.2.231:3306/guanxing_medical</url>
+ <username>root</username>
+ <password>root</password>
+ <dbtype>mysql</dbtype>
+ <driver>com.mysql.jdbc.Driver</driver>
+ </source>
+ <dest>
+ <url>jdbc:mysql://127.0.0.1:3306/guanxing_medical</url>
+ <username>root</username>
+ <password>root</password>
+ <dbtype>mysql</dbtype>
+ <driver>com.mysql.jdbc.Driver</driver>
+ </dest> -->
+ <source>
+ <url>jdbc:oracle:thin:@localhost:1521:orcl</url>
+ <username>mpm205</username>
+ <password>vcitest</password>
+ <dbtype>oracle</dbtype>
+ <driver>oracle.jdbc.driver.OracleDriver</driver>
+ </source>
+ <srcVM>
+ <url>localhost:30000</url>
+ <identity>mpm205-</identity>
+ <service>VolumnFactoryService</service>
+ </srcVM>
+ <dest>
+ <url>jdbc:oracle:thin:@172.16.0.30:1521:orcl</url>
+ <username>mpm205</username>
+ <password>vcitest</password>
+ <dbtype>oracle</dbtype>
+ <driver>oracle.jdbc.driver.OracleDriver</driver>
+ </dest>
+ <destVM>
+ <url>172.16.0.33:30000</url>
+ <identity>vci-mpm205-</identity>
+ <service>VolumnFactoryService</service>
+ </destVM>
+ <jobs>
+ <job>
+ <name>鏁版嵁鍚屾娴嬭瘯</name>
+ <cron>0 0/1 * * * ?</cron>
+ <!-- <item>
+ <name>pluser</name>
+ <direction>true</direction>
+ <operate>both</operate>
+ <srcSql>select pluid, plusername, plpassword, pltruename, plemail, pldesc, plusertype, plstatus, plpwdupdatetime, plcreatetime, plcreateuser, plupdatetime, plupdateuser, pllicensors, plsecretgrade, plisdeptleader from PLUSER</srcSql>
+ <destTable>pluser</destTable>
+ <destTableFields>pluid, plusername, plpassword, pltruename, plemail, pldesc, plusertype, plstatus, plpwdupdatetime, plcreatetime, plcreateuser, plupdatetime, plupdateuser, pllicensors, plsecretgrade, plisdeptleader</destTableFields>
+ <destTableKey>pluid</destTableKey>
+ <destTableUpdate>plusername, plpassword, pltruename, plemail, pldesc, plusertype, plstatus, plpwdupdatetime, plcreatetime, plcreateuser, plupdatetime, plupdateuser, pllicensors, plsecretgrade, plisdeptleader</destTableUpdate>
+ </item> -->
+ <item>
+ <name>PLATFORMBTM_FILEOBJECT</name>
+ <direction>true</direction>
+ <operate>both</operate>
+ <srcSql>SELECT OID, REVISIONOID, NAMEOID, BTMNAME, ISLASTR, ISFIRSTR, ISLASTV, ISFIRSTV, CREATOR, CREATETIME, LASTMODIFIER, LASTMODIFYTIME, REVISIONRULE, VERSIONRULE, REVISIONSEQ, REVISIONVALUE, VERSIONSEQ, VERSIONVALUE, LCTID, LCSTATUS, TS, ID, NAME, DESCRIPTION, OWNER, CHECKINBY, CHECKINTIME, CHECKOUTBY, CHECKOUTTIME, COPYFROMVERSION, DOCUMENTOID, DRAWINGSIZE, FILEEXTENSION, FILEPATH, FILESIZE, FILEVERSION, FORMATVERSION, KEYINFOS, OWNBIZOID, OWNBTMNAME, OWNFORMATOID, PAGESNUM, REVISIONLIMIT, SECRETGRADE, MDCODE FROM PLATFORMBTM_FILEOBJECT</srcSql>
+ <destTable>PLATFORMBTM_FILEOBJECT</destTable>
+ <destTableFields>OID, REVISIONOID, NAMEOID, BTMNAME, ISLASTR, ISFIRSTR, ISLASTV, ISFIRSTV, CREATOR, CREATETIME, LASTMODIFIER, LASTMODIFYTIME, REVISIONRULE, VERSIONRULE, REVISIONSEQ, REVISIONVALUE, VERSIONSEQ, VERSIONVALUE, LCTID, LCSTATUS, TS, ID, NAME, DESCRIPTION, OWNER, CHECKINBY, CHECKINTIME, CHECKOUTBY, CHECKOUTTIME, COPYFROMVERSION, DOCUMENTOID, DRAWINGSIZE, FILEEXTENSION, FILEPATH, FILESIZE, FILEVERSION, FORMATVERSION, KEYINFOS, OWNBIZOID, OWNBTMNAME, OWNFORMATOID, PAGESNUM, REVISIONLIMIT, SECRETGRADE, MDCODE</destTableFields>
+ <destTableKey>OID</destTableKey>
+ <destTableUpdate>REVISIONOID, NAMEOID, BTMNAME, ISLASTR, ISFIRSTR, ISLASTV, ISFIRSTV, CREATOR, CREATETIME, LASTMODIFIER, LASTMODIFYTIME, REVISIONRULE, VERSIONRULE, REVISIONSEQ, REVISIONVALUE, VERSIONSEQ, VERSIONVALUE, LCTID, LCSTATUS, TS, ID, NAME, DESCRIPTION, OWNER, CHECKINBY, CHECKINTIME, CHECKOUTBY, CHECKOUTTIME, COPYFROMVERSION, DOCUMENTOID, DRAWINGSIZE, FILEEXTENSION, FILEPATH, FILESIZE, FILEVERSION, FORMATVERSION, KEYINFOS, OWNBIZOID, OWNBTMNAME, OWNFORMATOID, PAGESNUM, REVISIONLIMIT, SECRETGRADE, MDCODE</destTableUpdate>
+ </item>
+ </job>
+ <!-- <job>
+ <name>PSM鏁版嵁鍚屾</name>
+ <cron>0 0/1 * * * ?</cron>
+ <item>
+ <name>PLATFORMBTM_USER</name>
+ <direction>true</direction>
+ <operate>both</operate>
+ <srcSql>select oid ,revisionoid, nameoid, btmname,islastr, isfirstr, islastv, isfirstv,creator, createtime, lastmodifier, lastmodifytime, revisionrule, versionrule, revisionseq, revisionvalue, versionseq, versionvalue, lctid, lcstatus, ts, id, name, description, owner, checkinby from PLATFORMBTM_USER </srcSql>
+ <destTable>PLATFORMBTM_USER</destTable>
+ <destTableFields>oid, revisionoid, nameoid, btmname,islastr, isfirstr, islastv, isfirstv,creator, createtime, lastmodifier, lastmodifytime, revisionrule, versionrule, revisionseq, revisionvalue, versionseq, versionvalue, lctid, lcstatus, ts, id, name, description, owner, checkinby</destTableFields>
+ <destTableKey>oid</destTableKey>
+ <destTableUpdate>revisionoid, nameoid, btmname,islastr, isfirstr, islastv, isfirstv,creator, createtime, lastmodifier, lastmodifytime, revisionrule, versionrule, revisionseq, revisionvalue, versionseq, versionvalue, lctid, lcstatus, ts, id, name, description, owner, checkinby</destTableUpdate>
+ </item>
+
+ <item>
+ <name>PLATFORMBTM_PARTINSTANCE</name>
+ <direction>true</direction>
+ <operate>both</operate>
+ <srcSql>select oid, revisionoid, nameoid, btmname, islastr, isfirstr, islastv, isfirstv, creator, createtime, lastmodifier, lastmodifytime, revisionrule, versionrule, revisionseq, revisionvalue, versionseq, versionvalue, lctid, lcstatus, ts, id, name, description, owner, checkinby, checkintime, checkoutby, checkouttime, copyfromversion, cadtoken, lmtoken, partoid, pointlinepath, cadposition, lmposition, fpartoid, sourceoid, enduser from PLATFORMBTM_PARTINSTANCE</srcSql>
+ <destTable>PLATFORMBTM_PARTINSTANCE</destTable>
+ <destTableFields>oid, revisionoid, nameoid, btmname, islastr, isfirstr, islastv, isfirstv, creator, createtime, lastmodifier, lastmodifytime, revisionrule, versionrule, revisionseq, revisionvalue, versionseq, versionvalue, lctid, lcstatus, ts, id, name, description, owner, checkinby, checkintime, checkoutby, checkouttime, copyfromversion, cadtoken, lmtoken, partoid, pointlinepath, cadposition, lmposition, fpartoid, sourceoid, enduser</destTableFields>
+ <destTableKey>oid</destTableKey>
+ <destTableUpdate>revisionoid, nameoid, btmname, islastr, isfirstr, islastv, isfirstv, creator, createtime, lastmodifier, lastmodifytime, revisionrule, versionrule, revisionseq, revisionvalue, versionseq, versionvalue, lctid, lcstatus, ts, id, name, description, owner, checkinby, checkintime, checkoutby, checkouttime, copyfromversion, cadtoken, lmtoken, partoid, pointlinepath, cadposition, lmposition, fpartoid, sourceoid, enduser</destTableUpdate>
+ </item>
+ <item>
+ <name>PLATFORMLT_PBOM</name>
+ <direction>true</direction>
+ <operate>both</operate>
+ <srcSql>select oid, creator, createtime, lastmodifier, lastmodifytime, f_oid, f_revisionoid, f_nameoid, f_btwname, t_oid, t_revisionoid, t_nameoid, t_btwname, ts, sequence, dboid, snapshotoid, countstr, unit, measureunit, quantity, valid, bompath, sourcepos from PLATFORMLT_PBOM</srcSql>
+ <destTable>PLATFORMLT_PBOM</destTable>
+ <destTableFields>oid, creator, createtime, lastmodifier, lastmodifytime, f_oid, f_revisionoid, f_nameoid, f_btwname, t_oid, t_revisionoid, t_nameoid, t_btwname, ts, sequence, dboid, snapshotoid, countstr, unit, measureunit, quantity, valid, bompath, sourcepos</destTableFields>
+ <destTableKey>oid</destTableKey>
+ <destTableUpdate>creator, createtime, lastmodifier, lastmodifytime, f_oid, f_revisionoid, f_nameoid, f_btwname, t_oid, t_revisionoid, t_nameoid, t_btwname, ts, sequence, dboid, snapshotoid, countstr, unit, measureunit, quantity, valid, bompath, sourcepos</destTableUpdate>
+ </item>
+ </job>
+ -->
+ </jobs>
+</root>
\ No newline at end of file
diff --git a/Source/ThirdPart/DBSync/dbsync/readme.txt b/Source/ThirdPart/DBSync/dbsync/readme.txt
new file mode 100644
index 0000000..4131197
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/readme.txt
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<root>
+ <!--鍚屾鏈嶅姟缂栫爜锛屾病浠�涔堝疄闄呮剰涔夛紝鍦ㄥ紓甯镐俊鎭腑浼氫娇鐢�-->
+ <code>4500000001</code>
+ <!--婧愭暟鎹簮-->
+ <source>
+ <!--鏁版嵁婧恥rl-->
+ <url>jdbc:oracle:thin:@127.0.0.1:1521:orcl</url>
+ <!--鐢ㄦ埛鍚�-->
+ <username>mpm205</username>
+ <!--鐢ㄦ埛瀵嗙爜-->
+ <password>vcitest</password>
+ <!--鏁版嵁搴撶被鍨嬶紝oracle锛宮ysql锛宻qlserver-->
+ <dbtype>oracle</dbtype>
+ <!--鏁版嵁搴撻┍鍔�-->
+ <driver>oracle.jdbc.driver.OracleDriver</driver>
+ </source>
+ <!--鐩爣鏁版嵁婧�-->
+ <dest>
+ <url>jdbc:oracle:thin:@127.0.0.1:1521:orcl</url>
+ <username>MPM205_REL</username>
+ <password>vcitest</password>
+ <dbtype>oracle</dbtype>
+ <driver>oracle.jdbc.driver.OracleDriver</driver>
+ </dest>
+ <jobs>
+ <!--璁″垝浠诲姟-->
+ <job>
+ <!--鍚嶇О-->
+ <name>PSM鏁版嵁鍚屾</name>
+ <!--浠诲姟璋冨害鏃堕棿-->
+ <cron>0 2/30 * * * ?</cron>
+ <!--鏁版嵁搴撳悓姝ラ」-->
+ <item>
+ <!--鍚屾椤瑰悕绉�-->
+ <name>PLATFORMBTM_PART</name>
+ <!--鍚屾鏂瑰悜锛宼rue锛氭鍚戯紝浠庢簮鍒扮洰鏍囷紝false锛氬弽鍚戯紝浠庣洰鏍囧埌婧�-->
+ <direction>true</direction>
+ <!--鍚屾鎿嶄綔绫诲瀷锛宨nsert锛氭病鏈夊垯鎻掑叆锛屾湁鍒欎笉澶勭悊锛寀pdate锛氭湁鍒欐洿鏂帮紝娌℃湁鍒欎笉澶勭悊锛宐oth锛氭病鏈夊垯鎻掑叆锛屾湁鍒欐洿鏂�-->
+ <operate>both</operate>
+ <!--婧愭暟鎹�夋嫨SQL璇彞-->
+ <srcSql>select oid,revisionoid,nameoid,btmname from PLATFORMBTM_PART</srcSql>
+ <!--鐩爣鏁版嵁琛�-->
+ <destTable>PLATFORMBTM_PART</destTable>
+ <!--鐩爣鏁版嵁琛ㄥ瓧娈�-->
+ <destTableFields>oid,revisionoid,nameoid,btmname</destTableFields>
+ <!--鐩爣琛ㄤ富閿�-->
+ <destTableKey>oid</destTableKey>
+ <!--鏇存柊瀛楁-->
+ <destTableUpdate>revisionoid,nameoid,btmname</destTableUpdate>
+ </item>
+ </job>
+ </jobs>
+</root>
\ No newline at end of file
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/Constants.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/Constants.java
new file mode 100644
index 0000000..c7e411a
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/Constants.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright 2018-2118 the original author or authors.
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.vci.dbsync;
+
+/**
+ * @author liuyazhuang
+ * @date 2018/9/11 10:15
+ * @description 甯搁噺绫�
+ * @version 1.0.0
+ */
+public class Constants {
+
+ /**
+ * sqlserver鏁版嵁搴�
+ */
+ public static final String TYPE_DB_SQLSERVER = "sqlserver";
+
+ /**
+ * MySQL鏁版嵁搴�
+ */
+ public static final String TYPE_DB_MYSQL = "mysql";
+
+ /**
+ * Oracle鏁版嵁搴�
+ */
+ public static final String TYPE_DB_ORACLE = "oracle";
+
+ /**
+ * 閰嶇疆鏂囦欢鍚嶇О
+ */
+ public static final String CONFIG_FILE = "jobs.xml";
+
+ /**
+ * 搴忓垪鍖栨爣璇嗙殑瀛楁
+ */
+ public static final String FIELD_SERIALVERSIONUID = "serialVersionUID";
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/DBSync.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/DBSync.java
new file mode 100644
index 0000000..b3f0f1b
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/DBSync.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright 2018-2118 the original author or authors.
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.vci.dbsync;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.List;
+
+import com.vci.corba.common.VCIError;
+import com.vci.dbsync.entity.JobItem;
+import com.vci.dbsync.filesync.FileSync;
+
+/**
+ * @author liuyazhuang
+ * @date 2018/9/11 10:19
+ * @description 鏁版嵁搴撳悓姝ユ帴鍙�
+ * @version 1.0.0
+ */
+public interface DBSync {
+ /**
+ *
+ * @param paramString:鍚屾鍙傛暟
+ * @param paramConnection锛氭暟鎹簱杩炴帴
+ * @param paramJobInfo锛氬悓姝ヤ换鍔�
+ * @return
+ * @throws SQLException
+ */
+ long assembleSQL(JobItem jobItem, Connection srcConn, Connection destConn, FileSync fileSync) throws SQLException, VCIError;
+ /**
+ *
+ * @param sql锛氳鎵ц鐨凷QL璇彞
+ * @param conn锛氭暟鎹簱杩炴帴
+ * @throws SQLException
+ */
+ void executeSQL(List<String> sqls, Connection conn) throws SQLException;
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/DBSyncBuilder.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/DBSyncBuilder.java
new file mode 100644
index 0000000..57b4bff
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/DBSyncBuilder.java
@@ -0,0 +1,171 @@
+/**
+ * Copyright 2018-2118 the original author or authors.
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.vci.dbsync;
+
+import static org.quartz.CronScheduleBuilder.cronSchedule;
+import static org.quartz.JobBuilder.newJob;
+import static org.quartz.TriggerBuilder.newTrigger;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.quartz.CronTrigger;
+import org.quartz.JobDetail;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerFactory;
+import org.quartz.impl.StdSchedulerFactory;
+
+import com.vci.dbsync.entity.DBInfo;
+import com.vci.dbsync.entity.JobInfo;
+import com.vci.dbsync.entity.VMInfo;
+import com.vci.dbsync.log.SyncLog;
+import com.vci.dbsync.utils.Tool;
+import com.vci.dbsync.JobTask;
+
+/**
+ * @author liuyazhuang
+ * @date 2018/9/11 10:08
+ * @description 鍚屾鏁版嵁搴撴暟鎹殑Builder瀵硅薄
+ * @version 1.0.0
+ */
+public class DBSyncBuilder {
+
+ private DBInfo srcDb;
+ private DBInfo destDb;
+
+ private VMInfo srcVM;
+ private VMInfo destVM;
+
+ private List<JobInfo> jobList;
+ private String code;
+ //private static Logger logger = Logger.getLogger(DBSyncBuilder.class);
+
+ private DBSyncBuilder(){
+ }
+
+ /**
+ * 鍒涘缓DBSyncBuilder瀵硅薄
+ * @return DBSyncBuilder瀵硅薄
+ */
+ public static DBSyncBuilder builder(){
+ return new DBSyncBuilder();
+ }
+
+ /**
+ * 鍒濆鍖栨暟鎹簱淇℃伅骞惰В鏋恓obs.xml濉厖鏁版嵁
+ * @return DBSyncBuilder瀵硅薄
+ */
+ public DBSyncBuilder init() {
+ srcDb = new DBInfo();
+ destDb = new DBInfo();
+
+ srcVM = new VMInfo();
+ destVM = new VMInfo();
+
+ jobList = new ArrayList<JobInfo>();
+ SAXReader reader = new SAXReader();
+ try {
+ // 璇诲彇xml鐨勯厤缃枃浠跺悕锛屽苟鑾峰彇鍏堕噷闈㈢殑鑺傜偣
+ Element root = reader.read("properties/dbjobs.xml").getRootElement();
+ Element src = root.element("source");
+ Element dest = root.element("dest");
+
+ Element srcVMNode = root.element("srcVM");
+ Element destVMNode = root.element("destVM");
+
+ Element jobs = root.element("jobs");
+ // 閬嶅巻job鍗冲悓姝ョ殑琛�
+ for (@SuppressWarnings("rawtypes")
+ Iterator it = jobs.elementIterator("job"); it.hasNext();) {
+ Element e = (Element) it.next();
+
+ JobInfo job = new JobInfo();
+ job.setName(e.elementTextTrim("name"));
+ job.setCron(e.elementTextTrim("cron"));
+
+ job.initJobItems(e);
+
+ jobList.add(job);
+
+ //jobList.add((JobInfo) elementInObject((Element) it.next(), new JobInfo()));
+ }
+ //
+ Tool.elementInObject(src, srcDb);
+ Tool.elementInObject(dest, destDb);
+ Tool.elementInObject(srcVMNode, srcVM);
+ Tool.elementInObject(destVMNode, destVM);
+
+ code = root.element("code").getTextTrim();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return this;
+ }
+
+// /**
+// * 瑙f瀽e涓殑鍏冪礌锛屽皢鏁版嵁濉厖鍒皁涓�
+// * @param e 瑙f瀽鐨刋ML Element瀵硅薄
+// * @param o 瀛樻斁瑙f瀽鍚庣殑XML Element瀵硅薄
+// * @return 瀛樻斁鏈夎В鏋愬悗鏁版嵁鐨凮bject
+// * @throws IllegalArgumentException
+// * @throws IllegalAccessException
+// */
+// public Object elementInObject(Element e, Object o) throws IllegalArgumentException, IllegalAccessException {
+// Field[] fields = o.getClass().getDeclaredFields();
+// for (int index = 0; index < fields.length; index++) {
+// Field item = fields[index];
+// //褰撳墠瀛楁涓嶆槸serialVersionUID锛屽悓鏃跺綋鍓嶅瓧娈典笉鍖呭惈serialVersionUID
+// if (!Constants.FIELD_SERIALVERSIONUID.equals(item.getName()) && !item.getName().contains(Constants.FIELD_SERIALVERSIONUID)){
+// item.setAccessible(true);
+// item.set(o, e.element(item.getName()).getTextTrim());
+// }
+// }
+// return o;
+// }
+
+ /**
+ * 鍚姩瀹氭椂浠诲姟锛屽悓姝ユ暟鎹簱鐨勬暟鎹�
+ */
+ public void start() {
+ for (int index = 0; index < jobList.size(); index++) {
+ JobInfo jobInfo = jobList.get(index);
+ String logTitle = "[" + code + "]" + jobInfo.getName() + " ";
+ try {
+ SchedulerFactory sf = new StdSchedulerFactory();
+ Scheduler sched = sf.getScheduler();
+ JobDetail job = newJob(JobTask.class).withIdentity("job-" + jobInfo.getName(), code).build();
+ job.getJobDataMap().put("srcDb", srcDb);
+ job.getJobDataMap().put("destDb", destDb);
+ job.getJobDataMap().put("srcVM", srcVM);
+ job.getJobDataMap().put("destVM", destVM);
+
+ job.getJobDataMap().put("jobInfo", jobInfo);
+ job.getJobDataMap().put("logTitle", logTitle);
+ SyncLog.logger.info(jobInfo.getCron());
+ CronTrigger trigger = newTrigger().withIdentity("trigger-" + jobInfo.getName(), code).withSchedule(cronSchedule(jobInfo.getCron())).build();
+ sched.scheduleJob(job, trigger);
+ sched.start();
+ } catch (Exception e) {
+ SyncLog.logger.info(logTitle + e.getMessage());
+ SyncLog.logger.info(logTitle + " run failed");
+ continue;
+ }
+ }
+ }
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/DBSyncFactory.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/DBSyncFactory.java
new file mode 100644
index 0000000..31c6202
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/DBSyncFactory.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright 2018-2118 the original author or authors.
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.vci.dbsync;
+
+import com.vci.dbsync.Constants;
+import com.vci.dbsync.DBSync;
+import com.vci.dbsync.dbimpl.MySQLSync;
+import com.vci.dbsync.dbimpl.OracleSync;
+import com.vci.dbsync.dbimpl.SQLServerSync;
+import com.vci.dbsync.utils.StringUtils;
+
+/**
+ * @author liuyazhuang
+ * @date 2018/9/11 10:17
+ * @description 鍒涘缓鍚屾瀵硅薄鐨勫伐鍘傜被
+ * @version 1.0.0
+ */
+public class DBSyncFactory {
+
+ /**
+ * 鏍规嵁鏁版嵁搴撶殑绫诲瀷鍒涘缓涓嶅悓鐨勫悓姝ユ暟鎹簱鏁版嵁鐨勫璞�
+ *
+ * @param type:鏁版嵁搴撶被鍨�
+ * @return 鍚屾鏁版嵁搴撴暟鎹殑瀵硅薄
+ */
+ public static DBSync create(String type) {
+ if (StringUtils.isEmpty(type))
+ return null;
+
+ if (type.equalsIgnoreCase(Constants.TYPE_DB_MYSQL))
+ return new MySQLSync();
+ else if (type.equalsIgnoreCase(Constants.TYPE_DB_SQLSERVER))
+ return new SQLServerSync();
+ else if (type.equalsIgnoreCase(Constants.TYPE_DB_ORACLE))
+ return new OracleSync();
+ else
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/JobTask.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/JobTask.java
new file mode 100644
index 0000000..0c9da08
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/JobTask.java
@@ -0,0 +1,203 @@
+/**
+ * Copyright 2018-2118 the original author or authors.
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.vci.dbsync;
+
+import org.quartz.Job;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import com.vci.corba.common.VCIError;
+import com.vci.dbsync.entity.DBInfo;
+import com.vci.dbsync.entity.JobInfo;
+import com.vci.dbsync.entity.JobItem;
+import com.vci.dbsync.entity.VMInfo;
+import com.vci.dbsync.filesync.FileSync;
+import com.vci.dbsync.log.SyncLog;
+import com.vci.dbsync.DBSyncFactory;
+import com.vci.dbsync.DBSync;
+
+//import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Date;
+
+/**
+ * @author liuyazhuang
+ * @date 2018/9/11 10:30
+ * @description 鍚屾鏁版嵁搴撲换鍔$殑鍏蜂綋瀹炵幇
+ * @version 1.0.0
+ */
+public class JobTask implements Job {
+ //private Logger logger = Logger.getLogger(JobTask.class);
+
+ /**
+ * 鎵ц鍚屾鏁版嵁搴撲换鍔�
+ *
+ */
+ @Override
+ public void execute(JobExecutionContext context) throws JobExecutionException {
+ JobDataMap data = context.getJobDetail().getJobDataMap();
+ JobInfo jobInfo = (JobInfo) data.get("jobInfo");
+
+ SyncLog.logger.info("寮�濮嬩换鍔°��" + jobInfo.getName() + "銆� 璋冨害: " + new Date());
+
+ Connection inConn = null;
+ Connection outConn = null;
+ DBInfo srcDb = (DBInfo) data.get("srcDb");
+ DBInfo destDb = (DBInfo) data.get("destDb");
+
+ VMInfo srcVM = (VMInfo) data.get("srcVM");
+ VMInfo destVM = (VMInfo) data.get("destVM");
+
+ String logTitle = (String) data.get("logTitle");
+
+ try {
+ inConn = createConnection(srcDb);
+ outConn = createConnection(destDb);
+ if (inConn == null) {
+ SyncLog.logger.info("璇锋鏌ユ簮鏁版嵁杩炴帴!");
+ return;
+ } else if (outConn == null) {
+ SyncLog.logger.info("璇锋鏌ョ洰鏍囨暟鎹繛鎺�!");
+ return;
+ }
+
+ DBSync dbHelper = DBSyncFactory.create(destDb.getDbtype());
+
+ if (dbHelper == null) {
+ SyncLog.logger.info("涓嶆敮鎸佺殑鏁版嵁搴撶被鍨�!");
+ return;
+ }
+
+
+ JobItem[] items = jobInfo.Items();
+
+ //ArrayList<String> lstSql = new ArrayList<String>();
+ for (JobItem item : items) {
+ SyncLog.logger.info("寮�濮嬪悓姝ワ細 " + item.getName());
+
+ long start = new Date().getTime();
+
+ FileSync fileSync = null;
+ if (item.getName().equalsIgnoreCase("PLATFORMBTM_FILEOBJECT")){
+ fileSync = new FileSync(srcVM, destVM);
+ if (item.getDirection()) {
+ fileSync.Init(true);
+ } else {
+ fileSync.Init(false);
+ }
+ }
+
+ long count = 0;
+ if (item.getDirection())
+ {
+ count = dbHelper.assembleSQL(item, inConn, outConn, fileSync);
+ }
+ else
+ {
+ count = dbHelper.assembleSQL(item, outConn, inConn, fileSync);
+ }
+
+ SyncLog.logger.info("鍚屾銆�" + item.getName() + "銆戞煡璇㈠埌 " + count + " 鏉¤褰曪紝鍚屾鑰楁椂锛� " + (new Date().getTime() - start) + "ms");
+
+ if (fileSync != null){
+ SyncLog.logger.info("鍚屾銆�" + item.getName() + "銆戞枃浠舵暟锛� " + fileSync.getCount());
+ fileSync.close();
+ }
+
+// try {
+// FileWriter file = new FileWriter("e:\\test.sql");
+//
+// String sNewLine = System.getProperty("line.separator");
+// for (int i = 0; i < sqls.length; i++) {
+// file.write(sqls[i]); // 鍚戞枃浠朵腑鍐欏叆鏁版嵁
+// file.write(sNewLine); // \r\n琛ㄧず鎹㈣
+// }
+// // file.write(sqls.toString());
+// file.close();
+// } catch (IOException e) {
+// e.printStackTrace();
+// }
+
+// SyncLog.logger.info("缁勮SQL鑰楁椂锛�: " + (new Date().getTime() - start) + "ms");
+// if (lstSql.size() > 0) {
+// SyncLog.logger.debug(lstSql);
+// long eStart = new Date().getTime();
+// dbHelper.executeSQL(lstSql, outConn);
+// SyncLog.logger.info("鎵цSQL璇彞鑰楁椂锛� " + (new Date().getTime() - eStart) + "ms");
+// }
+ }
+ } catch (SQLException e) {
+ try {
+ outConn.rollback();
+ } catch (SQLException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ }
+ e.printStackTrace();
+ SyncLog.logger.error(logTitle + e.getMessage());
+ SyncLog.logger.error(logTitle + " SQL鎵ц鍑洪敊锛岃妫�鏌ユ槸鍚﹀瓨鍦ㄨ娉曢敊璇�");
+ } catch (VCIError ex){
+ ex.printStackTrace();
+ } catch (Exception ex){
+ ex.printStackTrace();
+ }
+ finally {
+ SyncLog.logger.info("鍏抽棴婧愭暟鎹簱杩炴帴");
+ destoryConnection(inConn);
+ SyncLog.logger.info("鍏抽棴鐩爣鏁版嵁搴撹繛鎺�");
+ destoryConnection(outConn);
+ }
+ }
+
+ /**
+ * 鍒涘缓鏁版嵁搴撹繛鎺�
+ * @param db
+ * @return
+ */
+ private Connection createConnection(DBInfo db) {
+ try {
+ Class.forName(db.getDriver());
+ Connection conn = DriverManager.getConnection(db.getUrl(), db.getUsername(), db.getPassword());
+ conn.setAutoCommit(false);
+ return conn;
+ } catch (Exception e) {
+ SyncLog.logger.error(e.getMessage());
+ }
+ return null;
+ }
+
+ /**
+ * 鍏抽棴骞堕攢姣佹暟鎹簱杩炴帴
+ * @param conn
+ */
+ private void destoryConnection(Connection conn) {
+ try {
+ if (conn != null) {
+ conn.close();
+ conn = null;
+ //SyncLog.logger.info("鏁版嵁搴撹繛鎺ュ叧闂�");
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/Main.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/Main.java
new file mode 100644
index 0000000..a653bb4
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/Main.java
@@ -0,0 +1,21 @@
+package com.vci.dbsync;
+
+import java.util.Date;
+
+import com.vci.dbsync.DBSyncBuilder;
+import com.vci.dbsync.log.SyncLog;
+import com.vci.dbsync.utils.DateUtils;
+
+public class Main {
+ //private static Logger logger = Logger.getLogger(DBSyncBuilder.class);
+
+ public static void main(String[] args) {
+
+ //PropertyConfigurator.configure("/resources/log4j.properties");
+
+ SyncLog.logger.info("鍚屾鏁版嵁寮�濮�===>>>" + DateUtils.parseDateToString(new Date(), DateUtils.DATE_TIME_FORMAT));
+ DBSyncBuilder.builder().init().start();
+ //SyncLog.logger.info("鍚屾鏁版嵁缁撴潫===>>>" + DateUtils.parseDateToString(new Date(), DateUtils.DATE_TIME_FORMAT));
+ }
+
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/dbimpl/AbstractDBSync.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/dbimpl/AbstractDBSync.java
new file mode 100644
index 0000000..20702ed
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/dbimpl/AbstractDBSync.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright 2018-2118 the original author or authors.
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.vci.dbsync.dbimpl;
+
+import com.vci.dbsync.DBSync;
+
+/**
+ * @author liuyazhuang
+ * @date 2018/9/11 10:20
+ * @description 鎵ц鏁版嵁搴撳悓姝ョ殑鎶借薄绫�
+ * @version 1.0.0
+ */
+public abstract class AbstractDBSync implements DBSync {
+ /**
+ * 鍘婚櫎String鏁扮粍姣忎釜鍏冪礌涓殑绌烘牸
+ * @param src 闇�瑕佸幓闄ょ┖鏍肩殑鏁扮粍
+ * @return 鍘婚櫎绌烘牸鍚庣殑鏁扮粍
+ */
+ protected String[] trimArrayItem(String[] src){
+ if(src == null || src.length == 0) return src;
+ String[] dest = new String[src.length];
+ for(int i = 0; i < src.length; i++){
+ dest[i] = src[i].trim();
+ }
+ return dest;
+ }
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/dbimpl/MySQLSync.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/dbimpl/MySQLSync.java
new file mode 100644
index 0000000..af65b5f
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/dbimpl/MySQLSync.java
@@ -0,0 +1,107 @@
+/**
+ * Copyright 2018-2118 the original author or authors.
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.vci.dbsync.dbimpl;
+
+import com.vci.dbsync.entity.JobItem;
+import com.vci.dbsync.filesync.FileSync;
+import com.vci.dbsync.log.SyncLog;
+import com.vci.dbsync.DBSync;
+import com.vci.dbsync.utils.Tool;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+
+/**
+ * @author liuyazhuang
+ * @date 2018/9/11 10:21
+ * @description MySQL鏁版嵁搴撳悓姝ュ疄鐜�
+ * @version 1.0.0
+ */
+public class MySQLSync extends AbstractDBSync implements DBSync {
+ //private Logger logger = Logger.getLogger(MySQLSync.class);
+
+ @Override
+ public long assembleSQL(JobItem jobItem, Connection srcConn, Connection destConn, FileSync fileSync) throws SQLException {
+ String srcSql = jobItem.getSrcSql();
+ String uniqueName = Tool.generateString(6) + "_" + jobItem.getName();
+ String[] fields = jobItem.getDestTableFields().split(",");
+ fields = this.trimArrayItem(fields);
+ String[] updateFields = jobItem.getDestTableUpdate().split(",");
+ updateFields = this.trimArrayItem(updateFields);
+ String destTable = jobItem.getDestTable();
+ String destTableKey = jobItem.getDestTableKey();
+ PreparedStatement pst = srcConn.prepareStatement(srcSql);
+ ResultSet rs = pst.executeQuery();
+ StringBuffer sql = new StringBuffer();
+ sql.append("insert into ").append(jobItem.getDestTable()).append(" (").append(jobItem.getDestTableFields()).append(") values ");
+ long count = 0;
+
+ while (rs.next()) {
+ sql.append("(");
+ for (int index = 0; index < fields.length; index++) {
+ sql.append("'").append(rs.getString(fields[index])).append(index == (fields.length - 1) ? "'" : "',");
+ }
+ sql.append("),");
+ count++;
+ }
+
+ if (rs != null) {
+ rs.close();
+ }
+
+ if (pst != null) {
+ pst.close();
+ }
+ if (count > 0) {
+ sql = sql.deleteCharAt(sql.length() - 1);
+ if ((!jobItem.getDestTableUpdate().equals("")) && (!jobItem.getDestTableKey().equals(""))) {
+ sql.append(" on duplicate key update ");
+ for (int index = 0; index < updateFields.length; index++) {
+ sql.append(updateFields[index]).append("= values(").append(updateFields[index]).append(index == (updateFields.length - 1) ? ")" : "),");
+ }
+
+ StringBuffer sb = new StringBuffer();
+ sb.append("alter table ").append(destTable).append(" add constraint ").append(uniqueName).append(" unique (").append(destTableKey).append(");").append(sql.toString())
+ .append(";alter table ").append(destTable).append(" drop index ").append(uniqueName);
+
+ //lstSQL.add(sb.toString());
+ //return true;//new String[] {sb.toString()};
+ }
+ SyncLog.logger.debug(sql.toString());
+ //lstSQL.add(sql.toString());
+
+ //return true;//new String[] {sql.toString()};
+ }
+
+ return count;
+ //return false;//null;
+ }
+
+ @Override
+ public void executeSQL(List<String> sqls, Connection conn) throws SQLException {
+ PreparedStatement pst = conn.prepareStatement("");
+ //String[] sqlList = sql.split(";");
+ for (int index = 0; index < sqls.size(); index++) {
+ pst.addBatch(sqls.get(index));
+ }
+ pst.executeBatch();
+ conn.commit();
+ pst.close();
+ }
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/dbimpl/OracleSync.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/dbimpl/OracleSync.java
new file mode 100644
index 0000000..ec498bf
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/dbimpl/OracleSync.java
@@ -0,0 +1,312 @@
+/**
+ * Copyright 2018-2118 the original author or authors.
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.vci.dbsync.dbimpl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.dbsync.entity.JobItem;
+import com.vci.dbsync.entity.Operate;
+import com.vci.dbsync.filesync.FileSync;
+import com.vci.dbsync.log.SyncLog;
+import com.vci.dbsync.DBSync;
+
+import java.sql.*;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * @author Jason
+ * @date 2019/12/17 10:24
+ * @description Oracle鏁版嵁搴撳悓姝ュ疄鐜�
+ * @version 1.0.0
+ */
+public class OracleSync extends AbstractDBSync implements DBSync {
+ //private Logger logger = Logger.getLogger(OracleSync.class);
+
+ @Override
+ public long assembleSQL(JobItem jobItem, Connection srcConn, Connection destConn, FileSync fileSync) throws SQLException, VCIError {
+ String srcSql = jobItem.getSrcSql();
+ String fieldStr = jobItem.getDestTableFields();
+ String[] fields = jobItem.getDestTableFields().split(",");
+ fields = this.trimArrayItem(fields);
+ String[] updateFields = jobItem.getDestTableUpdate().split(",");
+ updateFields = this.trimArrayItem(updateFields);
+ String destTableKey = jobItem.getDestTableKey();
+ String destTable = jobItem.getDestTable();
+ Statement stat = srcConn.createStatement();
+
+ ResultSet rs = stat.executeQuery(srcSql);
+ ResultSetMetaData metaData = rs.getMetaData();
+
+ Statement destStat = destConn.createStatement();
+
+ int operate = 0;
+ if (jobItem.getOperate() == Operate.update)
+ operate = 1;
+ else if (jobItem.getOperate() == Operate.insert)
+ operate = 2;
+ else if (jobItem.getOperate() == Operate.both)
+ operate = 3;
+
+ HashMap<String, Integer> mapFieldType = new HashMap<String, Integer>();
+ for (int i = 1 ; i <= metaData.getColumnCount(); i ++) {
+ int type = metaData.getColumnType(i);
+ String name = metaData.getColumnName(i);
+ name = name.toUpperCase();
+
+ mapFieldType.put(name, type);
+ }
+
+ // 鏂囦欢鍚屾鍔熻兘
+ if (fileSync != null && jobItem.getName().equalsIgnoreCase("PLATFORMBTM_FILEOBJECT")){
+ //List<String> lstFile = new ArrayList<String>();
+
+ String sql = "SELECT OID, TS FROM PLATFORMBTM_FILEOBJECT f WHERE f.oid=?";
+
+ PreparedStatement pst = destConn.prepareStatement(sql);
+
+ while (rs.next()){
+ String oid = rs.getString("OID");
+ Timestamp ts = rs.getTimestamp("TS");
+
+ String volPath = rs.getString("FILEPATH");
+ String volFile = volPath + "/" + oid;
+
+ pst.setString(1, oid);
+ ResultSet rsFile = pst.executeQuery();
+
+ // 娌℃湁鏌ヨ鍒扮洰鏍囧璞�
+ if (!rsFile.next() && (operate & 0x2) != 0){ // 鎻掑叆
+ //lstFile.add(volFile);
+ fileSync.syncFile(volFile);
+ } else if (rsFile.next() && (operate & 0x1) != 0) { // 鏇存柊
+ Timestamp ts1 = rsFile.getTimestamp("TS");
+ if (ts != ts1)
+ fileSync.syncFile(volFile);
+ //lstFile.add(volFile);
+ }
+ rsFile.close();
+ }
+ pst.close();
+ }
+ rs.close();
+
+ StringBuffer sql = new StringBuffer();
+
+ long count = 0;
+
+ //String sNewLine = System.getProperty("line.separator");
+ String sField = "", sValue;
+ //ArrayList<String> lstSql = new ArrayList<String>();
+ rs = stat.executeQuery(srcSql);
+ while (rs.next()) {
+ sql.setLength(0);
+
+ String[] keys = destTableKey.split(",");
+ if (keys.length == 1)
+ {
+ String sKeyValue = rs.getString(destTableKey);
+ SyncLog.logger.debug("鏌ヨ鍒�:" + destTableKey + "=" + sKeyValue);
+
+ sql.append(String.format("MERGE INTO %s t using (select '%s' as id from dual) b on (t.%s = b.id)", destTable, sKeyValue, destTableKey));
+ }
+ else if (keys.length > 1)
+ {
+ StringBuffer sbField = new StringBuffer();
+ StringBuffer sbCond = new StringBuffer();
+ for (String key : keys)
+ {
+ if (sbField.length() > 0)
+ sbField.append(", ");
+
+ String sKeyValue = rs.getString(destTableKey);
+ sbField.append(String.format("'%s' as %s", sKeyValue, key));
+
+ if (sbCond.length() > 0)
+ sbCond.append(" AND ");
+ sbCond.append(String.format("t.%s=b.%s", key, key));
+ }
+
+ sql.append(String.format("MERGE INTO %s t using (select %s from dual) b on (%s)", destTable, sbField.toString(), sbCond.toString()));
+ }
+
+ if ((operate & 0x1) != 0) { //jobItem.getOperate() == Operate.both || jobItem.getOperate() == Operate.update) {
+ sql.append(" when matched then update set ");
+
+
+ for (int index = 0; index < updateFields.length; index++) {
+ sField = updateFields[index].toUpperCase();
+ if (!mapFieldType.containsKey(sField)) {
+ continue;
+ }
+ sValue = rs.getString(sField);
+
+ if (sValue == null)// || sValue == "null")
+ sql.append(String.format("%s=null", sField));
+ else {
+ if (sValue.indexOf('\'') > -1)
+ sValue = sValue.replaceAll("'", "''");
+
+ switch (mapFieldType.get(sField)) {
+ // case -7:// BIT
+ // case -6: //TINYINT
+ // case -5: //BIGINT
+ // case -4: //LONGVARBINARY
+ // case -3: //VARBINARY
+ // case -2: //BINARY
+ // case -1: //LONGVARCHAR
+ // case 0: //NULL
+ // case 1: //CHAR
+ // case 2: //NUMERIC
+ // case 3: //DECIMAL
+ // case 4: //INTEGER
+ // case 5: //SMALLINT
+ // case 6: //FLOAT
+ // case 7: //REAL
+ // case 8: //DOUBLE
+ // case 12:// VARCHAR
+ case 93: // TIMESTAMP
+ sql.append(
+ String.format("%s=to_timestamp('%s', 'yyyy-mm-dd hh24:mi:ss.ff')", sField, sValue));
+ break;
+ case 92: // TIME
+ sql.append(String.format("%s=to_time('%s', 'hh24:mi:ss')", sField, sValue));
+ break;
+ case 91: // DATE
+ sql.append(String.format("%s=to_date('%s', 'yyyy-mm-dd hh24:mi:ss')", sField, sValue));
+ break;
+ default:
+ sql.append(String.format("%s='%s'", sField, sValue));
+ break;
+ }
+ }
+
+ if (index != (updateFields.length - 1))
+ sql.append(",");
+ }
+ }
+
+ if ((operate & 0x2) != 0){ //jobItem.getOperate() == Operate.both || jobItem.getOperate() == Operate.insert) {
+ sql.append(" when not matched then insert ( ");
+ sql.append(fieldStr);
+ sql.append(") values(");
+
+ for (int index = 0; index < fields.length; index++) {
+ sField = fields[index].toUpperCase();
+ if (!mapFieldType.containsKey(sField)) {
+ continue;
+ }
+
+ sValue = rs.getString(sField);
+
+ if (sValue == null)
+ sql.append("null");
+ else {
+ // 鍗曞紩鍙峰仛杞箟鏇挎崲
+ if (sValue.indexOf('\'') > -1)
+ sValue = sValue.replaceAll("'", "''");
+
+ switch (mapFieldType.get(sField)) {
+ // case -7:// BIT
+ // case -6: //TINYINT
+ // case -5: //BIGINT
+ // case -4: //LONGVARBINARY
+ // case -3: //VARBINARY
+ // case -2: //BINARY
+ // case -1: //LONGVARCHAR
+ // case 0: //NULL
+ // case 1: //CHAR
+ // case 2: //NUMERIC
+ // case 3: //DECIMAL
+ // case 4: //INTEGER
+ // case 5: //SMALLINT
+ // case 6: //FLOAT
+ // case 7: //REAL
+ // case 8: //DOUBLE
+ // case 12:// VARCHAR
+ case 93: // TIMESTAMP
+ sql.append(String.format("to_timestamp('%s', 'yyyy-mm-dd hh24:mi:ss.ff')", sValue));
+ break;
+ case 92: // TIME
+ sql.append(String.format("to_time('%s', 'hh24:mi:ss')", sValue));
+ break;
+ case 91: // DATE
+ sql.append(String.format("to_date('%s', 'yyyy-mm-dd hh24:mi:ss')", sValue));
+ break;
+ default:
+ sql.append(String.format("'%s'", sValue));
+ break;
+ }
+ }
+
+ if (index != (fields.length - 1))
+ sql.append(",");
+ else
+ sql.append(")");
+ }
+ } else {
+ continue;
+ }
+
+ SyncLog.logger.debug(sql.toString());
+ destStat.addBatch(sql.toString());
+
+ count++;
+
+ if ((count % 200) == 0) {
+ destStat.executeBatch();
+ }
+ }
+
+ if ((count % 200) != 0) {
+ destStat.executeBatch();
+ }
+
+ destConn.commit();
+
+ if (rs != null) {
+ rs.close();
+ }
+
+ if (stat != null) {
+ stat.close();
+ }
+
+ if (destStat != null) {
+ destStat.close();
+ }
+
+ return count;
+ }
+
+ @Override
+ public void executeSQL(List<String> sqls, Connection conn) throws SQLException {
+ //PreparedStatement pst = conn.prepareStatement("sql");
+ //pst.executeUpdate();
+ //statement.executeLargeUpdate(sql)
+ //pst.close();
+
+ Statement state=conn.createStatement();
+ for (int i = 0; i < sqls.size(); i++) {
+ state.addBatch(sqls.get(i));
+ }
+ state.executeBatch();
+ conn.commit();
+ state.close();
+ }
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/dbimpl/SQLServerSync.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/dbimpl/SQLServerSync.java
new file mode 100644
index 0000000..4f325c3
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/dbimpl/SQLServerSync.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright 2018-2118 the original author or authors.
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.vci.dbsync.dbimpl;
+
+import com.vci.dbsync.entity.JobItem;
+import com.vci.dbsync.filesync.FileSync;
+import com.vci.dbsync.log.SyncLog;
+import com.vci.dbsync.DBSync;
+
+import java.sql.*;
+import java.util.List;
+
+/**
+ * @author liuyazhuang
+ * @date 2018/9/11 10:24
+ * @description SQL Server鏁版嵁搴撳悓姝ュ疄鐜�
+ * @version 1.0.0
+ */
+public class SQLServerSync extends AbstractDBSync implements DBSync {
+ //private Logger logger = Logger.getLogger(SQLServerSync.class);
+
+ @Override
+ public long assembleSQL(JobItem jobItem, Connection srcConn, Connection destConn, FileSync fileSync) throws SQLException {
+
+ String srcSql = jobItem.getSrcSql();
+ String fieldStr = jobItem.getDestTableFields();
+ String[] fields = jobItem.getDestTableFields().split(",");
+ fields = this.trimArrayItem(fields);
+ String[] updateFields = jobItem.getDestTableUpdate().split(",");
+ updateFields = this.trimArrayItem(updateFields);
+ String destTableKey = jobItem.getDestTableKey();
+ String destTable = jobItem.getDestTable();
+ Statement stat = srcConn.createStatement();
+ ResultSet rs = stat.executeQuery(srcSql);
+ StringBuffer sql = new StringBuffer();
+ long count = 0;
+ while (rs.next()) {
+ sql.setLength(0);
+
+ sql.append("if not exists (select ").append(destTableKey).append(" from ").append(destTable).append(" where ").append(destTableKey).append("='").append(rs.getString(destTableKey))
+ .append("')").append("insert into ").append(destTable).append("(").append(fieldStr).append(") values(");
+ for (int index = 0; index < fields.length; index++) {
+ sql.append("'").append(rs.getString(fields[index])).append(index == (fields.length - 1) ? "'" : "',");
+ }
+ sql.append(") else update ").append(destTable).append(" set ");
+ for (int index = 0; index < updateFields.length; index++) {
+ sql.append(updateFields[index]).append("='").append(rs.getString(updateFields[index])).append(index == (updateFields.length - 1) ? "'" : "',");
+ }
+ sql.append(" where ").append(destTableKey).append("='").append(rs.getString(destTableKey)).append("';");
+
+ //lstSQL.add(sql.toString());
+
+ count++;
+ // this.logger.info("绗�" + count + "鑰楁椂: " + (new Date().getTime() - oneStart) + "ms");
+ }
+ SyncLog.logger.info("鎬诲叡鏌ヨ鍒� " + count + " 鏉¤褰�");
+ if (rs != null) {
+ rs.close();
+ }
+ if (stat != null) {
+ stat.close();
+ }
+
+ return count;
+ //return true;//count > 0 ? new String[] {sql.toString()} : null;
+ }
+
+ @Override
+ public void executeSQL(List<String> sqls, Connection conn) throws SQLException {
+ PreparedStatement pst = conn.prepareStatement(sqls.toString());
+ pst.executeUpdate();
+ conn.commit();
+ pst.close();
+ }
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/DBInfo.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/DBInfo.java
new file mode 100644
index 0000000..50c76b1
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/DBInfo.java
@@ -0,0 +1,81 @@
+package com.vci.dbsync.entity;
+/**
+ * Copyright 2018-2118 the original author or authors.
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+import java.io.Serializable;
+
+/**
+ * @author liuyazhuang
+ * @date 2018/9/11 10:11
+ * @description 鏁版嵁搴撲俊鎭�
+ * @version 1.0.0
+ */
+
+public class DBInfo implements Serializable {
+ private static final long serialVersionUID = 3095305945250814263L;
+ //鏁版嵁搴撹繛鎺�
+ private String url;
+ //鏁版嵁搴撶敤鎴峰悕
+ private String username;
+ //鏁版嵁搴撳瘑鐮�
+ private String password;
+ //鏁版嵁搴撶被鍨�(瀵瑰簲mysql杩樻槸sqlserver)
+ private String dbtype;
+ //鏁版嵁搴撻┍鍔�
+ private String driver;
+
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public String getDbtype() {
+ return dbtype;
+ }
+
+ public void setDbtype(String dbtype) {
+ this.dbtype = dbtype;
+ }
+
+ public String getDriver() {
+ return driver;
+ }
+
+ public void setDriver(String driver) {
+ this.driver = driver;
+ }
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/JobInfo.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/JobInfo.java
new file mode 100644
index 0000000..8c9d27c
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/JobInfo.java
@@ -0,0 +1,124 @@
+package com.vci.dbsync.entity;
+/**
+ * Copyright 2018-2118 the original author or authors.
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.dom4j.Element;
+
+import com.vci.dbsync.utils.Tool;
+
+/**
+ * @author liuyazhuang
+ * @date 2018/9/11 10:13
+ * @description 浠诲姟淇℃伅
+ * @version 1.0.0
+ */
+public class JobInfo implements Serializable {
+ private static final long serialVersionUID = -1907092113028096170L;
+
+ //浠诲姟鍚嶇О
+ private String name;
+ //浠诲姟琛ㄨ揪寮�
+ private String cron;
+// //婧愭暟鎹簮sql
+// private String srcSql;
+// //鐩爣鏁版嵁琛�
+// private String destTable;
+// //鐩爣琛ㄦ暟鎹瓧娈�
+// private String destTableFields;
+// //鐩爣琛ㄤ富閿�
+// private String destTableKey;
+// //鐩爣琛ㄥ彲鏇存柊鐨勫瓧娈�
+// private String destTableUpdate;
+
+ private List<JobItem> lstJobItem = new ArrayList<JobItem>();
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getCron() {
+ return cron;
+ }
+
+ public void setCron(String cron) {
+ this.cron = cron;
+ }
+
+ public JobItem[] Items() {
+ return lstJobItem.toArray(new JobItem[0]);
+ }
+
+ public void initJobItems(Element ejob) {
+ try {
+ for (@SuppressWarnings("rawtypes")
+ Iterator it = ejob.elementIterator("item"); it.hasNext();) {
+ lstJobItem.add((JobItem) Tool.elementInObject((Element) it.next(), new JobItem()));
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+// public String getSrcSql() {
+// return srcSql;
+// }
+//
+// public void setSrcSql(String srcSql) {
+// this.srcSql = srcSql;
+// }
+//
+// public String getDestTable() {
+// return destTable;
+// }
+//
+// public void setDestTable(String destTable) {
+// this.destTable = destTable;
+// }
+//
+// public String getDestTableFields() {
+// return destTableFields;
+// }
+//
+// public void setDestTableFields(String destTableFields) {
+// this.destTableFields = destTableFields;
+// }
+//
+// public String getDestTableKey() {
+// return destTableKey;
+// }
+//
+// public void setDestTableKey(String destTableKey) {
+// this.destTableKey = destTableKey;
+// }
+//
+// public String getDestTableUpdate() {
+// return destTableUpdate;
+// }
+//
+// public void setDestTableUpdate(String destTableUpdate) {
+// this.destTableUpdate = destTableUpdate;
+// }
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/JobItem.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/JobItem.java
new file mode 100644
index 0000000..d2e34db
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/JobItem.java
@@ -0,0 +1,83 @@
+package com.vci.dbsync.entity;
+
+public class JobItem {
+
+ //浠诲姟鍚嶇О
+ private String name;
+ // 鍚屾鏂瑰悜锛宼rue-姝e悜锛沠alse-鍙嶅悜
+ private boolean direction;
+ // 鎿嶄綔绫诲瀷
+ private Operate operate;
+ //婧愭暟鎹簮sql
+ private String srcSql;
+ //鐩爣鏁版嵁琛�
+ private String destTable;
+ //鐩爣琛ㄦ暟鎹瓧娈�
+ private String destTableFields;
+ //鐩爣琛ㄤ富閿�
+ private String destTableKey;
+ //鐩爣琛ㄥ彲鏇存柊鐨勫瓧娈�
+ private String destTableUpdate;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public boolean getDirection() {
+ return direction;
+ }
+
+ public void setDirection(boolean direct) {
+ this.direction = direct;
+ }
+ public Operate getOperate() {
+ return operate;
+ }
+
+ public void setOperate(Operate op) {
+ this.operate = op;
+ }
+ public String getSrcSql() {
+ return srcSql;
+ }
+
+ public void setSrcSql(String srcSql) {
+ this.srcSql = srcSql;
+ }
+
+ public String getDestTable() {
+ return destTable;
+ }
+
+ public void setDestTable(String destTable) {
+ this.destTable = destTable;
+ }
+
+ public String getDestTableFields() {
+ return destTableFields;
+ }
+
+ public void setDestTableFields(String destTableFields) {
+ this.destTableFields = destTableFields;
+ }
+
+ public String getDestTableKey() {
+ return destTableKey;
+ }
+
+ public void setDestTableKey(String destTableKey) {
+ this.destTableKey = destTableKey;
+ }
+
+ public String getDestTableUpdate() {
+ return destTableUpdate;
+ }
+
+ public void setDestTableUpdate(String destTableUpdate) {
+ this.destTableUpdate = destTableUpdate;
+ }
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/Operate.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/Operate.java
new file mode 100644
index 0000000..df90e13
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/Operate.java
@@ -0,0 +1,7 @@
+package com.vci.dbsync.entity;
+
+public enum Operate {
+ insert, // 缂哄皯鍒欐彃鍏�
+ update, // 瀛樺湪鍒欐洿鏂�
+ both, // 鍚屾椂瀹炵幇鎻掑叆鍜屾洿鏂版搷浣�
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/VMInfo.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/VMInfo.java
new file mode 100644
index 0000000..5dd16bb
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/entity/VMInfo.java
@@ -0,0 +1,36 @@
+package com.vci.dbsync.entity;
+
+public class VMInfo {
+ //CORBA涓绘満
+ private String url;
+
+ // 鏈嶅姟Identity
+ private String identity;
+ // 鍗锋湇鍔�
+ private String service;
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getIdentity() {
+ return identity;
+ }
+
+ public void setIdentity(String identity) {
+ this.identity = identity;
+ }
+
+ public String getService() {
+ return service;
+ }
+
+ public void setService(String service) {
+ this.service = service;
+ }
+
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/filesync/FileSync.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/filesync/FileSync.java
new file mode 100644
index 0000000..66f01a0
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/filesync/FileSync.java
@@ -0,0 +1,146 @@
+package com.vci.dbsync.filesync;
+
+import com.vci.corba.common.VCIError;
+import com.vci.corba.volumn.method.VolumnManagement;
+import com.vci.dbsync.entity.VMInfo;
+import com.vci.dbsync.log.SyncLog;
+
+public class FileSync {
+ private VMInfo _srcVMInfo;
+ private ORBHelper _srcORB = null;
+ private VolumnManagement _vmSrc = null;
+
+ private VMInfo _destVMInfo;
+ private ORBHelper _destORB = null;
+ private VolumnManagement _vmDest = null;
+ private int _blocksize = 32;
+
+ private int _count = 0;
+
+
+ public FileSync(VMInfo src, VMInfo dest){
+ _srcVMInfo = src;
+ _destVMInfo = dest;
+ }
+
+ public boolean Init(boolean forward) throws VCIError {
+ try {
+ if (forward) // 姝e悜
+ {
+ _srcORB = new ORBHelper();
+ _srcORB.InitORB(_srcVMInfo.getUrl(), _srcVMInfo.getIdentity());
+
+ _destORB = new ORBHelper();
+ _destORB.InitORB(_destVMInfo.getUrl(), _destVMInfo.getIdentity());
+
+ _vmSrc = _srcORB.getVolumnService(_srcVMInfo.getService());
+ _vmDest = _destORB.getVolumnService(_destVMInfo.getService());
+
+ }
+ else // 鍙嶅悜
+ {
+ _srcORB = new ORBHelper();
+ _srcORB.InitORB(_destVMInfo.getUrl(), _destVMInfo.getIdentity());
+
+ _destORB = new ORBHelper();
+ _destORB.InitORB(_srcVMInfo.getUrl(), _srcVMInfo.getIdentity());
+
+
+ _vmSrc = _srcORB.getVolumnService(_destVMInfo.getService());
+ _vmDest = _destORB.getVolumnService(_srcVMInfo.getService());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ if (e instanceof VCIError) {
+ throw (VCIError)e;
+ }
+ throw(new VCIError(e.getLocalizedMessage(),new String[]{"Init File Sync Exception"}));
+ //throw new VCIError("uploadFileToVolume", new String[0]);
+ }
+
+ return true;
+ }
+
+ public void close(){
+ if (_srcORB != null)
+ _srcORB.close();
+ _srcORB = null;
+
+ if (_destORB != null)
+ _destORB.close();
+ _destORB = null;
+ }
+
+ /**
+ * 涓婁紶鏂囦欢鍒版寚瀹氱殑鍗�
+ * @param volName
+ * @param ownBizOBJType
+ * @param ownBizOBJOid
+ * @param localFilePath
+ * @return
+ * @throws VCIError
+ */
+ public boolean syncFile(String volFile) {
+
+ try
+ {
+ String srcFile = _srcORB.getFilePath(volFile);
+ String destFile = _destORB.getFilePath(volFile);
+
+ if (!_vmSrc.isFileExist(srcFile))
+ return false;
+
+ long fileSize = _vmSrc.getFileSize(srcFile);
+ if (fileSize == 0)
+ return false;
+
+
+ long curTime = _vmSrc.getCurrrentTimeMillions();
+
+ int blockSize = _blocksize * 1024;
+ byte[] buffer = new byte[blockSize];
+
+ long offset = 0;
+
+ while (offset < (fileSize - blockSize))
+ {
+ buffer = _vmSrc.sendFile(srcFile, offset);
+
+ _vmDest.receiveFile(destFile, buffer, offset, curTime, fileSize);
+ offset += blockSize;
+ }
+
+ long remainSize = fileSize - offset;
+ if (remainSize > 0)
+ {
+ buffer = new byte[(int)remainSize];
+ buffer = _vmSrc.sendFile(srcFile, offset);
+ _vmDest.receiveFile(destFile, buffer, offset, curTime, fileSize);
+ }
+
+ _count++;
+
+ return true;
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ SyncLog.logger.error("鍚屾鏂囦欢寮傚父锛�" + volFile);
+ SyncLog.logger.error(e);
+
+ return false;
+
+// if (e instanceof VCIError) {
+// throw (VCIError)e;
+// }
+// throw(new VCIError(e.getMessage(), new String[]{"Sync File Exception", volFile}));
+ //throw new VCIError("uploadFileToVolume", new String[0]);
+ }
+ }
+
+ public int getCount() {
+ return _count;
+ }
+
+}
+
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/filesync/ORBHelper.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/filesync/ORBHelper.java
new file mode 100644
index 0000000..2ace5eb
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/filesync/ORBHelper.java
@@ -0,0 +1,268 @@
+package com.vci.dbsync.filesync;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.ORBPackage.InvalidName;
+import org.omg.CosNaming.NamingContextExt;
+import org.omg.CosNaming.NamingContextExtHelper;
+
+import com.vci.base.common.log.ServerWithLog4j;
+import com.vci.base.common.resource.CommonProperties;
+import com.vci.corba.common.VCIError;
+import com.vci.corba.framework.data.PvolumeInfo;
+import com.vci.corba.framework.method.FrameworkService;
+import com.vci.corba.logon.method.LogonFactory;
+import com.vci.corba.logon.method.LogonFactoryHelper;
+import com.vci.corba.volumn.method.VolumnFactory;
+import com.vci.corba.volumn.method.VolumnFactoryHelper;
+import com.vci.corba.volumn.method.VolumnManagement;
+
+/**
+ * <p>Title: </p>
+ * <p>Description: </p>
+ * <p>Copyright: Copyright (c) 2009</p>
+ * <p>Company: VCI</p>
+ * @author eddie
+ * @time 2009-4-14
+ * @version 1.0
+ */
+public final class ORBHelper {
+
+ private NamingContextExt _context = null;
+ private ORB _orb = null;
+ private VolumnManagement _volService = null;
+
+ private String _strIdentity = "";
+ private boolean writeLogInfo = false;
+ //private Properties _properties = new Properties();
+
+ public boolean isWriteLogInfo() {
+ return writeLogInfo;
+ }
+
+ public ORBHelper() {
+ this(true);
+ }
+
+ /**
+ * 鏋勯�� NameServiceUtility 瀵硅薄
+ * @param writeLogInfo 鏄惁璁板綍鏃ュ織淇℃伅
+ */
+ public ORBHelper(boolean writeLogInfo) {
+ this.writeLogInfo = writeLogInfo;
+ }
+
+
+ public void InitORB(String url, String identity)
+ {
+ if (url == null || url.isEmpty())
+ return;
+
+// String[] items = url.split(":");
+// String host = items[0];
+// String port = items[1];
+// String[] args = new String[]{"ORBInitialHost=" + host, "ORBInitialPort=" + port};
+// _orb = org.omg.CORBA.ORB.init(args, null);
+
+ Properties properties = new Properties();
+ properties.put("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
+ properties.put("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
+ properties.put("jacorb.retries","0");
+ properties.put("jacorb.connection.client.connect_timeout", "15000");
+ properties.put("jacorb.connection.client.idle_timeout", "5000");
+
+ String nameService = String.format("corbaloc::%s/NameService", url);
+ properties.put("ORBInitRef.NameService", nameService);
+
+ //properties.put("org.omg.PortableInterceptor.ORBInitializerClass.initClient", "com.vci.mw.client.ClientInitializer");
+ //properties.put("org.omg.PortableInterceptor.ORBInitializerClass.initClient", "com.vci.mw.client.ClientInitializer");
+ //InitORBEnv(url);
+ _orb = org.omg.CORBA.ORB.init(new String[0], properties);
+
+
+ _strIdentity = identity;
+ if (_strIdentity == null || _strIdentity.isEmpty())
+ _strIdentity = CommonProperties.InstanceIdentity();
+
+ if(isWriteLogInfo()){
+ ServerWithLog4j.logger.info("InitORB OK");
+ }
+ }
+
+
+// private void InitORBEnv(String url)
+// {
+//// if(_properties.get("org.omg.CORBA.ORBClass") == null) {
+//// _properties.put("org.omg.CORBA.ORBClass","org.jacorb.orb.ORB");
+//// }
+//
+// if(_properties.get("ORBInitRef.NameService") == null) {
+// String nameService = String.format("corbaloc::%s/NameService", url);
+// _properties.put("ORBInitRef.NameService", nameService);
+// }
+//
+//// if (_properties.get("org.omg.PortableInterceptor.ORBInitializerClass.initClient") == null) {
+//// _properties.put("org.omg.PortableInterceptor.ORBInitializerClass.initClient", "com.vci.mw.client.ClientInitializer");
+//// }
+//
+// _properties.put("jacorb.retries", CommonProperties.getStringProperty("jacorb.retries"));
+// _properties.put("jacorb.connection.client.connect_timeout", CommonProperties.getStringProperty("jacorb.connection.client.connect_timeout"));
+//
+// //_strIdentity = CommonProperties.InstanceIdentity();
+// if(isWriteLogInfo()){
+// ServerWithLog4j.logger.info("InitOrbEnv OK");
+// }
+// }
+
+ // 鍒濆鍖栧懡鍚嶆湇鍔�
+ public void InitNameContext()
+ {
+ try
+ {
+ if (this._orb == null) {
+ //System.out.println("_currentORB is not null: " + _currentORB.toString());
+ //_orb = _currentORB;
+ throw new Exception("The ORB is not initialized!");
+ }
+ if( _context == null ){
+ _context = org.omg.CosNaming.NamingContextExtHelper.narrow(_orb.resolve_initial_references("NameService"));
+ }
+
+ if(isWriteLogInfo()){
+ ServerWithLog4j.logger.info("InitNameContext OK");
+ }
+ }
+ catch(InvalidName in)
+ {
+ ServerWithLog4j.logger.error(in.getMessage(), in);
+ } catch (Exception e) {
+ ServerWithLog4j.logger.error(e.getMessage(), e);
+ }
+ }
+
+ public String getNameContextIOR()
+ {
+ return _context.toString();
+ }
+
+
+ /**
+ * 鏍规嵁鏈嶅姟鍚嶈幏鍙栧嵎鏈嶅姟锛岄�氳繃涓籧orba鐨勫懡鍚嶆湇鍔¤幏鍙�
+ * @param serviceName
+ * @return
+ * @throws Exception
+ */
+ public VolumnManagement getVolumnService(String serviceName) throws Exception{
+ if (_volService != null)
+ return _volService;
+
+ try {
+ VolumnFactory vf = VolumnFactoryHelper.narrow(getObjectByName(serviceName));
+ if (vf == null)
+ throw new VCIError("getVolumnService fail", new String[]{""});
+
+ _volService = vf.getVolumnService();
+
+ return _volService;
+ } catch (VCIError ve) {
+ ve.printStackTrace();
+ throw ve;
+ }
+ }
+
+ public org.omg.CORBA.Object getObjectByName(String name) throws Exception
+ {
+ org.omg.CORBA.Object result = null;
+ String strObjName = this._strIdentity + name;
+
+ if (_context == null)
+ InitNameContext();
+
+ if (_context == null)
+ return null;
+
+ result = _context.resolve_str(strObjName);
+ return result;
+ }
+
+ private Map<String, String> mapVolPath = new HashMap<String, String>();
+
+ public String getFilePath(String volPath)
+ {
+ int index = volPath.indexOf(":/");
+ if (index <= 0)
+ return "";
+
+ String volName = volPath.substring(0, index);
+ String path = volPath.substring(index + 1);
+
+ if (mapVolPath.isEmpty())
+ {
+ try {
+ InitVolumePath();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ return "";
+ }
+ }
+
+ if (mapVolPath.containsKey(volName))
+ {
+ path = mapVolPath.get(volName) + path;
+ }
+
+ return path;
+ }
+
+ private void InitVolumePath() throws Exception
+ {
+ LogonFactory lf = LogonFactoryHelper.narrow(getObjectByName("LogonFactoryService"));
+ if (lf == null)
+ throw new VCIError("get LogonFactoryService fail", new String[]{""});
+
+ FrameworkService fs = lf.getFrameworkService();
+ PvolumeInfo[] vols = fs.getAllPvolumes();
+
+ for (PvolumeInfo v : vols)
+ {
+ mapVolPath.put(v.name, v.path);
+ }
+ }
+
+ public void close()
+ {
+ if ( _context != null )
+ {
+ try
+ {
+ _context.destroy();
+ _context = null;
+ }
+ catch(Exception e)
+ {
+ if(isWriteLogInfo()){
+ ServerWithLog4j.logger.error(e.getMessage());
+ }
+ }
+ }
+
+ if ( _orb != null )
+ {
+ try
+ {
+ _orb.destroy();
+ _orb = null;
+ }
+ catch(Exception e)
+ {
+ if(isWriteLogInfo()){
+ ServerWithLog4j.logger.error(e.getMessage());
+ }
+ }
+ }
+ }
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/log/SyncLog.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/log/SyncLog.java
new file mode 100644
index 0000000..996fe63
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/log/SyncLog.java
@@ -0,0 +1,43 @@
+package com.vci.dbsync.log;
+
+import java.io.File;
+import java.net.URL;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.PropertyConfigurator;
+
+/**
+ * <p>Title: </p>
+ * <p>Description: use log4j to note some meaningful info.
+ * the info has four kinds: INFO, DEBUG, WARN and ERROR.
+ * it display log infos in console and save them into a
+ * log file. Programeers can lookup useful info from them.
+ * And programeers can set the level in
+ * properties/ServerWithLog4j.properties to decide which info
+ * they want to save.</p>
+ */
+public class SyncLog {
+ private static String log4j_properties_file_path_for_developer = "properties/dbSynclog4j.properties";
+ private static String log4j_properties_file_path = "/" + log4j_properties_file_path_for_developer;
+ private static URL log4j_properties_url = null;
+
+ public static Logger logger = Logger.getLogger("SyncLog");
+
+ static {
+ File file = new File(log4j_properties_file_path_for_developer);
+ //log4j_properties_url = SyncLog.class.getResource(log4j_properties_file_path);
+ String loadFrom = "";
+
+ if(file.exists()){
+ loadFrom = file.getAbsolutePath();
+ PropertyConfigurator.configure(file.getAbsolutePath());
+ } else {
+ log4j_properties_url = SyncLog.class.getResource(log4j_properties_file_path);
+ loadFrom = log4j_properties_url.toString();
+ PropertyConfigurator.configure(log4j_properties_url);
+ }
+
+ logger.debug("log4j init completed. use properties file is " + loadFrom);
+ }
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/utils/DateUtils.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/utils/DateUtils.java
new file mode 100644
index 0000000..1f38e1b
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/utils/DateUtils.java
@@ -0,0 +1,1048 @@
+package com.vci.dbsync.utils;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.net.URL;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.TimeZone;
+
+/**
+ * 鑷畾涔夋椂闂存棩鏈熷伐鍏�
+ *
+ * @author liuyazhuang
+ *
+ */
+public class DateUtils {
+
+ /**
+ * 鍛ㄤ竴鐨勬棩鏈�
+ */
+ public static final String MONDAY_DATE = "monday_date";
+ /**
+ * 鍛ㄦ棩鐨勬棩鏈�
+ */
+ public static final String SUNDAY_DATE = "sunday_date";
+
+ public static final String MONTH_FIRST = "month_first";
+
+ public static final String MONTH_LAST = "month_last";
+
+ public static final String MONTH_SINGLE = "MM";
+ public static final String DATE_SINGLE = "dd";
+ public static final String DATE_FORMAT = "yyyy-MM-dd";
+ public static final String DATE_TIME_NO_FORMAT = "yyyyMMddHHmmss";
+ public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
+ public static final String DATE_MINUTE_FORMAT = "yyyy-MM-dd HH:mm";
+ public static final String MONTH_FORMAT = "yyyy-MM";
+ public static final String MONTH_NO_FORMAT = "yyyyMM";
+ public static final String YEAR_FORMAT = "yyyy";
+ public static final String TIME_FORMAT = "HH:mm:ss";
+ public static final String MINUTE_FORMAT = "HH:mm";
+ public static final String BIRTHDAY_FORMAT = "yyyy骞碝M鏈坉d鏃�";
+ public static final String DATE_DATE = "yyyyMMdd";
+ public static final String LOCAL_ENGLISH_FORMAT = "dd/MMM/yyyy:hh:mm:ss Z";
+ // MySQL鏁版嵁搴揇ate绫诲瀷鐨勫瓧娈靛繀椤昏祴鍊间竴涓ぇ浜�1970骞�1鏈�1鏃ョ殑鏃ユ湡鍊笺�傚惁鍒欏姝ゅ瓧娈佃繘琛寃here鏉′欢鏌ヨ鎴杘rder
+ // by绛夋搷浣滄椂灏变細鎶ラ敊銆�
+ public static final int MYSQL_DATE_YEAR_MAXVALUE = 1970;
+
+ public enum TimeUnit {
+ Year, Month, Week, Day, Hour, Minute, Second
+ }
+
+ public enum CouponUnit {
+ Year, Month, Week, Day, Hour, Minute, Second
+ }
+
+ // 璁$畻涓や釜鏃ユ湡鐩稿樊骞存暟
+ public static int yearDateDiff(Date startDate, Date endDate) {
+ Calendar calBegin = Calendar.getInstance(); // 鑾峰彇鏃ュ巻瀹炰緥
+ Calendar calEnd = Calendar.getInstance();
+ calBegin.setTime(startDate); // 瀛楃涓叉寜鐓ф寚瀹氭牸寮忚浆鍖栦负鏃ユ湡
+ calEnd.setTime(endDate);
+ return calEnd.get(Calendar.YEAR) - calBegin.get(Calendar.YEAR);
+ }
+
+
+ /**
+ * 灏嗘煇涓�鏍煎紡鐨勬椂闂磋浆鍖栦负鍙︿竴绉嶆牸寮�
+ * @param timeLocal
+ * @param localFormatStr
+ * @param formatStr
+ * @return
+ */
+ public static String parse(String timeLocal, String localFormatStr, String formatStr){
+ Date date = new Date();
+ try {
+ SimpleDateFormat formatter = new SimpleDateFormat(localFormatStr, Locale.ENGLISH);
+ date = formatter.parse(timeLocal);
+ } catch (Exception e) {
+ date = new Date();
+ }
+ SimpleDateFormat format = new SimpleDateFormat(formatStr);
+ String dateStr = format.format(date);
+ return dateStr;
+ }
+
+ /**
+ * 鑾峰彇涓庣幇鍦ㄧ浉闅攑aram鐨勬椂闂存埑锛岀簿纭埌姣
+ *
+ * @param param
+ * @param couponUnit
+ * @return
+ */
+ public static long getTimeStampFromNow(Integer param, CouponUnit couponUnit) {
+ long timeStamp = 0;
+ switch (couponUnit) {
+ case Year:
+ timeStamp = param * 365 * 24 * 60 * 60 * 1000;
+ break;
+ case Month:
+ timeStamp = param * 30 * 24 * 60 * 60 * 1000;
+ break;
+ case Week:
+ timeStamp = param * 7 * 24 * 60 * 60 * 1000;
+ break;
+ case Day:
+ timeStamp = param * 24 * 60 * 60 * 1000;
+ break;
+ case Hour:
+ timeStamp = param * 60 * 60 * 1000;
+ break;
+ case Minute:
+ timeStamp = param * 60 * 1000;
+ break;
+ case Second:
+ timeStamp = param * 1000;
+ break;
+ default:
+ break;
+ }
+ return timeStamp;
+ }
+
+ public static Map<String, String> convertWeekByDate(Date time) {
+ Map<String, String> map = new HashMap<String, String>();
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(time);
+ // 鍒ゆ柇瑕佽绠楃殑鏃ユ湡鏄惁鏄懆鏃ワ紝濡傛灉鏄垯鍑忎竴澶╄绠楀懆鍏殑锛屽惁鍒欎細鍑洪棶棰橈紝璁$畻鍒颁笅涓�鍛ㄥ幓浜�
+ int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 鑾峰緱褰撳墠鏃ユ湡鏄竴涓槦鏈熺殑绗嚑澶�
+ if (1 == dayWeek) {
+ cal.add(Calendar.DAY_OF_MONTH, -1);
+ }
+ //System.out.println("瑕佽绠楁棩鏈熶负:" + sdf.format(cal.getTime())); // 杈撳嚭瑕佽绠楁棩鏈�
+ cal.setFirstDayOfWeek(Calendar.MONDAY);// 璁剧疆涓�涓槦鏈熺殑绗竴澶╋紝鎸変腑鍥界殑涔犳儻涓�涓槦鏈熺殑绗竴澶╂槸鏄熸湡涓�
+ int day = cal.get(Calendar.DAY_OF_WEEK);// 鑾峰緱褰撳墠鏃ユ湡鏄竴涓槦鏈熺殑绗嚑澶�
+ cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);// 鏍规嵁鏃ュ巻鐨勮鍒欙紝缁欏綋鍓嶆棩鏈熷噺鍘绘槦鏈熷嚑涓庝竴涓槦鏈熺涓�澶╃殑宸��
+ String imptimeBegin = parseDateToString(cal.getTime(), DATE_FORMAT);
+ map.put(MONDAY_DATE, imptimeBegin);
+ cal.add(Calendar.DATE, 6);
+ String imptimeEnd = parseDateToString(cal.getTime(), DATE_FORMAT);
+ map.put(SUNDAY_DATE, imptimeEnd);
+ return map;
+
+ }
+
+ public static String getLastDayOfMonth(int year, int month) {
+ Calendar cal = Calendar.getInstance();
+ cal.set(Calendar.YEAR, year);
+ cal.set(Calendar.MONTH, month-1);
+ cal.set(Calendar.DAY_OF_MONTH,cal.getActualMaximum(Calendar.DATE));
+ return parseDateToString(cal.getTime(), DATE_FORMAT);
+ }
+
+ public static String getFirstDayOfMonth(int year, int month) {
+ Calendar cal = Calendar.getInstance();
+ cal.set(Calendar.YEAR, year);
+ cal.set(Calendar.MONTH, month-1);
+ cal.set(Calendar.DAY_OF_MONTH,cal.getMinimum(Calendar.DATE));
+ return parseDateToString(cal.getTime(), DATE_FORMAT);
+ }
+
+
+ /**
+ * 鑾峰彇鎸囧畾骞翠唤鐨勭涓�澶╁拰鏈�鍚庝竴澶�
+ * @param year
+ * @param month
+ * @return
+ */
+ public static Map<String, String> getFirstAndLastDayFromMonth(int year, int month){
+ Map<String, String> map = new HashMap<String, String>();
+ map.put(MONTH_FIRST, getFirstDayOfMonth(year, month));
+ map.put(MONTH_LAST, getLastDayOfMonth(year, month));
+ return map;
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println(getDelayTime(parseDateToString(new Date(), DATE_FORMAT), Calendar.DATE, -1, DATE_FORMAT));
+ }
+
+ /**
+ * 鏃堕棿鍗曚綅璁剧疆宸ュ叿
+ *
+ * @param date
+ * @param value
+ * @param couponUnit
+ * @return
+ */
+ public static Date delayTime(Date date, Integer value, CouponUnit couponUnit) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ switch (couponUnit) {
+ case Year:
+ calendar.add(Calendar.YEAR, value);
+ break;
+ case Month:
+ calendar.add(Calendar.MONTH, value);
+ break;
+ case Week:
+ calendar.add(Calendar.DAY_OF_WEEK, value);
+ break;
+ case Day:
+ calendar.add(Calendar.DATE, value);
+ break;
+ case Hour:
+ calendar.add(Calendar.HOUR, value);
+ break;
+ case Minute:
+ calendar.add(Calendar.MINUTE, value);
+ break;
+ case Second:
+ calendar.add(Calendar.SECOND, value);
+ break;
+ default:
+ break;
+ }
+ return calendar.getTime();
+ }
+
+
+ /**
+ * 鍙栧緱褰撴湀澶╂暟
+ */
+ public static int getCurrentMonthLastDay() {
+ Calendar a = Calendar.getInstance();
+ a.set(Calendar.DATE, 1);// 鎶婃棩鏈熻缃负褰撴湀绗竴澶�
+ a.roll(Calendar.DATE, -1);// 鏃ユ湡鍥炴粴涓�澶╋紝涔熷氨鏄渶鍚庝竴澶�
+ int maxDate = a.get(Calendar.DATE);
+ return maxDate;
+ }
+
+ /**
+ * 寰楀埌鎸囧畾鏈堢殑澶╂暟
+ */
+ public static int getMonthLastDay(int year, int month) {
+ Calendar a = Calendar.getInstance();
+ a.set(Calendar.YEAR, year);
+ a.set(Calendar.MONTH, month - 1);
+ a.set(Calendar.DATE, 1);// 鎶婃棩鏈熻缃负褰撴湀绗竴澶�
+ a.roll(Calendar.DATE, -1);// 鏃ユ湡鍥炴粴涓�澶╋紝涔熷氨鏄渶鍚庝竴澶�
+ int maxDate = a.get(Calendar.DATE);
+ return maxDate;
+ }
+
+ /**
+ * 鏃堕棿鍗曚綅璁剧疆宸ュ叿
+ *
+ * @param date
+ * @param value
+ * @param couponUnit
+ * @return
+ */
+ public static Date delayTime(Date date, BigDecimal value, CouponUnit couponUnit) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ switch (couponUnit) {
+ case Year:
+ calendar.add(Calendar.YEAR, value.intValue());
+ break;
+ case Month:
+ calendar.add(Calendar.MONTH, value.intValue());
+ break;
+ case Week:
+ calendar.add(Calendar.DAY_OF_WEEK, value.intValue());
+ break;
+ case Day:
+ calendar.add(Calendar.DATE, value.intValue());
+ break;
+ case Hour:
+ calendar.add(Calendar.HOUR, value.intValue());
+ break;
+ case Minute:
+ calendar.add(Calendar.MINUTE, value.intValue());
+ break;
+ case Second:
+ calendar.add(Calendar.SECOND, value.intValue());
+ break;
+ default:
+ break;
+ }
+ return calendar.getTime();
+ }
+
+ /**
+ * 鏂瑰悜
+ *
+ * @author liuyazhuang
+ *
+ */
+ public enum Direction {
+ Previous, After
+ }
+
+ /**
+ * 灏嗘寚瀹氭牸寮忕殑鏃堕棿鎻愬墠鎴栧欢杩熸寚瀹氱殑鏃堕棿绔�
+ *
+ * @param sourceTime锛氬師鏃堕棿
+ * @param format锛氬師鏃堕棿鏍煎紡
+ * @param timeLen锛氭彁鍓嶆垨寤惰繜鐨勬椂闂存
+ * @param lenTimeUnit锛氭彁鍓嶆垨寤惰繜鐨勬椂闂存牸寮�
+ * @param direction锛氭爣蹇楁槸鎻愬墠杩樻槸寤跺悗
+ * @return 杩斿洖format鎵�浠h〃鐨勬椂闂存牸寮忓瓧绗︿覆
+ */
+ public static String changeTime(String sourceTime, String format, Double timeLen, TimeUnit lenTimeUnit,
+ Direction direction) {
+ long source = parseStringDateToDate(sourceTime, format).getTime();
+ long targetLen = getTimeLen(timeLen, lenTimeUnit);
+ switch (direction) {
+ case Previous:
+ source -= targetLen;
+ break;
+ case After:
+ source += targetLen;
+ break;
+ default:
+ break;
+ }
+ return parseDateToString(new Date(source), format);
+ }
+
+ /**
+ * 鑾峰彇璺濈褰撳墠鏃堕棿days澶╃殑鏃堕棿
+ *
+ * @param direction锛氭柟鍚�
+ * @param days锛氳窛绂荤殑澶╂暟
+ * @return
+ */
+ public static Date getDate(Direction direction, int days) {
+ Calendar calendar = Calendar.getInstance();
+ switch (direction) {
+ case After:
+ calendar.add(Calendar.DAY_OF_MONTH, days);
+ break;
+ case Previous:
+ calendar.add(Calendar.DAY_OF_MONTH, -days);
+ break;
+
+ default:
+ break;
+ }
+ return calendar.getTime();
+ }
+
+ /**
+ * 鑾峰彇鏃堕棿娈电殑姣鏁�
+ *
+ * @param timeLen
+ * @param lenTimeUnit
+ * @return
+ */
+ private static long getTimeLen(Double timeLen, TimeUnit lenTimeUnit) {
+ long time = 0;
+ switch (lenTimeUnit) {
+ case Week:
+ time = (long) (timeLen * 7 * 24 * 3600 * 1000);
+ break;
+ case Day:
+ time = (long) (timeLen * 24 * 3600 * 1000);
+ break;
+ case Hour:
+ time = (long) (timeLen * 3600 * 1000);
+ break;
+ case Minute:
+ time = (long) (timeLen * 60 * 1000);
+ break;
+ case Second:
+ time = (long) (timeLen * 1000);
+ break;
+ default:
+ break;
+ }
+ return time;
+ }
+
+ /**
+ * 姣旇緝鍓嶉潰鐨勬棩鏈熸瘮鍚庨潰鐨勬棩鏈熷ぇ
+ *
+ * @param firstDate
+ * @param secondDate
+ * @return
+ */
+ public static boolean compareDate(Date firstDate, Date secondDate) {
+ return firstDate.getTime() >= secondDate.getTime();
+ }
+
+ public static String parseDateToString(Date date, String formatString) {
+ return getSimpleDateFormat(formatString).format(date);
+ }
+
+ public static SimpleDateFormat getSimpleDateFormat(String formatString) {
+ return new SimpleDateFormat(formatString);
+ }
+
+ /**
+ * 鏃堕棿鍗曚綅璁剧疆宸ュ叿
+ *
+ * @param date
+ * @param value
+ * @param couponUnit
+ * @return
+ */
+ public static Date delayTime(Date date, BigDecimal value, TimeUnit couponUnit) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ switch (couponUnit) {
+ case Year:
+ calendar.add(Calendar.YEAR, value.intValue());
+ break;
+ case Month:
+ calendar.add(Calendar.MONTH, value.intValue());
+ break;
+ case Week:
+ calendar.add(Calendar.DAY_OF_WEEK, value.intValue());
+ break;
+ case Day:
+ calendar.add(Calendar.DATE, value.intValue());
+ break;
+ case Hour:
+ calendar.add(Calendar.HOUR, value.intValue());
+ break;
+ case Minute:
+ calendar.add(Calendar.MINUTE, value.intValue());
+ break;
+ case Second:
+ calendar.add(Calendar.SECOND, value.intValue());
+ break;
+ default:
+ break;
+ }
+ return calendar.getTime();
+ }
+
+ /**
+ * 鑾峰彇鏄熸湡鍦ㄦ煇涓�娈垫椂闂村唴鐨勬棩鏈�
+ *
+ * @param startDate:鏍煎紡涓簓yyy-MM-dd
+ * @param endDate鏍煎紡涓簓yyy-MM-dd
+ * @param week:1鍒�7浠h〃鏄熸湡涓�鍒版槦鏈熸棩
+ * @return
+ * @throws Exception
+ */
+ public static List<Date> getDaysBetween(Date startDate, Date endDate, int week) throws Exception {
+ List<Date> dates = new ArrayList<Date>();
+ // 鑾峰彇寮�濮嬫棩鏈熺殑鏄熸湡
+ int weekDay = getWeekByDate(startDate);
+ // 鑾峰彇杈撳叆鐨勬槦鏈熶笌寮�濮嬫椂闂寸殑鏄熸湡鐩搁殧鐨勫ぉ鏁�
+ int days = (week - weekDay) < 0 ? (week - weekDay) + 7 : week - weekDay;
+ // 鑾峰彇杈撳叆鐨勬槦鏈熸墍鍦ㄦ棩鏈熷湪鏃堕棿娈靛唴鐨勪互涓�涓棩鏈�
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(startDate);
+ calendar.add(Calendar.DATE, days);
+ while (calendar.getTime().getTime() <= endDate.getTime()) {
+ dates.add(calendar.getTime());
+ calendar.add(Calendar.DATE, Calendar.DAY_OF_WEEK);
+ }
+ return dates;
+ }
+
+ /**
+ * 鑾峰彇鏄熸湡鍦ㄦ煇涓�娈垫椂闂村唴鐨勬棩鏈�
+ *
+ * @param start锛氭牸寮忎负yyyy-MM-dd
+ * @param end:鏍煎紡涓簓yyy-MM-dd
+ * @param week:鏁板瓧1鍒�7浠h〃鏄熸湡涓�鍒版槦鏈熸棩
+ * @return
+ * @throws Exception
+ */
+ public static List<Date> getDaysBetween(String start, String end, int week) throws Exception {
+ Date startDate = parseStringDateToDate(start, DATE_FORMAT);
+ Date endDate = parseStringDateToDate(end, DATE_FORMAT);
+ List<Date> dates = new ArrayList<Date>();
+ // 鑾峰彇寮�濮嬫棩鏈熺殑鏄熸湡
+ int weekDay = getWeekByDate(startDate);
+ // 鑾峰彇杈撳叆鐨勬槦鏈熶笌寮�濮嬫椂闂寸殑鏄熸湡鐩搁殧鐨勫ぉ鏁�
+ int days = (week - weekDay) < 0 ? (week - weekDay) + 7 : week - weekDay;
+ // 鑾峰彇杈撳叆鐨勬槦鏈熸墍鍦ㄦ棩鏈熷湪鏃堕棿娈靛唴鐨勪互涓�涓棩鏈�
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(startDate);
+ calendar.add(Calendar.DATE, days);
+ while (calendar.getTime().getTime() <= endDate.getTime()) {
+ dates.add(calendar.getTime());
+ calendar.add(Calendar.DATE, Calendar.DAY_OF_WEEK);
+ }
+ return dates;
+ }
+
+ /**
+ * 鑾峰彇寤惰繜鐨勬椂闂�
+ * @param time 浼犲叆鐨勬棩鏈�
+ * @param field
+ * @param amount
+ * @param format
+ * @return
+ */
+ public static String getDelayTime(String time, int field, int amount, String format) {
+ Date date = DateUtils.parseStringDateToDate(time, format);
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ calendar.add(field, amount);
+ date = calendar.getTime();
+ return DateUtils.parseDateToString(date, format);
+ }
+
+ /**
+ * 璁$畻涓や釜鏃ユ湡涔嬮棿鐨勫ぉ鏁�
+ *
+ * @param smdate
+ * @param bdate
+ * @return
+ * @throws ParseException
+ */
+ public static int daysBetween(String startDate, String endDate) throws ParseException {
+ SimpleDateFormat sdf = getDateFormat(DATE_FORMAT);
+ Date smdate = sdf.parse(startDate);
+ Date bdate = sdf.parse(endDate);
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(smdate);
+ long time1 = cal.getTimeInMillis();
+ cal.setTime(bdate);
+ long time2 = cal.getTimeInMillis();
+ long between_days = (time2 - time1) / (1000 * 3600 * 24);
+ return Integer.parseInt(String.valueOf(between_days));
+ }
+
+ /**
+ * 鑾峰彇涓や釜鏃ユ湡涔嬮棿鐨勫ぉ鏁�
+ *
+ * @param smdate
+ * @param bdate
+ * @return
+ * @throws ParseException
+ */
+ public static int daysBetween(Date smdate, Date bdate) throws ParseException {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(smdate);
+ long time1 = cal.getTimeInMillis();
+ cal.setTime(bdate);
+ long time2 = cal.getTimeInMillis();
+ long between_days = (time2 - time1) / (1000 * 3600 * 24);
+ return Integer.parseInt(String.valueOf(between_days));
+ }
+
+ /**
+ * 灏咲ate杞崲涓篊alendar
+ *
+ * @param date
+ * Date date
+ * @return {@link Calendar}
+ * @author jsZhu
+ */
+ public static Calendar parseDateToCalendar(Date date) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ return cal;
+ }
+
+ /**
+ * 灏咲ate 鏍煎紡涓簓yyy-MM-dd 褰㈠紡杞崲涓� Integer
+ *
+ * @param date
+ * Convert Date Object
+ * @return Covert Date {@link Integer}
+ * @author jsZhu
+ */
+ public static Integer parseDateToInteger(Date date) {
+ Calendar calendar = parseDateToCalendar(date);
+ String year = String.valueOf(calendar.get(Calendar.YEAR));
+ String month = String.valueOf(((calendar.get(Calendar.MONTH)) + 1));
+ String day = String.valueOf(calendar.get(Calendar.DAY_OF_MONTH));
+ String hour = String.valueOf(calendar.get(Calendar.HOUR));
+ String minute = String.valueOf((calendar.get(Calendar.MINUTE)));
+ return Integer.parseInt(year + month + day + hour + minute);
+ }
+
+ /**
+ * 涓や釜Date鏃ユ湡姣旇緝鏄惁鐩稿綋
+ *
+ * @param date1
+ * @param date2
+ * @return boolean
+ * @author jsZhu
+ */
+ public static boolean isSameDay(Date date1, Date date2) {
+ if (date1 == null || date2 == null) {
+ throw new IllegalArgumentException("The date must not be null");
+ }
+ Calendar cal1 = Calendar.getInstance();
+ cal1.setTime(date1);
+ Calendar cal2 = Calendar.getInstance();
+ cal2.setTime(date2);
+ return isSameDay(cal1, cal2);
+ }
+
+ /**
+ * 涓や釜瑁呮湁鏃ユ湡 Calenday姣旇緝鏄惁鐩哥瓑
+ *
+ * @param cal1
+ * @param cal2
+ * @return boolean
+ * @author jsZhu
+ */
+ public static boolean isSameDay(Calendar cal1, Calendar cal2) {
+ if (cal1 == null || cal2 == null) {
+ throw new IllegalArgumentException("The date must not be null");
+ }
+ return (cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA) && cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR)
+ && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR));
+ }
+
+ /**
+ * 灏咲ate瀛楃涓茶浆鎹负Calendar
+ *
+ * @param date
+ * DateString
+ * @return Calendar
+ * @author jsZhu
+ */
+ public static Calendar parseStringDateToCalendar(String date) {
+ Calendar calendar = new GregorianCalendar();
+ DateFormat df = new SimpleDateFormat(DateUtils.DATE_FORMAT);
+ try {
+ Date daystart = df.parse(date);
+ calendar.setTime(daystart);
+ return calendar;
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * 鑾峰彇鍦ㄧ嚎鍖椾含鏃堕棿
+ *
+ * @return Date
+ * @author jsZhu
+ */
+ public static Date getDateOnline() {
+ TimeZone.setDefault(TimeZone.getTimeZone("GMT+8")); // 鏃跺尯璁剧疆
+ java.net.URLConnection uc;
+ try {
+ URL url = new URL("http://www.bjtime.cn");
+ uc = url.openConnection();
+ uc.connect();
+ long ld = uc.getDate();
+ Date date = new Date(ld);
+ return date;
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return new Date();
+ }
+
+ /**
+ * 灏嗘棩鏈熺被鍨嬭浆鍖栦负瀛楃涓�
+ *
+ * @param date
+ * @param formatString
+ * @return
+ */
+ public static String parseLongDateToStringDate(Date date, String formatString) {
+ SimpleDateFormat format = getDateFormat(formatString);
+ return format.format(date);
+ }
+
+ /**
+ * 鑾峰彇SimpleDateFormat
+ *
+ * @param formatString
+ * @return
+ */
+ private static SimpleDateFormat getDateFormat(String formatString) {
+ return new SimpleDateFormat(formatString);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞寲涓烘棩鏈熺被鍨�
+ *
+ * @param formatString
+ * @return
+ */
+ public static Date parseStringDateToDate(String date, String formatString) {
+ try {
+ return getDateFormat(formatString).parse(date);
+ } catch (ParseException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * 鑾峰彇浠绘剰鏈堜唤绗竴澶╂垨鑰呮渶鍚庝竴澶�
+ *
+ * @param date
+ * 锛氬綋鍓嶆湀鐨凞ate瀵硅薄
+ * @param currentDate
+ * 锛氭灇涓�
+ * @param formatString
+ * 锛氭牸寮忓寲瀛楃涓�
+ * @return
+ */
+ public static String getStringDay(Date date, CurrentDate currentDate, String formatString) {
+ SimpleDateFormat df = getDateFormat(formatString);
+ GregorianCalendar gcLast = (GregorianCalendar) Calendar.getInstance();
+ gcLast.setTime(date);
+ switch (currentDate) {
+ case FIRST:
+ gcLast.add(Calendar.MONTH, 0);
+ gcLast.set(Calendar.DAY_OF_MONTH, 1);// 璁剧疆涓�1鍙�,褰撳墠鏃ユ湡鏃负鏈湀绗竴澶�
+ break;
+ case LAST:
+ gcLast.set(Calendar.DAY_OF_MONTH, gcLast.getActualMaximum(Calendar.DAY_OF_MONTH));
+ break;
+ default:
+ break;
+ }
+ return df.format(gcLast.getTime());
+ }
+
+ /**
+ * 鑾峰彇浠绘剰鏈堜唤绗竴澶╂垨鑰呮渶鍚庝竴澶�
+ *
+ * @param date
+ * 锛氬綋鍓嶆湀鐨凞ate瀵硅薄
+ * @param currentDate
+ * 锛氭灇涓�
+ * @param formatString
+ * 锛氭牸寮忓寲瀛楃涓�
+ * @return
+ */
+ public static Date getDateDay(Date date, CurrentDate currentDate, String formatString) {
+ GregorianCalendar gcLast = (GregorianCalendar) Calendar.getInstance();
+ gcLast.setTime(date);
+ switch (currentDate) {
+ case FIRST:
+ gcLast.add(Calendar.MONTH, 0);
+ gcLast.set(Calendar.DAY_OF_MONTH, 1);// 璁剧疆涓�1鍙�,褰撳墠鏃ユ湡鏃负鏈湀绗竴澶�
+ break;
+ case LAST:
+ gcLast.set(Calendar.DAY_OF_MONTH, gcLast.getActualMaximum(Calendar.DAY_OF_MONTH));
+ break;
+ default:
+ break;
+ }
+ return gcLast.getTime();
+ }
+
+ /**
+ * 鏃ユ湡鏋氫妇
+ *
+ * @author liuyazhuang
+ *
+ */
+ public static enum CurrentDate {
+ FIRST, LAST
+ }
+
+ /**
+ * 鏍煎紡鍖栫被鍒灇涓�
+ *
+ * @author liuyazhuang
+ *
+ */
+ public static enum FormatType {
+ DATE_FORMAT, DATE_TIME_FORMAT, DATE_MINUTE_FORMAT, MONTH_FORMAT, TIME_FORMAT
+ }
+
+ /**
+ * 鏍规嵁鏃ユ湡鍙栧緱鏄熸湡
+ *
+ * @param dateStr
+ * @param formatType
+ * @return
+ */
+ public static String parseStringDateToStringWeek(String dateStr, FormatType formatType) {
+ final String dayNames[] = { "鏄熸湡鏃�", "鏄熸湡涓�", "鏄熸湡浜�", "鏄熸湡涓�", "鏄熸湡鍥�", "鏄熸湡浜�", "鏄熸湡鍏�" };
+ SimpleDateFormat sdfInput = null;
+ switch (formatType) {
+ case DATE_FORMAT:
+ sdfInput = getDateFormat(DATE_FORMAT);
+ break;
+ case DATE_TIME_FORMAT:
+ sdfInput = getDateFormat(DATE_TIME_FORMAT);
+ break;
+ case DATE_MINUTE_FORMAT:
+ sdfInput = getDateFormat(DATE_MINUTE_FORMAT);
+ break;
+ case MONTH_FORMAT:
+ sdfInput = getDateFormat(MONTH_FORMAT);
+ break;
+ case TIME_FORMAT:
+ sdfInput = getDateFormat(TIME_FORMAT);
+ break;
+ default:
+ break;
+ }
+ Calendar calendar = Calendar.getInstance();
+ Date date = new Date();
+ try {
+ date = sdfInput.parse(dateStr);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ calendar.setTime(date);
+ int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
+ if (dayOfWeek < 0)
+ dayOfWeek = 0;
+ return dayNames[dayOfWeek];
+ }
+
+ /**
+ * 鏇村姞褰撳墠鏃ユ湡鐨勬槦鏈燂紙鏁板瓧锛�
+ *
+ * @param dateStr
+ * @param formatType
+ * @return
+ */
+ public static int getWeekByDate(Date dt) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(dt);
+ int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
+ if (dayOfWeek < 0)
+ dayOfWeek = 0;
+ return dayOfWeek;
+ }
+
+ /**
+ * 鍙栧緱褰撳墠鏃堕棿
+ *
+ * @return
+ */
+ public static String getTodayTime() {
+ Calendar cal = Calendar.getInstance();
+ cal.add(Calendar.DATE, 0);
+ String today = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime());
+ return today;
+ }
+
+ // 鑾峰彇鐜板湪鐨勬椂闂�
+ public static String getTime() {
+ Calendar cal = Calendar.getInstance();
+ cal.add(Calendar.DATE, 0);
+ String today = new SimpleDateFormat("HH:mm:ss").format(cal.getTime());
+ return today;
+ }
+
+ public static String getTodayTimes() {
+ SimpleDateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ return dFormat.format(new Date()).toString();
+ }
+
+ public static String getToday() {
+ Calendar cal = Calendar.getInstance();
+ cal.add(Calendar.DATE, 0);
+ String today = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
+ return today;
+ }
+
+ public static Long getAppointTime(String times) {
+ DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+ try {
+ return df.parse(getToday() + " " + times).getTime();
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ return 0L;
+ }
+
+ public static long getLongTypetime(String times) {
+ DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+ try {
+ return df.parse(times).getTime();
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ return 0L;
+ }
+
+ // 鑾峰彇鎸囧畾鏃堕棿鐨勬椂闂存埑(绮剧‘鍒扮)
+ public static long getMillis(String times) {
+ DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ try {
+ return df.parse(times).getTime();
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ return 0l;
+ }
+
+ public static String getDateTimeStr() {
+ DateFormat df = new SimpleDateFormat("yyyyMMddHHmm");
+ try {
+ return df.format(new Date());
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public static String getDate() {
+ SimpleDateFormat dFormat = new SimpleDateFormat("yyyyMMdd");
+ return dFormat.format(new Date()).toString();
+ }
+
+ public static long getCacheEffectMillisTime() {
+ return getTomorrowZeroPointMillis() - System.currentTimeMillis();
+ }
+
+ public static long getTomorrowZeroPointMillis() {
+ SimpleDateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
+ long millis = 0;
+ try {
+ millis = dFormat.parse(getTomorrow() + " 00:00:00").getTime();
+ } catch (ParseException e) {
+ // 濡傛灉鍑虹幇寮傚父锛屽垯榛樿淇濆瓨24灏忔椂
+ return System.currentTimeMillis() + 1000 * 60 * 60 * 23;
+ }
+ return millis;
+ }
+
+ public static String getTomorrow() {
+ long myTime = System.currentTimeMillis() + 60 * 60 * 24 * 1000;
+ SimpleDateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd");
+ return dFormat.format(new Date(myTime)).toString();
+ }
+
+ public static String getSpecifiedDayBefore(int agoday) {
+ Calendar c = Calendar.getInstance();
+ Date date = null;
+ try {
+ date = new SimpleDateFormat("yy-MM-dd").parse(getToday());
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ c.setTime(date);
+ int day = c.get(Calendar.DATE);
+ c.set(Calendar.DATE, day - agoday);
+
+ String dayBefore = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
+ return dayBefore;
+ }
+
+ public static Date getSpecifiedDayBeforeFormatDate(int agoday, Date date) {
+ Calendar c = Calendar.getInstance();
+ c.setTime(date);
+ int day = c.get(Calendar.DATE);
+ c.set(Calendar.DATE, day - agoday);
+ return c.getTime();
+ }
+
+ public static String getSpecifiedDayAfter(int agoday) {
+ Calendar c = Calendar.getInstance();
+ Date date = null;
+ try {
+ date = new SimpleDateFormat("yy-MM-dd").parse(getToday());
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ c.setTime(date);
+ int day = c.get(Calendar.DATE);
+ c.set(Calendar.DATE, day + agoday);
+
+ String dayBefore = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
+ return dayBefore;
+ }
+
+ public static Date getSpecifiedDayAfterFormatDate(int agoday, Date date) {
+ Calendar c = Calendar.getInstance();
+ c.setTime(date);
+ int day = c.get(Calendar.DATE);
+ c.set(Calendar.DATE, day + agoday);
+ return c.getTime();
+ }
+
+ public static Long getAge(Date date) {
+ Date endDate = new Date();
+ long day = (endDate.getTime() - date.getTime()) / 1000;
+ return day / (60 * 60 * 24 * 365);
+ }
+
+ /**
+ * 鑾峰緱褰撳墠鏈堢殑鏈�鍚庝竴澶╃殑鏈�澶уぉ鏁�
+ */
+ public static int getMaxDayByYearMonth(int year, int month) {
+ int maxDay = 0;
+ int day = 1;
+ /**
+ * Calendar 鐨� getInstance 鏂规硶杩斿洖涓� 涓� Calendar 瀵硅薄锛屽叾鏃ュ巻瀛楁宸茬敱褰撳墠鏃ユ湡鍜屾椂闂村垵濮嬪寲锛�
+ */
+ Calendar calendar = Calendar.getInstance();
+ /**
+ * 瀹炰緥鍖栨棩鍘嗗悇涓瓧娈�,杩欓噷鐨刣ay涓哄疄渚嬪寲浣跨敤
+ */
+ calendar.set(year, month - 1, day);
+ /**
+ * Calendar.Date:琛ㄧず涓�涓湀涓殑鏌愬ぉ calendar.getActualMaximum(int
+ * field):杩斿洖鎸囧畾鏃ュ巻瀛楁鍙兘鎷ユ湁鐨勬渶澶у��
+ */
+ maxDay = calendar.getActualMaximum(Calendar.DATE);
+ return maxDay;
+ }
+
+ /**
+ * 寰楀埌寰楀埌鏃ユ湡鐨勫墠涓�澶�
+ */
+ public static Date getbeforDay(Date dateSign) {
+ Date dBefore = new Date();
+ Calendar calendar = Calendar.getInstance(); // 寰楀埌鏃ュ巻
+ calendar.setTime(dateSign);// 鎶婂綋鍓嶆椂闂磋祴缁欐棩鍘�
+ calendar.add(Calendar.DAY_OF_MONTH, -1); // 璁剧疆涓哄墠涓�澶�
+ dBefore = calendar.getTime();
+ return dBefore;
+ }
+
+ /**
+ * 3澶╁悗澶辨晥
+ *
+ * @param createTime
+ * @return
+ */
+ public static Date getLoseEffectiveness(Date createTime) {
+ Date threeLoseTime = new Date();
+ Calendar calendar = Calendar.getInstance(); // 寰楀埌鏃ュ巻
+ calendar.setTime(createTime);// 鎶婂綋鍓嶆椂闂磋祴缁欐棩鍘�
+ calendar.add(Calendar.DAY_OF_MONTH, +3); // 璁剧疆涓�3澶╁悗鐨勬椂闂�
+ threeLoseTime = calendar.getTime();
+ return threeLoseTime;
+
+ }
+
+ /**
+ * 0:涓婂崍 1:涓嬪崍
+ *
+ * @return
+ */
+ public static int isAmOrPm() {
+ GregorianCalendar ca = new GregorianCalendar();
+ return ca.get(GregorianCalendar.AM_PM);
+ }
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/utils/StringUtils.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/utils/StringUtils.java
new file mode 100644
index 0000000..d82b92c
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/utils/StringUtils.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright 2018-2118 the original author or authors.
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.vci.dbsync.utils;
+
+/**
+ * @author liuyazhuang
+ * @date 2018/9/11 10:27
+ * @description 瀛楃涓插伐鍏风被
+ * @version 1.0.0
+ */
+public class StringUtils {
+
+ public static boolean isEmpty(String str){
+ return str == null || "".equals(str.trim());
+ }
+}
diff --git a/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/utils/Tool.java b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/utils/Tool.java
new file mode 100644
index 0000000..03b4a7a
--- /dev/null
+++ b/Source/ThirdPart/DBSync/dbsync/src/com/vci/dbsync/utils/Tool.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright 2018-2118 the original author or authors.
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.vci.dbsync.utils;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Type;
+
+import org.dom4j.Element;
+
+import com.vci.dbsync.Constants;
+import com.vci.dbsync.entity.Operate;
+
+/**
+ * @author liuyazhuang
+ * @date 2018/9/11 10:27
+ * @description 宸ュ叿绫�
+ * @version 1.0.0
+ */
+public class Tool {
+
+ /**
+ * 浜х敓闅忔満瀛楃涓�
+ * @param length 瀛楃涓茬殑闀垮害
+ * @return 闅忔満鐨勫瓧绗︿覆
+ */
+ public static String generateString(int length) {
+ if (length < 1)
+ length = 6;
+ String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ String genStr = "";
+ for (int index = 0; index < length; index++) {
+ genStr = genStr + str.charAt((int) ((Math.random() * 100) % 26));
+ }
+ return genStr;
+ }
+
+ /**
+ * 瑙f瀽e涓殑鍏冪礌锛屽皢鏁版嵁濉厖鍒皁涓�
+ * @param e 瑙f瀽鐨刋ML Element瀵硅薄
+ * @param o 瀛樻斁瑙f瀽鍚庣殑XML Element瀵硅薄
+ * @return 瀛樻斁鏈夎В鏋愬悗鏁版嵁鐨凮bject
+ * @throws IllegalArgumentException
+ * @throws IllegalAccessException
+ */
+ public static Object elementInObject(Element e, Object o) throws IllegalArgumentException, IllegalAccessException {
+ Field[] fields = o.getClass().getDeclaredFields();
+ for (int index = 0; index < fields.length; index++) {
+ Field item = fields[index];
+ //褰撳墠瀛楁涓嶆槸serialVersionUID锛屽悓鏃跺綋鍓嶅瓧娈典笉鍖呭惈serialVersionUID
+ if (!Constants.FIELD_SERIALVERSIONUID.equals(item.getName()) && !item.getName().contains(Constants.FIELD_SERIALVERSIONUID)){
+ item.setAccessible(true);
+ String value = e.element(item.getName()).getTextTrim();
+ Type type = item.getType();
+
+ if (type == Boolean.TYPE){
+ if (value.equalsIgnoreCase("true"))
+ item.setBoolean(o, true);
+ else
+ item.setBoolean(o, false);
+ }
+ else if (type == Operate.class){
+ if (value.equalsIgnoreCase("insert"))
+ item.set(o, Operate.insert);
+ else if (value.equalsIgnoreCase("update"))
+ item.set(o, Operate.update);
+ else
+ item.set(o, Operate.both);
+ }
+ else
+ item.set(o, value);
+ }
+ }
+ return o;
+ }
+}
diff --git a/Source/ThirdPart/DBSync/lib/c3p0-0.9.1.1.jar b/Source/ThirdPart/DBSync/lib/c3p0-0.9.1.1.jar
new file mode 100644
index 0000000..8d283e4
--- /dev/null
+++ b/Source/ThirdPart/DBSync/lib/c3p0-0.9.1.1.jar
Binary files differ
diff --git a/Source/ThirdPart/DBSync/lib/commons-logging-1.1.1.jar b/Source/ThirdPart/DBSync/lib/commons-logging-1.1.1.jar
new file mode 100644
index 0000000..1deef14
--- /dev/null
+++ b/Source/ThirdPart/DBSync/lib/commons-logging-1.1.1.jar
Binary files differ
diff --git a/Source/ThirdPart/DBSync/lib/dom4j-1.6.1.jar b/Source/ThirdPart/DBSync/lib/dom4j-1.6.1.jar
new file mode 100644
index 0000000..c8c4dbb
--- /dev/null
+++ b/Source/ThirdPart/DBSync/lib/dom4j-1.6.1.jar
Binary files differ
diff --git a/Source/ThirdPart/DBSync/lib/hamcrest-core-1.3.jar b/Source/ThirdPart/DBSync/lib/hamcrest-core-1.3.jar
new file mode 100644
index 0000000..9d5fe16
--- /dev/null
+++ b/Source/ThirdPart/DBSync/lib/hamcrest-core-1.3.jar
Binary files differ
diff --git a/Source/ThirdPart/DBSync/lib/junit-4.12.jar b/Source/ThirdPart/DBSync/lib/junit-4.12.jar
new file mode 100644
index 0000000..3a7fc26
--- /dev/null
+++ b/Source/ThirdPart/DBSync/lib/junit-4.12.jar
Binary files differ
diff --git a/Source/ThirdPart/DBSync/lib/log4j-1.2.17.jar b/Source/ThirdPart/DBSync/lib/log4j-1.2.17.jar
new file mode 100644
index 0000000..1d425cf
--- /dev/null
+++ b/Source/ThirdPart/DBSync/lib/log4j-1.2.17.jar
Binary files differ
diff --git a/Source/ThirdPart/DBSync/lib/mssql-jdbc-6.2.0.jre8.jar b/Source/ThirdPart/DBSync/lib/mssql-jdbc-6.2.0.jre8.jar
new file mode 100644
index 0000000..0340bad
--- /dev/null
+++ b/Source/ThirdPart/DBSync/lib/mssql-jdbc-6.2.0.jre8.jar
Binary files differ
diff --git a/Source/ThirdPart/DBSync/lib/mysql-connector-java-5.1.22.jar b/Source/ThirdPart/DBSync/lib/mysql-connector-java-5.1.22.jar
new file mode 100644
index 0000000..a50424d
--- /dev/null
+++ b/Source/ThirdPart/DBSync/lib/mysql-connector-java-5.1.22.jar
Binary files differ
diff --git a/Source/ThirdPart/DBSync/lib/ojdbc6.jar b/Source/ThirdPart/DBSync/lib/ojdbc6.jar
new file mode 100644
index 0000000..3977122
--- /dev/null
+++ b/Source/ThirdPart/DBSync/lib/ojdbc6.jar
Binary files differ
diff --git a/Source/ThirdPart/DBSync/lib/quartz-2.1.3.jar b/Source/ThirdPart/DBSync/lib/quartz-2.1.3.jar
new file mode 100644
index 0000000..1b789cd
--- /dev/null
+++ b/Source/ThirdPart/DBSync/lib/quartz-2.1.3.jar
Binary files differ
diff --git a/Source/ThirdPart/DBSync/lib/slf4j-api-1.7.2.jar b/Source/ThirdPart/DBSync/lib/slf4j-api-1.7.2.jar
new file mode 100644
index 0000000..1a88708
--- /dev/null
+++ b/Source/ThirdPart/DBSync/lib/slf4j-api-1.7.2.jar
Binary files differ
diff --git a/Source/ThirdPart/DBSync/lib/slf4j-log4j12-1.7.2.jar b/Source/ThirdPart/DBSync/lib/slf4j-log4j12-1.7.2.jar
new file mode 100644
index 0000000..5dfcf4b
--- /dev/null
+++ b/Source/ThirdPart/DBSync/lib/slf4j-log4j12-1.7.2.jar
Binary files differ
diff --git a/Source/ThirdPart/DBSync/lib/xml-apis-1.0.b2.jar b/Source/ThirdPart/DBSync/lib/xml-apis-1.0.b2.jar
new file mode 100644
index 0000000..ad33a5a
--- /dev/null
+++ b/Source/ThirdPart/DBSync/lib/xml-apis-1.0.b2.jar
Binary files differ
diff --git a/Source/ThirdPart/DBSync/properties/dbSynclog4j.properties b/Source/ThirdPart/DBSync/properties/dbSynclog4j.properties
new file mode 100644
index 0000000..a5d9ad3
--- /dev/null
+++ b/Source/ThirdPart/DBSync/properties/dbSynclog4j.properties
@@ -0,0 +1,23 @@
+#\u5b9a\u4e493\u4e2a\u8f93\u51fa\u7aef
+log4j.rootCategory=INFO,A1,A2
+
+#\u5b9a\u4e49A1\u8f93\u51fa\u5230\u63a7\u5236\u5668
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+#\u5b9a\u4e49A1\u7684\u5e03\u5c40\u6a21\u5f0f\u4e3aPaternLayout
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.console.Target=System.out
+# \u5b9a\u4e49A1\u7684\u8f93\u51fa\u683c\u5f0f
+log4j.appender.A1.layout.ConversionPattern=[%d{yyyy-MM-dd hh:mm:ss}]:%p [%t] (%F:%L) - %m%n
+
+#\u5b9a\u4e49A2\u8f93\u51fa\u5230\u6587\u4ef6
+log4j.appender.A2=org.apache.log4j.RollingFileAppender
+#\u5b9a\u4e49A2\u8f93\u51fa\u5230\u54ea\u4e2a\u6587\u4ef6
+log4j.appender.A2.File=./log/dbSync.log
+#\u5b9a\u4e49A2\u8f93\u51fa\u6587\u4ef6\u7684\u6700\u5927\u957f\u5ea6
+log4j.appender.A2.MaxFileSize = 10MB
+#\u5b9a\u4e49A2\u7684\u5907\u4efd\u6587\u4ef6\u6570
+log4j.appender.A2.MaxBackupIndex = 10
+#\u5b9a\u4e49A2\u7684\u5e03\u5c40\u6a21\u5f0f\u4e3aPatternLayout
+log4j.appender.A2.layout=org.apache.log4j.PatternLayout
+#\u5b9a\u4e49A2\u7684\u8f93\u51fa\u6a21\u5f0f
+log4j.appender.A2.layout.ConversionPattern=[%d{yyyy-MM-dd hh:mm:ss}]:%p %t %c - %m%n
diff --git a/Source/ThirdPart/DBSync/properties/dbjobs.xml b/Source/ThirdPart/DBSync/properties/dbjobs.xml
new file mode 100644
index 0000000..0435594
--- /dev/null
+++ b/Source/ThirdPart/DBSync/properties/dbjobs.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<root>
+ <code>4500000001</code>
+<!-- <source>
+ <url>jdbc:mysql://10.2.2.231:3306/guanxing_medical</url>
+ <username>root</username>
+ <password>root</password>
+ <dbtype>mysql</dbtype>
+ <driver>com.mysql.jdbc.Driver</driver>
+ </source>
+ <dest>
+ <url>jdbc:mysql://127.0.0.1:3306/guanxing_medical</url>
+ <username>root</username>
+ <password>root</password>
+ <dbtype>mysql</dbtype>
+ <driver>com.mysql.jdbc.Driver</driver>
+ </dest> -->
+ <source>
+ <url>jdbc:oracle:thin:@127.0.0.1:1521:orcl</url>
+ <username>mpm205</username>
+ <password>vcitest</password>
+ <dbtype>oracle</dbtype>
+ <driver>oracle.jdbc.driver.OracleDriver</driver>
+ </source>
+ <dest>
+ <url>jdbc:oracle:thin:@127.0.0.1:1521:orcl</url>
+ <username>MPM205_REL</username>
+ <password>vcitest</password>
+ <dbtype>oracle</dbtype>
+ <driver>oracle.jdbc.driver.OracleDriver</driver>
+ </dest>
+ <jobs>
+ <!-- <job>
+ <name>pluser</name>
+ <cron>0/300 * * * * ?</cron>
+ <srcSql>select pluid, plusername, plpassword, pltruename, plemail, pldesc, plusertype, plstatus, plpwdupdatetime, plcreatetime, plcreateuser, plupdatetime, plupdateuser, pllicensors, plsecretgrade, plisdeptleader from PLUSER</srcSql>
+ <destTable>pluser</destTable>
+ <destTableFields>pluid, plusername, plpassword, pltruename, plemail, pldesc, plusertype, plstatus, plpwdupdatetime, plcreatetime, plcreateuser, plupdatetime, plupdateuser, pllicensors, plsecretgrade, plisdeptleader</destTableFields>
+ <destTableKey>pluid</destTableKey>
+ <destTableUpdate>plusername, plpassword, pltruename, plemail, pldesc, plusertype, plstatus, plpwdupdatetime, plcreatetime, plcreateuser, plupdatetime, plupdateuser, pllicensors, plsecretgrade, plisdeptleader</destTableUpdate>
+ </job> -->
+ <job>
+ <name>PSM鏁版嵁鍚屾</name>
+ <cron>0 2/30 * * * ?</cron>
+ <item>
+ <name>PLATFORMBTM_PART</name>
+ <direction>true</direction>
+ <operate>both</operate>
+ <srcSql>select oid,revisionoid,nameoid,btmname,islastr,isfirstr,islastv,isfirstv,creator,createtime,lastmodifier,lastmodifytime,revisionrule,versionrule,revisionseq,revisionvalue,versionseq,versionvalue,lctid,lcstatus,ts,id,name,description,owner,checkinby,checkintime,checkoutby,checkouttime,copyfromversion,code,parttype,weight,unit,virtualsource,virtualsourcemdv,bizdomain,gz,keyinfos,materialname,materialspecs,materialtrademark,ownproduct,partsource,secretgrade,thumbnailpath,usematerial,partsofttype,pointlinetype,designedby,storepath,districtidentifer,manufactureunit,materialbz,materialsize,ppartsofttype,ms,techrequirements from PLATFORMBTM_PART</srcSql>
+ <destTable>PLATFORMBTM_PART</destTable>
+ <destTableFields>oid,revisionoid,nameoid,btmname,islastr,isfirstr,islastv,isfirstv,creator,createtime,lastmodifier,lastmodifytime,revisionrule,versionrule,revisionseq,revisionvalue,versionseq,versionvalue,lctid,lcstatus,ts,id,name,description,owner,checkinby,checkintime,checkoutby,checkouttime,copyfromversion,code,parttype,weight,unit,virtualsource,virtualsourcemdv,bizdomain,gz,keyinfos,materialname,materialspecs,materialtrademark,ownproduct,partsource,secretgrade,thumbnailpath,usematerial,partsofttype,pointlinetype,designedby,storepath,districtidentifer,manufactureunit,materialbz,materialsize,ppartsofttype,ms,techrequirements</destTableFields>
+ <destTableKey>oid</destTableKey>
+ <destTableUpdate>revisionoid,nameoid,btmname,islastr,isfirstr,islastv,isfirstv,creator,createtime,lastmodifier,lastmodifytime,revisionrule,versionrule,revisionseq,revisionvalue,versionseq,versionvalue,lctid,lcstatus,ts,id,name,description,owner,checkinby,checkintime,checkoutby,checkouttime,copyfromversion,code,parttype,weight,unit,virtualsource,virtualsourcemdv,bizdomain,gz,keyinfos,materialname,materialspecs,materialtrademark,ownproduct,partsource,secretgrade,thumbnailpath,usematerial,partsofttype,pointlinetype,designedby,storepath,districtidentifer,manufactureunit,materialbz,materialsize,ppartsofttype,ms,techrequirements</destTableUpdate>
+ </item>
+ <item>
+ <name>PLATFORMBTM_PARTINSTANCE</name>
+ <direction>true</direction>
+ <operate>both</operate>
+ <srcSql>select oid, revisionoid, nameoid, btmname, islastr, isfirstr, islastv, isfirstv, creator, createtime, lastmodifier, lastmodifytime, revisionrule, versionrule, revisionseq, revisionvalue, versionseq, versionvalue, lctid, lcstatus, ts, id, name, description, owner, checkinby, checkintime, checkoutby, checkouttime, copyfromversion, cadtoken, lmtoken, partoid, pointlinepath, cadposition, lmposition, fpartoid, sourceoid, enduser from PLATFORMBTM_PARTINSTANCE</srcSql>
+ <destTable>PLATFORMBTM_PARTINSTANCE</destTable>
+ <destTableFields>oid, revisionoid, nameoid, btmname, islastr, isfirstr, islastv, isfirstv, creator, createtime, lastmodifier, lastmodifytime, revisionrule, versionrule, revisionseq, revisionvalue, versionseq, versionvalue, lctid, lcstatus, ts, id, name, description, owner, checkinby, checkintime, checkoutby, checkouttime, copyfromversion, cadtoken, lmtoken, partoid, pointlinepath, cadposition, lmposition, fpartoid, sourceoid, enduser</destTableFields>
+ <destTableKey>oid</destTableKey>
+ <destTableUpdate>revisionoid, nameoid, btmname, islastr, isfirstr, islastv, isfirstv, creator, createtime, lastmodifier, lastmodifytime, revisionrule, versionrule, revisionseq, revisionvalue, versionseq, versionvalue, lctid, lcstatus, ts, id, name, description, owner, checkinby, checkintime, checkoutby, checkouttime, copyfromversion, cadtoken, lmtoken, partoid, pointlinepath, cadposition, lmposition, fpartoid, sourceoid, enduser</destTableUpdate>
+ </item>
+ <item>
+ <name>PLATFORMLT_PBOM</name>
+ <direction>true</direction>
+ <operate>both</operate>
+ <srcSql>select oid, creator, createtime, lastmodifier, lastmodifytime, f_oid, f_revisionoid, f_nameoid, f_btwname, t_oid, t_revisionoid, t_nameoid, t_btwname, ts, sequence, dboid, snapshotoid, countstr, unit, measureunit, quantity, valid, bompath, sourcepos from PLATFORMLT_PBOM</srcSql>
+ <destTable>PLATFORMLT_PBOM</destTable>
+ <destTableFields>oid, creator, createtime, lastmodifier, lastmodifytime, f_oid, f_revisionoid, f_nameoid, f_btwname, t_oid, t_revisionoid, t_nameoid, t_btwname, ts, sequence, dboid, snapshotoid, countstr, unit, measureunit, quantity, valid, bompath, sourcepos</destTableFields>
+ <destTableKey>oid</destTableKey>
+ <destTableUpdate>creator, createtime, lastmodifier, lastmodifytime, f_oid, f_revisionoid, f_nameoid, f_btwname, t_oid, t_revisionoid, t_nameoid, t_btwname, ts, sequence, dboid, snapshotoid, countstr, unit, measureunit, quantity, valid, bompath, sourcepos</destTableUpdate>
+ </item>
+ </job>
+ </jobs>
+</root>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/.classpath b/Source/ThirdPart/jbpm.4.3.2/.classpath
new file mode 100644
index 0000000..d9ac24b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/.classpath
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <classpathentry kind="lib" path="lib/drools-api.jar"/>
+ <classpathentry kind="lib" path="lib/drools-compiler.jar"/>
+ <classpathentry kind="lib" path="lib/drools-core.jar"/>
+ <classpathentry kind="lib" path="lib/ant.jar"/>
+ <classpathentry kind="lib" path="lib/idm-api.jar"/>
+ <classpathentry kind="lib" path="lib/idm-common.jar"/>
+ <classpathentry kind="lib" path="lib/idm-core.jar"/>
+ <classpathentry kind="lib" path="lib/idm-hibernate.jar"/>
+ <classpathentry kind="lib" path="lib/idm-spi.jar"/>
+ <classpathentry kind="lib" path="lib/servlet-api.jar"/>
+ <classpathentry kind="lib" path="lib/groovy-all.jar"/>
+ <classpathentry kind="lib" path="lib/juel.jar"/>
+ <classpathentry kind="lib" path="lib/mockejb.jar"/>
+ <classpathentry kind="lib" path="lib/mockrunner.jar"/>
+ <classpathentry kind="lib" path="lib/juel-engine.jar"/>
+ <classpathentry kind="lib" path="lib/juel-impl.jar"/>
+ <classpathentry kind="lib" path="lib/activation.jar"/>
+ <classpathentry kind="lib" path="lib/ant-launcher.jar"/>
+ <classpathentry kind="lib" path="lib/antlr.jar"/>
+ <classpathentry kind="lib" path="lib/antlr-runtime.jar"/>
+ <classpathentry kind="lib" path="lib/avalon-framework.jar"/>
+ <classpathentry kind="lib" path="lib/cglib-nodep.jar"/>
+ <classpathentry kind="lib" path="lib/commons-collections.jar"/>
+ <classpathentry kind="lib" path="lib/core.jar"/>
+ <classpathentry kind="lib" path="lib/dom4j.jar"/>
+ <classpathentry kind="lib" path="lib/ejb3-persistence.jar"/>
+ <classpathentry kind="lib" path="lib/freemarker.jar"/>
+ <classpathentry kind="lib" path="lib/gson.jar"/>
+ <classpathentry kind="lib" path="lib/gwt-console-rpc.jar"/>
+ <classpathentry kind="lib" path="lib/gwt-console-server-integration.jar"/>
+ <classpathentry kind="lib" path="lib/hibernate-annotations.jar"/>
+ <classpathentry kind="lib" path="lib/hibernate-cglib-repack.jar"/>
+ <classpathentry kind="lib" path="lib/hibernate-commons-annotations.jar"/>
+ <classpathentry kind="lib" path="lib/hibernate-core.jar"/>
+ <classpathentry kind="lib" path="lib/hibernate-entitymanager.jar"/>
+ <classpathentry kind="lib" path="lib/hsqldb.jar"/>
+ <classpathentry kind="lib" path="lib/janino.jar"/>
+ <classpathentry kind="lib" path="lib/javassist.jar"/>
+ <classpathentry kind="lib" path="lib/jaxb-api.jar"/>
+ <classpathentry kind="lib" path="lib/jaxb-impl.jar"/>
+ <classpathentry kind="lib" path="lib/jbosscache-core.jar"/>
+ <classpathentry kind="lib" path="lib/jboss-common-core.jar"/>
+ <classpathentry kind="lib" path="lib/jboss-j2ee.jar"/>
+ <classpathentry kind="lib" path="lib/jboss-logging-spi.jar"/>
+ <classpathentry kind="lib" path="lib/jbpm-bpmn.jar"/>
+ <classpathentry kind="lib" path="lib/jbpm-console-form-plugin.jar"/>
+ <classpathentry kind="lib" path="lib/jbpm-console-graphView-plugin.jar"/>
+ <classpathentry kind="lib" path="lib/jbpm-console-integration.jar"/>
+ <classpathentry kind="lib" path="lib/jbpm-console-reports.jar"/>
+ <classpathentry kind="lib" path="lib/jbpm-db.jar"/>
+ <classpathentry kind="lib" path="lib/jbpm-examples-tests.jar"/>
+ <classpathentry kind="lib" path="lib/jbpm-jboss.jar"/>
+ <classpathentry kind="lib" path="lib/jbpm-test-db-tests.jar"/>
+ <classpathentry kind="lib" path="lib/jbpm-tomcat6.jar"/>
+ <classpathentry kind="lib" path="lib/jgroups.jar"/>
+ <classpathentry kind="lib" path="lib/jline.jar"/>
+ <classpathentry kind="lib" path="lib/joda-time.jar"/>
+ <classpathentry kind="lib" path="lib/jta.jar"/>
+ <classpathentry kind="lib" path="lib/jtds.jar"/>
+ <classpathentry kind="lib" path="lib/junit.jar"/>
+ <classpathentry kind="lib" path="lib/livetribe-jsr223.jar"/>
+ <classpathentry kind="lib" path="lib/log4j.jar"/>
+ <classpathentry kind="lib" path="lib/logkit.jar"/>
+ <classpathentry kind="lib" path="lib/mail.jar"/>
+ <classpathentry kind="lib" path="lib/mvel2.jar"/>
+ <classpathentry kind="lib" path="lib/mysql-connector-java.jar"/>
+ <classpathentry kind="lib" path="lib/postgresql.jar"/>
+ <classpathentry kind="lib" path="lib/slf4j-api.jar"/>
+ <classpathentry kind="lib" path="lib/slf4j-jdk14.jar"/>
+ <classpathentry kind="lib" path="lib/slf4j-log4j12.jar"/>
+ <classpathentry kind="lib" path="lib/stax-api.jar"/>
+ <classpathentry kind="lib" path="lib/subethasmtp-smtp.jar"/>
+ <classpathentry kind="lib" path="lib/subethasmtp-wiser.jar"/>
+ <classpathentry kind="lib" path="lib/xml-apis.jar"/>
+ <classpathentry kind="lib" path="lib/bsh.jar"/>
+ <classpathentry kind="lib" path="lib/gwt-console-jbpm.war"/>
+ <classpathentry kind="lib" path="lib/gwt-console-server-jbpm.war"/>
+ <classpathentry kind="lib" path="lib/report-engine.zip"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/Source/ThirdPart/jbpm.4.3.2/.project b/Source/ThirdPart/jbpm.4.3.2/.project
new file mode 100644
index 0000000..dfaeeab
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>jbpm</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+ <filteredResources>
+ <filter>
+ <id>1704940758492</id>
+ <name></name>
+ <type>30</type>
+ <matcher>
+ <id>org.eclipse.core.resources.regexFilterMatcher</id>
+ <arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+ </matcher>
+ </filter>
+ </filteredResources>
+</projectDescription>
diff --git a/Source/ThirdPart/jbpm.4.3.2/.settings/org.eclipse.jdt.core.prefs b/Source/ThirdPart/jbpm.4.3.2/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..57ce17c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Jul 19 10:51:00 CST 2013
+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/Source/ThirdPart/jbpm.4.3.2/build-jar.xml b/Source/ThirdPart/jbpm.4.3.2/build-jar.xml
new file mode 100644
index 0000000..51bca67
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/build-jar.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--classes.jar; src.jar-->
+<project name = "platform-JBPM4" default = "build-JBPM4-jar" basedir = ".">
+
+ <property file="build.properties"/>
+
+ <target name="time">
+ <tstamp>
+ <format property="build.time" pattern="yyyy.MM.dd.HH.mm" locale="en"/>
+ </tstamp>
+ </target>
+
+
+ <target name="build-JBPM4-jar" depends="time" description="build JBPM4 jar">
+ <jar jarfile="${dest.dir}/jbpm-4.3.2.jar" compress="true">
+ <manifest>
+ <attribute name="Built-By" value="${user.name}" />
+ <attribute name="Implementation-Title" value="${ant.project.name}" />
+ <attribute name="Built-Time" value="${build.time}" />
+ <attribute name="platform-version" value="${platform.version}" />
+ </manifest>
+ <fileset dir="${basedir}\bin">
+ <include name="**" />
+ </fileset>
+ </jar>
+ <copy todir="${lib.dir}">
+ <fileset dir="${basedir}/dist">
+ <include name="**.jar" />
+ </fileset>
+ </copy>
+ </target>
+</project>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/build.properties b/Source/ThirdPart/jbpm.4.3.2/build.properties
new file mode 100644
index 0000000..10cd8e8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/build.properties
@@ -0,0 +1,12 @@
+
+src.dir = ${basedir}/src
+dest.dir=${basedir}/dist
+
+libs.dir=${vci_home}/libs
+
+lib.dir = ${libs.dir}/lib
+common.dir=${libs.dir}/common
+service.dir=${libs.dir}/service
+client.dir=${libs.dir}/client
+
+platform.version=2023
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/dist/Jbpm-4.3.2.jar b/Source/ThirdPart/jbpm.4.3.2/dist/Jbpm-4.3.2.jar
new file mode 100644
index 0000000..21ccd58
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/dist/Jbpm-4.3.2.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/jbpm_fat.jar b/Source/ThirdPart/jbpm.4.3.2/jbpm_fat.jar
new file mode 100644
index 0000000..21ff413
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/jbpm_fat.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/activation.jar b/Source/ThirdPart/jbpm.4.3.2/lib/activation.jar
new file mode 100644
index 0000000..66d290e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/activation.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/ant-launcher.jar b/Source/ThirdPart/jbpm.4.3.2/lib/ant-launcher.jar
new file mode 100644
index 0000000..12a1e78
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/ant-launcher.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/ant.jar b/Source/ThirdPart/jbpm.4.3.2/lib/ant.jar
new file mode 100644
index 0000000..0a56a58
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/ant.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/antlr-runtime.jar b/Source/ThirdPart/jbpm.4.3.2/lib/antlr-runtime.jar
new file mode 100644
index 0000000..d90a086
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/antlr-runtime.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/antlr.jar b/Source/ThirdPart/jbpm.4.3.2/lib/antlr.jar
new file mode 100644
index 0000000..3702b64
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/antlr.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/avalon-framework.jar b/Source/ThirdPart/jbpm.4.3.2/lib/avalon-framework.jar
new file mode 100644
index 0000000..fd72580
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/avalon-framework.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/bsh.jar b/Source/ThirdPart/jbpm.4.3.2/lib/bsh.jar
new file mode 100644
index 0000000..e326510
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/bsh.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/cglib-nodep.jar b/Source/ThirdPart/jbpm.4.3.2/lib/cglib-nodep.jar
new file mode 100644
index 0000000..e9b17eb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/cglib-nodep.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/commons-collections.jar b/Source/ThirdPart/jbpm.4.3.2/lib/commons-collections.jar
new file mode 100644
index 0000000..41e230f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/commons-collections.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/commons-logging.jar b/Source/ThirdPart/jbpm.4.3.2/lib/commons-logging.jar
new file mode 100644
index 0000000..2ff9bbd
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/commons-logging.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/core.jar b/Source/ThirdPart/jbpm.4.3.2/lib/core.jar
new file mode 100644
index 0000000..310fe9f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/core.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/dom4j.jar b/Source/ThirdPart/jbpm.4.3.2/lib/dom4j.jar
new file mode 100644
index 0000000..c8c4dbb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/dom4j.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/drools-api.jar b/Source/ThirdPart/jbpm.4.3.2/lib/drools-api.jar
new file mode 100644
index 0000000..d33d6c6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/drools-api.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/drools-compiler.jar b/Source/ThirdPart/jbpm.4.3.2/lib/drools-compiler.jar
new file mode 100644
index 0000000..02b719a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/drools-compiler.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/drools-core.jar b/Source/ThirdPart/jbpm.4.3.2/lib/drools-core.jar
new file mode 100644
index 0000000..7e8b791
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/drools-core.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/ejb3-persistence.jar b/Source/ThirdPart/jbpm.4.3.2/lib/ejb3-persistence.jar
new file mode 100644
index 0000000..32c2266
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/ejb3-persistence.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/freemarker.jar b/Source/ThirdPart/jbpm.4.3.2/lib/freemarker.jar
new file mode 100644
index 0000000..8b93b17
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/freemarker.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/groovy-all.jar b/Source/ThirdPart/jbpm.4.3.2/lib/groovy-all.jar
new file mode 100644
index 0000000..022f09d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/groovy-all.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/gson.jar b/Source/ThirdPart/jbpm.4.3.2/lib/gson.jar
new file mode 100644
index 0000000..0498cf2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/gson.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/gwt-console-jbpm.war b/Source/ThirdPart/jbpm.4.3.2/lib/gwt-console-jbpm.war
new file mode 100644
index 0000000..deafa2d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/gwt-console-jbpm.war
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/gwt-console-rpc.jar b/Source/ThirdPart/jbpm.4.3.2/lib/gwt-console-rpc.jar
new file mode 100644
index 0000000..4218783
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/gwt-console-rpc.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/gwt-console-server-integration.jar b/Source/ThirdPart/jbpm.4.3.2/lib/gwt-console-server-integration.jar
new file mode 100644
index 0000000..4dfb6e1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/gwt-console-server-integration.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/gwt-console-server-jbpm.war b/Source/ThirdPart/jbpm.4.3.2/lib/gwt-console-server-jbpm.war
new file mode 100644
index 0000000..c1f80d7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/gwt-console-server-jbpm.war
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/hibernate-annotations.jar b/Source/ThirdPart/jbpm.4.3.2/lib/hibernate-annotations.jar
new file mode 100644
index 0000000..24b1583
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/hibernate-annotations.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/hibernate-cglib-repack.jar b/Source/ThirdPart/jbpm.4.3.2/lib/hibernate-cglib-repack.jar
new file mode 100644
index 0000000..1ba9b5b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/hibernate-cglib-repack.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/hibernate-commons-annotations.jar b/Source/ThirdPart/jbpm.4.3.2/lib/hibernate-commons-annotations.jar
new file mode 100644
index 0000000..e0ca904
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/hibernate-commons-annotations.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/hibernate-core.jar b/Source/ThirdPart/jbpm.4.3.2/lib/hibernate-core.jar
new file mode 100644
index 0000000..764d270
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/hibernate-core.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/hibernate-entitymanager.jar b/Source/ThirdPart/jbpm.4.3.2/lib/hibernate-entitymanager.jar
new file mode 100644
index 0000000..662eab1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/hibernate-entitymanager.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/hsqldb.jar b/Source/ThirdPart/jbpm.4.3.2/lib/hsqldb.jar
new file mode 100644
index 0000000..850ab21
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/hsqldb.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/idm-api.jar b/Source/ThirdPart/jbpm.4.3.2/lib/idm-api.jar
new file mode 100644
index 0000000..65cf3de
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/idm-api.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/idm-common.jar b/Source/ThirdPart/jbpm.4.3.2/lib/idm-common.jar
new file mode 100644
index 0000000..519f512
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/idm-common.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/idm-core.jar b/Source/ThirdPart/jbpm.4.3.2/lib/idm-core.jar
new file mode 100644
index 0000000..908278b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/idm-core.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/idm-hibernate.jar b/Source/ThirdPart/jbpm.4.3.2/lib/idm-hibernate.jar
new file mode 100644
index 0000000..c1a315b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/idm-hibernate.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/idm-spi.jar b/Source/ThirdPart/jbpm.4.3.2/lib/idm-spi.jar
new file mode 100644
index 0000000..94bed2e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/idm-spi.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/janino.jar b/Source/ThirdPart/jbpm.4.3.2/lib/janino.jar
new file mode 100644
index 0000000..af482a7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/janino.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/javassist.jar b/Source/ThirdPart/jbpm.4.3.2/lib/javassist.jar
new file mode 100644
index 0000000..a6bde77
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/javassist.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jaxb-api.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jaxb-api.jar
new file mode 100644
index 0000000..2b5dc7e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jaxb-api.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jaxb-impl.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jaxb-impl.jar
new file mode 100644
index 0000000..751426f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jaxb-impl.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jboss-common-core.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jboss-common-core.jar
new file mode 100644
index 0000000..f9446ab
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jboss-common-core.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jboss-j2ee.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jboss-j2ee.jar
new file mode 100644
index 0000000..d2526d6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jboss-j2ee.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jboss-logging-spi.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jboss-logging-spi.jar
new file mode 100644
index 0000000..f6806f3
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jboss-logging-spi.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jbosscache-core.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jbosscache-core.jar
new file mode 100644
index 0000000..ed2dd73
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jbosscache-core.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-bpmn.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-bpmn.jar
new file mode 100644
index 0000000..193c941
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-bpmn.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-console-form-plugin.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-console-form-plugin.jar
new file mode 100644
index 0000000..d5798bb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-console-form-plugin.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-console-graphView-plugin.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-console-graphView-plugin.jar
new file mode 100644
index 0000000..7b81afa
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-console-graphView-plugin.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-console-integration.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-console-integration.jar
new file mode 100644
index 0000000..f289910
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-console-integration.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-console-reports.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-console-reports.jar
new file mode 100644
index 0000000..4b55e14
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-console-reports.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-db.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-db.jar
new file mode 100644
index 0000000..a76eef9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-db.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-examples-tests.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-examples-tests.jar
new file mode 100644
index 0000000..1a51114
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-examples-tests.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-jboss.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-jboss.jar
new file mode 100644
index 0000000..22d7b6f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-jboss.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-test-db-tests.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-test-db-tests.jar
new file mode 100644
index 0000000..2a1f795
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-test-db-tests.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-tomcat6.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-tomcat6.jar
new file mode 100644
index 0000000..5460b3f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jbpm-tomcat6.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jgroups.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jgroups.jar
new file mode 100644
index 0000000..8ef91c8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jgroups.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jline.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jline.jar
new file mode 100644
index 0000000..dede372
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jline.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/joda-time.jar b/Source/ThirdPart/jbpm.4.3.2/lib/joda-time.jar
new file mode 100644
index 0000000..68068a4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/joda-time.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jta.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jta.jar
new file mode 100644
index 0000000..7736ec9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jta.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/jtds.jar b/Source/ThirdPart/jbpm.4.3.2/lib/jtds.jar
new file mode 100644
index 0000000..d0d8c95
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/jtds.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/juel-engine.jar b/Source/ThirdPart/jbpm.4.3.2/lib/juel-engine.jar
new file mode 100644
index 0000000..d1de8a7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/juel-engine.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/juel-impl.jar b/Source/ThirdPart/jbpm.4.3.2/lib/juel-impl.jar
new file mode 100644
index 0000000..53c3522
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/juel-impl.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/juel.jar b/Source/ThirdPart/jbpm.4.3.2/lib/juel.jar
new file mode 100644
index 0000000..6fda56c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/juel.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/junit.jar b/Source/ThirdPart/jbpm.4.3.2/lib/junit.jar
new file mode 100644
index 0000000..c8f711d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/junit.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/livetribe-jsr223.jar b/Source/ThirdPart/jbpm.4.3.2/lib/livetribe-jsr223.jar
new file mode 100644
index 0000000..8d38ba1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/livetribe-jsr223.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/log4j.jar b/Source/ThirdPart/jbpm.4.3.2/lib/log4j.jar
new file mode 100644
index 0000000..6251307
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/log4j.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/logkit.jar b/Source/ThirdPart/jbpm.4.3.2/lib/logkit.jar
new file mode 100644
index 0000000..d3250ee
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/logkit.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/mail.jar b/Source/ThirdPart/jbpm.4.3.2/lib/mail.jar
new file mode 100644
index 0000000..1d15e79
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/mail.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/mockejb.jar b/Source/ThirdPart/jbpm.4.3.2/lib/mockejb.jar
new file mode 100644
index 0000000..e7bfb7a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/mockejb.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/mockrunner.jar b/Source/ThirdPart/jbpm.4.3.2/lib/mockrunner.jar
new file mode 100644
index 0000000..595230f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/mockrunner.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/mvel2.jar b/Source/ThirdPart/jbpm.4.3.2/lib/mvel2.jar
new file mode 100644
index 0000000..03b1463
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/mvel2.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/mysql-connector-java.jar b/Source/ThirdPart/jbpm.4.3.2/lib/mysql-connector-java.jar
new file mode 100644
index 0000000..0170c3e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/mysql-connector-java.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/postgresql.jar b/Source/ThirdPart/jbpm.4.3.2/lib/postgresql.jar
new file mode 100644
index 0000000..a9156e9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/postgresql.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/report-engine.zip b/Source/ThirdPart/jbpm.4.3.2/lib/report-engine.zip
new file mode 100644
index 0000000..7ba7bda
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/report-engine.zip
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/servlet-api.jar b/Source/ThirdPart/jbpm.4.3.2/lib/servlet-api.jar
new file mode 100644
index 0000000..46ae9ec
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/servlet-api.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/slf4j-api.jar b/Source/ThirdPart/jbpm.4.3.2/lib/slf4j-api.jar
new file mode 100644
index 0000000..4382866
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/slf4j-api.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/slf4j-jdk14.jar b/Source/ThirdPart/jbpm.4.3.2/lib/slf4j-jdk14.jar
new file mode 100644
index 0000000..86b1a29
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/slf4j-jdk14.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/slf4j-log4j12.jar b/Source/ThirdPart/jbpm.4.3.2/lib/slf4j-log4j12.jar
new file mode 100644
index 0000000..2c040a1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/slf4j-log4j12.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/stax-api.jar b/Source/ThirdPart/jbpm.4.3.2/lib/stax-api.jar
new file mode 100644
index 0000000..015169d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/stax-api.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/subethasmtp-smtp.jar b/Source/ThirdPart/jbpm.4.3.2/lib/subethasmtp-smtp.jar
new file mode 100644
index 0000000..3af4aa4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/subethasmtp-smtp.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/subethasmtp-wiser.jar b/Source/ThirdPart/jbpm.4.3.2/lib/subethasmtp-wiser.jar
new file mode 100644
index 0000000..200cf39
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/subethasmtp-wiser.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/lib/xml-apis.jar b/Source/ThirdPart/jbpm.4.3.2/lib/xml-apis.jar
new file mode 100644
index 0000000..ad33a5a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/lib/xml-apis.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/jpdl-migration-4.3.jar b/Source/ThirdPart/jbpm.4.3.2/migration/jpdl-migration-4.3.jar
new file mode 100644
index 0000000..c7d786f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/jpdl-migration-4.3.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/activation-1.1.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/activation-1.1.jar
new file mode 100644
index 0000000..66d290e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/activation-1.1.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/ant-1.7.0.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/ant-1.7.0.jar
new file mode 100644
index 0000000..0a56a58
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/ant-1.7.0.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/ant-launcher-1.7.0.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/ant-launcher-1.7.0.jar
new file mode 100644
index 0000000..12a1e78
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/ant-launcher-1.7.0.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/antlr-2.7.6.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/antlr-2.7.6.jar
new file mode 100644
index 0000000..3702b64
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/antlr-2.7.6.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/bsh-2.0b5.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/bsh-2.0b5.jar
new file mode 100644
index 0000000..e326510
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/bsh-2.0b5.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/cglib-nodep-2.1_3.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/cglib-nodep-2.1_3.jar
new file mode 100644
index 0000000..e9b17eb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/cglib-nodep-2.1_3.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/commons-collections-3.1.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/commons-collections-3.1.jar
new file mode 100644
index 0000000..41e230f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/commons-collections-3.1.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/commons-logging-1.1.1.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/commons-logging-1.1.1.jar
new file mode 100644
index 0000000..1deef14
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/commons-logging-1.1.1.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/dom4j-1.6.1.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/dom4j-1.6.1.jar
new file mode 100644
index 0000000..c8c4dbb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/dom4j-1.6.1.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/drools-api-5.0.1.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/drools-api-5.0.1.jar
new file mode 100644
index 0000000..d33d6c6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/drools-api-5.0.1.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/drools-core-5.0.1.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/drools-core-5.0.1.jar
new file mode 100644
index 0000000..7e8b791
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/drools-core-5.0.1.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/ejb3-persistence-1.0.2.GA.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/ejb3-persistence-1.0.2.GA.jar
new file mode 100644
index 0000000..32c2266
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/ejb3-persistence-1.0.2.GA.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/groovy-all-1.5.6.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/groovy-all-1.5.6.jar
new file mode 100644
index 0000000..022f09d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/groovy-all-1.5.6.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-annotations-3.4.0.GA.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-annotations-3.4.0.GA.jar
new file mode 100644
index 0000000..24b1583
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-annotations-3.4.0.GA.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-cglib-repack-2.1_3.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-cglib-repack-2.1_3.jar
new file mode 100644
index 0000000..1ba9b5b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-cglib-repack-2.1_3.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-commons-annotations-3.1.0.GA.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-commons-annotations-3.1.0.GA.jar
new file mode 100644
index 0000000..e0ca904
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-commons-annotations-3.1.0.GA.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-core-3.3.1.GA.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-core-3.3.1.GA.jar
new file mode 100644
index 0000000..764d270
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-core-3.3.1.GA.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-entitymanager-3.4.0.GA.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-entitymanager-3.4.0.GA.jar
new file mode 100644
index 0000000..662eab1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/hibernate-entitymanager-3.4.0.GA.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-api-1.0.0.Beta1.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-api-1.0.0.Beta1.jar
new file mode 100644
index 0000000..65cf3de
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-api-1.0.0.Beta1.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-common-1.0.0.Beta1.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-common-1.0.0.Beta1.jar
new file mode 100644
index 0000000..519f512
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-common-1.0.0.Beta1.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-core-1.0.0.Beta1.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-core-1.0.0.Beta1.jar
new file mode 100644
index 0000000..908278b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-core-1.0.0.Beta1.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-hibernate-1.0.0.Beta1.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-hibernate-1.0.0.Beta1.jar
new file mode 100644
index 0000000..c1a315b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-hibernate-1.0.0.Beta1.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-spi-1.0.0.Beta1.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-spi-1.0.0.Beta1.jar
new file mode 100644
index 0000000..94bed2e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/idm-spi-1.0.0.Beta1.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/javassist-3.4.GA.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/javassist-3.4.GA.jar
new file mode 100644
index 0000000..a6bde77
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/javassist-3.4.GA.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/jaxb-api-2.1.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jaxb-api-2.1.jar
new file mode 100644
index 0000000..2b5dc7e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jaxb-api-2.1.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/jaxb-impl-2.1.8.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jaxb-impl-2.1.8.jar
new file mode 100644
index 0000000..751426f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jaxb-impl-2.1.8.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/jboss-j2ee-4.2.2.GA.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jboss-j2ee-4.2.2.GA.jar
new file mode 100644
index 0000000..d2526d6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jboss-j2ee-4.2.2.GA.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-api-4.3.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-api-4.3.jar
new file mode 100644
index 0000000..08556dd
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-api-4.3.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-jpdl-4.3.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-jpdl-4.3.jar
new file mode 100644
index 0000000..79ce37e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-jpdl-4.3.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-log-4.3.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-log-4.3.jar
new file mode 100644
index 0000000..57013fd
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-log-4.3.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-pvm-4.3.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-pvm-4.3.jar
new file mode 100644
index 0000000..d5ac1e9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-pvm-4.3.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-test-base-4.3.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-test-base-4.3.jar
new file mode 100644
index 0000000..b520a90
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jbpm-test-base-4.3.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/jline-0.9.94.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jline-0.9.94.jar
new file mode 100644
index 0000000..dede372
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jline-0.9.94.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/joda-time-1.6.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/joda-time-1.6.jar
new file mode 100644
index 0000000..68068a4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/joda-time-1.6.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/jta-1.1.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jta-1.1.jar
new file mode 100644
index 0000000..7736ec9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/jta-1.1.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/juel-2.1.0.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/juel-2.1.0.jar
new file mode 100644
index 0000000..6fda56c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/juel-2.1.0.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/juel-engine-2.1.0.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/juel-engine-2.1.0.jar
new file mode 100644
index 0000000..d1de8a7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/juel-engine-2.1.0.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/juel-impl-2.1.0.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/juel-impl-2.1.0.jar
new file mode 100644
index 0000000..53c3522
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/juel-impl-2.1.0.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/junit-3.8.2.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/junit-3.8.2.jar
new file mode 100644
index 0000000..c8f711d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/junit-3.8.2.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/livetribe-jsr223-2.0.5.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/livetribe-jsr223-2.0.5.jar
new file mode 100644
index 0000000..8d38ba1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/livetribe-jsr223-2.0.5.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/log4j-1.2.14.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/log4j-1.2.14.jar
new file mode 100644
index 0000000..6251307
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/log4j-1.2.14.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/mail-1.4.1.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/mail-1.4.1.jar
new file mode 100644
index 0000000..1d15e79
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/mail-1.4.1.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/mockejb-0.6-beta2.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/mockejb-0.6-beta2.jar
new file mode 100644
index 0000000..e7bfb7a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/mockejb-0.6-beta2.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/mockrunner-0.4.1.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/mockrunner-0.4.1.jar
new file mode 100644
index 0000000..595230f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/mockrunner-0.4.1.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/mvel2-2.0.10.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/mvel2-2.0.10.jar
new file mode 100644
index 0000000..03b1463
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/mvel2-2.0.10.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/slf4j-api-1.5.2.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/slf4j-api-1.5.2.jar
new file mode 100644
index 0000000..4382866
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/slf4j-api-1.5.2.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/slf4j-jdk14-1.5.2.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/slf4j-jdk14-1.5.2.jar
new file mode 100644
index 0000000..86b1a29
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/slf4j-jdk14-1.5.2.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/lib/stax-api-1.0-2.jar b/Source/ThirdPart/jbpm.4.3.2/migration/lib/stax-api-1.0-2.jar
new file mode 100644
index 0000000..015169d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/lib/stax-api-1.0-2.jar
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/ConverterContext.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/ConverterContext.java
new file mode 100644
index 0000000..ceaf4e2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/ConverterContext.java
@@ -0,0 +1,59 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+/**
+ * Wraps the validated command line arguments
+ * and determines the context of the conversion.
+ *
+ * @author Jim Ma
+ */
+public class ConverterContext {
+
+ public static final String PROCESS_FILE = "processFile";
+ public static final String PROCESS_FILE_URL = "processFileURL";
+ public static final String VERBOSE = "verbose";
+ public static final String OUPUTFILE = "outputFile";
+ private Map<String, Object> paramMap = null;
+
+ public void put(String key, Object value) {
+ if (paramMap == null) {
+ paramMap = new ConcurrentHashMap<String, Object>();
+ }
+ paramMap.put(key, value);
+ }
+
+ public Object get(String key) {
+ if (paramMap == null) {
+ return null;
+ }
+ return paramMap.get(key);
+
+ }
+
+ public void refresh() {
+ paramMap = null;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/Jpdl3Converter.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/Jpdl3Converter.java
new file mode 100644
index 0000000..bc37d59
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/Jpdl3Converter.java
@@ -0,0 +1,882 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.dom4j.Document;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+import org.jbpm.jpdl.internal.convert.action.Action;
+import org.jbpm.jpdl.internal.convert.action.ActionConverterTypes;
+import org.jbpm.jpdl.internal.convert.action.CreateTimerAction;
+import org.jbpm.jpdl.internal.convert.exception.ConvertException;
+import org.jbpm.jpdl.internal.convert.node.Node;
+import org.jbpm.jpdl.internal.convert.node.NodeConverterTypes;
+import org.jbpm.jpdl.internal.convert.node.StartState;
+import org.jbpm.jpdl.internal.convert.node.TaskNode;
+import org.jbpm.jpdl.internal.convert.node.VariableAccess;
+import org.jbpm.jpdl.internal.convert.problem.Problem;
+import org.jbpm.jpdl.internal.convert.problem.ProblemListener;
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.xml.sax.InputSource;
+
+/**
+ * Trimmed down version JpdlXmlReader (jBPM3 code base),
+ * to have exactly the same parsing as in jBPM3.
+ *
+ * Note that the foremost requirement for this class is readability and
+ * extensibility. People who want to adapt the conversion logic
+ * for their own processes are advised to adapt this class.
+ *
+ * @author Jim Ma
+ * @author jbarrez
+ */
+public class Jpdl3Converter implements ProblemListener {
+
+ private static final long serialVersionUID = 1L;
+
+ protected InputSource inputSource;
+
+ protected Document jpdl3Document;
+
+ /* Contains any problems occurred after conversion of the jpdl3 process */
+ protected List<Problem> problems = new ArrayList<Problem>();
+
+ /*
+ * Use the constructor with a custom ProblemListener to have the conversion
+ * problems sent to another problem listener/
+ */
+ protected ProblemListener problemListener;
+
+ //the return converted jpdl4 dom model
+ protected Document jpdl4Document;
+
+ /* Contains the transition destinations which arent resolved yet */
+ protected Collection<Object[]> unresolvedTransitionDestinations;
+
+ /*
+ * Contains the actions which arent resolved yet
+ * (ie the converter hasnt encountered them yet)
+ */
+ protected Collection<Object[]> unresolvedActionReferences;
+
+ /* Contains the nodes of the process */
+ protected Map<String,Element> nodeCollection = new java.util.concurrent.ConcurrentHashMap<String, Element>();
+
+ /* Contains the encountered swimlanes */
+ protected Map<String,Element> swimlanesCollection = new java.util.concurrent.ConcurrentHashMap<String, Element>();
+
+ /* Used for autonumbering anonymous timers */
+ private int timerNumber;
+
+ /**
+ * Constructor using an URL pointing to a jpdl3 process file.
+ */
+ public Jpdl3Converter(URL url) {
+ try {
+ File file = new File(url.toURI());
+ FileReader reader = new FileReader(file);
+ this.inputSource = new InputSource(reader);
+ } catch (Exception e) {
+ //Do nothing , we validated it before
+ }
+ }
+
+ /**
+ * Constructor using an InputSource pointing to a jpdl3 process file.
+ */
+ public Jpdl3Converter(InputSource inputSource) {
+ this.inputSource = inputSource;
+ }
+
+ /**
+ * Constructor using a Reader pointing to a jpdl3 process file.
+ */
+ public Jpdl3Converter(Reader reader) {
+ this(new InputSource(reader));
+ }
+
+ public void close() throws IOException {
+ InputStream byteStream = inputSource.getByteStream();
+ if (byteStream != null) {
+ byteStream.close();
+ }
+ else {
+ Reader charStream = inputSource.getCharacterStream();
+ if (charStream != null) {
+ charStream.close();
+ }
+ }
+ jpdl3Document = null;
+ }
+
+
+
+ public void addProblem(Problem problem) {
+ problems.add(problem);
+ if (problemListener != null) {
+ problemListener.addProblem(problem);
+ }
+ }
+
+ public void addError(String description) {
+ log.error("invalid process xml: " + description);
+ addProblem(new Problem(Problem.LEVEL_ERROR, description));
+ }
+
+ public void addError(String description, Throwable exception) {
+ log.error("invalid process xml: " + description, exception);
+ addProblem(new Problem(Problem.LEVEL_ERROR, description, exception));
+ }
+
+ public void addWarning(String description) {
+ log.warn("process xml warning: " + description);
+ addProblem(new Problem(Problem.LEVEL_WARNING, description));
+ }
+
+ /**
+ * Call this method to convert the jpdl3 process.
+ * The return value will be a converted jpdl4 XML model.
+ */
+ public Document readAndConvert() {
+
+ // create a new definition
+ jpdl4Document = DocumentHelper.createDocument();
+
+ // initialize lists
+ problems = new ArrayList<Problem>();
+ unresolvedTransitionDestinations = new ArrayList<Object[]>();
+ unresolvedActionReferences = new ArrayList<Object[]>();
+
+ try {
+
+ // parse the document into a XML dom tree
+ jpdl3Document = Jpdl3ConverterParser.parse(inputSource, this);
+ jpdl4Document.setXMLEncoding(jpdl3Document.getXMLEncoding());
+
+ // Convert the root element
+ Element jpdl3Root = jpdl3Document.getRootElement();
+ Element jpdl4Root = parseProcessDefinitionAttributes(jpdl3Root);
+
+ // convert process description as comment
+ String description = jpdl3Root.elementTextTrim("description");
+ if (description != null) {
+ jpdl4Root.addComment(description);
+ }
+
+ // first pass
+ convertSwimlanes(jpdl3Root, jpdl4Root);
+ convertActions(jpdl3Root, null, null); // Todo: refactor
+ convertNodes(jpdl3Root, jpdl4Root);
+ convertEvents(jpdl3Root, jpdl4Root);
+ convertExceptionHandlers(jpdl3Root, jpdl4Root);
+ convertTasks(jpdl3Root, jpdl4Root);
+
+ // second pass processing: process any unresolved elements
+ resolveTransitionDestinations();
+ //resolveActionReferences(); // not yet implemented
+ verifySwimlaneAssignments();
+
+ }
+ catch (Exception e) {
+ log.error("couldn't parse process definition", e);
+ addProblem(new Problem(Problem.LEVEL_ERROR, "couldn't parse process definition", e));
+ }
+
+ // After conversion: check if there were any conversion problems
+
+ if (Problem.containsProblemsOfLevel(problems, Problem.LEVEL_ERROR)) {
+ throw new ConvertException(problems);
+ }
+
+ if (problems != null) {
+ for (Problem problem : problems) {
+ log.warn("process parse warning: " + problem.getDescription());
+ }
+ }
+
+ return jpdl4Document;
+ }
+
+ protected Element parseProcessDefinitionAttributes(Element root)
+ {
+ Element element = jpdl4Document.addElement("process", JpdlParser.CURRENT_VERSION_NAMESPACE);
+ element.addAttribute("name", root.attributeValue("name"));
+ return element;
+ }
+
+ protected void convertSwimlanes(Element jpdl3Element, Element jpdl4Element) {
+
+ Iterator<?> iter = jpdl3Element.elementIterator("swimlane");
+
+ while (iter.hasNext()) {
+
+ Element swimlaneElement = (Element)iter.next();
+ String swimlaneName = swimlaneElement.attributeValue("name");
+
+ if (swimlaneName == null) {
+ addWarning("there's a swimlane without a name");
+ }
+ else {
+
+ Element swimlane4 = jpdl4Element.addElement("swimlane");
+ swimlane4.addAttribute("name", swimlaneName);
+ Element assignmentElement = swimlaneElement.element("assignment");
+ swimlanesCollection.put(swimlaneName, swimlane4);
+ if (assignmentElement != null) {
+
+ if ((assignmentElement.attribute("actor-id") != null)) {
+ swimlane4.addAttribute("assignee", assignmentElement.attributeValue("actor-id"));
+ }
+ if (assignmentElement.attribute("pooled-actors") != null) {
+ swimlane4.addAttribute("candidate-users" ,assignmentElement.attributeValue("pooled-actors"));
+ }
+ else {
+ //readAssignmentDelegation(assignmentElement, swimlane4);
+ //swimlane.setAssignmentDelegation(assignmentDelegation);
+ }
+ }
+ }
+ }
+ }
+
+ public void convertActions(Element jpdl3Element, Element jpdl4Element, String eventType) {
+
+ Iterator< ? > nodeElementIter = jpdl3Element.elementIterator();
+
+ while (nodeElementIter.hasNext()) {
+ Element actionElement = (Element) nodeElementIter.next();
+ String actionName = actionElement.getName();
+
+ if ("cancel-timer".equalsIgnoreCase(actionName) || "mail".equalsIgnoreCase(actionName)) {
+ this.addWarning("Unsupported " + actionName + " conversion on Element : " + actionElement.asXML());
+ }
+
+ if (ActionConverterTypes.hasActionName(actionName)) {
+ createAction(actionElement, jpdl4Element);
+ }
+ }
+ }
+
+ public void convertNodes(Element jpdl3Element, Element jpdl4Element) {
+
+ Iterator<?> nodeElementIter = jpdl3Element.elementIterator();
+
+ while (nodeElementIter.hasNext()) {
+
+ Element nodeElement = (Element)nodeElementIter.next();
+ String nodeName = nodeElement.getName();
+
+ Class<?> nodeType = NodeConverterTypes.getNodeType(nodeName);
+ if (nodeType != null) {
+
+ Node node = null;
+ try {
+ node = (Node)nodeType.newInstance();
+ }
+ catch (Exception e)
+ {
+ log.error("couldn't instantiate node '" + nodeName + "', of type '" + nodeType.getName() + "'", e);
+ continue;
+ }
+
+ //Implement it
+ List starts = jpdl4Element.elements("start-state");
+
+ // check for duplicate start-states
+ if ((node instanceof StartState) && !starts.isEmpty()) {
+ addError("max one start-state allowed in a process");
+ } else if (node instanceof TaskNode) {
+ convertTasks(nodeElement, jpdl4Element);
+ } else {
+
+ // read the common node parts of the element
+ node.setNodeElement(nodeElement);
+ Element actionElement = nodeElement.element("action");
+ //The node without action element can not be converted, report error
+ if (nodeName.equals("node") && actionElement == null) {
+ addError("Could not convert a node without action element:" + nodeElement.asXML());
+ return;
+ }
+
+ node.createConvertedElement(jpdl4Element);
+ convertNode(nodeElement,node.getConvertedElement());
+
+ // if the has special configuration to parse, delegate to the specific node
+ node.read(this);
+
+ }
+ }
+ }
+ }
+
+ public void convertEvents(Element jpdl3Element, Element jpdl4Element) {
+
+ Iterator<?> iter = jpdl3Element.elementIterator("event");
+
+ while (iter.hasNext()) {
+
+ Element eventElement = (Element)iter.next();
+ //String eventType = eventElement.attributeValue("type");
+ //TODO:how to handle the event type
+ Element onElement = jpdl4Element.addElement("on");
+ String type = eventElement.attributeValue("type");
+ onElement.addAttribute("event", type);
+ convertActions(eventElement, onElement, type);
+ }
+ }
+
+ public void convertTasks(Element jpdl3Element, Element jpdl4Element) {
+
+ List<?> elements = jpdl3Element.elements("task");
+ Element[] tasks = elements.toArray(new Element[0]);
+
+ if (tasks != null && tasks.length > 0) {
+
+ for (int i = 0 ; i < tasks.length; i++) {
+
+ Element tmpTask = tasks[i];
+ Element task4 = convertTask(tmpTask, jpdl4Element);
+
+ if (i ==0 ) {
+ task4.addAttribute("name", jpdl3Element.attributeValue("name"));
+ } else{
+ task4.addAttribute("name", tmpTask.attributeValue("name"));
+ }
+
+ // In jBPM4, tasks are not nested in a task node
+ // this is solved by adding seperate task to the jpdl4 model
+ // each containing a transition to the next one
+ if (i+1 < tasks.length) {
+ Element newTransistion = task4.addElement("transition");
+ String to = tasks[i+1].attributeValue("name");
+ newTransistion.addAttribute("name", to);
+ newTransistion.addAttribute("to", to);
+ } else {
+ //The last task node has a transition to the node after the original TaskNode
+ List<Element> transitions = jpdl3Element.elements("transition");
+ for (Element trans : transitions) {
+ Element transElement = task4.addElement("transition");
+ String transName = trans.attributeValue("name") == null ? trans.attributeValue("to") :trans.attributeValue("name");
+ transElement.addAttribute("name", transName);
+ transElement.addAttribute("to", trans.attributeValue("to"));
+ }
+ }
+ }
+ }
+ }
+
+ public Element convertTask(Element taskElement, Element jpdlElement) {
+
+ Element task4 = jpdlElement.addElement("task");
+ String name = taskElement.attributeValue("name");
+ if (name != null) {
+ task4.attributeValue("name", name);
+ }
+
+ String description = taskElement.elementTextTrim("description");
+ if (description != null) {
+ task4.addComment(description);
+ }
+
+ String condition = taskElement.elementTextTrim("condition");
+ if (condition == null) {
+ condition = taskElement.attributeValue("condition");
+ }
+ if (condition == null) {
+ addWarning("Unsupported condition attribute converstion for task : " + taskElement.asXML());
+ }
+
+
+ //The converted the elements in task should be in this sequence
+ //assignment-handler, on, notification, reminder, timer
+
+ // assignment
+ String swimlaneName = taskElement.attributeValue("swimlane");
+ Element assignmentElement = taskElement.element("assignment");
+
+ // if there is a swimlane attribute specified
+ if (swimlaneName != null) {
+
+ Element swimLane = swimlanesCollection.get(swimlaneName);
+ if (swimLane == null) {
+ addWarning("task references unknown swimlane '" + swimlaneName + "':" + taskElement.asXML());
+ }
+ else {
+ task4.addAttribute("swimlane", swimlaneName);
+ }
+ }
+ else if (assignmentElement != null) {
+ if ((assignmentElement.attribute("actor-id") != null) || (assignmentElement.attribute("pooled-actors") != null)) {
+
+ String actorid = assignmentElement.attributeValue("actor-id");
+ String pooledactors = assignmentElement.attributeValue("pooled-actors");
+
+ if (actorid != null) {
+ task4.addAttribute("assignee", actorid);
+ }
+ if (pooledactors != null) {
+ task4.addAttribute("candidate-groups", pooledactors);
+ }
+
+ }
+ else
+ {
+ convertAssignmentDelegation(assignmentElement, task4);
+ }
+ }
+ else
+ {
+ // the user has to manage assignment manually, so we better inform him/her.
+ log.info("process xml information: no swimlane or assignment specified for task '" + taskElement.asXML() + "'");
+ }
+
+ //event elements
+ convertEvents(taskElement, task4);
+
+ String notificationsText = taskElement.attributeValue("notify");
+ if (notificationsText != null && ("true".equalsIgnoreCase(notificationsText)
+ || "on".equalsIgnoreCase(notificationsText) || "yes".equalsIgnoreCase(notificationsText))) {
+ //TODO:Review if there is "continue" attribute to converted
+ Element notify = task4.addElement("notification");
+ notify.addAttribute("continue", "sync");
+ }
+ //Reminder elements
+ convertTaskReminders(taskElement, task4);
+ //timer elements
+ convertTaskTimers(taskElement, task4);
+
+ convertExceptionHandlers(taskElement, task4);
+
+ String duedateText = taskElement.attributeValue("duedate");
+
+ if (duedateText != null) {
+ addWarning("Unsupported duedateDate attribute converstion for task : " + taskElement.asXML());
+ }
+
+ String priorityText = taskElement.attributeValue("priority");
+ if (priorityText != null) {
+ addWarning("Unsupported priorityText attribute converstion for task : " + taskElement.asXML());
+ }
+
+ String blockingText = taskElement.attributeValue("blocking");
+ if (blockingText != null) {
+ addWarning("Unsupported blocking attribute converstion for task : " + taskElement.asXML());
+ }
+
+ String signallingText = taskElement.attributeValue("signalling");
+ if (signallingText != null) {
+ addWarning("Unsupported signallingText attribute converstion for task : " + taskElement.asXML());
+ }
+
+ Element taskControllerElement = taskElement.element("controller");
+ if (taskControllerElement != null) {
+ addWarning("Unsupported controller converstion for task : " + taskElement.asXML());
+ }
+
+ return task4;
+ }
+
+ protected void convertAssignmentDelegation(Element jpdl3AssignmentElement, Element jpdl4Task) {
+
+ String expression = jpdl3AssignmentElement.attributeValue("expression");
+ String actorId = jpdl3AssignmentElement.attributeValue("actor-id");
+ String pooledActors = jpdl3AssignmentElement.attributeValue("pooled-actors");
+
+ if (expression != null) {
+
+ // TODO:How to convert default assignmenthandler?
+ // assignmentDelegation.setClassName("org.jbpm.identity.assignment.ExpressionAssignmentHandler");
+ // assignmentDelegation.setConfiguration("<expression>" + expression +
+ // "</expression>");
+
+ } else if ((actorId != null) || (pooledActors != null)) {
+
+ jpdl4Task.addComment("Please Update the AssignmentHandler and implement org.jbpm.api.task.AssignmentHandler to create your own AssignmentHandler.");
+ Element assignmentHandler = jpdl4Task.addElement("assignment-handler");
+ assignmentHandler.addAttribute("class", "org.jbpm.taskmgmt.assignment.ActorAssignmentHandler");
+
+ String configuration = "";
+ if (actorId != null) {
+ configuration += "<actorId>" + actorId + "</actorId>";
+ }
+ if (pooledActors != null) {
+ configuration += "<pooledActors>" + pooledActors + "</pooledActors>";
+ }
+
+ } else {
+ String claz = jpdl3AssignmentElement.attributeValue("class");
+ Element assignmentHandler = jpdl4Task.addElement("assignment-handler");
+ assignmentHandler.addAttribute("class", claz);
+ }
+ }
+
+ public List<VariableAccess> convertVariableAccesses(Element element) {
+
+ List<VariableAccess> variableAccesses = new ArrayList<VariableAccess>();
+ Iterator<?> iter = element.elementIterator("variable");
+ while (iter.hasNext()) {
+ Element variableElement = (Element)iter.next();
+
+ String variableName = variableElement.attributeValue("name");
+ if (variableName == null)
+ {
+ addProblem(new Problem(Problem.LEVEL_WARNING, "the name attribute of a variable element is required: " + variableElement.asXML()));
+ }
+ String access = variableElement.attributeValue("access", "read,write");
+ String mappedName = variableElement.attributeValue("mapped-name");
+
+ variableAccesses.add(new VariableAccess(variableName, access, mappedName));
+ }
+ return variableAccesses;
+ }
+
+ public void convertNode(Element jpdl3Element, Element jpdl4Element) {
+
+ String name = jpdl3Element.attributeValue("name");
+ if (name != null) {
+ jpdl4Element.addAttribute("name", name);
+ nodeCollection.put(name, jpdl4Element);
+ }
+
+ // get the node description
+ String description = jpdl3Element.elementTextTrim("description");
+ if (description != null) {
+ jpdl4Element.addComment(description);
+ }
+
+ String asyncText = jpdl3Element.attributeValue("async");
+ if ("true".equalsIgnoreCase(asyncText)) {
+ jpdl4Element.addAttribute("continue", "async");
+ }
+ else if ("exclusive".equalsIgnoreCase(asyncText)) {
+ jpdl4Element.addAttribute("continue", "exclusive");
+ }//else if -> uses the default continue="sync"
+
+ // parse common subelements
+
+ convertNodeTimers(jpdl3Element, jpdl4Element);
+ convertEvents(jpdl3Element, jpdl4Element);
+ convertExceptionHandlers(jpdl3Element, jpdl4Element);
+
+ // save the transitions and parse them at the end
+ addUnresolvedTransitionDestination(jpdl3Element, jpdl4Element);
+ }
+
+ protected void convertNodeTimers(Element nodeElement, Element jpdl4Element) {
+ Iterator<?> iter = nodeElement.elementIterator("timer");
+ while (iter.hasNext()) {
+ Element timerElement = (Element)iter.next();
+ convertNodeTimer(timerElement, jpdl4Element);
+ }
+ }
+
+ protected void convertNodeTimer(Element timerElement, Element jpdl4Element) {
+ String name = timerElement.attributeValue("name", timerElement.getName());
+ if (name == null)
+ name = generateTimerName();
+
+ CreateTimerAction createTimerAction = new CreateTimerAction();
+ Element onElement = jpdl4Element.addElement("on");
+ //TODO: Look at how to map the event type : start , end and take
+ onElement.addAttribute("event", "timeout");
+ createTimerAction.createConvertedElement(timerElement, onElement);
+ createTimerAction.read(timerElement, this);
+ }
+
+ private String generateTimerName() {
+ return "timer-" + (timerNumber++);
+ }
+
+ protected void convertTaskTimers(Element taskElement, Element jdpl4Element) {
+ Iterator<?> iter = taskElement.elementIterator();
+ while (iter.hasNext()) {
+ Element element = (Element)iter.next();
+ if (("timer".equals(element.getName())))
+ {
+ convertTaskTimer(element, jdpl4Element);
+ }
+ }
+ }
+
+
+ protected void convertTaskReminders(Element taskElement, Element jdpl4Element) {
+ Iterator<?> iter = taskElement.elementIterator();
+ while (iter.hasNext()) {
+ Element element = (Element)iter.next();
+ if ("reminder".equals(element.getName()))
+ {
+ convertTaskTimer(element, jdpl4Element);
+ }
+ }
+ }
+
+
+
+
+
+ protected void convertTaskTimer(Element timerElement, Element jpdl4Element) {
+ if ("timer".equals(timerElement.getName())) {
+
+ String name = timerElement.attributeValue("name", timerElement.getName());
+ if (name == null)
+ name = generateTimerName();
+;
+ Element timer = jpdl4Element.addElement("timer");
+
+ String dueDate = timerElement.attributeValue("duedate");
+ if (dueDate==null) {
+ addWarning("no duedate specified in create timer action '"+ timerElement.asXML()+"'");
+ } else {
+ timer.addAttribute("duedate", dueDate);
+ }
+ String repeat = timerElement.attributeValue("repeat");
+ if ( "true".equalsIgnoreCase(repeat)
+ || "yes".equalsIgnoreCase(repeat) ) {
+ repeat = dueDate;
+ }
+
+ timer.addAttribute("repeat", repeat);
+
+ String transitionName = timerElement.attributeValue("transition");
+
+ if ( (transitionName!=null)
+ && (repeat!=null)
+ ) {
+ repeat = null;
+ addProblem(new Problem(Problem.LEVEL_WARNING, "ignoring repeat on timer with transition "+ timerElement.asXML()));
+ }
+ this.convertSingleAction(timerElement, timer);
+ }
+ else
+ {
+ Element reminder = jpdl4Element.addElement("reminder");
+ String dueDate = timerElement.attributeValue("duedate");
+ if (dueDate==null) {
+ addWarning("no duedate specified in reminder element '"+ timerElement.asXML()+"'");
+ } else {
+ reminder.addAttribute("duedate", dueDate);
+ }
+ String repeat = timerElement.attributeValue("repeat");
+ if ( "true".equalsIgnoreCase(repeat)
+ || "yes".equalsIgnoreCase(repeat) ) {
+ repeat = dueDate;
+ }
+
+ reminder.addAttribute("repeat", repeat);
+ //TODO: review it if there is no "continue" attribute to converted
+
+ }
+ }
+
+ public Element convertSingleAction(Element jpdl3NodeElement, Element jpdl4Element) {
+
+ Element jpdl4Action = null;
+ Iterator<?> iter = jpdl3NodeElement.elementIterator();
+ while (iter.hasNext()) {
+
+ Element candidate = (Element)iter.next();
+ if (ActionConverterTypes.hasActionName(candidate.getName())) {
+ // parse the action and assign it to this node
+ jpdl4Action = createAction(candidate, jpdl4Element);
+ }
+ }
+ return jpdl4Action;
+
+ }
+
+ public Element createAction(Element actionElement, Element jpdl4Element) {
+
+ // create a new instance of the action
+ Action action = null;
+ String actionName = actionElement.getName();
+ Class<? extends Action> actionType = ActionConverterTypes.getActionType(actionName);
+ try
+ {
+ action = actionType.newInstance();
+ }
+ catch (Exception e)
+ {
+ log.error("couldn't instantiate action '" + actionName + "', of type '" + actionType.getName() + "'", e);
+ }
+
+ Element action4 = action.createConvertedElement(actionElement, jpdl4Element);
+ action.read(actionElement, this);
+ return action4;
+ }
+
+
+ protected void convertExceptionHandlers(Element jpdl3Element, Element jpdl4Element) {
+ Iterator<?> iter = jpdl3Element.elementIterator("exception-handler");
+ if (iter.hasNext()) {
+ addWarning("Unsupported exception handler conversion for element : <"
+ + jpdl3Element.getName()
+ + " name=\""
+ + jpdl3Element.attributeValue("name") + "\"/>");
+ }
+ }
+
+ // transition destinations are parsed in a second pass //////////////////////
+
+ public void addUnresolvedTransitionDestination(Element nodeElement, Element jpdl4Element)
+ {
+ unresolvedTransitionDestinations.add(new Object[]{nodeElement, jpdl4Element});
+ }
+
+ public void resolveTransitionDestinations()
+ {
+ for (Object[] unresolvedTransition : unresolvedTransitionDestinations)
+ {
+ Element nodeElement = (Element)unresolvedTransition[0];
+ Element jpdl4Element = (Element)unresolvedTransition[1];
+ resolveTransitionDestinations(nodeElement.elements("transition"), jpdl4Element);
+ }
+ }
+
+ public void resolveTransitionDestinations(List<?> transitionElements, Element jpdl4Element)
+ {
+ for (Object transitionElement : transitionElements)
+ {
+ resolveTransitionDestination((Element)transitionElement, jpdl4Element);
+ }
+ }
+
+ /*
+ * creates the transition object and configures it by the read attributes
+ * @return the created <code>org.jbpm.graph.def.Transition</code> object (useful, if you want to override this method to read additional configuration properties)
+ */
+ public void resolveTransitionDestination(Element transitionElement, Element jpdl4Element) {
+
+ Element transition4 = jpdl4Element.addElement("transition");
+ transition4.addAttribute("name", transitionElement.attributeValue("name"));
+ if (transitionElement.elementTextTrim("description") != null) {
+ transition4.addComment(transitionElement.elementTextTrim("description"));
+ }
+ //Get condition from jpdl3 element
+ String condition = transitionElement.attributeValue("condition");
+ if (condition == null)
+ {
+ Element conditionElement = transitionElement.element("condition");
+ if (conditionElement != null)
+ {
+ condition = conditionElement.getTextTrim();
+ // for backwards compatibility
+ if ((condition == null) || (condition.length() == 0))
+ {
+ condition = conditionElement.attributeValue("expression");
+ }
+ }
+ }
+
+
+ if (condition != null && condition.length() > 0) {
+ Element condition4 = transition4.addElement("condition");
+ condition4.addAttribute("expr", condition);
+ }
+
+
+ // set destinationNode of the transition
+ String toName = transitionElement.attributeValue("to");
+ if (toName == null)
+ {
+ addWarning("node '" + transitionElement.getPath() + "' has a transition without a 'to'-attribute to specify its destinationNode");
+ }
+ else
+ {
+ Element to = this.findNode(toName);
+ if (to == null)
+ {
+ addWarning("transition to='" + toName + "' on node '" + transitionElement.getName() + "' cannot be resolved");
+ }
+
+ transition4.addAttribute("to", toName);
+ }
+
+ // read the actions
+ convertActions(transitionElement, transition4, "");
+
+ convertExceptionHandlers(transitionElement, transition4);
+ }
+
+ // action references are parsed in a second pass ////////////////////////////
+
+ public void addUnresolvedActionReference(Element actionElemen)
+ {
+ //unresolvedActionReferences.add(new Object[] { actionElemen});
+ }
+
+ public void resolveActionReferences()
+ {
+
+ }
+
+ // verify swimlane assignments in second pass ///////////////////////////////
+ public void verifySwimlaneAssignments()
+ {
+ //
+ }
+
+ // mail delegations /////////////////////////////////////////////////////////
+
+ public void createMailDelegation(String template, String actors, String to, String subject, String text)
+ {
+ //
+ }
+
+ public String getProperty(String property, Element element)
+ {
+ String value = element.attributeValue(property);
+ if (value == null)
+ {
+ Element propertyElement = element.element(property);
+ if (propertyElement != null)
+ {
+ value = propertyElement.getText();
+ }
+ }
+ return value;
+ }
+ //New added method
+ private Element findNode(String name) {
+ return nodeCollection.get(name);
+ }
+
+ public Document getJpdl4Document()
+ {
+ return jpdl4Document;
+ }
+
+ private static final Log log = LogFactory.getLog(Jpdl3Converter.class);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/Jpdl3ConverterParser.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/Jpdl3ConverterParser.java
new file mode 100644
index 0000000..b3a087d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/Jpdl3ConverterParser.java
@@ -0,0 +1,176 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert;
+
+import java.io.Serializable;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.dom4j.Document;
+import org.dom4j.io.SAXReader;
+import org.jbpm.jpdl.internal.convert.problem.Problem;
+import org.jbpm.jpdl.internal.convert.problem.ProblemListener;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+
+
+/**
+ * Validate an XML document using JAXP techniques and an XML Schema. This helper
+ * class wraps the processing of a schema to aid in schema validation throughout
+ * the product.
+ *
+ * orginal authors:
+ * @author Tom Baeyens
+ * @author Jim Rigsbee
+ */
+public class Jpdl3ConverterParser implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ static SAXParserFactory saxParserFactory = createSaxParserFactory();
+ private static Set schemaResources = getDefaultSchemaResources();
+ private static Object schemaSource;
+
+ public static Document parse(InputSource inputSource, ProblemListener problemListener) throws Exception {
+ Document document = null;
+ SAXReader saxReader = createSaxReader(problemListener);
+ document = saxReader.read(inputSource);
+ return document;
+ }
+
+ public static SAXReader createSaxReader(ProblemListener problemListener) throws Exception {
+ XMLReader xmlReader = createXmlReader();
+ SAXReader saxReader = new SAXReader(xmlReader);
+ saxReader.setErrorHandler(new JpdlErrorHandler(problemListener));
+ return saxReader;
+ }
+
+ public static XMLReader createXmlReader() throws Exception {
+ SAXParser saxParser = saxParserFactory.newSAXParser();
+ XMLReader xmlReader = saxParser.getXMLReader();
+
+ try {
+ saxParser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
+ } catch (SAXException e){
+ log.warn("couldn't set schema language property", e);
+ }
+
+ try {
+ saxParser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", getSchemaSource());
+ } catch (SAXException e){
+ log.warn("couldn't set schema source property", e);
+ }
+
+ try {
+ xmlReader.setFeature("http://apache.org/xml/features/validation/dynamic", true);
+ } catch (SAXException e){
+ log.warn("couldn't set dynamic validation feature", e);
+ }
+ return xmlReader;
+ }
+
+ private static Object getSchemaSource() {
+ if (schemaSource == null) {
+ List schemaLocations = new ArrayList(schemaResources.size());
+ for (Iterator i = schemaResources.iterator(); i.hasNext();) {
+ String schemaResource = (String) i.next();
+ URL schemaURL = Jpdl3ConverterParser.class.getClassLoader().getResource(schemaResource);
+ if (schemaURL != null) {
+ String schemaLocation = schemaURL.toString();
+ if(log.isDebugEnabled()){
+ log.debug("schema resource found: " + schemaResource);
+ }
+ schemaLocations.add(schemaLocation);
+ }
+ }
+ schemaSource = schemaLocations.toArray(new String[schemaLocations.size()]);
+ }
+ return schemaSource;
+ }
+
+ static class JpdlErrorHandler implements ErrorHandler, Serializable {
+
+ private ProblemListener problemListener = null;
+
+ private static final long serialVersionUID = 1L;
+
+ JpdlErrorHandler(ProblemListener problemListener) {
+ this.problemListener = problemListener;
+ }
+
+ public void warning(SAXParseException pe) {
+ addProblem(Problem.LEVEL_WARNING, pe);
+ }
+
+ public void error(SAXParseException pe) {
+ addProblem(Problem.LEVEL_ERROR, pe);
+ }
+
+ public void fatalError(SAXParseException pe) {
+ addProblem(Problem.LEVEL_FATAL, pe);
+ }
+
+ private void addProblem(int level, SAXParseException pe) {
+ Problem problem = new Problem(level, pe.getMessage(), pe);
+ problem.setResource(pe.getSystemId());
+ int line = pe.getLineNumber();
+ if (line != -1) problem.setLine(new Integer(line));
+ problemListener.addProblem(problem);
+ }
+ }
+
+ public static void addSchemaResource(String resource) {
+ schemaResources.add(resource);
+ schemaSource = null;
+ }
+
+ private static Set getDefaultSchemaResources() {
+ Set schemaResources = new HashSet();
+ schemaResources.add("org/jbpm/jpdl/xml/jpdl-3.0.xsd");
+ schemaResources.add("org/jbpm/jpdl/xml/jpdl-3.1.xsd");
+ schemaResources.add("org/jbpm/jpdl/xml/jpdl-3.2.xsd");
+ schemaResources.add("org/jbpm/jpdl/xml/jpdl-3.3.xsd");
+ schemaResources.add("org/jboss/seam/pageflow-2.0.xsd");
+ return schemaResources;
+ }
+
+ private static SAXParserFactory createSaxParserFactory() {
+ SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
+ saxParserFactory.setValidating(true);
+ saxParserFactory.setNamespaceAware(true);
+ return saxParserFactory;
+ }
+
+ private static final Log log = LogFactory.getLog(Jpdl3ConverterParser.class);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/JpdlConverterTool.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/JpdlConverterTool.java
new file mode 100644
index 0000000..bec307e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/JpdlConverterTool.java
@@ -0,0 +1,229 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.Writer;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.dom4j.Document;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.XMLWriter;
+import org.jbpm.jpdl.internal.convert.exception.IllegalCommandException;
+import org.jbpm.jpdl.internal.convert.problem.Problem;
+
+/**
+ * Conversion command line tool main class.
+ *
+ * @author Jim Ma
+ */
+public class JpdlConverterTool {
+
+ public static void main(String[] args) {
+ JpdlConverterTool jpdlConverterTool = new JpdlConverterTool();
+
+ // Parse and validate the command line arguments
+ ConverterContext context = null;
+ try {
+ context = jpdlConverterTool.parseParam(args);
+ jpdlConverterTool.validate(context);
+ } catch (IllegalCommandException e) {
+ System.err.println(e.getMessage());
+ System.err.println(jpdlConverterTool.getUsage());
+ return;
+ } catch (Exception e) {
+ System.err.println(e.getMessage());
+ return;
+ }
+
+
+ boolean verbose = false;
+ if (context.get(ConverterContext.VERBOSE) != null) {
+ verbose = true;
+ }
+ Jpdl3Converter jpdlConverter = new Jpdl3Converter((URL)context.get(context.PROCESS_FILE_URL));
+
+ try {
+ if (verbose) {
+ System.out.println("Loading process file from URL [" + context.get(context.PROCESS_FILE_URL) + "]...");
+ }
+ Document jpdl4Doc = jpdlConverter.readAndConvert();
+
+ if (verbose) {
+ System.out.println("Converting the process file to jPDL4 version....");
+ }
+
+ String outputFilePath = (String)context.get(context.OUPUTFILE);
+ File outputFile = new File(outputFilePath);
+
+ //well print xml to file
+ Writer fileWriter = new FileWriter(outputFile);
+ OutputFormat format = OutputFormat.createPrettyPrint();
+ XMLWriter writer = new XMLWriter( fileWriter, format );
+ writer.write(jpdl4Doc);
+ writer.close();
+
+
+ if (verbose) {
+ System.out.println("Generating converted file to:" + (outputFile.isAbsolute() ? outputFile.getAbsolutePath() : outputFile.getName()));
+ }
+
+ } catch (Exception e) {
+
+ for (Problem problem : jpdlConverter.problems) {
+ if (problem.getLevel() == problem.LEVEL_WARNING) {
+ System.err.println(problem);
+ }
+ if (problem.getLevel() < problem.LEVEL_WARNING) {
+ System.err.println(problem);
+ if (problem.getException() != null
+ && context.get(ConverterContext.VERBOSE) != null) {
+ problem.getException().printStackTrace(System.err);
+ System.err.println();
+ }
+ }
+ }
+
+
+ }
+ }
+
+ /**
+ * Parses the command line arguments and returns a context
+ * in which the conversion will happen.
+ */
+ public ConverterContext parseParam(String[] args) throws IllegalCommandException {
+ ConverterContext context = new ConverterContext();
+
+ if (args.length == 0) {
+ throw new IllegalCommandException("No file for conversion is supplied");
+ }
+
+ for (int i = 0; i < args.length; i++) {
+ String token = args[i];
+ if ("-v".equalsIgnoreCase(token) || "-verbose".equalsIgnoreCase(token)) {
+ context.put(ConverterContext.VERBOSE, ConverterContext.VERBOSE);
+ } else if ("-o".equalsIgnoreCase(token)
+ || "-output".equalsIgnoreCase(token)) {
+ int j = ++i;
+ if (j < args.length) {
+ String outputFile = args[j];
+ context.put(ConverterContext.OUPUTFILE, args[j]);
+ } else {
+ throw new IllegalCommandException("Missing output file name");
+ }
+ } else if (token.startsWith("-")) {
+ throw new IllegalCommandException("Unknow flag [" + token +"]");
+ } else if(context.get(ConverterContext.PROCESS_FILE) == null) {
+ context.put(ConverterContext.PROCESS_FILE, token);
+ } else {
+ throw new IllegalCommandException("Duplicate input process file");
+ }
+
+ }
+ if (context.get(ConverterContext.PROCESS_FILE) == null) {
+ throw new IllegalCommandException("No input process file defined");
+ }
+
+ return context;
+ }
+
+ public void validate(ConverterContext context) throws Exception {
+ String processFile = (String) context.get(ConverterContext.PROCESS_FILE);
+ URL processURL = getFileURL(processFile);
+ if (processURL == null) {
+ throw new IllegalCommandException("Failed to load the process file [" + processFile + "]");
+ }
+ context.put(context.PROCESS_FILE_URL, processURL);
+ //handle the output filename
+ if (context.get(ConverterContext.OUPUTFILE) == null) {
+ File tmpFile = new File(processURL.getFile());
+ String fileName = tmpFile.getName();
+ String baseName = fileName;
+
+ int index = fileName.lastIndexOf(".");
+
+ if (index > -1) {
+ baseName = fileName.substring(0, index);
+ } else {
+ baseName = fileName;
+ }
+
+ String outputFileName = baseName + ".converted.jpdl.xml";
+ File outFile = new File(".", outputFileName);
+ context.put(ConverterContext.OUPUTFILE, outFile.getAbsolutePath());
+ } else {
+ String outputFile = (String)context.get(ConverterContext.OUPUTFILE);
+ File file = new File(outputFile);
+ if (file.isAbsolute()) {
+ if (!file.getParentFile().exists()) {
+ throw new IllegalCommandException("Output directory [" + file.getParent() + "] does not exist");
+ }
+ } else {
+ file = new File(".", outputFile);
+ }
+ if (!file.exists()) {
+ file.createNewFile();
+ }
+ context.put(ConverterContext.OUPUTFILE, file.getAbsolutePath());
+ }
+
+ }
+
+ public URL getFileURL(String fileName) {
+ try {
+ URL url = new URL(fileName);
+ return url;
+ } catch (MalformedURLException e1) {
+ //Do nothing
+ }
+ File file = new File(fileName);
+ if (file.exists()) {
+ try {
+ return file.toURL();
+ } catch (MalformedURLException e) {
+ // Do nothing.
+ }
+
+ }
+ // load in current directory
+ File tmpFile = new File(".", fileName);
+ if (file.exists()) {
+ try {
+ return tmpFile.toURL();
+ } catch (MalformedURLException e) {
+ // Do nothing
+ }
+ }
+
+ return null;
+ }
+
+ public String getUsage() {
+ return "Usage : java org.jbpm.jpdl.internal.convert.JpdlConverterTool <file>\r\n"
+ + " java org.jbpm.jpdl.internal.convert.JpdlConverterTool -v -o <outputfile> <file>";
+
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/action/Action.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/action/Action.java
new file mode 100644
index 0000000..9575e82
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/action/Action.java
@@ -0,0 +1,92 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.action;
+
+import org.dom4j.Element;
+import org.jbpm.jpdl.internal.convert.Jpdl3Converter;
+
+/**
+ * The Action class to create the converted action or script elements and map the specific attributes
+ * @author<a href="mailto:ema@redhat.com>Jim Ma</a>
+ *
+ */
+public class Action {
+
+ protected Element convertedElement = null;
+ protected boolean isPropagationAllowed = true;
+ protected boolean isAsync = false;
+ protected boolean isAsyncExclusive = false;
+
+ public Action() {
+
+ }
+
+ public Element createConvertedElement(Element actionElement, Element jpdl4Doc) {
+ String expression = actionElement.attributeValue("expression");
+
+ if (expression != null) {
+ convertedElement = jpdl4Doc.addElement("script");
+
+ } else if (actionElement.attributeValue("class")!=null) {
+ convertedElement = jpdl4Doc.addElement("java");
+ } else {
+ //both expression and class are null
+ convertedElement = jpdl4Doc.addElement("custom");
+ }
+
+ return convertedElement;
+ }
+
+ public void read(Element actionElement, Jpdl3Converter jpdlReader) {
+ String expression = actionElement.attributeValue("expression");
+ if (expression!=null) {
+ convertedElement.addAttribute("expr", expression);
+ convertedElement.addAttribute("lang", "juel");
+
+ } else if (actionElement.attribute("ref-name")!=null) {
+ //TODO: Unsupported ref-name
+ //jpdlReader.addUnresolvedActionReference(actionElement, this);
+ jpdlReader.addWarning("Unsupported ref-name attribute conversion in element " + actionElement.asXML());
+ } else if (actionElement.attribute("class")!=null) {
+ convertedElement.addAttribute("class", actionElement.attributeValue("class"));
+ convertedElement.addAttribute("method", "execute");
+
+ } else {
+ jpdlReader.addWarning("action does not have class nor ref-name attribute, generated the default node <custom> "+actionElement.asXML());
+ }
+ //TODO: propagate...
+ String acceptPropagatedEvents = actionElement.attributeValue("accept-propagated-events");
+ if ("false".equalsIgnoreCase(acceptPropagatedEvents)
+ || "no".equalsIgnoreCase(acceptPropagatedEvents)
+ || "off".equalsIgnoreCase(acceptPropagatedEvents)) {
+ isPropagationAllowed = false;
+ }
+
+ String asyncText = actionElement.attributeValue("async");
+ if ("true".equalsIgnoreCase(asyncText)) {
+ convertedElement.addAttribute("continue", "async");
+ } else if ("exclusive".equalsIgnoreCase(asyncText)) {
+ convertedElement.addAttribute("continue", "exclusive");
+ }
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/action/ActionConverterTypes.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/action/ActionConverterTypes.java
new file mode 100644
index 0000000..935a1f2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/action/ActionConverterTypes.java
@@ -0,0 +1,109 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.action;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.jbpm.jpdl.internal.convert.node.NodeConverterTypes;
+
+/**
+ * This originates from jbpm3 code base
+ * It reads the "META-INF/action.converter.types.xml" configuration to load the class to convert
+ * Action elements
+ */
+
+public class ActionConverterTypes {
+
+ public static Set<Class<? extends Action>> getActionTypes() {
+ return actionNames.keySet();
+ }
+
+ public static Set<String> getActionNames() {
+ return actionTypes.keySet();
+ }
+
+ public static Class<? extends Action> getActionType(String name) {
+ return actionTypes.get(name);
+ }
+
+ public static String getActionName(Class<? extends Action> type) {
+ return actionNames.get(type);
+ }
+
+ public static boolean hasActionName(String name) {
+ return actionTypes.containsKey(name);
+ }
+
+ private static SAXReader reader = new SAXReader();
+ static final Log log = LogFactory.getLog(ActionConverterTypes.class);
+ static Map<String, Class<? extends Action>> actionTypes = initialiseActionTypes();
+ static Map<Class<? extends Action>, String> actionNames = NodeConverterTypes.createInverseMapping(actionTypes);
+
+ static Map<String, Class<? extends Action>> initialiseActionTypes() {
+ Map<String, Class<? extends Action>> types = new HashMap<String, Class<? extends Action>>();
+
+ InputStream actionTypesStream = ActionConverterTypes.class
+ .getClassLoader().getResourceAsStream(
+ "action.converter.types.xml");
+
+ Element actionTypesElement = null;
+ try {
+ actionTypesElement = reader.read(actionTypesStream)
+ .getRootElement();
+ } catch (DocumentException e1) {
+ log.error("Failed to parse the action.converter.types.xml", e1);
+ }
+
+ Iterator<?> actionTypeIterator = actionTypesElement
+ .elementIterator("action-type");
+ while (actionTypeIterator.hasNext()) {
+ Element actionTypeElement = (Element) actionTypeIterator.next();
+
+ String elementTag = actionTypeElement.attributeValue("element");
+ String className = actionTypeElement.attributeValue("class");
+ try {
+ Class<?> actionClass = ActionConverterTypes.class.forName(className);
+ types.put(elementTag, actionClass.asSubclass(Action.class));
+
+ } catch (Exception e) {
+ // NOTE that Error's are not caught because that might halt the
+ // JVM and mask the original Error.
+ if (log.isDebugEnabled()) {
+ log.debug("action '" + elementTag
+ + "' will not be available. class '" + className
+ + "' couldn't be loaded");
+ }
+ }
+ }
+ return types;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/action/CreateTimerAction.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/action/CreateTimerAction.java
new file mode 100644
index 0000000..bd4feea
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/action/CreateTimerAction.java
@@ -0,0 +1,74 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.action;
+
+import org.dom4j.Element;
+import org.jbpm.jpdl.internal.convert.Jpdl3Converter;
+import org.jbpm.jpdl.internal.convert.problem.Problem;
+
+/**
+ * Create the converted timer element and map the specific attributes
+ * @author<a href="mailto:ema@redhat.com>Jim Ma</a>
+ *
+ */
+
+public class CreateTimerAction extends Action {
+ @Override
+ public Element createConvertedElement(Element actionElement,
+ Element jpdl4Doc) {
+ this.convertedElement = jpdl4Doc.addElement("timer");
+ return convertedElement;
+ }
+
+ @Override
+ public void read(Element actionElement, Jpdl3Converter jpdlReader) {
+
+ Element timerAction = jpdlReader.convertSingleAction(actionElement, this.convertedElement);
+
+ String dueDate = actionElement.attributeValue("duedate");
+ if (dueDate == null) {
+ jpdlReader
+ .addWarning("no duedate specified in create timer action '"
+ + actionElement + "'");
+ } else {
+ convertedElement.addAttribute("duedate", dueDate);
+ }
+ String repeat = actionElement.attributeValue("repeat");
+ if ("true".equalsIgnoreCase(repeat) || "yes".equalsIgnoreCase(repeat)) {
+ repeat = dueDate;
+ }
+
+ if (repeat != null) {
+ convertedElement.addAttribute("repeat", repeat);
+ }
+
+ String transitionName = actionElement.attributeValue("transition");
+
+ if ((transitionName != null) && (repeat != null)) {
+ repeat = null;
+ jpdlReader.addProblem(new Problem(Problem.LEVEL_WARNING,
+ "ignoring repeat on timer with transition "
+ + actionElement.asXML()));
+ }
+ //TODO: Investigate how to convert transition attribute
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/action/Script.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/action/Script.java
new file mode 100644
index 0000000..0650341
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/action/Script.java
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.action;
+
+import org.dom4j.Element;
+import org.jbpm.jpdl.internal.convert.Jpdl3Converter;
+/**
+ * Create the converted script element and map the specific attributes
+ * @author<a href="mailto:ema@redhat.com>Jim Ma</a>
+ *
+ */
+public class Script extends Action {
+
+ public Element createConvertedElement(Element actionElement, Element jpdl4Doc) {
+ convertedElement = jpdl4Doc.addElement("script");
+ return convertedElement;
+ }
+
+ public void read(Element actionElement, Jpdl3Converter jpdlReader) {
+ String expression = null;
+ if (actionElement.isTextOnly()) {
+ expression = actionElement.getText();
+ } else {
+ //TODO:Unsupported variable conversion
+ //List<VariableAccess> vias = jpdlReader.readVariableAccesses(actionElement);
+ expression = actionElement.element("expression").getText();
+ }
+ convertedElement.addAttribute("expr", expression);
+ convertedElement.addAttribute("lang", "juel");
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/exception/ConvertException.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/exception/ConvertException.java
new file mode 100644
index 0000000..9d60956
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/exception/ConvertException.java
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.exception;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.jbpm.jpdl.internal.convert.problem.Problem;
+
+public class ConvertException extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+ protected List problems = null;
+
+ public ConvertException(List problems) {
+ super(problems.toString());
+ this.problems = problems;
+ }
+ public ConvertException(String msg) {
+ this(Collections.singletonList(new Problem(Problem.LEVEL_ERROR, msg)));
+ }
+ public ConvertException(String msg, Throwable e ) {
+ this(Collections.singletonList(new Problem(Problem.LEVEL_ERROR, msg, e)));
+ }
+ public List getProblems() {
+ return problems;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/exception/IllegalCommandException.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/exception/IllegalCommandException.java
new file mode 100644
index 0000000..1566a11
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/exception/IllegalCommandException.java
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.exception;
+
+/**
+ * Custom exception to indicate an illegal usage of a command line argument.
+ *
+ * @author Jim Ma
+ */
+public class IllegalCommandException extends Exception {
+ private static final long serialVersionUID = 1L;
+
+ public IllegalCommandException() {
+ super();
+ }
+
+ public IllegalCommandException(String msg) {
+ super(msg);
+ }
+
+
+ public IllegalCommandException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public IllegalCommandException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Access.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Access.java
new file mode 100644
index 0000000..8daf092
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Access.java
@@ -0,0 +1,88 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.node;
+
+import java.io.Serializable;
+
+/**
+ * This originates from jbpm3 code base for variable acces
+ *
+ */
+public class Access implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ String access = "read,write";
+
+ public Access() {
+ }
+
+ public Access(String access) {
+ if (access!=null) {
+ if ("".equals(access)) {
+ this.access = " ";
+ } else {
+ this.access = access;
+ }
+ }
+ }
+
+ public boolean isReadable() {
+ return hasAccess("read");
+ }
+
+ public boolean isWritable() {
+ return hasAccess("write");
+ }
+
+ public boolean isRequired() {
+ return hasAccess("required");
+ }
+
+ public boolean isLock() {
+ return hasAccess("lock");
+ }
+
+ /**
+ * verifies if the given accessLiteral is included in the access text.
+ */
+ public boolean hasAccess(String accessLiteral) {
+ if (access==null) return false;
+ return (access.indexOf(accessLiteral.toLowerCase())!=-1);
+ }
+
+ public String toString() {
+ return access;
+ }
+
+ public boolean equals(Object object) {
+ if (object instanceof Access) {
+ Access other = (Access) object;
+ return (isReadable()==other.isReadable())
+ && (isWritable()==other.isWritable())
+ && (isRequired()==other.isRequired())
+ && (isLock()==other.isLock());
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Decision.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Decision.java
new file mode 100644
index 0000000..80f1d3c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Decision.java
@@ -0,0 +1,38 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.node;
+
+import org.dom4j.Element;
+import org.jbpm.jpdl.internal.convert.Jpdl3Converter;
+
+public class Decision extends Node {
+
+ public Element createConvertedElement(Element jpdl4Doc) {
+ convertedElement = jpdl4Doc.addElement("decision");
+ return convertedElement;
+ }
+
+ public void read(Jpdl3Converter reader) {
+
+
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/EndState.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/EndState.java
new file mode 100644
index 0000000..5b90ad2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/EndState.java
@@ -0,0 +1,38 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.node;
+
+import org.dom4j.Element;
+import org.jbpm.jpdl.internal.convert.Jpdl3Converter;
+
+public class EndState extends Node {
+
+ public Element createConvertedElement(Element jpdl4Doc) {
+ convertedElement = jpdl4Doc.addElement("end");
+ return convertedElement;
+ }
+
+ public void read(Jpdl3Converter reader) {
+
+
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Fork.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Fork.java
new file mode 100644
index 0000000..a46fc6b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Fork.java
@@ -0,0 +1,38 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.node;
+
+
+import org.dom4j.Element;
+import org.jbpm.jpdl.internal.convert.Jpdl3Converter;
+
+public class Fork extends Node {
+
+ public Element createConvertedElement(Element jpdl4Doc) {
+ convertedElement = jpdl4Doc.addElement("fork");
+ return convertedElement;
+ }
+
+ public void read(Jpdl3Converter reader) {
+
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Join.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Join.java
new file mode 100644
index 0000000..7b1e88a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Join.java
@@ -0,0 +1,37 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.node;
+
+
+import org.dom4j.Element;
+import org.jbpm.jpdl.internal.convert.Jpdl3Converter;
+
+public class Join extends Node {
+ public Element createConvertedElement(Element jpdl4Doc) {
+ convertedElement = jpdl4Doc.addElement("join");
+ return convertedElement;
+ }
+
+ public void read(Jpdl3Converter reader) {
+
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/MailNode.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/MailNode.java
new file mode 100644
index 0000000..d651b9a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/MailNode.java
@@ -0,0 +1,60 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.node;
+
+import org.dom4j.Element;
+import org.jbpm.jpdl.internal.convert.Jpdl3Converter;
+
+public class MailNode extends Node {
+ public Element createConvertedElement(Element jpdl4Doc) {
+ convertedElement = jpdl4Doc.addElement("mail");
+ return convertedElement;
+ }
+
+ public void read(Jpdl3Converter reader) {
+ String template = nodeElement.attributeValue("template");
+ String actors = nodeElement.attributeValue("actors");
+ String to = nodeElement.attributeValue("to");
+ String subject = reader.getProperty("subject", nodeElement);
+ String text = reader.getProperty("text", nodeElement);
+ if (template != null) {
+ convertedElement.addAttribute("template", template);
+ }
+
+ if (actors != null) {
+ Element toElement = convertedElement.addElement("to");
+ toElement.addAttribute("users", actors);
+ }
+ if (to != null) {
+ Element toElement = convertedElement.addElement("to");
+ toElement.addAttribute("addresses", to);
+ }
+ if (subject != null) {
+ Element subjectElement = convertedElement.addElement("subject");
+ subjectElement.addText(subject);
+ }
+ if (text != null) {
+ Element textElement = convertedElement.addElement("text");
+ textElement.addText(text);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Node.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Node.java
new file mode 100644
index 0000000..9ad80c0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/Node.java
@@ -0,0 +1,60 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.node;
+
+import org.dom4j.Element;
+import org.jbpm.jpdl.internal.convert.Jpdl3Converter;
+import org.jbpm.jpdl.internal.convert.action.Action;
+/**
+ * create the converted action element and map the specific attributes
+ * @author<a href="mailto:ema@redhat.com>Jim Ma</a>
+ *
+ */
+public class Node {
+
+ protected Element convertedElement = null;
+
+ protected Element nodeElement = null;
+
+ protected Action action = new Action();
+
+ public Element createConvertedElement(Element jpdl4Doc) {
+ Element actionElement = nodeElement.element("action");
+ convertedElement= action.createConvertedElement(actionElement, jpdl4Doc);
+ return convertedElement;
+ }
+
+ public void read(Jpdl3Converter reader) {
+ Element actionElement = nodeElement.element("action");
+ action.read(actionElement, reader);
+
+ }
+
+ public Element getConvertedElement() {
+ return convertedElement;
+ }
+
+ //set the jpdl3 element
+ public void setNodeElement(Element ele) {
+ this.nodeElement = ele;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/NodeConverterTypes.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/NodeConverterTypes.java
new file mode 100644
index 0000000..3985a3b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/NodeConverterTypes.java
@@ -0,0 +1,104 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.node;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+
+/**
+ * This originates from jbpm3 code base
+ *
+ * Basically, it maps a type string to a Node class.
+ */
+public class NodeConverterTypes {
+
+ public static Set<String> getNodeTypes() {
+ return nodeTypes.keySet();
+ }
+
+ public static Set<Class<? extends Node>> getNodeNames() {
+ return nodeNames.keySet();
+ }
+
+ public static Class<? extends Node> getNodeType(String name) {
+ return nodeTypes.get(name);
+ }
+
+ public static String getNodeName(Class<? extends Node> type) {
+ return nodeNames.get(type);
+ }
+
+ private static final Log log = LogFactory.getLog(NodeConverterTypes.class);
+ private static SAXReader reader = new SAXReader();
+ static Map<String, Class<? extends Node>> nodeTypes = initialiseNodeTypes();
+ static Map<Class<? extends Node>, String> nodeNames = createInverseMapping(nodeTypes);
+
+ static Map<String, Class<? extends Node>> initialiseNodeTypes() {
+ Map<String, Class<? extends Node>> types = new HashMap<String, Class<? extends Node>>();
+ InputStream nodeTypesStream = NodeConverterTypes.class.getClassLoader().getResourceAsStream("node.converter.types.xml");
+ Element nodeTypesElement = null;
+ try {
+ nodeTypesElement = reader.read(nodeTypesStream).getRootElement();
+ } catch (DocumentException e1) {
+ log.error("Failed to parse the node.converter.types.xml", e1);
+ }
+ Iterator<?> nodeTypeIterator = nodeTypesElement.elementIterator("node-type");
+ while(nodeTypeIterator.hasNext()) {
+ Element nodeTypeElement = (Element) nodeTypeIterator.next();
+
+ String elementTag = nodeTypeElement.attributeValue("element");
+ String className = nodeTypeElement.attributeValue("class");
+ try {
+ Class<?> nodeClass = NodeConverterTypes.class.forName(className);
+ types.put(elementTag, nodeClass.asSubclass(Node.class));
+
+ } catch (Exception e) {
+ if (!"org.jboss.seam.jbpm.Page".equals(className)) {
+ if(log.isDebugEnabled())
+ {
+ log.debug("node '"+elementTag+"' will not be available. class '"+className+"' couldn't be loaded");
+ }
+ }
+ }
+ }
+
+ return types;
+ }
+
+ public static <K, V> Map<V, K> createInverseMapping(Map<K, V> map) {
+ Map<V, K> inverse = new HashMap<V, K>();
+ for (Map.Entry<K, V> entry : map.entrySet()) {
+ inverse.put(entry.getValue(), entry.getKey());
+ }
+ return inverse;
+ }
+ }
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/ProcessState.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/ProcessState.java
new file mode 100644
index 0000000..e453dd5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/ProcessState.java
@@ -0,0 +1,40 @@
+package org.jbpm.jpdl.internal.convert.node;
+
+import java.util.List;
+
+import org.dom4j.Element;
+import org.jbpm.jpdl.internal.convert.Jpdl3Converter;
+
+public class ProcessState extends Node {
+ public Element createConvertedElement(Element jpdl4Doc) {
+ convertedElement = jpdl4Doc.addElement("sub-process");
+ return convertedElement;
+ }
+
+ public void read(Jpdl3Converter reader) {
+
+ String name = nodeElement.attributeValue("name");
+
+ convertedElement.attributeValue("name", name);
+
+ Element subProcessElement = nodeElement.element("sub-process");
+ if (subProcessElement!=null) {
+ String subProcessName = subProcessElement.attributeValue("name");
+ //String subProcessVersion = subProcessElement.attributeValue("version");
+ convertedElement.addAttribute("sub-process-key", subProcessName);
+ }
+
+ List<VariableAccess> readVariableAccesses = reader.convertVariableAccesses(nodeElement);
+ for (VariableAccess via : readVariableAccesses) {
+ Element para = null;
+ if (via.isReadable()) {
+ para = convertedElement.addElement("parameter-in");
+ } else {
+ para = convertedElement.addElement("parameter-out");
+ }
+ para.addAttribute("var", via.getVariableName());
+ para.addAttribute("subvar", via.getMappedName());
+ }
+
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/StartState.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/StartState.java
new file mode 100644
index 0000000..161d7d3
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/StartState.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.node;
+
+
+import org.dom4j.Element;
+import org.jbpm.jpdl.internal.convert.Jpdl3Converter;
+
+public class StartState extends Node {
+ public Element createConvertedElement(Element jpdl4Doc) {
+ convertedElement = jpdl4Doc.addElement("start");
+ return convertedElement;
+ }
+
+ public void read(Jpdl3Converter reader) {
+ Element startTaskElement = nodeElement.element("task");
+ if (startTaskElement!=null) {
+ reader.addWarning("Unsupported start task conversion");
+ }
+
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/State.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/State.java
new file mode 100644
index 0000000..5176670
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/State.java
@@ -0,0 +1,37 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.node;
+
+import org.dom4j.Element;
+import org.jbpm.jpdl.internal.convert.Jpdl3Converter;
+
+public class State extends Node {
+
+ public Element createConvertedElement(Element jpdl4Doc) {
+ convertedElement = jpdl4Doc.addElement("state");
+ return convertedElement;
+ }
+
+ public void read(Jpdl3Converter reader) {
+
+ }
+ }
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/SuperState.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/SuperState.java
new file mode 100644
index 0000000..05a4bad
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/SuperState.java
@@ -0,0 +1,38 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.node;
+
+import org.dom4j.Element;
+import org.jbpm.jpdl.internal.convert.Jpdl3Converter;
+
+public class SuperState extends Node {
+ public Element createConvertedElement(Element jpdl4Doc) {
+ convertedElement = jpdl4Doc.addElement("group");
+ return convertedElement;
+ }
+
+ public void read(Jpdl3Converter reader) {
+ String name = nodeElement.attributeValue("name");
+ convertedElement.attributeValue("name", name);
+ reader.convertNodes(nodeElement, convertedElement);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/TaskNode.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/TaskNode.java
new file mode 100644
index 0000000..468b096
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/TaskNode.java
@@ -0,0 +1,37 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.node;
+
+import org.dom4j.Element;
+import org.jbpm.jpdl.internal.convert.Jpdl3Converter;
+
+public class TaskNode extends Node {
+
+ public Element createConvertedElement(Element jpdl4Doc) {
+ convertedElement = jpdl4Doc.addElement("task");
+ return convertedElement;
+ }
+
+ public void read(Jpdl3Converter reader) {
+
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/VariableAccess.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/VariableAccess.java
new file mode 100644
index 0000000..c8464f1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/node/VariableAccess.java
@@ -0,0 +1,93 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.node;
+
+import java.io.Serializable;
+
+/**
+ * This originates from jbpm3 codebase.
+ * specifies access to a variable.
+ * Variable access is used in 3 situations:
+ * 1) process-state
+ * 2) script
+ * 3) task controllers
+ */
+public class VariableAccess implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ long id = 0;
+ protected String variableName = null;
+ protected Access access = null;
+ protected String mappedName = null;
+
+ // constructors /////////////////////////////////////////////////////////////
+
+ public VariableAccess() {
+ }
+
+ public VariableAccess(String variableName, String access, String mappedName) {
+ this.variableName = variableName;
+ if (access!=null) access = access.toLowerCase();
+ this.access = new Access(access);
+ this.mappedName = mappedName;
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ /**
+ * the mapped name. The mappedName defaults to the variableName in case
+ * no mapped name is specified.
+ */
+ public String getMappedName() {
+ if (mappedName==null) {
+ return variableName;
+ }
+ return mappedName;
+ }
+
+ /**
+ * specifies a comma separated list of access literals {read, write, required}.
+ */
+ public Access getAccess() {
+ return access;
+ }
+ public String getVariableName() {
+ return variableName;
+ }
+
+ public boolean isReadable() {
+ return access.isReadable();
+ }
+
+ public boolean isWritable() {
+ return access.isWritable();
+ }
+
+ public boolean isRequired() {
+ return access.isRequired();
+ }
+
+ public boolean isLock() {
+ return access.isLock();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/problem/Problem.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/problem/Problem.java
new file mode 100644
index 0000000..a1afe37
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/problem/Problem.java
@@ -0,0 +1,121 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.problem;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Iterator;
+
+/**
+ * This class orginates from jpbm3 codebase
+ *
+ */
+public class Problem implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final int LEVEL_FATAL = 1;
+ public static final int LEVEL_ERROR = 2;
+ public static final int LEVEL_WARNING = 3;
+ public static final int LEVEL_INFO = 4;
+
+ static String getTypeDescription(int level) {
+ if (level==LEVEL_FATAL) return "FATAL";
+ if (level==LEVEL_ERROR) return "ERROR";
+ if (level==LEVEL_WARNING) return "WARNING";
+ if (level==LEVEL_INFO) return "INFO";
+ return null;
+ }
+
+ protected int level;
+ protected String description;
+ protected String resource;
+ protected String folder;
+ protected Integer line;
+ protected Throwable exception;
+
+ public Problem(int level, String description) {
+ this.level = level;
+ this.description = description;
+ }
+
+ public Problem(int level, String description, Throwable exception) {
+ this.level = level;
+ this.description = description;
+ this.exception = exception;
+ }
+
+ public String toString() {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("["+getTypeDescription(level)+"]");
+ if (description!=null) buffer.append(" "+description);
+ if (resource!=null) buffer.append(" at "+resource);
+ if (line!=null) buffer.append(" line "+line);
+ if (folder!=null) buffer.append(" in "+folder);
+ return buffer.toString();
+ }
+
+ public static boolean containsProblemsOfLevel(Collection c, int level) {
+ Iterator iter = c.iterator();
+ while (iter.hasNext()) {
+ Problem problem = (Problem) iter.next();
+ if (problem.level <= level) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+ public Throwable getException() {
+ return exception;
+ }
+ public void setException(Throwable exception) {
+ this.exception = exception;
+ }
+ public String getFolder() {
+ return folder;
+ }
+ public void setFolder(String folder) {
+ this.folder = folder;
+ }
+ public Integer getLine() {
+ return line;
+ }
+ public void setLine(Integer line) {
+ this.line = line;
+ }
+ public String getResource() {
+ return resource;
+ }
+ public void setResource(String resource) {
+ this.resource = resource;
+ }
+ public int getLevel() {
+ return level;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/problem/ProblemListener.java b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/problem/ProblemListener.java
new file mode 100644
index 0000000..eb36cb0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/migration/src/org/jbpm/jpdl/internal/convert/problem/ProblemListener.java
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.convert.problem;
+
+import java.io.Serializable;
+
+/**
+ * This class orginates from jpbm3 codebase
+ *
+ */
+public interface ProblemListener extends Serializable {
+
+ void addProblem(Problem problem);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.businesscalendar.cfg.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.businesscalendar.cfg.xml
new file mode 100644
index 0000000..dd66b50
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.businesscalendar.cfg.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<jbpm-configuration>
+
+ <process-engine-context>
+
+ <business-calendar>
+ <monday hours="9:00-12:00 and 12:30-17:00"/>
+ <tuesday hours="9:00-12:00 and 12:30-17:00"/>
+ <wednesday hours="9:00-12:00 and 12:30-17:00"/>
+ <thursday hours="9:00-12:00 and 12:30-17:00"/>
+ <friday hours="9:00-12:00 and 12:30-17:00"/>
+ <holiday period="01/07/2008 - 31/08/2008"/>
+ </business-calendar>
+
+ </process-engine-context>
+
+</jbpm-configuration>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.console.cfg.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.console.cfg.xml
new file mode 100644
index 0000000..91b7cf5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.console.cfg.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<jbpm-configuration>
+
+ <process-engine-context>
+ <string name="jbpm.console.server.host" value="localhost" />
+ <string name="jbpm.console.server.port" value="8080" />
+ </process-engine-context>
+
+</jbpm-configuration>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.default.cfg.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.default.cfg.xml
new file mode 100644
index 0000000..2a6c051
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.default.cfg.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<jbpm-configuration>
+
+ <import resource="jbpm.default.scriptmanager.xml" />
+
+ <process-engine-context>
+
+ <repository-service />
+ <repository-cache />
+ <execution-service />
+ <history-service />
+ <management-service />
+ <identity-service />
+ <task-service />
+
+ <object class="org.jbpm.pvm.internal.id.DatabaseDbidGenerator">
+ <field name="commandService"><ref object="newTxRequiredCommandService" /></field>
+ </object>
+
+ <object class="org.jbpm.pvm.internal.id.DatabaseIdComposer" init="eager" />
+
+ <types resource="jbpm.variable.types.xml" />
+
+ <address-resolver />
+
+ <mail-template name='task-notification'>
+ <to users="${task.assignee}"/>
+ <subject>${task.name}</subject>
+ <text><![CDATA[Hi ${task.assignee},
+Task "${task.name}" has been assigned to you.
+${task.description}
+
+Sent by JBoss jBPM
+]]></text>
+ </mail-template>
+
+ <mail-template name='task-reminder'>
+ <to users="${task.assignee}"/>
+ <subject>${task.name}</subject>
+ <text><![CDATA[Hey ${task.assignee},
+Do not forget about task "${task.name}".
+${task.description}
+
+Sent by JBoss jBPM
+]]></text>
+ </mail-template>
+
+ </process-engine-context>
+
+ <transaction-context>
+ <repository-session />
+ <db-session />
+
+ <message-session />
+ <timer-session />
+
+ <history-sessions>
+ <object class="org.jbpm.pvm.internal.history.HistorySessionImpl" />
+ </history-sessions>
+
+ <mail-session>
+ <mail-server>
+ <session-properties resource="jbpm.mail.properties" />
+ </mail-server>
+ </mail-session>
+
+ </transaction-context>
+
+</jbpm-configuration>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.default.scriptmanager.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.default.scriptmanager.xml
new file mode 100644
index 0000000..f88aed9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.default.scriptmanager.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<jbpm-configuration>
+
+ <process-engine-context>
+
+ <script-manager default-expression-language="juel"
+ default-script-language="juel">
+ <script-language name="juel" factory="org.jbpm.pvm.internal.script.JuelScriptEngineFactory" />
+ <script-language name="bsh" factory="org.jbpm.pvm.internal.script.BshScriptEngineFactory" />
+ <script-language name="groovy" factory="org.jbpm.pvm.internal.script.GroovyScriptEngineFactory" />
+ </script-manager>
+
+ </process-engine-context>
+
+</jbpm-configuration>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.execution.hbm.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.execution.hbm.xml
new file mode 100644
index 0000000..94a8a80
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.execution.hbm.xml
@@ -0,0 +1,356 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.jbpm.pvm.internal.model" default-access="field">
+
+ <!-- ### TYPEDEFS ####################################################### -->
+ <typedef name="converter" class="org.jbpm.pvm.internal.hibernate.ConverterType">
+ <param name="org.jbpm.pvm.internal.type.converter.BooleanToStringConverter" >bool-str</param>
+ <param name="org.jbpm.pvm.internal.type.converter.ByteToLongConverter" >byte-long</param>
+ <param name="org.jbpm.pvm.internal.type.converter.CharacterToStringConverter" >char-str</param>
+ <param name="org.jbpm.pvm.internal.type.converter.DateToLongConverter" >date-long</param>
+ <param name="org.jbpm.pvm.internal.type.converter.DateToStringConverter" >date-str</param>
+ <param name="org.jbpm.pvm.internal.type.converter.DoubleToStringConverter" >double-str</param>
+ <param name="org.jbpm.pvm.internal.type.converter.FloatToDoubleConverter" >float-double</param>
+ <param name="org.jbpm.pvm.internal.type.converter.FloatToStringConverter" >float-str</param>
+ <param name="org.jbpm.pvm.internal.type.converter.IntegerToLongConverter" >int-long</param>
+ <param name="org.jbpm.pvm.internal.type.converter.SerializableToBytesConverter">ser-bytes</param>
+ <param name="org.jbpm.pvm.internal.type.converter.ShortToLongConverter" >short-long</param>
+ </typedef>
+
+ <!-- ### EXECUTION ############################################# -->
+ <class name="ExecutionImpl"
+ table="JBPM4_EXECUTION"
+ discriminator-value="pvm">
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+ <discriminator><column name="CLASS_" /></discriminator>
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="activityName" column="ACTIVITYNAME_" />
+ <property name="processDefinitionId" column="PROCDEFID_" />
+
+ <property name="hasVariables" column="HASVARS_" />
+ <map name="variables"
+ cascade="all-delete-orphan">
+ <key foreign-key="FK_VAR_EXECUTION">
+ <column name="EXECUTION_" index="IDX_VAR_EXECUTION"/>
+ </key>
+ <map-key type="string" column="KEY_" />
+ <one-to-many class="org.jbpm.pvm.internal.type.Variable" />
+ </map>
+ <map name="systemVariables"
+ cascade="all-delete-orphan">
+ <key foreign-key="FK_VAR_EXESYS">
+ <column name="EXESYS_" index="IDX_VAR_EXESYS"/>
+ </key>
+ <map-key type="string" column="KEY_" />
+ <one-to-many class="org.jbpm.pvm.internal.type.Variable" />
+ </map>
+
+
+ <property name="name" column="NAME_" />
+ <property name="key" column="KEY_" />
+ <property name="id" column="ID_" unique="true" />
+ <property name="state" column="STATE_" />
+ <property name="suspendHistoryState" column="SUSPHISTSTATE_" />
+
+ <property name="priority" column="PRIORITY_" />
+ <property name="historyActivityInstanceDbid" column="HISACTINST_" />
+
+ <list name="executions"
+ cascade="all-delete-orphan"
+ inverse="false"
+ lazy="false">
+ <key column="PARENT_" foreign-key="FK_EXEC_PARENT" />
+ <list-index column="PARENT_IDX_" />
+ <one-to-many class="ExecutionImpl" />
+ </list>
+
+ <map name="swimlanes"
+ cascade="all-delete-orphan">
+ <key foreign-key="FK_SWIMLANE_EXEC">
+ <column name="EXECUTION_" index="IDX_SWIMLANE_EXEC"/>
+ </key>
+ <map-key type="string" column="NAME_" />
+ <one-to-many class="org.jbpm.pvm.internal.task.SwimlaneImpl" />
+ </map>
+
+ <many-to-one name="parent"
+ column="PARENT_"
+ class="ExecutionImpl"
+ foreign-key="FK_EXEC_PARENT"
+ index="IDX_EXEC_PARENT"
+ lazy="false" />
+
+ <many-to-one name="processInstance"
+ class="ExecutionImpl"
+ column="INSTANCE_"
+ foreign-key="FK_EXEC_INSTANCE"
+ index="IDX_EXEC_INSTANCE"
+ lazy="false" />
+
+ <many-to-one name="superProcessExecution"
+ column="SUPEREXEC_"
+ class="ExecutionImpl"
+ foreign-key="FK_EXEC_SUPEREXEC"
+ index="IDX_EXEC_SUPEREXEC" />
+
+ <many-to-one name="subProcessInstance"
+ column="SUBPROCINST_"
+ class="ExecutionImpl"
+ foreign-key="FK_EXEC_SUBPI"
+ index="IDX_EXEC_SUBPI" />
+
+ </class>
+
+ <!-- ### VARIABLE ####################################################### -->
+ <class name="org.jbpm.pvm.internal.type.Variable" abstract="true" discriminator-value=" " table="JBPM4_VARIABLE">
+ <!-- discriminator values:
+ date : org.jbpm.pvm.internal.type.variable.DateVariable
+ double : org.jbpm.pvm.internal.type.variable.DoubleVariable
+ hibl : org.jbpm.pvm.internal.type.variable.HibernateLongVariable
+ long : org.jbpm.pvm.internal.type.variable.LongVariable
+ hibs : org.jbpm.pvm.internal.type.variable.HibernateStringVariable
+ string : org.jbpm.pvm.internal.type.variable.StringVariable
+ null : org.jbpm.pvm.internal.type.variable.NullVariable
+ blob : org.jbpm.pvm.internal.type.variable.BlobVariable
+ clob : org.jbpm.pvm.internal.type.variable.ClobVariable
+ -->
+
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+ <discriminator column="CLASS_"/>
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="key" column="KEY_"/>
+ <property name="converter" type="converter" column="CONVERTER_" />
+ <property name="isHistoryEnabled" column="HIST_" />
+
+ <many-to-one name="execution"
+ column="EXECUTION_"
+ class="org.jbpm.pvm.internal.model.ExecutionImpl"
+ foreign-key="none"/>
+ <many-to-one name="task"
+ column="TASK_"
+ class="org.jbpm.pvm.internal.task.TaskImpl"
+ foreign-key="none"/>
+ </class>
+
+ <subclass name="org.jbpm.pvm.internal.type.variable.BlobVariable" extends="org.jbpm.pvm.internal.type.Variable" discriminator-value="blob">
+ <many-to-one name="lob"
+ column="LOB_"
+ cascade="all"
+ class="org.jbpm.pvm.internal.lob.Lob"
+ foreign-key="FK_VAR_LOB"
+ index="IDX_VAR_LOB" />
+ </subclass>
+
+ <subclass name="org.jbpm.pvm.internal.type.variable.DateVariable" extends="org.jbpm.pvm.internal.type.Variable" discriminator-value="date">
+ <property name="date" column="DATE_VALUE_" type="timestamp"/>
+ </subclass>
+
+ <subclass name="org.jbpm.pvm.internal.type.variable.DoubleVariable" extends="org.jbpm.pvm.internal.type.Variable" discriminator-value="double">
+ <property name="d" column="DOUBLE_VALUE_" type="double"/>
+ </subclass>
+
+ <subclass name="org.jbpm.pvm.internal.type.variable.HibernateLongVariable" extends="org.jbpm.pvm.internal.type.Variable" discriminator-value="hib-long">
+ <any name="hibernatable" id-type="long">
+ <column name="CLASSNAME_"/>
+ <column name="LONG_VALUE_"/>
+ </any>
+ </subclass>
+
+ <subclass name="org.jbpm.pvm.internal.type.variable.HibernateStringVariable" extends="org.jbpm.pvm.internal.type.Variable" discriminator-value="hib-string">
+ <any name="hibernatable" id-type="string">
+ <column name="CLASSNAME_"/>
+ <column name="STRING_VALUE_"/>
+ </any>
+ </subclass>
+
+ <subclass name="org.jbpm.pvm.internal.type.variable.LongVariable" extends="org.jbpm.pvm.internal.type.Variable" discriminator-value="long">
+ <property name="l" column="LONG_VALUE_" type="long"/>
+ </subclass>
+
+ <subclass name="org.jbpm.pvm.internal.type.variable.NullVariable" extends="org.jbpm.pvm.internal.type.Variable" discriminator-value="null">
+ </subclass>
+
+ <subclass name="org.jbpm.pvm.internal.type.variable.StringVariable" extends="org.jbpm.pvm.internal.type.Variable" discriminator-value="string">
+ <property name="string" column="STRING_VALUE_" type="string"/>
+ </subclass>
+
+ <subclass name="org.jbpm.pvm.internal.type.variable.TextVariable" extends="org.jbpm.pvm.internal.type.Variable" discriminator-value="text">
+ <property name="text" column="TEXT_VALUE_" type="text"/>
+ </subclass>
+
+ <!-- ### LOB ############################################################ -->
+ <class name="org.jbpm.pvm.internal.lob.Lob" table="JBPM4_LOB">
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+ <version name="dbversion" column="DBVERSION_" />
+ <property name="blob" type="blob"><column name="BLOB_VALUE_" /></property>
+ <!--
+ should only be re-introduced if there comes a concrete need for it.
+ <property name="bytes" type="binary" column="BINARY_VALUE_"/>
+ <property name="clob" type="clob" column="CLOB_VALUE_" />
+ <property name="text" type="text" column="TEXT_VALUE_"/>
+ -->
+ </class>
+
+ <class name="org.jbpm.pvm.internal.job.JobImpl" table="JBPM4_JOB" discriminator-value="Job">
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+ <discriminator column="CLASS_" />
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="duedate" column="DUEDATE_" type="timestamp" index="IDX_JOBDUEDATE" />
+ <property name="state" column="STATE_" />
+ <property name="isExclusive" column="ISEXCLUSIVE_" />
+ <property name="lockOwner" column="LOCKOWNER_" />
+ <property name="lockExpirationTime" column="LOCKEXPTIME_" index="IDX_JOBLOCKEXP" />
+ <property name="exception" column="EXCEPTION_" type="text" />
+ <property name="retries" column="RETRIES_" index="IDX_JOBRETRIES" />
+
+ <many-to-one name="processInstance"
+ class="org.jbpm.pvm.internal.model.ExecutionImpl"
+ column="PROCESSINSTANCE_"
+ cascade="none"
+ foreign-key="none"
+ index="IDX_JOB_PRINST"
+ lazy="false"/>
+
+ <many-to-one name="execution"
+ class="org.jbpm.pvm.internal.model.ExecutionImpl"
+ column="EXECUTION_"
+ cascade="none"
+ foreign-key="none"
+ index="IDX_JOB_EXE"/>
+
+ <many-to-one name="configurationBytes"
+ column="CFG_"
+ cascade="all"
+ class="org.jbpm.pvm.internal.lob.Lob"
+ foreign-key="FK_JOB_CFG"
+ index="IDX_JOB_CFG" />
+
+ <subclass name="org.jbpm.pvm.internal.job.MessageImpl" discriminator-value="Msg">
+ <subclass name="org.jbpm.pvm.internal.model.op.ExecuteActivityMessage" discriminator-value="ExeAct" />
+ <subclass name="org.jbpm.pvm.internal.model.op.ExecuteEventListenerMessage" discriminator-value="ExeEvtLsnr" />
+ <subclass name="org.jbpm.pvm.internal.job.CommandMessage" discriminator-value="Cmd" />
+ </subclass>
+
+ <subclass name="org.jbpm.pvm.internal.job.TimerImpl" discriminator-value="Timer">
+ <property name="signalName" column="SIGNAL_" />
+ <property name="eventName" column="EVENT_" />
+ <property name="repeat" column="REPEAT_" />
+ </subclass>
+
+ </class>
+
+ <!-- ### HibernatePvmDbSession QUERIES ################################## -->
+
+ <query name="findTimers">
+ <![CDATA[
+ select t
+ from org.jbpm.pvm.internal.job.TimerImpl as t
+ order by duedate asc
+ ]]>
+ </query>
+
+ <query name="findMessages">
+ <![CDATA[
+ select m
+ from org.jbpm.pvm.internal.job.MessageImpl as m
+ ]]>
+ </query>
+
+ <query name="findJobsWithException">
+ <![CDATA[
+ select job
+ from org.jbpm.pvm.internal.job.JobImpl as job
+ where job.retries = 0
+ order by duedate asc
+ ]]>
+ </query>
+
+ <!-- ### HibernateJobDbSession QUERIES ################################## -->
+ <query name="findFirstAcquirableJob">
+ <![CDATA[
+ select job
+ from org.jbpm.pvm.internal.job.JobImpl as job
+ where ( ( (job.lockExpirationTime is null)
+ or (job.lockExpirationTime <= :now)
+ )
+ and
+ ( (job.duedate is null)
+ or (job.duedate <= :now)
+ )
+ and
+ ( job.retries > 0 )
+ and
+ ( job.state != 'suspended' )
+ )
+ order by job.duedate asc
+ ]]>
+ </query>
+
+ <query name="findExclusiveJobs">
+ <![CDATA[
+ select job
+ from org.jbpm.pvm.internal.job.JobImpl as job
+ where job.lockOwner is null
+ and job.processInstance = :processInstance
+ and job.isExclusive = true
+ and job.retries > 0
+ and job.state != 'suspended'
+ and ( (job.duedate is null)
+ or (job.duedate <= :now)
+ )
+ order by job.duedate asc
+ ]]>
+ </query>
+
+ <query name="findFirstDueJob">
+ <![CDATA[
+ select job
+ from org.jbpm.pvm.internal.job.JobImpl as job
+ where job.lockOwner is null
+ and job.retries > 0
+ and job.state != 'suspended'
+ order by job.duedate asc
+ ]]>
+ </query>
+
+ <!-- ### HibernatePvmDbSession QUERIES ############################################# -->
+ <query name="findExecutionById">
+ <![CDATA[
+ select execution
+ from org.jbpm.pvm.internal.model.ExecutionImpl as execution
+ where execution.id = :id
+ ]]>
+ </query>
+
+ <query name="findProcessInstanceById">
+ <![CDATA[
+ select processInstance
+ from org.jbpm.pvm.internal.model.ExecutionImpl as processInstance
+ where processInstance.id = :processInstanceId
+ and processInstance.parent is null
+ and processInstance.state != 'suspended'
+ ]]>
+ </query>
+
+ <query name="findProcessInstanceByIdIgnoreSuspended">
+ <![CDATA[
+ select processInstance
+ from org.jbpm.pvm.internal.model.ExecutionImpl as processInstance
+ where processInstance.id = :processInstanceId
+ and processInstance.parent is null
+ ]]>
+ </query>
+
+</hibernate-mapping>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.history.hbm.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.history.hbm.xml
new file mode 100644
index 0000000..5f32acf
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.history.hbm.xml
@@ -0,0 +1,251 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.jbpm.pvm.internal.history.model" default-access="field">
+
+ <!-- ### HISTORY PROCESS INSTANCE ####################################### -->
+ <class name="HistoryProcessInstanceImpl" table="JBPM4_HIST_PROCINST">
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="processInstanceId" column="ID_" />
+ <property name="processDefinitionId" column="PROCDEFID_" />
+ <property name="key" column="KEY_" />
+ <property name="startTime" column="START_" type="timestamp" />
+ <property name="endTime" column="END_" type="timestamp" />
+ <property name="duration" column="DURATION_" />
+ <property name="state" column="STATE_" />
+ <property name="endActivityName" column="ENDACTIVITY_" />
+
+ <property name="nextDetailIndex" column="NEXTIDX_" />
+
+ <set name="historyActivityInstances"
+ cascade="all">
+ <key foreign-key="none">
+ <column name="HPROCI_" />
+ </key>
+ <one-to-many class="HistoryActivityInstanceImpl" />
+ </set>
+
+ <set name="historyVariables"
+ cascade="all">
+ <key foreign-key="none">
+ <column name="HPROCI_" />
+ </key>
+ <one-to-many class="HistoryVariableImpl" />
+ </set>
+
+ <set name="details"
+ cascade="all">
+ <key foreign-key="none">
+ <column name="HPROCI_" />
+ </key>
+ <one-to-many class="HistoryDetailImpl" />
+ </set>
+
+ </class>
+
+ <!-- ### HISTORY ACTIVITY INSTANCE ####################################### -->
+ <class name="HistoryActivityInstanceImpl" table="JBPM4_HIST_ACTINST" discriminator-value="act">
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+ <discriminator column="CLASS_" />
+ <version name="dbversion" column="DBVERSION_" />
+
+ <!-- the foreign-key is set on the other side of the relation: see historyActivityInstances above -->
+ <many-to-one name="historyProcessInstance"
+ class="HistoryProcessInstanceImpl"
+ column="HPROCI_"
+ foreign-key="FK_HACTI_HPROCI"
+ index="IDX_HACTI_HPROCI" />
+
+ <property name="type" column="TYPE_" />
+ <property name="executionId" column="EXECUTION_" />
+ <property name="activityName" column="ACTIVITY_NAME_" />
+ <property name="startTime" column="START_" type="timestamp" />
+ <property name="endTime" column="END_" type="timestamp" />
+ <property name="duration" column="DURATION_" />
+ <property name="transitionName" column="TRANSITION_" />
+ <property name="nextDetailIndex" column="NEXTIDX_" />
+
+ <set name="details"
+ cascade="all">
+ <key foreign-key="none">
+ <column name="HACTI_" />
+ </key>
+ <one-to-many class="HistoryDetailImpl" />
+ </set>
+
+ <subclass name="HistoryAutomaticInstanceImpl" discriminator-value="aut">
+ <subclass name="HistoryDecisionInstanceImpl" discriminator-value="excl" />
+ </subclass>
+
+ <subclass name="HistoryTaskInstanceImpl" discriminator-value="task">
+ <many-to-one name="historyTask"
+ class="HistoryTaskImpl"
+ column="HTASK_"
+ cascade="all"
+ foreign-key="FK_HTI_HTASK"
+ index="IDX_HTI_HTASK" />
+ </subclass>
+ </class>
+
+ <!-- ### HISTORY TASK ################################################# -->
+ <class name="HistoryTaskImpl" table="JBPM4_HIST_TASK">
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="executionId" column="EXECUTION_" />
+ <property name="outcome" column="OUTCOME_" />
+ <property name="assignee" column="ASSIGNEE_" />
+ <property name="priority" column="PRIORITY_" />
+ <property name="state" column="STATE_" />
+ <property name="createTime" column="CREATE_" type="timestamp" />
+ <property name="endTime" column="END_" type="timestamp" />
+ <property name="duration" column="DURATION_" />
+ <property name="nextDetailIndex" column="NEXTIDX_" />
+
+ <set name="details"
+ cascade="all">
+ <key foreign-key="none">
+ <column name="HTASK_" />
+ </key>
+ <one-to-many class="HistoryDetailImpl" />
+ </set>
+
+ <set name="historyVariables"
+ cascade="all">
+ <key foreign-key="none">
+ <column name="HTASK_" />
+ </key>
+ <one-to-many class="HistoryVariableImpl" />
+ </set>
+
+ <set name="subTasks" cascade="all-delete-orphan">
+ <key foreign-key="FK_HSUPERT_SUB">
+ <column name="SUPERTASK_" index="IDX_HSUPERT_SUB" />
+ </key>
+ <one-to-many class="HistoryTaskImpl" />
+ </set>
+
+ </class>
+
+ <!-- ### HISTORY VARIABLE ################################################# -->
+ <class name="HistoryVariableImpl" table="JBPM4_HIST_VAR">
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="processInstanceId" column="PROCINSTID_" />
+ <property name="executionId" column="EXECUTIONID_" />
+ <property name="variableName" column="VARNAME_" />
+ <property name="value" column="VALUE_" />
+
+ <!-- the foreign-key is set on the other side of the relation: see historyVariables above in HistoryProcessInstanceImpl -->
+ <many-to-one name="historyProcessInstance"
+ class="HistoryProcessInstanceImpl"
+ column="HPROCI_"
+ foreign-key="FK_HVAR_HPROCI"
+ index="IDX_HVAR_HPROCI" />
+
+ <!-- the foreign-key is set on the other side of the relation: see historyVariables above in HistoryTaskImpl -->
+ <many-to-one name="historyTask"
+ class="HistoryTaskImpl"
+ column="HTASK_"
+ foreign-key="FK_HVAR_HTASK"
+ index="IDX_HVAR_HTASK" />
+
+ <set name="details"
+ cascade="all">
+ <key foreign-key="none">
+ <column name="HVAR_" />
+ </key>
+ <one-to-many class="HistoryDetailImpl" />
+ </set>
+
+ </class>
+
+ <!-- ### HISTORY COMMENTS ################################################# -->
+ <class name="HistoryDetailImpl" table="JBPM4_HIST_DETAIL">
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+ <discriminator column="CLASS_" />
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="userId" column="USERID_" />
+ <property name="time" column="TIME_" />
+
+ <many-to-one name="historyProcessInstance"
+ class="HistoryProcessInstanceImpl"
+ column="HPROCI_"
+ foreign-key="FK_HDETAIL_HPROCI"
+ index="IDX_HDET_HPROCI" />
+ <property name="historyProcessInstanceIndex" column="HPROCIIDX_" />
+
+ <many-to-one name="historyActivityInstance"
+ class="HistoryActivityInstanceImpl"
+ column="HACTI_"
+ foreign-key="FK_HDETAIL_HACTI"
+ index="IDX_HDET_HACTI" />
+ <property name="historyActivityInstanceIndex" column="HACTIIDX_" />
+
+ <many-to-one name="historyTask"
+ class="HistoryTaskImpl"
+ column="HTASK_"
+ foreign-key="FK_HDETAIL_HTASK"
+ index="IDX_HDET_HTASK" />
+ <property name="historyTaskIndex" column="HTASKIDX_" />
+
+ <many-to-one name="historyVariable"
+ class="HistoryVariableImpl"
+ column="HVAR_"
+ foreign-key="FK_HDETAIL_HVAR"
+ index="IDX_HDET_HVAR" />
+ <property name="historyVariableIndex" column="HVARIDX_" />
+
+ <subclass name="HistoryCommentImpl" discriminator-value="comment">
+ <property name="message" column="MESSAGE_" type="text" />
+ <list name="replies"
+ cascade="all-delete-orphan"
+ inverse="false">
+ <key column="PARENT_" foreign-key="none" />
+ <list-index column="PARENT_IDX_" />
+ <one-to-many class="HistoryCommentImpl" />
+ </list>
+ </subclass>
+
+ <subclass name="HistoryProcessInstanceMigrationImpl" discriminator-value="instance-migration">
+ <property name="oldProcessDefinitionId" column="OLD_STR_" />
+ <property name="newProcessDefinitionId" column="NEW_STR_" />
+ </subclass>
+
+ <subclass name="HistoryPriorityUpdateImpl" discriminator-value="priority-update">
+ <property name="oldPriority" column="OLD_INT_" />
+ <property name="newPriority" column="NEW_INT_" />
+ </subclass>
+
+ <subclass name="HistoryTaskAssignmentImpl" discriminator-value="assignment">
+ <property name="oldAssignee" column="OLD_STR_" />
+ <property name="newAssignee" column="NEW_STR_" />
+ </subclass>
+
+ <subclass name="HistoryTaskDuedateUpdateImpl" discriminator-value="duedate-update">
+ <property name="oldDuedate" column="OLD_TIME_" type="timestamp" />
+ <property name="newDuedate" column="NEW_TIME_" type="timestamp" />
+ </subclass>
+
+ <subclass name="HistoryVariableUpdateImpl" discriminator-value="variable-update">
+ <property name="oldValue" column="OLD_STR_" />
+ <property name="newValue" column="NEW_STR_" />
+ </subclass>
+
+ </class>
+
+</hibernate-mapping>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.identity.cfg.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.identity.cfg.xml
new file mode 100644
index 0000000..ccf6b4e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.identity.cfg.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<jbpm-configuration>
+
+ <transaction-context>
+ <identity-session />
+ </transaction-context>
+
+</jbpm-configuration>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.identity.hbm.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.identity.hbm.xml
new file mode 100644
index 0000000..2dfc615
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.identity.hbm.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.jbpm.pvm.internal.identity.impl" default-access="field">
+
+ <!-- ### USER ########################################################### -->
+ <class name="UserImpl" table="JBPM4_ID_USER">
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="id" column="ID_" />
+ <property name="password" column="PASSWORD_" />
+ <property name="givenName" column="GIVENNAME_" />
+ <property name="familyName" column="FAMILYNAME_" />
+ <property name="businessEmail" column="BUSINESSEMAIL_" />
+ </class>
+
+ <!-- ### MEMBERSHIP ##################################################### -->
+ <class name="MembershipImpl" table="JBPM4_ID_MEMBERSHIP">
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+ <version name="dbversion" column="DBVERSION_" />
+
+ <many-to-one name="user"
+ column="USER_"
+ class="UserImpl"
+ foreign-key="FK_MEM_USER"
+ index="IDX_MEM_USER"/>
+
+ <many-to-one name="group"
+ column="GROUP_"
+ class="GroupImpl"
+ foreign-key="FK_MEM_GROUP"
+ index="IDX_MEM_GROUP"/>
+
+ <property name="role" column="NAME_" />
+ </class>
+
+ <!-- ### GROUP ########################################################### -->
+ <class name="GroupImpl" table="JBPM4_ID_GROUP">
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="id" column="ID_" />
+ <property name="name" column="NAME_" />
+ <property name="type" column="TYPE_" />
+
+ <many-to-one name="parent"
+ column="PARENT_"
+ class="GroupImpl"
+ foreign-key="FK_GROUP_PARENT"
+ index="IDX_GROUP_PARENT"/>
+ </class>
+
+</hibernate-mapping>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.jboss.idm.cfg.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.jboss.idm.cfg.xml
new file mode 100644
index 0000000..e6a793a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.jboss.idm.cfg.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<jbpm-configuration>
+
+ <process-engine-context>
+ <jboss-idm-identity-session-factory jndi="java:/IdentitySessionFactory" />
+ </process-engine-context>
+
+ <transaction-context>
+ <jboss-idm-identity-session realm="realm://JBossIdentity" />
+ </transaction-context>
+
+</jbpm-configuration>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.jbossremote.cfg.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.jbossremote.cfg.xml
new file mode 100644
index 0000000..0d50e1e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.jbossremote.cfg.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<jbpm-configuration>
+
+ <process-engine-context>
+
+ <repository-service />
+ <repository-cache />
+ <execution-service />
+ <history-service />
+ <management-service />
+ <task-service />
+ <identity-service />
+
+ <ejb-remote-command-service
+ initial-context-factory="org.jnp.interfaces.NamingContextFactory"
+ provider-url="jnp://localhost"
+ url-pkg-prefixes="org.jboss.naming:org.jnp.interfaces">
+ <retry-interceptor />
+ </ejb-remote-command-service>
+
+ </process-engine-context>
+
+</jbpm-configuration>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.jobexecutor.cfg.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.jobexecutor.cfg.xml
new file mode 100644
index 0000000..6ea2b8b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.jobexecutor.cfg.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<jbpm-configuration>
+
+ <process-engine-context>
+
+ <job-executor />
+
+ </process-engine-context>
+
+</jbpm-configuration>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.jpdl.bindings.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.jpdl.bindings.xml
new file mode 100644
index 0000000..1e1d2e8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.jpdl.bindings.xml
@@ -0,0 +1,35 @@
+<bindings>
+
+ <activity binding="org.jbpm.jpdl.internal.activity.StartBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.StateBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.DecisionBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.EndBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.EndCancelBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.EndErrorBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.ForkBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.JoinBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.HqlBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.SqlBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.JavaBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.ScriptBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.TaskBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.SubProcessBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.MailBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.GroupBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.CustomBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.AssignBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.PassthroughBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.RulesBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.RulesDecisionBinding" />
+ <activity binding="org.jbpm.jpdl.internal.activity.JmsBinding" />
+
+ <eventlistener binding="org.jbpm.jpdl.internal.activity.EventListenerBinding" />
+ <eventlistener binding="org.jbpm.jpdl.internal.activity.JavaBinding" />
+ <eventlistener binding="org.jbpm.jpdl.internal.activity.HqlBinding" />
+ <eventlistener binding="org.jbpm.jpdl.internal.activity.SqlBinding" />
+ <eventlistener binding="org.jbpm.jpdl.internal.activity.ScriptBinding" />
+ <eventlistener binding="org.jbpm.jpdl.internal.activity.MailBinding" />
+ <eventlistener binding="org.jbpm.jpdl.internal.activity.AssignBinding" />
+ <eventlistener binding="org.jbpm.jpdl.internal.activity.JmsBinding" />
+
+</bindings>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.jpdl.cfg.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.jpdl.cfg.xml
new file mode 100644
index 0000000..8aaad9a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.jpdl.cfg.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<jbpm-configuration>
+
+ <process-engine-context>
+
+ <deployer-manager>
+ <jpdl-deployer />
+ <object class="org.jbpm.pvm.internal.repository.RulesDeployer" />
+ </deployer-manager>
+
+ </process-engine-context>
+
+</jbpm-configuration>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.repository.hbm.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.repository.hbm.xml
new file mode 100644
index 0000000..df20d74
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.repository.hbm.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping default-access="field">
+
+ <!-- ### Deployment ##################################################### -->
+ <class name="org.jbpm.pvm.internal.repository.DeploymentImpl"
+ table="JBPM4_DEPLOYMENT">
+
+ <!-- ProcessElementImpl part ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+
+ <property name="name" type="text" column="NAME_" />
+ <property name="timestamp" column="TIMESTAMP_" />
+ <property name="state" column="STATE_" />
+
+ <map name="resources" cascade="all-delete-orphan">
+ <key foreign-key="FK_LOB_DEPLOYMENT">
+ <column name="DEPLOYMENT_" index="IDX_LOB_DEPLOYMENT" />
+ </key>
+ <map-key type="text" column="NAME_" />
+ <one-to-many class="org.jbpm.pvm.internal.lob.Lob"/>
+ </map>
+
+ <set name="objectProperties"
+ table="JBPM4_DEPLOYPROPS"
+ cascade="all-delete-orphan">
+ <key column="DEPLOYMENT_" />
+ <one-to-many class="org.jbpm.pvm.internal.repository.DeploymentProperty" />
+ </set>
+
+ </class>
+
+ <class name="org.jbpm.pvm.internal.repository.DeploymentProperty" table="JBPM4_DEPLOYPROP">
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+ <many-to-one name="deployment"
+ class="org.jbpm.pvm.internal.repository.DeploymentImpl"
+ column="DEPLOYMENT_"
+ foreign-key="FK_DEPLPROP_DEPL"
+ index="IDX_DEPLPROP_DEPL" />
+ <property name="objectName" column="OBJNAME_" />
+ <property name="key" column="KEY_" />
+ <property name="stringValue" column="STRINGVAL_" />
+ <property name="longValue" column="LONGVAL_" />
+ </class>
+
+ <class name="org.jbpm.pvm.internal.id.PropertyImpl" table="JBPM4_PROPERTY">
+ <id name="key" column="KEY_">
+ <generator class="assigned" />
+ </id>
+ <version name="version" column="VERSION_" />
+ <property name="value" column="VALUE_" />
+ </class>
+
+</hibernate-mapping>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.task.hbm.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.task.hbm.xml
new file mode 100644
index 0000000..c569968
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.task.hbm.xml
@@ -0,0 +1,139 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping auto-import="false" package="org.jbpm.pvm.internal.task" default-access="field">
+
+ <!-- ### TASK ########################################################### -->
+ <class name="TaskImpl"
+ table="JBPM4_TASK"
+ discriminator-value="T">
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+ <discriminator type="char" column="CLASS_"/>
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="name" column="NAME_"/>
+ <property name="description" column="DESCR_" type="text"/>
+ <property name="state" column="STATE_"/>
+ <property name="suspendHistoryState" column="SUSPHISTSTATE_" />
+ <property name="assignee" column="ASSIGNEE_"/>
+ <property name="formResourceName" column="FORM_"/>
+
+ <set name="participations" cascade="all-delete-orphan">
+ <key column="TASK_" />
+ <one-to-many class="ParticipationImpl" />
+ </set>
+
+ <property name="priority" column="PRIORITY_"/>
+ <property name="createTime" column="CREATE_"/>
+ <property name="duedate" column="DUEDATE_"/>
+ <property name="progress" column="PROGRESS_"/>
+ <property name="isSignalling" column="SIGNALLING_"/>
+
+ <property name="executionId" column="EXECUTION_ID_"/>
+ <property name="activityName" column="ACTIVITY_NAME_"/>
+
+ <property name="hasVariables" column="HASVARS_" />
+ <map name="variables"
+ cascade="all-delete-orphan">
+ <key foreign-key="FK_VAR_TASK">
+ <column name="TASK_" index="IDX_VAR_TASK"/>
+ </key>
+ <map-key type="string" column="KEY_" />
+ <one-to-many class="org.jbpm.pvm.internal.type.Variable" />
+ </map>
+
+ <many-to-one name="superTask"
+ class="TaskImpl"
+ column="SUPERTASK_"
+ foreign-key="FK_TASK_SUPERTASK"
+ index="IDX_TASK_SUPERTASK" />
+
+ <many-to-one name="execution"
+ class="org.jbpm.pvm.internal.model.ExecutionImpl"
+ column="EXECUTION_"
+ foreign-key="none" />
+
+ <many-to-one name="processInstance"
+ class="org.jbpm.pvm.internal.model.ExecutionImpl"
+ column="PROCINST_"
+ foreign-key="none" />
+
+ <many-to-one name="swimlane"
+ class="SwimlaneImpl"
+ column="SWIMLANE_"
+ foreign-key="FK_TASK_SWIML" />
+
+ <property name="taskDefinitionName" column="TASKDEFNAME_"/>
+
+ <set name="subTasks" cascade="all-delete-orphan">
+ <key column="SUPERTASK_" />
+ <one-to-many class="TaskImpl" />
+ </set>
+
+ </class>
+
+ <!-- ### PARTICIPANT #################################################### -->
+ <class name="ParticipationImpl" table="JBPM4_PARTICIPATION">
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="groupId" column="GROUPID_"/>
+ <property name="userId" column="USERID_"/>
+ <property name="type" column="TYPE_" />
+
+ <many-to-one name="task"
+ class="TaskImpl"
+ column="TASK_"
+ index="IDX_PART_TASK"
+ foreign-key="FK_PART_TASK" />
+
+ <many-to-one name="swimlane"
+ class="SwimlaneImpl"
+ column="SWIMLANE_"
+ foreign-key="FK_PART_SWIMLANE" />
+
+ </class>
+
+ <!-- ### SWIMLANE ####################################################### -->
+ <class name="SwimlaneImpl" table="JBPM4_SWIMLANE">
+ <id name="dbid" column="DBID_">
+ <generator class="assigned" />
+ </id>
+ <version name="dbversion" column="DBVERSION_" />
+
+ <property name="name" column="NAME_"/>
+ <property name="assignee" column="ASSIGNEE_"/>
+
+ <!-- many-to-one name="swimlaneDefinition"
+ class="SwimlaneDefinitionImpl"
+ column="SWIMLANEDEF_"
+ foreign-key="FK_SWIMLANE_DEF" / -->
+
+ <many-to-one name="execution"
+ class="org.jbpm.pvm.internal.model.ExecutionImpl"
+ column="EXECUTION_"
+ foreign-key="none" />
+
+ <set name="participations" cascade="all-delete-orphan">
+ <key column="SWIMLANE_" />
+ <one-to-many class="ParticipationImpl" />
+ </set>
+
+ </class>
+
+
+ <!-- ### QUERIES ######################################################## -->
+
+ <query name="findTasks">
+ <![CDATA[
+ select task
+ from org.jbpm.pvm.internal.task.TaskImpl as task
+ ]]>
+ </query>
+
+</hibernate-mapping>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.task.lifecycle.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.task.lifecycle.xml
new file mode 100644
index 0000000..42a7c28
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.task.lifecycle.xml
@@ -0,0 +1,13 @@
+<task-lifecycle initial="open">
+ <state name="open">
+ <transition name="complete" to="completed" />
+ <transition name="suspend" to="suspended" />
+ <transition name="cancel" to="cancelled" />
+ </state>
+ <state name="suspended">
+ <transition name="resume" to="open" />
+ <transition name="cancel" to="cancelled" />
+ </state>
+ <state name="cancelled" />
+ <state name="completed" />
+</task-lifecycle>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.tx.hibernate.cfg.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.tx.hibernate.cfg.xml
new file mode 100644
index 0000000..9c7978b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.tx.hibernate.cfg.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<jbpm-configuration>
+
+ <process-engine-context>
+
+ <command-service name="txRequiredCommandService">
+ <skip-interceptor />
+ <retry-interceptor />
+ <environment-interceptor />
+ <standard-transaction-interceptor />
+ </command-service>
+
+ <command-service name="newTxRequiredCommandService">
+ <retry-interceptor />
+ <environment-interceptor policy="requiresNew" />
+ <standard-transaction-interceptor />
+ </command-service>
+
+ <hibernate-configuration>
+ <cfg resource="jbpm.hibernate.cfg.xml" />
+ </hibernate-configuration>
+
+ <hibernate-session-factory />
+
+ </process-engine-context>
+
+ <transaction-context>
+ <transaction />
+ <hibernate-session />
+ </transaction-context>
+
+</jbpm-configuration>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.tx.jta.cfg.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.tx.jta.cfg.xml
new file mode 100644
index 0000000..a06cdba
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.tx.jta.cfg.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<jbpm-configuration>
+
+ <process-engine-context>
+ <command-service name="txRequiredCommandService">
+ <skip-interceptor />
+ <environment-interceptor />
+ <retry-interceptor type="jta" />
+ <jta-transaction-interceptor />
+ </command-service>
+
+ <command-service name="newTxRequiredCommandService">
+ <environment-interceptor policy="requiresNew" />
+ <retry-interceptor type="jta" />
+ <jta-transaction-interceptor policy="requiresNew" />
+ </command-service>
+
+ <command-service>
+ <environment-interceptor />
+ </command-service>
+
+ <hibernate-configuration>
+ <cfg resource="jbpm.hibernate.cfg.xml" />
+ </hibernate-configuration>
+
+ <hibernate-session-factory />
+
+ </process-engine-context>
+
+ <transaction-context>
+ <transaction type="jta" />
+ <hibernate-session current="true" />
+ </transaction-context>
+
+</jbpm-configuration>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.tx.spring.cfg.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.tx.spring.cfg.xml
new file mode 100644
index 0000000..be5c465
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.tx.spring.cfg.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<jbpm-configuration spring="enabled">
+
+ <process-engine-context>
+
+ <command-service name="newTxRequiredCommandService">
+ <retry-interceptor />
+ <environment-interceptor policy="requiresNew" />
+ <spring-transaction-interceptor policy="requiresNew" />
+ </command-service>
+
+ <!-- Default command service has a Spring transaction interceptor-->
+ <command-service name="txRequiredCommandService">
+ <retry-interceptor />
+ <environment-interceptor />
+ <spring-transaction-interceptor />
+ </command-service>
+
+ </process-engine-context>
+
+ <transaction-context>
+ <transaction type="spring" />
+ <hibernate-session current="true" />
+ </transaction-context>
+
+</jbpm-configuration>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.variable.types.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.variable.types.xml
new file mode 100644
index 0000000..da904b1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.variable.types.xml
@@ -0,0 +1,34 @@
+<types>
+
+ <!-- types stored in a native column -->
+ <type name="string" class="java.lang.String" variable-class="org.jbpm.pvm.internal.type.variable.StringVariable" />
+ <type name="long" class="java.lang.Long" variable-class="org.jbpm.pvm.internal.type.variable.LongVariable" />
+ <type name="double" class="java.lang.Double" variable-class="org.jbpm.pvm.internal.type.variable.DoubleVariable" />
+
+ <!-- types converted to a string -->
+ <type name="date" class="java.util.Date" converter="org.jbpm.pvm.internal.type.converter.DateToStringConverter" variable-class="org.jbpm.pvm.internal.type.variable.StringVariable" />
+ <type name="boolean" class="java.lang.Boolean" converter="org.jbpm.pvm.internal.type.converter.BooleanToStringConverter" variable-class="org.jbpm.pvm.internal.type.variable.StringVariable" />
+ <type name="char" class="java.lang.Character" converter="org.jbpm.pvm.internal.type.converter.CharacterToStringConverter" variable-class="org.jbpm.pvm.internal.type.variable.StringVariable" />
+
+ <!-- types converted to a long -->
+ <type name="byte" class="java.lang.Byte" converter="org.jbpm.pvm.internal.type.converter.ByteToLongConverter" variable-class="org.jbpm.pvm.internal.type.variable.LongVariable" />
+ <type name="short" class="java.lang.Short" converter="org.jbpm.pvm.internal.type.converter.ShortToLongConverter" variable-class="org.jbpm.pvm.internal.type.variable.LongVariable" />
+ <type name="integer" class="java.lang.Integer" converter="org.jbpm.pvm.internal.type.converter.IntegerToLongConverter" variable-class="org.jbpm.pvm.internal.type.variable.LongVariable" />
+
+ <!-- types converted to a double -->
+ <type name="float" class="java.lang.Float" converter="org.jbpm.pvm.internal.type.converter.FloatToDoubleConverter" variable-class="org.jbpm.pvm.internal.type.variable.DoubleVariable" />
+
+ <!-- byte[] and char[] -->
+ <type name="byte[]" class="[B" variable-class="org.jbpm.pvm.internal.type.variable.BlobVariable" />
+ <type name="char[]" class="[C" variable-class="org.jbpm.pvm.internal.type.variable.TextVariable" />
+
+ <type name="hibernate-long-id" class="hibernatable" id-type="long" variable-class="org.jbpm.pvm.internal.type.variable.HibernateLongVariable" />
+ <type name="hibernate-string-id" class="hibernatable" id-type="string" variable-class="org.jbpm.pvm.internal.type.variable.HibernateStringVariable" />
+
+ <type name="serializable" class="serializable" converter="org.jbpm.pvm.internal.type.converter.SerializableToBytesConverter" variable-class="org.jbpm.pvm.internal.type.variable.BlobVariable" />
+
+ <!-- TODO: add ejb3 entity bean support -->
+ <!-- TODO: add JCR activity support -->
+ <!-- TODO: add collection support -->
+
+</types>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jbpm.wire.bindings.xml b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.wire.bindings.xml
new file mode 100644
index 0000000..f8603f6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jbpm.wire.bindings.xml
@@ -0,0 +1,101 @@
+<wire-bindings>
+
+ <!-- ########################### -->
+ <!-- ### Descriptor bindings ### -->
+ <!-- ########################### -->
+ <!-- basic types -->
+ <binding class="org.jbpm.pvm.internal.wire.binding.TrueBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.FalseBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.CharBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.DoubleBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.FloatBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.IntBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.ShortBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.ByteBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.LongBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.StringBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.NullBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.ClassBinding" />
+ <!-- object and ref -->
+ <binding class="org.jbpm.pvm.internal.wire.binding.ObjectBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.RefBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.JndiBinding" />
+ <!-- collections -->
+ <binding class="org.jbpm.pvm.internal.wire.binding.ListBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.SetBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.MapBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.PropertiesBinding" />
+ <!-- environment refs -->
+ <binding class="org.jbpm.pvm.internal.wire.binding.ProcessEngineRefBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.EnvRefBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.EnvBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.ContextRefBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.TransactionRefBinding" />
+ <!-- various specials -->
+ <binding class="org.jbpm.pvm.internal.wire.binding.TransactionBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.JobExecutorBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.JobTestHelperBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.ScriptManagerBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.BusinessCalendarBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.IdComposerBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.MailTemplateBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.AddressResolverBinding"/>
+ <!-- hibernate bindings -->
+ <binding class="org.jbpm.pvm.internal.wire.binding.HibernateConfigurationBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.SeamHibernateSessionBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.HibernateSessionBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.HibernateSessionFactoryBinding" />
+ <!-- sessions -->
+ <binding class="org.jbpm.pvm.internal.wire.binding.DbSessionBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.MessageSessionBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.TimerSessionBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.HistorySessionsBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.IdentitySessionBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.JbossIdmIdentitySessionFactoryBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.JbossIdmIdentitySessionBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.RepositorySessionBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.MailSessionBinding" />
+
+ <!-- dynamic type mapping configuration -->
+ <binding class="org.jbpm.pvm.internal.wire.binding.TypesBinding" />
+ <!-- services -->
+ <binding class="org.jbpm.pvm.internal.wire.binding.CommandServiceBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.ExecutionServiceBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.ManagementServiceBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.IdentityServiceBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.HistoryServiceBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.TaskServiceBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.RepositoryServiceBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.RepositoryCacheBinding" />
+
+ <!-- deployers -->
+ <binding class="org.jbpm.pvm.internal.wire.binding.DeployerManagerBinding" />
+
+ <!-- interceptors -->
+ <binding class="org.jbpm.pvm.internal.wire.binding.SkipInterceptorBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.EnvironmentInterceptorBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.AuthorizationInterceptorBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.RetryInterceptorBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.StandardTransactionInterceptorBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.SerializeInterceptorBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.JtaTransactionInterceptorBinding" />
+
+ <!-- operation -->
+ <binding class="org.jbpm.pvm.internal.wire.binding.PropertyBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.FieldBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.InvokeBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.SubscribeBinding" />
+ <binding class="org.jbpm.pvm.internal.wire.binding.EnlistBinding" />
+
+ <!-- enterprise bindings -->
+ <binding class="org.jbpm.enterprise.internal.wire.binding.EjbTimerSessionBinding" />
+ <binding class="org.jbpm.enterprise.internal.wire.binding.EjbLocalCommandServiceBinding" />
+ <binding class="org.jbpm.enterprise.internal.wire.binding.EjbRemoteCommandServiceBinding" />
+
+ <!-- jpdl bindings -->
+ <binding class="org.jbpm.jpdl.internal.xml.JpdlDeployerBinding" />
+
+ <!-- spring bindings -->
+ <binding class="org.jbpm.pvm.internal.wire.binding.SpringTransactionInterceptorBinding" />
+
+</wire-bindings>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jpdl-4.0.xsd b/Source/ThirdPart/jbpm.4.3.2/src/jpdl-4.0.xsd
new file mode 100644
index 0000000..c9ccc65
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jpdl-4.0.xsd
@@ -0,0 +1,1196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://jbpm.org/4.0/jpdl"
+ xmlns:tns="http://jbpm.org/4.0/jpdl"
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified">
+
+ <annotation>
+ <documentation>Schema for jPDL 4 process descriptions;
+ element process is the top level element.
+
+ TODO: Add activity pluggability. (add the proper any's and
+ anyAttributes)
+
+ TODO: Pull up expression. The expression element in the
+ delegation group can be pulled up as an expression
+ attribute in each use case of the delegationGroup
+
+ TODO: Investigate if object-refs to centrally defined objects would
+ add value over inline defined objects.
+ </documentation>
+ </annotation>
+
+ <!-- ### PROCESS DEFINITION ############################################# -->
+
+ <element name="process">
+ <annotation><documentation>A jPDL process definition description; This
+ is the top level element in a jPDL process file.</documentation></annotation>
+ <complexType>
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <element name="description" minOccurs="0" maxOccurs="unbounded" type="string" />
+ <element ref="tns:swimlane" minOccurs="0" maxOccurs="unbounded" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:timer" minOccurs="0" maxOccurs="unbounded"/>
+ <group ref="tns:activityGroup" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attribute name="name" use="required" type="string">
+ <annotation>
+ <documentation>
+ The process name. Multiple processes can be deployed with the same name, as long as they have a different
+ version.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="key" type="string">
+ <annotation>
+ <documentation>
+ The key can be used to provide a short acronym that will replace the name as the basis for the generated
+ process definition id
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="version" type="int">
+ <annotation>
+ <documentation>
+ Indicates the sequence number of this version for all processes with the same name. By specifying a version
+ automatic deployment can figure out if this process is already deployed or not.
+ </documentation>
+ </annotation>
+ </attribute>
+ <anyAttribute processContents="skip">
+ <annotation><documentation>for extensibility
+ </documentation></annotation>
+ </anyAttribute>
+ </complexType>
+ </element>
+
+ <!-- ### ACTIVITIES ##################################################### -->
+
+ <group name="activityGroup">
+ <choice>
+ <!-- ~~~ START ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="start">
+ <annotation><documentation>Start event
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="form" type="string">
+ <annotation><documentation>the resource name of the form in the
+ deployment.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <!-- ~~~ END ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="end">
+ <annotation><documentation>End event.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="ends" default="process-instance">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="execution"/>
+ <enumeration value="process-instance"/>
+ </restriction>
+ </simpleType>
+ </attribute>
+ <attribute name="state" default="ended" type="string">
+ <annotation><documentation>sets the state of the execution explicitely</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="end-cancel">
+ <annotation><documentation>End cancel event.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="ends" default="process-instance">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="execution"/>
+ <enumeration value="process-instance"/>
+ </restriction>
+ </simpleType>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="end-error">
+ <annotation><documentation>End cancel event.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="ends" default="process-instance">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="execution"/>
+ <enumeration value="process-instance"/>
+ </restriction>
+ </simpleType>
+ </attribute>
+ </complexType>
+ </element>
+
+ <!-- ~~~ STATE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="state">
+ <annotation><documentation>A wait state. When an execution arrives in this
+ activity, the execution will wait until an external trigger is received
+ with execution.signal() or execution.getActivityInstance().signal()
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="transition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <complexContent>
+ <extension base="tns:transitionType">
+ <sequence>
+ <element ref="tns:timer" minOccurs="0" />
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </complexType>
+ </element>
+
+ <!-- ~~~ DECISION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="decision">
+ <annotation><documentation>Decision gateway: selects one path out of many alternatives.
+ When an execution comes in, exactly one outgoing transition is taken.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="handler" minOccurs="0" type="tns:wireObjectType" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="transition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <complexContent>
+ <extension base="tns:transitionType">
+ <sequence>
+ <element name="condition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <attribute name="expr" type="string">
+ <annotation><documentation>The script text that will be evaluated.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>Identification of the scripting language
+ to use.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ <!-- TODO add conditions -->
+ </element>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="expr" type="string">
+ <annotation><documentation>The script that will be evaluated and resolve to
+ the name of the outgoing transition.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>Identification of the scripting language
+ to use for the expr attribute.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <!-- ~~~ FORK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="fork">
+ <annotation><documentation>Spawns multiple concurrent paths of
+ execution.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </complexType>
+ </element>
+
+ <!-- ~~~ JOIN ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="join">
+ <annotation><documentation>Spawns multiple concurrent paths of
+ execution.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="multiplicity" type="int" />
+ <attribute name="lockmode" default="upgrade">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="none"/>
+ <enumeration value="read"/>
+ <enumeration value="upgrade"/>
+ <enumeration value="upgrade_nowait"/>
+ <enumeration value="write"/>
+ </restriction>
+ </simpleType>
+ </attribute>
+ </complexType>
+ </element>
+
+ <!-- ~~~ SCRIPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="script">
+ <annotation><documentation>Evaluates a piece of text as a script
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:scriptType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ HQL ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="hql">
+ <annotation><documentation>Performs a hibernate query
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:qlType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ SQL ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="sql">
+ <annotation><documentation>Performs a hibernate SQL query
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:qlType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ MAIL ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="mail">
+ <annotation><documentation>Sends an email
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:mailType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ JAVA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="java">
+ <annotation><documentation>Invokes a method on a java object.
+ Either the java class is instantiated with reflection, or the
+ java object is fetched from the environment. Then values from the
+ environment are injected into the fields and a method is executed.
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:javaType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ CUSTOM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="custom">
+ <annotation><documentation>Uses a user defined, custom implementation of
+ ActivityBehaviour
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:wireObjectType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ TASK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="task">
+ <annotation><documentation>Creates a task in the task component.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="assignment-handler" minOccurs="0" type="tns:wireObjectType" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="notification" minOccurs="0">
+ <complexType>
+ <attribute name="continue" type="tns:continueType" default="sync" />
+ <attribute name="template" type="tns:templateType" use="optional" />
+ </complexType>
+ </element>
+ <element name="reminder" minOccurs="0">
+ <complexType>
+ <attribute name="duedate" type="string" />
+ <attribute name="repeat" type="string" />
+ <attribute name="continue" type="tns:continueType" default="sync" />
+ <attribute name="template" type="tns:templateType" use="optional"/>
+ </complexType>
+ </element>
+ <element ref="tns:timer" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="transition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <complexContent>
+ <extension base="tns:transitionType">
+ <sequence>
+ <element ref="tns:timer" minOccurs="0" />
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attributeGroup ref="tns:assignmentAttributes"/>
+ <attribute name="swimlane" type="string" />
+ <attribute name="form" type="string">
+ <annotation><documentation>the resource name of the form in the
+ deployment.</documentation></annotation>
+ </attribute>
+ <attribute name="duedate" type="string" />
+ <attribute name="on-transition" default="cancel">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="keep"/>
+ <enumeration value="cancel"/>
+ </restriction>
+ </simpleType>
+ </attribute>
+ <attribute name="completion" type="string" default="complete" />
+ </complexType>
+ </element>
+
+ <!-- ~~~ SUB-PROCESS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="sub-process">
+ <annotation><documentation>Waits while a sub process instance is
+ being executed and continues when the sub process instance ends.
+ </documentation></annotation>
+ <complexType>
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <element name="parameter-in" type="tns:parameterType" minOccurs="0" maxOccurs="unbounded" />
+ <element name="parameter-out" type="tns:parameterType" minOccurs="0" maxOccurs="unbounded" />
+ <element ref="tns:timer" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>Events on which listeners can be registered.</documentation></annotation>
+ </element>
+ <element name="swimlane-mapping" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <attribute name="swimlane" type="string" use="required" />
+ <attribute name="sub-swimlane" type="string" use="required" />
+ </complexType>
+ </element>
+ <element name="transition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <complexContent>
+ <extension base="tns:transitionType">
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <element name="outcome-value">
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ </sequence>
+ <attribute name="sub-process-id" type="string">
+ <annotation><documentation>Identifies the sub process by the id. This means that a specific
+ version of a process definition is referenced
+ </documentation></annotation>
+ </attribute>
+ <attribute name="sub-process-key" type="string">
+ <annotation><documentation>Identifies the sub process by the key. This means that the latest
+ version of the process definition with the given key is referenced. The latest version
+ of the process is looked up each time the activity executes.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="outcome" type="string">
+ <annotation><documentation>Expression that is evaluated when the sub process
+ instance ends. The value is then used for outcome transition mapping.
+ </documentation></annotation>
+ </attribute>
+ <attributeGroup ref="tns:activityAttributes" />
+ </complexType>
+ </element>
+
+ <!-- ~~~ group ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="group">
+ <annotation><documentation>Scope enclosing a number of activities.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <group ref="tns:activityGroup" minOccurs="0" maxOccurs="unbounded" />
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>Events on which listeners can be registered.</documentation></annotation>
+ </element>
+ <element ref="tns:timer" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </complexType>
+ </element>
+ </choice>
+ </group>
+
+ <group name="wireObjectGroup">
+ <choice>
+ <!-- SPECIAL OBJECTS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <element name="null">
+ <annotation><documentation>the null value
+ </documentation></annotation>
+ </element>
+ <element name="ref">
+ <annotation><documentation>A reference to an object in the current environment</documentation></annotation>
+ <complexType>
+ <attribute name="object" type="string" use="required">
+ <annotation><documentation>The name of the referred object</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ <element name="env-ref">
+ <annotation><documentation>The current environment.
+ </documentation></annotation>
+ </element>
+ <element name="jndi">
+ <annotation><documentation>A lookup from JNDI through the InitialContext
+ </documentation></annotation>
+ <complexType>
+ <attribute name="jndi-name" type="string" use="required" />
+ </complexType>
+ </element>
+
+ <!-- COLLECTIONS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <element name="list">
+ <annotation><documentation>A java.util.List</documentation></annotation>
+ <complexType>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <group ref="tns:wireObjectGroup" />
+ </choice>
+ <attribute name="class" type="string" default="java.util.ArrayList">
+ <annotation><documentation>Implementation class for this list.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="synchronized" type="tns:booleanValueType" default="false">
+ <annotation><documentation>Indicates if this collection should be synchronized
+ with Collections.synchronizedList(List)</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="map">
+ <annotation><documentation>A java.util.Map</documentation></annotation>
+ <complexType>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="entry">
+ <complexType>
+ <choice minOccurs="0">
+ <element name="key" minOccurs="0">
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ </complexType>
+ </element>
+ <element name="value" minOccurs="0">
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ </complexType>
+ </element>
+ </choice>
+ </complexType>
+ </element>
+ </choice>
+ <attribute name="class" type="string" default="java.util.HashMap">
+ <annotation><documentation>Implementation class for this map.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="synchronized" type="tns:booleanValueType" default="false">
+ <annotation><documentation>Indicates if this collection should be synchronized
+ with Collections.synchronizedList(List)</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="set">
+ <annotation><documentation>A java.util.Set
+ </documentation></annotation>
+ <complexType>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <group ref="tns:wireObjectGroup" />
+ </choice>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="class" type="string" default="java.util.HashList">
+ <annotation><documentation>Implementation class for this set.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="synchronized" type="tns:booleanValueType" default="false">
+ <annotation><documentation>Indicates if this collection should be synchronized
+ with Collections.synchronizedSet(Set)</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="properties">
+ <annotation><documentation>A java.util.Properties</documentation></annotation>
+ <complexType>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="property">
+ <complexType>
+ <attribute name="name" type="string" use="required" />
+ <attribute name="value" type="string" use="required" />
+ </complexType>
+ </element>
+ </choice>
+ <attribute name="file" type="string">
+ <annotation><documentation>A file on the file system</documentation></annotation>
+ </attribute>
+ <attribute name="resource" type="string">
+ <annotation><documentation>A file as a resource in the classpath</documentation></annotation>
+ </attribute>
+ <attribute name="url" type="string">
+ <annotation><documentation>the contents is fetched by loading a url</documentation></annotation>
+ </attribute>
+ <attribute name="is-xml" type="tns:booleanValueType">
+ <annotation><documentation>optionally indicates if the content of referenced file in attributes
+ 'file', 'resource' or 'url' is XML. The default is the
+ plain properties format with a space or the equals character (=) separating key and value on
+ each line.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <!-- OBJECT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <element name="object" type="tns:wireObjectType" />
+
+ <!-- BASIC TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <element name="string">
+ <complexType>
+ <attribute name="name">
+ <annotation><documentation>the name of the string object</documentation></annotation>
+ </attribute>
+ <attribute name="value">
+ <annotation><documentation>the actual string value</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="byte">
+ <annotation><documentation>A java.lang.Byte</documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="byte" use="required" />
+ </complexType>
+ </element>
+ <element name="char">
+ <annotation><documentation>A java.lang.Character</documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" use="required">
+ <simpleType>
+ <restriction base="string">
+ <maxLength value="1" />
+ </restriction>
+ </simpleType>
+ </attribute>
+ </complexType>
+ </element>
+ <element name="double">
+ <annotation><documentation>A java.lang.Double</documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="double" use="required" />
+ </complexType>
+ </element>
+ <element name="false">
+ <annotation><documentation>java.lang.Boolean.FALSE
+ </documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ <element name="float">
+ <annotation><documentation>A java.lang.Float
+ </documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="float" use="required" />
+ </complexType>
+ </element>
+ <element name="int">
+ <annotation><documentation>A java.lang.Integer
+ </documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="int" use="required"/>
+ </complexType>
+ </element>
+ <element name="long">
+ <annotation><documentation>A java.lang.Long</documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="long" use="required"/>
+ </complexType>
+ </element>
+ <element name="short">
+ <annotation><documentation>a java.lang.Short
+ </documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="short" use="required"/>
+ </complexType>
+ </element>
+ <element name="true">
+ <annotation><documentation>java.lang.Boolean.TRUE
+ </documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+
+ </choice>
+ </group>
+
+ <complexType name="wireObjectType">
+ <annotation><documentation>Any java object that will be created by reflection. .
+ <p>There are three main ways to create an object: by constructor or by a factory
+ object or a static factory method.</p>
+ <p><b>Using the constructor</b>: Then the <code>class</code> attribute must provide the
+ fully qualified class name. In case another constructor then the default is
+ targetted, a <code>constructor</code> child element can be provided.
+ The <code>factory</code> attribute should not be provided for using a constructor.
+ </p>
+ <p><b>Using a factory</b>: Then the <code>factory</code> attribute or one
+ <code>factory</code> element must be provided along with the attribute
+ <code>method</code>.
+ </p>
+ <p><b>Using a static factory method</b>: Then the <code>class</code> and
+ <code>method</code> attributes should be specified. There should be no
+ reference to a <code>factory</code> attribute of element.
+ </p>
+ <p><b>Construction and initialization</b>: all objects (constructor and factory)
+ are build in two phases: construction and initialisation phase. During construction
+ all is done until a pointer is obtained to the object. In initialisation, operations
+ are applied to the object until it is ready to be used. The separation between
+ construction and initialisation is made to allow for bidirectional references. In
+ that case, at least one of both ends can not be fully initialised before it is injected
+ into the other end.
+ </p>
+ <p><b>Operations</b>: after construction, various operations can be applied to objects
+ like e.g. direct field injection, injection through setters, method invocation,
+ enlist with the standard transaction, subscribe the object as a listener to an observable
+ </p>
+ <p><b>Arguments</b>: There are two different places for arguments. The <code>arg</code>
+ elements for the factory method invocation should be placed as child elements under the
+ <code>object</code> element. The <code>arg</code> elements for the constructor should be
+ placed as child elements under the <code>constructor</code> element.
+ </p>
+ </documentation></annotation>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="factory">
+ <annotation><documentation>Contains one element that describes the factory object.</documentation></annotation>
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ </complexType>
+ </element>
+ <element name="constructor">
+ <annotation><documentation>Specifies the arguments to use for a non-default constructor.</documentation></annotation>
+ <complexType>
+ <choice maxOccurs="unbounded">
+ <element name="arg" type="tns:argType" />
+ </choice>
+ </complexType>
+ </element>
+ <element name="arg" type="tns:argType">
+ <annotation><documentation>The factory method arguments.</documentation></annotation>
+ </element>
+ <element name="field">
+ <annotation><documentation>Injects a value into a member field of this object.
+ Exactly one child element must specify the value.
+ </documentation></annotation>
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ <attribute name="name">
+ <annotation><documentation>The member field name</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ <element name="property">
+ <annotation><documentation>Injects a value through a setter method.
+ Exactly one child element must specify the value.
+ </documentation></annotation>
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ <attribute name="name">
+ <annotation><documentation>The name of the property (without the 'set' prefix)</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ <element name="invoke">
+ <annotation><documentation>Invokes a method</documentation></annotation>
+ <complexType>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="arg" type="tns:argType" />
+ </choice>
+ <attribute name="method" type="string" use="required">
+ <annotation><documentation>the method name</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ </choice>
+ <attribute name="class" type="string">
+ <annotation><documentation>The fully qualified class name</documentation></annotation>
+ </attribute>
+ <attribute name="expr" type="string">
+ <annotation><documentation>The class to instantiate.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>The class to instantiate.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="factory" type="string">
+ <annotation><documentation>The name of the factory object</documentation></annotation>
+ </attribute>
+ <attribute name="method" type="string">
+ <annotation><documentation>The factory method name</documentation></annotation>
+ </attribute>
+ <attribute name="auto-wire" type="string">
+ <annotation><documentation>Indicates if the member fields and setter properties
+ should be automatically wired based on matching the property names and types with the
+ object names and types</documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <complexType name="argType">
+ <annotation><documentation>The method arguments.
+ Each 'arg' element should have exactly one child element
+ that represents the value of the argument.
+ </documentation></annotation>
+ <attribute name="type" type="string">
+ <annotation><documentation>The java class name representing
+ the type of the method. This is optional and can be used to
+ indicate the appropriate method in case of method overloading.
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <complexType name="javaType">
+ <sequence>
+ <element name="field" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>Field injections from the environment
+ invocation.</documentation></annotation>
+ </element>
+ <element name="arg" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>Method arguments.</documentation></annotation>
+ </element>
+ </sequence>
+ <attribute name="object" type="string">
+ <annotation><documentation>Name of the object in the environment
+ </documentation></annotation>
+ </attribute>
+ <attribute name="method" type="string" use="required">
+ <annotation><documentation>The name of the method to invoke.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="class" type="string">
+ <annotation><documentation>The class to instantiate.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="expr" type="string">
+ <annotation><documentation>Expression that resolves to the target object
+ on which the method should be invoked.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>The language in which attribute 'expr' is to be
+ resolved.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="var" type="string">
+ <annotation><documentation>The variable name to store the return value
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <complexType name="scriptType">
+ <sequence>
+ <element name="text" type="string" minOccurs="0">
+ <annotation><documentation>The content of this expression element
+ is the script text that will be evaluated. This is mutually
+ exclusive with the expression attribute.</documentation></annotation>
+ </element>
+ </sequence>
+ <attribute name="expr" type="string">
+ <annotation><documentation>The script text that will be evaluated. This
+ is mutually exclusive with the expression element.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>Identification of the scripting language
+ to use.</documentation></annotation>
+ </attribute>
+ <attribute name="var" type="string">
+ <annotation><documentation>Name of the variable in which the result
+ of the script evaluation will be stored</documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <complexType name="qlType">
+ <sequence>
+ <element name="query" type="string">
+ <annotation><documentation>The query text.</documentation></annotation>
+ </element>
+ <element name="parameters" minOccurs="0">
+ <annotation><documentation>Query parameters.</documentation></annotation>
+ <complexType>
+ <sequence>
+ <group ref="tns:wireObjectGroup" maxOccurs="unbounded" />
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ <attribute name="var" type="string">
+ <annotation><documentation>Name of the variable in which the result
+ of the script evaluation will be stored</documentation></annotation>
+ </attribute>
+ <attribute name="unique" type="string">
+ <annotation><documentation>Does this query return a unique result or a list
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <attributeGroup name="activityAttributes">
+ <attribute name="name" type="string">
+ <annotation><documentation>The id of this activity. The name should be unique
+ in the complete scope of the process.</documentation></annotation>
+ </attribute>
+ <attribute name="g" type="string">
+ <annotation><documentation>Graphical information used by process designer tool.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="continue" default="sync" type="tns:continueType">
+ <annotation><documentation>To specify async continuations.
+ sync is the default.
+ </documentation></annotation>
+ </attribute>
+ </attributeGroup>
+
+ <simpleType name="continueType">
+ <restriction base="string">
+ <enumeration value="async" />
+ <enumeration value="sync" />
+ <enumeration value="exclusive" />
+ </restriction>
+ </simpleType>
+
+
+ <attributeGroup name="assignmentAttributes">
+ <annotation><documentation>the assignment attributes will be used in
+ tasks and swimlanes to specify to whom these respectively are assigned.
+ </documentation></annotation>
+ <attribute name="assignee" type="string">
+ <annotation><documentation>Expression that resolves to a userId referencing
+ the person to which the task or swimlane will be assigned.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="assignee-lang" type="string">
+ <annotation><documentation>Expression language for the assignee attribute.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="candidate-users" type="string">
+ <annotation><documentation>Expression that resolves to a comma separated
+ list of userId's. All the referred people will be candidates for
+ take the task or swimlane.</documentation></annotation>
+ </attribute>
+ <attribute name="candidate-users-lang" type="string">
+ <annotation><documentation>Expression language for the
+ candidate-users attribute.</documentation></annotation>
+ </attribute>
+ <attribute name="candidate-groups" type="string">
+ <annotation><documentation>Resolves to a comma separated list of groupId's.
+ All the referred people will be candidates to
+ take the task or swimlane.</documentation></annotation>
+ </attribute>
+ <attribute name="candidate-groups-lang" type="string">
+ <annotation><documentation>Expression language for the
+ candidate-groups attribute.</documentation></annotation>
+ </attribute>
+ </attributeGroup>
+
+ <element name="swimlane">
+ <annotation><documentation>A process role.</documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string" use="required" />
+ <attributeGroup ref="tns:assignmentAttributes" />
+ </complexType>
+ </element>
+
+ <complexType name="transitionType">
+ <annotation><documentation>The outgoing transitions. The first in the list
+ will be the default outgoing transition.
+ </documentation></annotation>
+ <sequence>
+ <group ref="tns:eventListenerGroup" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attribute name="name" type="string">
+ <annotation><documentation>Name of this outgoing transition</documentation></annotation>
+ </attribute>
+ <attribute name="to" type="string">
+ <annotation><documentation>Name of the destination activity of this transition.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="g" type="string">
+ <annotation><documentation>Graphical information used by process designer tool.
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <element name="transition" type="tns:transitionType">
+ <annotation><documentation>A transition from one activity to another.</documentation></annotation>
+ </element>
+
+ <element name="on">
+ <complexType>
+ <sequence>
+ <element ref="tns:timer" minOccurs="0" />
+ <group ref="tns:eventListenerGroup" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>A list of event listeners that will
+ be notified when the event is fired</documentation></annotation>
+ </group>
+ </sequence>
+ <attribute name="event" type="string">
+ <annotation><documentation>The event identification. start, end, take or
+ any other custom event.
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <complexType name="parameterType">
+ <attribute name="subvar" type="string">
+ <annotation><documentation>The name of the sub process variable.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="expr" type="string">
+ <annotation><documentation>An expression for which the resulting
+ value will be used as value.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>Language of the expression.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="var" type="string">
+ <annotation><documentation>Name of the process variable
+ in the super process execution..
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+
+
+ <element name="timer">
+ <complexType>
+ <sequence>
+ <group ref="tns:eventListenerGroup" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>A list of event listeners that will
+ be notified when the timer fires</documentation></annotation>
+ </group>
+ </sequence>
+ <attribute name="duedate" type="string">
+ <annotation><documentation>Timer duedate expression that defines the duedate of this
+ timer relative to the creation time of the timer. E.g. '2 hours' or '4 business days'
+ </documentation></annotation>
+ </attribute>
+ <attribute name="repeat" type="string">
+ <annotation><documentation>Timer duedate expression that defines repeated scheduling
+ relative to the last timer fire event. E.g. '2 hours' or '4 business days'
+ </documentation></annotation>
+ </attribute>
+ <attribute name="duedatetime" type="string">
+ <annotation><documentation>Absolute time in format <code>HH:mm dd/MM/yyyy</code>
+ (see SimpleDateFormat). The format for the absolute time can be customized in the
+ jbpm configuration.
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <group name="eventListenerGroup">
+ <choice>
+ <element name="event-listener" type="tns:wireObjectType" />
+ <element name="hql" type="tns:qlType" />
+ <element name="sql" type="tns:qlType" />
+ <element name="java" type="tns:javaType" />
+ <element name="script" type="tns:scriptType" />
+ <element name="mail" type="tns:mailType" />
+ </choice>
+ </group>
+
+ <complexType name="mailType">
+ <sequence>
+ <element name="from" type="tns:mailRecipientType" minOccurs="0" />
+ <element name="to" type="tns:mailRecipientType" minOccurs="0" />
+ <element name="cc" type="tns:mailRecipientType" minOccurs="0" />
+ <element name="bcc" type="tns:mailRecipientType" minOccurs="0" />
+ <element name="subject" type="string" minOccurs="0" />
+ <element name="text" type="string" minOccurs="0" />
+ <element name="html" type="string" minOccurs="0" />
+ <element name="attachments" minOccurs="0" >
+ <complexType>
+ <sequence>
+ <element name="attachment" maxOccurs="unbounded">
+ <complexType>
+ <attribute name="url" type="string">
+ <annotation><documentation>URL reference to the attachment</documentation></annotation>
+ </attribute>
+ <attribute name="resource" type="string">
+ <annotation><documentation>Name of the attachment resource on the classpath</documentation></annotation>
+ </attribute>
+ <attribute name="file" type="string">
+ <annotation><documentation>File reference to the attachment</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ <attribute name="template" type="tns:templateType" />
+ </complexType>
+
+ <complexType name="mailRecipientType">
+ <attribute name="addresses" type="string">
+ <annotation><documentation>list of email address separated by ',' (comma) ';' (semicolon) '|' or whitespace</documentation></annotation>
+ </attribute>
+ <attribute name="users" type="string">
+ <annotation><documentation>list of user ids that are resolved to the email address against configured identity component.
+ user ids should be separated by ',' (comma) ';' (semicolon) '|' or whitespace</documentation></annotation>
+ </attribute>
+ <attribute name="groups" type="string">
+ <annotation><documentation>list of group ids that are resolved to the email address against configured identity component.
+ group ids should be separated by ',' (comma) ';' (semicolon) '|' or whitespace</documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <simpleType name="booleanValueType">
+ <restriction base="string">
+ <enumeration value="true" />
+ <enumeration value="on" />
+ <enumeration value="enabled" />
+ <enumeration value="false" />
+ <enumeration value="off" />
+ <enumeration value="disabled" />
+ </restriction>
+ </simpleType>
+
+
+ <simpleType name="templateType">
+ <annotation><documentation>Reference to the email template</documentation></annotation>
+ <restriction base="string"></restriction>
+ </simpleType>
+</schema>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jpdl-4.2.xsd b/Source/ThirdPart/jbpm.4.3.2/src/jpdl-4.2.xsd
new file mode 100644
index 0000000..3aacc06
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jpdl-4.2.xsd
@@ -0,0 +1,1241 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://jbpm.org/4.2/jpdl"
+ xmlns:tns="http://jbpm.org/4.2/jpdl"
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified">
+
+ <annotation>
+ <documentation>Schema for jPDL 4 process descriptions;
+ element process is the top level element.
+ </documentation>
+ </annotation>
+
+ <!-- ### PROCESS DEFINITION ############################################# -->
+
+ <element name="process">
+ <annotation><documentation>A jPDL process definition description; This
+ is the top level element in a jPDL process file.</documentation></annotation>
+ <complexType>
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:swimlane" minOccurs="0" maxOccurs="unbounded" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:timer" minOccurs="0" maxOccurs="unbounded"/>
+ <group ref="tns:activityGroup" minOccurs="0" maxOccurs="unbounded" />
+ <element ref="tns:migrate-instances" minOccurs="0" maxOccurs="1" />
+ </sequence>
+ <attribute name="name" use="required" type="string">
+ <annotation>
+ <documentation>
+ The process name. Multiple processes can be deployed with the same name, as long as they have a different
+ version.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="key" type="string">
+ <annotation>
+ <documentation>
+ The key can be used to provide a short acronym that will replace the name as the basis for the generated
+ process definition id
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="version" type="int">
+ <annotation>
+ <documentation>
+ Indicates the sequence number of this version for all processes with the same name. By specifying a version
+ automatic deployment can figure out if this process is already deployed or not.
+ </documentation>
+ </annotation>
+ </attribute>
+ <anyAttribute processContents="skip">
+ <annotation><documentation>for extensibility
+ </documentation></annotation>
+ </anyAttribute>
+ </complexType>
+ </element>
+
+ <!-- ### ACTIVITIES ##################################################### -->
+
+ <group name="activityGroup">
+ <choice>
+ <!-- ~~~ START ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="start">
+ <annotation><documentation>Start event
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="form" type="string">
+ <annotation><documentation>the resource name of the form in the
+ deployment.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <!-- ~~~ END ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="end">
+ <annotation><documentation>End event.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="ends" default="process-instance">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="execution"/>
+ <enumeration value="process-instance"/>
+ </restriction>
+ </simpleType>
+ </attribute>
+ <attribute name="state" default="ended" type="string">
+ <annotation><documentation>sets the state of the execution explicitely</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="end-cancel">
+ <annotation><documentation>End cancel event.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="ends" default="process-instance">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="execution"/>
+ <enumeration value="process-instance"/>
+ </restriction>
+ </simpleType>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="end-error">
+ <annotation><documentation>End cancel event.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="ends" default="process-instance">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="execution"/>
+ <enumeration value="process-instance"/>
+ </restriction>
+ </simpleType>
+ </attribute>
+ </complexType>
+ </element>
+
+ <!-- ~~~ STATE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="state">
+ <annotation><documentation>A wait state. When an execution arrives in this
+ activity, the execution will wait until an external trigger is received
+ with execution.signal() or execution.getActivityInstance().signal()
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="transition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <complexContent>
+ <extension base="tns:transitionType">
+ <sequence>
+ <element ref="tns:timer" minOccurs="0" />
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </complexType>
+ </element>
+
+ <!-- ~~~ DECISION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="decision">
+ <annotation><documentation>Decision gateway: selects one path out of many alternatives.
+ When an execution comes in, exactly one outgoing transition is taken.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element name="handler" minOccurs="0" type="tns:wireObjectType" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="transition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <complexContent>
+ <extension base="tns:transitionType">
+ <sequence>
+ <element name="condition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="handler" minOccurs="0" type="tns:wireObjectType" />
+ </sequence>
+ <attribute name="expr" type="string">
+ <annotation><documentation>The script text that will be evaluated.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>Identification of the scripting language
+ to use.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ <!-- TODO add conditions -->
+ </element>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="expr" type="string">
+ <annotation><documentation>The script that will be evaluated and resolve to
+ the name of the outgoing transition.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>Identification of the scripting language
+ to use for the expr attribute.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <!-- ~~~ FORK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="fork">
+ <annotation><documentation>Spawns multiple concurrent paths of
+ execution.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </complexType>
+ </element>
+
+ <!-- ~~~ JOIN ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="join">
+ <annotation><documentation>Spawns multiple concurrent paths of
+ execution.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="multiplicity" type="int" />
+ <attribute name="lockmode" default="upgrade">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="none"/>
+ <enumeration value="read"/>
+ <enumeration value="upgrade"/>
+ <enumeration value="upgrade_nowait"/>
+ <enumeration value="write"/>
+ </restriction>
+ </simpleType>
+ </attribute>
+ </complexType>
+ </element>
+
+ <!-- ~~~ SCRIPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="script">
+ <annotation><documentation>Evaluates a piece of text as a script
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:scriptType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ HQL ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="hql">
+ <annotation><documentation>Performs a hibernate query
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:qlType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ SQL ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="sql">
+ <annotation><documentation>Performs a hibernate SQL query
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:qlType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ MAIL ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="mail">
+ <annotation><documentation>Sends an email
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:mailType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ JAVA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="java">
+ <annotation><documentation>Invokes a method on a java object.
+ Either the java class is instantiated with reflection, or the
+ java object is fetched from the environment. Then values from the
+ environment are injected into the fields and a method is executed.
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:javaType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ CUSTOM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="custom">
+ <annotation><documentation>Uses a user defined, custom implementation of
+ ActivityBehaviour
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:wireObjectType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ TASK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="task">
+ <annotation><documentation>Creates a task in the task component.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element name="assignment-handler" minOccurs="0" type="tns:wireObjectType" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="notification" minOccurs="0">
+ <complexType>
+ <attribute name="continue" type="tns:continueType" default="sync" />
+ <attribute name="template" type="tns:templateType" use="optional" />
+ </complexType>
+ </element>
+ <element name="reminder" minOccurs="0">
+ <complexType>
+ <attribute name="duedate" type="string" />
+ <attribute name="repeat" type="string" />
+ <attribute name="continue" type="tns:continueType" default="sync" />
+ <attribute name="template" type="tns:templateType" use="optional"/>
+ </complexType>
+ </element>
+ <element ref="tns:timer" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="transition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <complexContent>
+ <extension base="tns:transitionType">
+ <sequence>
+ <element ref="tns:timer" minOccurs="0" />
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attributeGroup ref="tns:assignmentAttributes"/>
+ <attribute name="swimlane" type="string" />
+ <attribute name="form" type="string">
+ <annotation><documentation>the resource name of the form in the
+ deployment.</documentation></annotation>
+ </attribute>
+ <attribute name="duedate" type="string" />
+ <attribute name="on-transition" default="cancel">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="keep"/>
+ <enumeration value="cancel"/>
+ </restriction>
+ </simpleType>
+ </attribute>
+ <attribute name="completion" type="string" default="complete" />
+ </complexType>
+ </element>
+
+ <!-- ~~~ SUB-PROCESS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="sub-process">
+ <annotation><documentation>Waits while a sub process instance is
+ being executed and continues when the sub process instance ends.
+ </documentation></annotation>
+ <complexType>
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <element name="description" minOccurs="0" type="string" />
+ <element name="parameter-in" type="tns:parameterType" minOccurs="0" maxOccurs="unbounded" />
+ <element name="parameter-out" type="tns:parameterType" minOccurs="0" maxOccurs="unbounded" />
+ <element ref="tns:timer" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>Events on which listeners can be registered.</documentation></annotation>
+ </element>
+ <element name="swimlane-mapping" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <attribute name="swimlane" type="string" use="required" />
+ <attribute name="sub-swimlane" type="string" use="required" />
+ </complexType>
+ </element>
+ <element name="transition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <complexContent>
+ <extension base="tns:transitionType">
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <element name="outcome-value">
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ </sequence>
+ <attribute name="sub-process-id" type="string">
+ <annotation><documentation>Identifies the sub process by the id. This means that a specific
+ version of a process definition is referenced
+ </documentation></annotation>
+ </attribute>
+ <attribute name="sub-process-key" type="string">
+ <annotation><documentation>Identifies the sub process by the key. This means that the latest
+ version of the process definition with the given key is referenced. The latest version
+ of the process is looked up each time the activity executes.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="outcome" type="string">
+ <annotation><documentation>Expression that is evaluated when the sub process
+ instance ends. The value is then used for outcome transition mapping.
+ </documentation></annotation>
+ </attribute>
+ <attributeGroup ref="tns:activityAttributes" />
+ </complexType>
+ </element>
+
+ <!-- ~~~ group ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="group">
+ <annotation><documentation>Scope enclosing a number of activities.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <group ref="tns:activityGroup" minOccurs="0" maxOccurs="unbounded" />
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>Events on which listeners can be registered.</documentation></annotation>
+ </element>
+ <element ref="tns:timer" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </complexType>
+ </element>
+ </choice>
+ </group>
+
+ <group name="wireObjectGroup">
+ <choice>
+
+ <!-- SPECIAL OBJECTS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="null">
+ <annotation><documentation>the null value
+ </documentation></annotation>
+ </element>
+ <element name="ref">
+ <annotation><documentation>A reference to an object in the current environment</documentation></annotation>
+ <complexType>
+ <attribute name="object" type="string" use="required">
+ <annotation><documentation>The name of the referred object</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ <element name="env-ref">
+ <annotation><documentation>The current environment.
+ </documentation></annotation>
+ </element>
+ <element name="jndi">
+ <annotation><documentation>A lookup from JNDI through the InitialContext
+ </documentation></annotation>
+ <complexType>
+ <attribute name="jndi-name" type="string" use="required" />
+ </complexType>
+ </element>
+
+ <!-- COLLECTIONS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="list">
+ <annotation><documentation>A java.util.List</documentation></annotation>
+ <complexType>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <group ref="tns:wireObjectGroup" />
+ </choice>
+ <attribute name="class" type="string" default="java.util.ArrayList">
+ <annotation><documentation>Implementation class for this list.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="synchronized" type="tns:booleanValueType" default="false">
+ <annotation><documentation>Indicates if this collection should be synchronized
+ with Collections.synchronizedList(List)</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="map">
+ <annotation><documentation>A java.util.Map</documentation></annotation>
+ <complexType>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="entry">
+ <complexType>
+ <choice minOccurs="0">
+ <element name="key" minOccurs="0">
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ </complexType>
+ </element>
+ <element name="value" minOccurs="0">
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ </complexType>
+ </element>
+ </choice>
+ </complexType>
+ </element>
+ </choice>
+ <attribute name="class" type="string" default="java.util.HashMap">
+ <annotation><documentation>Implementation class for this map.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="synchronized" type="tns:booleanValueType" default="false">
+ <annotation><documentation>Indicates if this collection should be synchronized
+ with Collections.synchronizedList(List)</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="set">
+ <annotation><documentation>A java.util.Set
+ </documentation></annotation>
+ <complexType>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <group ref="tns:wireObjectGroup" />
+ </choice>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="class" type="string" default="java.util.HashList">
+ <annotation><documentation>Implementation class for this set.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="synchronized" type="tns:booleanValueType" default="false">
+ <annotation><documentation>Indicates if this collection should be synchronized
+ with Collections.synchronizedSet(Set)</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="properties">
+ <annotation><documentation>A java.util.Properties</documentation></annotation>
+ <complexType>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="property">
+ <complexType>
+ <attribute name="name" type="string" use="required" />
+ <attribute name="value" type="string" use="required" />
+ </complexType>
+ </element>
+ </choice>
+ <attribute name="file" type="string">
+ <annotation><documentation>A file on the file system</documentation></annotation>
+ </attribute>
+ <attribute name="resource" type="string">
+ <annotation><documentation>A file as a resource in the classpath</documentation></annotation>
+ </attribute>
+ <attribute name="url" type="string">
+ <annotation><documentation>the contents is fetched by loading a url</documentation></annotation>
+ </attribute>
+ <attribute name="is-xml" type="tns:booleanValueType">
+ <annotation><documentation>optionally indicates if the content of referenced file in attributes
+ 'file', 'resource' or 'url' is XML. The default is the
+ plain properties format with a space or the equals character (=) separating key and value on
+ each line.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <!-- OBJECT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="object" type="tns:wireObjectType" />
+
+ <!-- BASIC TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="string">
+ <complexType>
+ <attribute name="name">
+ <annotation><documentation>the name of the string object</documentation></annotation>
+ </attribute>
+ <attribute name="value">
+ <annotation><documentation>the actual string value</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="byte">
+ <annotation><documentation>A java.lang.Byte</documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="byte" use="required" />
+ </complexType>
+ </element>
+ <element name="char">
+ <annotation><documentation>A java.lang.Character</documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" use="required">
+ <simpleType>
+ <restriction base="string">
+ <maxLength value="1" />
+ </restriction>
+ </simpleType>
+ </attribute>
+ </complexType>
+ </element>
+ <element name="double">
+ <annotation><documentation>A java.lang.Double</documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="double" use="required" />
+ </complexType>
+ </element>
+ <element name="false">
+ <annotation><documentation>java.lang.Boolean.FALSE
+ </documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ <element name="float">
+ <annotation><documentation>A java.lang.Float
+ </documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="float" use="required" />
+ </complexType>
+ </element>
+ <element name="int">
+ <annotation><documentation>A java.lang.Integer
+ </documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="int" use="required"/>
+ </complexType>
+ </element>
+ <element name="long">
+ <annotation><documentation>A java.lang.Long</documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="long" use="required"/>
+ </complexType>
+ </element>
+ <element name="short">
+ <annotation><documentation>a java.lang.Short
+ </documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="short" use="required"/>
+ </complexType>
+ </element>
+ <element name="true">
+ <annotation><documentation>java.lang.Boolean.TRUE
+ </documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+
+ </choice>
+ </group>
+
+ <complexType name="wireObjectType">
+ <annotation><documentation>Any java object that will be created by reflection. .
+ <p>There are three main ways to create an object: by constructor or by a factory
+ object or a static factory method.</p>
+ <p><b>Using the constructor</b>: Then the <code>class</code> attribute must provide the
+ fully qualified class name. In case another constructor then the default is
+ targetted, a <code>constructor</code> child element can be provided.
+ The <code>factory</code> attribute should not be provided for using a constructor.
+ </p>
+ <p><b>Using a factory</b>: Then the <code>factory</code> attribute or one
+ <code>factory</code> element must be provided along with the attribute
+ <code>method</code>.
+ </p>
+ <p><b>Using a static factory method</b>: Then the <code>class</code> and
+ <code>method</code> attributes should be specified. There should be no
+ reference to a <code>factory</code> attribute of element.
+ </p>
+ <p><b>Construction and initialization</b>: all objects (constructor and factory)
+ are build in two phases: construction and initialisation phase. During construction
+ all is done until a pointer is obtained to the object. In initialisation, operations
+ are applied to the object until it is ready to be used. The separation between
+ construction and initialisation is made to allow for bidirectional references. In
+ that case, at least one of both ends can not be fully initialised before it is injected
+ into the other end.
+ </p>
+ <p><b>Operations</b>: after construction, various operations can be applied to objects
+ like e.g. direct field injection, injection through setters, method invocation,
+ enlist with the standard transaction, subscribe the object as a listener to an observable
+ </p>
+ <p><b>Arguments</b>: There are two different places for arguments. The <code>arg</code>
+ elements for the factory method invocation should be placed as child elements under the
+ <code>object</code> element. The <code>arg</code> elements for the constructor should be
+ placed as child elements under the <code>constructor</code> element.
+ </p>
+ </documentation></annotation>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="description" minOccurs="0" maxOccurs="unbounded" type="string" />
+ <element name="factory">
+ <annotation><documentation>Contains one element that describes the factory object.</documentation></annotation>
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ </complexType>
+ </element>
+ <element name="constructor">
+ <annotation><documentation>Specifies the arguments to use for a non-default constructor.</documentation></annotation>
+ <complexType>
+ <choice maxOccurs="unbounded">
+ <element name="arg" type="tns:argType" />
+ </choice>
+ </complexType>
+ </element>
+ <element name="arg" type="tns:argType">
+ <annotation><documentation>The factory method arguments.</documentation></annotation>
+ </element>
+ <element name="field">
+ <annotation><documentation>Injects a value into a member field of this object.
+ Exactly one child element must specify the value.
+ </documentation></annotation>
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ <attribute name="name">
+ <annotation><documentation>The member field name</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ <element name="property">
+ <annotation><documentation>Injects a value through a setter method.
+ Exactly one child element must specify the value.
+ </documentation></annotation>
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ <attribute name="name">
+ <annotation><documentation>The name of the property (without the 'set' prefix)</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ <element name="invoke">
+ <annotation><documentation>Invokes a method</documentation></annotation>
+ <complexType>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="arg" type="tns:argType" />
+ </choice>
+ <attribute name="method" type="string" use="required">
+ <annotation><documentation>the method name</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ </choice>
+ <attribute name="class" type="string">
+ <annotation><documentation>The fully qualified class name</documentation></annotation>
+ </attribute>
+ <attribute name="expr" type="string">
+ <annotation><documentation>The class to instantiate.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>The class to instantiate.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="factory" type="string">
+ <annotation><documentation>The name of the factory object</documentation></annotation>
+ </attribute>
+ <attribute name="method" type="string">
+ <annotation><documentation>The factory method name</documentation></annotation>
+ </attribute>
+ <attribute name="auto-wire" type="string">
+ <annotation><documentation>Indicates if the member fields and setter properties
+ should be automatically wired based on matching the property names and types with the
+ object names and types</documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <complexType name="argType">
+ <annotation><documentation>The method arguments.
+ Each 'arg' element should have exactly one child element
+ that represents the value of the argument.
+ </documentation></annotation>
+ <attribute name="type" type="string">
+ <annotation><documentation>The java class name representing
+ the type of the method. This is optional and can be used to
+ indicate the appropriate method in case of method overloading.
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <complexType name="javaType">
+ <sequence>
+ <element name="description" minOccurs="0" maxOccurs="unbounded" type="string" />
+ <element name="field" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>Field injections from the environment
+ invocation.</documentation></annotation>
+ </element>
+ <element name="arg" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>Method arguments.</documentation></annotation>
+ </element>
+ </sequence>
+ <attribute name="method" type="string" use="required">
+ <annotation><documentation>The name of the method to invoke.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="class" type="string">
+ <annotation><documentation>The class to instantiate.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="expr" type="string">
+ <annotation><documentation>Expression that resolves to the target object
+ on which the method should be invoked.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>The language in which attribute 'expr' is to be
+ resolved.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="var" type="string">
+ <annotation><documentation>The variable name to store the return value
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <complexType name="scriptType">
+ <sequence>
+ <element name="description" minOccurs="0" maxOccurs="unbounded" type="string" />
+ <element name="text" type="string" minOccurs="0">
+ <annotation><documentation>The content of this expression element
+ is the script text that will be evaluated. This is mutually
+ exclusive with the expression attribute.</documentation></annotation>
+ </element>
+ </sequence>
+ <attribute name="expr" type="string">
+ <annotation><documentation>The script text that will be evaluated. This
+ is mutually exclusive with the expression element.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>Identification of the scripting language
+ to use.</documentation></annotation>
+ </attribute>
+ <attribute name="var" type="string">
+ <annotation><documentation>Name of the variable in which the result
+ of the script evaluation will be stored</documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <complexType name="qlType">
+ <sequence>
+ <element name="description" minOccurs="0" maxOccurs="unbounded" type="string" />
+ <element name="query" type="string">
+ <annotation><documentation>The query text.</documentation></annotation>
+ </element>
+ <element name="parameters" minOccurs="0">
+ <annotation><documentation>Query parameters.</documentation></annotation>
+ <complexType>
+ <sequence>
+ <group ref="tns:wireObjectGroup" maxOccurs="unbounded" />
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ <attribute name="var" type="string">
+ <annotation><documentation>Name of the variable in which the result
+ of the script evaluation will be stored</documentation></annotation>
+ </attribute>
+ <attribute name="unique" type="string">
+ <annotation><documentation>Does this query return a unique result or a list
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <attributeGroup name="activityAttributes">
+ <attribute name="name" type="string">
+ <annotation><documentation>The id of this activity. The name should be unique
+ in the complete scope of the process.</documentation></annotation>
+ </attribute>
+ <attribute name="g" type="string">
+ <annotation><documentation>Graphical information used by process designer tool.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="continue" default="sync" type="tns:continueType">
+ <annotation><documentation>To specify async continuations.
+ sync is the default.
+ </documentation></annotation>
+ </attribute>
+ </attributeGroup>
+
+ <simpleType name="continueType">
+ <restriction base="string">
+ <enumeration value="async" />
+ <enumeration value="sync" />
+ <enumeration value="exclusive" />
+ </restriction>
+ </simpleType>
+
+
+ <attributeGroup name="assignmentAttributes">
+ <annotation><documentation>the assignment attributes will be used in
+ tasks and swimlanes to specify to whom these respectively are assigned.
+ </documentation></annotation>
+ <attribute name="assignee" type="string">
+ <annotation><documentation>Expression that resolves to a userId referencing
+ the person to which the task or swimlane will be assigned.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="assignee-lang" type="string">
+ <annotation><documentation>Expression language for the assignee attribute.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="candidate-users" type="string">
+ <annotation><documentation>Expression that resolves to a comma separated
+ list of userId's. All the referred people will be candidates for
+ take the task or swimlane.</documentation></annotation>
+ </attribute>
+ <attribute name="candidate-users-lang" type="string">
+ <annotation><documentation>Expression language for the
+ candidate-users attribute.</documentation></annotation>
+ </attribute>
+ <attribute name="candidate-groups" type="string">
+ <annotation><documentation>Resolves to a comma separated list of groupId's.
+ All the referred people will be candidates to
+ take the task or swimlane.</documentation></annotation>
+ </attribute>
+ <attribute name="candidate-groups-lang" type="string">
+ <annotation><documentation>Expression language for the
+ candidate-groups attribute.</documentation></annotation>
+ </attribute>
+ </attributeGroup>
+
+ <element name="swimlane">
+ <annotation><documentation>A process role.</documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ </sequence>
+ <attribute name="name" type="string" use="required" />
+ <attributeGroup ref="tns:assignmentAttributes" />
+ </complexType>
+ </element>
+
+ <complexType name="transitionType">
+ <annotation><documentation>The outgoing transitions. The first in the list
+ will be the default outgoing transition.
+ </documentation></annotation>
+ <sequence>
+ <element name="description" minOccurs="0" maxOccurs="unbounded" type="string" />
+ <group ref="tns:eventListenerGroup" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attribute name="name" type="string">
+ <annotation><documentation>Name of this outgoing transition</documentation></annotation>
+ </attribute>
+ <attribute name="to" type="string">
+ <annotation><documentation>Name of the destination activity of this transition.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="g" type="string">
+ <annotation><documentation>Graphical information used by process designer tool.
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <element name="transition" type="tns:transitionType">
+ <annotation><documentation>A transition from one activity to another.</documentation></annotation>
+ </element>
+
+ <element name="on">
+ <complexType>
+ <sequence>
+ <element ref="tns:timer" minOccurs="0" />
+ <group ref="tns:eventListenerGroup" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>A list of event listeners that will
+ be notified when the event is fired</documentation></annotation>
+ </group>
+ </sequence>
+ <attribute name="event" type="string">
+ <annotation><documentation>The event identification. start, end, take or
+ any other custom event.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="continue" type="tns:continueType" default="sync" />
+ </complexType>
+ </element>
+
+ <complexType name="parameterType">
+ <attribute name="subvar" type="string">
+ <annotation><documentation>The name of the sub process variable.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="expr" type="string">
+ <annotation><documentation>An expression for which the resulting
+ value will be used as value.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>Language of the expression.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="var" type="string">
+ <annotation><documentation>Name of the process variable
+ in the super process execution..
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+
+
+ <element name="timer">
+ <complexType>
+ <sequence>
+ <annotation><documentation>A list of event listeners that will
+ be notified when the timer fires</documentation></annotation>
+ <element name="description" minOccurs="0" type="string" />
+ <group ref="tns:eventListenerGroup" minOccurs="0" maxOccurs="unbounded">
+ </group>
+ </sequence>
+ <attribute name="duedate" type="string">
+ <annotation><documentation>Timer duedate expression that defines the duedate of this
+ timer relative to the creation time of the timer. E.g. '2 hours' or '4 business days'
+ </documentation></annotation>
+ </attribute>
+ <attribute name="repeat" type="string">
+ <annotation><documentation>Timer duedate expression that defines repeated scheduling
+ relative to the last timer fire event. E.g. '2 hours' or '4 business days'
+ </documentation></annotation>
+ </attribute>
+ <attribute name="duedatetime" type="string">
+ <annotation><documentation>Absolute time in format <code>HH:mm dd/MM/yyyy</code>
+ (see SimpleDateFormat). The format for the absolute time can be customized in the
+ jbpm configuration.
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <group name="eventListenerGroup">
+ <choice>
+ <element name="event-listener" type="tns:wireObjectType" />
+ <element name="hql" type="tns:qlType" />
+ <element name="sql" type="tns:qlType" />
+ <element name="java" type="tns:javaType" />
+ <element name="script" type="tns:scriptType" />
+ <element name="mail" type="tns:mailType" />
+ </choice>
+ </group>
+
+ <complexType name="mailType">
+ <sequence>
+ <element name="description" minOccurs="0" maxOccurs="unbounded" type="string" />
+ <element name="from" type="tns:mailRecipientType" minOccurs="0" />
+ <element name="to" type="tns:mailRecipientType" minOccurs="0" />
+ <element name="cc" type="tns:mailRecipientType" minOccurs="0" />
+ <element name="bcc" type="tns:mailRecipientType" minOccurs="0" />
+ <element name="subject" type="string" minOccurs="0" />
+ <element name="text" type="string" minOccurs="0" />
+ <element name="html" type="string" minOccurs="0" />
+ <element name="attachments" minOccurs="0" >
+ <complexType>
+ <sequence>
+ <element name="attachment" maxOccurs="unbounded">
+ <complexType>
+ <attribute name="url" type="string">
+ <annotation><documentation>URL reference to the attachment</documentation></annotation>
+ </attribute>
+ <attribute name="resource" type="string">
+ <annotation><documentation>Name of the attachment resource on the classpath</documentation></annotation>
+ </attribute>
+ <attribute name="file" type="string">
+ <annotation><documentation>File reference to the attachment</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ <attribute name="template" type="tns:templateType" />
+ </complexType>
+
+ <complexType name="mailRecipientType">
+ <attribute name="addresses" type="string">
+ <annotation><documentation>list of email address separated by ',' (comma) ';' (semicolon) '|' or whitespace</documentation></annotation>
+ </attribute>
+ <attribute name="users" type="string">
+ <annotation><documentation>list of user ids that are resolved to the email address against configured identity component.
+ user ids should be separated by ',' (comma) ';' (semicolon) '|' or whitespace</documentation></annotation>
+ </attribute>
+ <attribute name="groups" type="string">
+ <annotation><documentation>list of group ids that are resolved to the email address against configured identity component.
+ group ids should be separated by ',' (comma) ';' (semicolon) '|' or whitespace</documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <simpleType name="booleanValueType">
+ <restriction base="string">
+ <enumeration value="true" />
+ <enumeration value="on" />
+ <enumeration value="enabled" />
+ <enumeration value="false" />
+ <enumeration value="off" />
+ <enumeration value="disabled" />
+ </restriction>
+ </simpleType>
+
+
+ <simpleType name="templateType">
+ <annotation><documentation>Reference to the email template</documentation></annotation>
+ <restriction base="string"></restriction>
+ </simpleType>
+
+ <element name="migrate-instances">
+ <annotation><documentation>Information to migrate instances of previously deployed process definitions
+ to the new one</documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="migration-handler" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>The migration handler specifies the name of a class to be executed while migrating the process instance.</documentation></annotation>
+ <complexType>
+ <attribute name="class"/>
+ </complexType>
+ </element>
+ <element name="activity-mapping" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>One activity mapping will be present for each activity of which the name changed.</documentation></annotation>
+ <complexType>
+ <attribute name="old-name" type="string" use="required">
+ <annotation><documentation>The name of the activity in the previously deployed process definition.</documentation></annotation>
+ </attribute>
+ <attribute name="new-name" type="string" use="required">
+ <annotation><documentation>The name of the activity in the newly deployed process definition</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ </sequence>
+ <attribute name="action" type="tns:migrationActionType" default="migrate">
+ </attribute>
+ </complexType>
+ </element>
+
+ <simpleType name="migrationActionType">
+ <restriction base="string">
+ <enumeration value="end" />
+ <enumeration value="migrate" />
+ </restriction>
+ </simpleType>
+
+</schema>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/jpdl-4.3.xsd b/Source/ThirdPart/jbpm.4.3.2/src/jpdl-4.3.xsd
new file mode 100644
index 0000000..fb3f73f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/jpdl-4.3.xsd
@@ -0,0 +1,1400 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://jbpm.org/4.3/jpdl"
+ xmlns:tns="http://jbpm.org/4.3/jpdl"
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified">
+
+ <annotation>
+ <documentation>Schema for jPDL 4 process descriptions;
+ element process is the top level element.
+ </documentation>
+ </annotation>
+
+ <!-- ### PROCESS DEFINITION ############################################# -->
+
+ <element name="process">
+ <annotation><documentation>A jPDL process definition description; This
+ is the top level element in a jPDL process file.</documentation></annotation>
+ <complexType>
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:swimlane" minOccurs="0" maxOccurs="unbounded" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:timer" minOccurs="0" maxOccurs="unbounded"/>
+ <group ref="tns:activityGroup" minOccurs="0" maxOccurs="unbounded" />
+ <element ref="tns:migrate-instances" minOccurs="0" maxOccurs="1" />
+ </sequence>
+ <attribute name="name" use="required" type="string">
+ <annotation>
+ <documentation>
+ The process name. Multiple processes can be deployed with the same name, as long as they have a different
+ version.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="key" type="string">
+ <annotation>
+ <documentation>
+ The key can be used to provide a short acronym that will replace the name as the basis for the generated
+ process definition id
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="version" type="int">
+ <annotation>
+ <documentation>
+ Indicates the sequence number of this version for all processes with the same name. By specifying a version
+ automatic deployment can figure out if this process is already deployed or not.
+ </documentation>
+ </annotation>
+ </attribute>
+ <anyAttribute processContents="skip">
+ <annotation><documentation>for extensibility
+ </documentation></annotation>
+ </anyAttribute>
+ </complexType>
+ </element>
+
+ <!-- ### ACTIVITIES ##################################################### -->
+
+ <group name="activityGroup">
+ <choice>
+ <!-- ~~~ START ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="start">
+ <annotation><documentation>Start event
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="form" type="string">
+ <annotation><documentation>the resource name of the form in the
+ deployment.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <!-- ~~~ END ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="end">
+ <annotation><documentation>End event.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="ends" default="process-instance">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="execution"/>
+ <enumeration value="process-instance"/>
+ </restriction>
+ </simpleType>
+ </attribute>
+ <attribute name="state" default="ended" type="string">
+ <annotation><documentation>sets the state of the execution explicitely</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="end-cancel">
+ <annotation><documentation>End cancel event.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="ends" default="process-instance">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="execution"/>
+ <enumeration value="process-instance"/>
+ </restriction>
+ </simpleType>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="end-error">
+ <annotation><documentation>End cancel event.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="ends" default="process-instance">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="execution"/>
+ <enumeration value="process-instance"/>
+ </restriction>
+ </simpleType>
+ </attribute>
+ </complexType>
+ </element>
+
+ <!-- ~~~ STATE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="state">
+ <annotation><documentation>A wait state. When an execution arrives in this
+ activity, the execution will wait until an external trigger is received
+ with execution.signal() or execution.getActivityInstance().signal()
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="transition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <complexContent>
+ <extension base="tns:transitionType">
+ <sequence>
+ <element ref="tns:timer" minOccurs="0" />
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </complexType>
+ </element>
+
+ <!-- ~~~ DECISION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="decision">
+ <annotation><documentation>Decision gateway: selects one path out of many alternatives.
+ When an execution comes in, exactly one outgoing transition is taken.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element name="handler" minOccurs="0" type="tns:wireObjectType" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="transition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <complexContent>
+ <extension base="tns:transitionType">
+ <sequence>
+ <element name="condition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="handler" minOccurs="0" type="tns:wireObjectType" />
+ </sequence>
+ <attribute name="expr" type="string">
+ <annotation><documentation>The script text that will be evaluated.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>Identification of the scripting language
+ to use.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="expr" type="string">
+ <annotation><documentation>The script that will be evaluated and resolve to
+ the name of the outgoing transition.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>Identification of the scripting language
+ to use for the expr attribute.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <!-- ~~~ FORK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="fork">
+ <annotation><documentation>Spawns multiple concurrent paths of
+ execution.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </complexType>
+ </element>
+
+ <!-- ~~~ JOIN ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="join">
+ <annotation><documentation>Spawns multiple concurrent paths of
+ execution.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attribute name="multiplicity" type="int" />
+ <attribute name="lockmode" default="upgrade">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="none"/>
+ <enumeration value="read"/>
+ <enumeration value="upgrade"/>
+ <enumeration value="upgrade_nowait"/>
+ <enumeration value="write"/>
+ </restriction>
+ </simpleType>
+ </attribute>
+ </complexType>
+ </element>
+
+ <!-- ~~~ SCRIPT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="script">
+ <annotation><documentation>Evaluates a piece of text as a script
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:scriptType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ HQL ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="hql">
+ <annotation><documentation>Performs a hibernate query
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:qlType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ SQL ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="sql">
+ <annotation><documentation>Performs a hibernate SQL query
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:qlType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ MAIL ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="mail">
+ <annotation><documentation>Sends an email
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:mailType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ JMS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="jms">
+ <annotation><documentation>Sends an email
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:jmsType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ JAVA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="java">
+ <annotation><documentation>Invokes a method on a java object.
+ Either the java class is instantiated with reflection, or the
+ java object is fetched from the environment. Then values from the
+ environment are injected into the fields and a method is executed.
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:javaType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ CUSTOM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="custom">
+ <annotation><documentation>Uses a user defined, custom implementation of
+ ActivityBehaviour
+ </documentation></annotation>
+ <complexType>
+ <complexContent>
+ <extension base="tns:wireObjectType">
+ <sequence>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <!-- ~~~ TASK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="task">
+ <annotation><documentation>Creates a task in the task component.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element name="assignment-handler" minOccurs="0" type="tns:wireObjectType" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="notification" minOccurs="0">
+ <complexType>
+ <attribute name="continue" type="tns:continueType" default="sync" />
+ <attribute name="template" type="tns:templateType" use="optional" />
+ </complexType>
+ </element>
+ <element name="reminder" minOccurs="0">
+ <complexType>
+ <attribute name="duedate" type="string" />
+ <attribute name="repeat" type="string" />
+ <attribute name="continue" type="tns:continueType" default="sync" />
+ <attribute name="template" type="tns:templateType" use="optional"/>
+ </complexType>
+ </element>
+ <element ref="tns:timer" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="transition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <complexContent>
+ <extension base="tns:transitionType">
+ <sequence>
+ <element ref="tns:timer" minOccurs="0" />
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ <attributeGroup ref="tns:assignmentAttributes"/>
+ <attribute name="swimlane" type="string" />
+ <attribute name="form" type="string">
+ <annotation><documentation>the resource name of the form in the
+ deployment.</documentation></annotation>
+ </attribute>
+ <attribute name="duedate" type="string" />
+ <attribute name="on-transition" default="cancel">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="keep"/>
+ <enumeration value="cancel"/>
+ </restriction>
+ </simpleType>
+ </attribute>
+ <attribute name="completion" type="string" default="complete" />
+ </complexType>
+ </element>
+
+ <!-- ~~~ SUB-PROCESS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="sub-process">
+ <annotation><documentation>Waits while a sub process instance is
+ being executed and continues when the sub process instance ends.
+ </documentation></annotation>
+ <complexType>
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <element name="description" minOccurs="0" type="string" />
+ <element name="parameter-in" type="tns:parameterType" minOccurs="0" maxOccurs="unbounded" />
+ <element name="parameter-out" type="tns:parameterType" minOccurs="0" maxOccurs="unbounded" />
+ <element ref="tns:timer" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>Events on which listeners can be registered.</documentation></annotation>
+ </element>
+ <element name="swimlane-mapping" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <attribute name="swimlane" type="string" use="required" />
+ <attribute name="sub-swimlane" type="string" use="required" />
+ </complexType>
+ </element>
+ <element name="transition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <complexContent>
+ <extension base="tns:transitionType">
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <element name="outcome-value">
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ </sequence>
+ <attribute name="sub-process-id" type="string">
+ <annotation><documentation>Identifies the sub process by the id. This means that a specific
+ version of a process definition is referenced
+ </documentation></annotation>
+ </attribute>
+ <attribute name="sub-process-key" type="string">
+ <annotation><documentation>Identifies the sub process by the key. This means that the latest
+ version of the process definition with the given key is referenced. The latest version
+ of the process is looked up each time the activity executes.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="outcome" type="string">
+ <annotation><documentation>Expression that is evaluated when the sub process
+ instance ends. The value is then used for outcome transition mapping.
+ </documentation></annotation>
+ </attribute>
+ <attributeGroup ref="tns:activityAttributes" />
+ </complexType>
+ </element>
+
+ <!-- ~~~ GROUP ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="group">
+ <annotation><documentation>Scope enclosing a number of activities.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <group ref="tns:activityGroup" minOccurs="0" maxOccurs="unbounded" />
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>Events on which listeners can be registered.</documentation></annotation>
+ </element>
+ <element ref="tns:timer" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </complexType>
+ </element>
+
+ <!-- ~~~ RULES DECISION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="rules-decision">
+ <annotation><documentation>Selects one outgoing transition based on evaluation of rules.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element ref="tns:transition" minOccurs="0" maxOccurs="unbounded" />
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>Events on which listeners can be registered.</documentation></annotation>
+ </element>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </complexType>
+ </element>
+
+ <!-- ~~~ RULES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="rules">
+ <annotation><documentation>Evaluates rules after feeding in some facts in a stateful knowledge session.
+ </documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ <element name="fact" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <attribute name="var" type="string" />
+ <attribute name="expr" type="string" />
+ </complexType>
+ </element>
+ <element name="transition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <complexContent>
+ <extension base="tns:transitionType">
+ <sequence>
+ <element name="condition" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="handler" minOccurs="0" type="tns:wireObjectType" />
+ </sequence>
+ <attribute name="expr" type="string">
+ <annotation><documentation>The script text that will be evaluated.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>Identification of the scripting language
+ to use.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element ref="tns:on" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>Events on which listeners can be registered.</documentation></annotation>
+ </element>
+ </sequence>
+ <attributeGroup ref="tns:activityAttributes" />
+ </complexType>
+ </element>
+
+ </choice>
+ </group>
+
+ <group name="wireObjectGroup">
+ <choice>
+
+ <!-- SPECIAL OBJECTS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="null">
+ <annotation><documentation>the null value
+ </documentation></annotation>
+ </element>
+ <element name="ref">
+ <annotation><documentation>A reference to an object in the current environment</documentation></annotation>
+ <complexType>
+ <attribute name="object" type="string" use="required">
+ <annotation><documentation>The name of the referred object</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ <element name="env-ref">
+ <annotation><documentation>The current environment.
+ </documentation></annotation>
+ </element>
+ <element name="jndi">
+ <annotation><documentation>A lookup from JNDI through the InitialContext
+ </documentation></annotation>
+ <complexType>
+ <attribute name="jndi-name" type="string" use="required" />
+ </complexType>
+ </element>
+
+ <!-- COLLECTIONS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="list">
+ <annotation><documentation>A java.util.List</documentation></annotation>
+ <complexType>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <group ref="tns:wireObjectGroup" />
+ </choice>
+ <attribute name="class" type="string" default="java.util.ArrayList">
+ <annotation><documentation>Implementation class for this list.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="synchronized" type="tns:booleanValueType" default="false">
+ <annotation><documentation>Indicates if this collection should be synchronized
+ with Collections.synchronizedList(List)</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="map" type="tns:mapType"/>
+
+ <element name="set">
+ <annotation><documentation>A java.util.Set
+ </documentation></annotation>
+ <complexType>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <group ref="tns:wireObjectGroup" />
+ </choice>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="class" type="string" default="java.util.HashList">
+ <annotation><documentation>Implementation class for this set.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="synchronized" type="tns:booleanValueType" default="false">
+ <annotation><documentation>Indicates if this collection should be synchronized
+ with Collections.synchronizedSet(Set)</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="properties">
+ <annotation><documentation>A java.util.Properties</documentation></annotation>
+ <complexType>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="property">
+ <complexType>
+ <attribute name="name" type="string" use="required" />
+ <attribute name="value" type="string" use="required" />
+ </complexType>
+ </element>
+ </choice>
+ <attribute name="file" type="string">
+ <annotation><documentation>A file on the file system</documentation></annotation>
+ </attribute>
+ <attribute name="resource" type="string">
+ <annotation><documentation>A file as a resource in the classpath</documentation></annotation>
+ </attribute>
+ <attribute name="url" type="string">
+ <annotation><documentation>the contents is fetched by loading a url</documentation></annotation>
+ </attribute>
+ <attribute name="is-xml" type="tns:booleanValueType">
+ <annotation><documentation>optionally indicates if the content of referenced file in attributes
+ 'file', 'resource' or 'url' is XML. The default is the
+ plain properties format with a space or the equals character (=) separating key and value on
+ each line.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <!-- OBJECT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="object" type="tns:wireObjectType" />
+
+ <!-- BASIC TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <element name="string">
+ <complexType>
+ <attribute name="name">
+ <annotation><documentation>the name of the string object</documentation></annotation>
+ </attribute>
+ <attribute name="value">
+ <annotation><documentation>the actual string value</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="byte">
+ <annotation><documentation>A java.lang.Byte</documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="byte" use="required" />
+ </complexType>
+ </element>
+ <element name="char">
+ <annotation><documentation>A java.lang.Character</documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" use="required">
+ <simpleType>
+ <restriction base="string">
+ <maxLength value="1" />
+ </restriction>
+ </simpleType>
+ </attribute>
+ </complexType>
+ </element>
+ <element name="double">
+ <annotation><documentation>A java.lang.Double</documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="double" use="required" />
+ </complexType>
+ </element>
+ <element name="false">
+ <annotation><documentation>java.lang.Boolean.FALSE
+ </documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ <element name="float">
+ <annotation><documentation>A java.lang.Float
+ </documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="float" use="required" />
+ </complexType>
+ </element>
+ <element name="int">
+ <annotation><documentation>A java.lang.Integer
+ </documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="int" use="required"/>
+ </complexType>
+ </element>
+ <element name="long">
+ <annotation><documentation>A java.lang.Long</documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="long" use="required"/>
+ </complexType>
+ </element>
+ <element name="short">
+ <annotation><documentation>a java.lang.Short
+ </documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ <attribute name="value" type="short" use="required"/>
+ </complexType>
+ </element>
+ <element name="true">
+ <annotation><documentation>java.lang.Boolean.TRUE
+ </documentation></annotation>
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation><documentation>The name of the object. It's optional and serves
+ as an id to refer to this object from other object declarations. This name can
+ also be used lookup the object programmatically.</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+
+ </choice>
+ </group>
+
+ <complexType name="wireObjectType">
+ <annotation><documentation>Any java object that will be created by reflection. .
+ <p>There are three main ways to create an object: by constructor or by a factory
+ object or a static factory method.</p>
+ <p><b>Using the constructor</b>: Then the <code>class</code> attribute must provide the
+ fully qualified class name. In case another constructor then the default is
+ targetted, a <code>constructor</code> child element can be provided.
+ The <code>factory</code> attribute should not be provided for using a constructor.
+ </p>
+ <p><b>Using a factory</b>: Then the <code>factory</code> attribute or one
+ <code>factory</code> element must be provided along with the attribute
+ <code>method</code>.
+ </p>
+ <p><b>Using a static factory method</b>: Then the <code>class</code> and
+ <code>method</code> attributes should be specified. There should be no
+ reference to a <code>factory</code> attribute of element.
+ </p>
+ <p><b>Construction and initialization</b>: all objects (constructor and factory)
+ are build in two phases: construction and initialisation phase. During construction
+ all is done until a pointer is obtained to the object. In initialisation, operations
+ are applied to the object until it is ready to be used. The separation between
+ construction and initialisation is made to allow for bidirectional references. In
+ that case, at least one of both ends can not be fully initialised before it is injected
+ into the other end.
+ </p>
+ <p><b>Operations</b>: after construction, various operations can be applied to objects
+ like e.g. direct field injection, injection through setters, method invocation,
+ enlist with the standard transaction, subscribe the object as a listener to an observable
+ </p>
+ <p><b>Arguments</b>: There are two different places for arguments. The <code>arg</code>
+ elements for the factory method invocation should be placed as child elements under the
+ <code>object</code> element. The <code>arg</code> elements for the constructor should be
+ placed as child elements under the <code>constructor</code> element.
+ </p>
+ </documentation></annotation>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="description" minOccurs="0" maxOccurs="unbounded" type="string" />
+ <element name="factory">
+ <annotation><documentation>Contains one element that describes the factory object.</documentation></annotation>
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ </complexType>
+ </element>
+ <element name="constructor">
+ <annotation><documentation>Specifies the arguments to use for a non-default constructor.</documentation></annotation>
+ <complexType>
+ <choice maxOccurs="unbounded">
+ <element name="arg" type="tns:argType" />
+ </choice>
+ </complexType>
+ </element>
+ <element name="arg" type="tns:argType">
+ <annotation><documentation>The factory method arguments.</documentation></annotation>
+ </element>
+ <element name="field">
+ <annotation><documentation>Injects a value into a member field of this object.
+ Exactly one child element must specify the value.
+ </documentation></annotation>
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ <attribute name="name">
+ <annotation><documentation>The member field name</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ <element name="property">
+ <annotation><documentation>Injects a value through a setter method.
+ Exactly one child element must specify the value.
+ </documentation></annotation>
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ <attribute name="name">
+ <annotation><documentation>The name of the property (without the 'set' prefix)</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ <element name="invoke">
+ <annotation><documentation>Invokes a method</documentation></annotation>
+ <complexType>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="arg" type="tns:argType" />
+ </choice>
+ <attribute name="method" type="string" use="required">
+ <annotation><documentation>the method name</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ </choice>
+ <attribute name="class" type="string">
+ <annotation><documentation>The fully qualified class name</documentation></annotation>
+ </attribute>
+ <attribute name="expr" type="string">
+ <annotation><documentation>The class to instantiate.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>The class to instantiate.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="factory" type="string">
+ <annotation><documentation>The name of the factory object</documentation></annotation>
+ </attribute>
+ <attribute name="method" type="string">
+ <annotation><documentation>The factory method name</documentation></annotation>
+ </attribute>
+ <attribute name="auto-wire" type="string">
+ <annotation><documentation>Indicates if the member fields and setter properties
+ should be automatically wired based on matching the property names and types with the
+ object names and types</documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <complexType name="argType">
+ <annotation><documentation>The method arguments.
+ Each 'arg' element should have exactly one child element
+ that represents the value of the argument.
+ </documentation></annotation>
+ <attribute name="type" type="string">
+ <annotation><documentation>The java class name representing
+ the type of the method. This is optional and can be used to
+ indicate the appropriate method in case of method overloading.
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <complexType name="mapType">
+ <annotation><documentation>A java.util.Map</documentation></annotation>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="entry">
+ <complexType>
+ <sequence minOccurs="0">
+ <element name="key" minOccurs="0">
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ </complexType>
+ </element>
+ <element name="value" minOccurs="0">
+ <complexType>
+ <group ref="tns:wireObjectGroup" />
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+ </element>
+ </choice>
+ <attribute name="class" type="string" default="java.util.HashMap">
+ <annotation><documentation>Implementation class for this map.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="synchronized" type="tns:booleanValueType" default="false">
+ <annotation><documentation>Indicates if this collection should be synchronized
+ with Collections.synchronizedList(List)</documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <complexType name="javaType">
+ <sequence>
+ <element name="description" minOccurs="0" maxOccurs="unbounded" type="string" />
+ <element name="field" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>Field injections from the environment
+ invocation.</documentation></annotation>
+ </element>
+ <element name="arg" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>Method arguments.</documentation></annotation>
+ </element>
+ </sequence>
+ <attribute name="method" type="string" use="required">
+ <annotation><documentation>The name of the method to invoke.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="ejb-jndi-name" type="string">
+ <annotation><documentation>The jndi name of the ejb that needs to be invoked.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="class" type="string">
+ <annotation><documentation>The class to instantiate.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="expr" type="string">
+ <annotation><documentation>Expression that resolves to the target object
+ on which the method should be invoked.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>The language in which attribute 'expr' is to be
+ resolved.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="var" type="string">
+ <annotation><documentation>The variable name to store the return value
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <complexType name="scriptType">
+ <sequence>
+ <element name="description" minOccurs="0" maxOccurs="unbounded" type="string" />
+ <element name="text" type="string" minOccurs="0">
+ <annotation><documentation>The content of this expression element
+ is the script text that will be evaluated. This is mutually
+ exclusive with the expression attribute.</documentation></annotation>
+ </element>
+ </sequence>
+ <attribute name="expr" type="string">
+ <annotation><documentation>The script text that will be evaluated. This
+ is mutually exclusive with the expression element.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>Identification of the scripting language
+ to use.</documentation></annotation>
+ </attribute>
+ <attribute name="var" type="string">
+ <annotation><documentation>Name of the variable in which the result
+ of the script evaluation will be stored</documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <complexType name="qlType">
+ <sequence>
+ <element name="description" minOccurs="0" maxOccurs="unbounded" type="string" />
+ <element name="query" type="string">
+ <annotation><documentation>The query text.</documentation></annotation>
+ </element>
+ <element name="parameters" minOccurs="0">
+ <annotation><documentation>Query parameters.</documentation></annotation>
+ <complexType>
+ <sequence>
+ <group ref="tns:wireObjectGroup" maxOccurs="unbounded" />
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ <attribute name="var" type="string">
+ <annotation><documentation>Name of the variable in which the result
+ of the script evaluation will be stored</documentation></annotation>
+ </attribute>
+ <attribute name="unique" type="string">
+ <annotation><documentation>Does this query return a unique result or a list
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <attributeGroup name="activityAttributes">
+ <attribute name="name" type="string">
+ <annotation><documentation>The id of this activity. The name should be unique
+ in the complete scope of the process.</documentation></annotation>
+ </attribute>
+ <attribute name="g" type="string">
+ <annotation><documentation>Graphical information used by process designer tool.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="continue" default="sync" type="tns:continueType">
+ <annotation><documentation>To specify async continuations.
+ sync is the default.
+ </documentation></annotation>
+ </attribute>
+ </attributeGroup>
+
+ <simpleType name="continueType">
+ <restriction base="string">
+ <enumeration value="async" />
+ <enumeration value="sync" />
+ <enumeration value="exclusive" />
+ </restriction>
+ </simpleType>
+
+
+ <attributeGroup name="assignmentAttributes">
+ <annotation><documentation>the assignment attributes will be used in
+ tasks and swimlanes to specify to whom these respectively are assigned.
+ </documentation></annotation>
+ <attribute name="assignee" type="string">
+ <annotation><documentation>Expression that resolves to a userId referencing
+ the person to which the task or swimlane will be assigned.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="assignee-lang" type="string">
+ <annotation><documentation>Expression language for the assignee attribute.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="candidate-users" type="string">
+ <annotation><documentation>Expression that resolves to a comma separated
+ list of userId's. All the referred people will be candidates for
+ take the task or swimlane.</documentation></annotation>
+ </attribute>
+ <attribute name="candidate-users-lang" type="string">
+ <annotation><documentation>Expression language for the
+ candidate-users attribute.</documentation></annotation>
+ </attribute>
+ <attribute name="candidate-groups" type="string">
+ <annotation><documentation>Resolves to a comma separated list of groupId's.
+ All the referred people will be candidates to
+ take the task or swimlane.</documentation></annotation>
+ </attribute>
+ <attribute name="candidate-groups-lang" type="string">
+ <annotation><documentation>Expression language for the
+ candidate-groups attribute.</documentation></annotation>
+ </attribute>
+ </attributeGroup>
+
+ <element name="swimlane">
+ <annotation><documentation>A process role.</documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="description" minOccurs="0" type="string" />
+ </sequence>
+ <attribute name="name" type="string" use="required" />
+ <attributeGroup ref="tns:assignmentAttributes" />
+ </complexType>
+ </element>
+
+ <complexType name="transitionType">
+ <annotation><documentation>The outgoing transitions. The first in the list
+ will be the default outgoing transition.
+ </documentation></annotation>
+ <sequence>
+ <element name="description" minOccurs="0" maxOccurs="unbounded" type="string" />
+ <group ref="tns:eventListenerGroup" minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attribute name="name" type="string">
+ <annotation><documentation>Name of this outgoing transition</documentation></annotation>
+ </attribute>
+ <attribute name="to" type="string">
+ <annotation><documentation>Name of the destination activity of this transition.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="g" type="string">
+ <annotation><documentation>Graphical information used by process designer tool.
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <element name="transition" type="tns:transitionType">
+ <annotation><documentation>A transition from one activity to another.</documentation></annotation>
+ </element>
+
+ <element name="on">
+ <complexType>
+ <sequence>
+ <element ref="tns:timer" minOccurs="0" />
+ <group ref="tns:eventListenerGroup" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>A list of event listeners that will
+ be notified when the event is fired</documentation></annotation>
+ </group>
+ </sequence>
+ <attribute name="event" type="string">
+ <annotation><documentation>The event identification. start, end, take or
+ any other custom event.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="continue" type="tns:continueType" default="sync" />
+ </complexType>
+ </element>
+
+ <complexType name="parameterType">
+ <attribute name="subvar" type="string">
+ <annotation><documentation>The name of the sub process variable.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="expr" type="string">
+ <annotation><documentation>An expression for which the resulting
+ value will be used as value.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="lang" type="string">
+ <annotation><documentation>Language of the expression.
+ </documentation></annotation>
+ </attribute>
+ <attribute name="var" type="string">
+ <annotation><documentation>Name of the process variable
+ in the super process execution..
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+
+
+ <element name="timer">
+ <complexType>
+ <sequence>
+ <annotation><documentation>A list of event listeners that will
+ be notified when the timer fires</documentation></annotation>
+ <element name="description" minOccurs="0" type="string" />
+ <group ref="tns:eventListenerGroup" minOccurs="0" maxOccurs="unbounded">
+ </group>
+ </sequence>
+ <attribute name="duedate" type="string">
+ <annotation><documentation>Timer duedate expression that defines the duedate of this
+ timer relative to the creation time of the timer. E.g. '2 hours' or '4 business days'
+ </documentation></annotation>
+ </attribute>
+ <attribute name="repeat" type="string">
+ <annotation><documentation>Timer duedate expression that defines repeated scheduling
+ relative to the last timer fire event. E.g. '2 hours' or '4 business days'
+ </documentation></annotation>
+ </attribute>
+ <attribute name="duedatetime" type="string">
+ <annotation><documentation>Absolute time in format <code>HH:mm dd/MM/yyyy</code>
+ (see SimpleDateFormat). The format for the absolute time can be customized in the
+ jbpm configuration.
+ </documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <group name="eventListenerGroup">
+ <choice>
+ <element name="event-listener">
+ <complexType>
+ <complexContent>
+ <extension base="tns:wireObjectType">
+ <attribute name="propagation" type="tns:booleanValueType" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="hql">
+ <complexType>
+ <complexContent>
+ <extension base="tns:qlType">
+ <attribute name="propagation" type="tns:booleanValueType" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="sql">
+ <complexType>
+ <complexContent>
+ <extension base="tns:qlType">
+ <attribute name="propagation" type="tns:booleanValueType" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="java">
+ <complexType>
+ <complexContent>
+ <extension base="tns:javaType">
+ <attribute name="propagation" type="tns:booleanValueType" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="script">
+ <complexType>
+ <complexContent>
+ <extension base="tns:scriptType">
+ <attribute name="propagation" type="tns:booleanValueType" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="mail">
+ <complexType>
+ <complexContent>
+ <extension base="tns:mailType">
+ <attribute name="propagation" type="tns:booleanValueType" />
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ </choice>
+ </group>
+
+ <complexType name="mailType">
+ <sequence>
+ <element name="description" minOccurs="0" maxOccurs="unbounded" type="string" />
+ <element name="from" type="tns:mailRecipientType" minOccurs="0" />
+ <element name="to" type="tns:mailRecipientType" minOccurs="0" />
+ <element name="cc" type="tns:mailRecipientType" minOccurs="0" />
+ <element name="bcc" type="tns:mailRecipientType" minOccurs="0" />
+ <element name="subject" type="string" minOccurs="0" />
+ <element name="text" type="string" minOccurs="0" />
+ <element name="html" type="string" minOccurs="0" />
+ <element name="attachments" minOccurs="0" >
+ <complexType>
+ <sequence>
+ <element name="attachment" maxOccurs="unbounded">
+ <complexType>
+ <attribute name="url" type="string">
+ <annotation><documentation>URL reference to the attachment</documentation></annotation>
+ </attribute>
+ <attribute name="resource" type="string">
+ <annotation><documentation>Name of the attachment resource on the classpath</documentation></annotation>
+ </attribute>
+ <attribute name="file" type="string">
+ <annotation><documentation>File reference to the attachment</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ <attribute name="template" type="tns:templateType" />
+ </complexType>
+
+ <complexType name="jmsType">
+ <choice minOccurs="1" maxOccurs="1">
+ <element name="object" type="tns:wireObjectType"/>
+ <element name="text" type="string"/>
+ <element name="map" type="tns:mapType"/>
+ </choice>
+ <attribute name="connection-factory" type="string">
+ <annotation><documentation>jndi name of the jms connection factory</documentation></annotation>
+ </attribute>
+ <attribute name="destination" type="string">
+ <annotation><documentation>jndi name of the destination to send the message to</documentation></annotation>
+ </attribute>
+ <attribute name="transacted" type="tns:booleanValueType" default="false">
+ <annotation><documentation>indicates whether the message should be sent in a transactional way</documentation></annotation>
+ </attribute>
+ <attribute name="acknowledge" type="tns:acknowledgeType" default="auto">
+ <annotation><documentation>indicates the acknowledgment mode</documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <complexType name="mailRecipientType">
+ <attribute name="addresses" type="string">
+ <annotation><documentation>list of email address separated by ',' (comma) ';' (semicolon) '|' or whitespace</documentation></annotation>
+ </attribute>
+ <attribute name="users" type="string">
+ <annotation><documentation>list of user ids that are resolved to the email address against configured identity component.
+ user ids should be separated by ',' (comma) ';' (semicolon) '|' or whitespace</documentation></annotation>
+ </attribute>
+ <attribute name="groups" type="string">
+ <annotation><documentation>list of group ids that are resolved to the email address against configured identity component.
+ group ids should be separated by ',' (comma) ';' (semicolon) '|' or whitespace</documentation></annotation>
+ </attribute>
+ </complexType>
+
+ <simpleType name="booleanValueType">
+ <restriction base="string">
+ <enumeration value="true" />
+ <enumeration value="on" />
+ <enumeration value="enabled" />
+ <enumeration value="false" />
+ <enumeration value="off" />
+ <enumeration value="disabled" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="acknowledgeType">
+ <restriction base="string">
+ <enumeration value="auto" />
+ <enumeration value="client" />
+ <enumeration value="dups-ok" />
+ </restriction>
+ </simpleType>
+
+
+ <simpleType name="templateType">
+ <annotation><documentation>Reference to the email template</documentation></annotation>
+ <restriction base="string"></restriction>
+ </simpleType>
+
+ <element name="migrate-instances">
+ <annotation><documentation>Information to migrate instances of previously deployed process definitions
+ to the new one</documentation></annotation>
+ <complexType>
+ <sequence>
+ <element name="migration-handler" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>The migration handler specifies the name of a class to be executed while migrating the process instance.</documentation></annotation>
+ <complexType>
+ <attribute name="class"/>
+ </complexType>
+ </element>
+ <element name="activity-mapping" minOccurs="0" maxOccurs="unbounded">
+ <annotation><documentation>One activity mapping will be present for each activity of which the name changed.</documentation></annotation>
+ <complexType>
+ <attribute name="old-name" type="string" use="required">
+ <annotation><documentation>The name of the activity in the previously deployed process definition.</documentation></annotation>
+ </attribute>
+ <attribute name="new-name" type="string" use="required">
+ <annotation><documentation>The name of the activity in the newly deployed process definition</documentation></annotation>
+ </attribute>
+ </complexType>
+ </element>
+ </sequence>
+ <attribute name="action" type="tns:migrationActionType" default="migrate">
+ </attribute>
+ </complexType>
+ </element>
+
+ <simpleType name="migrationActionType">
+ <restriction base="string">
+ <enumeration value="end" />
+ <enumeration value="migrate" />
+ </restriction>
+ </simpleType>
+
+</schema>
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/Configuration.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/Configuration.java
new file mode 100644
index 0000000..d7378bb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/Configuration.java
@@ -0,0 +1,127 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+
+import org.xml.sax.InputSource;
+
+/**
+ * process engine configuration.
+ *
+ * @author Tom Baeyens
+ */
+public class Configuration {
+
+ /** singletone instance */
+ private static ProcessEngine singleton;
+
+ transient Configuration impl;
+
+ /** default constructor */
+ public Configuration() {
+ impl = instantiate("org.jbpm.pvm.internal.cfg.ConfigurationImpl");
+ }
+
+ // constructor for ConfigurationImpl to prevent construction loop
+ protected Configuration(Object o) {
+ }
+
+ protected Configuration instantiate(String className) {
+ Configuration implementation;
+ try {
+ Class<?> implementationClass = Class.forName(className, true, getClassLoader());
+ implementation = (Configuration) implementationClass.newInstance();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't instantiate configuration of type "+className, e);
+ }
+ return implementation;
+ }
+
+ protected ClassLoader getClassLoader() {
+ return Thread.currentThread().getContextClassLoader();
+ }
+
+ /** provide an xml string as the configuration resource */
+ public Configuration setXmlString(String xmlString) {
+ impl.setXmlString(xmlString);
+ return impl;
+ }
+
+ /** provide an classpath resource as the configuration file */
+ public Configuration setResource(String resource) {
+ impl.setResource(resource);
+ return impl;
+ }
+
+ /** provide an input stream as the configuration resource */
+ public Configuration setInputStream(InputStream inputStream) {
+ impl.setInputStream(inputStream);
+ return impl;
+ }
+
+ /** provide a sax input source as the configuration resource */
+ public Configuration setInputSource(InputSource inputSource) {
+ impl.setInputSource(inputSource);
+ return impl;
+ }
+
+ /** point with a url to the configuration file */
+ public Configuration setUrl(URL url) {
+ impl.setUrl(url);
+ return impl;
+ }
+
+ /** provide a File as the configuration file */
+ public Configuration setFile(File file) {
+ impl.setFile(file);
+ return impl;
+ }
+
+ /** after specifying the configuration resources with the other methods, a
+ * process engine can be created. */
+ public ProcessEngine buildProcessEngine() {
+ return impl.buildProcessEngine();
+ }
+
+ /** provides the hibernate session factory programmatically.
+ * The hibernateSessionFactory parameter is of type Object to
+ * prevent a dependency of the API on hibernate directly.*/
+ public Configuration setHibernateSessionFactory(Object hibernateSessionFactory){
+ return impl.setHibernateSessionFactory(hibernateSessionFactory);
+ }
+
+ /** get the singleton ProcessEngine that is created from the default
+ * configuration file 'jbpm.cfg.xml'. */
+ public static ProcessEngine getProcessEngine() {
+ if (singleton == null) {
+ synchronized (Configuration.class) {
+ if (singleton == null) {
+ singleton = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();
+ }
+ }
+ }
+ return Configuration.singleton;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/Deployment.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/Deployment.java
new file mode 100644
index 0000000..8214bdf
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/Deployment.java
@@ -0,0 +1,52 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+/** represents an existing deployment in the repository.
+ *
+ * @author Tom Baeyens
+ */
+public interface Deployment {
+
+ /** normal deployments for which contained process definitions
+ * can be executed. */
+ String STATE_ACTIVE = "active";
+
+ /** invisible for all operations except delete or resume. This is
+ * to have a kind of undoable delete operation. */
+ String STATE_SUSPENDED = "suspended";
+
+ /** unique identification of this deployment that is used as a reference in the service methods */
+ String getId();
+
+ /** typically correspond to the file name or url or some other
+ * form of identifying the source archive file for this deployment. */
+ String getName();
+
+ /** the timestamp can optionally be given and represents the last updated timestamp
+ * of the archive file that is being deployed.
+ * JBoss deployer makes use of this to remember if a file is already deployed or not.*/
+ long getTimestamp();
+
+ /** {@link #STATE_ACTIVE} or {@link #STATE_SUSPENDED} */
+ String getState();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/DeploymentQuery.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/DeploymentQuery.java
new file mode 100644
index 0000000..b09f2de
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/DeploymentQuery.java
@@ -0,0 +1,63 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+import java.util.List;
+
+/** find existing deployments in the repository.
+ *
+ * @author Tom Baeyens
+ */
+public interface DeploymentQuery {
+
+ String PROPERTY_TIMESTAMP = "timestamp";
+ String PROPERTY_STATE = "state";
+
+ /** only include a specific deployment by id */
+ DeploymentQuery deploymentId(String id);
+
+ /** only select suspended deployments */
+ DeploymentQuery suspended();
+
+ /** only select non-suspended deployments */
+ DeploymentQuery notSuspended();
+
+ /** order results ascending for property {@link #PROPERTY_TIMESTAMP}
+ * or {@link #PROPERTY_STATE} */
+ DeploymentQuery orderAsc(String property);
+
+ /** order results descending for property {@link #PROPERTY_TIMESTAMP}
+ * or {@link #PROPERTY_STATE} */
+ DeploymentQuery orderDesc(String property);
+
+ /** only select a specific page */
+ DeploymentQuery page(int firstResult, int maxResults);
+
+ /** execute the query and get the result list */
+ List<Deployment> list();
+
+ /** execute the query and get the unique result */
+ Deployment uniqueResult();
+
+ /** execute a count(*) query and returns number of results */
+ long count();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/Execution.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/Execution.java
new file mode 100644
index 0000000..184610b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/Execution.java
@@ -0,0 +1,226 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+
+import org.jbpm.api.model.OpenExecution;
+
+/** a runtime path of execution.
+ *
+ * <h3 id="state">State of an execution</h3>
+ *
+ * <p>The state of an execution is either active or locked. An active execution is either
+ * executing or waiting for an external trigger. If an execution is not in {@link #STATE_ACTIVE_ROOT}
+ * or {@link #STATE_ACTIVE_CONCURRENT} then it is locked. A locked execution is read only.
+ * </p>
+ *
+ * <p>When a new execution is created, it is in {@link #STATE_ACTIVE_ROOT}.
+ * {@link #STATE_ACTIVE_ROOT Some STATE_* constants} are provided that represent the
+ * most commonly used locked states. But the state '...' in the picture indicates
+ * thsat any tring can be provided as the state in the lock method.
+ * </p>
+ *
+ * <p>If an execution is locked, methods that change the execution will throw
+ * a {@link JbpmException} and the message will reference the actual locking state.
+ * {@link OpenExecution#setVariable(String, Object) updating variables},
+ * {@link OpenExecution#setPriority(int) updating priority} are not considered to change an
+ * execution.
+ * </p>
+ *
+ * <p>Make sure that comparisons between {@link #getState()} and the
+ * {@link #STATE_ACTIVE_ROOT STATE_* constants} are
+ * done with .equals and not with '==' because if executions are
+ * loaded from persistent storage, a new string is created instead
+ * of the constants.
+ * </p>
+ *
+ * <h3>Comments</h3>
+ *
+ * @author Tom Baeyens
+ */
+public interface Execution extends Serializable {
+
+ /** between creation of a new process instance and the start of that
+ * process instance. Typically this is only a very short period that is
+ * not observable thourgh the service interfaces. */
+ String STATE_CREATED = "created";
+
+ /** single (non-concurrent) path of execution that is an active indicator
+ * of the current position in the diagram. jBPM can be executing automatic
+ * activities or some external entity might be responsible for continuing the
+ * execution (wait state for jBPM). An active execution is always
+ * a leaf in the execution tree.
+ * This is the normal state of an execution and the initial state
+ * when creating a new execution. Make sure that comparisons are
+ * done with .equals and not with '==' because if executions are
+ * loaded from persistent storage, a new string is created instead
+ * of the constants. */
+ String STATE_ACTIVE_ROOT = "active-root";
+
+ /** concurrent path of execution that is an active indicator
+ * of the current position in the diagram. The parent of an active
+ * concurrent execution is always an inactive concurrent root. jBPM can
+ * be executing automatic
+ * activities or some external entity might be responsible for continuing the
+ * execution (wait state for jBPM).
+ * Make sure that comparisons are
+ * done with .equals and not with '==' because if executions are
+ * loaded from persistent storage, a new string is created instead
+ * of the constants. */
+ String STATE_ACTIVE_CONCURRENT = "active-concurrent";
+
+ /** parent of concurrent child executions.
+ * When an execution has concurrent child executions, it implies that
+ * this execution can't be active. For example, at a fork, the parent
+ * execution can wait inactively in the fork being till all the
+ * child executions are joined. Only leaves of the
+ * execution tree can be active. Make sure that comparisons are
+ * done with .equals and not with '==' because if executions are
+ * loaded from persistent storage, a new string is created instead
+ * of the constants. */
+ String STATE_INACTIVE_CONCURRENT_ROOT = "inactive-concurrent-root";
+
+ /** parent of a scoped execution. This execution is inactive,
+ * but points to the parent scope like e.g. a group.
+ * This execution has exactly 1 child execution. That indicates
+ * the state inside of the scope.
+ * Make sure that comparisons are
+ * done with .equals and not with '==' because if executions are
+ * loaded from persistent storage, a new string is created instead
+ * of the constants. */
+ String STATE_INACTIVE_SCOPE = "inactive-scope";
+
+ /** concurrent execution that is inactively waiting in a join
+ * until other concurrent executions arrive.
+ * Make sure that comparisons are
+ * done with .equals and not with '==' because if executions are
+ * loaded from persistent storage, a new string is created instead
+ * of the constants. */
+ String STATE_INACTIVE_JOIN = "inactive-join";
+
+ /** indicates that this execution is temporary suspended. Human tasks of
+ * a suspended execution
+ * shouldn't show up in people's task list and timers of suspended
+ * executions shouldn't fire and the execution is locked. Make sure that comparisons are
+ * done with .equals and not with '==' because if executions are
+ * loaded from persistent storage, a new string is created instead
+ * of the constants. */
+ String STATE_SUSPENDED = "suspended";
+
+ /** indicates that this execution is doing an asynchronous continuation. */
+ String STATE_ASYNC = "async";
+
+ /** this execution has ended. Make sure that comparisons are
+ * done with .equals and not with '==' because if executions are
+ * loaded from persistent storage, a new string is created instead
+ * of the constants. */
+ String STATE_ENDED = "ended";
+
+ /** the externally given name or id of this execution. The id of a main
+ * path of execution is null. Can be used to differentiate concurrent
+ * paths of execution e.g. the shipping and billing paths. */
+ String getName();
+
+ /** the optional user provided business key that is unique within one
+ * process definition. This could be for instance the order number.
+ * It's a user defined identifier for one execution within the scope of
+ * a single process definition. */
+ String getKey();
+
+ /** a globally unique identifier for this execution that is used as a reference in the service methods. */
+ String getId();
+
+ /** the <a href="#state">state</a> of this execution. */
+ String getState();
+
+ /**
+ * Returns whether this execution is a process instance.
+ * Note that we cannot use 'isProcessInstance', since this
+ * would clash with 'getProcessInstance()' when using expressions.
+ * (see JBPM-2494)
+ * */
+ boolean getIsProcessInstance();
+
+ /** is this execution ended */
+ boolean isEnded();
+
+ /** is this execution suspended ? */
+ boolean isSuspended();
+
+ /** indicates low priorities with negative values and high priorities
+ * with positive values. The default priority is 0, which means
+ * NORMAL. Other recognized named priorities are HIGHEST (2), HIGH (1),
+ * LOW (-1) and LOWEST (-2). For the rest, the user can set any other
+ * priority integer value, but then, the UI will have to display it as
+ * an integer and not the named value.*/
+ int getPriority();
+
+ // execution hierarchy access ///////////////////////////////////////////////
+
+ /** the main path of execution in the <a href="package-summary.html#basicexecutionstructure">execution
+ * structure</a>. Null will be returned in case this execution itself is the
+ * main execution path. */
+ Execution getProcessInstance();
+
+ /** the parent execution in the <a href="package-summary.html#basicexecutionstructure">execution
+ * structure</a>. Null will be returned in case this execution itself is the
+ * main execution path. */
+ Execution getParent();
+
+ /** the child executions in the <a href="package-summary.html#basicexecutionstructure">execution
+ * structure</a>. Can be null and can be an empty collection. */
+ Collection<? extends Execution> getExecutions();
+
+ /** maps child execution names to execution objects. In case multiple executions
+ * have the same name, the first one is taken. Can be null or can be an empty
+ * map. The first execution without a name is also included with null as the key.
+ */
+ Map<String, Execution> getExecutionsMap();
+
+ /** the child execution for the given name or null in case such execution doesn't exist. */
+ Execution getExecution(String name);
+
+ /** indicates if this execution has a child execution with the given executionName */
+ boolean hasExecution(String executionName);
+
+ /** search for an execution that is active and in the given activityName.
+ * Returns null in case there is no such execution.
+ * @see #findActiveActivityNames() */
+ Execution findActiveExecutionIn(String activityName);
+
+ /** get the set of all activities that are active.
+ * Returns an empty set in case there are no activities active.
+ * @see #findActiveExecutionIn(String) */
+ Set<String> findActiveActivityNames();
+
+ /** is the given activity active.
+ * This execution and its child executions are searched. If this is a
+ * process instance, this means that the whole process instance is searched. */
+ boolean isActive(String activityName);
+
+ /** id of the process definition used for this execution */
+ String getProcessDefinitionId();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ExecutionService.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ExecutionService.java
new file mode 100644
index 0000000..bdcf219
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ExecutionService.java
@@ -0,0 +1,128 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+import java.util.Map;
+import java.util.Set;
+
+
+/** manages runtime process executions.
+ *
+ * @author Tom Baeyens
+ */
+public interface ExecutionService {
+
+ /** starts a new process instance for the ProcessDefinition with the given processDefinitionDbid.
+ * @param processDefinitionId the {@link ProcessDefinition#getId() unique id} of the process definition. */
+ ProcessInstance startProcessInstanceById(String processDefinitionId);
+
+ /** starts a new process instance for the ProcessDefinition with the given processDefinitionDbid.
+ * @param processDefinitionId the {@link ProcessDefinition#getId() unique id} of the process definition.
+ * @param processInstanceKey is a user provided reference for the new process instance that must be unique over all
+ * process definition versions with the same name. */
+ ProcessInstance startProcessInstanceById(String processDefinitionId, String processInstanceKey);
+
+ /** starts a new process instance for the ProcessDefinition with the given processDefinitionDbid.
+ * @param processDefinitionId the {@link ProcessDefinition#getId() unique id} of the process definition.
+ * @param variables are the initial values of the process variables that will be set before the execution starts. */
+ ProcessInstance startProcessInstanceById(String processDefinitionId, Map<String, Object> variables);
+
+ /** starts a new process instance for the ProcessDefinition with the given processDefinitionDbid.
+ * @param processDefinitionId the {@link ProcessDefinition#getId() unique id} of the process definition.
+ * @param variables are the initial values of the process variables that will be set before the execution starts.
+ * @param processInstanceKey is a user provided reference for the new process instance that must be unique over all
+ * process versions with the same name. */
+ ProcessInstance startProcessInstanceById(String processDefinitionId, Map<String, Object> variables, String processInstanceKey);
+
+ /** starts a new process instance in the latest version of the given process definition.
+ * @param processDefinitionKey is the key of the process definition for which the latest version will be taken. */
+ ProcessInstance startProcessInstanceByKey(String processDefinitionKey);
+
+ /** starts a new process instance in the latest version of the given processDefinitionName.
+ * @param processDefinitionKey is the key of the process definition
+ * for which the latest version will be taken.
+ * @param processInstanceKey is a user provided reference for the new process instance
+ * that must be unique over all process versions with the same name. */
+ ProcessInstance startProcessInstanceByKey(String processDefinitionKey, String processInstanceKey);
+
+ /** starts a new process instance in the latest version of the given processDefinitionName.
+ * @param processDefinitionKey is the key of the process definition
+ * for which the latest version will be taken.
+ * @param variables are the initial values of the process variables that
+ * will be set before the execution starts (read: before the initial
+ * activity is executed). */
+ ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, ?> variables);
+
+ /** starts a new process instance in the latest version of the given processDefinitionName.
+ * @param processDefinitionKey is the key of the process definition for which the latest version will be taken.
+ * @param variables are the initial values of the process variables that will be set before the execution starts.
+ * @param processInstanceKey is a user provided reference for the new execution that must be unique over all
+ * process versions with the same name. */
+ ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, ?> variables, String processInstanceKey);
+
+ /** the path of execution that is uniquely defined by the execution id. */
+ Execution findExecutionById(String executionId);
+
+ /** the process instance that is uniquely defined by the process execution id. */
+ ProcessInstance findProcessInstanceById(String processInstanceId);
+
+ /** provides an external trigger to an execution. */
+ ProcessInstance signalExecutionById(String executionId);
+
+ /** provides a named external trigger to an execution. */
+ ProcessInstance signalExecutionById(String executionId, String signalName);
+
+ /** provides a named external trigger to an execution with parameters. */
+ ProcessInstance signalExecutionById(String executionId, String signalName, Map<String, ?> parameters);
+
+ /** provides a external trigger to an execution with parameters. */
+ ProcessInstance signalExecutionById(String executionId, Map<String, ?> parameters);
+
+
+ /** search for process instances with criteria */
+ ProcessInstanceQuery createProcessInstanceQuery();
+
+ /** creates or overwrites a variable value on the referenced execution */
+ void setVariable(String executionId, String name, Object value);
+
+ /** creates or overwrites the variable values on the referenced execution */
+ void setVariables(String executionId, Map<String, ?> variables);
+
+ /** retrieves a variable */
+ Object getVariable(String executionId, String variableName);
+
+ /** all the variables visible in the given execution scope */
+ Set<String> getVariableNames(String executionId);
+
+ /** retrieves a map of variables */
+ Map<String, Object> getVariables(String executionId, Set<String> variableNames);
+
+ /** end a process instance */
+ void endProcessInstance(String processInstanceId, String state);
+
+ /** delete a process instance. The history information will still be
+ * in the database. */
+ void deleteProcessInstance(String processInstanceId);
+
+ /** delete a process instance, including the history information. */
+ void deleteProcessInstanceCascade(String processInstanceId);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/HistoryService.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/HistoryService.java
new file mode 100644
index 0000000..32a4188
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/HistoryService.java
@@ -0,0 +1,56 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+import java.util.Map;
+
+import org.jbpm.api.history.HistoryActivityInstanceQuery;
+import org.jbpm.api.history.HistoryDetailQuery;
+import org.jbpm.api.history.HistoryProcessInstanceQuery;
+import org.jbpm.api.history.HistoryTaskQuery;
+
+
+/** exposes the history information for ongoing and past
+ * process instances.
+ *
+ * @author Tom Baeyens
+ */
+public interface HistoryService {
+
+ /** search for process instances in the history */
+ HistoryProcessInstanceQuery createHistoryProcessInstanceQuery();
+
+ /** search in history activity instance information */
+ HistoryActivityInstanceQuery createHistoryActivityInstanceQuery();
+
+ /** search in history task information */
+ HistoryTaskQuery createHistoryTaskQuery();
+
+ /** search in history details */
+ HistoryDetailQuery createHistoryDetailQuery();
+
+ /** returns the average duration in milliseconds for each activity in the given process definition */
+ Map<String, Long> avgDurationPerActivity(String processDefinitionId);
+
+ /** returns for each transitionName, the number of times that transition was taken */
+ Map<String, Integer> choiceDistribution(String processDefinitionId, String activityName);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/IdentityService.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/IdentityService.java
new file mode 100644
index 0000000..443742f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/IdentityService.java
@@ -0,0 +1,101 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+import java.util.List;
+
+import org.jbpm.api.identity.Group;
+import org.jbpm.api.identity.User;
+
+/** interface to expose the (configurable) identity component that is
+ * used by jBPM.
+ *
+ * @author Tom Baeyens
+ */
+public interface IdentityService {
+
+ /** create a new user. */
+ void createUser(String userId, String givenName, String familyName);
+
+ /** create a new user, providing an email address */
+ void createUser(String userId, String givenName, String familyName, String businessEmail);
+
+ /** lookup a user
+ * @return the user or null if no such user exists */
+ User findUserById(String userId);
+
+ /** get all the users in the system.
+ * Returns an empty list if no users exist. */
+ List<User> findUsers();
+
+ /** delete the given user.
+ * No effect (no exception) if the user does not exist.
+ * Deletes also the memberships related to the given user, but does not delete the
+ * associated groups. */
+ void deleteUser(String userId);
+
+ /** create a group new group
+ * @return the generated id for this group. */
+ String createGroup(String groupName);
+
+ /** create a group new group
+ * @return the generated id for this group. */
+ String createGroup(String groupName, String groupType);
+
+ /** create a group new group
+ * @return the generated id for this group. */
+ String createGroup(String groupName, String groupType, String parentGroupId);
+
+ /** lookup a group.
+ * @return the user or null if no such user exists */
+ Group findGroupById(String groupId);
+
+ /** groups of the given groupType for which the given user is a member.
+ * Returns an empty list if no such groups exist. */
+ List<Group> findGroupsByUserAndGroupType(String userId, String groupType);
+
+ /** all group ids (String) for which this user is a member.
+ * Returns an empty list if no such groups exist. */
+ List<Group> findGroupsByUser(String userId);
+
+ /** all group ids (String) for which this user is a member.
+ * Returns an empty list if no such groups exist. */
+ List<String> findGroupIdsByUser(String userId);
+
+ /** deletes the given group.
+ * No effect (no exception) if the group does not exist.
+ * Deleting a group also deletes all the memberships associated to that group,
+ * but not the associated users. */
+ void deleteGroup(String groupId);
+
+ /** makes the given user a member of the given group. */
+ void createMembership(String userId, String groupId);
+
+ /** makes the given user a member of the given group with the given role.
+ * Role can be null. */
+ void createMembership(String userId, String groupId, String role);
+
+ /** deletes the identified relation between a user and a group.
+ * Role can be null. If no such membership exists, this method will
+ * not throw an exception and have no effect. */
+ void deleteMembership(String userId, String groupId, String role);
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/JbpmException.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/JbpmException.java
new file mode 100644
index 0000000..61525a2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/JbpmException.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+/** all exceptions that jBPM throws are JbpmException's
+ * (extends RuntimeException).*/
+public class JbpmException extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+ public JbpmException() {
+ super();
+ }
+ public JbpmException(String msg, Throwable cause) {
+ super(msg);
+ super.initCause(cause);
+ }
+ public JbpmException(String msg) {
+ super(msg);
+ }
+ public JbpmException(Throwable cause) {
+ super();
+ super.initCause(cause);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/JobQuery.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/JobQuery.java
new file mode 100644
index 0000000..0471939
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/JobQuery.java
@@ -0,0 +1,75 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+import java.util.List;
+
+import org.jbpm.api.job.Job;
+
+
+/** query for jBPM related messages and timers.
+ *
+ * <p>Both {@link org.jbpm.api.job.Message messages} and
+ * {@link org.jbpm.api.job.Timer timers} are
+ * {@link org.jbpm.api.job.Job jobs}.</p>
+ *
+ * @author Tom Baeyens
+ */
+public interface JobQuery {
+
+ /** duedate property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ public static final String PROPERTY_DUEDATE = "duedate";
+ /** state property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ public static final String PROPERTY_STATE = "state";
+
+ /** only select messages */
+ JobQuery messages();
+
+ /** only select timers */
+ JobQuery timers();
+
+ /** only select jobs related to the given process instance */
+ JobQuery processInstanceId(String processInstanceId);
+
+ /** only select jobs that were rolled back due to an exception */
+ JobQuery exception(boolean hasException);
+
+ /** order ascending for property {@link #PROPERTY_STATE}
+ * or {@link #PROPERTY_DUEDATE} */
+ JobQuery orderAsc(String property);
+
+ /** order descending for property {@link #PROPERTY_STATE}
+ * or {@link #PROPERTY_DUEDATE} */
+ JobQuery orderDesc(String property);
+
+ /** only select a specific page */
+ JobQuery page(int firstResult, int maxResults);
+
+ /** execute the query and get the result list */
+ List<Job> list();
+
+ /** execute the query and get the unique result */
+ Job uniqueResult();
+
+ /** execute a count(*) query and returns number of results */
+ long count();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ManagementService.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ManagementService.java
new file mode 100644
index 0000000..e92055b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ManagementService.java
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+
+/** operations targeted to system operators that need to keep
+ * the process engine up and running. This functionality is typically
+ * exposed through a management web console.
+ *
+ * @author Tom Baeyens
+ */
+public interface ManagementService {
+
+ /** resets the retry count, clears the exception and executes the job.
+ * An exception is thrown out of this method in case the execution
+ * of the job fails. In case the async command executor is configured
+ * for this service, failing job execution will not result into an
+ * exception coming out of this method. */
+ void executeJob(String jobId);
+
+ /** search for jobs */
+ JobQuery createJobQuery();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/NewDeployment.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/NewDeployment.java
new file mode 100644
index 0000000..68bb466
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/NewDeployment.java
@@ -0,0 +1,70 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.zip.ZipInputStream;
+
+/** extends a {@link Deployment} with method for creating a new
+ * deployment.
+ *
+ * @see RepositoryService#createDeployment()
+ *
+ * @author Tom Baeyens
+ */
+public interface NewDeployment extends Deployment {
+
+ /** typically correspond to the file name or url or some other
+ * form of identifying the source archive file for this deployment. */
+ NewDeployment setName(String name);
+
+ /** the timestamp can optionally be given and represents the last updated timestamp
+ * of the archive file that is being deployed.
+ * JBoss deployer makes use of this to remember if a file is already deployed or not.*/
+ NewDeployment setTimestamp(long timestamp);
+
+ /** adds a resource as a string */
+ NewDeployment addResourceFromString(String resourceName, String string);
+
+ /** adds a resource as a string */
+ NewDeployment addResourceFromInputStream(String resourceName, InputStream inputStream);
+
+ /** adds a resource as a resource from the classpath */
+ NewDeployment addResourceFromClasspath(String resourceName);
+
+ /** adds a resource as a url */
+ NewDeployment addResourceFromUrl(URL url);
+
+ /** adds a resource as a zip stream */
+ NewDeployment addResourcesFromZipInputStream(ZipInputStream zipInputStream);
+
+ /** adds a resource from a file */
+ NewDeployment addResourceFromFile(File file);
+
+ /** after adding resources, this will perform the actual deployment.
+ * @return the generated deploymentId identification for this deployment
+ * in the {@link RepositoryService repository}. */
+ String deploy();
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessDefinition.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessDefinition.java
new file mode 100644
index 0000000..2c094f0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessDefinition.java
@@ -0,0 +1,65 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+import java.io.Serializable;
+
+
+/** a graphical process which is deployed in the {@link RepositoryService}.
+ *
+ * @author Tom Baeyens
+ */
+public interface ProcessDefinition extends Serializable {
+
+ /** the short display name given to this process definition.
+ * Multiple process definitions can have the same as long
+ * as they are given a different {@link #getVersion() version}. */
+ String getName();
+
+ /** the user defined short representation of the name. Just
+ * like the name, multiple versions of a process definition
+ * can have the same key. */
+ String getKey();
+
+ /** the unique id for this process definition that is used as a reference in the service methods. */
+ String getId();
+
+ /** automatically assigned during deployment of a process that
+ * represents the sequence number for process definitions with
+ * the same {@link #getName() name}. */
+ int getVersion();
+
+ /** references the deployment in which this process definition is
+ * deployed. */
+ String getDeploymentId();
+
+ /** the name of the resource in the deployment which contains the image
+ * file for this process */
+ String getImageResourceName();
+
+ /** description of the process definition */
+ String getDescription();
+
+ /** Returns whether this process definition is currently suspended. */
+ boolean isSuspended();
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessDefinitionQuery.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessDefinitionQuery.java
new file mode 100644
index 0000000..1699c26
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessDefinitionQuery.java
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+import java.util.List;
+
+/** query for {@link ProcessDefinition process definitions}.
+ *
+ * @author Tom Baeyens
+ */
+public interface ProcessDefinitionQuery {
+
+ /** id property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_ID = "idProperty.stringValue";
+ /** key property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_KEY = "keyProperty.stringValue";
+ /** name property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_NAME = "idProperty.objectName";
+ /** version property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_VERSION = "versionProperty.longValue";
+ /** timestamp property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_DEPLOYMENT_TIMESTAMP = "deployment.timestamp";
+
+ /** select only the process definition with the given id */
+ ProcessDefinitionQuery processDefinitionId(String processDefinitionId);
+
+ /** select only process definitions with the given key */
+ ProcessDefinitionQuery processDefinitionKey(String key);
+
+ /** select only process definitions with a name like the
+ * given name (name can include % signs to act as wildcard)) */
+ ProcessDefinitionQuery processDefinitionNameLike(String name);
+
+ /** select only process definitions with an exact match for the given name */
+ ProcessDefinitionQuery processDefinitionName(String name);
+
+ /** select only process definitions within the given deployment */
+ ProcessDefinitionQuery deploymentId(String deploymentId);
+
+ /** select only suspended process definitions */
+ ProcessDefinitionQuery suspended();
+
+ /** select only process definitions that are not suspended */
+ ProcessDefinitionQuery notSuspended();
+
+ /** order selected process definitions ascending for certain {@link #PROPERTY_ID properties} */
+ ProcessDefinitionQuery orderAsc(String property);
+
+ /** order selected process definitions descending for certain {@link #PROPERTY_ID properties} */
+ ProcessDefinitionQuery orderDesc(String property);
+
+ /** select a specific page in the result set */
+ ProcessDefinitionQuery page(int firstResult, int maxResults);
+
+ /** execute the query and obtain the list of {@link ProcessDefinition}s */
+ List<ProcessDefinition> list();
+
+ /** execute the query and obtain the unique {@link ProcessDefinition} */
+ ProcessDefinition uniqueResult();
+
+ /** execute a count(*) query and returns number of results */
+ long count();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessEngine.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessEngine.java
new file mode 100644
index 0000000..92c8217
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessEngine.java
@@ -0,0 +1,93 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+import java.sql.Connection;
+
+import org.jbpm.api.cmd.Command;
+
+
+/** central starting point for all process engine API
+ * interactions. This is a thread safe object so it can be
+ * kept in a static member field or in JNDI or something
+ * similar from which all threads (requests) will fetch the
+ * same ProcessEngine object.
+ *
+ * @author Tom Baeyens
+ */
+public interface ProcessEngine {
+
+ /** the {@link RepositoryService repository service} that provides access
+ * to the process repository. */
+ RepositoryService getRepositoryService();
+
+ /** the {@link ExecutionService execution service} that provides access
+ * to the runtime executions repository. */
+ ExecutionService getExecutionService();
+
+ /** the {@link HistoryService history service} that provides access
+ * to the history executions repository. */
+ HistoryService getHistoryService();
+
+ /** the {@link TaskService task service} that exposes the
+ * runtime human task lists. */
+ TaskService getTaskService();
+
+ /** the {@link IdentityService identity service} that exposes the
+ * user and group operations management operations. */
+ IdentityService getIdentityService();
+
+ /** the {@link ManagementService management service} that exposes the
+ * management operations to operators that have to keep the jBPM system
+ * up and running. */
+ ManagementService getManagementService();
+
+ /** retrieve and object defined in the process engine by type */
+ <T> T get(Class<T> type);
+
+ /** retrieve and object defined in the process engine by name */
+ Object get(String name);
+
+ /** sets the authenticated user's id for the next invocation of
+ * a service method in the same thread.
+ * This method returns the process engine for convenient method concatenations. */
+ ProcessEngine setAuthenticatedUserId(String authenticatedUserId);
+
+ /** sets the hibernate session for the next invocation of
+ * a service method in the same thread.
+ * The hibernateSession parameter is of type Object to
+ * prevent a dependency of the API on hibernate directly.
+ * This method returns the process engine for convenient method concatenations. */
+ ProcessEngine setHibernateSession(Object hibernateSession);
+
+ /** sets the hibernate session for the next invocation of
+ * a service method in the same thread.
+ * This method returns the process engine for convenient method concatenations. */
+ ProcessEngine setJdbcConnection(Connection jdbcConnection);
+
+ /** perform a user command. that allows users to span a transaction over
+ * their own updates, as well as the jbpm operations. */
+ <T> T execute(Command<T> command);
+
+ /** clean shutdown of the engine. */
+ void close();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessInstance.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessInstance.java
new file mode 100644
index 0000000..8c2b3a9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessInstance.java
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+
+/** a process instance is one execution of a process definition.
+ * One process instance can have many concurrent executions.
+ * Executions are structured in a tree of which the ProcessInstance
+ * is the root.
+ *
+ * @author Tom Baeyens
+ */
+public interface ProcessInstance extends Execution {
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessInstanceQuery.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessInstanceQuery.java
new file mode 100644
index 0000000..f0fb600
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/ProcessInstanceQuery.java
@@ -0,0 +1,68 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+import java.util.List;
+
+
+/** query for {@link ProcessInstance process instances}.
+ *
+ * @author Tom Baeyens
+ */
+public interface ProcessInstanceQuery {
+
+ /** key property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_KEY = "key";
+
+ /** select only process instances for the given process definition */
+ ProcessInstanceQuery processDefinitionId(String processDefinitionId);
+
+ /** select only a specific process instances using the process instance id */
+ ProcessInstanceQuery processInstanceId(String processInstanceId);
+
+ /** select only specific process instances using a business key */
+ ProcessInstanceQuery processInstanceKey(String processInstanceKey);
+
+ /** select only suspended process definitions */
+ ProcessInstanceQuery suspended();
+
+ /** select only process definitions that are not suspended */
+ ProcessInstanceQuery notSuspended();
+
+ /** order selected process instances ascending for certain {@link #PROPERTY_KEY properties} */
+ ProcessInstanceQuery orderAsc(String property);
+
+ /** order selected process instances descending for certain {@link #PROPERTY_KEY properties} */
+ ProcessInstanceQuery orderDesc(String property);
+
+ /** select a specific page in the result set */
+ ProcessInstanceQuery page(int firstResult, int maxResults);
+
+ /** execute the query and obtain the list of {@link ProcessInstance}s */
+ List<ProcessInstance> list();
+
+ /** execute the query and obtain the unique {@link ProcessInstance} */
+ ProcessInstance uniqueResult();
+
+ /** execute a count(*) query and returns number of results */
+ long count();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/RepositoryService.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/RepositoryService.java
new file mode 100644
index 0000000..38d8da0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/RepositoryService.java
@@ -0,0 +1,94 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+import java.io.InputStream;
+import java.util.List;
+import java.util.Set;
+
+import org.jbpm.api.model.ActivityCoordinates;
+
+
+/** exposes the repository of deployments.
+ *
+ * <p>Deployments contain a set of named resources. Those
+ * resources can represent process definitions, forms, images and so on.
+ * </p>
+ *
+ * <p>The repository contains and manages the process definitions.
+ * </p>
+ *
+ * @author Tom Baeyens
+ */
+public interface RepositoryService {
+
+ /** create a new deployment. The deployment will only be deployed into
+ * the repository after invoking the {@link NewDeployment#deploy()}. */
+ NewDeployment createDeployment();
+
+ /** similar to deleting a deployment. The difference is that
+ * all the data remains in the database. So that the suspending
+ * can be undone with {@link #resumeDeployment(String)}. */
+ void suspendDeployment(String deploymentId);
+
+ /** resume a suspended deployment. */
+ void resumeDeployment(String deploymentId);
+
+ /** deletes a deployment if the process definitions don't have
+ * running executions. history information (if any) remains
+ * in the database. */
+ void deleteDeployment(String deploymentId);
+
+ /** deletes deployment, contained process definitions, related process instances
+ * and their history information */
+ void deleteDeploymentCascade(String deploymentId);
+
+ /** Returns all the resources stored in the deployment with the given id. */
+ Set<String> getResourceNames(String deploymentId);
+
+ /** obtain an InputStream to a resource in a deployment */
+ InputStream getResourceAsStream(String deploymentId, String resourceName);
+
+ /** create a query for process definitions */
+ ProcessDefinitionQuery createProcessDefinitionQuery();
+
+ /** create a query for deployments */
+ DeploymentQuery createDeploymentQuery();
+
+ /** find all the activity names of the start activities for a given
+ * process definition. Only top level activities are scanned.
+ * Every activity that doesn't have incoming transitions is considered
+ * a start activity. For the moment, jPDL only supports one
+ * start activity. Start activity names can be null. */
+ List<String> getStartActivityNames(String processDefinitionId);
+
+ /** the resource name for the given start activity. It is assumed that
+ * the ProcessDefinition is already retrieved. From the ProcessDefinition,
+ * the {@link ProcessDefinition#getId()} and the {@link ProcessDefinition#getDeploymentId()}
+ * can be retrieved. The activityName can be obtained via {@link #getStartActivityNames(String)}.
+ * An InputStream for the resource can be obtained with {@link #getResourceAsStream(String, String)} */
+ String getStartFormResourceName(String processDefinitionId, String activityName);
+
+ /** the coordinates for the activity on
+ * {@link ProcessDefinition#getImageResourceName() the process image}. */
+ ActivityCoordinates getActivityCoordinates(String processDefinitionId, String activityName);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/TaskQuery.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/TaskQuery.java
new file mode 100644
index 0000000..fc24861
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/TaskQuery.java
@@ -0,0 +1,94 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+import java.util.List;
+
+import org.jbpm.api.task.Task;
+
+
+/** query for tasks.
+ *
+ * @author Tom Baeyens
+ * @author Heiko Braun <heiko.braun@jboss.com> */
+public interface TaskQuery {
+
+ /** name property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_NAME = "name";
+ /** assignee property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_ASSIGNEE = "assignee";
+ /** createdate property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_CREATEDATE = "createTime";
+ /** duedate property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_DUEDATE = "duedate";
+ /** priority property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_PRIORITY = "priority";
+ /** progress property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_PROGRESS = "progress";
+
+ /** only select tasks for which the given user is the assignee */
+ TaskQuery assignee(String userId);
+
+ /** only select tasks that are unassigned.
+ * These tasks can still potentially have candidates. */
+ TaskQuery unassigned();
+
+ /** only query for tasks for which the given user is a candidate.
+ * The user could be associated directly as a candidate participant
+ * to the task or the user could be a member of a group that is
+ * associated as a candidate group to the task. */
+ TaskQuery candidate(String userId);
+
+ /** only select tasks that are associated to the given process instance */
+ TaskQuery processInstanceId(String processInstanceId);
+
+ /** only select tasks that are associated to the given process definition */
+ TaskQuery processDefinitionId(String processDefinitionId);
+
+ /** only select tasks that are associated to the given activity name. This
+ * can be used in combination with the {@link #processDefinitionId(String)} */
+ TaskQuery activityName(String activityName);
+
+ /** only select suspended tasks */
+ TaskQuery suspended();
+
+ /** only select tasks that are not suspended */
+ TaskQuery notSuspended();
+
+ /** select a specific page in the result set */
+ TaskQuery page(int firstResult, int maxResults);
+
+ /** order selected tasks ascending for certain {@link #PROPERTY_NAME properties} */
+ TaskQuery orderAsc(String property);
+
+ /** order selected tasks descending for certain {@link #PROPERTY_NAME properties} */
+ TaskQuery orderDesc(String property);
+
+ /** execute a count(*) query and returns number of results */
+ long count();
+
+ /** execute the query and obtain the list of {@link Task}s */
+ List<Task> list();
+
+ /** execute the query and obtain the unique {@link Task} */
+ Task uniqueResult();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/TaskService.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/TaskService.java
new file mode 100644
index 0000000..cd1b9d6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/TaskService.java
@@ -0,0 +1,192 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api;
+
+import org.jbpm.api.history.HistoryComment;
+import org.jbpm.api.history.HistoryActivityInstance;
+import org.jbpm.api.task.Participation;
+import org.jbpm.api.task.Task;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/** task management.
+ *
+ * @author Tom Baeyens
+ * @author Alejandro Guizar
+ * @author Heiko Braun <heiko.braun@jboss.com>
+ */
+public interface TaskService {
+
+ /** Creates a task.
+ * The returned task will be transient.
+ * Use {@link #saveTask(Task)} to persist the task. Only
+ * after the invocation of {@link #saveTask(Task)}, the
+ * {@link Task#getId()} property will be initialized. */
+ Task newTask();
+
+ /** Creates a new subtask for the given task.
+ * Make sure that the parent task is saved before the
+ * {@link Task#getId() Id} is taken.
+ * The returned task will be transient.
+ * Use {@link #saveTask(Task)} to persist the task. */
+ Task newTask(String parentTaskId);
+
+ /** Saves the given task to persistent storage.
+ * @return the taskId */
+ String saveTask(Task task);
+
+ /** Retrieves the task with the given identifier from persistent storage.
+ * If no task with the given identifier exists,
+ * the call returns <code>null</code>. */
+ Task getTask(String taskId);
+
+ /** assigns this task to the given assignee. */
+ void assignTask(String taskId, String userId);
+
+ /** taking this task will prevent all other candidates from
+ * taking and working on this task.
+ * The inverse operation of putting the task back into the group
+ * for someone else to take it, can be done by providing a null value
+ * for userId in the {@link #assignTask(String, String)} method:
+ * <code>taskService.assignTask(taskId, null);</code>
+ * @throws JbpmException if this task already has been taken. */
+ void takeTask(String taskId, String userId);
+
+ /** Deletes this task, marks the related history task as completed.
+ * If the task was created in the context
+ * of a process execution, this operation may result in a process instance
+ * being triggered. */
+ void completeTask(String taskId);
+
+ /** Deletes this task and marks the related history task as completed. The
+ * given variables are created (or they overwrite existing values) as task
+ * variables. If the task was created in the context of a process execution,
+ * this operation may result in a process instance being triggered to
+ * continue.*/
+ void completeTask(String taskId, Map<String, Object> variables);
+
+ /** Deletes this task, marks the related history task as completed
+ * with the specified outcome. If the task was created in the context
+ * of a process execution, this operation may result in a process instance
+ * being triggered. The outcome in that case corresponds to an outgoing
+ * transition in the process. */
+ void completeTask(String taskId, String outcome);
+
+ /** Deletes this task, marks the related history task as completed with the
+ * specified outcome. The given variables are created (or they overwrite
+ * existing values) as task variables. If the task was created in the context
+ * of a process execution, this operation may result in a process instance
+ * being triggered. The outcome in that case corresponds to an outgoing
+ * transition in the process. */
+ void completeTask(String taskId, String outcome, Map<String, Object> variables);
+
+ /** Deletes the task without completing it.
+ * The history information is kept in the DB.
+ * If this task was created in the context of a process execution,
+ * the execution remains active and the {@link ExecutionService#signalExecutionById(String)}
+ * is to be given explicitly. */
+ void deleteTask(String taskId);
+
+ /** deletes this task, including all history information */
+ void deleteTaskCascade(String taskId);
+
+ /** Deletes the task without completing indicating the reason. Example reasons
+ * could be: "failed", "error", "exited", "obsolete" or "deleted".
+ * The history information is kept in the DB.
+ * The reason ends up as the state in the {@link HistoryActivityInstance}.
+ * If this task was created in the context of a process execution,
+ * the execution remains active and the {@link ExecutionService#signalExecutionById(String)}
+ * is to be given explicitly. */
+ void deleteTask(String taskId, String reason);
+
+ /** add a role to a given task.
+ * @param participationType specifies the kind of involvement of the participatingUser
+ * in this task. see {@link Participation} for default constants. */
+ void addTaskParticipatingUser(String taskId, String userId, String participationType);
+
+ /** add a role to a given task.
+ * @param participationType specifies the kind of involvement of the participatingUser
+ * in this task. see {@link Participation} for default constants. */
+ void addTaskParticipatingGroup(String taskId, String groupId, String participationType);
+
+ /** get roles related to a given task. */
+ List<Participation> getTaskParticipations(String taskId);
+
+ /** removes a role to a given task. Nothing happens (no exception) if
+ * the role does not exist.
+ * @param participationType specifies the kind of involvement of the participatingUser
+ * in this task. see {@link Participation} for default constants. */
+ void removeTaskParticipatingUser(String taskId, String userId, String participationType);
+
+ /** removes a role to a given task. Nothing happens (no exception) if
+ * the role does not exist.
+ * @param participationType specifies the kind of involvement of the participatingUser
+ * in this task. see {@link Participation} for default constants. */
+ void removeTaskParticipatingGroup(String taskId, String groupId, String participationType);
+
+ /** create a new query for tasks */
+ TaskQuery createTaskQuery();
+
+ /** list of tasks that are assigned to the given user.
+ * Returns an empty list in case no such tasks exist. */
+ List<Task> findPersonalTasks(String userId);
+
+ /** list of tasks that can be taken by the given user.
+ * Returns an empty list in case no such tasks exist. */
+ List<Task> findGroupTasks(String userId);
+
+ /** get the subtasks for this task. Only goes one level deep at a time. */
+ List<Task> getSubTasks(String taskId);
+
+ /** add a comment to a task */
+ HistoryComment addTaskComment(String taskId, String message);
+
+ /** get the list of comments made to a task. this will
+ * fetch all the comments and recursively all replies to those
+ * comments. */
+ List<HistoryComment> getTaskComments(String taskId);
+
+ /** add a reply to another comment */
+ HistoryComment addReplyComment(String commentId, String message);
+
+ /** delete a comment.
+ * this will recursively delete all replies to this comment. */
+ void deleteComment(String commentId);
+
+ /** creates or overwrites the variable values on the given task */
+ void setVariables(String taskId, Map<String, Object> variables);
+
+ /** retrieves a variable */
+ Object getVariable(String taskId, String variableName);
+
+ /** all the variables visible in the given task */
+ Set<String> getVariableNames(String taskId);
+
+ /** retrieves a map of variables */
+ Map<String, Object> getVariables(String taskId, Set<String> variableNames);
+
+ /** the set of possible valid outcomes for this task.
+ * An empty set means that any value is possible. */
+ Set<String> getOutcomes(String taskId);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/activity/ActivityBehaviour.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/activity/ActivityBehaviour.java
new file mode 100644
index 0000000..6e25096
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/activity/ActivityBehaviour.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.activity;
+
+import java.io.Serializable;
+
+/** implements the runtime behaviour of an activity.
+ *
+ * @author Tom Baeyens
+ */
+public interface ActivityBehaviour extends Serializable {
+
+ /** invoked when an execution arrives in an activity.
+ *
+ * <p>An ActivityBehaviour can control the propagation
+ * of execution. ActivityBehaviour's can become external activities when they
+ * invoke {@link ActivityExecution#waitForSignal()}. That means the
+ * activity will become a wait state. In that case, {@link ExternalActivityBehaviour}
+ * should be implemented to also handle the external signals.
+ * </p> */
+ void execute(ActivityExecution execution) throws Exception;
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/activity/ActivityExecution.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/activity/ActivityExecution.java
new file mode 100644
index 0000000..e815612
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/activity/ActivityExecution.java
@@ -0,0 +1,114 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.activity;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.ExecutionService;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.model.OpenExecution;
+
+
+/** view upon an {@link Execution} exposed to
+ * {@link ActivityBehaviour} implementations.
+ *
+ * @author Tom Baeyens
+ */
+public interface ActivityExecution extends OpenExecution {
+
+ /** represents the current position in the process by indicating the
+ * name of the current activity. */
+ String getActivityName();
+
+
+ // wait state behaviour /////////////////////////////////////////////////////
+
+ /** makes this execution wait in the current activity until an external trigger is given
+ * with one of the {@link ExecutionService#signalExecutionById(String) signal} methods. */
+ void waitForSignal();
+
+ // taking a transition //////////////////////////////////////////////////////
+
+ /** takes the default transition.
+ *
+ * <p>This method can only be called from inside
+ * {@link ExternalActivityBehaviour} implementations.
+ * </p>
+ *
+ * @throws JbpmException in case there is no default transition in the current activity
+ * or in case this method is called from inside an {@link ActivityBehaviour} */
+ void takeDefaultTransition();
+
+ /** takes the outgoing transition with the given name.
+ *
+ * <p>This method can only be called from inside
+ * {@link ExternalActivityBehaviour} implementations.</p>
+ *
+ * <p>Transitions will be looked up recursively starting from the
+ * {@link #getActivityName() current activity} and then up the activity-parent-hierarchy</p>
+ *
+ * @param transitionName is the name of the transition to take. A null value will
+ * match the first unnamed transition.
+ *
+ * @throws JbpmException in case no such transition is found in {@link #getActivityName() the current activity}
+ * or in case this method is called from inside an {@link ActivityBehaviour}.*/
+ void take(String transitionName);
+
+ // execute a child activity /////////////////////////////////////////////////////
+
+ /** executes the given nested activity.
+ *
+ * <p>The activityName is looked up in the current activity's nested activities.</p>
+ *
+ * <p>This method can only be called from inside {@link ExternalActivityBehaviour}
+ * implementations.</p> */
+ void execute(String activityName);
+
+ // ending an execution //////////////////////////////////////////////////////
+
+ /** ends this execution and all of its child executions.
+ *
+ * <p>The execution will be removed from it's parent. Potentially this can cause
+ * a parent execution to start executing in case this is the last concurrent
+ * execution for which the parent is waiting.</p>
+ */
+ void end();
+
+ /** ends this execution and all it's child executions with a user defined
+ * status.
+ *
+ * <p>It is not recommended to use any of
+ * {@link Execution the defined statuses in Execution} as that may case unpredictable
+ * side effects.</p>
+ *
+ * <p>The execution will be removed from it's parent.</p> */
+ void end(String state);
+
+ // extra state information methods //////////////////////////////////////////
+
+ /** setter for the priority. The default priority is 0, which means
+ * NORMAL. Other recognized named priorities are HIGHEST (2), HIGH (1),
+ * LOW (-1) and LOWEST (-2). For the rest, the user can set any other
+ * priority integer value, but then, the UI will have to display it as
+ * an integer and not the named value.*/
+ void setPriority(int priority);
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/activity/ExternalActivityBehaviour.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/activity/ExternalActivityBehaviour.java
new file mode 100644
index 0000000..91b49b0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/activity/ExternalActivityBehaviour.java
@@ -0,0 +1,64 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.activity;
+
+import java.util.Map;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.ExecutionService;
+
+
+/** extends {@link ActivityBehaviour} for handling external triggers after a wait state.
+ *
+ * @author Tom Baeyens
+ */
+public interface ExternalActivityBehaviour extends ActivityBehaviour {
+
+ /** handles an external signal.
+ *
+ * <p>An external signal that comes into an execution
+ * through one of the {@link ExecutionService#signalExecutionById(String)} methods.
+ * It will be delegated to the activity in which the execution is positioned when it
+ * receives the external trigger.
+ * </p>
+ *
+ * <p>The signal method implements how the activity will react on that signal.
+ * For example, the outgoing transition could be taken that corresponds with the
+ * given signal.
+ * </p>
+ *
+ * @param execution the {@link Execution} for which the signal is given
+ *
+ * @param signalName is an abstract text that can be associated with a signal. this
+ * corresponds to e.g. a method name in a java class interface. The implementation
+ * can decide e.g. to use the signal to identify the outgoing transition.
+ *
+ * @param parameters is extra information that can be provided with a signal.
+ * In this way, it is somewhat similar to the parameters that can be fed into a method
+ * invocation through reflection.
+ *
+ * @throws Exception to indicate any kind of failure. Note that exceptions are
+ * considered non recoverable. After an Exception, the execution should not be
+ * used any more and if this is during a transaction, the transaction should be
+ * rolled back. */
+ void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) throws Exception;
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/activity/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/activity/package.html
new file mode 100644
index 0000000..dcf7542
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/activity/package.html
@@ -0,0 +1,3 @@
+<body>interfaces for implementing customized
+{@link org.jbpm.api.activity.ActivityBehaviour runtime behaviour of activities}.
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/cmd/Command.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/cmd/Command.java
new file mode 100644
index 0000000..8f73c4c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/cmd/Command.java
@@ -0,0 +1,14 @@
+package org.jbpm.api.cmd;
+
+import java.io.Serializable;
+
+import org.jbpm.api.ProcessEngine;
+
+/** commands that can be {@link ProcessEngine#execute(Command) executed by the process engine}.
+ *
+ * @author Tom Baeyens
+ */
+public interface Command<T> extends Serializable {
+
+ T execute(Environment environment) throws Exception;
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/cmd/Environment.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/cmd/Environment.java
new file mode 100644
index 0000000..f7862a6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/cmd/Environment.java
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.cmd;
+
+/** exposes configured process engine scope objects and
+ * transaction scope objects {@link Command to command implementations}.
+ *
+ * @author Tom Baeyens
+ */
+public interface Environment {
+
+ /**
+ * searches a named object in all the contexts in the default search order.
+ * @return the object if it exists in the environment, <code>null</code> if there is no object with the given name in the environment.
+ */
+ public abstract Object get(String name);
+
+ /** searches an object based on type. The search doesn take superclasses of the context elements
+ * into account.
+ * @return the first object of the given type or null in case no such element was found.
+ */
+ public abstract <T> T get(Class<T> type);
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/cmd/ParamCommand.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/cmd/ParamCommand.java
new file mode 100644
index 0000000..b52a318
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/cmd/ParamCommand.java
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.cmd;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+/** command with support for parameter passing from the client to the implementation.
+ *
+ * @author Tom Baeyens
+ */
+public abstract class ParamCommand<T> implements Command<T> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Map<String, Object> params = new HashMap<String, Object>();
+
+ public ParamCommand<T> setParam(String name, Object value) {
+ params.put(name, value);
+ return this;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/cmd/VoidCommand.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/cmd/VoidCommand.java
new file mode 100644
index 0000000..914b15c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/cmd/VoidCommand.java
@@ -0,0 +1,38 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.cmd;
+
+
+/** convenience for commands without return value.
+ *
+ * @author Tom Baeyens
+ */
+public abstract class VoidCommand implements Command<Void> {
+
+ public Void execute(Environment environment) throws Exception {
+ executeVoid(environment);
+ return null;
+ }
+
+ public abstract void executeVoid(Environment environment);
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryActivityInstance.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryActivityInstance.java
new file mode 100644
index 0000000..f4f2f4a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryActivityInstance.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.history;
+
+import java.util.Date;
+
+/** represents one occurrence of an activity during a process
+ * instance.
+ *
+ * @author Tom Baeyens
+ */
+public interface HistoryActivityInstance {
+
+ /** name of the activity that was executed */
+ String getActivityName();
+
+ /** time when the activity was entered */
+ Date getStartTime();
+
+ /** might be null in case the activity is still active */
+ Date getEndTime();
+
+ /** duration in milleseconds */
+ long getDuration();
+
+ /** the execution that was related to this activity occurrence */
+ String getExecutionId();
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryActivityInstanceQuery.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryActivityInstanceQuery.java
new file mode 100644
index 0000000..1db28f1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryActivityInstanceQuery.java
@@ -0,0 +1,84 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.history;
+
+import java.util.Date;
+import java.util.List;
+
+
+/** query for {@link HistoryActivityInstance activity occurrences}.
+ *
+ * @author Tom Baeyens
+ */
+public interface HistoryActivityInstanceQuery {
+
+ /** starttime property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_STARTTIME = "startTime";
+ /** endtime property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_ENDTIME = "endTime";
+ /** executionId property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_EXECUTIONID = "executionId";
+ /** activityName property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_ACTIVITYNAME = "activityName";
+ /** duration property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_DURATION = "duration";
+
+ /** only select activity instances for the given process definition */
+ HistoryActivityInstanceQuery processDefinitionId(String processDefinitionId);
+
+ /** only select activity instances for the given execution */
+ HistoryActivityInstanceQuery executionId(String executionId);
+
+ /** only select activity instances started after the given time */
+ HistoryActivityInstanceQuery startedAfter(Date time);
+
+ /** only select activity instances started before the given time */
+ HistoryActivityInstanceQuery startedBefore(Date time);
+
+ /** only select activity instances for the given activity
+ * (this usually used in combination with {@link #processDefinitionId(String)}) */
+ HistoryActivityInstanceQuery activityName(String activityName);
+
+ /** only select activity instances that took longer then the given duration in milliseconds */
+ HistoryActivityInstanceQuery tookLongerThen(long durationInMillis);
+
+ /** only select activity instances that took less then the given duration in milliseconds */
+ HistoryActivityInstanceQuery tookLessThen(long durationInMillis);
+
+ /** order selected activity instances ascending for certain {@link #PROPERTY_STARTTIME properties} */
+ HistoryActivityInstanceQuery orderAsc(String property);
+
+ /** order selected process definitions descending for certain {@link #PROPERTY_STARTTIME properties} */
+ HistoryActivityInstanceQuery orderDesc(String property);
+
+ /** select a specific page in the result set */
+ HistoryActivityInstanceQuery page(int firstResult, int maxResults);
+
+ /** execute the query and obtain the list of {@link HistoryActivityInstance}s */
+ List<HistoryActivityInstance> list();
+
+ /** execute the query and obtain the unique {@link HistoryActivityInstance} */
+ HistoryActivityInstance uniqueResult();
+
+ /** execute a count(*) query and returns number of results */
+ long count();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryComment.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryComment.java
new file mode 100644
index 0000000..ace0d43
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryComment.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.history;
+
+import java.util.List;
+
+import org.jbpm.api.Execution;
+
+/** a free text comment that can be made to an {@link Execution}
+ * or a task.
+ *
+ * This class also supports threaded discussions with the
+ * {@link #getReplies()}.
+ *
+ * @author Tom Baeyens
+ */
+public interface HistoryComment extends HistoryDetail {
+
+ /** the actual message. Both plain text as well as HTML can be stored
+ * as the message. */
+ String getMessage();
+
+ /** threaded replies to this comment */
+ List<HistoryComment> getReplies();
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryDetail.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryDetail.java
new file mode 100644
index 0000000..0944e99
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryDetail.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.history;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/** base type for all history details.
+ *
+ * @author Tom Baeyens
+ */
+public interface HistoryDetail extends Serializable {
+
+ /** the unique id for this comment that is used as a reference in the service methods */
+ String getId();
+
+ /** the id of the user that made this comment. The term actorId is an abstract
+ * reference to an entity in an external identity component. */
+ String getUserId();
+
+ /** time that specifies when the comment was made */
+ Date getTime();
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryDetailQuery.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryDetailQuery.java
new file mode 100644
index 0000000..ee286e3
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryDetailQuery.java
@@ -0,0 +1,75 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.history;
+
+import java.util.Date;
+import java.util.List;
+
+
+/** query for task comments, task assignments and so on.
+ *
+ * @author Tom Baeyens
+ */
+public interface HistoryDetailQuery {
+
+ /** userId property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_USERID = "userId";
+ /** time property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_TIME = "time";
+
+ /** only select details for the given processInstanceId */
+ HistoryDetailQuery processInstanceId(String processInstanceId);
+
+ /** only select details for the given activityInstanceId */
+ HistoryDetailQuery activityInstanceId(String activityInstanceId);
+
+ /** only select details for the given taskId */
+ HistoryDetailQuery taskId(String taskId);
+
+ /** only select details after the given time */
+ HistoryDetailQuery timeAfter(Date time);
+
+ /** only select details before the given time */
+ HistoryDetailQuery timeBefore(Date time);
+
+ /** only select details of type comment
+ * (this usually used in combination with {@link #processDefinitionId(String)}) */
+ HistoryDetailQuery comments();
+
+ /** order selected process definitions ascending */
+ HistoryDetailQuery orderAsc(String property);
+
+ /** order selected process definitions descending */
+ HistoryDetailQuery orderDesc(String property);
+
+ /** select a specific page in the result set */
+ HistoryDetailQuery page(int firstResult, int maxResults);
+
+ /** execute the query and obtain the list of {@link HistoryDetail}s */
+ List<HistoryDetail> list();
+
+ /** execute the query and obtain the unique {@link HistoryDetail} */
+ HistoryDetail uniqueResult();
+
+ /** execute a count(*) query and returns number of results */
+ long count();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryProcessInstance.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryProcessInstance.java
new file mode 100644
index 0000000..98d498c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryProcessInstance.java
@@ -0,0 +1,76 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.history;
+
+import java.util.Date;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.ExecutionService;
+import org.jbpm.api.ProcessInstance;
+
+/** one occurence of an execution of a process definition.
+ *
+ * Every {@link ProcessInstance} will have one HistoryProcessInstance
+ * associated. The difference is that the ProcessInstance will be
+ * deleted when it is ended. And the history information will remain
+ * in the DB. That keeps the runtime DB healthy and performant.
+ *
+ * @author Tom Baeyens
+ */
+public interface HistoryProcessInstance {
+
+ /** when the full process instance has come to an end */
+ String STATE_ENDED = "ended";
+
+ /** when the full process instance is still active */
+ String STATE_ACTIVE = "active";
+
+ /** the process instance id (== the root execution id) */
+ String getProcessInstanceId();
+
+ /** reference to the process definition */
+ String getProcessDefinitionId();
+
+ /** unique user provided business key
+ * (could be null if no such key is provided in
+ * {@link ExecutionService#startProcessInstanceById(String, java.util.Map, String)}) */
+ String getKey();
+
+ /** {@link #STATE_ACTIVE} or {@link #STATE_ENDED} (this more coarse grained
+ * state then {@link Execution#getState()}) */
+ String getState();
+
+ /** when the process instance started */
+ Date getStartTime();
+
+ /** when the process instance ended (only not null if the
+ * process instance already ended) */
+ Date getEndTime();
+
+ /** duration of the process instance in milliseconds or null
+ * if the process instance has not yet ended */
+ Long getDuration();
+
+ /** Returns the name of the end state that was reached when the process was ended.
+ */
+ String getEndActivityName();
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryProcessInstanceQuery.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryProcessInstanceQuery.java
new file mode 100644
index 0000000..464c4c0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryProcessInstanceQuery.java
@@ -0,0 +1,75 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.history;
+
+import java.util.List;
+
+
+/** query for occurences of {@link HistoryProcessInstance process instances}.
+ *
+ * @author Tom Baeyens
+ */
+public interface HistoryProcessInstanceQuery {
+
+ /** starttime property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_STARTTIME = "startTime";
+ /** endtime property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_ENDTIME = "endTime";
+ /** id property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_ID = "id";
+ /** state property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_STATE = "state";
+ /** duration property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_DURATION = "duration";
+ /** Key propertu to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_KEY = "key";
+
+ /** select only the process instances with the given id */
+ HistoryProcessInstanceQuery processInstanceId(String processInstanceId);
+
+ /** select only process instances with the given process definition */
+ HistoryProcessInstanceQuery processDefinitionId(String processDefinitionId);
+
+ /** select only process instances with the given business key */
+ HistoryProcessInstanceQuery processInstanceKey(String processInstanceKey);
+
+ /** select only process instances in the given state */
+ HistoryProcessInstanceQuery state(String state);
+
+ /** order selected process instances ascending for certain {@link #PROPERTY_STARTTIME properties} */
+ HistoryProcessInstanceQuery orderAsc(String property);
+
+ /** order selected process instances ascending for certain {@link #PROPERTY_STARTTIME properties} */
+ HistoryProcessInstanceQuery orderDesc(String property);
+
+ /** select a specific page in the result set */
+ HistoryProcessInstanceQuery page(int firstResult, int maxResults);
+
+ /** execute the query and obtain the list of {@link HistoryProcessInstance}s */
+ List<HistoryProcessInstance> list();
+
+ /** execute the query and obtain the unique {@link HistoryProcessInstance} */
+ HistoryProcessInstance uniqueResult();
+
+ /** execute a count(*) query and returns number of results */
+ long count();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryTask.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryTask.java
new file mode 100644
index 0000000..cf1a0b7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryTask.java
@@ -0,0 +1,64 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.history;
+
+import java.util.Date;
+import java.util.List;
+
+import org.jbpm.api.task.Task;
+
+
+/** history record for a task instance.
+ *
+ * In contrast to the {@link Task}, this entity will remain
+ * after the task has been completed for history purposes.
+ *
+ * @author Tom Baeyens
+ */
+public interface HistoryTask {
+
+ String STATE_COMPLETED = "completed";
+
+ /** the unique id for this task that is used as a reference in the service methods */
+ String getId();
+
+ /** the execution that was related to this activity occurrence */
+ String getExecutionId();
+
+ /** time when the activity was entered */
+ Date getCreateTime();
+
+ /** might be null in case the activity is still active */
+ Date getEndTime();
+
+ /** duration in milleseconds */
+ long getDuration();
+
+ /** history task state */
+ String getState();
+
+ /** userId of the person that is responsible for this task */
+ String getAssignee();
+
+ /** the outcome of this task */
+ String getOutcome();
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryTaskQuery.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryTaskQuery.java
new file mode 100644
index 0000000..32a4d9d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/HistoryTaskQuery.java
@@ -0,0 +1,95 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.history;
+
+import java.util.Date;
+import java.util.List;
+
+
+/** query for history tasks.
+ *
+ * @author Tom Baeyens
+ */
+public interface HistoryTaskQuery {
+
+ /** id property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_ID = "dbid";
+ /** starttime property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_CREATETIME = "createTime";
+ /** endtime property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_ENDTIME = "endTime";
+ /** executionId property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_EXECUTIONID = "executionId";
+ /** outcome property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_OUTCOME = "outcome";
+ /** outcome property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_ASSIGNEE = "assignee";
+ /** state property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_STATE = "state";
+ /** duration property to be used as property in {@link #orderAsc(String)} and {@link #orderDesc(String)} */
+ String PROPERTY_DURATION = "duration";
+
+ /** only select the history task for the given id */
+ HistoryTaskQuery taskId(String taskId);
+
+ /** only select history tasks within the given execution */
+ HistoryTaskQuery executionId(String executionId);
+
+ /** only select history tasks for the given assignee */
+ HistoryTaskQuery assignee(String assignee);
+
+ /** only select history tasks in the given state */
+ HistoryTaskQuery state(String state);
+
+ /** only select history tasks that have the given outcome */
+ HistoryTaskQuery outcome(String outcome);
+
+ /** order selected history tasks ascending for certain {@link #PROPERTY_ID properties} */
+ HistoryTaskQuery orderAsc(String property);
+
+ /** order selected process definitions descending for certain {@link #PROPERTY_ID properties} */
+ HistoryTaskQuery orderDesc(String property);
+
+ /** select a specific page in the result set */
+ HistoryTaskQuery page(int firstResult, int maxResults);
+
+ /** only select history tasks started after the given time */
+ HistoryTaskQuery startedAfter(Date time);
+
+ /** only select history tasks started before the given time */
+ HistoryTaskQuery startedBefore(Date time);
+
+ /** only select history tasks that took less then the given duration in milliseconds */
+ HistoryTaskQuery tookLessThen(long durationInMillis);
+
+ /** only select history tasks that took longer then the given duration in milliseconds */
+ HistoryTaskQuery tookLongerThen(long durationInMillis);
+
+ /** execute the query and obtain the list of {@link HistoryTask}s */
+ List<HistoryTask> list();
+
+ /** execute the query and obtain the unique {@link HistoryTask} */
+ HistoryTask uniqueResult();
+
+ /** execute a count(*) query and returns number of results */
+ long count();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/package.html
new file mode 100644
index 0000000..37a6c31
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/history/package.html
@@ -0,0 +1,2 @@
+<body>interfaces related to the {@link org.jbpm.api.HistoryService}.
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/identity/Group.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/identity/Group.java
new file mode 100644
index 0000000..bb311b8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/identity/Group.java
@@ -0,0 +1,39 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.identity;
+
+
+/** a group of users.
+ *
+ * @author Tom Baeyens
+ */
+public interface Group {
+
+ /** unique id for the group that is used as a reference in the service methods */
+ String getId();
+
+ /** name for the group (should be unique within one group type) */
+ String getName();
+
+ /** type or category of the group */
+ String getType();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/identity/User.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/identity/User.java
new file mode 100644
index 0000000..92133e2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/identity/User.java
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.identity;
+
+
+/** a user.
+ *
+ * @author Tom Baeyens
+ */
+public interface User {
+
+ /** unique id for the user that is used as a reference in the service methods */
+ String getId();
+
+ /** given name (aka first name) */
+ String getGivenName();
+
+ /** given name (aka last name) */
+ String getFamilyName();
+
+ /** the email address for the user */
+ String getBusinessEmail();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/identity/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/identity/package.html
new file mode 100644
index 0000000..45fd583
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/identity/package.html
@@ -0,0 +1,2 @@
+<body>User and Group interfaces related to the {@link org.jbpm.api.IdentityService}
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/job/Job.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/job/Job.java
new file mode 100644
index 0000000..1e9790d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/job/Job.java
@@ -0,0 +1,71 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.job;
+
+import java.util.Date;
+
+import org.jbpm.api.Execution;
+
+/** base class for timers and messages.
+ *
+ * @author Tom Baeyens
+ */
+public interface Job {
+
+ /** unique id for this job that is used as a reference in the service methods */
+ String getId();
+
+ /** job executor identification that has acquired this job and is going to execute it */
+ String getLockOwner();
+
+ /** in case this is a timer, it is the time that the timer should fire, in case this
+ * is a message, it is null.
+ * @deprecated */
+ Date getDueDate();
+
+ /** in case this is a timer, it is the time that the timer should fire, in case this
+ * is a message, it is null. */
+ Date getDuedate();
+
+ /** exception that occurred during the last execution of this job. The transaction
+ * of the job execution is rolled back. A synchronization is used to create
+ * a separate transaction to update the exception and decrement the retries. */
+ String getException();
+
+ /** number of retries left. This is only decremented when an exception occurs during job
+ * execution. The transaction of the job execution is rolled back. A synchronization is used to create
+ * a separate transaction to update the exception and decrement the retries. */
+ int getRetries();
+
+ /** indicates if this job should be executed separate from any other job
+ * in the same process instance */
+ boolean isExclusive();
+
+ /** the related execution */
+ Execution getExecution();
+
+ /** the related process instance */
+ Execution getProcessInstance();
+
+ Date getLockExpirationTime();
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/job/Message.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/job/Message.java
new file mode 100644
index 0000000..895e20f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/job/Message.java
@@ -0,0 +1,30 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.job;
+
+/** an asynchronous message.
+ *
+ * @author Tom Baeyens
+ */
+public interface Message extends Job {
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/job/Timer.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/job/Timer.java
new file mode 100644
index 0000000..3915b51
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/job/Timer.java
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.job;
+
+
+/** a timer.
+ *
+ * @author Tom Baeyens
+ */
+public interface Timer extends Job {
+
+ /** the signal that sent to {@link #getExecution() the execution}
+ * when the timer fires */
+ String getSignalName();
+
+ /** the name of the event that is fired on {@link #getExecution() the execution}
+ * when the timer fires */
+ String getEventName();
+
+ /** indicates the delay for repeating this timer after successful execution */
+ String getRepeat();
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/job/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/job/package.html
new file mode 100644
index 0000000..6295692
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/job/package.html
@@ -0,0 +1,2 @@
+<body>Job, Message and Timer interfaces related to the {@link org.jbpm.api.ManagementService}
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/jpdl/DecisionHandler.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/jpdl/DecisionHandler.java
new file mode 100644
index 0000000..966eaa5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/jpdl/DecisionHandler.java
@@ -0,0 +1,36 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.jpdl;
+
+import java.io.Serializable;
+
+import org.jbpm.api.model.OpenExecution;
+
+
+/** interface for supplying user programmed decisions.
+ *
+ * @author Tom Baeyens */
+public interface DecisionHandler extends Serializable {
+
+ /** the name of the selected outgoing transition */
+ String decide(OpenExecution execution);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/jpdl/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/jpdl/package.html
new file mode 100644
index 0000000..0387e9d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/jpdl/package.html
@@ -0,0 +1,2 @@
+<body>specific jPDL interfaces
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/listener/EventListener.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/listener/EventListener.java
new file mode 100644
index 0000000..4e61261
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/listener/EventListener.java
@@ -0,0 +1,36 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.listener;
+
+import java.io.Serializable;
+
+
+/** listener to process execution events.
+ *
+ * @author Tom Baeyens
+ */
+public interface EventListener extends Serializable {
+
+ /** is invoked when an execution crosses the event on which this listener is registered */
+ void notify(EventListenerExecution execution) throws Exception;
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/listener/EventListenerExecution.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/listener/EventListenerExecution.java
new file mode 100644
index 0000000..d8ee471
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/listener/EventListenerExecution.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.listener;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.model.OpenExecution;
+
+
+/** view upon an {@link Execution path of execution} exposed to
+ * {@link EventListener} implementations.
+ *
+ * @author Tom Baeyens
+ */
+public interface EventListenerExecution extends OpenExecution {
+
+ /** setter for the priority. The default priority is 0, which means
+ * NORMAL. Other recognized named priorities are HIGHEST (2), HIGH (1),
+ * LOW (-1) and LOWEST (-2). For the rest, the user can set any other
+ * priority integer value, but then, the UI will have to display it as
+ * an integer and not the named value.*/
+ void setPriority(int priority);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/listener/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/listener/package.html
new file mode 100644
index 0000000..bf7e6ae
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/listener/package.html
@@ -0,0 +1,4 @@
+<body>interfaces for implementing
+{@link org.jbpm.api.listener.EventListener event listeners}, which represent
+runtime behaviour that can be associated as listeners to process events.
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/ActivityCoordinates.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/ActivityCoordinates.java
new file mode 100644
index 0000000..96f8925
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/ActivityCoordinates.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.model;
+
+import org.jbpm.api.RepositoryService;
+
+/** activity coordinates indicating the graphical position in the diagram.
+ *
+ * @see RepositoryService#getActivityCoordinates(String, String)
+ * @author Tom Baeyens
+ */
+public interface ActivityCoordinates {
+
+ int getX();
+
+ int getY();
+
+ int getWidth();
+
+ int getHeight();
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/Event.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/Event.java
new file mode 100644
index 0000000..bfc43c5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/Event.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.model;
+
+
+/** event constants.
+ *
+ * @author Tom Baeyens
+ */
+public interface Event {
+
+ /** fired when a transition is being taken */
+ String TAKE = "take";
+ /** fired when a process or an activity starts */
+ String START = "start";
+ /** fired when a process or an activity ends */
+ String END = "end";
+ /** fired when a task is assigned */
+ String ASSIGN = "assign";
+ /** fired when an assignee is reminded of a task */
+ String REMIND = "remind";
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/OpenExecution.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/OpenExecution.java
new file mode 100644
index 0000000..9129a3d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/OpenExecution.java
@@ -0,0 +1,132 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.model;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.JbpmException;
+
+/** execution that opens up access to the related
+ * objects in the execution and process definition
+ * model.
+ *
+ * This execution exposes the execution hierarchy,
+ * variable access and associated timers.
+ *
+ * Open refers to the relations being accessible. This is related
+ * to hibernate's lazy loading capabilities. That requires an active
+ * session. Inside process execution, there is such an active session
+ * and hence the relations can be exposed. But for the client of the
+ * service methods, it's not sure if the session is still active.
+ * That is why the relations are not exposed in the return values
+ * of service methods.
+ *
+ * @author Tom Baeyens
+ */
+public interface OpenExecution extends Execution {
+
+ /** update the state */
+ void setState(String state);
+
+ /** the related sub process execution. */
+ OpenExecution getSubProcessInstance();
+
+ // variable access //////////////////////////////////////////////////////////
+
+ /** retrieve the value for the given key.
+ * The value can be null.
+ * If there is no value for the given key, the returned
+ * value will also be null. The value for key <code>null</code>
+ * will always be null as null keys are not allowed. */
+ Object getVariable(String key);
+
+ /** updates or creates a variable for the given value.
+ * Values are allowed to be null.
+ * @throws JbpmException if key is null. */
+ void setVariable(String key, Object value);
+
+ /** {@link #setVariable(String, Object) sets} all given variables.
+ * Existing key-value pairs for which there is no key in the provided
+ * variables will <b>not</b> be removed.
+ * @throws JbpmException is variables is not null and if null is present
+ * as a key in the provided variables map. */
+ void setVariables(Map<String, ?> variables);
+
+ /** indicates presenve of the given key.
+ * No exception will be thrown if key is null.
+ * @return true if the key is present and false if the key doesn't exist
+ * or if key is null. */
+ boolean hasVariable(String key);
+
+ /** remove the key-value pair for the given key from this scope.
+ * No exception will be thrown when the variable is not present.
+ * @return whether a variable was actually found and removed. */
+ boolean removeVariable(String key);
+
+ /** removes all variables in this scope */
+ void removeVariables();
+
+ /** indicates if there are keys in this scope. */
+ boolean hasVariables();
+
+ /** a non-null set that contains all the keys present in this scope.
+ * Even if there are no variable keys, an empty, non-null set will
+ * be returned. */
+ Set<String> getVariableKeys();
+
+ /** a non-null map containing all the key-value pairs in this scope.
+ * Even if there are no variable keys, an empty, non-null map will
+ * be returned. */
+ Map<String, Object> getVariables();
+
+ /** create a new variable in this execution scope and determine
+ * the type automagically. */
+ void createVariable(String key, Object value);
+
+ // priority /////////////////////////////////////////////////////////////////
+
+ /** setter for the priority. The default priority is 0, which means
+ * NORMAL. Other recognized named priorities are HIGHEST (2), HIGH (1),
+ * LOW (-1) and LOWEST (-2). For the rest, the user can set any other
+ * priority integer value, but then, the UI will have to display it as
+ * an integer and not the named value.*/
+ void setPriority(int priority);
+
+ // execution hierarchy access ///////////////////////////////////////////////
+
+ /** the main path of execution in the execution tree structure. The
+ * process instance is the root of the execution tree. */
+ OpenProcessInstance getProcessInstance();
+
+ /** the parent execution in the execution structure.
+ * Null will be returned in case this execution itself is the
+ * process instance. */
+ OpenExecution getParent();
+
+ /** the child execution for the given name or null in case such execution doesn't exist. */
+ OpenExecution getExecution(String name);
+
+ /** find the execution in the given activity or null if no such activity exists */
+ OpenExecution findActiveExecutionIn(String activityName);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/OpenProcessInstance.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/OpenProcessInstance.java
new file mode 100644
index 0000000..352cdd9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/OpenProcessInstance.java
@@ -0,0 +1,39 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.model;
+
+import org.jbpm.api.ProcessInstance;
+
+/** process instance for which the relations are exposed.
+ *
+ * Open refers to the relations being accessible. This is related
+ * to hibernate's lazy loading capabilities. That requires an active
+ * session. Inside process execution, there is such an active session
+ * and hence the relations can be exposed. But for the client of the
+ * service methods, it's not sure if the session is still active.
+ * That is why the relations are not exposed in the return values
+ * of service methods.
+ *
+ * @author Tom Baeyens
+ */
+public interface OpenProcessInstance extends OpenExecution, ProcessInstance {
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/package.html
new file mode 100644
index 0000000..c8450e3
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/model/package.html
@@ -0,0 +1,4 @@
+<body>common process execution model interfaces used in services and
+delegation interfaces like {@link org.jbpm.api.activity.ActivityBehaviour} and
+{@link org.jbpm.api.listener.EventListener}.
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/package.html
new file mode 100644
index 0000000..d6841be
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/package.html
@@ -0,0 +1,5 @@
+<body>the jBPM API, Start by creating a {@link org.jbpm.api.Configuration},
+build a {@link org.jbpm.api.ProcessEngine} from that, and then you can find
+the workflow methods on the services like {@link org.jbpm.api.ExecutionService},
+{@link org.jbpm.api.TaskService}.
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/Assignable.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/Assignable.java
new file mode 100644
index 0000000..c0c90f0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/Assignable.java
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.task;
+
+
+/** tasks or swimlanes can be assigned.
+ *
+ * @see AssignmentHandler
+ * @author Tom Baeyens
+ */
+public interface Assignable {
+
+ /** assign the task or swimlane to the given user */
+ void setAssignee(String userId);
+
+ /** add the given user as a candidate to the task or swimlane */
+ void addCandidateUser(String userId);
+
+ /** add the members of the given group as candidates to the task or swimlane */
+ void addCandidateGroup(String groupId);
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/AssignmentHandler.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/AssignmentHandler.java
new file mode 100644
index 0000000..2409866
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/AssignmentHandler.java
@@ -0,0 +1,37 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.task;
+
+import java.io.Serializable;
+
+import org.jbpm.api.model.OpenExecution;
+
+
+/** interface to delegate {@link Task} or {@link Swimlane} assignment.
+ *
+ * @author Tom Baeyens
+ */
+public interface AssignmentHandler extends Serializable {
+
+ /** sets the actorId and candidates for the given task. */
+ void assign(Assignable assignable, OpenExecution execution) throws Exception;
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/Participation.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/Participation.java
new file mode 100644
index 0000000..677d405
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/Participation.java
@@ -0,0 +1,66 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.task;
+
+
+/**
+ * a link to a participating identity (user or group) and the type of involvement.
+ *
+ * @author Tom Baeyens
+ * @author Heiko Braun <heiko.braun@jboss.com>
+ */
+public interface Participation {
+
+ /** alternative owner, but as long as this person is not the owner.
+ * This person is allowed to make comments, but nothing else. */
+ String CANDIDATE = "candidate";
+
+ /** the person with ultimate responsibility over a task. */
+ String OWNER = "owner";
+
+ /** person that will be using the result of this task. This person is
+ * allowed to make comments, but nothing else. */
+ String CLIENT = "client";
+
+ /** person that is allowed to watch-but-not-touch this task */
+ String VIEWER = "viewer";
+
+ /** a person that was assigned to a task, but got replaced because of
+ * absence or another reason. This way, a trace can be left in case
+ * this person returns and wants to take back his tasks that got
+ * reassigned. */
+ String REPLACED_ASSIGNEE = "replaced-assignee";
+
+ /** the unique id for this participation that is used as a reference in the service methods */
+ String getId();
+
+ /** userId for this participation.
+ * null in case this is a {@link #getGroupId() group participation}. */
+ String getUserId();
+
+ /** groupId for this participation.
+ * null in case this is a {@link #getUserId() user participation}. */
+ String getGroupId();
+
+ /** see constants for default participations */
+ String getType();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/Swimlane.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/Swimlane.java
new file mode 100644
index 0000000..1d571c7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/Swimlane.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.task;
+
+import java.io.Serializable;
+
+import org.jbpm.api.IdentityService;
+
+/** a runtime process role that can store an assignment so that
+ * multiple related tasks are assigned to the same actor.
+ *
+ * @author Tom Baeyens
+ */
+public interface Swimlane extends Serializable {
+
+ /** the unique id for this swimlane that is used as a reference in the service methods */
+ String getId();
+
+ /** the name of the swimlane as defined in the process file */
+ String getName();
+
+ /** the {@link IdentityService#findUserById(String) userId}
+ * of the person that is assigned to this swimlane. */
+ String getAssignee();
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/Task.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/Task.java
new file mode 100644
index 0000000..1e1e962
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/Task.java
@@ -0,0 +1,119 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.api.task;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.TaskService;
+import org.jbpm.api.history.HistoryTask;
+
+/** a runtime task.
+ *
+ * In contrast to {@link HistoryTask}, a Task only represents the runtime
+ * state of a task and hence it will be deleted after it is completed.
+ *
+ * @author Tom Baeyens
+ */
+public interface Task extends Serializable {
+
+ /** task is waiting for someone to work on it and completed it */
+ public static final String STATE_OPEN = "open";
+
+ /** task is done */
+ public static final String STATE_COMPLETED = "completed";
+
+ /** task doesn't show up in task lists as something is wrong
+ * with the related process instance that requires manual
+ * intervention first. */
+ public static final String STATE_SUSPENDED = "suspended";
+
+ /** the unique id for this task that is used as a reference in the service methods */
+ String getId();
+
+ /** the short display name of this task. Originally, this might come
+ * from the process file, but it can be changed at runtime for individual
+ * tasks. */
+ String getName();
+
+ /** change the short display name of this tasks.
+ * Updates require you to invoke {@link TaskService#saveTask(Task)} afterwards. */
+ void setName(String name);
+
+ /** longer description of this task */
+ String getDescription();
+
+ /** update the longer description of this task.
+ * Updates like this require you to invoke {@link TaskService#saveTask(Task)} afterwards. */
+ void setDescription(String description);
+
+ /** the person responsible for completion of this task. */
+ String getAssignee();
+
+ /** update the assignee of this task.
+ * Updates like this require you to invoke {@link TaskService#saveTask(Task)} afterwards. */
+ void setAssignee(String assignee);
+
+ /** date and time when this task was created */
+ Date getCreateTime();
+
+ /** date and time when this task must be completed. This might be null. */
+ Date getDuedate();
+
+ /** update the date and time when this task must be completed.
+ * Updates like this require you to invoke {@link TaskService#saveTask(Task)} afterwards. */
+ void setDuedate(Date duedate);
+
+ /** the priority of this task. This is only a data item for user purposes.
+ * The engine doesn't do anything different for different priorities. */
+ int getPriority();
+
+ /** update the priority.
+ * Updates like this require you to invoke {@link TaskService#saveTask(Task)} afterwards. */
+ void setPriority(int priority);
+
+ /**
+ * The progress of this task. This is a data item for user purposes and
+ * doesn't influence the functionality of the engine.
+ */
+ Integer getProgress();
+
+ /**
+ * Change the progress of this task.
+ * Updates like this require you to invoke {@link TaskService#saveTask(Task)} afterwards.
+ *
+ * <b>IMPORTANT</b>: Only values between 0 and 100 are accepted.
+ * Using other values will cause a {@link JbpmException}.
+ */
+ void setProgress(Integer progress);
+
+ /** reference to the execution or null if this task is unrelated to an execution */
+ String getExecutionId();
+
+ /** reference to the activity or null if this task is unrelated to an activity */
+ String getActivityName();
+
+ /** name of the resource in the deployment for the form that is associated
+ * to this task. */
+ String getFormResourceName();
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/package.html
new file mode 100644
index 0000000..cc504de
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/api/task/package.html
@@ -0,0 +1,2 @@
+<body>interfaces related to the {@link org.jbpm.api.TaskService}
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/ConsoleHandler.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/ConsoleHandler.java
new file mode 100644
index 0000000..0395c5e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/ConsoleHandler.java
@@ -0,0 +1,30 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.internal.log;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ConsoleHandler extends java.util.logging.ConsoleHandler {
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/ErrorTriggeredFileHandler.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/ErrorTriggeredFileHandler.java
new file mode 100644
index 0000000..d7cc55f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/ErrorTriggeredFileHandler.java
@@ -0,0 +1,115 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.internal.log;
+
+import java.io.IOException;
+import java.util.logging.FileHandler;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogManager;
+import java.util.logging.LogRecord;
+import java.util.logging.MemoryHandler;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ErrorTriggeredFileHandler extends Handler {
+
+ private static final int DEFAULT_SIZE = 500;
+ private static final Level DEFAULT_PUSH_LEVEL = Level.SEVERE;
+ private static final String DEFAULT_PATTERN = "%h/jbpm%u.log";
+
+ DecoratedMemoryHandler memoryHandler = null;
+ FileHandler fileHandler = null;
+
+ public ErrorTriggeredFileHandler() throws SecurityException, IOException {
+ fileHandler = getConfiguredTarget();
+ memoryHandler = new DecoratedMemoryHandler(fileHandler, getConfiguredSize(), getConfiguredPushLevel());
+ }
+
+ private static Level getConfiguredPushLevel() {
+ LogManager manager = LogManager.getLogManager();
+ String pushLevelText = manager.getProperty(ErrorTriggeredFileHandler.class.getName() + ".push");
+ if (pushLevelText == null) {
+ return DEFAULT_PUSH_LEVEL;
+ }
+ try {
+ return Level.parse(pushLevelText.trim());
+ } catch (Exception ex) {
+ return DEFAULT_PUSH_LEVEL;
+ }
+ }
+
+ protected static int getConfiguredSize() {
+ LogManager manager = LogManager.getLogManager();
+ String sizeText = manager.getProperty(ErrorTriggeredFileHandler.class.getName() + ".size");
+ if (sizeText == null) {
+ return DEFAULT_SIZE;
+ }
+ try {
+ return Integer.parseInt(sizeText.trim());
+ } catch (Exception ex) {
+ return DEFAULT_SIZE;
+ }
+ }
+
+ protected static FileHandler getConfiguredTarget() throws SecurityException, IOException {
+ LogManager manager = LogManager.getLogManager();
+ String pattern = manager.getProperty(ErrorTriggeredFileHandler.class.getName() + ".pattern");
+ if (pattern == null) {
+ pattern = DEFAULT_PATTERN;
+ }
+ return new FileHandler(pattern);
+ }
+
+
+ public class DecoratedMemoryHandler extends MemoryHandler {
+ public DecoratedMemoryHandler(FileHandler target, int size, Level pushLevel) {
+ super(target, size, pushLevel);
+ }
+ public void push() {
+ fileHandler.setFormatter(new LogFormatter());
+ super.push();
+ LogRecord emptyLine = new LogRecord(Level.INFO, "");
+ emptyLine.setLoggerName("");
+ fileHandler.publish(emptyLine);
+ LogRecord line = new LogRecord(Level.INFO, "---- END OF TRIGGERED PUSH ---------------------------------------------------");
+ line.setLoggerName("");
+ fileHandler.publish(line);
+ fileHandler.publish(emptyLine);
+ fileHandler.publish(emptyLine);
+ }
+ }
+
+ public void close() throws SecurityException {
+ memoryHandler.close();
+ }
+
+ public void flush() {
+ memoryHandler.flush();
+ }
+
+ public void publish(LogRecord record) {
+ memoryHandler.publish(record);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Jdk14Log.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Jdk14Log.java
new file mode 100644
index 0000000..0d1f83c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Jdk14Log.java
@@ -0,0 +1,97 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.internal.log;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.jbpm.internal.log.Log;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class Jdk14Log extends Log {
+
+ Logger log;
+
+ public Jdk14Log(Logger logger) {
+ this.log = logger;
+ }
+
+ public void error(String msg) {
+ log.log(Level.SEVERE, msg);
+ }
+
+ public void error(String msg, Throwable exception) {
+ log.log(Level.SEVERE, msg, exception);
+ }
+
+ public boolean isInfoEnabled() {
+ return log.isLoggable(Level.INFO);
+ }
+
+ public void info(String msg) {
+ log.log(Level.INFO, msg);
+ }
+
+ public void info(String msg, Throwable exception) {
+ log.log(Level.INFO, msg, exception);
+ }
+
+ public boolean isDebugEnabled() {
+ return log.isLoggable(Level.FINE);
+ }
+
+ public void debug(String msg) {
+ log.log(Level.FINE, msg);
+ }
+
+ public void debug(String msg, Throwable exception) {
+ log.log(Level.FINE, msg, exception);
+ }
+
+ public boolean isTraceEnabled() {
+ return log.isLoggable(Level.FINEST);
+ }
+
+ public void trace(String msg) {
+ log.log(Level.FINEST, msg);
+ }
+
+ public void trace(String msg, Throwable exception) {
+ log.log(Level.FINEST, msg, exception);
+ }
+
+ public boolean isWarnEnabled() {
+ return log.isLoggable(Level.WARNING);
+ }
+
+ public void warn(String msg) {
+ log.warning(msg);
+ }
+
+ public void warn(String msg, Throwable exception) {
+ log.log(Level.WARNING, msg, exception);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Jdk14LogFactory.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Jdk14LogFactory.java
new file mode 100644
index 0000000..d3f5229
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Jdk14LogFactory.java
@@ -0,0 +1,80 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.internal.log;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.logging.LogManager;
+import java.util.logging.Logger;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class Jdk14LogFactory implements LogFactory {
+
+ public Jdk14LogFactory() {
+ initializeJdk14Logging();
+ }
+
+ public Log getLog(String name) {
+ return new Jdk14Log(Logger.getLogger(name));
+ }
+
+ /** redirects commons logging to JDK 1.4 logging. This can be handy when
+ * you have log4j on the classpath, but still want to use the JDK logging. */
+ public static synchronized void redirectCommonsToJdk14() {
+ System.setProperty("org.apache.commons.logging.Log",
+ "org.apache.commons.logging.impl.Jdk14Logger" );
+ }
+
+ /** configures JDK 1.4 logging from the resource file <code>logging.properties</code> */
+ public static synchronized void initializeJdk14Logging() {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ InputStream inputStream = classLoader.getResourceAsStream("logging.properties");
+ try {
+ if (inputStream != null) {
+ LogManager.getLogManager().readConfiguration(inputStream);
+
+ String redirectCommons = LogManager.getLogManager().getProperty("redirect.commons.logging");
+ if ( (redirectCommons!=null)
+ && (! redirectCommons.equalsIgnoreCase("disabled"))
+ && (! redirectCommons.equalsIgnoreCase("off"))
+ && (! redirectCommons.equalsIgnoreCase("false"))
+ ) {
+ redirectCommonsToJdk14();
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException("couldn't initialize logging properly", e);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Log.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Log.java
new file mode 100644
index 0000000..d2a35b6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Log.java
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.internal.log;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class Log {
+
+ static LogFactory logFactory;
+
+ public static synchronized Log getLog(String name) {
+ if (logFactory==null) {
+
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+
+ // if logging.properties is available on the classpath
+ if (classLoader.getResource("logging.properties")!=null) {
+ logFactory = new Jdk14LogFactory();
+
+ // if log4j is available on the classpath
+ } else if (isLog4jAvailable(classLoader)) {
+ logFactory = new Log4jLogFactory();
+
+ } else {
+ logFactory = new Jdk14LogFactory();
+
+ }
+ }
+ return logFactory.getLog(name);
+ }
+
+ static boolean isLog4jAvailable(ClassLoader classLoader) {
+ try {
+ Class.forName("org.apache.log4j.LogManager", false, classLoader);
+ return true;
+ } catch (ClassNotFoundException e) {
+ return false;
+ }
+ }
+
+
+ public abstract void error(String msg);
+ public abstract void error(String msg, Throwable exception);
+
+ public abstract boolean isInfoEnabled();
+ public abstract void info(String msg);
+ public abstract void info(String msg, Throwable exception);
+
+ public abstract boolean isDebugEnabled();
+ public abstract void debug(String msg);
+ public abstract void debug(String msg, Throwable exception);
+
+ public abstract boolean isTraceEnabled();
+ public abstract void trace(String msg);
+ public abstract void trace(String msg, Throwable exception);
+
+ public abstract boolean isWarnEnabled();
+ public abstract void warn(String msg);
+ public abstract void warn(String msg, Throwable exception);
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Log4jLog.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Log4jLog.java
new file mode 100644
index 0000000..23d3d20
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Log4jLog.java
@@ -0,0 +1,93 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.internal.log;
+
+import org.apache.log4j.Level;
+
+/**
+ * @author Tom Baeyens
+ */
+public class Log4jLog extends Log {
+
+ org.apache.log4j.Logger log;
+
+ public Log4jLog(org.apache.log4j.Logger log) {
+ this.log = log;
+ }
+
+ public void error(String msg) {
+ log.error(msg);
+ }
+
+ public void error(String msg, Throwable exception) {
+ log.error(msg, exception);
+ }
+
+ public boolean isInfoEnabled() {
+ return log.isInfoEnabled();
+ }
+
+ public void info(String msg) {
+ log.info(msg);
+ }
+
+ public void info(String msg, Throwable exception) {
+ log.info(msg, exception);
+ }
+
+ public boolean isDebugEnabled() {
+ return log.isDebugEnabled();
+ }
+
+ public void debug(String msg) {
+ log.debug(msg);
+ }
+
+ public void debug(String msg, Throwable exception) {
+ log.debug(msg, exception);
+ }
+
+ public boolean isTraceEnabled() {
+ return log.isTraceEnabled();
+ }
+
+ public void trace(String msg) {
+ log.trace(msg);
+ }
+
+ public void trace(String msg, Throwable exception) {
+ log.trace(msg, exception);
+ }
+
+ public boolean isWarnEnabled() {
+ return log.isEnabledFor(Level.WARN);
+ }
+
+ public void warn(String msg) {
+ log.warn(msg);
+ }
+
+ public void warn(String msg, Throwable exception) {
+ log.warn(msg, exception);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Log4jLogFactory.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Log4jLogFactory.java
new file mode 100644
index 0000000..7d67127
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/Log4jLogFactory.java
@@ -0,0 +1,36 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.internal.log;
+
+import org.apache.log4j.LogManager;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class Log4jLogFactory implements LogFactory {
+
+ public Log getLog(String name) {
+ return new Log4jLog(LogManager.getLogger(name));
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/LogFactory.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/LogFactory.java
new file mode 100644
index 0000000..56a3086
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/LogFactory.java
@@ -0,0 +1,32 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.internal.log;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface LogFactory {
+
+ Log getLog(String name);
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/LogFormatter.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/LogFormatter.java
new file mode 100644
index 0000000..8fab3d4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/internal/log/LogFormatter.java
@@ -0,0 +1,83 @@
+package org.jbpm.internal.log;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Formatter;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+
+public class LogFormatter extends Formatter {
+
+ static final String NEWLINE = System.getProperty("line.separator");
+ static final DateFormat dateTimeFormat = new SimpleDateFormat("HH:mm:ss,SSS");
+ static final Map<Level, String> levels = new HashMap<Level, String>();
+ private static Map<Integer, Integer> indentations = new HashMap<Integer, Integer>();
+
+
+ static {
+ levels.put(Level.ALL, "ALL");
+ levels.put(Level.CONFIG, "CFG");
+ levels.put(Level.FINE, "FIN");
+ levels.put(Level.FINER, "FNR");
+ levels.put(Level.FINEST, "FST");
+ levels.put(Level.INFO, "INF");
+ levels.put(Level.OFF, "OFF");
+ levels.put(Level.SEVERE, "SEV");
+ levels.put(Level.WARNING, "WRN");
+ }
+
+ public String format(LogRecord logRecord) {
+ StringWriter msg = new StringWriter();
+ if (logRecord.getThrown()!=null) {
+ msg.append("### EXCEPTION ###########################################");
+ msg.append(NEWLINE);
+ }
+ msg.append(dateTimeFormat.format(new Date()));
+ msg.append(" ");
+ msg.append(levels.get(logRecord.getLevel()));
+ msg.append(" ");
+
+ int threadId = logRecord.getThreadID();
+ for (int i=0; i<getIndentation(threadId); i++) {
+ msg.append(" ");
+ }
+
+ msg.append("| [");
+
+ String loggerName = logRecord.getLoggerName();
+ int dotIndex = loggerName.lastIndexOf('.');
+ if (dotIndex!=-1) {
+ loggerName = loggerName.substring(dotIndex+1);
+ }
+ msg.append(loggerName);
+
+ msg.append("] ");
+
+ msg.append(logRecord.getMessage());
+ if (logRecord.getThrown()!=null) {
+ msg.append(NEWLINE);
+ logRecord.getThrown().printStackTrace(new PrintWriter(msg));
+ msg.append("### EXCEPTION ###########################################");
+ }
+ msg.append(NEWLINE);
+ return msg.toString();
+ }
+
+ private int getIndentation(int threadId) {
+ Integer indentation = indentations.get(threadId);
+ if (indentation==null) {
+ indentation = indentations.size();
+ indentations.put(threadId, indentation);
+ }
+ return indentation;
+ }
+
+ public static void resetIndentation() {
+ indentations = new HashMap<Integer, Integer>();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/AssignActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/AssignActivity.java
new file mode 100644
index 0000000..fbf2c07
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/AssignActivity.java
@@ -0,0 +1,68 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.api.model.OpenExecution;
+import org.jbpm.pvm.internal.script.ScriptManager;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class AssignActivity extends JpdlAutomaticActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String expression;
+ protected String language;
+ protected String variableName;
+ protected Descriptor valueDescriptor;
+
+ void perform(OpenExecution execution) throws Exception {
+ Object value = null;
+
+ if (expression!=null) {
+ ScriptManager scriptManager = ScriptManager.getScriptManager();
+ value = scriptManager.evaluateExpression(expression, language);
+
+ } else if (valueDescriptor!=null) {
+ value = WireContext.create(valueDescriptor);
+ }
+
+ execution.setVariable(variableName, value);
+ }
+
+ public void setExpression(String expression) {
+ this.expression = expression;
+ }
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+ public void setVariableName(String variableName) {
+ this.variableName = variableName;
+ }
+ public void setValueDescriptor(Descriptor valueDescriptor) {
+ this.valueDescriptor = valueDescriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/AssignBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/AssignBinding.java
new file mode 100644
index 0000000..ad81431
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/AssignBinding.java
@@ -0,0 +1,74 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.List;
+import java.util.Set;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class AssignBinding extends JpdlBinding {
+
+ public AssignBinding() {
+ super("assign");
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ AssignActivity assignActivity = new AssignActivity();
+
+ String variableName = XmlUtil.attribute(element, "var", true, parse);
+ assignActivity.setVariableName(variableName);
+
+ String expression = XmlUtil.attribute(element, "expr");
+ if (expression!=null) {
+ assignActivity.setExpression(expression);
+ assignActivity.setLanguage(XmlUtil.attribute(element, "lang"));
+
+ } else {
+
+ Set<String> descriptorTagNames = JpdlParser.wireParser.getBindings().getTagNames(WireParser.CATEGORY_DESCRIPTOR);
+ Descriptor valueDescriptor = null;
+ List<Element> assignContentElements = XmlUtil.elements(element);
+
+ for (int i=0; ((i<assignContentElements.size()) && (valueDescriptor==null)); i++) {
+ Element assignContentElement = assignContentElements.get(i);
+ String assignContentElementTagName = XmlUtil.getTagLocalName(assignContentElement);
+ if (descriptorTagNames.contains(assignContentElementTagName)) {
+ valueDescriptor = parser.parseDescriptor(element, parse);
+ }
+ }
+
+ assignActivity.setValueDescriptor(valueDescriptor);
+ }
+
+ return assignActivity;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/CustomBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/CustomBinding.java
new file mode 100644
index 0000000..bec9d6f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/CustomBinding.java
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.wire.binding.ObjectBinding;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.usercode.UserCodeActivityBehaviour;
+import org.jbpm.pvm.internal.wire.usercode.UserCodeReference;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CustomBinding extends JpdlBinding {
+
+ static ObjectBinding objectBinding = new ObjectBinding();
+
+ public CustomBinding() {
+ super("custom");
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ UserCodeActivityBehaviour userCodeActivityBehaviour = new UserCodeActivityBehaviour();
+ UserCodeReference customActivityReference = parser.parseUserCodeReference(element, parse);
+ userCodeActivityBehaviour.setCustomActivityReference(customActivityReference);
+ return userCodeActivityBehaviour;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionBinding.java
new file mode 100644
index 0000000..396469e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionBinding.java
@@ -0,0 +1,104 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.List;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ExpressionCondition;
+import org.jbpm.pvm.internal.model.TransitionImpl;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.usercode.UserCodeCondition;
+import org.jbpm.pvm.internal.wire.usercode.UserCodeReference;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DecisionBinding extends JpdlBinding {
+
+ public DecisionBinding() {
+ super("decision");
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ if (element.hasAttribute("expr")) {
+ DecisionExpressionActivity decisionExpressionActivity = new DecisionExpressionActivity();
+ String expr = element.getAttribute("expr");
+ decisionExpressionActivity.setExpression(expr);
+ decisionExpressionActivity.setLanguage(XmlUtil.attribute(element, "lang"));
+ return decisionExpressionActivity;
+ }
+
+ Element handlerElement = XmlUtil.element(element, "handler");
+ if (handlerElement!=null) {
+ DecisionHandlerActivity decisionHandlerActivity = new DecisionHandlerActivity();
+ UserCodeReference decisionHandlerReference = parser.parseUserCodeReference(handlerElement, parse);
+ decisionHandlerActivity.setDecisionHandlerReference(decisionHandlerReference);
+ return decisionHandlerActivity;
+ }
+
+ boolean hasConditions = false;
+ List<Element> transitionElements = XmlUtil.elements(element, "transition");
+ ActivityImpl activity = parse.contextStackFind(ActivityImpl.class);
+ List<TransitionImpl> transitions = (List) activity.getOutgoingTransitions();
+
+ for (int i=0; i<transitionElements.size(); i++) {
+ TransitionImpl transition = transitions.get(i);
+ Element transitionElement = transitionElements.get(i);
+
+ Element conditionElement = XmlUtil.element(transitionElement, "condition");
+ if (conditionElement!=null) {
+ hasConditions = true;
+
+ if (conditionElement.hasAttribute("expr")) {
+ ExpressionCondition expressionCondition = new ExpressionCondition();
+ expressionCondition.setExpression(conditionElement.getAttribute("expr"));
+ expressionCondition.setLanguage(XmlUtil.attribute(conditionElement, "lang"));
+ transition.setCondition(expressionCondition);
+
+ } else {
+ Element conditionHandlerElement = XmlUtil.element(conditionElement, "handler");
+ if (handlerElement!=null) {
+ UserCodeCondition userCodeCondition = new UserCodeCondition();
+
+ UserCodeReference conditionReference = parser.parseUserCodeReference(conditionHandlerElement, parse);
+ userCodeCondition.setConditionReference(conditionReference);
+
+ transition.setCondition(userCodeCondition);
+ }
+ }
+ }
+ }
+
+ if (hasConditions) {
+ return new DecisionConditionActivity();
+ } else {
+ parse.addProblem("decision '"+element.getAttribute("name")+"' must have one of: expr attribute, handler attribute, handler element or condition expressions", element);
+ }
+
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionBuilder.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionBuilder.java
new file mode 100644
index 0000000..2d2aaeb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionBuilder.java
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.pvm.internal.builder.ActivityBehaviourBuilder;
+import org.jbpm.pvm.internal.builder.ActivityBuilder;
+import org.jbpm.pvm.internal.builder.CompositeBuilder;
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DecisionBuilder extends ActivityBehaviourBuilder {
+
+ public DecisionBuilder(ActivityBuilder activityBuilder) {
+ super(activityBuilder);
+ }
+
+ public DecisionBuilder handler(Descriptor descriptor) {
+ // TODO finish this
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionConditionActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionConditionActivity.java
new file mode 100644
index 0000000..14b30ad
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionConditionActivity.java
@@ -0,0 +1,69 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.List;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.Condition;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.Transition;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DecisionConditionActivity extends JpdlActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ public void execute(ActivityExecution execution) throws Exception {
+ execute((ExecutionImpl) execution);
+ }
+
+ public void execute(ExecutionImpl execution) throws Exception {
+ Transition transition = findTransitionUsingConditions(execution);
+ if (transition==null) {
+ throw new JbpmException("no outgoing transition condition evaluated to true for decision "+execution.getActivity());
+ }
+ if (transition.getName()!=null) {
+ execution.historyDecision(transition.getName());
+ }
+ execution.take(transition);
+ }
+
+ public static Transition findTransitionUsingConditions(ExecutionImpl execution) {
+ Activity activity = execution.getActivity();
+ List<Transition> outgoingTransitions = activity.getOutgoingTransitions();
+ for (Transition transition : outgoingTransitions) {
+ Condition condition = transition.getCondition();
+ if ( (condition==null)
+ || (condition.evaluate(execution))
+ ) {
+ return transition;
+ }
+ }
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionExpressionActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionExpressionActivity.java
new file mode 100644
index 0000000..94083f7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionExpressionActivity.java
@@ -0,0 +1,74 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.Transition;
+import org.jbpm.pvm.internal.script.ScriptManager;
+
+/**
+ * @author Tom Baeyens
+ */
+public class DecisionExpressionActivity extends JpdlActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String expression;
+ protected String language;
+
+ public void execute(ActivityExecution execution) {
+ execute((ExecutionImpl) execution);
+ }
+
+ public void execute(ExecutionImpl execution) {
+ Activity activity = execution.getActivity();
+ String transitionName = null;
+
+ ScriptManager scriptManager = ScriptManager.getScriptManager();
+ Object result = scriptManager.evaluateExpression(expression, language);
+ if ( (result!=null)
+ && (! (result instanceof String))
+ ) {
+ throw new JbpmException("expression '"+expression+"' in decision '"+activity.getName()+"' returned "+result.getClass().getName()+" instead of a transitionName (String): "+result);
+ }
+ transitionName = (String) result;
+
+ Transition transition = activity.getOutgoingTransition(transitionName);
+ if (transition==null) {
+ throw new JbpmException("expression '"+expression+"' in decision '"+activity.getName()+"' returned unexisting outgoing transition name: "+transitionName);
+ }
+
+ execution.historyDecision(transitionName);
+
+ execution.take(transition);
+ }
+
+ public void setExpression(String expr) {
+ this.expression = expr;
+ }
+ public void setLanguage(String lang) {
+ this.language = lang;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionHandlerActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionHandlerActivity.java
new file mode 100644
index 0000000..db3896e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/DecisionHandlerActivity.java
@@ -0,0 +1,75 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.api.jpdl.DecisionHandler;
+import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.Transition;
+import org.jbpm.pvm.internal.wire.usercode.UserCodeReference;
+
+/**
+ * @author Tom Baeyens
+ */
+public class DecisionHandlerActivity extends JpdlActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ UserCodeReference decisionHandlerReference;
+
+ public void execute(ActivityExecution execution) {
+ execute((ExecutionImpl) execution);
+ }
+
+ public void execute(ExecutionImpl execution) {
+ Activity activity = execution.getActivity();
+
+ String transitionName = null;
+
+ DecisionHandler decisionHandler = null;
+
+ if (decisionHandlerReference!=null) {
+ decisionHandler = (DecisionHandler) decisionHandlerReference.getObject(execution);
+ }
+
+ if (decisionHandler==null) {
+ throw new JbpmException("no decision handler specified");
+ }
+
+ transitionName = decisionHandler.decide(execution);
+
+ Transition transition = activity.getOutgoingTransition(transitionName);
+ if (transition==null) {
+ throw new JbpmException("handler in decision '"+activity.getName()+"' returned unexisting outgoing transition name: "+transitionName);
+ }
+
+ execution.historyDecision(transitionName);
+
+ execution.take(transition);
+ }
+
+ public void setDecisionHandlerReference(UserCodeReference decisionHandlerReference) {
+ this.decisionHandlerReference = decisionHandlerReference;
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EndActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EndActivity.java
new file mode 100644
index 0000000..09904ad
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EndActivity.java
@@ -0,0 +1,93 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.List;
+
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.api.model.OpenExecution;
+import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.Transition;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class EndActivity extends JpdlActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ protected boolean endProcessInstance = true;
+ protected String state = null;
+
+ public void execute(ActivityExecution execution) {
+ execute((ExecutionImpl)execution);
+ }
+
+ public void execute(ExecutionImpl execution) {
+ Activity activity = execution.getActivity();
+ List<Transition> outgoingTransitions = activity.getOutgoingTransitions();
+ ActivityImpl parentActivity = (ActivityImpl) activity.getParentActivity();
+
+ if ( (parentActivity!=null)
+ && ("group".equals(parentActivity.getType()))
+ ) {
+ // if the end activity itself has an outgoing transition
+ // (such end activities should be drawn on the border of the group)
+ if ( (outgoingTransitions!=null)
+ && (outgoingTransitions.size()==1)
+ ) {
+ Transition outgoingTransition = outgoingTransitions.get(0);
+ // taking the transition that goes over the group boundaries will
+ // destroy the scope automatically (see atomic operation TakeTransition)
+ execution.take(outgoingTransition);
+
+ } else {
+ execution.setActivity(parentActivity);
+ execution.signal();
+ }
+
+ } else {
+ ExecutionImpl executionToEnd = null;
+ if (endProcessInstance) {
+ executionToEnd = execution.getProcessInstance();
+ } else {
+ executionToEnd = execution;
+ }
+
+ if (state==null) {
+ executionToEnd.end();
+ } else {
+ executionToEnd.end(state);
+ }
+ }
+ }
+
+ public void setEndProcessInstance(boolean endProcessInstance) {
+ this.endProcessInstance = endProcessInstance;
+ }
+ public void setState(String state) {
+ this.state = state;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EndBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EndBinding.java
new file mode 100644
index 0000000..25d1014
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EndBinding.java
@@ -0,0 +1,59 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class EndBinding extends JpdlBinding {
+
+ public EndBinding() {
+ super("end");
+ }
+
+ protected EndBinding(String tag) {
+ super(tag);
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+
+ boolean endProcessInstance = true;
+ String ends = XmlUtil.attribute(element, "ends", false, parse);
+ if ("execution".equalsIgnoreCase(ends)) {
+ endProcessInstance = false;
+ }
+
+ String state = XmlUtil.attribute(element, "state", false, parse);
+
+ EndActivity endActivity = new EndActivity();
+ endActivity.setEndProcessInstance(endProcessInstance);
+ endActivity.setState(state);
+
+ return endActivity;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EndCancelBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EndCancelBinding.java
new file mode 100644
index 0000000..9a6c2eb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EndCancelBinding.java
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class EndCancelBinding extends EndBinding {
+
+ public EndCancelBinding() {
+ super("end-cancel");
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ EndActivity endActivity = (EndActivity) super.parseJpdl(element, parse, parser);
+ endActivity.setState("cancel");
+ return endActivity;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EndErrorBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EndErrorBinding.java
new file mode 100644
index 0000000..e76e404
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EndErrorBinding.java
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class EndErrorBinding extends EndBinding {
+
+ public EndErrorBinding() {
+ super("end-error");
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ EndActivity endActivity = (EndActivity) super.parseJpdl(element, parse, parser);
+ endActivity.setState("error");
+ return endActivity;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EventListenerBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EventListenerBinding.java
new file mode 100644
index 0000000..e79d077
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/EventListenerBinding.java
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.wire.usercode.UserCodeEventListener;
+import org.jbpm.pvm.internal.wire.usercode.UserCodeReference;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class EventListenerBinding extends JpdlBinding {
+
+ public EventListenerBinding() {
+ super("event-listener");
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ UserCodeEventListener userCodeEventListener = new UserCodeEventListener();
+
+ UserCodeReference eventListenerReference = parser.parseUserCodeReference(element, parse);
+ userCodeEventListener.setEventListenerReference(eventListenerReference);
+
+ return userCodeEventListener;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/ForkActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/ForkActivity.java
new file mode 100644
index 0000000..6ddb99a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/ForkActivity.java
@@ -0,0 +1,95 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.Condition;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.Transition;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ForkActivity extends JpdlActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ public void execute(ActivityExecution execution) {
+ execute((ExecutionImpl)execution);
+ }
+
+ public void execute(ExecutionImpl execution) {
+ Activity activity = execution.getActivity();
+
+ // evaluate the conditions and find the transitions that should be forked
+ List<Transition> forkingTransitions = new ArrayList<Transition>();
+ List<Transition> outgoingTransitions = activity.getOutgoingTransitions();
+ for (Transition transition: outgoingTransitions) {
+ Condition condition = transition.getCondition();
+ if ( (condition==null)
+ || (condition.evaluate(execution))
+ ) {
+ forkingTransitions.add(transition);
+ }
+ }
+
+ // if no outgoing transitions should be forked,
+ if (forkingTransitions.size()==0) {
+ // end this execution
+ execution.end();
+
+ // if there is exactly 1 transition to be taken, just use the incoming execution
+ } else if (forkingTransitions.size()==1) {
+ execution.take(forkingTransitions.get(0));
+
+ // if there are more transitions
+ } else {
+ ExecutionImpl concurrentRoot = null;
+ if (Execution.STATE_ACTIVE_ROOT.equals(execution.getState())) {
+ concurrentRoot = execution;
+ execution.setState(Execution.STATE_INACTIVE_CONCURRENT_ROOT);
+ execution.setActivity(null);
+ } else if (Execution.STATE_ACTIVE_CONCURRENT.equals(execution.getState())) {
+ concurrentRoot = execution.getParent();
+ }
+
+ for (Transition transition: forkingTransitions) {
+ // launch a concurrent path of execution
+ String childExecutionName = transition.getName();
+ ExecutionImpl concurrentExecution = concurrentRoot.createExecution(childExecutionName);
+ concurrentExecution.setActivity(activity);
+ concurrentExecution.setState(Execution.STATE_ACTIVE_CONCURRENT);
+ concurrentExecution.take(transition);
+
+ if (concurrentRoot.isEnded()) {
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/ForkBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/ForkBinding.java
new file mode 100644
index 0000000..30e99fb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/ForkBinding.java
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ForkBinding extends JpdlBinding {
+
+ public ForkBinding() {
+ super("fork");
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ return new ForkActivity();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/GroupActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/GroupActivity.java
new file mode 100644
index 0000000..35eb6a1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/GroupActivity.java
@@ -0,0 +1,107 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.Transition;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class GroupActivity extends JpdlExternalActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ public void execute(ActivityExecution execution) {
+ execute((ExecutionImpl)execution);
+ }
+
+ public void execute(ExecutionImpl execution) {
+ // find the start activity
+ Activity activity = execution.getActivity();
+ List<Activity> startActivities = findStartActivities(activity);
+ if (startActivities.size()==1) {
+ execution.execute(startActivities.get(0));
+ } else {
+
+ ExecutionImpl concurrentRoot = null;
+ if (Execution.STATE_ACTIVE_ROOT.equals(execution.getState())) {
+ concurrentRoot = execution;
+ } else if (Execution.STATE_ACTIVE_CONCURRENT.equals(execution.getState())) {
+ concurrentRoot = execution.getParent();
+
+ } else {
+ throw new JbpmException("illegal state");
+ }
+
+ for (Activity startActivity: startActivities) {
+ ExecutionImpl concurrentExecution = concurrentRoot.createExecution();
+ concurrentExecution.setState(Execution.STATE_ACTIVE_CONCURRENT);
+ concurrentExecution.execute(startActivity);
+ }
+ }
+ }
+
+ private List<Activity> findStartActivities(Activity activity) {
+ List<Activity> startActivities = new ArrayList<Activity>();
+ List nestedActivities = activity.getActivities();
+ for (ActivityImpl nestedActivity : (List<ActivityImpl>) nestedActivities) {
+ if ( (nestedActivity.getIncomingTransitions()==null)
+ || (nestedActivity.getIncomingTransitions().isEmpty())
+ ) {
+ startActivities.add(nestedActivity);
+ }
+ }
+ return startActivities;
+ }
+
+ public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) throws Exception {
+ signal((ExecutionImpl)execution, signalName, parameters);
+ }
+
+ public void signal(ExecutionImpl execution, String signalName, Map<String, ?> parameters) throws Exception {
+ Transition transition = null;
+ Activity activity = execution.getActivity();
+ List<Transition> outgoingTransitions = activity.getOutgoingTransitions();
+
+ int nbrOfOutgoingTransitions = (outgoingTransitions!=null ? outgoingTransitions.size() : 0);
+ if ( (signalName==null)
+ && (nbrOfOutgoingTransitions==1)
+ ) {
+ transition = outgoingTransitions.get(0);
+ } else {
+ transition = activity.getOutgoingTransition(signalName);
+ }
+
+ execution.take(transition);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/GroupBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/GroupBinding.java
new file mode 100644
index 0000000..222b266
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/GroupBinding.java
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class GroupBinding extends JpdlBinding {
+
+ public GroupBinding() {
+ super("group");
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ GroupActivity groupActivity = new GroupActivity();
+
+ ActivityImpl activity = parse.contextStackFind(ActivityImpl.class);
+
+ parser.parseActivities(element, parse, activity);
+
+ return groupActivity;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/HqlActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/HqlActivity.java
new file mode 100644
index 0000000..662daca
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/HqlActivity.java
@@ -0,0 +1,102 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.model.OpenExecution;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.descriptor.ListDescriptor;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HqlActivity extends JpdlAutomaticActivity {
+
+ private static final Log log = Log.getLog(HqlActivity.class.getName());
+
+ private static final long serialVersionUID = 1L;
+
+ protected String query;
+ protected ListDescriptor parametersDescriptor;
+ protected String resultVariableName;
+ protected boolean isResultUnique;
+
+ public void perform(OpenExecution execution) {
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ if (environment==null) {
+ throw new JbpmException("no environment for jpdl activity "+HqlBinding.TAG);
+ }
+ Session session = environment.get(Session.class);
+
+ Query q = createQuery(session);
+
+ if (parametersDescriptor!=null) {
+ for (Descriptor valueDescriptor: parametersDescriptor.getValueDescriptors()) {
+ String parameterName = valueDescriptor.getName();
+ Object value = WireContext.create(valueDescriptor);
+ applyParameter(q, parameterName, value);
+ }
+ }
+
+ Object result = null;
+ if (isResultUnique) {
+ result = q.uniqueResult();
+ } else {
+ result = q.list();
+ }
+
+ execution.setVariable(resultVariableName, result);
+ }
+
+ protected Query createQuery(Session session) {
+ return session.createQuery(query);
+ }
+
+ public void applyParameter(Query q, String parameterName, Object value) {
+ if (value instanceof String) {
+ q.setString(parameterName, (String) value);
+ } else if (value instanceof Long) {
+ q.setLong(parameterName, (Long) value);
+ } else {
+ log.error("unknown hql parameter type: "+value.getClass().getName());
+ }
+ }
+
+ public void setQuery(String query) {
+ this.query = query;
+ }
+ public void setParametersDescriptor(ListDescriptor parametersDescriptor) {
+ this.parametersDescriptor = parametersDescriptor;
+ }
+ public void setResultUnique(boolean isResultUnique) {
+ this.isResultUnique = isResultUnique;
+ }
+ public void setResultVariableName(String resultVariableName) {
+ this.resultVariableName = resultVariableName;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/HqlBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/HqlBinding.java
new file mode 100644
index 0000000..f9334c0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/HqlBinding.java
@@ -0,0 +1,88 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ListDescriptor;
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HqlBinding extends JpdlBinding {
+
+ public static final String TAG = "hql";
+
+ public HqlBinding() {
+ super(TAG);
+ }
+
+ protected HqlBinding(String tagName) {
+ super(tagName);
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ HqlActivity hqlActivity = createHqlActivity();
+
+ Element queryElement = XmlUtil.element(element, "query", true, parse);
+ if (queryElement!=null) {
+ String query = XmlUtil.getContentText(queryElement);
+ hqlActivity.setQuery(query);
+ }
+
+ if (XmlUtil.attributeBoolean(element, "unique", false, parse, Boolean.FALSE)) {
+ hqlActivity.setResultUnique(true);
+ }
+
+ String variableName = XmlUtil.attribute(element, "var", true, parse);
+ hqlActivity.setResultVariableName(variableName);
+
+ Element parametersElement = XmlUtil.element(element, "parameters");
+ List<Element> paramElements = XmlUtil.elements(parametersElement);
+ if (!paramElements.isEmpty()) {
+ List<Descriptor> parametersDescriptor = new ArrayList<Descriptor>();
+ for (Element paramElement: paramElements) {
+ WireParser wireParser = WireParser.getInstance();
+ Descriptor paramDescriptor = (Descriptor) wireParser.parseElement(paramElement, parse, WireParser.CATEGORY_DESCRIPTOR);
+ parametersDescriptor.add(paramDescriptor);
+ }
+
+ ListDescriptor parametersListDescriptor = new ListDescriptor();
+ parametersListDescriptor.setValueDescriptors(parametersDescriptor);
+ hqlActivity.setParametersDescriptor(parametersListDescriptor);
+ }
+
+ return hqlActivity;
+ }
+
+ protected HqlActivity createHqlActivity() {
+ return new HqlActivity();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JavaActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JavaActivity.java
new file mode 100644
index 0000000..234e9c1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JavaActivity.java
@@ -0,0 +1,113 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.List;
+
+import javax.naming.InitialContext;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.model.OpenExecution;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.descriptor.ArgDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.usercode.UserCodeReference;
+
+
+/**
+ * @author Tom Baeyens
+ * @author Koen Aers
+ */
+public class JavaActivity extends JpdlAutomaticActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ protected UserCodeReference invocationReference;
+
+ protected String methodName = null;
+ protected List<ArgDescriptor> argDescriptors = null;
+
+ protected String variableName;
+ protected String jndiName;
+
+ public void perform(OpenExecution execution) throws Exception {
+
+ Object target = null;
+ if (invocationReference != null) {
+ target = invocationReference.getObject(execution);
+ } else if (jndiName != null) {
+ target = new InitialContext().lookup(jndiName);
+ } else {
+ throw new JbpmException("no target specified");
+ }
+
+ Class<?> clazz;
+ // method invocation on object or static method invocation in case object is null
+ if (target!=null) {
+ clazz = target.getClass();
+ } else {
+ ObjectDescriptor objectDescriptor = (ObjectDescriptor) invocationReference.getDescriptor();
+ String className = objectDescriptor.getClassName();
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ clazz = Class.forName(className, true, classLoader);
+ }
+
+ WireContext wireContext = new WireContext(new WireDefinition());
+ Object returnValue = ObjectDescriptor.invokeMethod(methodName, argDescriptors, wireContext, target, clazz);
+
+ if (variableName!=null) {
+ execution.setVariable(variableName, returnValue);
+ }
+ }
+
+ public void setInvocationReference(UserCodeReference invocationReference) {
+ this.invocationReference = invocationReference;
+ }
+ public void setVariableName(String variableName) {
+ this.variableName = variableName;
+ }
+ public String getMethodName() {
+ return methodName;
+ }
+ public void setMethodName(String methodName) {
+ this.methodName = methodName;
+ }
+ public void setJndiName(String jndiName) {
+ this.jndiName = jndiName;
+ }
+ public List<ArgDescriptor> getArgDescriptors() {
+ return argDescriptors;
+ }
+ public void setArgDescriptors(List<ArgDescriptor> argDescriptors) {
+ this.argDescriptors = argDescriptors;
+ }
+ public UserCodeReference getInvocationReference() {
+ return invocationReference;
+ }
+ public String getVariableName() {
+ return variableName;
+ }
+ public String getJndiName() {
+ return jndiName;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JavaBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JavaBinding.java
new file mode 100644
index 0000000..fb2e866
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JavaBinding.java
@@ -0,0 +1,81 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.List;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.descriptor.ArgDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.usercode.UserCodeReference;
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ * @author Koen Aers
+ */
+public class JavaBinding extends JpdlBinding {
+
+ public static final String TAG = "java";
+
+ public JavaBinding() {
+ super(TAG);
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ JavaActivity javaActivity = new JavaActivity();
+ if (XmlUtil.attribute(element, "method", true, parse, null)!=null) {
+ String jndiName = XmlUtil.attribute(element, "ejb-jndi-name", false, parse, null);
+ if (jndiName != null) {
+ parseEjbInvocation(javaActivity, element, parse, parser);
+ } else {
+ parseJavaInvocation(javaActivity, element, parse, parser);
+ }
+ }
+ String variableName = XmlUtil.attribute(element, "var");
+ javaActivity.setVariableName(variableName);
+ return javaActivity;
+ }
+
+ private void parseEjbInvocation(JavaActivity javaActivity, Element element, Parse parse, JpdlParser parser) {
+ javaActivity.setJndiName(XmlUtil.attribute(element, "ejb-jndi-name"));
+ javaActivity.setMethodName(XmlUtil.attribute(element, "method"));
+ List<Element> argElements = XmlUtil.elements(element, "arg");
+ List<ArgDescriptor> argDescriptors = new WireParser().parseArgs(argElements, parse);
+ javaActivity.setArgDescriptors(argDescriptors);
+ }
+
+ private void parseJavaInvocation(JavaActivity javaActivity, Element element, Parse parse, JpdlParser parser) {
+ UserCodeReference invocationReference = parser.parseUserCodeReference(element, parse);
+ javaActivity.setInvocationReference(invocationReference);
+ ObjectDescriptor objectDescriptor = (ObjectDescriptor) invocationReference.getDescriptor();
+ javaActivity.setArgDescriptors(objectDescriptor.getArgDescriptors());
+ objectDescriptor.setArgDescriptors(null);
+ javaActivity.setMethodName(objectDescriptor.getMethodName());
+ objectDescriptor.setMethodName(null);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JmsActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JmsActivity.java
new file mode 100644
index 0000000..b0de78a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JmsActivity.java
@@ -0,0 +1,333 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.jms.Destination;
+import javax.jms.MapMessage;
+import javax.jms.Message;
+import javax.jms.MessageProducer;
+import javax.jms.ObjectMessage;
+import javax.jms.Queue;
+import javax.jms.QueueConnection;
+import javax.jms.QueueConnectionFactory;
+import javax.jms.QueueSender;
+import javax.jms.QueueSession;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.jms.Topic;
+import javax.jms.TopicConnection;
+import javax.jms.TopicConnectionFactory;
+import javax.jms.TopicPublisher;
+import javax.jms.TopicSession;
+import javax.jms.XAConnectionFactory;
+import javax.jms.XAQueueConnection;
+import javax.jms.XAQueueConnectionFactory;
+import javax.jms.XAQueueSession;
+import javax.jms.XATopicConnection;
+import javax.jms.XATopicConnectionFactory;
+import javax.jms.XATopicSession;
+import javax.naming.InitialContext;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.model.OpenExecution;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.script.ScriptManager;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.descriptor.MapDescriptor;
+
+/**
+ * @author Koen Aers
+ * @author Tom Baeyens
+ */
+public class JmsActivity extends JpdlAutomaticActivity {
+
+ private static final Log log = Log.getLog(JmsActivity.class.getName());
+
+ private static final long serialVersionUID = 1L;
+
+ protected String type = null;
+ protected String textExpression = null;
+ protected String objectExpression = null;
+ protected MapDescriptor mapDescriptor = null;
+ protected String connectionFactoryName = null;
+ protected String destinationName = null;
+ protected boolean transacted = true;
+ protected int acknowledgeMode = Session.AUTO_ACKNOWLEDGE;
+
+ public void perform(OpenExecution execution) {
+ try {
+ InitialContext initialContext = new InitialContext();
+
+ Destination destination = (Destination) initialContext.lookup(destinationName);
+ Object connectionFactory = initialContext.lookup(connectionFactoryName);
+
+ if (connectionFactory instanceof XAConnectionFactory) {
+ log.debug("connection factory '"+connectionFactoryName+"' is a XAConnectionFactory: using xa jms apis");
+ if (destination instanceof Queue) {
+ log.debug("destination '"+destinationName+"' is a Queue: using xa queue jms apis");
+ XAQueueConnectionFactory xaQueueConnectionFactory = (XAQueueConnectionFactory) connectionFactory;
+ sendToQueueXA((Queue) destination, xaQueueConnectionFactory);
+
+ } else if (destination instanceof Topic) {
+ log.debug("destination '"+destinationName+"' is a Topic: using xa topic jms apis");
+ XATopicConnectionFactory xaTopicConnectionFactory = (XATopicConnectionFactory) connectionFactory;
+ sendToTopicXA((Topic) destination, xaTopicConnectionFactory);
+
+ } else {
+ throw new JbpmException("invalid destination type for '"+destinationName+"': "+destination.getClass().getName());
+ }
+
+ } else { // non-XA
+ log.debug("connection factory '"+connectionFactoryName+"' is a ConnectionFactory: using non-xa jms apis");
+ if (destination instanceof Queue) {
+ log.debug("destination '"+destinationName+"' is a Queue: using non-xa queue jms apis");
+ QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory) connectionFactory;
+ sendToQueue((Queue) destination, queueConnectionFactory);
+
+ } else if (destination instanceof Topic) {
+ log.debug("destination '"+destinationName+"' is a Topic: using non-xa topic jms apis");
+ TopicConnectionFactory topicConnectionFactory = (TopicConnectionFactory) connectionFactory;
+ sendToTopic((Topic) destination, topicConnectionFactory);
+
+ } else {
+ throw new JbpmException("invalid destination type for '"+destinationName+"': "+destination.getClass().getName());
+ }
+ }
+
+ } catch (RuntimeException e) {
+ log.error("couldn't send jms message: "+e.getMessage(), e);
+ throw e;
+
+ } catch (Exception e) {
+ log.error("couldn't send jms message: "+e.getMessage(), e);
+ throw new JbpmException("couldn't send jms message to queue"+e.getMessage(), e);
+ }
+ }
+
+ protected void sendToQueueXA(Queue queue, XAQueueConnectionFactory xaQueueConnectionFactory) throws Exception {
+ XAQueueConnection xaQueueConnection = null;
+ XAQueueSession xaQueueSession = null;
+ MessageProducer messageProducer = null;
+
+ try {
+ xaQueueConnection = xaQueueConnectionFactory.createXAQueueConnection();
+ xaQueueSession = xaQueueConnection.createXAQueueSession();
+ messageProducer = xaQueueSession.createProducer(queue);
+ Message message = createMessage(xaQueueSession);
+ messageProducer.send(message);
+
+ } finally {
+ try {
+ messageProducer.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ xaQueueSession.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ xaQueueConnection.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ protected void sendToTopicXA(Topic topic, XATopicConnectionFactory xaTopicConnectionFactory) throws Exception {
+ XATopicConnection xaTopicConnection = null;
+ XATopicSession xaTopicSession = null;
+ MessageProducer messageProducer = null;
+
+ try {
+ xaTopicConnection = xaTopicConnectionFactory.createXATopicConnection();
+ xaTopicSession = xaTopicConnection.createXATopicSession();
+ messageProducer = xaTopicSession.createProducer(topic);
+ Message message = createMessage(xaTopicSession);
+ messageProducer.send(message);
+
+ } finally {
+ try {
+ messageProducer.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ xaTopicSession.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ xaTopicConnection.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ protected void sendToQueue(Queue queue, QueueConnectionFactory queueConnectionFactory) throws Exception {
+ QueueConnection queueConnection = null;
+ QueueSession queueSession = null;
+ QueueSender queueSender = null;
+
+ try {
+ queueConnection = queueConnectionFactory.createQueueConnection();
+ queueSession = queueConnection.createQueueSession(transacted, acknowledgeMode);
+ queueSender = queueSession.createSender(queue);
+ Message message = createMessage(queueSession);
+ queueSender.send(message);
+ if (transacted) {
+ queueSession.commit();
+ }
+
+ } finally {
+ try {
+ queueSender.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ queueSession.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ queueConnection.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ protected void sendToTopic(Topic topic, TopicConnectionFactory topicConnectionFactory) throws Exception {
+ TopicConnection topicConnection = null;
+ TopicSession topicSession = null;
+ TopicPublisher topicPublisher = null;
+
+ try {
+ topicConnection = topicConnectionFactory.createTopicConnection();
+ topicSession = topicConnection.createTopicSession(transacted, acknowledgeMode);
+ topicPublisher = topicSession.createPublisher(topic);
+ Message message = createMessage(topicSession);
+ topicPublisher.send(message);
+ if (transacted) {
+ topicSession.commit();
+ }
+
+ } finally {
+ try {
+ topicPublisher.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ topicSession.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ topicConnection.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ protected Message createMessage(Session session) throws Exception {
+ if ("text".equals(type)) {
+ return createTextMessage(session);
+ } else if ("object".equals(type)) {
+ return createObjectMessage(session);
+ } else if ("map".equals(type)) {
+ return createMapMessage(session);
+ }
+ throw new JbpmException("no type configured in jms activity");
+ }
+
+ private MapMessage createMapMessage(Session session) throws Exception {
+ MapMessage result = session.createMapMessage();
+ if (mapDescriptor != null) {
+ List<Descriptor> keyDescriptors = mapDescriptor.getKeyDescriptors();
+ List<Descriptor> valueDescriptors = mapDescriptor.getValueDescriptors();
+ for (int i = 0; i < keyDescriptors.size(); i++) {
+ String key = (String) WireContext.create(keyDescriptors.get(i));
+ Object value = (String) WireContext.create(valueDescriptors.get(i));
+ result.setObject(key, value);
+ }
+ }
+ return result;
+ }
+
+ private TextMessage createTextMessage(Session session) throws Exception {
+ Object value = ScriptManager.getScriptManager().evaluateExpression(textExpression, null);
+ if (value!=null) {
+ return session.createTextMessage(value.toString());
+ }
+ throw new JbpmException("null value for expression '"+textExpression+"' in jms activity");
+ }
+
+ private ObjectMessage createObjectMessage(Session session) throws Exception {
+ Object object = ScriptManager.getScriptManager().evaluateExpression(objectExpression, null);
+ if ( (object!=null)
+ && !(object instanceof Serializable)
+ ) {
+ throw new JbpmException("can't send jms message: creation of object message expression '"+objectExpression+"' must be done with serializable: "+object);
+ }
+ return session.createObjectMessage((Serializable) object);
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+ public void setText(String text) {
+ this.textExpression = text;
+ }
+ public void setExpression(String expression) {
+ this.objectExpression = expression;
+ }
+ public void setMapDescriptor(MapDescriptor mapDescriptor) {
+ this.mapDescriptor = mapDescriptor;
+ }
+ public void setConnectionFactoryName(String connectionFactoryName) {
+ this.connectionFactoryName = connectionFactoryName;
+ }
+ public void setDestinationName(String destinationName) {
+ this.destinationName = destinationName;
+ }
+ public boolean isTransacted() {
+ return transacted;
+ }
+ public void setTransacted(boolean transacted) {
+ this.transacted = transacted;
+ }
+ public int getAcknowledgeMode() {
+ return acknowledgeMode;
+ }
+ public void setAcknowledgeMode(int acknowledgeMode) {
+ this.acknowledgeMode = acknowledgeMode;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JmsBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JmsBinding.java
new file mode 100644
index 0000000..402fd31
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JmsBinding.java
@@ -0,0 +1,109 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import javax.jms.Session;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.descriptor.MapDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+/**
+ * @author Koen Aers
+ */
+public class JmsBinding extends JpdlBinding {
+
+ public static final String TAG = "jms";
+
+ public JmsBinding() {
+ super(TAG);
+ }
+
+ protected JmsBinding(String tagName) {
+ super(tagName);
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ JmsActivity jmsActivity = createJmsActivity();
+
+ // attributes /////////////////////////////////////////////////////////////
+
+ String connectionFactoryName = XmlUtil.attribute(element, "connection-factory", true, parse);
+ jmsActivity.setConnectionFactoryName(connectionFactoryName);
+
+ String destinationName = XmlUtil.attribute(element, "destination", true, parse);
+ jmsActivity.setDestinationName(destinationName);
+
+ Boolean transacted = XmlUtil.attributeBoolean(element, "transacted", false, parse, null);
+ if (transacted!=null) {
+ jmsActivity.setTransacted(transacted);
+ }
+
+ String acknowledge = XmlUtil.attribute(element, "acknowledge");
+ if (acknowledge != null) {
+ if (acknowledge.equalsIgnoreCase("auto")) {
+ jmsActivity.setAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);
+ } else if (acknowledge.equalsIgnoreCase("client")) {
+ jmsActivity.setAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
+ } else if (acknowledge.equalsIgnoreCase("dups-ok")) {
+ jmsActivity.setAcknowledgeMode(Session.DUPS_OK_ACKNOWLEDGE);
+ } else {
+ parse.addProblem("unknown jms acknowledge: '"+acknowledge+"'", element);
+ }
+ }
+
+ // elements ///////////////////////////////////////////////////////////////
+
+ Element textElement = XmlUtil.element(element, "text", false, parse);
+ if (textElement != null) {
+ String text = XmlUtil.getContentText(textElement);
+ jmsActivity.setType("text");
+ jmsActivity.setText(text);
+ }
+
+ Element objectElement = XmlUtil.element(element, "object", false, parse);
+ if (objectElement != null) {
+ jmsActivity.setType("object");
+ jmsActivity.setExpression(XmlUtil.attribute(objectElement, "expr"));
+ }
+
+ Element mapElement = XmlUtil.element(element, "map", false, parse);
+ if (mapElement != null) {
+ jmsActivity.setType("map");
+ Descriptor descriptor = parser.parseDescriptor(mapElement, parse);
+ if (descriptor instanceof MapDescriptor) {
+ jmsActivity.setMapDescriptor((MapDescriptor) descriptor);
+ } else {
+ parse.addProblem("the parser did not return a descriptor of type MapDescriptor");
+ }
+ }
+
+ return jmsActivity;
+ }
+
+ protected JmsActivity createJmsActivity() {
+ return new JmsActivity();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JoinActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JoinActivity.java
new file mode 100644
index 0000000..4b00c92
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JoinActivity.java
@@ -0,0 +1,134 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.LockMode;
+import org.hibernate.Session;
+import org.jbpm.api.Execution;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.Transition;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class JoinActivity extends JpdlActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ int multiplicity = -1;
+ LockMode lockMode = LockMode.UPGRADE;
+
+ public void execute(ActivityExecution execution) {
+ execute((ExecutionImpl)execution);
+ }
+
+ public void execute(ExecutionImpl execution) {
+ Activity activity = execution.getActivity();
+
+ // if this is a single, non concurrent root
+ if (Execution.STATE_ACTIVE_ROOT.equals(execution.getState())) {
+ // just pass through
+ Transition transition = activity.getDefaultOutgoingTransition();
+ if (transition==null) {
+ throw new JbpmException("join must have an outgoing transition");
+ }
+ execution.take(transition);
+
+ } else if (Execution.STATE_ACTIVE_CONCURRENT.equals(execution.getState())) {
+
+ // force version increment in the parent execution
+ Session session = EnvironmentImpl.getFromCurrent(Session.class);
+ session.lock(execution.getParent(), lockMode);
+
+ execution.setState(Execution.STATE_INACTIVE_JOIN);
+ execution.waitForSignal();
+
+ ExecutionImpl concurrentRoot = execution.getParent();
+ List<ExecutionImpl> joinedExecutions = getJoinedExecutions(concurrentRoot, activity);
+
+ if (isComplete(joinedExecutions, activity)) {
+ endJoinedExecutions(joinedExecutions);
+
+ ExecutionImpl outgoingExecution = null;
+ if (concurrentRoot.getExecutions().size()==0) {
+ outgoingExecution = concurrentRoot;
+ outgoingExecution.setState(Execution.STATE_ACTIVE_ROOT);
+ } else {
+ outgoingExecution = concurrentRoot.createExecution();
+ outgoingExecution.setState(Execution.STATE_ACTIVE_CONCURRENT);
+ }
+
+ execution.setActivity(activity, outgoingExecution);
+ Transition transition = activity.getDefaultOutgoingTransition();
+ if (transition==null) {
+ throw new JbpmException("join must have an outgoing transition");
+ }
+ outgoingExecution.take(transition);
+ }
+
+ } else {
+ throw new JbpmException("invalid execution state");
+ }
+ }
+
+ protected boolean isComplete(List<ExecutionImpl> joinedExecutions, Activity activity) {
+ int nbrOfExecutionsToJoin = multiplicity;
+ if (multiplicity==-1) {
+ nbrOfExecutionsToJoin = activity.getIncomingTransitions().size();
+ }
+ return joinedExecutions.size()==nbrOfExecutionsToJoin;
+ }
+
+ protected List<ExecutionImpl> getJoinedExecutions(ExecutionImpl concurrentRoot, Activity activity) {
+ List<ExecutionImpl> joinedExecutions = new ArrayList<ExecutionImpl>();
+ List concurrentExecutions = (List)concurrentRoot.getExecutions();
+ for (ExecutionImpl concurrentExecution: (List<ExecutionImpl>)concurrentExecutions) {
+ if ( (Execution.STATE_INACTIVE_JOIN.equals(concurrentExecution.getState()))
+ && (concurrentExecution.getActivity()==activity)
+ ) {
+ joinedExecutions.add(concurrentExecution);
+ }
+ }
+ return joinedExecutions;
+ }
+
+ protected void endJoinedExecutions(List<ExecutionImpl> joinedExecutions) {
+ for (ExecutionImpl joinedExecution: joinedExecutions) {
+ joinedExecution.end();
+ }
+ }
+
+ public void setMultiplicity(int multiplicity) {
+ this.multiplicity = multiplicity;
+ }
+ public void setLockMode(LockMode lockMode) {
+ this.lockMode = lockMode;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JoinBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JoinBinding.java
new file mode 100644
index 0000000..4620dbc
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JoinBinding.java
@@ -0,0 +1,69 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.hibernate.LockMode;
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class JoinBinding extends JpdlBinding {
+
+ private static final String MULTIPLICITY = "multiplicity";
+
+ private static final String LOCKMODE = "lockmode";
+
+ public JoinBinding() {
+ super("join");
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ JoinActivity joinActivity = new JoinActivity();
+
+ if (element.hasAttribute(MULTIPLICITY)) {
+ String multiplicictyText = element.getAttribute(MULTIPLICITY);
+ try {
+ int multiplicity = Integer.parseInt(multiplicictyText);
+ joinActivity.setMultiplicity(multiplicity);
+ } catch (NumberFormatException e) {
+ parse.addProblem(MULTIPLICITY + " " + multiplicictyText + " is not a valid integer", element);
+ }
+ }
+
+ if (element.hasAttribute(LOCKMODE)) {
+ String lockModeText = element.getAttribute(LOCKMODE);
+ LockMode lockMode = LockMode.parse(lockModeText.toUpperCase());
+ if (lockMode==null) {
+ parse.addProblem(LOCKMODE + " " + lockModeText + " is not a valid lock mode", element);
+ } else {
+ joinActivity.setLockMode(lockMode);
+ }
+ }
+
+ return joinActivity;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JpdlActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JpdlActivity.java
new file mode 100644
index 0000000..d252ab5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JpdlActivity.java
@@ -0,0 +1,35 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.api.activity.ActivityBehaviour;
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class JpdlActivity implements ActivityBehaviour {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JpdlAutomaticActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JpdlAutomaticActivity.java
new file mode 100644
index 0000000..261c8de
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JpdlAutomaticActivity.java
@@ -0,0 +1,24 @@
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.api.listener.EventListenerExecution;
+import org.jbpm.api.model.OpenExecution;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+
+
+public abstract class JpdlAutomaticActivity extends JpdlActivity implements EventListener {
+
+ private static final long serialVersionUID = 1L;
+
+ public void execute(ActivityExecution execution) throws Exception {
+ perform(execution);
+ ((ExecutionImpl)execution).historyAutomatic();
+ }
+
+ public void notify(EventListenerExecution execution) throws Exception {
+ perform(execution);
+ }
+
+ abstract void perform(OpenExecution execution) throws Exception;
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JpdlBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JpdlBinding.java
new file mode 100644
index 0000000..81631ff
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JpdlBinding.java
@@ -0,0 +1,99 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+
+import java.util.List;
+
+import org.jbpm.api.model.Event;
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.jpdl.internal.xml.UnresolvedTransitions;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.TimerDefinitionImpl;
+import org.jbpm.pvm.internal.model.TransitionImpl;
+import org.jbpm.pvm.internal.util.TagBinding;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class JpdlBinding extends TagBinding {
+
+ public JpdlBinding(String tagName) {
+ super(tagName, null, null);
+ }
+
+ public abstract Object parseJpdl(Element element, Parse parse, JpdlParser parser);
+
+ public final Object parse(Element element, Parse parse, Parser parser) {
+ return parseJpdl(element, parse, (JpdlParser) parser);
+ }
+
+ public void parseName(Element element, ActivityImpl activity, Parse parse) {
+ String name = XmlUtil.attribute(element, "name", isNameRequired(), parse);
+
+ if (name!=null) {
+ // basic name validation
+ if ("".equals(name)) {
+ parse.addProblem(XmlUtil.errorMessageAttribute(element, "name", name, "is empty"), element);
+ } else if (name.indexOf('/')!=-1) {
+ parse.addProblem(XmlUtil.errorMessageAttribute(element, "name", name, "contains slash (/)"), element);
+ }
+ activity.setName(name);
+ }
+ }
+
+ public boolean isNameRequired() {
+ return true;
+ }
+
+// TODO remove this dead code
+//
+// public void parseTransitions(Element element, ActivityImpl activity, Parse parse, JpdlParser jpdlParser) {
+// List<Element> transitionElements = XmlUtil.elements(element, "transition");
+// UnresolvedTransitions unresolvedTransitions = parse.contextStackFind(UnresolvedTransitions.class);
+// for (Element transitionElement: transitionElements) {
+// String transitionName = XmlUtil.attribute(transitionElement, "name", false, parse);
+//
+// Element timerElement = XmlUtil.element(transitionElement, "timer");
+// if (timerElement!=null) {
+// if (transitionName!=null) {
+// TimerDefinitionImpl timerDefinitionImpl = jpdlParser.parseTimerDefinition(timerElement, parse, activity);
+// timerDefinitionImpl.setSignalName(transitionName);
+// } else {
+// parse.addProblem("a transition name is required when a timer is placed on a transition", element);
+// }
+// }
+//
+// TransitionImpl transition = activity.createOutgoingTransition();
+// transition.setName(transitionName);
+//
+// unresolvedTransitions.add(transition, transitionElement);
+//
+// jpdlParser.parseOnEvent(transitionElement, parse, transition, Event.TAKE);
+// }
+// }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JpdlExternalActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JpdlExternalActivity.java
new file mode 100644
index 0000000..45cf6b2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/JpdlExternalActivity.java
@@ -0,0 +1,31 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.api.activity.ExternalActivityBehaviour;
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class JpdlExternalActivity extends JpdlActivity implements ExternalActivityBehaviour {
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/MailActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/MailActivity.java
new file mode 100644
index 0000000..abe3bb7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/MailActivity.java
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.Collection;
+
+import javax.mail.Message;
+
+import org.jbpm.api.model.OpenExecution;
+import org.jbpm.pvm.internal.email.spi.MailProducer;
+import org.jbpm.pvm.internal.email.spi.MailSession;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+
+/**
+ * @author Alejandro Guizar
+ */
+public class MailActivity extends JpdlAutomaticActivity {
+
+ protected MailProducer mailProducer;
+
+ private static final long serialVersionUID = 1L;
+
+ void perform(OpenExecution execution) throws Exception {
+ Collection<Message> messages = mailProducer.produce(execution);
+ EnvironmentImpl.getFromCurrent(MailSession.class).send(messages);
+ }
+
+ public void setMailProducer(MailProducer mailProducer) {
+ this.mailProducer = mailProducer;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/MailBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/MailBinding.java
new file mode 100644
index 0000000..394fb9d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/MailBinding.java
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+/**
+ * @author Alejandro Guizar
+ */
+public class MailBinding extends JpdlBinding {
+
+ public MailBinding() {
+ super("mail");
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ MailActivity activity = new MailActivity();
+ activity.setMailProducer(parser.parseMailProducer(element, parse, null));
+ return activity;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/MailListener.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/MailListener.java
new file mode 100644
index 0000000..af5fb86
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/MailListener.java
@@ -0,0 +1,67 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.Collection;
+
+import javax.mail.Message;
+
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.api.listener.EventListenerExecution;
+import org.jbpm.pvm.internal.email.spi.MailProducer;
+import org.jbpm.pvm.internal.email.spi.MailSession;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.env.TaskContext;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+/**
+ * @author Alejandro Guizar
+ */
+public class MailListener implements EventListener {
+
+ protected transient MailProducer mailProducer;
+
+ private static final long serialVersionUID = 1L;
+
+ public void notify(EventListenerExecution execution) throws Exception {
+ // find current task
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ DbSession dbSession = environment.get(DbSession.class);
+ TaskImpl task = dbSession.findTaskByExecution(execution);
+
+ // make task available to mail templates through task context
+ TaskContext taskContext = new TaskContext(task);
+ environment.setContext(taskContext);
+ try {
+ Collection<Message> messages = mailProducer.produce(execution);
+ environment.get(MailSession.class).send(messages);
+ } finally {
+ environment.removeContext(taskContext);
+ }
+ }
+
+ public void setMailProducer(MailProducer mailProducer) {
+ this.mailProducer = mailProducer;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/PassthroughActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/PassthroughActivity.java
new file mode 100644
index 0000000..cb15ed2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/PassthroughActivity.java
@@ -0,0 +1,37 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.api.activity.ActivityBehaviour;
+import org.jbpm.api.activity.ActivityExecution;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class PassthroughActivity implements ActivityBehaviour {
+
+ private static final long serialVersionUID = 1L;
+
+ public void execute(ActivityExecution execution) throws Exception {
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/PassthroughBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/PassthroughBinding.java
new file mode 100644
index 0000000..ad2d473
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/PassthroughBinding.java
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class PassthroughBinding extends JpdlBinding {
+
+ public PassthroughBinding() {
+ super("passthrough");
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ return new PassthroughActivity();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesActivity.java
new file mode 100644
index 0000000..3f535b5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesActivity.java
@@ -0,0 +1,70 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.drools.KnowledgeBase;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.jpdl.internal.rules.ExecutionGlobals;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.repository.RulesDeployer;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class RulesActivity extends DecisionConditionActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ List<RulesFact> rulesFacts = new ArrayList<RulesFact>();
+
+ public void execute(ActivityExecution execution) throws Exception {
+ ExecutionImpl executionImpl = (ExecutionImpl)execution;
+ String deploymentId = executionImpl.getProcessDefinition().getDeploymentId();
+ KnowledgeBase knowledgeBase = RulesDeployer.getKnowledgeBase(deploymentId);
+
+ StatefulKnowledgeSession knowledgeSession =
+ knowledgeBase.newStatefulKnowledgeSession();
+
+ ExecutionGlobals executionGlobals = new ExecutionGlobals(execution);
+ knowledgeSession.getGlobals().setDelegate(executionGlobals);
+
+ for (RulesFact rulesFact: rulesFacts) {
+ Object fact = rulesFact.getObject(execution);
+ knowledgeSession.insert(fact);
+ }
+
+ knowledgeSession.fireAllRules();
+
+ super.execute(executionImpl);
+ }
+
+ public void addRulesFact(RulesFact rulesFact) {
+ rulesFacts.add(rulesFact);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesBinding.java
new file mode 100644
index 0000000..794d6a7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesBinding.java
@@ -0,0 +1,70 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.List;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class RulesBinding extends JpdlBinding {
+
+ public RulesBinding() {
+ super("rules");
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ RulesActivity rulesActivity = new RulesActivity();
+
+ List<Element> factElements = XmlUtil.elements(element, "fact");
+ for (Element factElement: factElements) {
+ RulesFact rulesFact = new RulesFact();
+
+ String factVar = XmlUtil.attribute(factElement, "var");
+ if (factVar!=null) {
+ rulesFact.setVariableName(factVar);
+
+ } else {
+ String factExpr = XmlUtil.attribute(factElement, "expr");
+
+ if (factExpr!=null) {
+ String factLang = XmlUtil.attribute(factElement, "lang");
+ rulesFact.setExpression(factExpr);
+ rulesFact.setLanguage(factLang);
+
+ } else {
+ parse.addProblem("'fact' element inside 'rules' activity requires attribute 'var' or 'expr'", element);
+ }
+ }
+
+ rulesActivity.addRulesFact(rulesFact);
+ }
+
+ return rulesActivity;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesDecisionActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesDecisionActivity.java
new file mode 100644
index 0000000..3124df0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesDecisionActivity.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.drools.KnowledgeBase;
+import org.drools.runtime.StatelessKnowledgeSession;
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.jpdl.internal.rules.ExecutionGlobals;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.repository.RulesDeployer;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class RulesDecisionActivity extends JpdlActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ public void execute(ActivityExecution execution) throws Exception {
+ String deploymentId = ((ExecutionImpl)execution).getProcessDefinition().getDeploymentId();
+ KnowledgeBase knowledgeBase = RulesDeployer.getKnowledgeBase(deploymentId);
+
+ StatelessKnowledgeSession knowledgeSession =
+ knowledgeBase.newStatelessKnowledgeSession();
+
+ ExecutionGlobals executionGlobals = new ExecutionGlobals(execution);
+ knowledgeSession.getGlobals().setDelegate(executionGlobals);
+ knowledgeSession.execute(execution);
+ if (!executionGlobals.getOutcome().isDefined()) {
+ execution.takeDefaultTransition();
+ } else {
+ execution.take(executionGlobals.getOutcome().get());
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesDecisionBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesDecisionBinding.java
new file mode 100644
index 0000000..4a6e436
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesDecisionBinding.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class RulesDecisionBinding extends JpdlBinding {
+
+ public RulesDecisionBinding() {
+ super("rules-decision");
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ return new RulesDecisionActivity();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesFact.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesFact.java
new file mode 100644
index 0000000..077cc7b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/RulesFact.java
@@ -0,0 +1,74 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.io.Serializable;
+
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.pvm.internal.script.ScriptManager;
+
+/**
+ * @author Tom Baeyens
+ */
+public class RulesFact implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String variableName;
+ protected String expression;
+ protected String language;
+
+ public String getVariableName() {
+ return variableName;
+ }
+
+ public void setVariableName(String variableName) {
+ this.variableName = variableName;
+ }
+
+ public String getExpression() {
+ return expression;
+ }
+
+ public void setExpression(String expression) {
+ this.expression = expression;
+ }
+
+ public String getLanguage() {
+ return language;
+ }
+
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+
+ public Object getObject(ActivityExecution execution) {
+ if (variableName!=null) {
+ return execution.getVariable(variableName);
+
+ } else if (expression!=null) {
+ return ScriptManager.getScriptManager().evaluateExpression(expression, language);
+ }
+
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/ScriptActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/ScriptActivity.java
new file mode 100644
index 0000000..67ae1fb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/ScriptActivity.java
@@ -0,0 +1,59 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.api.model.OpenExecution;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.script.ScriptManager;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ScriptActivity extends JpdlAutomaticActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String script;
+ protected String language;
+ protected String variableName;
+
+ public void perform(OpenExecution execution) {
+ ScriptManager scriptManager = EnvironmentImpl.getFromCurrent(ScriptManager.class);
+ Object returnValue = scriptManager.evaluateScript(script, language);
+
+ if (variableName!=null) {
+ execution.setVariable(variableName, returnValue);
+ }
+ }
+
+ public void setScript(String script) {
+ this.script = script;
+ }
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+ public void setVariableName(String variableName) {
+ this.variableName = variableName;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/ScriptBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/ScriptBinding.java
new file mode 100644
index 0000000..54fbbbd
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/ScriptBinding.java
@@ -0,0 +1,69 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.script.ScriptManager;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ScriptBinding extends JpdlBinding {
+
+ private static final String TAG = "script";
+
+ public ScriptBinding() {
+ super(TAG);
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ String language = null;
+
+ String script = XmlUtil.attribute(element, "expr");
+ Element textElement = XmlUtil.element(element, "text");
+ if(script!=null) {
+ ScriptManager scriptManager = EnvironmentImpl.getFromCurrent(ScriptManager.class);
+ language = scriptManager.getDefaultExpressionLanguage();
+ if (textElement!=null) {
+ parse.addProblem("in <script ...> attribute expr can't be combined with a nexted text element", element);
+ }
+ } else {
+ language = XmlUtil.attribute(element, "lang");
+ script = XmlUtil.getContentText(textElement);
+ }
+
+ String variableName = XmlUtil.attribute(element, "var");
+
+ ScriptActivity scriptActivity = new ScriptActivity();
+ scriptActivity.setScript(script);
+ scriptActivity.setLanguage(language);
+ scriptActivity.setVariableName(variableName);
+
+ return scriptActivity;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SqlActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SqlActivity.java
new file mode 100644
index 0000000..dc60ef1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SqlActivity.java
@@ -0,0 +1,37 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+
+/**
+ * @author Tom Baeyens
+ */
+public class SqlActivity extends HqlActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Query createQuery(Session session) {
+ return session.createSQLQuery(query);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SqlBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SqlBinding.java
new file mode 100644
index 0000000..67d6632
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SqlBinding.java
@@ -0,0 +1,39 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class SqlBinding extends HqlBinding {
+
+ public static final String TAG = "sql";
+
+ public SqlBinding() {
+ super(TAG);
+ }
+
+ protected HqlActivity createHqlActivity() {
+ return new SqlActivity();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/StartActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/StartActivity.java
new file mode 100644
index 0000000..16d6b18
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/StartActivity.java
@@ -0,0 +1,46 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.pvm.internal.task.FormBehaviour;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class StartActivity extends JpdlActivity implements FormBehaviour {
+
+ private static final long serialVersionUID = 1L;
+
+ String formResourceName;
+
+ public void execute(ActivityExecution execution) {
+ }
+
+ public String getFormResourceName() {
+ return formResourceName;
+ }
+ public void setFormResourceName(String formResourceName) {
+ this.formResourceName = formResourceName;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/StartBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/StartBinding.java
new file mode 100644
index 0000000..5df40e6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/StartBinding.java
@@ -0,0 +1,62 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.jpdl.internal.model.JpdlProcessDefinition;
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class StartBinding extends JpdlBinding {
+
+ public StartBinding() {
+ super("start");
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ ActivityImpl startActivity = parse.contextStackFind(ActivityImpl.class);
+ JpdlProcessDefinition processDefinition = parse.contextStackFind(JpdlProcessDefinition.class);
+
+ if (processDefinition.getInitial()==null) {
+ processDefinition.setInitial(startActivity);
+
+ } else if (startActivity.getParentActivity()==null) {
+ parse.addProblem("multiple start events not yet supported", element);
+ }
+
+ StartActivity startActivityBehaviour = new StartActivity();
+
+ startActivityBehaviour.setFormResourceName(XmlUtil.attribute(element, "form"));
+
+ return startActivityBehaviour;
+ }
+
+ public boolean isNameRequired() {
+ return false;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/StateActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/StateActivity.java
new file mode 100644
index 0000000..cfe9dfe
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/StateActivity.java
@@ -0,0 +1,78 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.Map;
+
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.Transition;
+
+/**
+ * @author Tom Baeyens
+ */
+public class StateActivity extends JpdlExternalActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ public void execute(ActivityExecution execution) {
+ execute((ExecutionImpl)execution);
+ }
+
+ public void execute(ExecutionImpl execution) {
+ execution.historyActivityStart();
+
+ execution.waitForSignal();
+ }
+
+ public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) throws Exception {
+ signal((ExecutionImpl)execution, signalName, parameters);
+ }
+
+ public void signal(ExecutionImpl execution, String signalName, Map<String, ?> parameters) throws Exception {
+ Activity activity = execution.getActivity();
+
+ if (parameters!=null) {
+ execution.setVariables(parameters);
+ }
+
+ execution.fire(signalName, activity);
+
+ Transition transition = null;
+ if ( (signalName==null)
+ && (activity.getOutgoingTransitions()!=null)
+ && (activity.getOutgoingTransitions().size()==1)
+ ) {
+ transition = activity.getOutgoingTransitions().get(0);
+ } else {
+ transition = activity.findOutgoingTransition(signalName);
+ }
+
+ if (transition!=null) {
+ execution.historyActivityEnd(signalName);
+ execution.take(transition);
+ } else {
+ execution.waitForSignal();
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/StateBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/StateBinding.java
new file mode 100644
index 0000000..d3d339e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/StateBinding.java
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class StateBinding extends JpdlBinding {
+
+ public StateBinding() {
+ super("state");
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ return new StateActivity();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessActivity.java
new file mode 100644
index 0000000..93dd660
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessActivity.java
@@ -0,0 +1,187 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.List;
+import java.util.Map;
+
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.pvm.internal.client.ClientProcessDefinition;
+import org.jbpm.pvm.internal.env.Context;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.env.ExecutionContext;
+import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.script.ScriptManager;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.session.RepositorySession;
+import org.jbpm.pvm.internal.task.SwimlaneImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class SubProcessActivity extends JpdlExternalActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String subProcessKey;
+ protected String subProcessId;
+ protected Map<String, String> swimlaneMappings;
+
+ protected List<SubProcessInParameterImpl> inParameters;
+ protected List<SubProcessOutParameterImpl> outParameters;
+
+ protected String outcomeExpression;
+ protected Map<Object, String> outcomeVariableMappings;
+
+ public void execute(ActivityExecution execution) {
+ ExecutionImpl executionImpl = (ExecutionImpl) execution;
+
+ RepositorySession repositorySession = EnvironmentImpl.getFromCurrent(RepositorySession.class);
+
+ ClientProcessDefinition processDefinition = null;
+
+ if (subProcessId!=null) {
+ processDefinition = repositorySession.findProcessDefinitionById(subProcessId);
+ } else {
+ processDefinition = repositorySession.findProcessDefinitionByKey(subProcessKey);
+ }
+
+ ExecutionImpl subProcessInstance = (ExecutionImpl) processDefinition.createProcessInstance(null, execution);
+
+ for (String swimlaneName: swimlaneMappings.keySet()) {
+ String subSwimlaneName = swimlaneMappings.get(swimlaneName);
+ SwimlaneImpl subSwimlane = subProcessInstance.createSwimlane(subSwimlaneName);
+ SwimlaneImpl swimlane = executionImpl.getSwimlane(swimlaneName);
+ if (swimlane!=null) {
+ subSwimlane.initialize(swimlane);
+ }
+ }
+
+ for (SubProcessInParameterImpl inParameter: inParameters) {
+ inParameter.produce(executionImpl, subProcessInstance);
+ }
+
+ executionImpl.historyActivityStart();
+
+ subProcessInstance.start();
+
+ execution.waitForSignal();
+ }
+
+ public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) throws Exception {
+ signal((ExecutionImpl)execution, signalName, parameters);
+ }
+
+ public void signal(ExecutionImpl execution, String signalName, Map<String, ?> parameters) throws Exception {
+ ExecutionImpl executionImpl = (ExecutionImpl) execution;
+
+ ExecutionImpl subProcessInstance = executionImpl.getSubProcessInstance();
+
+ String transitionName = null;
+
+ ExecutionContext originalExecutionContext = null;
+ ExecutionContext subProcessExecutionContext = null;
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ if (environment!=null) {
+ originalExecutionContext = (ExecutionContext) environment.removeContext(Context.CONTEXTNAME_EXECUTION);
+ subProcessExecutionContext = new ExecutionContext((ExecutionImpl) subProcessInstance);
+ environment.setContext(subProcessExecutionContext);
+ }
+
+ try {
+ subProcessInstance.setSuperProcessExecution(null);
+ executionImpl.setSubProcessInstance(null);
+
+
+ for (SubProcessOutParameterImpl outParameter: outParameters) {
+ outParameter.consume(executionImpl, subProcessInstance);
+ }
+
+ Activity activity = execution.getActivity();
+ String subProcessActivityName = subProcessInstance.getActivityName();
+
+ if (outcomeExpression!=null) {
+ ScriptManager scriptManager = EnvironmentImpl.getFromCurrent(ScriptManager.class);
+ Object value = scriptManager.evaluateExpression(outcomeExpression, null);
+ // if the value is a String and matches the name of an outgoing transition
+ if ( (value instanceof String)
+ && (activity.hasOutgoingTransition(((String) value)))
+ ) {
+ // then take that one
+ transitionName = (String) value;
+ } else {
+ // else see if there is a value mapping
+ transitionName = outcomeVariableMappings.get(value);
+ }
+
+ } else if (activity.hasOutgoingTransition(subProcessActivityName)) {
+ transitionName = subProcessActivityName;
+ }
+
+ } finally {
+ if (subProcessExecutionContext!=null) {
+ environment.removeContext(subProcessExecutionContext);
+ }
+ if (originalExecutionContext!=null) {
+ environment.setContext(originalExecutionContext);
+ }
+ }
+
+ executionImpl.historyActivityEnd();
+
+ if (transitionName!=null) {
+ execution.take(transitionName);
+ } else {
+ execution.takeDefaultTransition();
+ }
+ }
+
+ public void setSwimlaneMappings(Map<String, String> swimlaneMappings) {
+ this.swimlaneMappings = swimlaneMappings;
+ }
+ public void setOutcomeVariableMappings(Map<Object, String> outcomeVariableMappings) {
+ this.outcomeVariableMappings = outcomeVariableMappings;
+ }
+ public void setSubProcessKey(String subProcessKey) {
+ this.subProcessKey = subProcessKey;
+ }
+ public void setSubProcessId(String subProcessId) {
+ this.subProcessId = subProcessId;
+ }
+ public void setOutcomeExpression(String outcomeExpression) {
+ this.outcomeExpression = outcomeExpression;
+ }
+ public List<SubProcessInParameterImpl> getInParameters() {
+ return inParameters;
+ }
+ public void setInParameters(List<SubProcessInParameterImpl> inParameters) {
+ this.inParameters = inParameters;
+ }
+ public List<SubProcessOutParameterImpl> getOutParameters() {
+ return outParameters;
+ }
+ public void setOutParameters(List<SubProcessOutParameterImpl> outParameters) {
+ this.outParameters = outParameters;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessBinding.java
new file mode 100644
index 0000000..14eb21a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessBinding.java
@@ -0,0 +1,164 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class SubProcessBinding extends JpdlBinding {
+
+ public SubProcessBinding() {
+ super("sub-process");
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ SubProcessActivity subProcessActivity = new SubProcessActivity();
+
+ String subProcessKey = XmlUtil.attribute(element, "sub-process-key");
+ subProcessActivity.setSubProcessKey(subProcessKey);
+
+ String subProcessId = XmlUtil.attribute(element, "sub-process-id");
+ subProcessActivity.setSubProcessId(subProcessId);
+
+ List<SubProcessInParameterImpl> inParameters = new ArrayList<SubProcessInParameterImpl>();
+ for (Element inElement: XmlUtil.elements(element, "parameter-in")) {
+ SubProcessInParameterImpl inParameter = new SubProcessInParameterImpl();
+ parseParameter(inElement, inParameter);
+ inParameters.add(inParameter);
+
+ if (inParameter.getSubVariableName()==null) {
+ parse.addProblem("no 'subvar' specified for parameter-in", element);
+ }
+ if ( (inParameter.getExpression()==null)
+ && (inParameter.getVariableName()==null)
+ ) {
+ parse.addProblem("no 'expr' or 'variable' specified for parameter-in '"+inParameter.getSubVariableName()+"'", element);
+ }
+ if ( (inParameter.getExpression()!=null)
+ && (inParameter.getVariableName()!=null)
+ ) {
+ parse.addProblem("attributes 'expr' and 'variable' are mutually exclusive on parameter-in", element);
+ }
+ }
+ subProcessActivity.setInParameters(inParameters);
+
+ List<SubProcessOutParameterImpl> outParameters = new ArrayList<SubProcessOutParameterImpl>();
+ for (Element outElement: XmlUtil.elements(element, "parameter-out")) {
+ SubProcessOutParameterImpl outParameter = new SubProcessOutParameterImpl();
+ parseParameter(outElement, outParameter);
+ outParameters.add(outParameter);
+
+ if (outParameter.getVariableName()==null) {
+ parse.addProblem("no 'variable' specified for parameter-in", element);
+ }
+ if ( (outParameter.getExpression()==null)
+ && (outParameter.getSubVariableName()==null)
+ ) {
+ parse.addProblem("no 'expr' or 'subvar' specified for parameter-out '"+outParameter.getVariableName()+"'", element);
+ }
+ if ( (outParameter.getExpression()!=null)
+ && (outParameter.getSubVariableName()!=null)
+ ) {
+ parse.addProblem("attributes 'expr' and 'subvar' are mutually exclusive on parameter-out '"+outParameter.getVariableName()+"'", element);
+ }
+ }
+ subProcessActivity.setOutParameters(outParameters);
+
+ Map<String, String> swimlaneMappings = parseSwimlaneMappings(element, parse);
+ subProcessActivity.setSwimlaneMappings(swimlaneMappings);
+
+ Map<Object, String> outcomeVariableMappings = new HashMap<Object, String>();
+
+ String outcomeExpression = XmlUtil.attribute(element, "outcome");
+ if (outcomeExpression!=null) {
+ subProcessActivity.setOutcomeExpression(outcomeExpression);
+
+ for (Element transitionElement: XmlUtil.elements(element, "transition")) {
+ Element outcomeValueElement = XmlUtil.element(transitionElement, "outcome-value");
+ if (outcomeValueElement!=null) {
+ String transitionName = XmlUtil.attribute(transitionElement, "name");
+ if (transitionName==null) {
+ parse.addProblem("transitions with an outcome-value must have a name", transitionElement);
+ }
+ Element valueElement = XmlUtil.element(outcomeValueElement);
+ if (valueElement!=null) {
+ Descriptor descriptor = (Descriptor) WireParser.getInstance().parseElement(valueElement, parse);
+ Object value = WireContext.create(descriptor);
+ outcomeVariableMappings.put(value, transitionName);
+ } else {
+ parse.addProblem("outcome-value must contain exactly one element", outcomeValueElement);
+ }
+ }
+ }
+
+ }
+
+ return subProcessActivity;
+ }
+
+ void parseParameter(Element element, SubProcessParameterImpl parameter) {
+ String name = XmlUtil.attribute(element, "subvar");
+ parameter.setSubVariableName(name);
+
+ String expr = XmlUtil.attribute(element, "expr");
+ if (expr!=null) {
+ parameter.setExpression(expr);
+ }
+
+ String language = XmlUtil.attribute(element, "lang");
+ if (language!=null) {
+ parameter.setLanguage(language);
+ }
+
+ String variable = XmlUtil.attribute(element, "var");
+ if (variable!=null) {
+ parameter.setVariableName(variable);
+ }
+ }
+
+ public static Map<String, String> parseSwimlaneMappings(Element element, Parse parse) {
+ Map<String, String> swimlaneMappings = new HashMap<String, String>();
+
+ for (Element inElement: XmlUtil.elements(element, "swimlane-mapping")) {
+ String swimlane = XmlUtil.attribute(inElement, "swimlane", true, parse);
+ String subSwimlane = XmlUtil.attribute(inElement, "sub-swimlane", true, parse);
+
+ swimlaneMappings.put(swimlane, subSwimlane);
+ }
+
+ return swimlaneMappings;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessInParameterImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessInParameterImpl.java
new file mode 100644
index 0000000..409a7d5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessInParameterImpl.java
@@ -0,0 +1,46 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.script.ScriptManager;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class SubProcessInParameterImpl extends SubProcessParameterImpl {
+
+ private static final long serialVersionUID = 1L;
+
+ public void produce(ExecutionImpl superExecution, ExecutionImpl subProcessInstance) {
+ Object value = null;
+ if (variableName!=null) {
+ value = superExecution.getVariable(variableName);
+ } else {
+ ScriptManager scriptManager = ScriptManager.getScriptManager();
+ value = scriptManager.evaluateExpression(expression, language);
+ }
+
+ subProcessInstance.setVariable(subVariableName, value);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessOutParameterImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessOutParameterImpl.java
new file mode 100644
index 0000000..b6b9d0e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessOutParameterImpl.java
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.script.ScriptManager;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class SubProcessOutParameterImpl extends SubProcessParameterImpl {
+
+ private static final long serialVersionUID = 1L;
+
+ public void consume(ExecutionImpl superExecution, ScopeInstanceImpl subProcessInstance) {
+ Object value = null;
+
+ if (variableName!=null) {
+ value = subProcessInstance.getVariable(subVariableName);
+ } else {
+ ScriptManager scriptManager = ScriptManager.getScriptManager();
+ value = scriptManager.evaluateExpression(expression, language);
+ }
+
+ superExecution.setVariable(variableName, value);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessParameterImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessParameterImpl.java
new file mode 100644
index 0000000..3e54df1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/SubProcessParameterImpl.java
@@ -0,0 +1,63 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.io.Serializable;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class SubProcessParameterImpl implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String subVariableName;
+ protected String variableName;
+ protected String expression;
+ protected String language;
+
+ public String getVariableName() {
+ return variableName;
+ }
+ public void setVariableName(String variable) {
+ this.variableName = variable;
+ }
+ public String getExpression() {
+ return expression;
+ }
+ public void setExpression(String expression) {
+ this.expression = expression;
+ }
+ public String getLanguage() {
+ return language;
+ }
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+ public String getSubVariableName() {
+ return subVariableName;
+ }
+ public void setSubVariableName(String name) {
+ this.subVariableName = name;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/TaskActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/TaskActivity.java
new file mode 100644
index 0000000..568de84
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/TaskActivity.java
@@ -0,0 +1,267 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.collections.map.ListOrderedMap;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.ProcessEngine;
+import org.jbpm.api.TaskQuery;
+import org.jbpm.api.activity.ActivityBehaviour;
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.api.model.OpenExecution;
+import org.jbpm.api.task.Assignable;
+import org.jbpm.internal.log.Log;
+import org.jbpm.properties.JBpm4Properties;
+import org.jbpm.pvm.internal.env.EnvironmentFactory;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.events.TaskActivityStart;
+import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.model.TimerDefinitionImpl;
+import org.jbpm.pvm.internal.model.Transition;
+import org.jbpm.pvm.internal.model.TransitionImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.ParticipationImpl;
+import org.jbpm.pvm.internal.task.SwimlaneDefinitionImpl;
+import org.jbpm.pvm.internal.task.SwimlaneImpl;
+import org.jbpm.pvm.internal.task.TaskConstants;
+import org.jbpm.pvm.internal.task.TaskDefinitionImpl;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskActivity extends JpdlExternalActivity {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Log log = Log.getLog(TaskActivity.class.getName());
+
+ protected TaskDefinitionImpl taskDefinition;
+
+ private static String className = JBpm4Properties
+ .getStringProperty("jbpm4.engin.checkTaskUser");
+
+ private static Object newInstance = null;
+ private static Method method = null;
+ public void execute(ActivityExecution execution) throws Exception {
+ execute((ExecutionImpl) execution);
+ }
+
+ public void execute(ExecutionImpl execution) throws Exception {
+ DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class);
+ TaskImpl task = (TaskImpl) dbSession.createTask();
+ task.setTaskDefinition(taskDefinition);
+ task.setExecution(execution);
+ task.setProcessInstance(execution.getProcessInstance());
+ task.setSignalling(true);
+
+ // initialize the name
+ if (taskDefinition.getName() != null) {
+ task.setName(taskDefinition.getName());
+ } else {
+ task.setName(execution.getActivityName());
+ }
+
+ task.setDescription(taskDefinition.getDescription());
+ task.setPriority(taskDefinition.getPriority());
+ task.setFormResourceName(taskDefinition.getFormResourceName());
+
+ // save task so that TaskDbSession.findTaskByExecution works for assign
+ // event listeners
+ dbSession.save(task);
+
+ SwimlaneDefinitionImpl swimlaneDefinition = taskDefinition
+ .getSwimlaneDefinition();
+ if (swimlaneDefinition != null) {
+ SwimlaneImpl swimlane = execution
+ .getInitializedSwimlane(swimlaneDefinition);
+ task.setSwimlane(swimlane);
+
+ // copy the swimlane assignments to the task
+ task.setAssignee(swimlane.getAssignee());
+ for (ParticipationImpl participant : swimlane.getParticipations()) {
+ task.addParticipation(participant.getUserId(),
+ participant.getGroupId(), participant.getType());
+ }
+ }
+ if (className != null && !"".equals(className)) {
+ getInstance();
+ Object invoke = method.invoke(newInstance, execution
+ .getProcessInstance().getId(), task.getName());
+ int index = 0;
+ if(invoke!=null){
+ if (invoke instanceof String[]) {
+ String[] invoke2 = (String[]) invoke;
+ if (invoke2.length == 1) {
+ taskDefinition.setAssigneeExpression(invoke2[0]);
+ } else if (invoke2.length > 1) {
+ for (String user : invoke2) {
+ if (index == 0) {
+ this.taskDefinition.setAssigneeExpression(user);
+ }
+ task.addCandidateUser(user);
+
+ index++;
+ }
+ }
+ }
+ }
+ }
+ execution.initializeAssignments(taskDefinition, task);
+
+ HistoryEvent.fire(new TaskActivityStart(task), execution);
+
+ execution.waitForSignal();
+ }
+
+ private static void getInstance() throws SecurityException, NoSuchMethodException, ClassNotFoundException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException{
+ Class<?> cls = Class.forName(className);
+ getMethod(cls);
+ if(newInstance ==null){
+ newInstance = cls.getConstructor().newInstance();
+ }
+ }
+ private static void getMethod(Class<?> cls) throws SecurityException, NoSuchMethodException{
+ if(method==null){
+ method = cls.getMethod("userList", String.class,
+ String.class);
+ }
+ }
+ public void signal(ActivityExecution execution, String signalName,
+ Map<String, ?> parameters) throws Exception {
+ signal((ExecutionImpl) execution, signalName, parameters);
+ }
+
+ public void signal(ExecutionImpl execution, String signalName,
+ Map<String, ?> parameters) throws Exception {
+ Activity activity = execution.getActivity();
+
+ if (parameters != null) {
+ execution.setVariables(parameters);
+ }
+
+ execution.fire(signalName, activity);
+
+ DbSession taskDbSession = EnvironmentImpl
+ .getFromCurrent(DbSession.class);
+ TaskImpl task = (TaskImpl) taskDbSession.findTaskByExecution(execution);
+ task.setSignalling(false);
+
+ Transition transition = null;
+ List<Transition> outgoingTransitions = activity
+ .getOutgoingTransitions();
+
+ if ((outgoingTransitions != null) && (!outgoingTransitions.isEmpty())) {
+
+ // Lookup the outgoing transition
+
+ boolean noOutcomeSpecified = TaskConstants.NO_TASK_OUTCOME_SPECIFIED
+ .equals(signalName);
+ if (noOutcomeSpecified
+ && activity.findOutgoingTransition(signalName) == null) {
+ // When no specific outcome was specified, the unnamed
+ // transition
+ // is looked up (name is null). If a null outcome was
+ // specifically
+ // used, then the else clause will be used (but the result is
+ // the same)
+ // Note: the second part of the if clause is to avoid the
+ // siutation
+ // where the user would have chosen the same name as the
+ // constant
+ transition = activity.findOutgoingTransition(null);
+ } else {
+ transition = activity.findOutgoingTransition(signalName);
+ }
+
+ // If no transition has been found, we check if we have a special
+ // case
+ // in which we can still deduce the outgoing transition
+
+ if (transition == null) { // no unnamed transition found
+
+ if (signalName == null) {
+
+ // null was explicitely given as outcome
+ throw new JbpmException(
+ "No unnamed transitions were found for the task '"
+ + getTaskDefinition().getName() + "'");
+
+ } else if (noOutcomeSpecified) { // Special case: complete(id)
+
+ if (outgoingTransitions.size() == 1) { // If only 1
+ // transition, take
+ // that one
+ transition = outgoingTransitions.get(0);
+ } else {
+ throw new JbpmException(
+ "No unnamed transitions were found for the task '"
+ + getTaskDefinition().getName() + "'");
+ }
+
+ } else {
+ // Likely a programmatic error.
+ throw new JbpmException("No transition named '"
+ + signalName + "' was found.");
+ }
+
+ }
+
+ if (transition != null) {
+ execution.take(transition);
+ }
+
+ }
+ }
+
+ /**
+ * Checks if the given collection of transitions are all named or not.
+ */
+ private boolean allTransitionsNamed(Collection<Transition> transitions) {
+ for (Transition transition : transitions) {
+ if (transition.getName() == null) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public TaskDefinitionImpl getTaskDefinition() {
+ return taskDefinition;
+ }
+
+ public void setTaskDefinition(TaskDefinitionImpl taskDefinition) {
+ this.taskDefinition = taskDefinition;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/TaskBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/TaskBinding.java
new file mode 100644
index 0000000..f5abf51
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/activity/TaskBinding.java
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.activity;
+
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.model.ScopeElementImpl;
+import org.jbpm.pvm.internal.task.TaskDefinitionImpl;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskBinding extends JpdlBinding {
+
+ private static final String TAG = "task";
+
+ public TaskBinding() {
+ super(TAG);
+ }
+
+ public Object parseJpdl(Element element, Parse parse, JpdlParser parser) {
+ TaskActivity taskActivity = new TaskActivity();
+
+ ScopeElementImpl scopeElement = parse.contextStackFind(ScopeElementImpl.class);
+ TaskDefinitionImpl taskDefinition = parser.parseTaskDefinition(element, parse, scopeElement);
+ taskActivity.setTaskDefinition(taskDefinition);
+
+ return taskActivity;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/model/JpdlProcessDefinition.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/model/JpdlProcessDefinition.java
new file mode 100644
index 0000000..20b66d7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/model/JpdlProcessDefinition.java
@@ -0,0 +1,66 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.model;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.task.SwimlaneDefinitionImpl;
+import org.jbpm.pvm.internal.task.TaskDefinitionImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class JpdlProcessDefinition extends ProcessDefinitionImpl {
+
+ private static final long serialVersionUID = 1L;
+
+ Map<String, SwimlaneDefinitionImpl> swimlaneDefinitions = new HashMap<String, SwimlaneDefinitionImpl>();
+ Map<String, TaskDefinitionImpl> taskDefinitions = new HashMap<String, TaskDefinitionImpl>();
+
+ protected ExecutionImpl newProcessInstance() {
+ return new ExecutionImpl();
+ }
+
+ public SwimlaneDefinitionImpl createSwimlaneDefinition(String name) {
+ SwimlaneDefinitionImpl swimlaneDefinition = new SwimlaneDefinitionImpl();
+ swimlaneDefinition.setName(name);
+ swimlaneDefinitions.put(name, swimlaneDefinition);
+ return swimlaneDefinition;
+ }
+
+ public SwimlaneDefinitionImpl getSwimlaneDefinition(String name) {
+ return swimlaneDefinitions.get(name);
+ }
+
+ public TaskDefinitionImpl createTaskDefinition(String name) {
+ TaskDefinitionImpl taskDefinition = new TaskDefinitionImpl();
+ taskDefinitions.put(name, taskDefinition);
+ return taskDefinition;
+ }
+
+ public Map<String, TaskDefinitionImpl> getTaskDefinitions() {
+ return taskDefinitions;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/repository/JpdlDeployer.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/repository/JpdlDeployer.java
new file mode 100644
index 0000000..914f53a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/repository/JpdlDeployer.java
@@ -0,0 +1,185 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.repository;
+
+import java.io.ByteArrayInputStream;
+import java.io.StringWriter;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.internal.log.Log;
+import org.jbpm.jpdl.internal.xml.JpdlParser;
+import org.jbpm.pvm.internal.repository.DeploymentImpl;
+import org.jbpm.pvm.internal.repository.ProcessDeployer;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * @author Tom Baeyens
+ */
+public class JpdlDeployer extends ProcessDeployer {
+
+ private static Log log = Log.getLog(JpdlDeployer.class.getName());
+ private static Parser parser = new Parser();
+
+ static JpdlParser jpdlParser = new JpdlParser();
+ static final String jpdlExtension = ".jpdl.xml";
+
+ public JpdlDeployer() {
+ super(jpdlExtension, jpdlParser);
+ }
+
+ public void updateResource(DeploymentImpl deployment, String resourceName, byte[] bytes) {
+ if (resourceName.endsWith(".jpdl.xml")) {
+ Document document = parser
+ .createParse()
+ .setInputStream(new ByteArrayInputStream(bytes))
+ .execute()
+ .getDocument();
+ Element documentElement = document.getDocumentElement();
+ String tagName = XmlUtil.getTagLocalName(documentElement);
+
+ if ("process-update".equals(tagName)) {
+ updateJpdlProcessResource(deployment, resourceName, document);
+ return;
+ }
+ }
+
+ super.updateResource(deployment, resourceName, bytes);
+ }
+
+ public void updateJpdlProcessResource(DeploymentImpl deployment, String resourceName, Document updateDocument) {
+ byte[] processBytes = deployment.getBytes(resourceName);
+ Document processDocument = parser
+ .createParse()
+ .setInputStream(new ByteArrayInputStream(processBytes))
+ .execute()
+ .checkErrors("jPDL process update document")
+ .getDocument();
+ Element processElement = processDocument.getDocumentElement();
+
+ Element processUpdateElement = updateDocument.getDocumentElement();
+ Element processUpdateDescriptionElement = XmlUtil.element(processUpdateElement, "description");
+ if (processUpdateDescriptionElement!=null) {
+ Element processDescriptionElement = XmlUtil.element(processElement, "description");
+ if (processDescriptionElement!=null) {
+ processElement.removeChild(processDescriptionElement);
+ }
+ Node clonedDescriptionElement = processUpdateDescriptionElement.cloneNode(true);
+ processDocument.adoptNode(clonedDescriptionElement);
+ processElement.appendChild(clonedDescriptionElement);
+ }
+
+ updateActivities(processDocument, processElement, processUpdateElement);
+
+ try {
+ Transformer transformer = TransformerFactory.newInstance().newTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+ //initialize StreamResult with File object to save to file
+ StreamResult result = new StreamResult(new StringWriter());
+ DOMSource source = new DOMSource(processDocument);
+ transformer.transform(source, result);
+
+ String updatedProcessXml = result.getWriter().toString();
+ log.debug("updated process xml: \n"+updatedProcessXml);
+ byte[] bytes = updatedProcessXml.getBytes();
+ deployment.addResourceFromInputStream(resourceName, new ByteArrayInputStream(bytes));
+ } catch (Exception e) {
+ throw new JbpmException("couldn't serialize updated process dom model", e);
+ }
+ }
+
+ private void updateActivities(Document processDocument, Element activityContainerElement, Element updateContainerElement) {
+ Set<String> activityNames = jpdlParser.getActivityTagNames();
+
+ Map<String, Element> processActivityMap = getActivityMap(activityContainerElement, activityNames);
+ Map<String, Element> updateActivityMap = getActivityMap(updateContainerElement, activityNames);
+
+ for (String activityName: updateActivityMap.keySet()) {
+ Element updateActivity = updateActivityMap.get(activityName);
+ Element processActivity = processActivityMap.get(activityName);
+
+ if (processActivity==null) {
+ throw new JbpmException("unmatching update activity "+activityName);
+ }
+
+ Node clonedUpdateActivity = updateActivity.cloneNode(true);
+ processDocument.adoptNode(clonedUpdateActivity);
+ activityContainerElement.insertBefore(clonedUpdateActivity, processActivity);
+ activityContainerElement.removeChild(processActivity);
+
+// String updateTagName = XmlUtil.getTagLocalName(updateActivity);
+//
+// activityContainerElement.removeChild(processActivity);
+// Element mergedActivityElement = processDocument.createElement(updateTagName);
+//
+// mergeAttributes(mergedActivityElement, processActivity.getAttributes());
+// mergeAttributes(mergedActivityElement, updateActivity.getAttributes());
+//
+// Map<String, List<Element>> processActivityContents = getElementsByTagName(processActivity);
+// Map<String, List<Element>> updateActivityContents = getElementsByTagName(updateActivity);
+//
+// Set<String> allTagNames = new HashSet<String>(processActivityContents.keySet());
+// allTagNames.addAll(updateActivityContents.keySet());
+//
+// for (String tagName: allTagNames) {
+// List<Element> contentElements = processActivityContents.get(tagName);
+// if (contentElements==null) {
+// contentElements = new ArrayList<Element>();
+// }
+// List<Element> updateElements = updateActivityContents.get(tagName);
+// for (int i=0; i<contentElements.size(); i++) {
+// Element contentElement = contentElements.get(i);
+// Element updateElement = (updateElements!=null && updateElements.size()>i ? updateElements.get(i) : null);
+// if (updateElement!=null) {
+// mergeAttributes(contentElement, updateElement.getAttributes());
+// }
+// }
+// }
+ }
+ }
+
+ protected Map<String, Element> getActivityMap(Element containerElement, Set<String> activityNames) {
+ Map<String, Element> activityMap = new HashMap<String, Element>();
+
+ for (Element element: XmlUtil.elements(containerElement)) {
+ String tagName = XmlUtil.getTagLocalName(element);
+ if (activityNames.contains(tagName)) {
+ String activityName = element.getAttribute("name");
+ activityMap.put(activityName, element);
+ }
+ }
+
+ return activityMap;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/rules/ExecutionGlobals.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/rules/ExecutionGlobals.java
new file mode 100644
index 0000000..b679574
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/rules/ExecutionGlobals.java
@@ -0,0 +1,43 @@
+package org.jbpm.jpdl.internal.rules;
+
+import org.drools.runtime.Globals;
+import org.jbpm.api.Execution;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+
+public class ExecutionGlobals implements Globals {
+
+ private static final Log log = Log.getLog(ExecutionGlobals.class.getName());
+
+ ExecutionImpl execution;
+ Outcome outcome = new Outcome();
+
+ public ExecutionGlobals(Execution execution) {
+ this.execution = (ExecutionImpl) execution;
+ }
+
+ public Object get(String variableName) {
+ if ("execution".equals(variableName)) {
+ log.info("returning execution");
+ return execution;
+ }
+ if ("outcome".equals(variableName)) {
+ log.info("returning outcome");
+ return outcome;
+ }
+ Object variableValue = execution.getVariable(variableName);
+ log.info("returning variable "+variableName+": "+variableValue);
+ return variableValue;
+ }
+
+ public void set(String variableName, Object value) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void setDelegate(Globals globals) {
+ throw new UnsupportedOperationException();
+ }
+ public Outcome getOutcome() {
+ return outcome;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/rules/Outcome.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/rules/Outcome.java
new file mode 100644
index 0000000..507374f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/rules/Outcome.java
@@ -0,0 +1,24 @@
+package org.jbpm.jpdl.internal.rules;
+
+import org.jbpm.internal.log.Log;
+
+public class Outcome {
+
+ private static final Log log = Log.getLog(Outcome.class.getName());
+
+ String outcome = null;
+
+ public void set(String outcome) {
+ log.info("outcome is being set to "+outcome);
+ this.outcome = outcome;
+ }
+
+ public boolean isDefined() {
+ return (outcome!=null);
+ }
+
+ public String get() {
+ log.info("outcome "+outcome+" is being fetched");
+ return outcome;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/JpdlBindingsParser.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/JpdlBindingsParser.java
new file mode 100644
index 0000000..c2e4f54
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/JpdlBindingsParser.java
@@ -0,0 +1,79 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.xml;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.util.TagBinding;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.xml.Binding;
+import org.jbpm.pvm.internal.xml.Bindings;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/**
+ * @author Tom Baeyens
+ */
+public class JpdlBindingsParser extends Parser {
+
+ private static final Log log = Log.getLog(JpdlBindingsParser.class.getName());
+
+ public Object parseDocumentElement(Element documentElement, Parse parse) {
+ Bindings bindings = (Bindings) parse.contextMapGet(Parse.CONTEXT_KEY_BINDINGS);
+ parse.setDocumentObject(bindings);
+
+ for (Element bindingElement : XmlUtil.elements(documentElement)) {
+ Binding binding = instantiateBinding(bindingElement, parse);
+ bindings.addBinding(binding);
+ }
+
+ return bindings;
+ }
+
+ protected Binding instantiateBinding(Element bindingElement, Parse parse) {
+ String bindingClassName = XmlUtil.attribute(bindingElement, "binding", true, parse);
+
+ log.trace("adding jpdl binding "+bindingClassName);
+
+ if (bindingClassName!=null) {
+ try {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ Class<?> bindingClass = Class.forName(bindingClassName, true, classLoader);
+ TagBinding binding = (TagBinding) bindingClass.newInstance();
+
+ String tagLocalName = XmlUtil.getTagLocalName(bindingElement);
+ if ("activity".equals(tagLocalName)) {
+ binding.setCategory(JpdlParser.CATEGORY_ACTIVITY);
+ } else if ("eventlistener".equals(tagLocalName)) {
+ binding.setCategory(JpdlParser.CATEGORY_EVENT_LISTENER);
+ } else {
+ parse.addProblem("unrecognized binding tag: "+tagLocalName);
+ }
+
+ return binding;
+ } catch (Exception e) {
+ parse.addProblem("couldn't instantiate activity binding "+bindingClassName, e);
+ }
+ }
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/JpdlDeployerBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/JpdlDeployerBinding.java
new file mode 100644
index 0000000..fe97cae
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/JpdlDeployerBinding.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.xml;
+
+import org.jbpm.jpdl.internal.repository.JpdlDeployer;
+import org.jbpm.pvm.internal.wire.binding.WireDescriptorBinding;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/**
+ * @author Tom Baeyens
+ */
+public class JpdlDeployerBinding extends WireDescriptorBinding {
+
+ public JpdlDeployerBinding() {
+ super("jpdl-deployer");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ return new ObjectDescriptor(JpdlDeployer.class);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/JpdlParser.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/JpdlParser.java
new file mode 100644
index 0000000..3350af7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/JpdlParser.java
@@ -0,0 +1,727 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.xml;
+
+import java.net.URL;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.activity.ActivityBehaviour;
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.api.model.Event;
+import org.jbpm.internal.log.Log;
+import org.jbpm.jpdl.internal.activity.JpdlBinding;
+import org.jbpm.jpdl.internal.activity.MailListener;
+import org.jbpm.jpdl.internal.model.JpdlProcessDefinition;
+import org.jbpm.pvm.internal.email.impl.MailProducerImpl;
+import org.jbpm.pvm.internal.email.impl.MailTemplate;
+import org.jbpm.pvm.internal.email.impl.MailTemplateRegistry;
+import org.jbpm.pvm.internal.email.spi.MailProducer;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.model.ActivityCoordinatesImpl;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.CompositeElementImpl;
+import org.jbpm.pvm.internal.model.Continuation;
+import org.jbpm.pvm.internal.model.EventImpl;
+import org.jbpm.pvm.internal.model.EventListenerReference;
+import org.jbpm.pvm.internal.model.ObservableElementImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.model.ScopeElementImpl;
+import org.jbpm.pvm.internal.model.TimerDefinitionImpl;
+import org.jbpm.pvm.internal.model.TransitionImpl;
+import org.jbpm.pvm.internal.model.VariableDefinitionImpl;
+import org.jbpm.pvm.internal.model.VariableOutDefinitionImpl;
+import org.jbpm.pvm.internal.model.VariableOutDefinitionSet;
+import org.jbpm.pvm.internal.repository.DeploymentImpl;
+import org.jbpm.pvm.internal.task.AssignableDefinitionImpl;
+import org.jbpm.pvm.internal.task.SwimlaneDefinitionImpl;
+import org.jbpm.pvm.internal.task.TaskDefinitionImpl;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.binding.MailTemplateBinding;
+import org.jbpm.pvm.internal.wire.binding.ObjectBinding;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.usercode.UserCodeReference;
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+import org.jbpm.pvm.internal.xml.Bindings;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.jbpm.pvm.internal.xml.ProblemImpl;
+import org.w3c.dom.Element;
+
+/**
+ * @author Tom Baeyens
+ */
+public class JpdlParser extends Parser {
+
+ private static final Log log = Log.getLog(JpdlParser.class.getName());
+
+ public static final String NAMESPACE_JPDL_40 = "http://jbpm.org/4.0/jpdl";
+ public static final String NAMESPACE_JPDL_42 = "http://jbpm.org/4.2/jpdl";
+ public static final String NAMESPACE_JPDL_43 = "http://jbpm.org/4.3/jpdl";
+
+ public static final String CURRENT_VERSION_JBPM = "4.3";
+ public static final String CURRENT_VERSION_NAMESPACE = "http://jbpm.org/"+CURRENT_VERSION_JBPM+"/jpdl";
+ public static final String CURRENT_VERSION_PROCESS_LANGUAGE_ID = "jpdl-"+CURRENT_VERSION_JBPM;
+
+ public static final List<String> SCHEMA_RESOURCES = new ArrayList<String>();
+ static {
+ SCHEMA_RESOURCES.add("jpdl-4.0.xsd");
+ SCHEMA_RESOURCES.add("jpdl-4.2.xsd");
+ SCHEMA_RESOURCES.add("jpdl-4.3.xsd");
+ }
+
+ public static final WireParser wireParser = WireParser.getInstance();
+ public static final ObjectBinding objectBinding = ObjectBinding.INSTANCE;
+
+ // array elements are mutable, even when final
+ // never make a static array public
+ static final String[] DEFAULT_BINDING_RESOURCES = {
+ "jbpm.jpdl.bindings.xml",
+ "jbpm.user.bindings.xml"
+ };
+
+ static JpdlBindingsParser jpdlBindingsParser = new JpdlBindingsParser();
+
+ public static final String CATEGORY_ACTIVITY = "activity";
+ public static final String CATEGORY_EVENT_LISTENER = "eventlistener";
+
+ public JpdlParser() {
+ initialize();
+ parseBindings();
+ setSchemaResources(SCHEMA_RESOURCES);
+ }
+
+ protected void parseBindings() {
+ this.bindings = new Bindings();
+
+ for (String activityResource: DEFAULT_BINDING_RESOURCES) {
+ Enumeration<URL> resourceUrls = getResources(activityResource);
+ if (resourceUrls.hasMoreElements()) {
+ while (resourceUrls.hasMoreElements()) {
+ URL resourceUrl = resourceUrls.nextElement();
+ log.trace("loading jpdl bindings from resource: "+resourceUrl);
+ jpdlBindingsParser.createParse()
+ .setUrl(resourceUrl)
+ .contextMapPut(Parse.CONTEXT_KEY_BINDINGS, bindings)
+ .execute()
+ .checkErrors("jpdl bindings from "+resourceUrl.toString());
+ }
+ } else {
+ log.trace("skipping unavailable jpdl activities resource: "+activityResource);
+ }
+ }
+ }
+
+ protected Enumeration<URL> getResources(String resourceName) {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ Enumeration<URL> resourceUrls;
+ try {
+ resourceUrls = classLoader.getResources(resourceName);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't get resource urls for "+resourceName, e);
+ }
+ return resourceUrls;
+ }
+
+ public Object parseDocumentElement(Element documentElement, Parse parse) {
+ List<ProcessDefinitionImpl> processDefinitions = new ArrayList<ProcessDefinitionImpl>();
+
+ JpdlProcessDefinition processDefinition = instantiateNewJpdlProcessDefinition();
+
+ processDefinitions.add(processDefinition);
+
+ parse.contextStackPush(processDefinition);
+ try {
+ // process attribues
+ String name = XmlUtil.attribute(documentElement, "name", true, parse);
+ processDefinition.setName(name);
+
+ // make the process language version available for bindings
+ // to allow for specific parsing behaviour per version
+
+ // first check if the langid is available as a deployment property
+ DeploymentImpl deployment = (DeploymentImpl) parse.contextMapGet(Parse.CONTEXT_KEY_DEPLOYMENT);
+ if (deployment!=null) {
+ String processLanguageId = deployment.getProcessLanguageId(name);
+ if (processLanguageId==null) {
+ // if it is not available as a deployment property, check if the
+ // jpdlparser attribute specifies a specific jpdl version.
+ // this is the case for certain compatibility tests in our test suite
+ String jpdlParser = XmlUtil.attribute(documentElement, "jpdlparser");
+ if (jpdlParser!=null) {
+ processLanguageId = "jpdl-"+jpdlParser;
+
+ } else {
+ // if none of the above, check if this is a parser test run for a specific verion
+ // specify the jpdltestversion with "mvn -Djpdlparser=jpdl-4.3 clean install"
+ // that way, the whole test suite will be use the specified parser
+ jpdlParser = System.getProperty("jpdlparser");
+ if (jpdlParser!=null) {
+ processLanguageId = "jpdl-"+jpdlParser;
+
+ } else {
+ // if this process has a namespace, then use the namespace
+ // to see what jpdl parser version should be used
+ String namespaceUri = documentElement.getNamespaceURI();
+ if (namespaceUri!=null) {
+ processLanguageId = "jpdl-"+namespaceUri.substring(16, 19);
+
+ } else {
+ // if none of the above, just deploy it as the current library version
+ processLanguageId = CURRENT_VERSION_PROCESS_LANGUAGE_ID;
+ }
+ }
+ }
+ // saving the process language will make sure that
+ // the right parser version is used after an upgrade of jbpm
+ // as the old format xml will still be in the db
+ deployment.setProcessLanguageId(name, processLanguageId);
+ }
+ parse.contextMapPut(Parse.CONTEXT_KEY_PROCESS_LANGUAGE_ID, processLanguageId);
+ }
+
+ String packageName = XmlUtil.attribute(documentElement, "package");
+ processDefinition.setPackageName(packageName);
+
+ Integer version = XmlUtil.attributeInteger(documentElement, "version", false, parse);
+ if (version!=null) {
+ processDefinition.setVersion(version);
+ }
+
+ String key = XmlUtil.attribute(documentElement, "key", false, parse);
+ if (key!=null) {
+ processDefinition.setKey(key);
+ }
+
+ Element descriptionElement = XmlUtil.element(documentElement, "description");
+ if (descriptionElement!=null) {
+ String description = XmlUtil.getContentText(descriptionElement);
+ processDefinition.setDescription(description);
+ }
+
+ UnresolvedTransitions unresolvedTransitions = new UnresolvedTransitions();
+ parse.contextStackPush(unresolvedTransitions);
+
+ // swimlanes
+ List<Element> swimlaneElements = XmlUtil.elements(documentElement, "swimlane");
+ for (Element swimlaneElement: swimlaneElements) {
+ String swimlaneName = XmlUtil.attribute(swimlaneElement, "name", true, parse);
+ if (swimlaneName!=null) {
+ SwimlaneDefinitionImpl swimlaneDefinition =
+ processDefinition.createSwimlaneDefinition(swimlaneName);
+ parseAssignmentAttributes(swimlaneElement, swimlaneDefinition, parse);
+ }
+ }
+
+ // on events
+ parseOnEvents(documentElement, parse, processDefinition);
+
+ // activities
+ parseActivities(documentElement, parse, processDefinition);
+
+ // bind activities to their destinations
+ resolveTransitionDestinations(parse, processDefinition, unresolvedTransitions);
+
+ // process migration information
+ Element migrationElement = XmlUtil.element(documentElement, "migrate-instances");
+ if (migrationElement != null) {
+ MigrationHelper.parseMigrationDescriptor(migrationElement, parse, processDefinition);
+ }
+
+ } finally {
+ parse.contextStackPop();
+ }
+
+ if (processDefinition.getInitial()==null) {
+ parse.addProblem("no start activity in process", documentElement);
+ }
+
+ return processDefinitions;
+ }
+
+ protected JpdlProcessDefinition instantiateNewJpdlProcessDefinition() {
+ return new JpdlProcessDefinition();
+ }
+
+ protected void resolveTransitionDestinations(Parse parse, JpdlProcessDefinition processDefinition, UnresolvedTransitions unresolvedTransitions) {
+ for (UnresolvedTransition unresolvedTransition: unresolvedTransitions.list) {
+ unresolvedTransition.resolve(processDefinition, parse);
+ }
+ }
+
+ public void parseActivities(Element documentElement, Parse parse, CompositeElementImpl compositeElement) {
+ List<Element> elements = XmlUtil.elements(documentElement);
+ for (Element nestedElement : elements) {
+ String tagName = XmlUtil.getTagLocalName(nestedElement);
+ if ("on".equals(tagName)
+ || "timer".equals(tagName)
+ || "swimlane".equals(tagName)
+ || "migrate-instances".equals(tagName)) continue;
+
+ JpdlBinding activityBinding = (JpdlBinding) getBinding(nestedElement, CATEGORY_ACTIVITY);
+ if (activityBinding == null) {
+ log.debug("unrecognized activity: " + tagName);
+ continue;
+ }
+
+ ActivityImpl activity = compositeElement.createActivity();
+ parse.contextStackPush(activity);
+ try {
+ activity.setType(activityBinding.getTagName());
+ activityBinding.parseName(nestedElement, activity, parse);
+ parseTransitions(nestedElement, activity, parse);
+
+ Element descriptionElement = XmlUtil.element(documentElement, "description");
+ if (descriptionElement!=null) {
+ String description = XmlUtil.getContentText(descriptionElement);
+ activity.setDescription(description);
+ }
+
+ String continuationText = XmlUtil.attribute(nestedElement, "continue");
+ if (continuationText!=null) {
+ if ("async".equals(continuationText)) {
+ activity.setContinuation(Continuation.ASYNCHRONOUS);
+ } else if ("exclusive".equals(continuationText)) {
+ activity.setContinuation(Continuation.EXCLUSIVE);
+ }
+ }
+
+ Object parseResult = activityBinding.parse(nestedElement, parse, this);
+ if (parseResult instanceof ActivityBehaviour) {
+ ActivityBehaviour activityBehaviour = (ActivityBehaviour) parseResult;
+ activity.setActivityBehaviour(activityBehaviour);
+ } else {
+ Descriptor activityBehaviourDescriptor = (Descriptor) parseResult;
+ activity.setActivityBehaviourDescriptor(activityBehaviourDescriptor);
+ }
+
+ parseOnEvents(nestedElement, parse, activity);
+
+ String g = XmlUtil.attribute(nestedElement, "g");
+ if (g == null) continue;
+
+ StringTokenizer stringTokenizer = new StringTokenizer(g, ",");
+ ActivityCoordinatesImpl coordinates = null;
+ if (stringTokenizer.countTokens() == 4) {
+ try {
+ int x = Integer.parseInt(stringTokenizer.nextToken());
+ int y = Integer.parseInt(stringTokenizer.nextToken());
+ int width = Integer.parseInt(stringTokenizer.nextToken());
+ int height = Integer.parseInt(stringTokenizer.nextToken());
+ coordinates = new ActivityCoordinatesImpl(x, y, width, height);
+ } catch (NumberFormatException e) {
+ coordinates = null;
+ }
+ }
+ if (coordinates != null) {
+ activity.setCoordinates(coordinates);
+ } else {
+ parse.addProblem("invalid coordinates g=\"" + g + "\" in " + activity, nestedElement);
+ }
+ } finally {
+ parse.contextStackPop();
+ }
+ }
+ }
+
+ public TimerDefinitionImpl parseTimerDefinition(Element timerElement, Parse parse, ScopeElementImpl scopeElement) {
+ TimerDefinitionImpl timerDefinition = scopeElement.createTimerDefinition();
+
+ String duedate = XmlUtil.attribute(timerElement, "duedate");
+ String duedatetime = XmlUtil.attribute(timerElement, "duedatetime");
+
+ if (duedate!=null) {
+ timerDefinition.setDueDateDescription(duedate);
+
+ } else if (duedatetime!=null) {
+ String dueDateTimeFormatText = (String) EnvironmentImpl.getFromCurrent("jbpm.duedatetime.format");
+ if (dueDateTimeFormatText==null) {
+ dueDateTimeFormatText = "HH:mm dd/MM/yyyy";
+ }
+ SimpleDateFormat dateFormat = new SimpleDateFormat(dueDateTimeFormatText);
+ try {
+ Date duedatetimeDate = dateFormat.parse(duedatetime);
+ timerDefinition.setDueDate(duedatetimeDate);
+ } catch (ParseException e) {
+ parse.addProblem("couldn't parse duedatetime "+duedatetime, e);
+ }
+ } else {
+ parse.addProblem("either duedate or duedatetime is required in timer", timerElement);
+ }
+
+ String repeat = XmlUtil.attribute(timerElement, "repeat");
+ timerDefinition.setRepeat(repeat);
+
+ return timerDefinition;
+ }
+
+ public void parseOnEvents(Element element, Parse parse, ScopeElementImpl scopeElement) {
+ // event listeners
+ List<Element> onElements = XmlUtil.elements(element, "on");
+ for (Element onElement: onElements) {
+ String eventName = XmlUtil.attribute(onElement, "event", true, parse);
+ parseOnEvent(onElement, parse, scopeElement, eventName);
+
+ Element timerElement = XmlUtil.element(onElement, "timer");
+ if (timerElement!=null) {
+ TimerDefinitionImpl timerDefinitionImpl = parseTimerDefinition(timerElement, parse, scopeElement);
+ timerDefinitionImpl.setEventName(eventName);
+ }
+ }
+ }
+
+ public void parseOnEvent(Element element, Parse parse, ObservableElementImpl observableElement, String eventName) {
+ if (eventName!=null) {
+ EventImpl event = observableElement.getEvent(eventName);
+ if (event==null) {
+ event = observableElement.createEvent(eventName);
+ }
+
+ String continuationText = XmlUtil.attribute(element, "continue");
+ if (continuationText!=null) {
+ if ("async".equals(continuationText)) {
+ event.setContinuation(Continuation.ASYNCHRONOUS);
+ } else if ("exclusive".equals(continuationText)) {
+ event.setContinuation(Continuation.EXCLUSIVE);
+ }
+ }
+
+ for (Element eventListenerElement: XmlUtil.elements(element)) {
+ JpdlBinding eventBinding = (JpdlBinding) getBinding(eventListenerElement, CATEGORY_EVENT_LISTENER);
+ if (eventBinding!=null) {
+ EventListenerReference eventListenerReference = null;
+ Object parseResult = eventBinding.parse(eventListenerElement, parse, this);
+ if (parseResult instanceof EventListener) {
+ EventListener eventListener = (EventListener) parseResult;
+ eventListenerReference = event.createEventListenerReference(eventListener);
+ } else {
+ Descriptor eventListenerDescriptor = (Descriptor) parseResult;
+ eventListenerReference = event.createEventListenerReference(eventListenerDescriptor);
+ }
+
+ if (XmlUtil.attributeBoolean(eventListenerElement, "propagation", false, parse, false)) {
+ eventListenerReference.setPropagationEnabled(true);
+ }
+
+ continuationText = XmlUtil.attribute(eventListenerElement, "continue");
+ if (continuationText!=null) {
+ if (observableElement instanceof ActivityImpl) {
+ if (observableElement.getName()==null) {
+ parse.addProblem("async continuation on event listener requires activity name", eventListenerElement);
+ }
+ } else if (observableElement instanceof TransitionImpl) {
+ TransitionImpl transition = (TransitionImpl) observableElement;
+ if (transition.getSource().getName()==null) {
+ parse.addProblem("async continuation on event listener requires name in the transition source activity", eventListenerElement);
+ }
+ }
+ if ("async".equals(continuationText)) {
+ eventListenerReference.setContinuation(Continuation.ASYNCHRONOUS);
+ } else if ("exclusive".equals(continuationText)) {
+ eventListenerReference.setContinuation(Continuation.EXCLUSIVE);
+ }
+ }
+
+ } else {
+ String tagName = XmlUtil.getTagLocalName(eventListenerElement);
+ if ( ! ( (observableElement instanceof TransitionImpl)
+ && ( "condition".equals(tagName)
+ || "timer".equals(tagName)
+ )
+ )
+ ) {
+ parse.addProblem("unrecognized event listener: "+tagName, null, ProblemImpl.TYPE_WARNING, eventListenerElement);
+ }
+ }
+ }
+ }
+ }
+
+ public void parseTransitions(Element element, ActivityImpl activity, Parse parse) {
+ List<Element> transitionElements = XmlUtil.elements(element, "transition");
+ UnresolvedTransitions unresolvedTransitions = parse.contextStackFind(UnresolvedTransitions.class);
+ for (Element transitionElement: transitionElements) {
+ String transitionName = XmlUtil.attribute(transitionElement, "name", false, parse);
+
+ Element timerElement = XmlUtil.element(transitionElement, "timer");
+ if (timerElement!=null) {
+ TimerDefinitionImpl timerDefinitionImpl = parseTimerDefinition(timerElement, parse, activity);
+ timerDefinitionImpl.setSignalName(transitionName);
+ }
+
+ TransitionImpl transition = activity.createOutgoingTransition();
+ transition.setName(transitionName);
+
+ unresolvedTransitions.add(transition, transitionElement);
+
+ parseOnEvent(transitionElement, parse, transition, Event.TAKE);
+ }
+ }
+
+ public void parseAssignmentAttributes(Element element, AssignableDefinitionImpl assignableDefinition, Parse parse) {
+ Element descriptionElement = XmlUtil.element(element, "description");
+ if (descriptionElement!=null) {
+ String description = XmlUtil.getContentText(descriptionElement);
+ assignableDefinition.setDescription(description);
+ }
+
+ Element assignmentHandlerElement = XmlUtil.element(element, "assignment-handler");
+ if (assignmentHandlerElement!=null) {
+ UserCodeReference assignmentHandlerReference = parseUserCodeReference(assignmentHandlerElement, parse);
+ assignableDefinition.setAssignmentHandlerReference(assignmentHandlerReference);
+ }
+
+ String assigneeExpression = XmlUtil.attribute(element, "assignee");
+ assignableDefinition.setAssigneeExpression(assigneeExpression);
+
+ String assigneeExpressionLanguage = XmlUtil.attribute(element, "assignee-lang");
+ assignableDefinition.setAssigneeExpressionLanguage(assigneeExpressionLanguage);
+
+ String candidateUsersExpression = XmlUtil.attribute(element, "candidate-users");
+ assignableDefinition.setCandidateUsersExpression(candidateUsersExpression);
+
+ String candidateUsersExpressionLanguage = XmlUtil.attribute(element, "candidate-users-lang");
+ assignableDefinition.setCandidateUsersExpressionLanguage(candidateUsersExpressionLanguage);
+
+ String candidateGroupsExpression = XmlUtil.attribute(element, "candidate-groups");
+ assignableDefinition.setCandidateGroupsExpression(candidateGroupsExpression);
+
+ String candidateGroupsExpressionLanguage = XmlUtil.attribute(element, "candidate-groups-lang");
+ assignableDefinition.setCandidateGroupsExpressionLanguage(candidateGroupsExpressionLanguage);
+ }
+
+ public TaskDefinitionImpl parseTaskDefinition(Element element, Parse parse, ScopeElementImpl scopeElement) {
+ TaskDefinitionImpl taskDefinition = new TaskDefinitionImpl();
+
+ String taskName = XmlUtil.attribute(element, "name");
+ taskDefinition.setName(taskName);
+
+ String form = XmlUtil.attribute(element, "form");
+ taskDefinition.setFormResourceName(form);
+
+ ProcessDefinitionImpl processDefinition = parse.contextStackFind(ProcessDefinitionImpl.class);
+ if (processDefinition.getTaskDefinition(taskName)!=null) {
+ parse.addProblem("duplicate task name "+taskName, element);
+ } else {
+ processDefinition.addTaskDefinitionImpl(taskDefinition);
+ }
+
+ String swimlaneName = XmlUtil.attribute(element, "swimlane");
+ if (swimlaneName!=null) {
+ JpdlProcessDefinition jpdlProcessDefinition = parse.contextStackFind(JpdlProcessDefinition.class);
+ SwimlaneDefinitionImpl swimlaneDefinition = jpdlProcessDefinition.getSwimlaneDefinition(swimlaneName);
+ if (swimlaneDefinition!=null) {
+ taskDefinition.setSwimlaneDefinition(swimlaneDefinition);
+ } else {
+ parse.addProblem("swimlane "+swimlaneName+" not declared", element);
+ }
+ }
+
+ parseAssignmentAttributes(element, taskDefinition, parse);
+
+ // parse notification mail producer
+ Element notificationElement = XmlUtil.element(element, "notification");
+ if (notificationElement != null) {
+ parseMailEvent(notificationElement, parse, scopeElement, Event.ASSIGN);
+ }
+
+ Element reminderElement = XmlUtil.element(element, "reminder");
+ if (reminderElement != null) {
+ parseMailEvent(reminderElement, parse, scopeElement, Event.REMIND);
+ // associate timer to event
+ TimerDefinitionImpl timerDefinition = parseTimerDefinition(reminderElement, parse, scopeElement);
+ timerDefinition.setEventName(Event.REMIND);
+ }
+
+ return taskDefinition;
+ }
+
+ public List<VariableDefinitionImpl> parseVariableDefinitions(Element element, Parse parse, boolean initRequired) {
+ List<VariableDefinitionImpl> variableDefinitions = new ArrayList<VariableDefinitionImpl>();
+
+ for (Element inElement: XmlUtil.elements(element, "variable")) {
+ VariableDefinitionImpl variableDefinition = new VariableDefinitionImpl();
+
+ String name = XmlUtil.attribute(inElement, "name", true, parse);
+ variableDefinition.setName(name);
+
+ int sources = 0;
+
+ String initExpr = XmlUtil.attribute(inElement, "init");
+ if (initExpr!=null) {
+ variableDefinition.setInitExpression(initExpr);
+ sources++;
+ }
+
+ Element valueElement = XmlUtil.element(inElement);
+ if (valueElement!=null) {
+ Descriptor initValueDescriptor = (Descriptor) WireParser.getInstance().parseElement(valueElement, parse);
+ variableDefinition.setInitDescriptor(initValueDescriptor);
+ sources++;
+ }
+
+ if (initRequired && sources==0) {
+ parse.addProblem("no init specified", inElement);
+ }
+ if (sources>1) {
+ parse.addProblem("init attribute and init element are mutually exclusive on element variable", inElement);
+ }
+
+ variableDefinitions.add(variableDefinition);
+ }
+
+ return variableDefinitions;
+ }
+
+ public VariableOutDefinitionSet parseVariableOutDefinitionSet(Element element, Parse parse) {
+ VariableOutDefinitionSet variableOutDefinitionSet = new VariableOutDefinitionSet();
+
+ for (Element inElement: XmlUtil.elements(element, "out-variable")) {
+ VariableOutDefinitionImpl variableOutDefinition = variableOutDefinitionSet.createVariableOutDefinition();
+
+ String name = XmlUtil.attribute(inElement, "name", true, parse);
+ variableOutDefinition.setName(name);
+
+ String expression = XmlUtil.attribute(inElement, "init");
+ if (expression!=null) {
+ variableOutDefinition.setExpression(expression);
+ }
+ }
+
+ return variableOutDefinitionSet;
+ }
+
+ public void parseMailEvent(Element element, Parse parse,
+ ObservableElementImpl observableElement, String eventName) {
+ // obtain assign event
+ EventImpl event = observableElement.getEvent(eventName);
+ if (event == null) {
+ event = observableElement.createEvent(eventName);
+ }
+ // register event listener
+ MailListener eventListener = new MailListener();
+ EventListenerReference eventListenerRef = event.createEventListenerReference(eventListener);
+ // set continuation mode
+ String continuationText = XmlUtil.attribute(element, "continue");
+ if ("async".equals(continuationText)) {
+ eventListenerRef.setContinuation(Continuation.ASYNCHRONOUS);
+ }
+ else if ("exclusive".equals(continuationText)) {
+ eventListenerRef.setContinuation(Continuation.EXCLUSIVE);
+ }
+
+ //https://jira.jboss.org/jira/browse/JBPM-2466
+ String mailTemplateName = eventName;
+ if (Event.ASSIGN.equals(eventName)) {
+ mailTemplateName = "task-notification";
+ } else if (Event.REMIND.equals(eventName)) {
+ mailTemplateName = "task-reminder";
+ }
+
+ // associate mail producer to event listener
+ MailProducer mailProducer = parseMailProducer(element, parse, mailTemplateName);
+ eventListener.setMailProducer(mailProducer);
+ }
+
+ public MailProducer parseMailProducer(Element element, Parse parse, String defaultTemplateName) {
+ // check whether the element is a generic object descriptor
+ if (ObjectBinding.isObjectDescriptor(element)) {
+ // TODO test custom mail producer
+ ObjectDescriptor objectDescriptor = parseObjectDescriptor(element, parse);
+ return (MailProducer) WireContext.create(objectDescriptor);
+ }
+
+ // parse the default producer
+ MailProducerImpl mailProducer = new MailProducerImpl();
+ mailProducer.setTemplate(parseMailTemplate(element, parse, defaultTemplateName));
+ return mailProducer;
+ }
+
+ private MailTemplate parseMailTemplate(Element element, Parse parse,
+ String defaultTemplateName) {
+ if (element.hasAttribute("template")) {
+ // fetch template from configuration
+ return findTemplate(element, parse, element.getAttribute("template"));
+ }
+ if (!XmlUtil.isTextOnly(element)) {
+ // parse inline template
+ return MailTemplateBinding.parseMailTemplate(element, parse);
+ }
+ if (defaultTemplateName != null) {
+ // fetch default template
+ return findTemplate(element, parse, defaultTemplateName);
+ }
+ parse.addProblem("mail template must be referenced in the 'template' attribute "
+ + "or specified inline", element);
+ return null;
+ }
+
+ private MailTemplate findTemplate(Element element, Parse parse, String templateName) {
+ MailTemplateRegistry templateRegistry = EnvironmentImpl.getFromCurrent(MailTemplateRegistry.class);
+ if (templateRegistry != null) {
+ MailTemplate template = templateRegistry.getTemplate(templateName);
+ if (template != null) return template;
+ }
+ parse.addProblem("mail template not found: " + templateName, element);
+ return null;
+ }
+
+ public UserCodeReference parseUserCodeReference(Element element, Parse parse) {
+ UserCodeReference userCodeReference = new UserCodeReference();
+
+ ObjectDescriptor objectDescriptor = parseObjectDescriptor(element, parse);
+ userCodeReference.setDescriptor(objectDescriptor);
+
+ if (objectDescriptor.getExpr()!=null) {
+ // expressions are not cached by default
+ userCodeReference.setCached(false);
+ }
+
+ Boolean isCached = XmlUtil.attributeBoolean(element, "cache", false, parse, null);
+ if (isCached!=null) {
+ userCodeReference.setCached(isCached.booleanValue());
+ }
+
+ return userCodeReference;
+ }
+
+ public ObjectDescriptor parseObjectDescriptor(Element element, Parse parse) {
+ return (ObjectDescriptor) objectBinding.parse(element, parse, wireParser);
+ }
+
+ public Descriptor parseDescriptor(Element element, Parse parse) {
+ return (Descriptor) wireParser.parseElement(element, parse);
+ }
+
+ public Set<String> getActivityTagNames() {
+ return getBindings().getTagNames(CATEGORY_ACTIVITY);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/MigrationHelper.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/MigrationHelper.java
new file mode 100644
index 0000000..b41d00d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/MigrationHelper.java
@@ -0,0 +1,119 @@
+package org.jbpm.jpdl.internal.xml;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.ProcessDefinition;
+import org.jbpm.pvm.internal.migration.AbortMigrationHandler;
+import org.jbpm.pvm.internal.migration.DefaultMigrationHandler;
+import org.jbpm.pvm.internal.migration.MigrationDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+public class MigrationHelper {
+
+ @SuppressWarnings("unchecked")
+ public static void parseMigrationDescriptor(Element migrationElement, Parse parse, ProcessDefinition processDefinition) {
+ Map<ProcessDefinition, MigrationDescriptor> migrations = (Map<ProcessDefinition, MigrationDescriptor>)parse.contextMapGet(Parse.CONTEXT_KEY_MIGRATIONS);
+ if (migrations == null) {
+ migrations = new HashMap<ProcessDefinition, MigrationDescriptor>();
+ parse.contextMapPut(Parse.CONTEXT_KEY_MIGRATIONS, migrations);
+ }
+ MigrationDescriptor migrationDescriptor = new MigrationDescriptor();
+ String action = migrationElement.getAttribute("action");
+ if ("end".equals(action)) {
+ migrationDescriptor.addMigrationHandlerClassName(AbortMigrationHandler.class.getName());
+ }
+ parseMigrationHandlers(migrationElement, migrationDescriptor);
+ if (!"end".equals(action)) {
+ migrationDescriptor.addMigrationHandlerClassName(DefaultMigrationHandler.class.getName());
+ parseActivityMappings(migrationElement, migrationDescriptor);
+ }
+ String versions = migrationElement.getAttribute("versions");
+ if (versions != null && !"".equals(versions)) {
+ addVersionInformation(versions, migrationDescriptor);
+ }
+ migrations.put(processDefinition, migrationDescriptor);
+ }
+
+ private static void addVersionInformation(String versions, MigrationDescriptor migrationDescriptor) {
+ boolean isStartInfoRelative = false;
+ boolean isEndInfoRelative = false;
+ int startValue = -1;
+ int endValue = -1;
+ if ("*".equals(versions)) {
+ migrationDescriptor.setStartVersion(1);
+ migrationDescriptor.setEndVersion(Integer.MAX_VALUE);
+ } else {
+ int separatorIndex = versions.indexOf("..");
+ if (separatorIndex == -1)
+ throw new JbpmException("Wrong version information in migrate-instances descriptor.");
+ String start = versions.substring(0, separatorIndex).trim();
+ int minusIndex = start.indexOf('-');
+ if (minusIndex != -1) {
+ if (!"x".equals(start.substring(0, minusIndex).trim()))
+ throw new JbpmException("Relative version info should be of the form 'x - n'");
+ isStartInfoRelative = true;
+ start = start.substring(minusIndex + 1).trim();
+ }
+ try {
+ startValue = new Integer(start);
+ if (isStartInfoRelative) {
+ migrationDescriptor.setStartOffset(startValue);
+ } else {
+ migrationDescriptor.setStartVersion(startValue);
+ }
+ } catch (NumberFormatException e) {
+ throw new JbpmException("Version information should be numeric.");
+ }
+ String end = versions.substring(separatorIndex + 2).trim();
+ if ("x".equals(end)) return;
+ minusIndex = end.indexOf('-');
+ if (minusIndex != -1) {
+ if (!"x".equals(end.substring(0, minusIndex).trim()))
+ throw new JbpmException("Relative version info should be of the form 'x - n'");
+ isEndInfoRelative = true;
+ end = end.substring(minusIndex + 1).trim();
+ }
+ try {
+ endValue = new Integer(end);
+ if (isEndInfoRelative) {
+ migrationDescriptor.setEndOffset(endValue);
+ } else {
+ migrationDescriptor.setEndVersion(endValue);
+ }
+ } catch (NumberFormatException e) {
+ throw new JbpmException("Version information should be numeric.");
+ }
+ }
+ }
+
+ private static void parseActivityMappings(Element migrationElement, MigrationDescriptor migrationDescriptor) {
+ NodeList activityMappings = migrationElement.getElementsByTagName("activity-mapping");
+ for (int i = 0; i < activityMappings.getLength(); i++) {
+ Node activityMapping = activityMappings.item(i);
+ if (activityMapping instanceof Element) {
+ String oldName = ((Element)activityMapping).getAttribute("old-name");
+ String newName = ((Element)activityMapping).getAttribute("new-name");
+ migrationDescriptor.addMigrationElement(MigrationDescriptor.ACTIVITY_TYPE, oldName, newName);
+ }
+ }
+ }
+
+ private static void parseMigrationHandlers(Element migrationElement, MigrationDescriptor migrationDescriptor) {
+ NodeList migrationHandlers = migrationElement.getElementsByTagName("migration-handler");
+ for (int i = 0; i < migrationHandlers.getLength(); i++) {
+ Node migrationHandler = migrationHandlers.item(i);
+ if (migrationHandler instanceof Element) {
+ String className = ((Element)migrationHandler).getAttribute("class");
+ if (className != null && !"".equals(className)) {
+ migrationDescriptor.addMigrationHandlerClassName(className);
+ }
+ }
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/UnresolvedTransition.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/UnresolvedTransition.java
new file mode 100644
index 0000000..77c4055
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/UnresolvedTransition.java
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.xml;
+
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.model.TransitionImpl;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+public class UnresolvedTransition {
+ TransitionImpl transition;
+ Element transitionElement;
+ public UnresolvedTransition(TransitionImpl transition, Element transitionElement) {
+ this.transition = transition;
+ this.transitionElement = transitionElement;
+ }
+ public void resolve(ProcessDefinitionImpl processDefinition, Parse parse) {
+ String to = XmlUtil.attribute(transitionElement, "to", true, parse);
+ if (to!=null) {
+ ActivityImpl destination = (ActivityImpl) processDefinition.findActivity(to);
+ if (destination!=null) {
+ destination.addIncomingTransition(transition);
+ } else {
+ parse.addProblem(XmlUtil.errorMessageAttribute(transitionElement, "to", to, "doesn't reference an existing activity name"), transitionElement);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/UnresolvedTransitions.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/UnresolvedTransitions.java
new file mode 100644
index 0000000..c9956d2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/jpdl/internal/xml/UnresolvedTransitions.java
@@ -0,0 +1,35 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jpdl.internal.xml;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.pvm.internal.model.TransitionImpl;
+import org.w3c.dom.Element;
+
+public class UnresolvedTransitions {
+ List<UnresolvedTransition> list = new ArrayList<UnresolvedTransition>();
+ public void add(TransitionImpl transition, Element transitionElement) {
+ list.add(new UnresolvedTransition(transition, transitionElement));
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/properties/JBpm4Properties.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/properties/JBpm4Properties.java
new file mode 100644
index 0000000..f0ec1a8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/properties/JBpm4Properties.java
@@ -0,0 +1,79 @@
+package org.jbpm.properties;
+
+import java.io.InputStream;
+import java.util.PropertyResourceBundle;
+import java.util.ResourceBundle;
+import org.apache.log4j.Logger;
+
+public class JBpm4Properties
+{
+ private static String fileName = "/properties/jbpm4.properties";
+ private static ResourceBundle _cfgResourceBundle = null;
+
+ static {
+ try {
+ if (_cfgResourceBundle == null) {
+ InputStream is = JBpm4Properties.class.getResourceAsStream(fileName);
+ if (is != null)
+ {
+ _cfgResourceBundle = new PropertyResourceBundle(is);
+ }
+ }
+ } catch (Exception ee) {
+ ee.printStackTrace();
+ }
+ }
+
+ public static String getStringProperty(String strKey) {
+ return getStrPro(_cfgResourceBundle, strKey);
+ }
+
+ public static String getStringProperty(String strKey, String defaultVal)
+ {
+ return getStrPro(_cfgResourceBundle, strKey, defaultVal);
+ }
+
+ public static int getIntProperty(String strKey)
+ {
+ return getIntPro(_cfgResourceBundle, strKey);
+ }
+
+ public static int getIntProperty(String strKey, int defaultVal)
+ {
+ return getIntPro(_cfgResourceBundle, strKey, defaultVal);
+ }
+
+ private static String getStrPro(ResourceBundle _cfgResourceBundle, String key) {
+ try {
+ return _cfgResourceBundle.getString(key).trim();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }return "";
+ }
+
+ private static String getStrPro(ResourceBundle _cfgResourceBundle, String key, String defaultVal)
+ {
+ try {
+ return _cfgResourceBundle.getString(key).trim();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }return defaultVal;
+ }
+
+ private static int getIntPro(ResourceBundle _cfgResourceBundle, String key)
+ {
+ try {
+ return Integer.valueOf(_cfgResourceBundle.getString(key).trim()).intValue(); } catch (Exception e) {
+ }
+ return -1;
+ }
+
+ private static int getIntPro(ResourceBundle _cfgResourceBundle, String key, int defaultVal)
+ {
+ try {
+ return Integer.valueOf(_cfgResourceBundle.getString(key).trim()).intValue();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }return defaultVal;
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/AntHelper.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/AntHelper.java
new file mode 100644
index 0000000..6382881
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/AntHelper.java
@@ -0,0 +1,59 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.ant;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jbpm.api.Configuration;
+import org.jbpm.api.ProcessEngine;
+import org.jbpm.pvm.internal.processengine.ProcessEngineImpl;
+
+/**
+ * common strategy for jbpm ant tasks to obtain a hibernate SessionFactory.
+ */
+public abstract class AntHelper {
+
+ final static Map<String, ProcessEngine> processEngines = new HashMap<String, ProcessEngine>();
+
+ private static final Log log = LogFactory.getLog(AntHelper.class);
+
+ public static ProcessEngine getProcessEngine(String jbpmCfgXml) {
+ ProcessEngine processEngine = (ProcessEngineImpl) processEngines.get(jbpmCfgXml);
+ if (processEngine == null) {
+ Configuration configuration = new Configuration();
+ if (jbpmCfgXml!=null) {
+ log.debug("using jbpm configuration "+jbpmCfgXml);
+ configuration.setResource(jbpmCfgXml);
+ } else {
+ log.debug("using default jbpm.cfg.xml configuration");
+ }
+
+ processEngine = configuration.buildProcessEngine();
+
+ processEngines.put(jbpmCfgXml, processEngine);
+ }
+ return processEngine;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/JbpmDeployTask.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/JbpmDeployTask.java
new file mode 100644
index 0000000..788e0d8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/JbpmDeployTask.java
@@ -0,0 +1,125 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.ant;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.zip.ZipInputStream;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.taskdefs.MatchingTask;
+import org.apache.tools.ant.types.FileSet;
+import org.jbpm.api.NewDeployment;
+import org.jbpm.api.ProcessEngine;
+import org.jbpm.api.RepositoryService;
+
+/**
+ * ant task for deploying process files and business archives.
+ */
+public class JbpmDeployTask extends MatchingTask {
+
+ String jbpmCfg = null;
+ File file = null;
+ List fileSets = new ArrayList();
+ boolean failOnError = true;
+
+ public void execute() throws BuildException {
+ Thread currentThread = Thread.currentThread();
+ ClassLoader originalClassLoader = currentThread.getContextClassLoader();
+ currentThread.setContextClassLoader(JbpmDeployTask.class.getClassLoader());
+ try {
+ // get the ProcessEngineImpl
+ ProcessEngine processEngine = AntHelper.getProcessEngine(jbpmCfg);
+
+ // if attribute process is set, deploy that process file
+ if (file!=null) {
+ deployFile(processEngine, file);
+ }
+
+ // loop over all files that are specified in the filesets
+ Iterator iter = fileSets.iterator();
+ while (iter.hasNext()) {
+ FileSet fileSet = (FileSet) iter.next();
+ DirectoryScanner dirScanner = fileSet.getDirectoryScanner(getProject());
+ File baseDir = dirScanner.getBasedir();
+ String[] includedFiles = dirScanner.getIncludedFiles();
+ List excludedFiles = Arrays.asList(dirScanner.getExcludedFiles());
+
+ for (int i = 0; i < includedFiles.length; i++) {
+ String fileName = includedFiles[i];
+ if (!excludedFiles.contains(fileName)) {
+ File file = new File(baseDir, fileName);
+ deployFile(processEngine, file);
+ }
+ }
+ }
+
+ } finally {
+ currentThread.setContextClassLoader(originalClassLoader);
+ }
+ }
+
+ protected void deployFile(ProcessEngine processEngine, File processFile) {
+ RepositoryService repositoryService = processEngine.getRepositoryService();
+ NewDeployment deployment = repositoryService.createDeployment();
+ deployment.setName(processFile.getName());
+ deployment.setTimestamp(System.currentTimeMillis());
+
+ if (processFile.getName().endsWith(".xml")) {
+ log("deploying process file "+processFile.getName());
+ deployment.addResourceFromFile(processFile);
+
+ } else if (processFile.getName().endsWith("ar")) {
+ log("deploying business archive "+processFile.getName());
+ try {
+ FileInputStream fileInputStream = new FileInputStream(processFile);
+ ZipInputStream zipInputStream = new ZipInputStream(fileInputStream);
+ deployment.addResourcesFromZipInputStream(zipInputStream);
+ } catch (Exception e) {
+ throw new BuildException("couldn't read business archive "+processFile, e);
+ }
+
+ } else {
+ throw new BuildException("unsupported extension: "+processFile+" Only .xml files and .*ar archives are supported");
+ }
+
+ deployment.deploy();
+ }
+
+ public void addFileset(FileSet fileSet) {
+ this.fileSets.add(fileSet);
+ }
+ public void setJbpmCfg(String jbpmCfg) {
+ this.jbpmCfg = jbpmCfg;
+ }
+ public void setFile(File file) {
+ this.file = file;
+ }
+ public void setFailOnError(boolean failOnError) {
+ this.failOnError = failOnError;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/Launcher.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/Launcher.java
new file mode 100644
index 0000000..29dabea
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/Launcher.java
@@ -0,0 +1,84 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.ant;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+
+public class Launcher extends Thread {
+
+ Task task;
+ String[] command;
+ String endMsg;
+ File dir;
+ Map<String, String> environmentVariables = new HashMap<String, String>();
+
+ public Launcher(Task task, String[] command, String endMsg, String dir) {
+ this.task = task;
+ this.command = command;
+ this.endMsg = endMsg;
+ this.dir = (dir!=null ? new File(dir) : null);
+ }
+
+ public void run() {
+ String logCommand = "";
+ for (String commandPart: command) {
+ logCommand += commandPart+" ";
+ }
+ try {
+ task.log("starting '" + logCommand + "'...");
+ ProcessBuilder processBuilder = new ProcessBuilder(command)
+ .redirectErrorStream(true)
+ .directory(dir);
+
+ if (!environmentVariables.isEmpty()) {
+ processBuilder.environment().putAll(environmentVariables);
+ }
+
+ Process process = processBuilder.start();
+
+ BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+ String line = "";
+ while (line.indexOf(endMsg) == -1) {
+ line = reader.readLine();
+ task.log(line);
+ }
+
+ task.log("'" + command[0] + "' started.");
+ } catch (IOException e) {
+ throw new BuildException("couldn't start '" + logCommand + "'", e);
+ }
+ }
+
+ public void setEnvironmentVariable(String variableName, String value) {
+ environmentVariables.put(variableName, value);
+ }
+
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/StartHsqldbServerTask.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/StartHsqldbServerTask.java
new file mode 100644
index 0000000..4d1a2f7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/StartHsqldbServerTask.java
@@ -0,0 +1,72 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.ant;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+
+
+/**
+ * @author jbarrez
+ */
+public class StartHsqldbServerTask extends Task {
+
+ private static final String END_MESSAGE = "use [Ctrl]+[C] to abort abruptly";
+
+ String configuration = null;
+ String hsqldbServerHome = null;
+
+ public void execute() throws BuildException {
+ try {
+ // get some environment variableInstances
+ String fileSeparator = System.getProperty( "file.separator" );
+ String os = getProject().getProperty( "os.name" ).toLowerCase();
+
+ // build the command string
+ String[] command = null;
+ if ( os.indexOf( "windows" ) != -1 ) {
+ command = new String[] {getHsqldbServerHome() + fileSeparator + "start-hsqldb-server.bat"};
+ } else if ( os.indexOf( "linux" ) != -1 || os.indexOf( "mac" ) != -1) {
+ command = new String[] {getHsqldbServerHome() + fileSeparator + "start-hsqldb-server.sh"};
+ } else {
+ throw new BuildException( "os '" + os + "' not supported in the start-hsqldb-server task." );
+ }
+
+ // launch the command and wait till the END_MESSAGE appears
+ Thread launcher = new Launcher(this, command, END_MESSAGE, getHsqldbServerHome());
+ launcher.start();
+ launcher.join();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public String getHsqldbServerHome() {
+ return hsqldbServerHome;
+ }
+
+ public void setHsqldbServerHome(String hsqldbServerHome) {
+ this.hsqldbServerHome = hsqldbServerHome;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/StartJBossTask.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/StartJBossTask.java
new file mode 100644
index 0000000..3a2a31c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/StartJBossTask.java
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.ant;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+
+public class StartJBossTask extends Task {
+
+ private static final String END_MESSAGE = " Started in ";
+
+ String configuration = null;
+ String jbosshome = null;
+
+ public void execute() throws BuildException {
+ try {
+ // get some environment variableInstances
+ String fileSeparator = System.getProperty( "file.separator" );
+ String os = getProject().getProperty( "os.name" ).toLowerCase();
+
+ // build the command string
+ String[] command = null;
+ if ( os.indexOf( "windows" ) != -1 ) {
+ command = new String[]{getJBossHome() + fileSeparator + "bin" + fileSeparator + "run.bat"};
+ } else if ( os.indexOf( "linux" ) != -1 || os.indexOf( "mac" ) != -1) {
+ command = new String[]{getJBossHome() + fileSeparator + "bin" + fileSeparator + "run.sh"};
+ } else {
+ throw new BuildException( "os '" + os + "' not supported in the startjboss task." );
+ }
+
+ if (configuration!=null) {
+ command = new String[]{command[0], "-c "+configuration};
+ }
+
+
+ // launch the command and wait till the END_MESSAGE appears
+ Thread launcher = new Launcher(this, command, END_MESSAGE, null);
+ launcher.start();
+ launcher.join();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ String getJBossHome() {
+ if (jbosshome!=null) {
+ return jbosshome;
+ }
+ String jbossHomeSysProp = getProject().getProperty( "jboss.home" );
+ if (jbossHomeSysProp!=null) {
+ return jbossHomeSysProp;
+ }
+ throw new BuildException("startjboss couldn't figure out which jboss to start: attribute jbosshome not specified and property jboss.home was not set");
+ }
+
+ public void setConfiguration(String configuration) {
+ this.configuration = configuration;
+ }
+ public void setJbosshome(String jbosshome) {
+ this.jbosshome = jbosshome;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/StartTomcatTask.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/StartTomcatTask.java
new file mode 100644
index 0000000..c15352b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/ant/StartTomcatTask.java
@@ -0,0 +1,79 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.ant;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class StartTomcatTask extends Task {
+
+ private static final String END_MESSAGE = " Server startup in ";
+
+ String configuration = null;
+ String tomcathome = null;
+
+ public void execute() throws BuildException {
+ try {
+ // get some environment variableInstances
+ String fileSeparator = System.getProperty( "file.separator" );
+ String os = getProject().getProperty( "os.name" ).toLowerCase();
+
+ // build the command string
+ String[] command = null;
+ if ( os.indexOf( "windows" ) != -1 ) {
+ command = new String[] {getTomcatHome() + fileSeparator + "bin" + fileSeparator + "catalina.bat", "run"};
+ } else if ( os.indexOf( "linux" ) != -1 || os.indexOf( "mac" ) != -1) {
+ command = new String[] {getTomcatHome() + fileSeparator + "bin" + fileSeparator + "catalina.sh", "run"};
+ } else {
+ throw new BuildException( "os '" + os + "' not supported in the start-tomcat task." );
+ }
+
+ // launch the command and wait till the END_MESSAGE appears
+ Launcher launcher = new Launcher(this, command, END_MESSAGE, null);
+ launcher.setEnvironmentVariable("CATALINA_HOME", getTomcatHome());
+ launcher.start();
+ launcher.join();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ String getTomcatHome() {
+ if (tomcathome!=null) {
+ return tomcathome;
+ }
+ String tomcatHomeSysProp = getProject().getProperty( "tomcat.home" );
+ if (tomcatHomeSysProp!=null) {
+ return tomcatHomeSysProp;
+ }
+ throw new BuildException("start-tomcat couldn't figure out which tomcat to start: attribute tomcathome not specified and property tomcat.home was not set");
+ }
+
+ public void setTomcathome(String tomcathome) {
+ this.tomcathome = tomcathome;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ActivityBehaviourBuilder.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ActivityBehaviourBuilder.java
new file mode 100644
index 0000000..ff8ff94
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ActivityBehaviourBuilder.java
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.builder;
+
+import org.jbpm.pvm.internal.model.ActivityImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ActivityBehaviourBuilder {
+
+ protected ActivityBuilder activityBuilder;
+ protected ActivityImpl activity;
+
+ public ActivityBehaviourBuilder(ActivityBuilder activityBuilder) {
+ this.activityBuilder = activityBuilder;
+ this.activity = activityBuilder.activity;
+ }
+
+ public ActivityBuilder endBehaviour() {
+ return activityBuilder;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ActivityBuilder.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ActivityBuilder.java
new file mode 100644
index 0000000..a98ca0e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ActivityBuilder.java
@@ -0,0 +1,108 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.builder;
+
+import java.lang.reflect.Constructor;
+
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.Continuation;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ActivityBuilder extends CompositeBuilder {
+
+ private static final Class<?>[] ACTIVITYBEHAVIOURBUILDER_PARAMTYPES = new Class<?>[]{ActivityBuilder.class};
+
+ /** the enclosing composite */
+ protected CompositeBuilder compositeBuilder;
+ protected ActivityImpl activity;
+
+ public ActivityBuilder(CompositeBuilder compositeBuilder, String activityName) {
+ this.compositeBuilder = compositeBuilder;
+ this.activity = compositeBuilder.createActivity();
+ this.compositeElement = activity;
+ this.activity.setName(activityName);
+ }
+
+ public ActivityBuilder initial() {
+ setProcessDefinitionInitial(activity);
+ return this;
+ }
+
+ protected void setProcessDefinitionInitial(ActivityImpl initial) {
+ compositeBuilder.setProcessDefinitionInitial(initial);
+ }
+
+ public <T extends ActivityBehaviourBuilder> T startBehaviour(Class<T> activityBehaviourBuilderType) {
+ return startBehaviour(null, activityBehaviourBuilderType);
+ }
+
+ public <T extends ActivityBehaviourBuilder> T startBehaviour(String activityName, Class<T> activityBehaviourBuilderType) {
+ if (activityBehaviourBuilderType==null) {
+ throw new RuntimeException("activityBuilderType is null");
+ }
+ try {
+ Constructor<T> constructor = activityBehaviourBuilderType.getConstructor(ACTIVITYBEHAVIOURBUILDER_PARAMTYPES);
+ T activityBuilder = constructor.newInstance(new Object[]{this});
+ return activityBuilder;
+ } catch (Exception e) {
+ throw new RuntimeException("couldn't instantiate activity behaviour builder type "+activityBehaviourBuilderType.getName(), e);
+ }
+ }
+
+ public CompositeBuilder endActivity() {
+ return compositeBuilder;
+ }
+
+ public FlowBuilder startFlow(String to) {
+ UnresolvedFlow unresolvedFlow = new UnresolvedFlow();
+ unresolvedFlow.transition = activity.createOutgoingTransition();
+ unresolvedFlow.destinationName = to;
+ addUnresolvedFlow(unresolvedFlow);
+ return new FlowBuilder(this, unresolvedFlow.transition);
+ }
+
+ public ProcessDefinitionImpl endProcess() {
+ return compositeBuilder.endProcess();
+ }
+
+ public ActivityBuilder transition(String to) {
+ startFlow(to);
+ return this;
+ }
+
+ public ActivityBuilder transition(String to, String name) {
+ startFlow(to).name(name);
+ return this;
+ }
+
+ public ActivityBuilder asyncExecute() {
+ activity.setContinuation(Continuation.ASYNCHRONOUS);
+ return this;
+ }
+
+ protected void addUnresolvedFlow(UnresolvedFlow unresolvedFlow) {
+ compositeBuilder.addUnresolvedFlow(unresolvedFlow);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/CompositeBuilder.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/CompositeBuilder.java
new file mode 100644
index 0000000..62ef3b4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/CompositeBuilder.java
@@ -0,0 +1,143 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.builder;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.activity.ActivityBehaviour;
+import org.jbpm.pvm.internal.model.CompositeElementImpl;
+import org.jbpm.pvm.internal.model.EventImpl;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.StringDescriptor;
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class CompositeBuilder {
+
+ protected CompositeElementImpl compositeElement;
+
+ public abstract ProcessDefinitionImpl endProcess();
+ protected abstract void addUnresolvedFlow(UnresolvedFlow unresolvedFlow);
+ protected abstract void setProcessDefinitionInitial(ActivityImpl initial);
+
+ protected ActivityImpl createActivity() {
+ return compositeElement.createActivity();
+ }
+
+ public EventImpl createEvent(String eventName) {
+ return compositeElement.createEvent(eventName);
+ }
+
+ public CompositeBuilder variable(String name) {
+ return startVariable(name)
+ .endVariable();
+ }
+
+ public CompositeBuilder variable(String name, String type) {
+ return startVariable(name)
+ .type(type)
+ .endVariable();
+ }
+
+ public TimerBuilder startTimer() {
+ return new TimerBuilder(this, null);
+ }
+
+ public TimerBuilder startTimer(String eventName) {
+ return new TimerBuilder(this, eventName);
+ }
+
+ public VariableBuilder startVariable(String name) {
+ return new VariableBuilder(this)
+ .name(name);
+ }
+
+ public ActivityBuilder startActivity() {
+ return startActivity((String)null);
+ }
+
+ public ActivityBuilder startActivity(String activityName) {
+ return new ActivityBuilder(this, activityName);
+ }
+
+ public ActivityBuilder startActivity(Descriptor activityDescriptor) {
+ return startActivity(null, activityDescriptor);
+ }
+
+ public ActivityBuilder startActivity(String activityName, Descriptor activityDescriptor) {
+ if (activityDescriptor==null) {
+ throw new RuntimeException("activityDescriptor is null");
+ }
+ ActivityBuilder activityBuilder = new ActivityBuilder(this, activityName);
+ activityBuilder.activity.setActivityBehaviourDescriptor(activityDescriptor);
+ return activityBuilder;
+ }
+
+ public ActivityBuilder startActivity(ActivityBehaviour activityBehaviour) {
+ return startActivity(null, activityBehaviour);
+ }
+
+ public ActivityBuilder startActivity(String activityName, ActivityBehaviour activityBehaviour) {
+ if (activityBehaviour==null) {
+ throw new RuntimeException("activity is null");
+ }
+ ActivityBuilder activityBuilder = new ActivityBuilder(this, activityName);
+ activityBuilder.activity.setActivityBehaviour(activityBehaviour);
+ return activityBuilder;
+ }
+
+ public ActivityBuilder startActivity(Class<? extends ActivityBehaviour> activityClass) {
+ return startActivity(null, new ObjectDescriptor(activityClass));
+ }
+
+ public ActivityBuilder startActivity(String activityName, Class<? extends ActivityBehaviour> activityClass) {
+ return startActivity(activityName, new ObjectDescriptor(activityClass));
+ }
+
+ public EventBuilder startEvent(String eventName) {
+ return new EventBuilder(this, eventName);
+ }
+
+ public CompositeExceptionHandlerBuilder startExceptionHandler(Class<? extends Throwable> exceptionType) {
+ return new CompositeExceptionHandlerBuilder(this, exceptionType);
+ }
+
+ public CompositeBuilder property(String name, String value) {
+ return property(new StringDescriptor(name, value));
+ }
+
+ public CompositeBuilder property(Descriptor descriptor) {
+ compositeElement.addProperty(descriptor);
+ return this;
+ }
+
+ public CompositeBuilder endActivity() {
+ throw new JbpmException("calling endActivity on a processBuilder is invalid");
+ }
+
+ public FlowBuilder startFlow(String to) {
+ throw new JbpmException("calling startFlow on a processBuilder is invalid");
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/CompositeExceptionHandlerBuilder.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/CompositeExceptionHandlerBuilder.java
new file mode 100644
index 0000000..75edcbb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/CompositeExceptionHandlerBuilder.java
@@ -0,0 +1,59 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.builder;
+
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CompositeExceptionHandlerBuilder extends ExceptionHandlerBuilder {
+
+ protected CompositeBuilder compositeBuilder;
+
+ public CompositeExceptionHandlerBuilder(CompositeBuilder compositeBuilder, Class<? extends Throwable> exceptionType) {
+ this.compositeBuilder = compositeBuilder;
+ exceptionHandler = compositeBuilder.compositeElement.createExceptionHandler();
+ exceptionClass(exceptionType);
+ }
+
+ public CompositeExceptionHandlerBuilder exceptionClass(Class<? extends Throwable> exceptionType) {
+ super.setExceptionClass(exceptionType);
+ return this;
+ }
+
+ public CompositeExceptionHandlerBuilder listener(EventListener eventListener) {
+ super.addListener(eventListener);
+ return this;
+ }
+
+ public CompositeExceptionHandlerBuilder listener(Descriptor descriptor) {
+ super.addListener(descriptor);
+ return this;
+ }
+
+ public CompositeBuilder endExceptionHandler() {
+ return compositeBuilder;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/EventBuilder.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/EventBuilder.java
new file mode 100644
index 0000000..d2acf2b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/EventBuilder.java
@@ -0,0 +1,74 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.builder;
+
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.descriptor.StringDescriptor;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class EventBuilder extends ObservableBuilder {
+
+ protected CompositeBuilder compositeBuilder;
+
+ public EventBuilder(CompositeBuilder compositeBuilder, String eventName) {
+ super(compositeBuilder.compositeElement, eventName);
+ this.compositeBuilder = compositeBuilder;
+ }
+
+ public EventBuilder listener(EventListener eventListener) {
+ addListener(eventListener);
+ return this;
+ }
+
+ public EventBuilder listener(EventListener eventListener, boolean propagation) {
+ addListener(eventListener, propagation);
+ return this;
+ }
+
+ public EventBuilder listener(Descriptor descriptor) {
+ addListener(descriptor);
+ return this;
+ }
+
+ public EventBuilder listener(Descriptor descriptor, boolean propagation) {
+ addListener(descriptor, propagation);
+ return this;
+ }
+
+ public EventBuilder property(String name, String value) {
+ StringDescriptor descriptor = new StringDescriptor(name, value);
+ getEvent().addProperty(descriptor);
+ return this;
+ }
+
+ public EventExceptionHandlerBuilder startExceptionHandler(Class<? extends Throwable> exceptionType) {
+ return new EventExceptionHandlerBuilder(this, exceptionType);
+ }
+
+ public CompositeBuilder endEvent() {
+ return compositeBuilder;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/EventExceptionHandlerBuilder.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/EventExceptionHandlerBuilder.java
new file mode 100644
index 0000000..9fd4fce
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/EventExceptionHandlerBuilder.java
@@ -0,0 +1,60 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.builder;
+
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class EventExceptionHandlerBuilder extends ExceptionHandlerBuilder {
+
+ protected EventBuilder eventBuilder;
+
+ public EventExceptionHandlerBuilder(EventBuilder eventBuilder, Class<? extends Throwable> exceptionType) {
+ this.eventBuilder = eventBuilder;
+ exceptionHandler = eventBuilder.getEvent().createExceptionHandler();
+ exceptionClass(exceptionType);
+ }
+
+ public EventExceptionHandlerBuilder exceptionClass(Class<? extends Throwable> exceptionType) {
+ super.setExceptionClass(exceptionType);
+ return this;
+ }
+
+ public EventExceptionHandlerBuilder listener(EventListener eventListener) {
+ super.addListener(eventListener);
+ return this;
+ }
+
+ public EventExceptionHandlerBuilder listener(Descriptor descriptor) {
+ super.addListener(descriptor);
+ return this;
+ }
+
+ public EventBuilder endExceptionHandler() {
+ return eventBuilder;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ExceptionHandlerBuilder.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ExceptionHandlerBuilder.java
new file mode 100644
index 0000000..1315191
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ExceptionHandlerBuilder.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.builder;
+
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.pvm.internal.model.ExceptionHandlerImpl;
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ExceptionHandlerBuilder {
+
+ protected ExceptionHandlerImpl exceptionHandler;
+
+ protected void setExceptionClass(Class<? extends Throwable> exceptionType) {
+ exceptionHandler.setExceptionClassName(exceptionType.getName());
+ }
+
+ protected void addListener(EventListener eventListener) {
+ exceptionHandler.createEventListenerReference(eventListener);
+ }
+
+ protected void addListener(Descriptor descriptor) {
+ exceptionHandler.createEventListenerReference(descriptor);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/FlowBuilder.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/FlowBuilder.java
new file mode 100644
index 0000000..38989d8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/FlowBuilder.java
@@ -0,0 +1,84 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.builder;
+
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.api.model.Event;
+import org.jbpm.pvm.internal.model.TransitionImpl;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.descriptor.StringDescriptor;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class FlowBuilder extends ObservableBuilder {
+
+ protected ActivityBuilder activityBuilder;
+ protected TransitionImpl transition;
+
+ public FlowBuilder(ActivityBuilder activityBuilder, TransitionImpl transition) {
+ super(transition, Event.TAKE);
+ this.activityBuilder = activityBuilder;
+ this.transition = transition;
+ }
+
+ public FlowBuilder name(String name) {
+ transition.setName(name);
+ return this;
+ }
+
+ public FlowBuilder expr(String expression) {
+ // transition.setExpression(expression);
+ return this;
+ }
+
+ public FlowBuilder listener(EventListener eventListener) {
+ addListener(eventListener);
+ return this;
+ }
+
+ public FlowBuilder listener(EventListener eventListener, boolean propagation) {
+ addListener(eventListener, propagation);
+ return this;
+ }
+
+ public FlowBuilder listener(Descriptor descriptor) {
+ addListener(descriptor);
+ return this;
+ }
+
+ public FlowBuilder listener(Descriptor descriptor, boolean propagation) {
+ addListener(descriptor, propagation);
+ return this;
+ }
+
+ public FlowBuilder property(String name, String value) {
+ StringDescriptor descriptor = new StringDescriptor(name, value);
+ transition.addProperty(descriptor);
+ return this;
+ }
+
+ public ActivityBuilder endFlow() {
+ return (ActivityBuilder) activityBuilder;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ObservableBuilder.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ObservableBuilder.java
new file mode 100644
index 0000000..277632a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ObservableBuilder.java
@@ -0,0 +1,69 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.builder;
+
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.pvm.internal.model.EventImpl;
+import org.jbpm.pvm.internal.model.EventListenerReference;
+import org.jbpm.pvm.internal.model.ObservableElementImpl;
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ObservableBuilder {
+
+ protected ObservableElementImpl observableElement;
+ protected String eventName;
+ protected EventImpl event = null;
+
+ public ObservableBuilder(ObservableElementImpl observableElement, String eventName) {
+ this.observableElement = observableElement;
+ this.eventName = eventName;
+ }
+
+ protected void addListener(EventListener eventListener) {
+ getEvent().createEventListenerReference(eventListener);
+ }
+
+ protected void addListener(EventListener eventListener, boolean propagation) {
+ EventListenerReference eventListenerReference = getEvent().createEventListenerReference(eventListener);
+ eventListenerReference.setPropagationEnabled(propagation);
+ }
+
+ protected void addListener(Descriptor descriptor) {
+ getEvent().createEventListenerReference(descriptor);
+ }
+
+ protected void addListener(Descriptor descriptor, boolean propagation) {
+ EventListenerReference eventListenerReference = getEvent().createEventListenerReference(descriptor);
+ eventListenerReference.setPropagationEnabled(propagation);
+ }
+
+ protected EventImpl getEvent() {
+ if (event==null) {
+ this.event = observableElement.createEvent(eventName);
+ }
+ return event;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ProcessDefinitionBuilder.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ProcessDefinitionBuilder.java
new file mode 100644
index 0000000..89c027c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/ProcessDefinitionBuilder.java
@@ -0,0 +1,120 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.builder;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ProcessDefinitionBuilder extends CompositeBuilder {
+
+ private static final Log log = Log.getLog(ProcessDefinitionBuilder.class.getName());
+
+ protected ProcessDefinitionImpl processDefinition;
+ protected List<UnresolvedFlow> unresolvedFlows = new ArrayList<UnresolvedFlow>();
+
+ protected ProcessDefinitionBuilder(ProcessDefinitionImpl processDefinition) {
+ this.processDefinition = processDefinition;
+ this.compositeElement = processDefinition;
+ }
+
+ public static ProcessDefinitionBuilder startProcess() {
+ return startProcess(null);
+ }
+
+ public static ProcessDefinitionBuilder startProcess(String processDefinitionName) {
+ return startProcess(processDefinitionName, new ProcessDefinitionImpl());
+ }
+
+ public static ProcessDefinitionBuilder startProcess(String processDefinitionName, ProcessDefinitionImpl processDefinition) {
+ processDefinition.setName(processDefinitionName);
+ return new ProcessDefinitionBuilder(processDefinition);
+ }
+
+ public ProcessDefinitionImpl endProcess() {
+ verifyInitial();
+ resolveFlows();
+ return processDefinition;
+ }
+
+ protected void verifyInitial() {
+ if (processDefinition.getInitial()==null) {
+ errorNoInitial();
+ }
+ }
+
+ protected void resolveFlows() {
+ for (UnresolvedFlow unresolvedFlow: unresolvedFlows) {
+ ActivityImpl destination = (ActivityImpl) processDefinition.findActivity(unresolvedFlow.destinationName);
+ if (destination==null) {
+ errorUnexistingFlowDestination(unresolvedFlow);
+ }
+ destination.addIncomingTransition(unresolvedFlow.transition);
+ }
+ }
+
+ public ProcessDefinitionBuilder key(String key) {
+ processDefinition.setKey(key);
+ return this;
+ }
+
+ public ProcessDefinitionBuilder version(int version) {
+ processDefinition.setVersion(version);
+ return this;
+ }
+
+ public ProcessDefinitionBuilder description(String description) {
+ processDefinition.setDescription(description);
+ return this;
+ }
+
+ protected void addUnresolvedFlow(UnresolvedFlow unresolvedFlow) {
+ unresolvedFlows.add(unresolvedFlow);
+ }
+
+ protected void setProcessDefinitionInitial(ActivityImpl initial) {
+ if (processDefinition.getInitial()!=null) {
+ errorMultipleInitials(initial);
+ }
+ processDefinition.setInitial(initial);
+ }
+
+ protected void errorMultipleInitials(ActivityImpl initial) {
+ log.error("multiple initial activities: "+processDefinition.getInitial()+" and "+initial);
+ }
+
+ protected void errorNoInitial() {
+ log.error("no initial activity");
+ }
+
+ protected void errorUnexistingFlowDestination(UnresolvedFlow unresolvedFlow) {
+ String sourceActivityName = unresolvedFlow.transition.getSource().getName();
+ log.error("unexisting transition destination: "+sourceActivityName+"-->"+unresolvedFlow.destinationName);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/TimerBuilder.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/TimerBuilder.java
new file mode 100644
index 0000000..2dfb354
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/TimerBuilder.java
@@ -0,0 +1,98 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.builder;
+
+import java.util.Date;
+
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.pvm.internal.model.TimerDefinitionImpl;
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+/**
+ * @author Tom Baeyens
+ */
+public class TimerBuilder extends ObservableBuilder {
+
+ protected CompositeBuilder compositeBuilder;
+ protected TimerDefinitionImpl timerDefinition;
+
+ public TimerBuilder(CompositeBuilder compositeBuilder, String eventName) {
+ super(compositeBuilder.compositeElement, eventName);
+ this.compositeBuilder = compositeBuilder;
+
+ timerDefinition = compositeBuilder.compositeElement.createTimerDefinition();
+ }
+
+ public TimerBuilder dueDate(String dueDateCalendarExpression) {
+ timerDefinition.setDueDateDescription(dueDateCalendarExpression);
+ return this;
+ }
+
+ public TimerBuilder dueDate(Date dueDate) {
+ timerDefinition.setDueDate(dueDate);
+ return this;
+ }
+
+ public TimerBuilder repeat(String repeatCalendarExpression) {
+ timerDefinition.setRepeat(repeatCalendarExpression);
+ return this;
+ }
+
+ public TimerBuilder retries(int retries) {
+ timerDefinition.setRetries(retries);
+ return this;
+ }
+
+ public TimerBuilder signal(String signalName) {
+ timerDefinition.setSignalName(signalName);
+ return this;
+ }
+
+ public TimerBuilder decision() {
+ timerDefinition.setExclusive(true);
+ return this;
+ }
+
+ public TimerBuilder listener(EventListener eventListener) {
+ addListener(eventListener);
+ return this;
+ }
+
+ public TimerBuilder listener(EventListener eventListener, boolean propagation) {
+ addListener(eventListener, propagation);
+ return this;
+ }
+
+ public TimerBuilder listener(Descriptor descriptor) {
+ addListener(descriptor);
+ return this;
+ }
+
+ public TimerBuilder listener(Descriptor descriptor, boolean propagation) {
+ addListener(descriptor, propagation);
+ return this;
+ }
+
+ public CompositeBuilder endTimer() {
+ return compositeBuilder;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/UnresolvedFlow.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/UnresolvedFlow.java
new file mode 100644
index 0000000..2dc70fa
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/UnresolvedFlow.java
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.builder;
+
+import org.jbpm.pvm.internal.model.TransitionImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class UnresolvedFlow {
+
+ TransitionImpl transition;
+ String destinationName;
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/VariableBuilder.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/VariableBuilder.java
new file mode 100644
index 0000000..1a0164e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/builder/VariableBuilder.java
@@ -0,0 +1,64 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.builder;
+
+import org.jbpm.pvm.internal.model.VariableDefinitionImpl;
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class VariableBuilder {
+
+ protected CompositeBuilder compositeBuilder;
+ protected VariableDefinitionImpl variableDefinition;
+
+ public VariableBuilder(CompositeBuilder compositeBuilder) {
+ this.compositeBuilder = compositeBuilder;
+ variableDefinition = compositeBuilder.compositeElement.createVariableDefinition();
+ }
+
+ public VariableBuilder name(String name) {
+ variableDefinition.setName(name);
+ return this;
+ }
+
+ public VariableBuilder type(String type) {
+ variableDefinition.setTypeName(type);
+ return this;
+ }
+
+ public VariableBuilder initialValue(Descriptor initialValueDescriptor) {
+ variableDefinition.setInitDescriptor(initialValueDescriptor);
+ return this;
+ }
+
+ public VariableBuilder initialExpression(String initialExpression) {
+ variableDefinition.setInitExpression(initialExpression);
+ return this;
+ }
+
+ public CompositeBuilder endVariable() {
+ return compositeBuilder;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/BusinessCalendar.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/BusinessCalendar.java
new file mode 100644
index 0000000..4e70a2f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/BusinessCalendar.java
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cal;
+
+import java.util.Date;
+
+/**
+ * @author Tom Baeyens
+ */
+public interface BusinessCalendar {
+
+ Date add(Date date, String duration);
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/BusinessCalendarImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/BusinessCalendarImpl.java
new file mode 100644
index 0000000..2d3d0a8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/BusinessCalendarImpl.java
@@ -0,0 +1,277 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cal;
+
+import java.io.Serializable;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+/**
+ * a calendar that knows about business hours.
+ */
+public class BusinessCalendarImpl implements Serializable, BusinessCalendar {
+
+ private static final long serialVersionUID = 1L;
+ private static BusinessCalendarImpl instance = null;
+
+ protected long oid = -1;
+ protected int version = 0;
+ protected TimeZone timeZone = TimeZone.getDefault();
+ /** array that contains the weekdays in the index as specified by {@link Calendar#SUNDAY} (=1),
+ * {@link Calendar#MONDAY} (=2),... {@link Calendar#SATURDAY} (=7).
+ */
+ protected Day[] days = null;
+ protected Holiday[] holidays = null;
+
+ protected long secondInMillis = 1000;
+ protected long minuteInMillis = 60000;
+ protected long hourInMillis = 3600000;
+ protected long dayInMillis = 24*hourInMillis;
+ protected long weekInMillis = 7*dayInMillis;
+ protected long monthInMillis = 30*dayInMillis;
+ protected long yearInMillis = 365*dayInMillis;
+
+ protected long businessDayInMillis = 8*hourInMillis;
+ protected long businessWeekInMillis = 40*hourInMillis;
+ protected long businessMonthInMillis = 21*dayInMillis;
+ protected long businessYearInMillis = 220*dayInMillis;
+
+ /** constructor for persistence and creating an empty business calendar */
+ public BusinessCalendarImpl() {
+ }
+
+ public static synchronized BusinessCalendarImpl getInstance() {
+ if (instance==null) {
+ instance = new BusinessCalendarImpl();
+ }
+ return instance;
+ }
+
+ public Date add(Date date, String duration) {
+ return add(date, new Duration(duration));
+ }
+
+ public Date add(Date date, Duration duration) {
+ Date end = null;
+ if (duration.isBusinessTime()) {
+ DayPart dayPart = findDayPart(date);
+ boolean isInbusinessHours = (dayPart!=null);
+ if (! isInbusinessHours) {
+ Object[] result = new Object[2];
+ findDay(date).findNextDayPartStart(0, date, result);
+ date = (Date) result[0];
+ dayPart = (DayPart) result[1];
+ }
+ long millis = convertToMillis(duration);
+ end = dayPart.add(date, millis, duration.isBusinessTime());
+ } else {
+ long millis = convertToMillis(duration);
+ end = new Date(date.getTime()+millis);
+ }
+ return end;
+ }
+
+ public long convertToMillis(Duration duration){
+ long millis = duration.getMillis();
+ millis += duration.getSeconds() * secondInMillis;
+ millis += duration.getMinutes() * minuteInMillis;
+ millis += duration.getHours() * hourInMillis;
+ if (duration.isBusinessTime()) {
+ millis += duration.getDays() * businessDayInMillis;
+ millis += duration.getWeeks() * businessWeekInMillis;
+ millis += duration.getMonths() * businessMonthInMillis;
+ millis += duration.getYears() * businessYearInMillis;
+ } else {
+ millis += duration.getDays() * dayInMillis;
+ millis += duration.getWeeks() * weekInMillis;
+ millis += duration.getMonths() * monthInMillis;
+ millis += duration.getYears() * yearInMillis;
+ }
+ return millis;
+ }
+
+ public boolean isInBusinessHours(Date date) {
+ return (findDayPart(date)!=null);
+ }
+
+ public boolean isHoliday(Date date) {
+ if (holidays!=null) {
+ for(Holiday holiday: holidays) {
+ if (holiday.includes(date)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ protected Date findStartOfNextDay(Date date) {
+ Calendar calendar = createCalendar();
+ calendar.setTime(date);
+ calendar.add(Calendar.DATE, 1);
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0);
+ date = calendar.getTime();
+ while(isHoliday(date)) {
+ calendar.setTime(date);
+ calendar.add(Calendar.DATE, 1);
+ date = calendar.getTime();
+ }
+ return date;
+ }
+
+ public Calendar createCalendar() {
+ return new GregorianCalendar();
+ }
+
+ protected Day findDay(Date date) {
+ Calendar calendar = createCalendar();
+ calendar.setTime(date);
+ int weekDayIndex = calendar.get(Calendar.DAY_OF_WEEK);
+ return days[weekDayIndex];
+ }
+
+ protected DayPart findDayPart(Date date) {
+ DayPart dayPart = null;
+ if (! isHoliday(date)) {
+ Day day = findDay(date);
+ DayPart[] dayParts = day.getDayParts();
+ if (dayParts!=null) {
+ for (int i=0; ((i < dayParts.length) && (dayPart==null)); i++) {
+ DayPart candidate = dayParts[i];
+ if (candidate.includes(date)) {
+ dayPart = candidate;
+ }
+ }
+ }
+ }
+ return dayPart;
+ }
+
+ protected DayPart findNextDayPart(Date date) {
+ DayPart nextDayPart = null;
+ while(nextDayPart==null) {
+ nextDayPart = findDayPart(date);
+ if (nextDayPart==null) {
+ date = findStartOfNextDay(date);
+ Object result[] = new Object[2];
+ Day day = findDay(date);
+ day.findNextDayPartStart(0, date, result);
+ nextDayPart = (DayPart) result[1];
+ }
+ }
+ return nextDayPart;
+ }
+
+
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public long getBusinessDayInMillis() {
+ return businessDayInMillis;
+ }
+ public void setBusinessDayInMillis(long businessDayInMillis) {
+ this.businessDayInMillis = businessDayInMillis;
+ }
+ public long getBusinessMonthInMillis() {
+ return businessMonthInMillis;
+ }
+ public void setBusinessMonthInMillis(long businessMonthInMillis) {
+ this.businessMonthInMillis = businessMonthInMillis;
+ }
+ public long getBusinessWeekInMillis() {
+ return businessWeekInMillis;
+ }
+ public void setBusinessWeekInMillis(long businessWeekInMillis) {
+ this.businessWeekInMillis = businessWeekInMillis;
+ }
+ public long getBusinessYearInMillis() {
+ return businessYearInMillis;
+ }
+ public void setBusinessYearInMillis(long businessYearInMillis) {
+ this.businessYearInMillis = businessYearInMillis;
+ }
+ public long getDayInMillis() {
+ return dayInMillis;
+ }
+ public void setDayInMillis(long dayInMillis) {
+ this.dayInMillis = dayInMillis;
+ }
+ public Day[] getDays() {
+ return days;
+ }
+ public void setDays(Day[] days) {
+ this.days = days;
+ }
+ public Holiday[] getHolidays() {
+ return holidays;
+ }
+ public void setHolidays(Holiday[] holidays) {
+ this.holidays = holidays;
+ }
+ public long getHourInMillis() {
+ return hourInMillis;
+ }
+ public void setHourInMillis(long hourInMillis) {
+ this.hourInMillis = hourInMillis;
+ }
+ public long getMinuteInMillis() {
+ return minuteInMillis;
+ }
+ public void setMinuteInMillis(long minuteInMillis) {
+ this.minuteInMillis = minuteInMillis;
+ }
+ public long getMonthInMillis() {
+ return monthInMillis;
+ }
+ public void setMonthInMillis(long monthInMillis) {
+ this.monthInMillis = monthInMillis;
+ }
+ public long getSecondInMillis() {
+ return secondInMillis;
+ }
+ public void setSecondInMillis(long secondInMillis) {
+ this.secondInMillis = secondInMillis;
+ }
+ public TimeZone getTimeZone() {
+ return timeZone;
+ }
+ public void setTimeZone(TimeZone timeZone) {
+ this.timeZone = timeZone;
+ }
+ public long getWeekInMillis() {
+ return weekInMillis;
+ }
+ public void setWeekInMillis(long weekInMillis) {
+ this.weekInMillis = weekInMillis;
+ }
+ public long getYearInMillis() {
+ return yearInMillis;
+ }
+ public void setYearInMillis(long yearInMillis) {
+ this.yearInMillis = yearInMillis;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/Day.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/Day.java
new file mode 100644
index 0000000..316d8bb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/Day.java
@@ -0,0 +1,70 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cal;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * is a day on a business calendar.
+ */
+public class Day implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long oid = -1;
+ protected int version = 0;
+ protected DayPart[] dayParts = null;
+ protected BusinessCalendarImpl businessCalendarImpl = null;
+
+ public void findNextDayPartStart(int dayPartIndex, Date date, Object[] result) {
+ // if there is a day part in this day that starts after the given date
+ if ( (dayParts!=null)
+ && (dayPartIndex < dayParts.length)
+ ) {
+ if (dayParts[dayPartIndex].isStartAfter(date)) {
+ result[0] = dayParts[dayPartIndex].getStartTime(date);
+ result[1] = dayParts[dayPartIndex];
+ } else {
+ findNextDayPartStart(dayPartIndex+1, date, result);
+ }
+ } else {
+ // descend recustively
+ date = businessCalendarImpl.findStartOfNextDay(date);
+ Day nextDay = businessCalendarImpl.findDay(date);
+ nextDay.findNextDayPartStart(0, date, result);
+ }
+ }
+
+ public BusinessCalendarImpl getBusinessCalendar() {
+ return businessCalendarImpl;
+ }
+ public DayPart[] getDayParts() {
+ return dayParts;
+ }
+ public void setBusinessCalendar(BusinessCalendarImpl businessCalendarImpl) {
+ this.businessCalendarImpl = businessCalendarImpl;
+ }
+ public void setDayParts(DayPart[] dayParts) {
+ this.dayParts = dayParts;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/DayPart.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/DayPart.java
new file mode 100644
index 0000000..82f6cd9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/DayPart.java
@@ -0,0 +1,152 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cal;
+
+import java.io.Serializable;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * is part of a day that can for example be used to represent business hours.
+ *
+ */
+public class DayPart implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long oid = -1;
+ protected int version = 0;
+ protected int fromHour = -1;
+ protected int fromMinute = -1;
+ protected int toHour = -1;
+ protected int toMinute = -1;
+ protected Day day = null;
+ protected int index = -1;
+
+ public Date add(Date date, long millis, boolean isBusinessTime) {
+ Date end = null;
+
+ BusinessCalendarImpl businessCalendarImpl = day.getBusinessCalendar();
+ Calendar calendar = businessCalendarImpl.createCalendar();
+ calendar.setTime(date);
+ int hour = calendar.get(Calendar.HOUR_OF_DAY);
+ int minute = calendar.get(Calendar.MINUTE);
+
+ long dateMilliseconds = ((hour*60)+minute)*60*1000;
+ long dayPartEndMilleseconds = ((toHour*60)+toMinute)*60*1000;
+ long millisecondsInThisDayPart = dayPartEndMilleseconds - dateMilliseconds;
+
+ if (millis <= millisecondsInThisDayPart) {
+ end = new Date( date.getTime() + millis);
+ } else {
+ long remainderMillis = millis - millisecondsInThisDayPart;
+ Date dayPartEndDate = new Date(date.getTime() + millis - remainderMillis);
+
+ Object[] result = new Object[2];
+ day.findNextDayPartStart(index+1, dayPartEndDate, result);
+ Date nextDayPartStart = (Date) result[0];
+ DayPart nextDayPart = (DayPart) result[1];
+
+ end = nextDayPart.add(nextDayPartStart, remainderMillis, isBusinessTime);
+ }
+
+ return end;
+ }
+
+ public boolean isStartAfter(Date date) {
+ Calendar calendar = day.getBusinessCalendar().createCalendar();
+ calendar.setTime(date);
+ int hour = calendar.get(Calendar.HOUR_OF_DAY);
+ int minute = calendar.get(Calendar.MINUTE);
+
+ return ( (hour<fromHour)
+ || ( (hour==fromHour)
+ && (minute<=fromMinute)
+ )
+ );
+ }
+
+
+ public boolean includes(Date date) {
+ Calendar calendar = day.getBusinessCalendar().createCalendar();
+ calendar.setTime(date);
+ int hour = calendar.get(Calendar.HOUR_OF_DAY);
+ int minute = calendar.get(Calendar.MINUTE);
+
+ return ( ( (fromHour<hour)
+ || ( (fromHour==hour)
+ && (fromMinute<=minute)
+ )
+ ) &&
+ ( (hour<toHour)
+ || ( (hour==toHour)
+ && (minute<=toMinute)
+ )
+ )
+ );
+ }
+
+ public Date getStartTime(Date date) {
+ Calendar calendar = day.getBusinessCalendar().createCalendar();
+ calendar.setTime(date);
+ calendar.set(Calendar.HOUR_OF_DAY, fromHour);
+ calendar.set(Calendar.MINUTE, fromMinute);
+ return calendar.getTime();
+ }
+
+ public Day getDay() {
+ return day;
+ }
+ public void setDay(Day day) {
+ this.day = day;
+ }
+ public int getFromHour() {
+ return fromHour;
+ }
+ public void setFromHour(int fromHour) {
+ this.fromHour = fromHour;
+ }
+ public int getFromMinute() {
+ return fromMinute;
+ }
+ public void setFromMinute(int fromMinute) {
+ this.fromMinute = fromMinute;
+ }
+ public int getIndex() {
+ return index;
+ }
+ public void setIndex(int index) {
+ this.index = index;
+ }
+ public int getToHour() {
+ return toHour;
+ }
+ public void setToHour(int toHour) {
+ this.toHour = toHour;
+ }
+ public int getToMinute() {
+ return toMinute;
+ }
+ public void setToMinute(int toMinute) {
+ this.toMinute = toMinute;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/Duration.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/Duration.java
new file mode 100644
index 0000000..3bd0124
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/Duration.java
@@ -0,0 +1,293 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cal;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.jbpm.api.JbpmException;
+
+/**
+ * represents a time duration.
+ *
+ * <p>With the constructor {link {@link #Duration(String)} you can create a
+ * Duration from a text representation. The syntax is as follows
+ * </p>
+ *
+ * <pre>
+ * duration = part [',' part | 'and' part]*
+ * part = number ['business'] unit
+ * number = (0..9)+
+ * unit = (y|year|years|month|months|w|week|weeks|d|day|days|h|hour|hours|min|minute|minutes|s|sec|second|seconds|milli|millis|millisecond|milliseconds)
+ * </pre>
+ *
+ * <p>Duration is immutable.
+ * </p>
+ */
+public class Duration implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ boolean isBusinessTime;
+ protected int millis;
+ protected int seconds;
+ protected int minutes;
+ protected int hours;
+ protected int days;
+ protected int weeks;
+ protected int months;
+ protected int years;
+
+ /** constructor for persistence. note that this type is to be immutable. */
+ protected Duration() {
+ }
+
+ /** parses the duration from a text
+ *
+ * duration = part [',' part | 'and' part]*
+ * part = number ['business'] unit
+ * number = (0..9)+
+ * unit = (y|year|years|month|months|w|week|weeks|d|day|days|h|hour|hours|min|minute|minutes|s|sec|second|seconds|milli|millis|millisecond|milliseconds)
+ *
+ * @throws JbpmException if the parsing is unsuccessful
+ */
+ public Duration(String text) {
+ if (text==null) throw new JbpmException("text is null");
+
+ for (String part: splitInParts(text)) {
+ parsePart(part);
+ }
+
+ isBusinessTime = text.indexOf("business")!=-1;
+ }
+
+ public Duration(boolean isBusinessTime, int millis, int seconds, int minutes, int hours, int days, int weeks, int months, int years) {
+ this.isBusinessTime = isBusinessTime;
+ this.millis = millis;
+ this.seconds = seconds;
+ this.minutes = minutes;
+ this.hours = hours;
+ this.days = days;
+ this.weeks = weeks;
+ this.months = months;
+ this.years = years;
+ }
+
+ private List<String> splitInParts(String text) {
+ List<String> parts = new ArrayList<String>(2);
+ while (text!=null) {
+ int commaIndex = text.indexOf(',');
+ int andIndex = text.indexOf(" and ");
+ if ( ( (commaIndex==-1)
+ && (andIndex!=-1)
+ )
+ ||
+ ( ( (commaIndex!=-1)
+ && (andIndex!=-1)
+ )
+ && (andIndex<commaIndex)
+ )
+ ) {
+ String part = text.substring(0, andIndex).trim();
+ parts.add(part);
+ text = text.substring(andIndex+5);
+
+ } else if ( ( (commaIndex!=-1)
+ && (andIndex==-1)
+ )
+ ||
+ ( ( (commaIndex!=-1)
+ && (andIndex!=-1)
+ )
+ && (andIndex>commaIndex)
+ )
+ ) {
+ String part = text.substring(0, commaIndex).trim();
+ parts.add(part);
+ text = text.substring(commaIndex+1);
+
+ } else {
+ parts.add(text.trim());
+ text = null;
+ }
+ }
+
+ return parts;
+ }
+
+ private void parsePart(String part) {
+ int spaceIndex = part.indexOf(' ');
+ if (spaceIndex==-1) {
+ throw new JbpmException("couldn't parse duration part "+part);
+ }
+ String quantityText = part.substring(0, spaceIndex).trim();
+ spaceIndex = part.lastIndexOf(' ');
+ String unitText = part.substring(spaceIndex+1).trim().toLowerCase();
+
+ int quantity;
+ try {
+ quantity = Integer.parseInt(quantityText);
+ } catch (NumberFormatException e) {
+ throw new JbpmException("couldn't parse quantity "+quantityText+" in duration text", e);
+ }
+ FieldSetter fieldSetter = fieldSetters.get(unitText);
+ if (fieldSetter==null) {
+ throw new JbpmException("couldn't parse quantity "+quantityText);
+ }
+ fieldSetter.set(this, quantity);
+ }
+
+ private interface FieldSetter {
+ void set(Duration duration, int quantity);
+ }
+ private static class MillisSetter implements FieldSetter {
+ public void set(Duration duration, int quantity) {
+ duration.millis = quantity;
+ }
+ }
+ private static class SecondSetter implements FieldSetter {
+ public void set(Duration duration, int quantity) {
+ duration.seconds = quantity;
+ }
+ }
+ private static class MinuteSetter implements FieldSetter {
+ public void set(Duration duration, int quantity) {
+ duration.minutes = quantity;
+ }
+ }
+ private static class HourSetter implements FieldSetter {
+ public void set(Duration duration, int quantity) {
+ duration.hours = quantity;
+ }
+ }
+ private static class DaySetter implements FieldSetter {
+ public void set(Duration duration, int quantity) {
+ duration.days = quantity;
+ }
+ }
+ private static class WeekSetter implements FieldSetter {
+ public void set(Duration duration, int quantity) {
+ duration.weeks = quantity;
+ }
+ }
+ private static class MonthSetter implements FieldSetter {
+ public void set(Duration duration, int quantity) {
+ duration.months = quantity;
+ }
+ }
+ private static class YearSetter implements FieldSetter {
+ public void set(Duration duration, int quantity) {
+ duration.years = quantity;
+ }
+ }
+
+ private static final Map<String, FieldSetter> fieldSetters = new HashMap<String, FieldSetter>();
+ static {
+ FieldSetter fieldSetter = new MillisSetter();
+ fieldSetters.put("milli", fieldSetter);
+ fieldSetters.put("millis", fieldSetter);
+ fieldSetters.put("millisecond", fieldSetter);
+ fieldSetters.put("milliseconds", fieldSetter);
+
+ fieldSetter = new SecondSetter();
+ fieldSetters.put("s", fieldSetter);
+ fieldSetters.put("sec", fieldSetter);
+ fieldSetters.put("second", fieldSetter);
+ fieldSetters.put("seconds", fieldSetter);
+
+ fieldSetter = new MinuteSetter();
+ fieldSetters.put("min", fieldSetter);
+ fieldSetters.put("minute", fieldSetter);
+ fieldSetters.put("minutes", fieldSetter);
+
+ fieldSetter = new HourSetter();
+ fieldSetters.put("h", fieldSetter);
+ fieldSetters.put("hour", fieldSetter);
+ fieldSetters.put("hours", fieldSetter);
+
+ fieldSetter = new DaySetter();
+ fieldSetters.put("d", fieldSetter);
+ fieldSetters.put("day", fieldSetter);
+ fieldSetters.put("days", fieldSetter);
+
+ fieldSetter = new WeekSetter();
+ fieldSetters.put("w", fieldSetter);
+ fieldSetters.put("week", fieldSetter);
+ fieldSetters.put("weeks", fieldSetter);
+
+ fieldSetter = new MonthSetter();
+ fieldSetters.put("month", fieldSetter);
+ fieldSetters.put("months", fieldSetter);
+
+ fieldSetter = new YearSetter();
+ fieldSetters.put("y", fieldSetter);
+ fieldSetters.put("year", fieldSetter);
+ fieldSetters.put("years", fieldSetter);
+ }
+
+ public int getDays() {
+ return days;
+ }
+
+
+ public int getHours() {
+ return hours;
+ }
+
+
+ public boolean isBusinessTime() {
+ return isBusinessTime;
+ }
+
+
+ public int getMillis() {
+ return millis;
+ }
+
+
+ public int getMinutes() {
+ return minutes;
+ }
+
+
+ public int getMonths() {
+ return months;
+ }
+
+
+ public int getSeconds() {
+ return seconds;
+ }
+
+
+ public int getWeeks() {
+ return weeks;
+ }
+
+
+ public int getYears() {
+ return years;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/Holiday.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/Holiday.java
new file mode 100644
index 0000000..23baa44
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/Holiday.java
@@ -0,0 +1,106 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cal;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * identifies a continuous set of days.
+ */
+public class Holiday implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long oid = -1;
+ protected int version = 0;
+ protected Date fromDay = null;
+ protected Date toDay = null;
+ protected BusinessCalendarImpl businessCalendarImpl = null;
+
+ /*
+ public static List parseHolidays(Properties calendarProperties, BusinessCalendar businessCalendar) {
+ List holidays = new ArrayList();
+
+ DateFormat dateFormat = new SimpleDateFormat(calendarProperties.getProperty("day.format"));
+ Iterator iter = calendarProperties.keySet().iterator();
+ while (iter.hasNext()) {
+ String key = (String) iter.next();
+ if (key.startsWith("holiday")) {
+ Holiday holiday = new Holiday(calendarProperties.getProperty(key), dateFormat, businessCalendar);
+ holidays.add(holiday);
+ }
+ }
+
+ return holidays;
+ }
+
+ public Holiday(String holidayText, DateFormat dateFormat, BusinessCalendar businessCalendar) {
+ this.businessCalendar = businessCalendar;
+ try {
+ int separatorIndex = holidayText.indexOf('-');
+ if (separatorIndex==-1) {
+ fromDay = dateFormat.parse(holidayText.trim());
+ toDay = fromDay;
+ } else {
+ String fromText = holidayText.substring(0, separatorIndex).trim();
+ String toText = holidayText.substring(separatorIndex+1).trim();
+ fromDay = dateFormat.parse(fromText);
+ toDay = dateFormat.parse(toText);
+ }
+ // now we are going to set the toDay to the end of the day, rather then the beginning.
+ // we take the start of the next day as the end of the toDay.
+ Calendar calendar = businessCalendar.createCalendar();
+ calendar.setTime(toDay);
+ calendar.add(Calendar.DATE, 1);
+ toDay = calendar.getTime();
+
+ } catch (ParseException e) {
+ throw new PvmException("couldn't parse holiday '"+holidayText+"'", e);
+ }
+ }
+ */
+
+ public boolean includes(Date date) {
+ return ( (fromDay.getTime()<=date.getTime())
+ && (date.getTime()<toDay.getTime())
+ );
+ }
+ public BusinessCalendarImpl getBusinessCalendar() {
+ return businessCalendarImpl;
+ }
+ public void setBusinessCalendar(BusinessCalendarImpl businessCalendarImpl) {
+ this.businessCalendarImpl = businessCalendarImpl;
+ }
+ public Date getFromDay() {
+ return fromDay;
+ }
+ public void setFromDay(Date fromDay) {
+ this.fromDay = fromDay;
+ }
+ public Date getToDay() {
+ return toDay;
+ }
+ public void setToDay(Date toDay) {
+ this.toDay = toDay;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/package.html
new file mode 100644
index 0000000..2e4bf06
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cal/package.html
@@ -0,0 +1,3 @@
+<body>
+a business calendar that knows about business hours.
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cfg/ConfigurationImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cfg/ConfigurationImpl.java
new file mode 100644
index 0000000..555054b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cfg/ConfigurationImpl.java
@@ -0,0 +1,200 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cfg;
+
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.jbpm.api.Configuration;
+import org.jbpm.api.ProcessEngine;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.Context;
+import org.jbpm.pvm.internal.processengine.ProcessEngineImpl;
+import org.jbpm.pvm.internal.stream.FileStreamInput;
+import org.jbpm.pvm.internal.stream.InputStreamInput;
+import org.jbpm.pvm.internal.stream.ResourceStreamInput;
+import org.jbpm.pvm.internal.stream.StreamInput;
+import org.jbpm.pvm.internal.stream.StringStreamInput;
+import org.jbpm.pvm.internal.stream.UrlStreamInput;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.descriptor.ProvidedObjectDescriptor;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ConfigurationImpl extends Configuration {
+
+ public static final String DEFAULT_CONFIG_RESOURCENAME = "jbpm.cfg.xml";
+
+ private static Log log = Log.getLog(ConfigurationImpl.class.getName());
+
+ transient protected boolean isConfigured = false;
+ transient String jndiName;
+ transient boolean checkDb = true;
+ transient boolean isSpringEnabled = false;
+ // type is Object because we don't want a dependency on spring in this class
+ transient Object applicationContext = null;
+ transient WireContext processEngineWireContext = new WireContext(new WireDefinition(), Context.CONTEXTNAME_PROCESS_ENGINE, true);
+ transient WireDefinition transactionWireDefinition = new WireDefinition();
+ transient ProcessEngine producedProcessEngine;
+
+ public ConfigurationImpl() {
+ // to prevent a loop in the constructors, we need to delegate to a non-default constructor in Configuration
+ super(null);
+ }
+
+ @Override
+ public ProcessEngine buildProcessEngine() {
+ if (!isConfigured) {
+ setResource(DEFAULT_CONFIG_RESOURCENAME);
+ }
+ if (jndiName!=null) {
+ try {
+ InitialContext initialContext = new InitialContext();
+ ProcessEngineImpl existing = (ProcessEngineImpl) initialContext.lookup(jndiName);
+ if (existing!=null) {
+ log.debug("found existing process engine under "+jndiName);
+ return existing;
+ }
+ } catch (NamingException e) {
+ log.debug("jndi name "+jndiName+" is not bound");
+ }
+ }
+
+ if (isSpringEnabled) {
+// return SpringProcessEngine.create(this);
+ }
+ return new ProcessEngineImpl(this);
+ }
+
+ /**
+ * This method is called at the end of the buildProcessEngine() operation.
+ * Subclasses should override this method for custom ProcessEngine instantiation.
+ */
+ protected ProcessEngine instantiateProcessEngine() {
+ return new ProcessEngineImpl(this);
+ }
+
+ public ConfigurationImpl setHibernateSessionFactory(Object hibernateSessionFactory) {
+ processEngineWireContext
+ .getWireDefinition()
+ .addDescriptor(new ProvidedObjectDescriptor(hibernateSessionFactory, true));
+ return this;
+ }
+
+ public ConfigurationImpl setInputStream(InputStream inputStream) {
+ parse(new InputStreamInput(inputStream));
+ return this;
+ }
+
+ public ConfigurationImpl setResource(String resource) {
+ parse(new ResourceStreamInput(resource, getClassLoader()));
+ return this;
+ }
+
+ public ConfigurationImpl setUrl(URL url) {
+ parse(new UrlStreamInput(url));
+ return this;
+ }
+
+ public ConfigurationImpl setFile(File file) {
+ parse(new FileStreamInput(file));
+ return this;
+ }
+
+ public ConfigurationImpl setXmlString(String xmlString) {
+ parse(new StringStreamInput(xmlString));
+ return this;
+ }
+
+ protected void parse(StreamInput streamSource) {
+ isConfigured = true;
+ ConfigurationParser.getInstance()
+ .createParse()
+ .contextStackPush(this)
+ .setStreamSource(streamSource)
+ .execute()
+ .checkErrors("jbpm configuration " + streamSource);
+ }
+
+ // fluent setters ///////////////////////////////////////////////////////////
+
+ public ConfigurationImpl skipDbCheck() {
+ checkDb = false;
+ return this;
+ }
+
+ public ConfigurationImpl jndiName(String jndiName) {
+ this.jndiName = jndiName;
+ return this;
+ }
+
+ public ConfigurationImpl springInitiated(Object applicationContext) {
+ this.isSpringEnabled = true;
+ this.applicationContext = applicationContext;
+ return this;
+ }
+
+ public ConfigurationImpl springEnabled() {
+ this.isSpringEnabled = true;
+ return this;
+ }
+
+ public ConfigurationImpl jndi(String jndiName) {
+ this.jndiName = jndiName;
+ return this;
+ }
+
+ public boolean isInstantiatedFromSpring() {
+ return (applicationContext!=null);
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public WireContext getProcessEngineWireContext() {
+ return processEngineWireContext;
+ }
+ public WireDefinition getTransactionWireDefinition() {
+ return transactionWireDefinition;
+ }
+ public String getJndiName() {
+ return jndiName;
+ }
+ public boolean isCheckDb() {
+ return checkDb;
+ }
+ public ProcessEngine getProducedProcessEngine() {
+ return producedProcessEngine;
+ }
+ public void setProducedProcessEngine(ProcessEngineImpl processEngine) {
+ this.producedProcessEngine = processEngine;
+ }
+ public Object getApplicationContext() {
+ return applicationContext;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cfg/ConfigurationParser.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cfg/ConfigurationParser.java
new file mode 100644
index 0000000..2fbaed8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cfg/ConfigurationParser.java
@@ -0,0 +1,135 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cfg;
+
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/** parses the <code>jbpm-configuration</code>, which is assumed the document element
+ * and can contain the {@link EnvironmentFactoryXmlParser process-engine}
+ * context and the {@link EnvironmentXmlParser environment} context.
+ *
+ * See {@link Parser} for usage instructions.
+ *
+ * @author Tom Baeyens
+ */
+public class ConfigurationParser extends Parser {
+
+ private static final long serialVersionUID = 1L;
+
+ // private static Log log = Log.getLog(JbpmConfigurationParser.class.getName());
+
+ Parser processEngineContextParser = new WireParser();
+ Parser transactionContextParser = new WireParser();
+
+ protected static ConfigurationParser INSTANCE = new ConfigurationParser();
+
+ public static ConfigurationParser getInstance() {
+ return INSTANCE;
+ }
+
+ public Object parseDocument(Document document, Parse parse) {
+ Element documentElement = document.getDocumentElement();
+
+ // if the default environment factory was already set in the parse
+ ConfigurationImpl configuration = parse.contextStackFind(ConfigurationImpl.class);
+
+ // this code will be called for the original jbpm.cfg.xml document as
+ // well as for the imported documents. only one of those can specify
+ // a spring-cfg. for sure no 2 config files can specify different jndi-names
+ String spring = XmlUtil.attribute(documentElement, "spring");
+ if ("enabled".equals(spring)) {
+ configuration.springEnabled();
+ }
+
+ // this code will be called for the original jbpm.cfg.xml document as
+ // well as for the imported documents. only one of those can specify
+ // a jndi-name. for sure no 2 config files can specify different jndi-names
+ String jndiName = XmlUtil.attribute(documentElement, "jndi-name");
+ if (jndiName!=null) {
+ if ( (configuration.getJndiName()!=null)
+ && (!jndiName.equals(configuration.getJndiName()))
+ ) {
+ parse.addProblem("duplicate jndi name specification: "+jndiName+" != "+configuration.getJndiName());
+ } else {
+ configuration.jndi(jndiName);
+ }
+ }
+
+ for (Element importElement : XmlUtil.elements(documentElement, "import")) {
+ if (importElement.hasAttribute("resource")) {
+ String resource = importElement.getAttribute("resource");
+ Parse importParse = createParse()
+ .setResource(resource)
+ .contextStackPush(configuration)
+ .propagateContexMap(parse)
+ .execute();
+
+ parse.addProblems(importParse.getProblems());
+ }
+ }
+
+ Element processEngineElement = XmlUtil.element(documentElement, "process-engine-context");
+ if (processEngineElement != null) {
+ WireDefinition processEngineContextDefinition = configuration.getProcessEngineWireContext().getWireDefinition();
+ parse.contextStackPush(processEngineContextDefinition);
+ try {
+ processEngineContextParser.parseDocumentElement(processEngineElement, parse);
+ } finally {
+ parse.contextStackPop();
+ }
+ }
+
+ Element txCtxElement = XmlUtil.element(documentElement, "transaction-context");
+ if (txCtxElement != null) {
+ WireDefinition transactionContextDefinition = configuration.getTransactionWireDefinition();
+ parse.contextStackPush(transactionContextDefinition);
+ try {
+ transactionContextParser.parseDocumentElement(txCtxElement, parse);
+ } finally {
+ parse.contextStackPop();
+ }
+ }
+
+ parse.setDocumentObject(configuration);
+
+ return configuration;
+ }
+
+ public Parser getProcessEngineContextParser() {
+ return processEngineContextParser;
+ }
+ public void setProcessEngineContextParser(Parser applicationWireXmlParser) {
+ this.processEngineContextParser = applicationWireXmlParser;
+ }
+ public Parser getTransactionContextParser() {
+ return transactionContextParser;
+ }
+ public void setTransactionContextParser(Parser blockWireXmlParser) {
+ this.transactionContextParser = blockWireXmlParser;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/client/ClientExecution.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/client/ClientExecution.java
new file mode 100644
index 0000000..7b65de6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/client/ClientExecution.java
@@ -0,0 +1,186 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.client;
+
+import java.util.Map;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.activity.ActivityBehaviour;
+import org.jbpm.api.activity.ExternalActivityBehaviour;
+import org.jbpm.api.model.OpenExecution;
+
+/** view upon an {@link Execution path of execution} exposed to
+ * external clients.
+ *
+ * @author Tom Baeyens
+ */
+public interface ClientExecution extends OpenExecution {
+
+ // ending an execution //////////////////////////////////////////////////////
+
+ /** ends this execution and all of its child executions.
+ *
+ * <p>All child executions will be ended and removed. This execution
+ * will not be removed from its parent.</p>
+ *
+ * <p>This method should not be called in {@link ActivityBehaviour}s. It can be called from
+ * outside the process execution and in {@link ExternalActivityBehaviour}s. </p> */
+ void end();
+
+ /** ends this execution and all it's child executions with a user defined
+ * status. */
+ void end(String state);
+
+ // signal ///////////////////////////////////////////////////////////////////
+
+ /** feeds a external trigger into this execution.
+ *
+ * <p>Typically a signal causes the execution to proceed, but that doesn't necessarily
+ * has to be the case . The {@link ExternalActivityBehaviour} is responsible for interpreting
+ * the signal and acting upon it.
+ * </p>
+ *
+ * <p>A signal can optionally be given {@link #signal(String) a signal name},
+ * {@link #signal(Map) a map of parameters} or {@link #signal(String, Map) both}.
+ * </p>
+ *
+ * <p>Since it's an external trigger, this method requires that this execution is
+ * waiting for an external trigger. So this method must be called as an external client
+ * and can not be called while this execution is executing. In an {@link ActivityBehaviour} for
+ * example you're not allowed to call the signal on the execution cause it is executing.
+ * But you are allowed to invoke this method on any other execution (at least, if that
+ * one is waiting for an external trigger).</p>
+ *
+ * <p>Typically a signal will cause the execution to start executing, but that is
+ * not a must. What happens with this signal is defined in the
+ * {@link ExternalActivityBehaviour#signal(Execution, String, Map)} of
+ * the current activity. </p>
+ *
+ * @see #signal(String) */
+ void signal();
+
+ /** feeds a named {@link #signal() external trigger} into the execution.
+ *
+ * <p>In each state, a number of things can happen. The signal parameter specifies
+ * which of these things is happening. It's somewhat similar to a method name in
+ * the invocation of an object.
+ * </p>
+ *
+ * @see #signal() See the unnamed signal for more information
+ */
+ void signal(String signalName);
+
+ /** feeds {@link #signal() an external trigger} into the execution with parameters.
+ *
+ * @see #signal() See the unnamed signal for more information
+ */
+ void signal(Map<String, ?> parameters);
+
+ /** feeds a named {@link #signal() external trigger} into the execution with parameters.
+ *
+ * <p>In each state, a number of things can happen. The signal parameter specifies
+ * which of these things is happening. It's somewhat similar to a method name in
+ * the invocation of an object.
+ * </p>
+ *
+ * <p>The parameters parameter provide extra information to the signal.
+ * Typically, the parameters are set as variables but
+ * the process language can overwrite that behaviour in the current activity.
+ * See {@link ExternalActivityBehaviour#signal(Execution, String, Map)} for more information.
+ * </p>
+ *
+ * @see #signal() See the unnamed signal for more information
+ */
+ void signal(String signalName, Map<String, ?> parameters);
+
+ /** feeds a external trigger into the given execution.
+ *
+ * <p>Typically a signal causes the execution to proceed, but that doesn't necessarily
+ * has to be the case . The {@link ExternalActivityBehaviour} is responsible for interpreting
+ * the signal and acting upon it.
+ * </p>
+ *
+ * <p>A signal can optionally be given {@link #signal(String) a signal name},
+ * {@link #signal(Map) a map of parameters} or {@link #signal(String, Map) both}.
+ * </p>
+ *
+ * <p>Since it's an external trigger, this method requires that this execution is
+ * waiting for an external trigger. So this method must be called as an external client
+ * and can not be called while this execution is executing. In an {@link ActivityBehaviour} for
+ * example you're not allowed to call the signal on the execution cause it is executing.
+ * But you are allowed to invoke this method on any other execution (at least, if that
+ * one is waiting for an external trigger).</p>
+ *
+ * <p>Typically a signal will cause the execution to start executing, but that is
+ * not a must. What happens with this signal is defined in the
+ * {@link ExternalActivityBehaviour#signal(Execution, String, Map)} of
+ * the current activity. </p>
+ *
+ * @see #signal(String) */
+ void signal(Execution execution);
+
+ /** feeds a named {@link #signal() external trigger} into a given execution.
+ *
+ * <p>In each state, a number of things can happen. The signal parameter specifies
+ * which of these things is happening. It's somewhat similar to a method name in
+ * the invocation of an object.
+ * </p>
+ *
+ * @see #signal() See the unnamed signal for more information
+ */
+ void signal(String signalName, Execution execution);
+
+ /** feeds {@link #signal() an external trigger} into a given execution with parameters.
+ *
+ * @see #signal() See the unnamed signal for more information
+ */
+ void signal(Map<String, ?> parameters, Execution execution);
+
+ /** feeds a named {@link #signal() external trigger} into a given execution with parameters.
+ *
+ * <p>In each state, a number of things can happen. The signal parameter specifies
+ * which of these things is happening. It's somewhat similar to a method name in
+ * the invocation of an object.
+ * </p>
+ *
+ * <p>The parameters parameter provide extra information to the signal.
+ * Typically, the parameters are set as variables but
+ * the process language can overwrite that behaviour in the current activity.
+ * See {@link ExternalActivityBehaviour#signal(Execution, String, Map)} for more information.
+ * </p>
+ *
+ * @see #signal() See the unnamed signal for more information
+ */
+ void signal(String signalName, Map<String, ?> parameters, Execution execution);
+
+
+ /** suspends this execution and all it's child executions. Human tasks
+ * of a suspended execution shouldn't show up in people's task list and
+ * timers of suspended executions shouldn't fire.
+ * @throws JbpmException if this execution is already suspended. */
+ void suspend();
+
+ /** resumes an execution. Inverse of {@link #suspend()}.
+ * @throws JbpmException if this execution is not suspended. */
+ void resume();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/client/ClientProcessDefinition.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/client/ClientProcessDefinition.java
new file mode 100644
index 0000000..6016ff2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/client/ClientProcessDefinition.java
@@ -0,0 +1,68 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.client;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.model.OpenExecution;
+import org.jbpm.pvm.internal.model.OpenProcessDefinition;
+
+
+/** adds factory methods for creating and beginning new process instances.
+ *
+ * @author Tom Baeyens
+ */
+public interface ClientProcessDefinition extends OpenProcessDefinition {
+
+ /** creates a new process instances. The returned process instance
+ * is not started yet. This way,
+ * {@link OpenExecution#setVariable(String, Object) variables can be set}
+ * before execution is started. Invoke {@link ClientProcessInstance#start()}
+ * to start execution of the process. */
+ ClientProcessInstance createProcessInstance();
+
+ /** creates a new process instances with a given key. The returned process instance
+ * is not started yet. This way,
+ * {@link OpenExecution#setVariable(String, Object) variables can be set}
+ * before execution is started. Invoke {@link ClientProcessInstance#start()}
+ * to start execution of the process.
+ * @param key is a user provided reference that uniquely identifies this
+ * process instance in the scope of the process name. */
+ ClientProcessInstance createProcessInstance(String key);
+
+ /** creates a new process instances with a given key. The returned process instance
+ * is not started yet. This way,
+ * {@link OpenExecution#setVariable(String, Object) variables can be set}
+ * before execution is started. Invoke {@link ClientProcessInstance#start()}
+ * to start execution of the process.
+ * @param key is a user provided reference that uniquely identifies this
+ * process instance in the scope of the process name. key is allowed to be null.*/
+ ClientProcessInstance createProcessInstance(String key, Execution superProcessExecution);
+
+ /** creates the process instance and immediately start its execution. */
+ ClientProcessInstance startProcessInstance();
+
+ /** creates the process instance with the given key and immediately start its
+ * execution.
+ * @param key is a user provided reference that uniquely identifies this
+ * process instance in the scope of the process name. */
+ ClientExecution startProcessInstance(String key);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/client/ClientProcessInstance.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/client/ClientProcessInstance.java
new file mode 100644
index 0000000..76ff5da
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/client/ClientProcessInstance.java
@@ -0,0 +1,37 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.client;
+
+import org.jbpm.api.model.OpenProcessInstance;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface ClientProcessInstance extends ClientExecution, OpenProcessInstance {
+
+ // start ////////////////////////////////////////////////////////////////////
+
+ /** starts this process instance */
+ void start();
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AbstractCommand.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AbstractCommand.java
new file mode 100644
index 0000000..2a7ef22
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AbstractCommand.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Command;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class AbstractCommand<T> implements Command<T> {
+
+ private static final long serialVersionUID = 1L;
+
+ String authenticatedUserId;
+
+
+ public String getAuthenticatedUserId() {
+ return authenticatedUserId;
+ }
+
+ public void setAuthenticatedUserId(String authenticatedUserId) {
+ this.authenticatedUserId = authenticatedUserId;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AddParticipationCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AddParticipationCmd.java
new file mode 100644
index 0000000..c17aac3
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AddParticipationCmd.java
@@ -0,0 +1,75 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.hibernate.Session;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class AddParticipationCmd extends AbstractCommand<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String taskId;
+ protected String swimlaneId;
+ protected String userId;
+ protected String groupId;
+ protected String type;
+
+ public AddParticipationCmd(String taskId, String swimlaneId, String userId, String groupId, String type) {
+ this.taskId = taskId;
+ this.swimlaneId = swimlaneId;
+ this.userId = userId;
+ this.groupId = groupId;
+ this.type = type;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ Session session = environment.get(Session.class);
+
+ if (taskId!=null) {
+ TaskImpl task = (TaskImpl) session.get(TaskImpl.class, Long.parseLong(taskId));
+ if (task==null) {
+ throw new JbpmException("task "+taskId+" was not found");
+ }
+
+ task.addParticipation(userId, groupId, type);
+ }
+
+ /*
+ if (swimlaneDbid!=null) {
+ SwimlaneImpl swimlane = (TaskImpl) session.get(SwimlaneImpl.class, swimlaneDbid);
+ if (swimlane==null) {
+ throw new JbpmException("swimlane "+swimlaneDbid+" was not found");
+ }
+
+ swimlane.addRole(identityType, identityId, roleName);
+ }
+ */
+
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AddReplyCommentCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AddReplyCommentCmd.java
new file mode 100644
index 0000000..981f2fc
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AddReplyCommentCmd.java
@@ -0,0 +1,58 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.history.HistoryComment;
+import org.jbpm.pvm.internal.history.model.HistoryCommentImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class AddReplyCommentCmd extends AbstractCommand<HistoryComment> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String commentId;
+ protected String message;
+
+ public AddReplyCommentCmd(String commentId, String message) {
+ if (commentId==null) {
+ throw new JbpmException("commentId is null");
+ }
+ this.commentId = commentId;
+ this.message = message;
+ }
+
+ public HistoryComment execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+ HistoryCommentImpl parentComment = dbSession.get(HistoryCommentImpl.class, Long.parseLong(commentId));
+ if (parentComment==null) {
+ throw new JbpmException("parent comment doesn't exist: "+commentId);
+ }
+ HistoryComment replyComment = parentComment.createReply(message);
+ return replyComment;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AddTaskCommentCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AddTaskCommentCmd.java
new file mode 100644
index 0000000..ed0cb7f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AddTaskCommentCmd.java
@@ -0,0 +1,58 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.history.HistoryComment;
+import org.jbpm.pvm.internal.history.model.HistoryCommentImpl;
+import org.jbpm.pvm.internal.history.model.HistoryTaskImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class AddTaskCommentCmd extends AbstractCommand<HistoryComment> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Long taskDbid;
+ protected String message;
+
+ public AddTaskCommentCmd(String taskId, String message) {
+ this.taskDbid = Long.parseLong(taskId);
+ this.message = message;
+ }
+
+ public HistoryComment execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+ HistoryTaskImpl historyTask = dbSession.get(HistoryTaskImpl.class, taskDbid);
+ if (historyTask==null) {
+ throw new JbpmException("task "+taskDbid+" doesn't exist");
+ }
+ HistoryCommentImpl comment = new HistoryCommentImpl(message);
+ historyTask.addDetail(comment);
+ dbSession.save(comment);
+ return comment;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AssignTaskCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AssignTaskCmd.java
new file mode 100644
index 0000000..fa6361f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/AssignTaskCmd.java
@@ -0,0 +1,70 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.events.TaskAssign;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class AssignTaskCmd extends AbstractCommand<Void> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String taskId;
+ protected String userId;
+ protected boolean take;
+
+ public AssignTaskCmd(String taskId, String userId) {
+ this.taskId = taskId;
+ this.userId = userId;
+ }
+
+ public AssignTaskCmd(String taskId, String userId, boolean take) {
+ this.taskId = taskId;
+ this.userId = userId;
+ this.take = take;
+ }
+
+ public Void execute(Environment environment) {
+ DbSession dbSession = environment.get(DbSession.class);
+ TaskImpl task = dbSession.get(TaskImpl.class, Long.parseLong(taskId));
+ if (task==null) {
+ throw new JbpmException("task "+taskId+" does not exist");
+ }
+ if (take) {
+ task.take(userId);
+ } else {
+ task.setAssignee(userId, true);
+ }
+
+ HistoryEvent.fire(new TaskAssign(task, userId));
+
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CheckDbCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CheckDbCmd.java
new file mode 100644
index 0000000..20c250f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CheckDbCmd.java
@@ -0,0 +1,95 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.hibernate.Session;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.id.PropertyImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.processengine.ProcessEngineImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class CheckDbCmd implements Command<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ private static Log log = Log.getLog(CheckDbCmd.class.getName());
+
+ public Object execute(Environment environment) throws Exception {
+ Session session = EnvironmentImpl.getFromCurrent(Session.class);
+
+ // if table JBPM4_PROPERTIES doesn't exist,
+ if (!PropertyImpl.propertiesTableExists(session)) {
+ if (!executionTableExists(session)) {
+ // tell users to run create.schema
+ throw new JbpmException("no jBPM DB schema: no JBPM4_EXECUTION table. Run the create.jbpm.schema target first in the install tool.");
+
+ } else {
+ // tell users to run upgrade
+ throw new JbpmException("jBPM DB schema not in sync with library version: no JBPM4_PROPERTIES table. Run the upgrade target first in the install tool.");
+ }
+
+ } else {
+ Long nextDbid = PropertyImpl.getNextDbid(session);
+ // if there is no next.dbid property specified
+ if (nextDbid==null) {
+ // (this only happens in the test suite)
+ // initialize the dbid property.
+ PropertyImpl.setNextDbid(session, 1);
+ }
+ }
+
+ // verify if DB version matches with library version,
+ String dbVersion = PropertyImpl.getDbVersion(session);
+ log.info("jBPM version info: library["+ProcessEngineImpl.JBPM_LIBRARY_VERSION+"], schema["+dbVersion+"]");
+
+ if ( (dbVersion!=null)
+ && (!dbVersion.equals(ProcessEngineImpl.JBPM_LIBRARY_VERSION))
+ ) {
+ // tell users to run upgrade
+ throw new JbpmException("jBPM DB schema version ("+dbVersion+") differs from jBPM library version ("+ProcessEngineImpl.JBPM_LIBRARY_VERSION+"): run the upgrade tool first.");
+ }
+
+ return null;
+ }
+
+ public static boolean executionTableExists(Session session) {
+ try {
+ session.createQuery("from "+ExecutionImpl.class.getName())
+ .setMaxResults(1)
+ .uniqueResult();
+ return true;
+
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CommandException.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CommandException.java
new file mode 100644
index 0000000..fd28e1a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CommandException.java
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.JbpmException;
+
+/**
+ * @author Tom Baeyens
+ */
+public class CommandException extends JbpmException {
+
+ private static final long serialVersionUID = 1L;
+
+ public CommandException() {
+ super();
+ }
+
+ public CommandException(String msg, Throwable cause) {
+ super(msg, cause);
+ }
+
+ public CommandException(String msg) {
+ super(msg);
+ }
+
+ public CommandException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CommandService.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CommandService.java
new file mode 100644
index 0000000..2d81c0f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CommandService.java
@@ -0,0 +1,26 @@
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+
+/**
+ * abstract extensible session facade. Developers can use this directly or
+ * extend one of the implementations with custom methods.
+ * Developers should be encouraged to use this interface as it will
+ * be kept more stable then direct usage of the API (which is still
+ * allowed).
+ * All the method implementations should be based on commands.
+ * Each of the method implementations will have a environment block.
+ * Then the command is executed and the environment is passed into the
+ * command.
+ */
+public interface CommandService {
+
+ String NAME_TX_REQUIRED_COMMAND_SERVICE = "txRequiredCommandService";
+ String NAME_NEW_TX_REQUIRED_COMMAND_SERVICE = "newTxRequiredCommandService";
+
+ /**
+ * @throws JbpmException if command throws an exception.
+ */
+ <T> T execute(Command<T> command);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CompleteTaskCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CompleteTaskCmd.java
new file mode 100644
index 0000000..4153920
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CompleteTaskCmd.java
@@ -0,0 +1,72 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class CompleteTaskCmd extends AbstractCommand<Void> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String taskId;
+ protected String outcome;
+ protected boolean outcomeSpecified;
+
+ public CompleteTaskCmd(String taskId, String outcome) {
+ this.taskId = taskId;
+ this.outcome = outcome;
+ this.outcomeSpecified = true;
+ }
+
+ public CompleteTaskCmd(String taskId) {
+ this.taskId = taskId;
+ this.outcomeSpecified = false;
+ }
+
+ public Void execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+
+ if (taskId == null || "".equals(taskId)) {
+ throw new JbpmException("Cannot complete a task with a null or empty taskId");
+ }
+
+ TaskImpl task = dbSession.get(TaskImpl.class, Long.parseLong(taskId));
+
+ if (task == null) {
+ throw new JbpmException("No task with id " + taskId + " was found");
+ }
+
+ if (outcomeSpecified) {
+ task.complete(outcome);
+ } else {
+ task.complete();
+ }
+ dbSession.delete(task);
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CompositeCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CompositeCmd.java
new file mode 100644
index 0000000..01b94de
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CompositeCmd.java
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+
+
+/** container for executing multiple commands in one transaction.
+ *
+ * @author Tom Baeyens
+ */
+public class CompositeCmd extends AbstractCommand<Void> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected List<Command<?>> commands = new ArrayList<Command<?>>();
+
+ public Void execute(Environment environment) throws Exception {
+ for (Command command: commands) {
+ command.execute(environment);
+ }
+ return null;
+ }
+
+ public void addCommand(Command<?> command) {
+ commands.add(command);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateDeploymentQueryCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateDeploymentQueryCmd.java
new file mode 100644
index 0000000..bec3f67
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateDeploymentQueryCmd.java
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.query.DeploymentQueryImpl;
+import org.jbpm.pvm.internal.query.JobQueryImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CreateDeploymentQueryCmd implements Command<DeploymentQueryImpl> {
+
+ private static final long serialVersionUID = 1L;
+
+ public DeploymentQueryImpl execute(Environment environment) throws Exception {
+ return environment.get(DbSession.class).createDeploymentQuery();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateHistoryActivityInstanceQueryCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateHistoryActivityInstanceQueryCmd.java
new file mode 100644
index 0000000..79f1261
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateHistoryActivityInstanceQueryCmd.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.query.HistoryActivityInstanceQueryImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CreateHistoryActivityInstanceQueryCmd implements Command<HistoryActivityInstanceQueryImpl> {
+
+ private static final long serialVersionUID = 1L;
+
+ public HistoryActivityInstanceQueryImpl execute(Environment environment) throws Exception {
+ return environment.get(DbSession.class).createHistoryActivityInstanceQuery();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateHistoryDetailQueryCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateHistoryDetailQueryCmd.java
new file mode 100644
index 0000000..1e1b9df
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateHistoryDetailQueryCmd.java
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.query.HistoryDetailQueryImpl;
+import org.jbpm.pvm.internal.query.HistoryProcessInstanceQueryImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CreateHistoryDetailQueryCmd implements Command<HistoryDetailQueryImpl> {
+
+ private static final long serialVersionUID = 1L;
+
+ public HistoryDetailQueryImpl execute(Environment environment) throws Exception {
+ return environment.get(DbSession.class).createHistoryDetailQuery();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateHistoryProcessInstanceQueryCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateHistoryProcessInstanceQueryCmd.java
new file mode 100644
index 0000000..236e091
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateHistoryProcessInstanceQueryCmd.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.query.HistoryProcessInstanceQueryImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CreateHistoryProcessInstanceQueryCmd implements Command<HistoryProcessInstanceQueryImpl> {
+
+ private static final long serialVersionUID = 1L;
+
+ public HistoryProcessInstanceQueryImpl execute(Environment environment) throws Exception {
+ return environment.get(DbSession.class).createHistoryProcessInstanceQuery();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateHistoryTaskQueryCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateHistoryTaskQueryCmd.java
new file mode 100644
index 0000000..d60b7b9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateHistoryTaskQueryCmd.java
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.query.HistoryTaskQueryImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CreateHistoryTaskQueryCmd implements Command<HistoryTaskQueryImpl> {
+
+ private static final long serialVersionUID = 1L;
+
+ public HistoryTaskQueryImpl execute(Environment environment) throws Exception {
+ return new HistoryTaskQueryImpl();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateJobQueryCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateJobQueryCmd.java
new file mode 100644
index 0000000..68786e4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateJobQueryCmd.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.query.JobQueryImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CreateJobQueryCmd implements Command<JobQueryImpl> {
+
+ private static final long serialVersionUID = 1L;
+
+ public JobQueryImpl execute(Environment environment) throws Exception {
+ return environment.get(DbSession.class).createJobQuery();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateProcessDefinitionQueryCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateProcessDefinitionQueryCmd.java
new file mode 100644
index 0000000..a685cd3
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateProcessDefinitionQueryCmd.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.query.ProcessDefinitionQueryImpl;
+import org.jbpm.pvm.internal.session.RepositorySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CreateProcessDefinitionQueryCmd implements Command<ProcessDefinitionQueryImpl> {
+
+ private static final long serialVersionUID = 1L;
+
+ public ProcessDefinitionQueryImpl execute(Environment environment) throws Exception {
+ return environment.get(RepositorySession.class).createProcessDefinitionQuery();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateProcessInstanceQueryCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateProcessInstanceQueryCmd.java
new file mode 100644
index 0000000..6d4b444
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateProcessInstanceQueryCmd.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.query.ProcessInstanceQueryImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CreateProcessInstanceQueryCmd implements Command<ProcessInstanceQueryImpl> {
+
+ private static final long serialVersionUID = 1L;
+
+ public ProcessInstanceQueryImpl execute(Environment environment) throws Exception {
+ return environment.get(DbSession.class).createProcessInstanceQuery();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateTaskQueryCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateTaskQueryCmd.java
new file mode 100644
index 0000000..687ef5b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/CreateTaskQueryCmd.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.query.TaskQueryImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CreateTaskQueryCmd implements Command<TaskQueryImpl> {
+
+ private static final long serialVersionUID = 1L;
+
+ public TaskQueryImpl execute(Environment environment) throws Exception {
+ return environment.get(DbSession.class).createTaskQuery();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteCommentCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteCommentCmd.java
new file mode 100644
index 0000000..8145e81
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteCommentCmd.java
@@ -0,0 +1,57 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.history.model.HistoryDetailImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DeleteCommentCmd extends AbstractCommand<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String commentId;
+
+ public DeleteCommentCmd(String commentId) {
+ if (commentId==null) {
+ throw new JbpmException("commentId is null");
+ }
+ this.commentId = commentId;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+ HistoryDetailImpl comment = (HistoryDetailImpl) dbSession.get(HistoryDetailImpl.class, Long.parseLong(commentId));
+ if (comment!=null) {
+ dbSession.delete(comment);
+
+ } else {
+ throw new JbpmException("comment "+commentId+" doesn't exist");
+ }
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteDeploymentCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteDeploymentCmd.java
new file mode 100644
index 0000000..715a6ef
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteDeploymentCmd.java
@@ -0,0 +1,97 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.ProcessDefinition;
+import org.jbpm.api.ProcessInstance;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.repository.DeploymentImpl;
+import org.jbpm.pvm.internal.repository.RepositoryCache;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.session.RepositorySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DeleteDeploymentCmd implements Command<Object> {
+
+ private static final Log log = Log.getLog(DeleteDeploymentCmd.class.getName());
+
+ private static final long serialVersionUID = 1L;
+
+ String deploymentId;
+ boolean cascade;
+
+ public DeleteDeploymentCmd(String deploymentId) {
+ this.deploymentId = deploymentId;
+ }
+
+ public DeleteDeploymentCmd(String deploymentId, boolean cascade) {
+ this.deploymentId = deploymentId;
+ this.cascade = cascade;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ RepositorySession repositorySession = environment.get(RepositorySession.class);
+ List<ProcessDefinition> processDefinitions = repositorySession.createProcessDefinitionQuery()
+ .deploymentId(deploymentId)
+ .list();
+
+ DbSession dbSession = environment.get(DbSession.class);
+
+ for (ProcessDefinition processDefinition: processDefinitions) {
+ String processDefinitionId = processDefinition.getId();
+ List<String> processInstanceIds = dbSession.findProcessInstanceIds(processDefinitionId);
+
+ if (cascade) {
+ for (String processInstanceId: processInstanceIds) {
+ dbSession.deleteProcessInstance(processInstanceId, true);
+ }
+
+ dbSession.deleteProcessDefinitionHistory(processDefinitionId);
+
+ } else {
+ if (!processInstanceIds.isEmpty()) {
+ throw new JbpmException("cannot delete deployment "+deploymentId+": still executions for "+processDefinition+": "+processInstanceIds);
+ }
+ }
+ }
+
+ Session session = environment.get(Session.class);
+ DeploymentImpl deployment = (DeploymentImpl) session.load(DeploymentImpl.class, Long.parseLong(deploymentId));
+ log.debug("deleting deployment "+deploymentId);
+ session.delete(deployment);
+
+ RepositoryCache repositoryCache = environment.get(RepositoryCache.class);
+ repositoryCache.remove(deploymentId);
+
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteProcessDefinitionCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteProcessDefinitionCmd.java
new file mode 100644
index 0000000..a09d5c8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteProcessDefinitionCmd.java
@@ -0,0 +1,59 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.wire.binding.DbSessionBinding;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DeleteProcessDefinitionCmd extends AbstractCommand<Void> {
+
+ private static final long serialVersionUID = 1L;
+
+ String processDefinitionId;
+ boolean deleteProcessInstances;
+ boolean deleteHistory;
+
+ public DeleteProcessDefinitionCmd(String processDefinitionId) {
+ this(processDefinitionId, false, false);
+ }
+
+ public DeleteProcessDefinitionCmd(String processDefinitionId, boolean deleteProcessInstances, boolean deleteHistory) {
+ this.processDefinitionId = processDefinitionId;
+ this.deleteProcessInstances = deleteProcessInstances;
+ this.deleteHistory = deleteHistory;
+ }
+
+ public Void execute(Environment environment) {
+ DbSession dbSession = environment.get(DbSession.class);
+ if (dbSession==null) {
+ throw new JbpmException("no "+DbSessionBinding.TAG+" configured");
+ }
+ dbSession.deleteProcessDefinition(processDefinitionId, deleteProcessInstances, deleteHistory);
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteProcessInstance.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteProcessInstance.java
new file mode 100644
index 0000000..c1ca3fc
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteProcessInstance.java
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DeleteProcessInstance extends AbstractCommand<Void> {
+
+ private static final long serialVersionUID = 1L;
+
+ String processInstanceId;
+ boolean cascade = false;
+
+ public DeleteProcessInstance(String processInstanceId) {
+ this.processInstanceId = processInstanceId;
+ }
+
+ public DeleteProcessInstance(String processInstanceId, boolean cascade) {
+ this.processInstanceId = processInstanceId;
+ this.cascade = cascade;
+ }
+
+ public Void execute(Environment environment) throws Exception {
+ DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class);
+ dbSession.deleteProcessInstance(processInstanceId, cascade);
+ return null;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteTaskCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteTaskCmd.java
new file mode 100644
index 0000000..b9b4b63
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeleteTaskCmd.java
@@ -0,0 +1,73 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.history.model.HistoryTaskImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+/**
+ * @author Tom Baeyens
+ * @author Alejandro Guizar
+ */
+public class DeleteTaskCmd extends AbstractCommand<Void> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long taskDbid;
+ protected String reason;
+ protected boolean deleteHistory = false;
+
+ public DeleteTaskCmd(String taskId) {
+ this.taskDbid = Long.parseLong(taskId);
+ }
+
+ public DeleteTaskCmd(String taskId, String reason) {
+ this.taskDbid = Long.parseLong(taskId);
+ this.reason = reason;
+ }
+
+ public DeleteTaskCmd(String taskId, boolean deleteHistory) {
+ this.taskDbid = Long.parseLong(taskId);
+ this.deleteHistory = deleteHistory;
+ }
+
+ public Void execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+ TaskImpl task = (TaskImpl) dbSession.get(TaskImpl.class, taskDbid);
+ if (task!=null) {
+ task.delete(reason);
+ dbSession.delete(task);
+ if (deleteHistory) {
+ HistoryTaskImpl historyTask = (HistoryTaskImpl) dbSession.get(HistoryTaskImpl.class, taskDbid);
+ if (historyTask!=null) {
+ dbSession.delete(historyTask);
+ }
+ }
+ } else {
+ throw new JbpmException("task "+taskDbid+" doesn't exist");
+ }
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeployCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeployCmd.java
new file mode 100644
index 0000000..77e00ad
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/DeployCmd.java
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.repository.DeploymentImpl;
+import org.jbpm.pvm.internal.session.RepositorySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DeployCmd implements Command<String> {
+
+ private static final long serialVersionUID = 1L;
+
+ // private static Log log = Log.getLog(DeployCmd.class.getName());
+
+ DeploymentImpl deployment;
+
+ public DeployCmd(DeploymentImpl deployment) {
+ this.deployment = deployment;
+ }
+
+ public String execute(Environment environment) throws Exception {
+ RepositorySession repositorySession = environment.get(RepositorySession.class);
+ return repositorySession.deploy(deployment);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/EndProcessInstance.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/EndProcessInstance.java
new file mode 100644
index 0000000..c2e7e19
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/EndProcessInstance.java
@@ -0,0 +1,52 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class EndProcessInstance extends AbstractCommand<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String processInstanceId;
+ protected String state;
+
+ public EndProcessInstance(String processInstanceId, String state) {
+ super();
+ this.processInstanceId = processInstanceId;
+ this.state = state;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+ ExecutionImpl processInstance = (ExecutionImpl) dbSession.findProcessInstanceById(processInstanceId);
+ processInstance.end(state);
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/ExecuteJobCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/ExecuteJobCmd.java
new file mode 100644
index 0000000..a1f2e13
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/ExecuteJobCmd.java
@@ -0,0 +1,118 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.Date;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.job.Job;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.env.JobContext;
+import org.jbpm.pvm.internal.job.JobImpl;
+import org.jbpm.pvm.internal.jobexecutor.JobExceptionHandler;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.tx.Transaction;
+
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ExecuteJobCmd extends AbstractCommand<Job> {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Log log = Log.getLog(ExecuteJobCmd.class.getName());
+
+ protected Long jobDbid;
+
+ public ExecuteJobCmd(String jobId) {
+ if (jobId==null) {
+ throw new JbpmException("jobId is null");
+ }
+ jobDbid = Long.parseLong(jobId);
+ }
+
+ public ExecuteJobCmd(Long jobDbid) {
+ this.jobDbid = jobDbid;
+ }
+
+ public Job execute(Environment environmentInterface) throws Exception {
+ EnvironmentImpl environment = (EnvironmentImpl) environmentInterface;
+ DbSession dbSession = environment.get(DbSession.class);
+ if (dbSession==null) {
+ throw new JbpmException("no db-session configured");
+ }
+ JobImpl<?> job = (JobImpl<?>) dbSession.get(JobImpl.class, jobDbid);
+
+ // in case of decision jobs, the job might have been deleted
+ // before we execute it (they are in a list)
+ if (job != null) {
+ JobContext jobContext = new JobContext(job);
+ environment.setContext(jobContext);
+ try {
+ log.debug("executing job "+job+"...");
+ job.execute(environment);
+ log.debug("executed job "+job);
+
+ // if this job is locked too long, it could be unlocked by the lockmonitor and
+ // executed by another thread.
+ Date lockExpirationDate = job.getLockExpirationTime();
+ // can be null if it was rescheduled
+ if (lockExpirationDate != null) {
+ long lockExpiration = lockExpirationDate.getTime();
+ long currentTime = System.currentTimeMillis();
+ if (currentTime>lockExpiration) {
+ throw new JbpmException("job took too long: lock expired "+(currentTime-lockExpiration)+"ms ago");
+ }
+ }
+ } catch (Exception exception) {
+ log.error("exception while executing '"+job+"'", exception);
+ handleJobExecutionException(environment, job, exception);
+ } finally {
+ environment.removeContext(jobContext);
+ }
+
+ } else {
+ log.debug("job " + jobDbid + " no longer exists");
+ }
+ return job;
+ }
+
+ /** This transaction will be marked for rollback. A command will be associated with the
+ * Transaction.EVENT_AFTERCOMPLETION (after the job locks of the current transaction are
+ * released). Then the command will update the job with the exception details in a separate
+ * transaction. */
+ protected void handleJobExecutionException(Environment environment, JobImpl<?> job, Exception exception) {
+ Transaction transaction = environment.get(Transaction.class);
+ CommandService commandService = (CommandService) environment.get(CommandService.NAME_NEW_TX_REQUIRED_COMMAND_SERVICE);
+ JobExceptionHandler jobExceptionHandler = new JobExceptionHandler(job.getDbid(), exception, commandService);
+ transaction.registerSynchronization(jobExceptionHandler);
+
+ if (exception instanceof RuntimeException) {
+ throw (RuntimeException) exception;
+ }
+ throw new JbpmException("job failed: "+exception.getMessage(), exception);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindExecutionCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindExecutionCmd.java
new file mode 100644
index 0000000..b1e765a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindExecutionCmd.java
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class FindExecutionCmd extends AbstractCommand<Execution> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String executionId;
+
+ public FindExecutionCmd(String executionId) {
+ if (executionId==null) {
+ throw new JbpmException("executionId is null");
+ }
+ this.executionId = executionId;
+ }
+
+ public Execution execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+ return dbSession.findExecutionById(executionId);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindLatestProcessDefinitionByKeyCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindLatestProcessDefinitionByKeyCmd.java
new file mode 100644
index 0000000..7ea8973
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindLatestProcessDefinitionByKeyCmd.java
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.ProcessDefinition;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.model.OpenProcessDefinition;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class FindLatestProcessDefinitionByKeyCmd extends AbstractCommand<ProcessDefinition> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String processDefinitionKey;
+
+ public FindLatestProcessDefinitionByKeyCmd(String processDefinitionKey) {
+ this.processDefinitionKey = processDefinitionKey;
+ }
+
+ public OpenProcessDefinition execute(Environment environment) throws Exception {
+ return environment
+ .get(DbSession.class)
+ .findLatestProcessDefinitionByKey(processDefinitionKey);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindProcessDefinitionByIdCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindProcessDefinitionByIdCmd.java
new file mode 100644
index 0000000..819122c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindProcessDefinitionByIdCmd.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.model.OpenProcessDefinition;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class FindProcessDefinitionByIdCmd extends AbstractCommand<OpenProcessDefinition> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String processDefinitionId;
+
+ public FindProcessDefinitionByIdCmd(String processDefinitionId) {
+ this.processDefinitionId = processDefinitionId;
+ }
+
+ public OpenProcessDefinition execute(Environment environment) throws Exception {
+ return environment
+ .get(DbSession.class)
+ .findProcessDefinitionById(processDefinitionId);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindProcessDefinitionKeysCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindProcessDefinitionKeysCmd.java
new file mode 100644
index 0000000..9795b85
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindProcessDefinitionKeysCmd.java
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.List;
+
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class FindProcessDefinitionKeysCmd extends AbstractCommand<List<String>> {
+
+ private static final long serialVersionUID = 1L;
+
+ public List<String> execute(Environment environment) throws Exception {
+ return environment
+ .get(DbSession.class)
+ .findProcessDefinitionKeys();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindProcessDefinitionsByKeyCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindProcessDefinitionsByKeyCmd.java
new file mode 100644
index 0000000..0b59f22
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/FindProcessDefinitionsByKeyCmd.java
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.List;
+
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.client.ClientProcessDefinition;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class FindProcessDefinitionsByKeyCmd extends AbstractCommand<List<ClientProcessDefinition>> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String processDefinitionKey;
+
+ public FindProcessDefinitionsByKeyCmd(String processDefinitionKey) {
+ this.processDefinitionKey = processDefinitionKey;
+ }
+
+ public List<ClientProcessDefinition> execute(Environment environment) throws Exception {
+ return environment
+ .get(DbSession.class)
+ .findProcessDefinitionsByKey(processDefinitionKey);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetActivityCoordinatesCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetActivityCoordinatesCmd.java
new file mode 100644
index 0000000..d1344ec
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetActivityCoordinatesCmd.java
@@ -0,0 +1,60 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.model.ActivityCoordinates;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.session.RepositorySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class GetActivityCoordinatesCmd implements Command<ActivityCoordinates> {
+
+ private static final long serialVersionUID = 1L;
+
+ String processDefinitionId;
+ String activityName;
+
+ public GetActivityCoordinatesCmd(String processDefinitionId, String activityName) {
+ this.processDefinitionId = processDefinitionId;
+ this.activityName = activityName;
+ }
+
+ public ActivityCoordinates execute(Environment environment) throws Exception {
+ RepositorySession repositorySession = environment.get(RepositorySession.class);
+ ProcessDefinitionImpl processDefinition = (ProcessDefinitionImpl) repositorySession.findProcessDefinitionById(processDefinitionId);
+ if (processDefinition==null) {
+ throw new JbpmException("process definition "+processDefinitionId+" doesn't exist");
+ }
+ ActivityImpl activity = processDefinition.findActivity(activityName);
+ if (activity==null) {
+ throw new JbpmException("activity '"+activityName+"' doesn't exist in process definition "+processDefinitionId);
+ }
+ return activity.getCoordinates();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetDeploymentResourceNamesCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetDeploymentResourceNamesCmd.java
new file mode 100644
index 0000000..8ff9966
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetDeploymentResourceNamesCmd.java
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.Set;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.repository.DeploymentImpl;
+import org.jbpm.pvm.internal.session.RepositorySession;
+
+/**
+ * Command used to retrieve all the resource names of a deployment. The
+ * resources itself can be retrieved using other commands (eg
+ * {@link GetResourceAsStreamCmd}).
+ *
+ * @author jbarrez
+ */
+public class GetDeploymentResourceNamesCmd implements Command<Set<String>> {
+
+ private static final long serialVersionUID = 1L;
+
+ private String deploymentId;
+
+ public GetDeploymentResourceNamesCmd(String deploymentId) {
+ this.deploymentId = deploymentId;
+ }
+
+ public Set<String> execute(Environment environment) throws Exception {
+ RepositorySession repositorySession = environment.get(RepositorySession.class);
+ DeploymentImpl depImpl = repositorySession.getDeployment(deploymentId);
+ return depImpl.getResourceNames();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetExecutionVariableNamesCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetExecutionVariableNamesCmd.java
new file mode 100644
index 0000000..f5b9a0a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetExecutionVariableNamesCmd.java
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.Set;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.client.ClientExecution;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class GetExecutionVariableNamesCmd extends AbstractCommand<Set<String>> {
+
+ private static final long serialVersionUID = 1L;
+
+ String executionId;
+
+ public GetExecutionVariableNamesCmd(String executionId) {
+ if (executionId==null) {
+ throw new JbpmException("executionId is null");
+ }
+ this.executionId = executionId;
+ }
+
+ public Set<String> execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+ ClientExecution execution = dbSession.findExecutionById(executionId);
+ return execution.getVariableKeys();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetExecutionVariablesCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetExecutionVariablesCmd.java
new file mode 100644
index 0000000..6ffb56c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetExecutionVariablesCmd.java
@@ -0,0 +1,69 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.client.ClientExecution;
+import org.jbpm.pvm.internal.session.DbSession;
+
+/**
+ * @author Tom Baeyens
+ */
+public class GetExecutionVariablesCmd extends AbstractCommand<Map<String, Object>> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String executionId;
+ protected Set<String> variableNames;
+
+ public GetExecutionVariablesCmd(String executionId, Set<String> variableNames) {
+ if (executionId==null) {
+ throw new JbpmException("executionId is null");
+ }
+ this.executionId = executionId;
+ if (variableNames==null) {
+ throw new JbpmException("variableNames is null");
+ }
+ this.variableNames = variableNames;
+ }
+
+ public Map<String, Object> execute(Environment environment) throws Exception {
+ Map<String, Object> variables = new HashMap<String, Object>();
+
+ DbSession dbSession = environment.get(DbSession.class);
+ ClientExecution execution = dbSession.findExecutionById(executionId);
+ if (execution==null) {
+ throw new JbpmException("execution "+executionId+" doesn't exist");
+ }
+ for (String variableName : variableNames) {
+ Object value = execution.getVariable(variableName);
+ variables.put(variableName, value);
+ }
+
+ return variables;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetOutcomes.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetOutcomes.java
new file mode 100644
index 0000000..244ec61
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetOutcomes.java
@@ -0,0 +1,76 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.task.Task;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.Transition;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class GetOutcomes implements Command<Set<String>> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String taskId;
+
+ public GetOutcomes(String taskId) {
+ if (taskId==null) {
+ throw new JbpmException("taskId is null");
+ }
+ this.taskId = taskId;
+ }
+
+ public Set<String> execute(Environment environment) {
+ DbSession dbSession = environment.get(DbSession.class);
+ TaskImpl task = dbSession.get(TaskImpl.class, Long.parseLong(taskId));
+ if (task==null) {
+ throw new JbpmException("task "+taskId+" doesn't exist");
+ }
+
+ Set<String> outcomes = new HashSet<String>();
+
+ ExecutionImpl execution = (task!=null ? task.getExecution() : null);
+ ActivityImpl activity = (execution!=null ? execution.getActivity() : null);
+ List<Transition> outgoingTransitions = (activity!=null ? activity.getOutgoingTransitions() : null);
+
+ if (outgoingTransitions!=null) {
+ for (Transition transition: outgoingTransitions) {
+ outcomes.add(transition.getName());
+ }
+ }
+
+ return outcomes;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetParticipantsCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetParticipantsCmd.java
new file mode 100644
index 0000000..272ef3f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetParticipantsCmd.java
@@ -0,0 +1,74 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.task.Participation;
+import org.jbpm.pvm.internal.task.ParticipationImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class GetParticipantsCmd extends AbstractCommand<List<Participation>> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String taskId;
+ protected String swimlaneId;
+
+ public GetParticipantsCmd(String taskId, String swimlaneId) {
+ if (taskId==null) {
+ throw new JbpmException("taskId is null");
+ }
+ this.taskId = taskId;
+ this.swimlaneId = swimlaneId;
+ }
+
+ public List<Participation> execute(Environment environment) throws Exception {
+ StringBuilder hql = new StringBuilder();
+ hql.append("select role from ");
+ hql.append(ParticipationImpl.class.getName());
+ hql.append(" as role where ");
+
+ if (taskId!=null) {
+ hql.append(" role.task.dbid = "+taskId+" ");
+
+ } else if (swimlaneId!=null) {
+ hql.append(" role.swimlane.dbid = "+swimlaneId+" ");
+
+ } else {
+ throw new JbpmException("no task nor swimlane specified");
+ }
+
+ Session session = environment.get(Session.class);
+ Query query = session.createQuery(hql.toString());
+
+ List<Participation> participations = query.list();
+ return participations;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetResourceAsStreamCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetResourceAsStreamCmd.java
new file mode 100644
index 0000000..f4c4918
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetResourceAsStreamCmd.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.session.RepositorySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class GetResourceAsStreamCmd extends AbstractCommand<byte[]> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String deploymentId;
+ protected String resourceName;
+
+ public GetResourceAsStreamCmd(String deploymentId, String resourceName) {
+ this.deploymentId = deploymentId;
+ this.resourceName = resourceName;
+ }
+
+ public byte[] execute(Environment environment) {
+ RepositorySession repositorySession = environment.get(RepositorySession.class);
+ return repositorySession.getBytes(deploymentId, resourceName);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetStartActivityNamesCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetStartActivityNamesCmd.java
new file mode 100644
index 0000000..a959297
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetStartActivityNamesCmd.java
@@ -0,0 +1,62 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.session.RepositorySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class GetStartActivityNamesCmd implements Command<List<String>> {
+
+ private static final long serialVersionUID = 1L;
+
+ String processDefinitionId;
+
+ public GetStartActivityNamesCmd(String processDefinitionId) {
+ this.processDefinitionId = processDefinitionId;
+ }
+
+ public List<String> execute(Environment environment) {
+ List<String> activityNames = new ArrayList<String>();
+
+ RepositorySession repositorySession = environment.get(RepositorySession.class);
+ ProcessDefinitionImpl processDefinition = repositorySession.findProcessDefinitionById(processDefinitionId);
+
+ for (ActivityImpl activity: (List<ActivityImpl>) processDefinition.getActivities()) {
+ if (activity.getIncomingTransitions().isEmpty()) {
+ activityNames.add(activity.getName());
+ }
+ }
+
+ return activityNames;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetStartFormResourceNameCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetStartFormResourceNameCmd.java
new file mode 100644
index 0000000..5fd8e01
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetStartFormResourceNameCmd.java
@@ -0,0 +1,65 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.activity.ActivityBehaviour;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.session.RepositorySession;
+import org.jbpm.pvm.internal.task.FormBehaviour;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class GetStartFormResourceNameCmd implements Command<String> {
+
+ private static final long serialVersionUID = 1L;
+
+ String processDefinitionId;
+ String activityName;
+
+ public GetStartFormResourceNameCmd(String processDefinitionId, String activityName) {
+ if (processDefinitionId==null) {
+ throw new JbpmException("processDefinitionId is null");
+ }
+ this.processDefinitionId = processDefinitionId;
+ this.activityName = activityName;
+ }
+
+ public String execute(Environment environment) {
+ RepositorySession repositorySession = environment.get(RepositorySession.class);
+ ProcessDefinitionImpl processDefinition = repositorySession.findProcessDefinitionById(processDefinitionId);
+
+ ActivityImpl activity = processDefinition.getActivity(activityName);
+
+ ActivityBehaviour behaviour = activity.getActivityBehaviour();
+ if (behaviour instanceof FormBehaviour) {
+ return ((FormBehaviour)behaviour).getFormResourceName();
+ }
+
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetSubTasksCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetSubTasksCmd.java
new file mode 100644
index 0000000..58c78a2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetSubTasksCmd.java
@@ -0,0 +1,57 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.task.Task;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class GetSubTasksCmd extends AbstractCommand<List<Task>> {
+
+ private static final long serialVersionUID = 1L;
+
+ String parentTaskId;
+
+ public GetSubTasksCmd(String parentTaskId) {
+ this.parentTaskId = parentTaskId;
+ }
+
+ public List<Task> execute(Environment environment) throws Exception {
+ Session session = environment.get(Session.class);
+
+ Query query = session.createQuery(
+ "select task " +
+ "from "+TaskImpl.class.getName()+" as task " +
+ "where task.superTask.dbid = "+parentTaskId+" "
+ );
+
+ return query.list();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetTaskCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetTaskCmd.java
new file mode 100644
index 0000000..0204a19
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetTaskCmd.java
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.task.Task;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+/**
+ * @author Alejandro Guizar
+ */
+public class GetTaskCmd extends AbstractCommand<Task> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String taskId;
+
+ public GetTaskCmd(String taskId) {
+ if (taskId==null) {
+ throw new JbpmException("taskId is null");
+ }
+ this.taskId = taskId;
+ }
+
+ public Task execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+ return dbSession.get(TaskImpl.class, Long.parseLong(taskId));
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetTaskCommentsCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetTaskCommentsCmd.java
new file mode 100644
index 0000000..24c6f92
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetTaskCommentsCmd.java
@@ -0,0 +1,77 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.history.HistoryComment;
+import org.jbpm.pvm.internal.history.model.HistoryDetailImpl;
+import org.jbpm.pvm.internal.history.model.HistoryTaskImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class GetTaskCommentsCmd extends AbstractCommand<List<HistoryComment>> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String taskId;
+
+ public GetTaskCommentsCmd(String taskId) {
+ this.taskId = taskId;
+ }
+
+ public List<HistoryComment> execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+
+ List<HistoryComment> comments = dbSession.findCommentsByTaskId(taskId);
+ forceInitializationAndClean(comments);
+ return comments;
+ }
+
+ protected void forceInitializationAndClean(List<HistoryComment> comments) {
+ if (comments!=null) {
+ comments.size();
+ List<HistoryComment> copy = new ArrayList<HistoryComment>(comments);
+ for (int i=0; i<copy.size(); i++) {
+ HistoryComment comment = copy.get(i);
+
+ // when comments get deleted, it's possible that we
+ // get null values in the list as the indexes of the
+ // other comments are not upated.
+ // So if there is a null value, we can safely delete it
+ // from the persistent list and cause the indexes to
+ // be updated
+ if (comment==null) {
+ comments.remove(i);
+ } else {
+ forceInitializationAndClean(comment.getReplies());
+ }
+ }
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetTaskVariableNamesCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetTaskVariableNamesCmd.java
new file mode 100644
index 0000000..0643cd2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetTaskVariableNamesCmd.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.Set;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.client.ClientExecution;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class GetTaskVariableNamesCmd extends AbstractCommand<Set<String>> {
+
+ private static final long serialVersionUID = 1L;
+
+ String taskId;
+
+ public GetTaskVariableNamesCmd(String taskId) {
+ if (taskId==null) {
+ throw new JbpmException("taskId is null");
+ }
+ this.taskId = taskId;
+ }
+
+ public Set<String> execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+ TaskImpl task = dbSession.get(TaskImpl.class, Long.parseLong(taskId));
+ return task.getVariableKeys();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetTaskVariablesCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetTaskVariablesCmd.java
new file mode 100644
index 0000000..b550e28
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/GetTaskVariablesCmd.java
@@ -0,0 +1,59 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class GetTaskVariablesCmd extends AbstractCommand<Map<String, Object>> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String taskId;
+ protected Set<String> variableNames;
+
+ public GetTaskVariablesCmd(String taskId, Set<String> variableNames) {
+ this.taskId = taskId;
+ this.variableNames = variableNames;
+ }
+
+ public Map<String, Object> execute(Environment environment) throws Exception {
+ Map<String, Object> variables = new HashMap<String, Object>();
+
+ DbSession dbSession = environment.get(DbSession.class);
+ TaskImpl task = dbSession.get(TaskImpl.class, Long.parseLong(taskId));
+ for (String variableName : variableNames) {
+ Object value = task.getVariable(variableName);
+ variables.put(variableName, value);
+ }
+
+ return variables;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/NewTaskCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/NewTaskCmd.java
new file mode 100644
index 0000000..ea225c8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/NewTaskCmd.java
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.task.Task;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class NewTaskCmd extends AbstractCommand<Task> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Long parentTaskDbid;
+
+ public NewTaskCmd(String parentTaskId) {
+ if (parentTaskId!=null) {
+ this.parentTaskDbid = Long.parseLong(parentTaskId);
+ }
+ }
+
+ public Task execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+ TaskImpl task = (TaskImpl) dbSession.createTask();
+ task.setSuperTaskDbid(parentTaskDbid);
+ return task;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/QueryCommand.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/QueryCommand.java
new file mode 100644
index 0000000..05ad0f7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/QueryCommand.java
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+
+/** base class for commands that execute scalable queries.
+ *
+ * @author Tom Baeyens
+ */
+public abstract class QueryCommand<T> extends AbstractCommand<T>{
+
+ private static final long serialVersionUID = 1L;
+
+ protected int firstResult;
+ protected int maxResults;
+
+ public QueryCommand(int firstResult, int maxResults) {
+ this.firstResult = firstResult;
+ this.maxResults = maxResults;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/RemoveParticipantCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/RemoveParticipantCmd.java
new file mode 100644
index 0000000..36fc57e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/RemoveParticipantCmd.java
@@ -0,0 +1,78 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.hibernate.Session;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.task.ParticipationImpl;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class RemoveParticipantCmd extends AbstractCommand<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Long taskDbid;
+ protected Long swimlaneId;
+ protected String userId;
+ protected String groupId;
+ protected String participationType;
+
+ public RemoveParticipantCmd(String taskId, String swimlaneId, String userId, String groupId, String participationType) {
+ this.swimlaneId = (swimlaneId!=null ? Long.parseLong(swimlaneId) : null );
+ this.taskDbid = (taskId!=null ? Long.parseLong(taskId) : null );
+ this.userId = userId;
+ this.groupId = groupId;
+ this.participationType = participationType;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ Session session = environment.get(Session.class);
+
+ if (taskDbid!=null) {
+ TaskImpl task = (TaskImpl) session.get(TaskImpl.class, taskDbid);
+ if (task==null) {
+ throw new JbpmException("task "+taskDbid+" was not found");
+ }
+
+ Set<ParticipationImpl> participations = new HashSet<ParticipationImpl>(task.getParticipations());
+ for (ParticipationImpl participation : participations) {
+ boolean userMatch = userId!=null ? userId.equals(participation.getUserId()) : false;
+ boolean groupMatch = groupId!=null ? groupId.equals(participation.getGroupId()) : false;
+ if ( ( userMatch || groupMatch )
+ && participation.getType().equals(participationType)
+ ) {
+ task.removeParticipant(participation);
+ }
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/ResumeDeploymentCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/ResumeDeploymentCmd.java
new file mode 100644
index 0000000..b8358b6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/ResumeDeploymentCmd.java
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.repository.DeploymentImpl;
+import org.jbpm.pvm.internal.session.RepositorySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ResumeDeploymentCmd implements Command<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ String deploymentId;
+
+ public ResumeDeploymentCmd(String deploymentId) {
+ this.deploymentId = deploymentId;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ RepositorySession repositorySession = environment.get(RepositorySession.class);
+ DeploymentImpl deployment = (DeploymentImpl) repositorySession.getDeployment(deploymentId);
+ deployment.resume();
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SaveTaskCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SaveTaskCmd.java
new file mode 100644
index 0000000..c9df7b1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SaveTaskCmd.java
@@ -0,0 +1,68 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.HistorySession;
+import org.jbpm.pvm.internal.history.events.TaskCreated;
+import org.jbpm.pvm.internal.history.events.TaskUpdated;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+/**
+ * @author Tom Baeyens
+ * @author Alejandro Guizar
+ */
+public class SaveTaskCmd extends AbstractCommand<String> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected TaskImpl task;
+
+ public SaveTaskCmd(TaskImpl task) {
+ this.task = task;
+ }
+
+ public String execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+
+ if (task.isNew()) {
+ if (task.getSuperTaskDbid()!=null) {
+ TaskImpl parentTask = (TaskImpl) dbSession.get(TaskImpl.class, task.getSuperTaskDbid());
+ parentTask.addSubTask(task);
+ task.setSuperTaskDbid(null);
+ }
+
+ dbSession.save(task);
+
+ HistoryEvent.fire(new TaskCreated(task));
+
+ } else {
+ dbSession.update(task);
+
+ HistoryEvent.fire(new TaskUpdated(task));
+ }
+
+ return task.getId();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SendMessageCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SendMessageCmd.java
new file mode 100644
index 0000000..3c4d801
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SendMessageCmd.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.job.Message;
+import org.jbpm.pvm.internal.session.MessageSession;
+
+/** sends a given message to the configured message service.
+ *
+ * @author Tom Baeyens
+ */
+public class SendMessageCmd extends AbstractCommand<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Message message;
+
+ public SendMessageCmd(Message message) {
+ this.message = message;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ MessageSession messageSession = environment.get(MessageSession.class);
+ messageSession.send(message);
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SetExecutionVariablesCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SetExecutionVariablesCmd.java
new file mode 100644
index 0000000..c9d8e6f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SetExecutionVariablesCmd.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.client.ClientExecution;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class SetExecutionVariablesCmd extends VariablesCmd<Void> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String executionId = null;
+
+ public SetExecutionVariablesCmd(String executionId) {
+ if (executionId==null) {
+ throw new JbpmException("executionId is null");
+ }
+ this.executionId = executionId;
+ }
+
+ public Void execute(Environment environment) throws Exception {
+ ClientExecution execution = getExecution(environment, executionId);
+ execution.setVariables(variables);
+
+ return null;
+ }
+
+ public String getExecutionId() {
+ return executionId;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SetTaskVariablesCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SetTaskVariablesCmd.java
new file mode 100644
index 0000000..cf340fc
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SetTaskVariablesCmd.java
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class SetTaskVariablesCmd extends VariablesCmd<Void> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String taskId;
+
+ public SetTaskVariablesCmd(String taskId) {
+ if (taskId==null) {
+ throw new JbpmException("taskId is null");
+ }
+ this.taskId = taskId;
+ }
+
+ public Void execute(Environment environment) throws Exception {
+ DbSession dbSession = environment.get(DbSession.class);
+ TaskImpl task = dbSession.get(TaskImpl.class, Long.parseLong(taskId));
+ task.setVariables(variables);
+
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SignalCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SignalCmd.java
new file mode 100644
index 0000000..c7e57ab
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SignalCmd.java
@@ -0,0 +1,65 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.Map;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.ProcessInstance;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.client.ClientExecution;
+import org.jbpm.pvm.internal.session.DbSession;
+
+/**
+ * @author Tom Baeyens
+ */
+public class SignalCmd extends AbstractCommand<ProcessInstance> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String executionId;
+ protected String signalName;
+ protected Map<String, ?> parameters;
+
+ public SignalCmd(String executionId, String signalName, Map<String, ?> parameters) {
+ if (executionId==null) {
+ throw new JbpmException("executionId is null");
+ }
+ this.executionId = executionId;
+ this.signalName = signalName;
+ this.parameters = parameters;
+ }
+
+ public ProcessInstance execute(Environment environment) throws Exception {
+ ClientExecution execution = null;
+
+ DbSession dbSession = environment.get(DbSession.class);
+ execution = dbSession.findExecutionById(executionId);
+ if (execution==null) {
+ throw new JbpmException("execution "+executionId+" does not exist");
+ }
+
+ execution.signal(signalName, parameters);
+
+ return execution.getProcessInstance();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/StartProcessInstanceCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/StartProcessInstanceCmd.java
new file mode 100644
index 0000000..7851bfd
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/StartProcessInstanceCmd.java
@@ -0,0 +1,83 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.Map;
+
+import org.hibernate.Session;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.ProcessInstance;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.client.ClientProcessDefinition;
+import org.jbpm.pvm.internal.client.ClientProcessInstance;
+import org.jbpm.pvm.internal.session.RepositorySession;
+
+/**
+ * @author Tom Baeyens
+ */
+public class StartProcessInstanceCmd extends VariablesCmd<ProcessInstance> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String processDefinitionId;
+ protected String executionKey;
+
+ public StartProcessInstanceCmd(String processDefinitionId, Map<String, Object> variables, String executionKey) {
+ this.processDefinitionId = processDefinitionId;
+ this.variables = variables;
+ this.executionKey = executionKey;
+ }
+
+ public ProcessInstance execute(Environment environment) throws Exception {
+ RepositorySession repositorySession = environment.get(RepositorySession.class);
+
+ ClientProcessDefinition processDefinition = (ClientProcessDefinition)
+ repositorySession.findProcessDefinitionById(processDefinitionId);
+ if (processDefinition==null) {
+ throw new JbpmException("no process definition with id '"+processDefinitionId+"'");
+ }
+
+ ClientProcessInstance processInstance = processDefinition.createProcessInstance(executionKey);
+ processInstance.setVariables(variables);
+ processInstance.start();
+
+ if (!processInstance.isEnded()) {
+ Session session = environment.get(Session.class);
+ session.save(processInstance);
+ }
+
+ return processInstance;
+ }
+
+ public String getProcessDefinitionKey() {
+ return processDefinitionId;
+ }
+ public void setProcessDefinitionKey(String processDefinitionKey) {
+ this.processDefinitionId = processDefinitionKey;
+ }
+ public String getExecutionKey() {
+ return executionKey;
+ }
+ public void setExecutionKey(String executionKey) {
+ this.executionKey = executionKey;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/StartProcessInstanceInLatestCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/StartProcessInstanceInLatestCmd.java
new file mode 100644
index 0000000..b9e51cf
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/StartProcessInstanceInLatestCmd.java
@@ -0,0 +1,76 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.Map;
+
+import org.hibernate.Session;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.ProcessInstance;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.client.ClientProcessDefinition;
+import org.jbpm.pvm.internal.client.ClientProcessInstance;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.session.RepositorySession;
+
+/**
+ * @author Tom Baeyens
+ */
+public class StartProcessInstanceInLatestCmd extends VariablesCmd<ProcessInstance> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String processDefinitionKey;
+ protected String executionKey;
+
+ public StartProcessInstanceInLatestCmd(String processDefinitionKey, Map<String, ?> variables, String executionKey) {
+ if (processDefinitionKey==null) {
+ throw new JbpmException("processDefinitionKey is null");
+ }
+ this.processDefinitionKey = processDefinitionKey;
+ this.executionKey = executionKey;
+ setVariables(variables);
+ }
+
+ public ProcessInstance execute(Environment environment) throws Exception {
+ ClientProcessDefinition processDefinition = null;
+
+ RepositorySession repositorySession = environment.get(RepositorySession.class);
+ processDefinition = (ClientProcessDefinition) repositorySession.findProcessDefinitionByKey(processDefinitionKey);
+ if (processDefinition==null) {
+ throw new JbpmException("no process definition with key '"+processDefinitionKey+"'");
+ }
+
+ ClientProcessInstance processInstance = processDefinition.createProcessInstance(executionKey);
+ processInstance.setVariables(variables);
+ processInstance.start();
+
+ return processInstance;
+ }
+
+ public String getExecutionKey() {
+ return executionKey;
+ }
+ public void setExecutionKey(String executionKey) {
+ this.executionKey = executionKey;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SuspendDeploymentCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SuspendDeploymentCmd.java
new file mode 100644
index 0000000..5016719
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/SuspendDeploymentCmd.java
@@ -0,0 +1,65 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.repository.DeploymentImpl;
+import org.jbpm.pvm.internal.repository.RepositoryCache;
+import org.jbpm.pvm.internal.session.RepositorySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class SuspendDeploymentCmd implements Command<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ String deploymentId;
+
+ public SuspendDeploymentCmd(String deploymentId) {
+ this.deploymentId = deploymentId;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ RepositorySession repositorySession = environment.get(RepositorySession.class);
+
+ DeploymentImpl deployment = (DeploymentImpl) repositorySession.getDeployment(deploymentId);
+ if (deployment==null) {
+ throw new JbpmException("deployment "+deploymentId+" doesn't exist");
+ }
+
+ deployment.suspend();
+
+ // removing deployment from the cache
+ // next time it's used, it will be redeployed
+ // at that time, the suspended property will be propagated to the
+ // process definitions
+ RepositoryCache repositoryCache = environment.get(RepositoryCache.class);
+ repositoryCache.remove(deploymentId);
+
+ return null;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/UpdateDeploymentResourceCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/UpdateDeploymentResourceCmd.java
new file mode 100644
index 0000000..7af45c9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/UpdateDeploymentResourceCmd.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.io.InputStream;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.session.RepositorySession;
+import org.jbpm.pvm.internal.util.IoUtil;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class UpdateDeploymentResourceCmd implements Command<Void> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String deploymentId;
+ protected String resourceName;
+ protected byte[] bytes;
+
+ public UpdateDeploymentResourceCmd(String deploymentId, String resourceName, InputStream inputStream) {
+ this.deploymentId = deploymentId;
+ this.resourceName = resourceName;
+ this.bytes = IoUtil.readBytes(inputStream);
+ }
+
+ public Void execute(Environment environment) throws Exception {
+ RepositorySession repositorySession = environment.get(RepositorySession.class);
+ repositorySession.updateDeploymentResource(deploymentId, resourceName, bytes);
+ return null;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/VariablesCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/VariablesCmd.java
new file mode 100644
index 0000000..e829f4c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/cmd/VariablesCmd.java
@@ -0,0 +1,69 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.cmd;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.client.ClientExecution;
+import org.jbpm.pvm.internal.session.DbSession;
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class VariablesCmd<T> extends AbstractCommand<T> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Map<String, ?> variables;
+ private Map<String, Object> internalMap;
+
+ public void addVariable(String key, Object variable) {
+ if (internalMap == null) {
+ if (variables != null) {
+ throw new JbpmException("variables were set externally");
+ }
+ variables = internalMap = new HashMap<String, Object>();
+ }
+ internalMap.put(key, variable);
+ }
+
+ public Map<String, ?> getVariables() {
+ return variables;
+ }
+
+ public void setVariables(Map<String, ?> variables) {
+ this.variables = variables;
+ }
+
+ protected ClientExecution getExecution(Environment environment, String executionId) {
+ DbSession dbSession = environment.get(DbSession.class);
+ ClientExecution execution = dbSession.findExecutionById(executionId);
+ if (execution == null) {
+ throw new JbpmException("execution " + executionId + " doesn't exist");
+ }
+ return execution;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/AddressFilter.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/AddressFilter.java
new file mode 100644
index 0000000..bcd7de4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/AddressFilter.java
@@ -0,0 +1,98 @@
+package org.jbpm.pvm.internal.email.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import javax.mail.Address;
+
+/**
+ * Allows filtering of to/cc/bcc recipient lists based on regular expressions for include and
+ * exclude patterns.
+ *
+ * @author Brad Davis
+ */
+public class AddressFilter {
+
+ /**
+ * patterns of addresses to be included. all addresses are included when omitted.
+ */
+ private List<Pattern> includePatterns;
+ /**
+ * patterns of addresses to be excluded. no addresses are excluded when omitted.
+ */
+ private List<Pattern> excludePatterns;
+
+ public Address[] filter(Address... addresses) {
+ List<Address> filteredAddresses = new ArrayList<Address>();
+ // Loop over for addresses to decide what to keep.
+ for (Address address : addresses) {
+ if (includeAddress(address) && !excludeAddress(address)) {
+ filteredAddresses.add(address);
+ }
+ }
+ return filteredAddresses.toArray(new Address[filteredAddresses.size()]);
+ }
+
+ /**
+ * Determines whether the given address is included, based on regular expressions.
+ *
+ * @param address email address to match against regex
+ * @return <code>false</code> if include patterns are present and the address does not match any
+ * pattern, <code>true</code> otherwise
+ */
+ protected boolean includeAddress(Address address) {
+ if (includePatterns == null || includePatterns.isEmpty()) return true;
+ for (Pattern pattern : includePatterns) {
+ if (pattern.matcher(address.toString()).matches()) return true;
+ }
+ return false;
+ }
+
+ /**
+ * Determines whether the given address is excluded, based on regular expressions.
+ *
+ * @param address email address to match against regex
+ * @return <code>true</code> if exclude patterns are present and the address matches a pattern,
+ * <code>false</code> otherwise
+ */
+ protected boolean excludeAddress(Address address) {
+ if (excludePatterns == null) return false;
+ for (Pattern pattern : excludePatterns) {
+ if (pattern.matcher(address.toString()).matches()) return true;
+ }
+ return false;
+ }
+
+ /**
+ * Gets the patterns of addresses to be included. All addresses are included when omitted.
+ */
+ public List<Pattern> getIncludePatterns() {
+ return includePatterns;
+ }
+
+ public void addIncludePattern(Pattern includePattern) {
+ if (includePatterns == null) includePatterns = new ArrayList<Pattern>();
+ includePatterns.add(includePattern);
+ }
+
+ protected void setIncludePatterns(List<Pattern> includePatterns) {
+ this.includePatterns = includePatterns;
+ }
+
+ /**
+ * Gets the patterns of addresses to be excluded. No addresses are excluded when omitted.
+ */
+ public List<Pattern> getExcludePatterns() {
+ return excludePatterns;
+ }
+
+ public void addExcludePattern(Pattern excludePattern) {
+ if (excludePatterns == null) excludePatterns = new ArrayList<Pattern>();
+ excludePatterns.add(excludePattern);
+ }
+
+ protected void setExcludePatterns(List<Pattern> excludePatterns) {
+ this.excludePatterns = excludePatterns;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/AddressTemplate.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/AddressTemplate.java
new file mode 100644
index 0000000..df1cac0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/AddressTemplate.java
@@ -0,0 +1,63 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.email.impl;
+
+import java.io.Serializable;
+
+/**
+ * Template for email addresses.
+ *
+ * @author Alejandro Guizar
+ */
+public class AddressTemplate implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private String addresses;
+ private String users;
+ private String groups;
+
+ public String getAddresses() {
+ return addresses;
+ }
+
+ public void setAddresses(String addresses) {
+ this.addresses = addresses;
+ }
+
+ public String getUsers() {
+ return users;
+ }
+
+ public void setUsers(String users) {
+ this.users = users;
+ }
+
+ public String getGroups() {
+ return groups;
+ }
+
+ public void setGroups(String groups) {
+ this.groups = groups;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/AttachmentTemplate.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/AttachmentTemplate.java
new file mode 100644
index 0000000..f3bcaaa
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/AttachmentTemplate.java
@@ -0,0 +1,79 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.email.impl;
+
+import java.io.Serializable;
+
+/**
+ * @author Alejandro Guizar
+ */
+public class AttachmentTemplate implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private String name;
+ private String description;
+ private String url;
+ private String resource;
+ private String file;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getResource() {
+ return resource;
+ }
+
+ public void setResource(String resource) {
+ this.resource = resource;
+ }
+
+ public String getFile() {
+ return file;
+ }
+
+ public void setFile(String file) {
+ this.file = file;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/DefaultAddressResolver.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/DefaultAddressResolver.java
new file mode 100644
index 0000000..81a9270
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/DefaultAddressResolver.java
@@ -0,0 +1,66 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.email.impl;
+
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+
+import javax.mail.Address;
+import javax.mail.internet.InternetAddress;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.identity.Group;
+import org.jbpm.api.identity.User;
+import org.jbpm.pvm.internal.email.spi.AddressResolver;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.identity.spi.IdentitySession;
+
+/**
+ * @author Alejandro Guizar
+ */
+public class DefaultAddressResolver implements AddressResolver {
+
+ public Address resolveAddress(User user) {
+ String givenName = user.getGivenName();
+ String familyName = user.getFamilyName();
+ String personal = givenName != null ? familyName != null ? givenName + ' ' + familyName
+ : givenName : familyName;
+ try {
+ return new InternetAddress(user.getBusinessEmail(), personal);
+ }
+ catch (UnsupportedEncodingException e) {
+ throw new JbpmException("invalid recipient name: " + personal);
+ }
+ }
+
+ public Address[] resolveAddresses(Group group) {
+ List<User> users = EnvironmentImpl.getFromCurrent(IdentitySession.class)
+ .findUsersByGroup(group.getId());
+ int userCount = users.size();
+ Address[] addresses = new Address[userCount];
+ for (int i = 0; i < userCount; i++) {
+ addresses[i] = resolveAddress(users.get(i));
+ }
+ return addresses;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailProducerImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailProducerImpl.java
new file mode 100644
index 0000000..07421a5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailProducerImpl.java
@@ -0,0 +1,412 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.email.impl;
+
+import java.io.File;
+import java.io.Serializable;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import javax.activation.DataHandler;
+import javax.activation.FileDataSource;
+import javax.mail.Address;
+import javax.mail.BodyPart;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.Multipart;
+import javax.mail.Session;
+import javax.mail.Message.RecipientType;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.identity.Group;
+import org.jbpm.api.identity.User;
+import org.jbpm.pvm.internal.email.spi.AddressResolver;
+import org.jbpm.pvm.internal.email.spi.MailProducer;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.identity.spi.IdentitySession;
+import org.jbpm.pvm.internal.script.ScriptManager;
+
+/**
+ * Default mail producer.
+ *
+ * @author Alejandro Guizar
+ */
+public class MailProducerImpl implements MailProducer, Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private MailTemplate template;
+
+ public MailTemplate getTemplate() {
+ return template;
+ }
+
+ public void setTemplate(MailTemplate template) {
+ this.template = template;
+ }
+
+ public Collection<Message> produce(Execution execution) {
+ Message email = instantiateEmail();
+ fillFrom(execution, email);
+ fillRecipients(execution, email);
+ fillSubject(execution, email);
+ fillContent(execution, email);
+ return Collections.singleton(email);
+ }
+
+ protected Message instantiateEmail() {
+ return new MimeMessage((Session) null);
+ }
+
+ /**
+ * Fills the <code>from</code> attribute of the given email. The sender addresses are an optional
+ * element in the mail template. If absent, each mail server supplies the current user's email
+ * address.
+ *
+ * @see {@link InternetAddress#getLocalAddress(Session)}
+ */
+ protected void fillFrom(Execution execution, Message email) {
+ AddressTemplate fromTemplate = template.getFrom();
+ // "from" attribute is optional
+ if (fromTemplate == null) return;
+
+ // resolve and parse addresses
+ String addresses = fromTemplate.getAddresses();
+ if (addresses != null) {
+ addresses = evaluateExpression(addresses, execution);
+ try {
+ email.addFrom(InternetAddress.parse(addresses));
+ }
+ catch (MessagingException e) {
+ throw new JbpmException("failed to add " + addresses + " to senders", e);
+ }
+ }
+
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ IdentitySession identitySession = environment.get(IdentitySession.class);
+ AddressResolver addressResolver = environment.get(AddressResolver.class);
+
+ // resolve and tokenize users
+ String userList = fromTemplate.getUsers();
+ if (userList != null) {
+ String[] userIds = tokenizeActors(userList, execution);
+ List<User> users = identitySession.findUsersById(userIds);
+ addSenders(resolveAddresses(users, addressResolver), email);
+ }
+
+ // resolve and tokenize groups
+ String groupList = fromTemplate.getGroups();
+ if (groupList != null) {
+ for (String groupId : tokenizeActors(groupList, execution)) {
+ Group group = identitySession.findGroupById(groupId);
+ addSenders(addressResolver.resolveAddresses(group), email);
+ }
+ }
+ }
+
+ private String evaluateExpression(String expression, Execution execution) {
+ ScriptManager scriptManager = EnvironmentImpl.getFromCurrent(ScriptManager.class);
+ Object value = scriptManager.evaluateExpression(expression, template.getLanguage());
+ if (!(value instanceof String)) {
+ throw new JbpmException("expected expression '"
+ + expression
+ + "' to return string, but was: "
+ + value);
+ }
+ return (String) value;
+ }
+
+ private String[] tokenizeActors(String recipients, Execution execution) {
+ String[] actors = evaluateExpression(recipients, execution).split("[,;|\\s]+");
+ if (actors.length == 0) throw new JbpmException("recipient list is empty: " + recipients);
+ return actors;
+ }
+
+ /** construct recipient addresses from user entities */
+ private Address[] resolveAddresses(List<User> users, AddressResolver addressResolver) {
+ int userCount = users.size();
+ Address[] addresses = new Address[userCount];
+ for (int i = 0; i < userCount; i++) {
+ addresses[i] = addressResolver.resolveAddress(users.get(i));
+ }
+ return addresses;
+ }
+
+ /** add senders to message */
+ private void addSenders(Address[] addresses, Message email) {
+ try {
+ email.addFrom(addresses);
+ }
+ catch (MessagingException e) {
+ throw new JbpmException("failed to add " + Arrays.toString(addresses) + " to senders", e);
+ }
+ }
+
+ protected void fillRecipients(Execution execution, Message email) {
+ // to
+ AddressTemplate to = template.getTo();
+ if (to != null) fillRecipients(to, execution, email, RecipientType.TO);
+
+ // cc
+ AddressTemplate cc = template.getCc();
+ if (cc != null) fillRecipients(cc, execution, email, RecipientType.CC);
+
+ // bcc
+ AddressTemplate bcc = template.getBcc();
+ if (bcc != null) fillRecipients(bcc, execution, email, RecipientType.BCC);
+ }
+
+ private void fillRecipients(AddressTemplate addressTemplate, Execution execution, Message email,
+ RecipientType recipientType) {
+ // resolve and parse addresses
+ String addresses = addressTemplate.getAddresses();
+ if (addresses != null) {
+ addresses = evaluateExpression(addresses, execution);
+ try {
+ email.addRecipients(recipientType, InternetAddress.parse(addresses));
+ }
+ catch (MessagingException e) {
+ throw new JbpmException("failed to add "
+ + addresses
+ + " to recipients of type "
+ + recipientType, e);
+ }
+ }
+
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ IdentitySession identitySession = environment.get(IdentitySession.class);
+ AddressResolver addressResolver = environment.get(AddressResolver.class);
+
+ // resolve and tokenize users
+ String userList = addressTemplate.getUsers();
+ if (userList != null) {
+ String[] userIds = tokenizeActors(userList, execution);
+ List<User> users = identitySession.findUsersById(userIds);
+ addRecipients(resolveAddresses(users, addressResolver), email, recipientType);
+ }
+
+ // resolve and tokenize groups
+ String groupList = addressTemplate.getGroups();
+ if (groupList != null) {
+ for (String groupId : tokenizeActors(groupList, execution)) {
+ Group group = identitySession.findGroupById(groupId);
+ addRecipients(addressResolver.resolveAddresses(group), email, recipientType);
+ }
+ }
+ }
+
+ /** add recipient addresses to message */
+ private void addRecipients(Address[] addresses, Message email, RecipientType recipientType) {
+ try {
+ email.addRecipients(recipientType, addresses);
+ }
+ catch (MessagingException e) {
+ throw new JbpmException("failed to add "
+ + Arrays.toString(addresses)
+ + " to recipients of type "
+ + recipientType, e);
+ }
+ }
+
+ protected void fillSubject(Execution execution, Message email) {
+ String subject = template.getSubject();
+ if (subject != null) {
+ subject = evaluateExpression(subject, execution);
+ try {
+ email.setSubject(subject);
+ }
+ catch (MessagingException e) {
+ throw new JbpmException("failed to set subject to " + subject, e);
+ }
+ }
+ }
+
+ protected void fillContent(Execution execution, Message email) {
+ String text = template.getText();
+ String html = template.getHtml();
+ List<AttachmentTemplate> attachmentTemplates = template.getAttachmentTemplates();
+
+ if (html != null || !attachmentTemplates.isEmpty()) {
+ // multipart
+ Multipart multipart = new MimeMultipart("related");
+
+ // text
+ if (text != null) {
+ BodyPart textPart = new MimeBodyPart();
+ text = evaluateExpression(text, execution);
+ try {
+ textPart.setText(text);
+ multipart.addBodyPart(textPart);
+ }
+ catch (MessagingException e) {
+ throw new JbpmException("failed to add text content: " + text, e);
+ }
+ }
+
+ // html
+ if (html != null) {
+ BodyPart htmlPart = new MimeBodyPart();
+ html = evaluateExpression(html, execution);
+ try {
+ htmlPart.setContent(html, "text/html");
+ multipart.addBodyPart(htmlPart);
+ }
+ catch (MessagingException e) {
+ throw new JbpmException("failed to add html content: " + html, e);
+ }
+ }
+
+ // attachments
+ if (!attachmentTemplates.isEmpty()) {
+ addAttachments(execution, multipart);
+ }
+
+ try {
+ email.setContent(multipart);
+ }
+ catch (MessagingException e) {
+ throw new JbpmException("failed to set multipart content: " + multipart, e);
+ }
+ }
+ else if (text != null) {
+ // unipart
+ text = evaluateExpression(text, execution);
+ try {
+ email.setText(text);
+ }
+ catch (MessagingException e) {
+ throw new JbpmException("failed to add text content: " + text, e);
+ }
+ }
+ }
+
+ protected void addAttachments(Execution execution, Multipart multipart) {
+ for (AttachmentTemplate attachmentTemplate : template.getAttachmentTemplates()) {
+ BodyPart attachmentPart = new MimeBodyPart();
+
+ // resolve and set description
+ String description = attachmentTemplate.getDescription();
+ if (description != null) {
+ description = evaluateExpression(description, execution);
+ try {
+ attachmentPart.setDescription(description);
+ }
+ catch (MessagingException e) {
+ throw new JbpmException("failed to set attachment description: " + description, e);
+ }
+ }
+
+ // resolve name; if absent, it will be taken from file or url
+ String name = attachmentTemplate.getName();
+ if (name != null) {
+ name = evaluateExpression(name, execution);
+ }
+
+ // resolve and read file
+ String file = attachmentTemplate.getFile();
+ if (file != null) {
+ File targetFile = new File(evaluateExpression(file, execution));
+ if (!targetFile.isFile()) {
+ throw new JbpmException("could not read attachment content, file not found: "
+ + targetFile);
+ }
+ // set content from target file
+ try {
+ attachmentPart.setDataHandler(new DataHandler(new FileDataSource(targetFile)));
+ // extract attachment name from file
+ if (name == null) {
+ name = targetFile.getName();
+ }
+ }
+ catch (MessagingException e) {
+ throw new JbpmException("failed to add attachment content: " + targetFile, e);
+ }
+ }
+ else {
+ URL targetUrl;
+ // resolve and read external url
+ String url = attachmentTemplate.getUrl();
+ if (url != null) {
+ try {
+ url = evaluateExpression(url, execution);
+ targetUrl = new URL(url);
+ }
+ catch (MalformedURLException e) {
+ throw new JbpmException("could not read attachment content, malformed url: " + url, e);
+ }
+ }
+ // resolve and read classpath resource
+ else {
+ String resource = evaluateExpression(attachmentTemplate.getResource(), execution);
+ targetUrl = EnvironmentImpl.getCurrent().getClassLoader().getResource(resource);
+ if (targetUrl == null) {
+ throw new JbpmException("could not read attachment content, resource not found: "
+ + resource);
+ }
+ }
+ // set content from url
+ try {
+ attachmentPart.setDataHandler(new DataHandler(targetUrl));
+ // extract attachment name from target url
+ if (name == null) {
+ name = extractResourceName(targetUrl);
+ }
+ }
+ catch (MessagingException e) {
+ throw new JbpmException("failed to add attachment content: " + targetUrl, e);
+ }
+ }
+
+ // set name, must be resolved at this point
+ try {
+ attachmentPart.setFileName(name);
+ }
+ catch (MessagingException e) {
+ throw new JbpmException("failed to set attachment name: " + name, e);
+ }
+
+ try {
+ multipart.addBodyPart(attachmentPart);
+ }
+ catch (MessagingException e) {
+ throw new JbpmException("failed to add attachment part: " + attachmentPart, e);
+ }
+ }
+ }
+
+ private static String extractResourceName(URL url) {
+ String path = url.getPath();
+ if (path == null || path.length() == 0) return null;
+
+ int sepIndex = path.lastIndexOf('/');
+ return sepIndex != -1 ? path.substring(sepIndex) : null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailServer.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailServer.java
new file mode 100644
index 0000000..88092e5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailServer.java
@@ -0,0 +1,46 @@
+package org.jbpm.pvm.internal.email.impl;
+
+import java.util.Properties;
+
+import javax.mail.Authenticator;
+import javax.mail.Session;
+
+/**
+ * Settings for establishing a session with a mail server.
+ *
+ * @author Brad Davis
+ */
+public class MailServer {
+
+ private AddressFilter addressFilter;
+ private Properties sessionProperties;
+ private Authenticator authenticator;
+
+ public AddressFilter getAddressFilter() {
+ return addressFilter;
+ }
+
+ protected void setAddressFilter(AddressFilter filter) {
+ this.addressFilter = filter;
+ }
+
+ public Properties getSessionProperties() {
+ return sessionProperties;
+ }
+
+ protected void setSessionProperties(Properties sessionProperties) {
+ this.sessionProperties = sessionProperties;
+ }
+
+ public Authenticator getAuthenticator() {
+ return authenticator;
+ }
+
+ protected void setAuthenticator(Authenticator authenticator) {
+ this.authenticator = authenticator;
+ }
+
+ public Session getMailSession() {
+ return Session.getDefaultInstance(sessionProperties, authenticator);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailSessionImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailSessionImpl.java
new file mode 100644
index 0000000..0f4a0c4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailSessionImpl.java
@@ -0,0 +1,73 @@
+package org.jbpm.pvm.internal.email.impl;
+
+import java.util.Collection;
+import java.util.List;
+
+import javax.mail.Address;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.Message.RecipientType;
+import javax.mail.internet.InternetAddress;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.email.spi.MailSession;
+
+public class MailSessionImpl implements MailSession {
+
+ private List<MailServer> mailServers;
+
+ public void send(Collection<Message> emails) {
+ // Emails need to have the sessions populated.
+ for (Message email : emails) {
+ try {
+ Address[] to = email.getRecipients(RecipientType.TO);
+ Address[] cc = email.getRecipients(RecipientType.CC);
+ Address[] bcc = email.getRecipients(RecipientType.BCC);
+
+ for (MailServer mailServer : mailServers) {
+ // Need to apply filter.
+ AddressFilter addressFilter = mailServer.getAddressFilter();
+ if (addressFilter != null) {
+ // Set the email with the new filtered addresses.
+ email.setRecipients(RecipientType.TO, addressFilter.filter(to));
+ email.setRecipients(RecipientType.CC, addressFilter.filter(cc));
+ email.setRecipients(RecipientType.BCC, addressFilter.filter(bcc));
+ }
+
+ // if sender is not present, use local address
+ Session mailSession = mailServer.getMailSession();
+ if (email.getFrom() == null) {
+ email.setFrom(InternetAddress.getLocalAddress(mailSession));
+ }
+
+ // If there is someone to send it to, then send it.
+ Address[] recipients = email.getAllRecipients();
+ if (recipients.length > 0) {
+ Transport transport = mailSession.getTransport(recipients[0]);
+ try {
+ transport.connect();
+ transport.sendMessage(email, recipients);
+ }
+ finally {
+ transport.close();
+ }
+ }
+ }
+ }
+ catch (MessagingException e) {
+ throw new JbpmException("could not send email: " + email, e);
+ }
+ }
+ }
+
+ public List<MailServer> getMailServers() {
+ return mailServers;
+ }
+
+ protected void setMailServers(List<MailServer> mailServers) {
+ this.mailServers = mailServers;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailTemplate.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailTemplate.java
new file mode 100644
index 0000000..6a50fa4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailTemplate.java
@@ -0,0 +1,132 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.email.impl;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.mail.Message.RecipientType;
+
+/**
+ * Template for electronic mail, complete with recipients, subject, content and attachments.
+ *
+ * @author Alejandro Guizar
+ */
+public class MailTemplate implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private String language;
+ private AddressTemplate from;
+ private Map<RecipientType, AddressTemplate> recipientTemplates =
+ new HashMap<RecipientType, AddressTemplate>();
+ private String subject;
+ private String text;
+ private String html;
+ private List<AttachmentTemplate> attachmentTemplates = new ArrayList<AttachmentTemplate>();
+
+ /**
+ * Templating engine meant to produce dynamic content.
+ */
+ public String getLanguage() {
+ return language;
+ }
+
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+
+ public AddressTemplate getFrom() {
+ return from;
+ }
+
+ public void setFrom(AddressTemplate from) {
+ this.from = from;
+ }
+
+ public AddressTemplate getRecipientTemplate(RecipientType recipientType) {
+ return recipientTemplates.get(recipientType);
+ }
+
+ public void setRecipientTemplate(RecipientType recipientType, AddressTemplate recipientTemplate) {
+ recipientTemplates.put(recipientType, recipientTemplate);
+ }
+
+ public AddressTemplate getTo() {
+ return getRecipientTemplate(RecipientType.TO);
+ }
+
+ public void setTo(AddressTemplate to) {
+ setRecipientTemplate(RecipientType.TO, to);
+ }
+
+ public AddressTemplate getCc() {
+ return getRecipientTemplate(RecipientType.CC);
+ }
+
+ public void setCc(AddressTemplate cc) {
+ setRecipientTemplate(RecipientType.CC, cc);
+ }
+
+ public AddressTemplate getBcc() {
+ return getRecipientTemplate(RecipientType.BCC);
+ }
+
+ public void setBcc(AddressTemplate bcc) {
+ setRecipientTemplate(RecipientType.BCC, bcc);
+ }
+
+ public String getSubject() {
+ return subject;
+ }
+
+ public void setSubject(String subject) {
+ this.subject = subject;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public String getHtml() {
+ return html;
+ }
+
+ public void setHtml(String html) {
+ this.html = html;
+ }
+
+ public List<AttachmentTemplate> getAttachmentTemplates() {
+ return attachmentTemplates;
+ }
+
+ public void addAttachmentTemplate(AttachmentTemplate attachmentTemplate) {
+ attachmentTemplates.add(attachmentTemplate);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailTemplateRegistry.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailTemplateRegistry.java
new file mode 100644
index 0000000..2b669ef
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/impl/MailTemplateRegistry.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.email.impl;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Tom Baeyens
+ */
+public class MailTemplateRegistry implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ Map<String, MailTemplate> templates = new HashMap<String, MailTemplate>();
+
+ public void addTemplate(String templateName, MailTemplate template) {
+ templates.put(templateName, template);
+ }
+
+ public MailTemplate getTemplate(String templateName) {
+ return templates.get(templateName);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/spi/AddressResolver.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/spi/AddressResolver.java
new file mode 100644
index 0000000..9753668
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/spi/AddressResolver.java
@@ -0,0 +1,37 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.email.spi;
+
+import javax.mail.Address;
+
+import org.jbpm.api.identity.Group;
+import org.jbpm.api.identity.User;
+
+/**
+ * @author Alejandro Guizar
+ */
+public interface AddressResolver {
+
+ Address resolveAddress(User user);
+
+ Address[] resolveAddresses(Group group);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/spi/MailProducer.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/spi/MailProducer.java
new file mode 100644
index 0000000..2d5d37b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/spi/MailProducer.java
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.email.spi;
+
+import java.util.Collection;
+
+import javax.mail.Message;
+
+import org.jbpm.api.Execution;
+
+/**
+ * Pluggable control object for creating email messages from templates.
+ *
+ * @author Brad Davis
+ * @author Alejandro Guizar
+ */
+public interface MailProducer {
+
+ Collection<Message> produce(Execution execution);
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/spi/MailSession.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/spi/MailSession.java
new file mode 100644
index 0000000..49eaa28
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/email/spi/MailSession.java
@@ -0,0 +1,16 @@
+package org.jbpm.pvm.internal.email.spi;
+
+import java.util.Collection;
+
+import javax.mail.Message;
+
+/**
+ * Pluggable control object for sending emails.
+ *
+ * @author Brad Davis
+ */
+public interface MailSession {
+
+ void send(Collection<Message> emails);
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/BasicEnvironment.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/BasicEnvironment.java
new file mode 100644
index 0000000..86f0b2e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/BasicEnvironment.java
@@ -0,0 +1,170 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.env;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.internal.log.Log;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class BasicEnvironment extends EnvironmentImpl {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Log log = Log.getLog(BasicEnvironment.class.getName());
+
+ protected String authenticatedUserId;
+ protected Map<String, Context> contexts;
+ protected ArrayList<String> defaultSearchOrderList;
+ protected String[] defaultSearchOrder;
+ protected Throwable exception;
+
+ protected transient ClassLoader classLoader;
+
+ public BasicEnvironment() {
+ contexts = new HashMap<String, Context>();
+ defaultSearchOrderList = new ArrayList<String>();
+ defaultSearchOrder = null;
+ }
+
+ // context methods ////////////////////////////////////////////////////////////
+
+ public Context getContext(String contextName) {
+ return contexts.get(contextName);
+ }
+
+ public void setContext(Context context) {
+ String key = context.getName();
+ if (contexts.put(key, context)==null) {
+ defaultSearchOrderList.add(key);
+ }
+ defaultSearchOrder = null;
+ }
+
+ public Context removeContext(Context context) {
+ return removeContext(context.getName());
+ }
+
+ public Context removeContext(String contextName) {
+ Context removedContext = contexts.remove(contextName);
+ if (removedContext!=null) {
+ defaultSearchOrderList.remove(contextName);
+ defaultSearchOrder = null;
+ }
+ return removedContext;
+ }
+
+ public Context getEnvironmentFactoryContext() {
+ return getContext(Context.CONTEXTNAME_PROCESS_ENGINE);
+ }
+
+ public Context getEnvironmentContext() {
+ return getContext(Context.CONTEXTNAME_TRANSACTION);
+ }
+
+ // authenticatedUserId //////////////////////////////////////////////////////
+
+ public String getAuthenticatedUserId() {
+ return authenticatedUserId;
+ }
+
+ public void setAuthenticatedUserId(String authenticatedUserId) {
+ this.authenticatedUserId = authenticatedUserId;
+ }
+
+ // classloader methods //////////////////////////////////////////////////////
+
+ public ClassLoader getClassLoader() {
+ return classLoader;
+ }
+
+ public void setClassLoader(ClassLoader classLoader) {
+ this.classLoader = classLoader;
+ }
+
+ // search methods ///////////////////////////////////////////////////////////
+
+ public Object get(String name) {
+ return get(name, null);
+ }
+
+ public Object get(String name, String[] searchOrder) {
+ if (searchOrder==null) {
+ searchOrder = getDefaultSearchOrder();
+ }
+ for (int i=0; i<searchOrder.length; i++){
+ Context context = contexts.get(searchOrder[i]);
+ if (context.has(name)) {
+ return context.get(name);
+ }
+ }
+ return null;
+ }
+
+ public <T> T get(Class<T> type) {
+ return get(type, null);
+ }
+
+ public <T> T get(Class<T> type, String[] searchOrder) {
+ if (searchOrder==null) {
+ searchOrder = getDefaultSearchOrder();
+ }
+ for (int i=0; i<searchOrder.length; i++){
+ Context context = contexts.get(searchOrder[i]);
+ T o = context.get(type);
+ if (o!=null) {
+ return o;
+ }
+ }
+ return null;
+ }
+
+ // close ////////////////////////////////////////////////////////////////////
+
+ public void close() {
+ log.trace("closing "+this);
+
+ EnvironmentImpl popped = EnvironmentImpl.popEnvironment();
+ if (this!=popped) {
+ throw new JbpmException("environment nesting problem");
+ }
+ }
+
+ // private methods //////////////////////////////////////////////////////////
+
+ protected String[] getDefaultSearchOrder() {
+ if (defaultSearchOrder==null) {
+ int size = defaultSearchOrderList.size();
+ defaultSearchOrder = (String[]) new String[size];
+ for (int i=0; i<size; i++) {
+ defaultSearchOrder[i] = defaultSearchOrderList.get(size-1-i);
+ }
+ }
+ return defaultSearchOrder;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/Context.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/Context.java
new file mode 100644
index 0000000..e2ab8bb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/Context.java
@@ -0,0 +1,57 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.env;
+
+import java.util.Set;
+
+/**
+ * a group of named objects in an {@link EnvironmentImpl} that have a similar lifespan.
+ *
+ * @author Tom Baeyens
+ */
+public interface Context {
+
+ /** key of the process-engine-context in the environment */
+ String CONTEXTNAME_PROCESS_ENGINE = "process-engine";
+
+ /** key of the transaction-context in the environment */
+ String CONTEXTNAME_TRANSACTION = "transaction";
+
+ /** key of the execution-context in the environment */
+ String CONTEXTNAME_EXECUTION = "execution";
+
+ /** key of the task-context in the environment */
+ String CONTEXTNAME_TASK = "task";
+
+ /** key of the job-context in the environment */
+ String CONTEXTNAME_JOB = "job";
+
+ String getName();
+
+ Object get(String key);
+ <T> T get(Class<T> type);
+
+ boolean has(String key);
+ Object set(String key, Object value);
+ Set<String> keys();
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/EnvironmentFactory.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/EnvironmentFactory.java
new file mode 100644
index 0000000..78d8d9c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/EnvironmentFactory.java
@@ -0,0 +1,66 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.env;
+
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.List;
+
+import org.xml.sax.InputSource;
+
+/**
+ * factory for {@link EnvironmentImpl}s.
+ *
+ * <p>Default implementation is
+ * {@link PvmEnvironmentFactory}. EnvironmentFactory is thread safe, you
+ * should use one environment factory for all your threads.
+ * </p>
+ *
+ * <p>Easiest way to obtain an EnvironmentFactory is with
+ * <ul>
+ * <li>{@link #parseResource(String)}</li>
+ * <li>{@link #parseInputStream(InputStream)}</li>
+ * <li>{@link #parseInputSource(InputSource)}</li>
+ * <li>{@link #parseXmlString(String)}</li>
+ * </ul>
+ * </p>
+ *
+ * <p>For the default parser's XML schema, see {@link PvmEnvironmentFactoryParser}.</p>
+ *
+ * @author Tom Baeyens
+ */
+public interface EnvironmentFactory extends Context, Serializable {
+
+ /**
+ * open a new EnvironmentImpl. The client is responsible for
+ * closing the environment with {@link EnvironmentImpl#close()}.
+ */
+ EnvironmentImpl openEnvironment();
+
+ /**
+ * closes this environment factory and cleans any allocated
+ * resources.
+ */
+ void close();
+
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/EnvironmentImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/EnvironmentImpl.java
new file mode 100644
index 0000000..88cd1b8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/EnvironmentImpl.java
@@ -0,0 +1,270 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.env;
+
+import java.io.Serializable;
+import java.util.Stack;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+
+
+/**
+ * maintains contextual information for a thread in a set of
+ * {@link Context}s.
+ *
+ * <h3>Introduction</h3>
+ *
+ * <p>Objects have different lifecycles and different context's (aka scopes). An
+ * environment provides the structure to easily manage objects with different
+ * contexts.
+ * </p>
+ *
+ * <p>Examples of contexts are:
+ * <ul>
+ * <li><b>process-engine</b>: The process-engine context is used to store e.g. data sources,
+ * session factories and other static resources needed by an application.
+ * The process-engine context lives for the complete duration of the {@link EnvironmentFactory}.
+ * So if the {@link EnvironmentFactory} is maintained in a static member field, the
+ * process-engine context lives for the duration of the application.
+ * The same process-engine context is shared for all the Environments produced by one
+ * EnvironmentFactory.</li>
+ * <li><b>environment</b>: The environment context is used for e.g. a transaction
+ * and transactional resources, user authentication. This results in an efficient and
+ * configurable use of transactional resources that need to be lazily initialized.</li>
+ * <li>The environment can accomodate other contexts as well. They can be added
+ * and removed dynamically. Examples of other potential contexts are web-request, web-session,
+ * web-application, business processDefinition, jobImpl, ... </li>
+ * </ul>
+ *
+ * <center><img src="environment.gif"/></center>
+ *
+ * <p>An environment is typically installed like this
+ * </p>
+ *
+ * <b><pre>static EnvironmentFactory environmentFactory = new DefaultEnvironmentFactory();
+ *
+ * ...
+ *
+ * EnvironmentImpl environment = environmentFactory.openEnvironment();
+ * try {
+ *
+ * ... everything available in this block ...
+ *
+ * } finally {
+ * environment.close();
+ * }
+ * </pre></b>
+ *
+ * <h3>Purpose</h3>
+ *
+ * <p>The first purpose of the environment is to separate the application from the
+ * environment. Standard Java and Enterprise Java are quite different and an environment
+ * abstraction like this allows for the development of applications that can run in
+ * both Standard and Enterprise environments. Also test environments are easier to
+ * tweak this way.
+ * </p>
+ *
+ * <p>A second purpose of the environment is to enable specific to global searching
+ * of resources. E.g. you could search for an 'adminEmailAddress' in the contexts
+ * 'execution', 'transaction' and 'process-engine' in the given order.
+ * That way, a global adminEmailAddress can be specified in the process-engine context
+ * and it can be refined in more specific contexts.
+ * </p>
+ *
+ * <h3>Search order</h3>
+ *
+ * <p>To find an object in the environment, a searchOrder can be specified. A
+ * search order is an sequence that specifies the order in which the contexts should
+ * be searched.
+ * </p>
+ *
+ * <p>The default search order is the inverse sequence of how the contexts are
+ * added to the environment. This is because in general, we can assume that the
+ * more recent a context was added, the more specific it is.
+ * </p>
+ *
+ * <h3>Transaction, username and classloader</h3>
+ *
+ * <p>Three objects are used so frequently in an environment that they get
+ * special treatment:
+ * </p>
+ *
+ * <ul>
+ * <li><b>Transaction</b>: an abstraction for marking a transaction with
+ * setRollbackOnly.</li>
+ * <li><b>Classloader</b>: the current class loader.</li>
+ * <li><b>Username</b>: the name of the currently authenticated user.</li>
+ * </ul>
+ *
+ * <p>For these special properties, setters are also available. That is to support
+ * programmatic injection into the environment. Alternatively, they can be configured
+ * in one of the contexts.
+ * </p>
+ *
+ *
+ * @see EnvironmentFactory
+ * @author Tom Baeyens
+ */
+public abstract class EnvironmentImpl implements Serializable, Environment {
+
+ /**
+ * searches a named object in all the contexts in the default search order.
+ * @return the object if it exists in the environment, <code>null</code> if there is no object with the given name in the environment.
+ */
+ public abstract Object get(String name);
+
+ /**
+ * searches a named object in all the contexts in the given search order. The given
+ * search order doesn't have to include all contexts. It can be a subset of the
+ * contexts available.
+ * @param searchOrder list of contexts names. The object will be searched in these contexts, in the given order.
+ * @return the object if it exists in the environment, <code>null</code> if there is no object with the given name in the specified searchOrder contexts.
+ */
+ public abstract Object get(String name, String[] searchOrder);
+
+ /** searches an object based on type. The search doesn take superclasses of the context elements
+ * into account.
+ * @return the first object of the given type or null in case no such element was found.
+ */
+ public abstract <T> T get(Class<T> type);
+
+
+ /** searches an object based on type. The search doesn take superclasses of the context elements
+ * into account.
+ * @return the first object of the given type or null in case no such element was found.
+ */
+ public abstract <T> T get(Class<T> type, String[] searchOrder);
+
+ /** get the authenticated user id */
+ public abstract String getAuthenticatedUserId();
+
+ /** set the authenticated user id */
+ public abstract void setAuthenticatedUserId(String authenticatedUserId);
+
+ /**
+ * closes the EnvironmentImpl by removing all its contexts.
+ */
+ public abstract void close();
+
+ public abstract Context getContext(String contextName);
+ public abstract void setContext(Context context);
+ public abstract Context removeContext(Context context);
+ public abstract Context removeContext(String contextName);
+
+ public abstract ClassLoader getClassLoader();
+ public abstract void setClassLoader(ClassLoader classLoader);
+
+ // current environment //////////////////////////////////////////////////////
+ /** the current environment is maintained in the currentEnvironment thread local */
+ static ThreadLocal<EnvironmentImpl> currentEnvironment = new ThreadLocal<EnvironmentImpl>();
+
+ /** in case of nested environments, the current environment stack maintains the outer environments */
+ static ThreadLocal<Stack<EnvironmentImpl>> currentEnvironmentStack = new ThreadLocal<Stack<EnvironmentImpl>>();
+
+ /** gets the most inner open environment. */
+ public static EnvironmentImpl getCurrent() {
+ return currentEnvironment.get();
+ }
+
+ public static <T> T getFromCurrent(Class<T> type) {
+ return getFromCurrent(type, true);
+ }
+
+ public static <T> T getFromCurrent(Class<T> type, boolean required) {
+ EnvironmentImpl environment = getCurrent();
+ if (environment==null) {
+ if (required) {
+ throw new JbpmException("no environment to get "+type.getName());
+ }
+ return null;
+ }
+ T object = environment.get(type);
+ if (object==null) {
+ if (required) {
+ throw new JbpmException("no "+type.getName()+" in current environment");
+ }
+ return null;
+ }
+ return object;
+ }
+
+ public static Object getFromCurrent(String name) {
+ return getFromCurrent(name, true);
+ }
+
+ public static Object getFromCurrent(String name, boolean required) {
+ EnvironmentImpl environment = getCurrent();
+ if (environment==null) {
+ if (required) {
+ throw new JbpmException("no environment to get '"+name+"'");
+ }
+ return null;
+ }
+ Object object = environment.get(name);
+ if (object==null) {
+ if (required) {
+ throw new JbpmException("no '"+name+"' in current environment");
+ }
+ return null;
+ }
+ return object;
+ }
+
+ static Stack<EnvironmentImpl> getStack() {
+ // lazy initialize the current environment stack
+ Stack<EnvironmentImpl> stack = currentEnvironmentStack.get();
+ if (stack==null) {
+ stack = new Stack<EnvironmentImpl>();
+ currentEnvironmentStack.set(stack);
+ }
+ return stack;
+ }
+
+
+ /** pops the closing context from the stack of current contexts. This
+ * is the first thing that needs to be done when an environment is closed.
+ * @see EnvironmentFactory#push(EnvironmentImpl) */
+ public static synchronized EnvironmentImpl popEnvironment() {
+ EnvironmentImpl popped = currentEnvironment.get();
+ currentEnvironment.set(null);
+ Stack<EnvironmentImpl> stack = currentEnvironmentStack.get();
+ if ( (stack!=null)
+ && (! stack.isEmpty())
+ ) {
+ currentEnvironment.set(stack.pop());
+ }
+ return popped;
+ }
+
+ /** after opening of a new environment succeeded, the environment
+ * must be pushed in the stack of current environments.
+ *
+ * @see EnvironmentImpl#pop() */
+ public static synchronized void pushEnvironment(EnvironmentImpl environment) {
+ EnvironmentImpl current = currentEnvironment.get();
+ if (current!=null) {
+ getStack().push(current);
+ }
+ currentEnvironment.set(environment);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/ExecutionContext.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/ExecutionContext.java
new file mode 100644
index 0000000..dc06339
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/ExecutionContext.java
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.env;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+
+public class ExecutionContext implements Context {
+
+ protected ExecutionImpl execution;
+
+ public String getName() {
+ return CONTEXTNAME_EXECUTION;
+ }
+
+ public ExecutionContext(ExecutionImpl execution) {
+ this.execution = execution;
+ }
+
+ public Object get(String key) {
+ if (CONTEXTNAME_EXECUTION.equals(key)) {
+ return execution;
+ }
+ return execution.getVariable(key);
+ }
+
+ public boolean has(String key) {
+ if (CONTEXTNAME_EXECUTION.equals(key)) {
+ return true;
+ }
+ return execution.hasVariable(key);
+ }
+
+ public Set<String> keys() {
+ Set<String> keys = new HashSet<String>(execution.getVariableKeys());
+ keys.add(CONTEXTNAME_EXECUTION);
+ return keys;
+ }
+
+ public Object set(String key, Object value) {
+ if (CONTEXTNAME_EXECUTION.equals(key)) {
+ throw new JbpmException("can't set execution");
+ }
+ execution.setVariable(key, value);
+ return null;
+ }
+
+ public <T> T get(Class<T> type) {
+ if (Execution.class.isAssignableFrom(type.getClass())) {
+ return (T) execution;
+ }
+ return null;
+ }
+
+ public ExecutionImpl getExecution() {
+ return execution;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/JobContext.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/JobContext.java
new file mode 100644
index 0000000..ea7ae74
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/JobContext.java
@@ -0,0 +1,77 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.env;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jbpm.api.job.Job;
+import org.jbpm.pvm.internal.job.JobImpl;
+
+public class JobContext implements Context {
+
+ private static final String KEY_JOB = "job";
+
+ static final Set<String> keys = Collections.unmodifiableSet(getKeys());
+ static Set<String> getKeys() {
+ Set<String> keys = new HashSet<String>();
+ keys.add(KEY_JOB);
+ return keys;
+ }
+
+ JobImpl<?> job;
+
+ public JobContext(JobImpl<?> job) {
+ this.job = job;
+ }
+
+ public Object get(String key) {
+ if (KEY_JOB.equals(key)) {
+ return job;
+ }
+ return null;
+ }
+
+ public boolean has(String key) {
+ return KEY_JOB.equals(key);
+ }
+
+ public Set<String> keys() {
+ return keys;
+ }
+
+ public Object set(String key, Object value) {
+ throw new UnsupportedOperationException("set is not supported on "+JobContext.class.getName());
+ }
+
+ public <T> T get(Class<T> type) {
+ if (Job.class.isAssignableFrom(type)) {
+ return (T) job;
+ }
+ return null;
+ }
+
+ public String getName() {
+ return Context.CONTEXTNAME_JOB;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/PvmEnvironment.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/PvmEnvironment.java
new file mode 100644
index 0000000..4367545
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/PvmEnvironment.java
@@ -0,0 +1,56 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.env;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.processengine.ProcessEngineImpl;
+import org.jbpm.pvm.internal.util.Closable;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class PvmEnvironment extends BasicEnvironment {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Log log = Log.getLog(PvmEnvironment.class.getName());
+
+ protected ProcessEngineImpl processEngineImpl;
+
+ public PvmEnvironment(ProcessEngineImpl processEngineImpl) {
+ this.processEngineImpl = processEngineImpl;
+ }
+
+ public String toString() {
+ return "PvmEnvironment["+System.identityHashCode(this)+"]";
+ }
+ public void close() {
+ Context context = getEnvironmentContext();
+ if (context instanceof Closable) {
+ ((Closable)context).close();
+ }
+ super.close();
+ if (log.isTraceEnabled()) log.trace("closed "+this);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/TaskContext.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/TaskContext.java
new file mode 100644
index 0000000..ca6b98f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/TaskContext.java
@@ -0,0 +1,83 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.env;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jbpm.api.job.Job;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskContext implements Context {
+
+ private static final String KEY_TASK = "task";
+
+ static final Set<String> keys = Collections.unmodifiableSet(getKeys());
+
+ static Set<String> getKeys() {
+ Set<String> keys = new HashSet<String>();
+ keys.add(KEY_TASK);
+ return keys;
+ }
+
+ TaskImpl task;
+
+ public TaskContext(TaskImpl task) {
+ this.task = task;
+ }
+
+ public Object get(String key) {
+ if (KEY_TASK.equals(key)) {
+ return task;
+ }
+ return null;
+ }
+
+ public boolean has(String key) {
+ return KEY_TASK.equals(key);
+ }
+
+ public Set<String> keys() {
+ return keys;
+ }
+
+ public Object set(String key, Object value) {
+ task.setVariable(key, value);
+ return null;
+ }
+
+ public <T> T get(Class<T> type) {
+ if (Job.class.isAssignableFrom(type)) {
+ return (T) task;
+ }
+ return null;
+ }
+
+ public String getName() {
+ return Context.CONTEXTNAME_TASK;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/UserProvidedEnvironmentObject.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/UserProvidedEnvironmentObject.java
new file mode 100644
index 0000000..c904d9c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/UserProvidedEnvironmentObject.java
@@ -0,0 +1,62 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.env;
+
+import org.jbpm.api.JbpmException;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class UserProvidedEnvironmentObject {
+
+ protected String name;
+ protected Object object;
+ protected boolean isTypeExposed;
+
+ public UserProvidedEnvironmentObject(Object object) {
+ this(object, null, true);
+ }
+
+ public UserProvidedEnvironmentObject(Object object, String name) {
+ this(object, null, true);
+ }
+
+ public UserProvidedEnvironmentObject(Object object, String name, boolean isTypeExposed) {
+ if (object==null) {
+ throw new JbpmException("object is null");
+ }
+ this.object = object;
+ this.isTypeExposed = isTypeExposed;
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+ public Object getObject() {
+ return object;
+ }
+ public boolean isTypeExposed() {
+ return isTypeExposed;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/environment.gif b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/environment.gif
new file mode 100644
index 0000000..b48a98e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/environment.gif
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/package.html
new file mode 100644
index 0000000..f152e46
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/env/package.html
@@ -0,0 +1,2 @@
+<body>environment implementation classes.
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/hibernate/ConverterType.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/hibernate/ConverterType.java
new file mode 100644
index 0000000..949fb97
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/hibernate/ConverterType.java
@@ -0,0 +1,104 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.hibernate;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.hibernate.HibernateException;
+import org.hibernate.type.ImmutableType;
+import org.hibernate.usertype.ParameterizedType;
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.type.Converter;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ConverterType extends ImmutableType implements ParameterizedType {
+
+ private static final long serialVersionUID = 1L;
+ private static Map<Class<?>, String> converterNames = null;
+ private static Map<String, Converter> converters = null;
+
+ public Object fromStringValue(String arg0) throws HibernateException {
+ return null;
+ }
+
+ public Object get(ResultSet resultSet, String name) throws HibernateException, SQLException {
+ String converterName = resultSet.getString(name);
+ return converters.get(converterName);
+ }
+
+ public void set(PreparedStatement stmt, Object value, int index) throws HibernateException, SQLException {
+ String converterName = (value!=null ? converterNames.get(value.getClass()) : null);
+ stmt.setString(index, converterName);
+ }
+
+ public int sqlType() {
+ return Types.VARCHAR;
+ }
+
+ public String toString(Object arg0) throws HibernateException {
+ return null;
+ }
+
+ public String getName() {
+ return "converter";
+ }
+
+ public Class getReturnedClass() {
+ return Converter.class;
+ }
+
+ public void setParameterValues(Properties properties) {
+ converterNames = new HashMap<Class<?>, String>();
+ converters = new HashMap<String, Converter>();
+
+ for(Object key : properties.keySet()) {
+ String converterClassName = (String) key;
+ try {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ Class< ? > converterClass = null;
+ try {
+ converterClass = Class.forName(converterClassName, true, classLoader);
+ } catch (ClassNotFoundException e) {
+ // when running jBPM from ant, the context classloader is not set properly
+ // so the jBPM classloader is necessary as a fallback
+ classLoader = getClass().getClassLoader();
+ converterClass = Class.forName(converterClassName, true, classLoader);
+ }
+
+ String converterName = properties.getProperty(converterClassName);
+ converterNames.put(converterClass, converterName);
+ Converter converter = (Converter) converterClass.newInstance();
+ converters.put(converterName, converter);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't initialize converter type "+converterClassName, e);
+ }
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/hibernate/DbSessionImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/hibernate/DbSessionImpl.java
new file mode 100644
index 0000000..3f9e378
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/hibernate/DbSessionImpl.java
@@ -0,0 +1,470 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.hibernate;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+
+import org.hibernate.LockMode;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.metadata.ClassMetadata;
+import org.jbpm.api.Execution;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.ProcessDefinition;
+import org.jbpm.api.history.HistoryComment;
+import org.jbpm.api.history.HistoryProcessInstance;
+import org.jbpm.api.task.Task;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.client.ClientExecution;
+import org.jbpm.pvm.internal.client.ClientProcessDefinition;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.model.HistoryCommentImpl;
+import org.jbpm.pvm.internal.history.model.HistoryProcessInstanceImpl;
+import org.jbpm.pvm.internal.id.DbidGenerator;
+import org.jbpm.pvm.internal.job.JobImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.query.DeploymentQueryImpl;
+import org.jbpm.pvm.internal.query.HistoryActivityInstanceQueryImpl;
+import org.jbpm.pvm.internal.query.HistoryDetailQueryImpl;
+import org.jbpm.pvm.internal.query.HistoryProcessInstanceQueryImpl;
+import org.jbpm.pvm.internal.query.JobQueryImpl;
+import org.jbpm.pvm.internal.query.ProcessInstanceQueryImpl;
+import org.jbpm.pvm.internal.query.TaskQueryImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+import org.jbpm.pvm.internal.util.Clock;
+
+/**
+ * @author Tom Baeyens
+ */
+public class DbSessionImpl implements DbSession {
+
+ private static Log log = Log.getLog(DbSessionImpl.class.getName());
+
+ protected Session session;
+
+ public void close() {
+ session.close();
+ }
+
+ public <T> T get(Class<T> entityClass, Object primaryKey) {
+ return entityClass.cast(session.get(entityClass, (Serializable) primaryKey));
+ }
+
+ public void flush() {
+ session.flush();
+ }
+
+ public void forceVersionUpdate(Object entity) {
+ session.lock(entity, LockMode.FORCE);
+ }
+
+ public void lockPessimistically(Object entity) {
+ session.lock(entity, LockMode.UPGRADE);
+ }
+
+ public void save(Object entity) {
+ session.save(entity);
+ }
+
+ public void update(Object entity) {
+ session.update(entity);
+ }
+
+ public void merge(Object entity) {
+ session.merge(entity);
+ }
+
+ public void delete(Object entity) {
+ session.delete(entity);
+ }
+
+ public Session getSession() {
+ return session;
+ }
+
+ public void setSession(Session session) {
+ this.session = session;
+ }
+
+ public List<String> findProcessDefinitionKeys() {
+ return session.getNamedQuery("findProcessDefinitionKeys").list();
+ }
+
+ public ClientProcessDefinition findLatestProcessDefinitionByKey(String processDefinitionKey) {
+ Query query = session.getNamedQuery("findProcessDefinitionsByKey");
+ query.setString("key", processDefinitionKey);
+ query.setMaxResults(1);
+ ClientProcessDefinition processDefinition = (ClientProcessDefinition) query.uniqueResult();
+ return processDefinition;
+ }
+
+ public List<ClientProcessDefinition> findProcessDefinitionsByKey(String processDefinitionKey) {
+ Query query = session.getNamedQuery("findProcessDefinitionsByKey");
+ query.setString("key", processDefinitionKey);
+ return query.list();
+ }
+
+ public ClientProcessDefinition findProcessDefinitionById(String processDefinitionId) {
+ Query query = session.getNamedQuery("findProcessDefinitionById");
+ query.setString("id", processDefinitionId);
+ query.setMaxResults(1);
+ ClientProcessDefinition processDefinition = (ClientProcessDefinition) query.uniqueResult();
+ return processDefinition;
+ }
+
+ public void deleteProcessDefinition(String processDefinitionId, boolean deleteProcessInstances, boolean deleteHistory) {
+ List<String> processInstanceIds = findProcessInstanceIds(processDefinitionId);
+
+ if ( deleteHistory
+ // and if hibernate knows about the history class
+ && (isHistoryEnabled())
+ ) {
+ List<HistoryProcessInstance> historyProcessInstances = createHistoryProcessInstanceQuery()
+ .processDefinitionId(processDefinitionId)
+ .list();
+
+ for (HistoryProcessInstance historyProcessInstance : historyProcessInstances) {
+ session.delete(historyProcessInstance);
+ }
+ }
+
+ if (deleteProcessInstances) {
+ for (String processInstanceId : processInstanceIds) {
+ deleteProcessInstance(processInstanceId, deleteHistory);
+ }
+ } else {
+ if (processInstanceIds.size()>0) {
+ throw new JbpmException("still "+processInstanceIds.size()+" process instances for process definition "+processDefinitionId);
+ }
+ }
+
+ ProcessDefinition processDefinition = findProcessDefinitionById(processDefinitionId);
+ session.delete(processDefinition);
+ }
+
+ public void deleteProcessDefinitionHistory(String processDefinitionId) {
+ List<HistoryProcessInstanceImpl> historyProcessInstances =
+ session.createQuery(
+ "select hpi " +
+ "from "+HistoryProcessInstanceImpl.class.getName()+" hpi "+
+ "where hpi.processDefinitionId = :processDefinitionId "
+ )
+ .setString("processDefinitionId", processDefinitionId)
+ .list();
+
+ for (HistoryProcessInstanceImpl hpi: historyProcessInstances) {
+ session.delete(hpi);
+ }
+ }
+
+ public boolean isHistoryEnabled() {
+ ClassMetadata historyHibernateMetadata = session.getSessionFactory().getClassMetadata(HistoryProcessInstanceImpl.class);
+ return historyHibernateMetadata!=null;
+ }
+
+
+ // process execution queries ////////////////////////////////////////////////
+
+ public ClientExecution findExecutionById(String executionId) {
+ // query definition can be found at the bottom of resource jbpm.pvm.execution.hbm.xml
+ Query query = session.getNamedQuery("findExecutionById");
+ query.setString("id", executionId);
+ query.setMaxResults(1);
+ return (ClientExecution) query.uniqueResult();
+ }
+
+ public ClientExecution findProcessInstanceById(String processInstanceId) {
+ // query definition can be found at the bottom of resource jbpm.pvm.execution.hbm.xml
+ Query query = session.getNamedQuery("findProcessInstanceById");
+ query.setString("processInstanceId", processInstanceId);
+ query.setMaxResults(1);
+ return (ClientExecution) query.uniqueResult();
+ }
+
+ public ClientExecution findProcessInstanceByIdIgnoreSuspended(String processInstanceId) {
+ // query definition can be found at the bottom of resource jbpm.pvm.execution.hbm.xml
+ Query query = session.getNamedQuery("findProcessInstanceByIdIgnoreSuspended");
+ query.setString("processInstanceId", processInstanceId);
+ query.setMaxResults(1);
+ return (ClientExecution) query.uniqueResult();
+ }
+
+ public List<String> findProcessInstanceIds(String processDefinitionId) {
+ // query definition can be found at the bottom of resource jbpm.pvm.job.hbm.xml
+ Query query = session.createQuery(
+ "select processInstance.id " +
+ "from org.jbpm.pvm.internal.model.ExecutionImpl as processInstance " +
+ "where processInstance.processDefinitionId = :processDefinitionId " +
+ " and processInstance.parent is null"
+ );
+ query.setString("processDefinitionId", processDefinitionId);
+ return query.list();
+ }
+
+ public void deleteProcessInstance(String processInstanceId) {
+ deleteProcessInstance(processInstanceId, true);
+ }
+
+ public void deleteProcessInstance(String processInstanceId, boolean deleteHistory) {
+ if (processInstanceId==null) {
+ throw new JbpmException("processInstanceId is null");
+ }
+
+ // if history should be deleted
+ if ( deleteHistory
+ && (isHistoryEnabled())
+ ) {
+ // try to get the history
+ HistoryProcessInstanceImpl historyProcessInstance = findHistoryProcessInstanceById(processInstanceId);
+
+ // if there is a history process instance in the db
+ if (historyProcessInstance!=null) {
+ if (log.isDebugEnabled()) {
+ log.debug("deleting history process instance "+processInstanceId);
+ }
+ session.delete(historyProcessInstance);
+ }
+ }
+
+ ExecutionImpl processInstance = (ExecutionImpl) findProcessInstanceByIdIgnoreSuspended(processInstanceId);
+ if (processInstance!=null) {
+ deleteSubProcesses(processInstance, deleteHistory);
+
+ // delete remaining tasks for this process instance
+ List<TaskImpl> tasks = findTasks(processInstanceId);
+ for (TaskImpl task: tasks) {
+ session.delete(task);
+ }
+
+ // delete remaining jobs for this process instance
+ JobImpl currentJob = EnvironmentImpl.getFromCurrent(JobImpl.class, false);
+ List<JobImpl> jobs = findJobs(processInstanceId);
+ for (JobImpl job: jobs) {
+ if (job!=currentJob){
+ session.delete(job);
+ }
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug("deleting process instance "+processInstanceId);
+ }
+
+ session.delete(processInstance);
+ }
+ }
+
+ private void deleteSubProcesses(ExecutionImpl execution, boolean deleteHistory) {
+ ExecutionImpl subProcessInstance = execution.getSubProcessInstance();
+ if (subProcessInstance!=null) {
+ subProcessInstance.setSuperProcessExecution(null);
+ execution.setSubProcessInstance(null);
+ deleteProcessInstance(subProcessInstance.getId(), deleteHistory);
+ }
+ Collection<ExecutionImpl> childExecutions = execution.getExecutions();
+ if (childExecutions!=null) {
+ for (ExecutionImpl childExecution: childExecutions) {
+ deleteSubProcesses(childExecution, deleteHistory);
+ }
+ }
+ }
+
+ public HistoryProcessInstanceImpl findHistoryProcessInstanceById(String processInstanceId) {
+ return (HistoryProcessInstanceImpl) session
+ .createQuery(
+ "select hpi " +
+ "from "+HistoryProcessInstance.class.getName()+" as hpi " +
+ "where hpi.processInstanceId = '"+processInstanceId+"'"
+ ).uniqueResult();
+ }
+
+ List<TaskImpl> findTasks(String processInstanceId) {
+ Query query = session.createQuery(
+ "select task " +
+ "from "+TaskImpl.class.getName()+" as task " +
+ "where task.processInstance.id = :processInstanceId"
+ );
+ query.setString("processInstanceId", processInstanceId);
+ return query.list();
+ }
+
+ List<JobImpl> findJobs(String processInstanceId) {
+ Query query = session.createQuery(
+ "select job " +
+ "from "+JobImpl.class.getName()+" as job " +
+ "where job.processInstance.id = :processInstanceId"
+ );
+ query.setString("processInstanceId", processInstanceId);
+ return query.list();
+ }
+
+ public void cascadeExecutionSuspend(ExecutionImpl execution) {
+ // cascade suspend to jobs
+ Query query = session.createQuery(
+ "select job " +
+ "from "+JobImpl.class.getName()+" as job " +
+ "where job.execution = :execution " +
+ " and job.state != '"+JobImpl.STATE_SUSPENDED+"' "
+ );
+ query.setEntity("execution", execution);
+ List<JobImpl> jobs = query.list();
+ for (JobImpl job: jobs) {
+ job.suspend();
+ }
+
+ // cascade suspend to tasks
+ query = session.createQuery(
+ "select task " +
+ "from "+TaskImpl.class.getName()+" as task " +
+ "where task.execution = :execution " +
+ " and task.state != '"+Task.STATE_SUSPENDED+"' "
+ );
+ query.setEntity("execution", execution);
+ List<TaskImpl> tasks = query.list();
+ for (TaskImpl task: tasks) {
+ task.suspend();
+ }
+ }
+
+ public void cascadeExecutionResume(ExecutionImpl execution) {
+ // cascade suspend to jobs
+ Query query = session.createQuery(
+ "select job " +
+ "from "+JobImpl.class.getName()+" as job " +
+ "where job.execution = :execution " +
+ " and job.state = '"+Task.STATE_SUSPENDED+"' "
+ );
+ query.setEntity("execution", execution);
+ List<JobImpl> jobs = query.list();
+ for (JobImpl job: jobs) {
+ job.resume();
+ }
+
+ // cascade suspend to tasks
+ query = session.createQuery(
+ "select task " +
+ "from "+TaskImpl.class.getName()+" as task " +
+ "where task.execution = :execution " +
+ " and task.state = '"+Task.STATE_SUSPENDED+"' "
+ );
+ query.setEntity("execution", execution);
+ List<TaskImpl> tasks = query.list();
+ for (TaskImpl task: tasks) {
+ task.resume();
+ }
+ }
+
+ public TaskImpl createTask() {
+ TaskImpl task = newTask();
+ task.setCreateTime(Clock.getCurrentTime());
+ return task;
+ }
+
+ protected TaskImpl newTask() {
+ TaskImpl task = new TaskImpl();
+ long dbid = EnvironmentImpl.getFromCurrent(DbidGenerator.class).getNextId();
+ task.setDbid(dbid);
+ task.setNew(true);
+ return task;
+ }
+
+ public TaskImpl findTaskByDbid(long taskDbid) {
+ return (TaskImpl) session.get(TaskImpl.class, taskDbid);
+ }
+
+
+ public TaskImpl findTaskByExecution(Execution execution) {
+ Query query = session.createQuery(
+ "select task " +
+ "from "+TaskImpl.class.getName()+" as task " +
+ "where task.execution = :execution"
+ );
+ query.setEntity("execution", execution);
+ return (TaskImpl) query.uniqueResult();
+ }
+
+ public JobImpl<?> findFirstAcquirableJob() {
+ Query query = session.getNamedQuery("findFirstAcquirableJob");
+ query.setTimestamp("now", Clock.getCurrentTime());
+ query.setMaxResults(1);
+ return (JobImpl<?>) query.uniqueResult();
+ }
+
+ public List<JobImpl<?>> findExclusiveJobs(Execution processInstance) {
+ Query query = session.getNamedQuery("findExclusiveJobs");
+ query.setTimestamp("now", Clock.getCurrentTime());
+ query.setEntity("processInstance", processInstance);
+ return query.list();
+ }
+
+ public JobImpl<?> findFirstDueJob() {
+ Query query = session.getNamedQuery("findFirstDueJob");
+ query.setMaxResults(1);
+ return (JobImpl<?>) query.uniqueResult();
+ }
+
+ public ProcessInstanceQueryImpl createProcessInstanceQuery() {
+ return new ProcessInstanceQueryImpl();
+ }
+
+ public TaskQueryImpl createTaskQuery() {
+ return new TaskQueryImpl();
+ }
+
+ public HistoryProcessInstanceQueryImpl createHistoryProcessInstanceQuery() {
+ return new HistoryProcessInstanceQueryImpl();
+ }
+
+ public HistoryActivityInstanceQueryImpl createHistoryActivityInstanceQuery() {
+ return new HistoryActivityInstanceQueryImpl();
+ }
+
+ public HistoryDetailQueryImpl createHistoryDetailQuery() {
+ return new HistoryDetailQueryImpl();
+ }
+
+ public JobQueryImpl createJobQuery() {
+ return new JobQueryImpl();
+ }
+
+ public DeploymentQueryImpl createDeploymentQuery() {
+ return new DeploymentQueryImpl();
+ }
+
+ public List<HistoryComment> findCommentsByTaskId(String taskId) {
+ Long taskDbid = null;
+ try {
+ taskDbid = Long.parseLong(taskId);
+ } catch (Exception e) {
+ throw new JbpmException("invalid taskId: "+taskId);
+ }
+ return session.createQuery(
+ "select hc " +
+ "from "+HistoryCommentImpl.class.getName()+" as hc " +
+ "where hc.historyTask.dbid = :taskDbid " +
+ "order by hc.historyTaskIndex asc "
+ ).setLong("taskDbid", taskDbid)
+ .list();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/hibernate/ExecutionType.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/hibernate/ExecutionType.java
new file mode 100644
index 0000000..4124939
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/hibernate/ExecutionType.java
@@ -0,0 +1,136 @@
+package org.jbpm.pvm.internal.hibernate;
+
+import java.io.Serializable;
+import java.lang.reflect.Method;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Properties;
+
+import org.hibernate.HibernateException;
+import org.hibernate.usertype.ParameterizedType;
+import org.hibernate.usertype.UserType;
+import org.jbpm.api.Execution;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.util.ReflectUtil;
+
+public class ExecutionType implements UserType, ParameterizedType {
+
+ private static final long serialVersionUID = 1L;
+ private static final Log log = Log.getLog(ExecutionType.class.getName());
+
+ int[] sqlTypes = new int[]{Types.VARCHAR};
+
+ protected String processResource;
+ protected ProcessDefinitionImpl processDefinition;
+
+ public void setParameterValues(Properties properties) {
+ }
+
+ public int[] sqlTypes() {
+ return sqlTypes;
+ }
+
+ // JDBC - object translation
+
+ public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
+ ExecutionImpl execution = createExecution(owner);
+ String activityName = rs.getString(names[0]);
+ ActivityImpl activity = (ActivityImpl) execution.getProcessDefinition().getActivity(activityName);
+ execution.setActivity(activity);
+ execution.setState(Execution.STATE_ACTIVE_ROOT);
+ return execution;
+ }
+
+ private ExecutionImpl createExecution(Object owner) {
+ ExecutionImpl execution = new ExecutionImpl();
+ execution.setProcessDefinition(getProcessDefinition(owner));
+ return execution;
+ }
+
+ private synchronized ProcessDefinitionImpl getProcessDefinition(Object owner) {
+ if (processDefinition!=null) {
+ return processDefinition;
+ }
+ Class<?> ownerClass = owner.getClass();
+ try {
+ Method method = ownerClass.getDeclaredMethod("getProcessDefinition");
+ processDefinition = (ProcessDefinitionImpl) ReflectUtil.invoke(method, null, null);
+ } catch (Exception e) {
+ throw new RuntimeException("couldn't get process definition for "+owner, e);
+ }
+
+ return processDefinition;
+ }
+
+ public void nullSafeSet(PreparedStatement st, Object owner, int index) throws HibernateException, SQLException {
+ if (owner!=null) {
+ ExecutionImpl execution = (ExecutionImpl) owner;
+ String activityName = execution.getActivity().getName();
+ log.trace("binding 'execution-state{"+activityName+"}' to parameter: "+index);
+ st.setString(index, activityName);
+ }
+ }
+
+ // for dirty checking ?
+
+ public Object deepCopy(Object object) throws HibernateException {
+ if (object==null) {
+ return null;
+ }
+
+ ExecutionImpl original = (ExecutionImpl) object;
+
+ ActivityImpl activity = new ActivityImpl();
+ activity.setName(original.getActivity().getName());
+
+ ExecutionImpl copy = new ExecutionImpl();
+ copy.setActivity(activity);
+
+ return copy;
+ }
+
+ public boolean equals(Object arg0, Object arg1) throws HibernateException {
+ if ( (arg0==null) || (arg1==null)) return false;
+
+ ExecutionImpl execution0 = (ExecutionImpl) arg0;
+ ExecutionImpl execution1 = (ExecutionImpl) arg1;
+
+ String activityName0 = execution0.getActivity().getName();
+ String activityName1 = execution1.getActivity().getName();
+
+ return activityName0.equals(activityName1);
+ }
+
+ public int hashCode(Object object) throws HibernateException {
+ return object.hashCode();
+ }
+
+ public boolean isMutable() {
+ return true;
+ }
+
+ public Class<?> returnedClass() {
+ return Execution.class;
+ }
+
+ // merge functionality //////////////////////////////////////////////////////
+
+ public Object replace(Object arg0, Object arg1, Object arg2) throws HibernateException {
+ return null;
+ }
+
+ // serialization for cache //////////////////////////////////////////////////
+
+ public Object assemble(Serializable arg0, Object arg1) throws HibernateException {
+ return null;
+ }
+
+ public Serializable disassemble(Object arg0) throws HibernateException {
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistoryEvent.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistoryEvent.java
new file mode 100644
index 0000000..e36b9c6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistoryEvent.java
@@ -0,0 +1,66 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history;
+
+import java.io.Serializable;
+
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+
+/** base class for process logs. Process logs are dispatched to the
+ * {@link HistorySession} that is configured in the environment.
+ *
+ * <p>ProcessLogs that are send to a LogSession is the probe mechanism
+ * provided to listen into the process execution progress and details.
+ * It is the mechanism to collect process history and process statistics.
+ * </p>
+ *
+ * @author Tom Baeyens
+ */
+public abstract class HistoryEvent implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected ExecutionImpl execution;
+
+ public void setExecution(ExecutionImpl execution) {
+ this.execution = execution;
+ }
+
+ public abstract void process();
+
+ public static void fire(HistoryEvent historyEvent) {
+ fire(historyEvent, null);
+ }
+
+ public static void fire(HistoryEvent historyEvent, ExecutionImpl execution) {
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ if (environment!=null) {
+
+ HistorySession historySession = environment.get(HistorySession.class);
+ if (historySession!=null) {
+ historyEvent.setExecution(execution);
+ historySession.process(historyEvent);
+ }
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistorySession.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistorySession.java
new file mode 100644
index 0000000..8d1d76c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistorySession.java
@@ -0,0 +1,29 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history;
+
+
+public interface HistorySession {
+
+ void process(HistoryEvent historyEvent);
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistorySessionChain.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistorySessionChain.java
new file mode 100644
index 0000000..8f3aa66
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistorySessionChain.java
@@ -0,0 +1,46 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+
+/** log session that delegates to a delegate list of log sessions.
+ *
+ * @author Tom Baeyens
+ */
+public class HistorySessionChain implements HistorySession {
+
+ protected List<HistorySession> historySessions = new ArrayList<HistorySession>();
+
+ public HistorySessionChain(List<HistorySession> historySessions) {
+ this.historySessions = historySessions;
+ }
+
+ public void process(HistoryEvent historyEvent) {
+ for (HistorySession historySession: historySessions) {
+ historySession.process(historyEvent);
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistorySessionFilter.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistorySessionFilter.java
new file mode 100644
index 0000000..342d208
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistorySessionFilter.java
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history;
+
+
+
+/** filtering log session.
+ *
+ * @author Tom Baeyens
+ */
+public class HistorySessionFilter implements HistorySession {
+
+ protected HistorySession delegate;
+ protected String type;
+
+ public void process(HistoryEvent historyEvent) {
+ if (passes(historyEvent)){
+ delegate.process(historyEvent);
+ }
+ }
+
+ /** can be overwritten in case filtering needs to be more
+ * sophisticated then just type matching. */
+ protected boolean passes(HistoryEvent historyEvent) {
+ return true;
+ }
+
+ public void setDelegate(HistorySession delegate) {
+ this.delegate = delegate;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistorySessionImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistorySessionImpl.java
new file mode 100644
index 0000000..6c71eba
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/HistorySessionImpl.java
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistorySessionImpl implements HistorySession {
+
+ public void process(HistoryEvent historyEvent) {
+ historyEvent.process();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ActivityEnd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ActivityEnd.java
new file mode 100644
index 0000000..dd74c6f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ActivityEnd.java
@@ -0,0 +1,69 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.events;
+
+import org.hibernate.Session;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.model.HistoryActivityInstanceImpl;
+import org.jbpm.pvm.internal.util.Clock;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ActivityEnd extends HistoryEvent {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String transitionName;
+
+ public ActivityEnd() {
+ }
+
+ public ActivityEnd(String transitionName) {
+ this.transitionName = transitionName;
+ }
+
+ public void process() {
+ Session session = EnvironmentImpl.getFromCurrent(Session.class);
+ Long historyActivityInstanceDbId = execution.getHistoryActivityInstanceDbid();
+ HistoryActivityInstanceImpl historyActivityInstance = (HistoryActivityInstanceImpl)
+ session.load(getHistoryActivityInstanceClass(), historyActivityInstanceDbId);
+ updateHistoryActivityInstance(historyActivityInstance);
+ session.update(historyActivityInstance);
+ }
+
+ protected void updateHistoryActivityInstance(HistoryActivityInstanceImpl historyActivityInstance) {
+ historyActivityInstance.setEndTime(Clock.getCurrentTime());
+ historyActivityInstance.setTransitionName(transitionName);
+ }
+
+ protected Class<? extends HistoryActivityInstanceImpl> getHistoryActivityInstanceClass() {
+ return HistoryActivityInstanceImpl.class;
+ }
+
+ public String getTransitionName() {
+ return transitionName;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ActivityStart.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ActivityStart.java
new file mode 100644
index 0000000..4bc560a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ActivityStart.java
@@ -0,0 +1,61 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.events;
+
+import org.jbpm.api.history.HistoryProcessInstance;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.model.HistoryActivityInstanceImpl;
+import org.jbpm.pvm.internal.history.model.HistoryProcessInstanceImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ActivityStart extends HistoryEvent {
+
+ private static final long serialVersionUID = 1L;
+
+ public void process() {
+ DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class);
+
+ long processInstanceDbid = execution.getProcessInstance().getDbid();
+
+ HistoryProcessInstance historyProcessInstanceImpl = (HistoryProcessInstance)
+ dbSession.get(HistoryProcessInstanceImpl.class, processInstanceDbid);
+
+ HistoryActivityInstanceImpl historyActivityInstance =
+ createHistoryActivityInstance(historyProcessInstanceImpl);
+
+ String activityType = execution.getActivity().getType();
+ historyActivityInstance.setType(activityType);
+
+ dbSession.save(historyActivityInstance);
+
+ execution.setHistoryActivityInstanceDbid(historyActivityInstance.getDbid());
+ }
+
+ protected HistoryActivityInstanceImpl createHistoryActivityInstance(HistoryProcessInstance historyProcessInstanceImpl) {
+ return new HistoryActivityInstanceImpl(historyProcessInstanceImpl, execution);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/AutomaticEnd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/AutomaticEnd.java
new file mode 100644
index 0000000..5fa32a4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/AutomaticEnd.java
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.events;
+
+import org.jbpm.api.history.HistoryProcessInstance;
+import org.jbpm.pvm.internal.history.model.HistoryActivityInstanceImpl;
+import org.jbpm.pvm.internal.history.model.HistoryAutomaticInstanceImpl;
+
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class AutomaticEnd extends ActivityStart {
+
+ private static final long serialVersionUID = 1L;
+
+ protected HistoryActivityInstanceImpl createHistoryActivityInstance(HistoryProcessInstance historyProcessInstanceImpl) {
+ return new HistoryAutomaticInstanceImpl(historyProcessInstanceImpl, execution);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/DecisionEnd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/DecisionEnd.java
new file mode 100644
index 0000000..6b93c08
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/DecisionEnd.java
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.events;
+
+import org.jbpm.api.history.HistoryProcessInstance;
+import org.jbpm.pvm.internal.history.model.HistoryActivityInstanceImpl;
+import org.jbpm.pvm.internal.history.model.HistoryDecisionInstanceImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DecisionEnd extends AutomaticEnd {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String transitionName;
+
+ public DecisionEnd(String transitionName) {
+ this.transitionName = transitionName;
+ }
+
+ protected HistoryActivityInstanceImpl createHistoryActivityInstance(HistoryProcessInstance historyProcessInstanceImpl) {
+ return new HistoryDecisionInstanceImpl(historyProcessInstanceImpl, execution, transitionName);
+ }
+
+ public String getTransitionName() {
+ return transitionName;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ProcessInstanceCreate.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ProcessInstanceCreate.java
new file mode 100644
index 0000000..dddc8a1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ProcessInstanceCreate.java
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.events;
+
+import java.io.Serializable;
+
+import org.hibernate.Session;
+import org.jbpm.api.history.HistoryProcessInstance;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.model.HistoryProcessInstanceImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ProcessInstanceCreate extends HistoryEvent implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ public void process() {
+ HistoryProcessInstance historyProcessInstanceImpl = new HistoryProcessInstanceImpl(execution);
+ Session session = EnvironmentImpl.getFromCurrent(Session.class);
+ session.save(historyProcessInstanceImpl);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ProcessInstanceEnd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ProcessInstanceEnd.java
new file mode 100644
index 0000000..56fe5d7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ProcessInstanceEnd.java
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.events;
+
+import org.hibernate.Session;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.model.HistoryProcessInstanceImpl;
+import org.jbpm.pvm.internal.util.Clock;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ProcessInstanceEnd extends HistoryEvent {
+
+ private static final long serialVersionUID = 1L;
+
+ public void process() {
+ Session session = EnvironmentImpl.getFromCurrent(Session.class);
+ HistoryProcessInstanceImpl historyProcessInstanceImpl = (HistoryProcessInstanceImpl)
+ session.load(HistoryProcessInstanceImpl.class, execution.getDbid());
+ historyProcessInstanceImpl.setEndTime(Clock.getCurrentTime());
+ historyProcessInstanceImpl.setState(execution.getState());
+ historyProcessInstanceImpl.setEndActivityName(execution.getActivityName());
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ProcessInstanceMigration.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ProcessInstanceMigration.java
new file mode 100644
index 0000000..5e75659
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/ProcessInstanceMigration.java
@@ -0,0 +1,80 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.events;
+
+import org.jbpm.api.ProcessDefinition;
+import org.jbpm.api.ProcessInstance;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.model.HistoryProcessInstanceImpl;
+import org.jbpm.pvm.internal.history.model.HistoryProcessInstanceMigrationImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Koen Aers
+ */
+public class ProcessInstanceMigration extends HistoryEvent {
+
+ private static final long serialVersionUID = 1L;
+
+ ProcessInstance processInstance;
+ ProcessDefinition processDefinition;
+
+ public ProcessInstanceMigration(ProcessInstance processInstance, ProcessDefinition processDefinition) {
+ this.processInstance = processInstance;
+ this.processDefinition = processDefinition;
+ }
+
+ public void process() {
+
+ if (processDefinition == null || processInstance == null || !(processInstance instanceof ExecutionImpl)) return;
+
+ DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class);
+
+ HistoryProcessInstanceImpl historyProcessInstance = null;
+ long processInstanceDbid = ((ExecutionImpl)processInstance).getDbid();
+ historyProcessInstance = (HistoryProcessInstanceImpl)dbSession.get(HistoryProcessInstanceImpl.class, processInstanceDbid);
+ if (historyProcessInstance == null) return;
+
+ String oldVersion = historyProcessInstance.getProcessDefinitionId();
+ String newVersion = processDefinition.getId();
+
+ historyProcessInstance.setProcessDefinitionId(newVersion);
+ HistoryProcessInstanceMigrationImpl historyProcessInstanceMigration =
+ new HistoryProcessInstanceMigrationImpl(oldVersion, newVersion);
+ historyProcessInstance.addDetail(historyProcessInstanceMigration);
+
+
+ dbSession.save(historyProcessInstanceMigration);
+ }
+
+ public ProcessInstance getProcessInstance() {
+ return processInstance;
+ }
+
+ public ProcessDefinition getProcessDefinition() {
+ return processDefinition;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskActivityStart.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskActivityStart.java
new file mode 100644
index 0000000..d6945d0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskActivityStart.java
@@ -0,0 +1,76 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.events;
+
+import org.jbpm.api.history.HistoryProcessInstance;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.model.HistoryActivityInstanceImpl;
+import org.jbpm.pvm.internal.history.model.HistoryProcessInstanceImpl;
+import org.jbpm.pvm.internal.history.model.HistoryTaskImpl;
+import org.jbpm.pvm.internal.history.model.HistoryTaskInstanceImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskActivityStart extends HistoryEvent {
+
+ private static final long serialVersionUID = 1L;
+
+ protected TaskImpl task;
+
+ public TaskActivityStart(TaskImpl task) {
+ this.task = task;
+ }
+
+ public void process() {
+ DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class);
+
+ ExecutionImpl processInstance = execution.getProcessInstance();
+ long processInstanceDbid = processInstance.getDbid();
+
+ HistoryProcessInstance historyProcessInstance =
+ dbSession.get(HistoryProcessInstanceImpl.class, processInstanceDbid);
+
+ HistoryTaskImpl historyTask = new HistoryTaskImpl(task);
+ historyTask.setExecutionId(execution.getId());
+
+ HistoryActivityInstanceImpl historyActivityInstance =
+ new HistoryTaskInstanceImpl(historyProcessInstance, execution, historyTask);
+
+ String activityType = execution.getActivity().getType();
+ historyActivityInstance.setType(activityType);
+
+ dbSession.save(historyActivityInstance);
+
+ execution.setHistoryActivityInstanceDbid(historyActivityInstance.getDbid());
+ }
+
+ public TaskImpl getTask() {
+ return task;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskAssign.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskAssign.java
new file mode 100644
index 0000000..9ba4c44
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskAssign.java
@@ -0,0 +1,60 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.events;
+
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.model.HistoryTaskImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+/**
+ * @author Alejandro Guizar
+ */
+public class TaskAssign extends HistoryEvent {
+
+ private static final long serialVersionUID = 1L;
+
+ protected TaskImpl task;
+ protected String assignee;
+
+ public TaskAssign(TaskImpl task, String assignee) {
+ this.task = task;
+ this.assignee = assignee;
+ }
+
+ public void process() {
+ DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class);
+ HistoryTaskImpl historyTaskInstance = (HistoryTaskImpl)
+ dbSession.get(HistoryTaskImpl.class, task.getDbid());
+ historyTaskInstance.setAssignee(assignee);
+ }
+
+ public TaskImpl getTask() {
+ return task;
+ }
+
+ public String getAssignee() {
+ return assignee;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskComplete.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskComplete.java
new file mode 100644
index 0000000..9474f35
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskComplete.java
@@ -0,0 +1,67 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.events;
+
+import org.hibernate.Session;
+import org.jbpm.api.history.HistoryTask;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.model.HistoryTaskImpl;
+import org.jbpm.pvm.internal.history.model.HistoryTaskInstanceImpl;
+import org.jbpm.pvm.internal.util.Clock;
+
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskComplete extends HistoryEvent {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String outcome;
+
+ public TaskComplete(String outcome) {
+ this.outcome = outcome;
+ }
+
+ public void process() {
+ Session session = EnvironmentImpl.getFromCurrent(Session.class);
+ Long historyActivityInstanceDbId = execution.getHistoryActivityInstanceDbid();
+ HistoryTaskInstanceImpl historyTaskInstance = (HistoryTaskInstanceImpl)
+ session.load(HistoryTaskInstanceImpl.class, historyActivityInstanceDbId);
+ historyTaskInstance.setEndTime(Clock.getCurrentTime());
+ historyTaskInstance.setTransitionName(outcome);
+
+ HistoryTaskImpl historyTask = historyTaskInstance.getHistoryTask();
+ historyTask.setOutcome(outcome);
+ historyTask.setEndTime(Clock.getCurrentTime());
+ historyTask.setState(HistoryTask.STATE_COMPLETED);
+
+ session.update(historyTaskInstance);
+ }
+
+ public String getOutcome() {
+ return outcome;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskCreated.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskCreated.java
new file mode 100644
index 0000000..4688238
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskCreated.java
@@ -0,0 +1,59 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.events;
+
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.model.HistoryTaskImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskCreated extends HistoryEvent {
+
+ private static final long serialVersionUID = 1L;
+
+ protected TaskImpl task;
+
+ public TaskCreated(TaskImpl task) {
+ this.task = task;
+ }
+
+ public void process() {
+ DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class);
+ HistoryTaskImpl historyTask = new HistoryTaskImpl(task);
+ dbSession.save(historyTask);
+
+ if (task.getSuperTask()!=null) {
+ HistoryTaskImpl superHistoryTask = dbSession.get(HistoryTaskImpl.class, task.getSuperTask().getDbid());
+ superHistoryTask.addSubTask(historyTask);
+ }
+ }
+
+ public TaskImpl getTask() {
+ return task;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskDelete.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskDelete.java
new file mode 100644
index 0000000..3a31676
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskDelete.java
@@ -0,0 +1,74 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.events;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.model.HistoryActivityInstanceImpl;
+import org.jbpm.pvm.internal.history.model.HistoryTaskImpl;
+import org.jbpm.pvm.internal.history.model.HistoryTaskInstanceImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+import org.jbpm.pvm.internal.util.Clock;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskDelete extends ActivityEnd {
+
+ private static final long serialVersionUID = 1L;
+
+ protected TaskImpl task;
+ protected String reason;
+
+ public TaskDelete(TaskImpl task, String reason) {
+ if (task.getExecution()!=null) {
+ throw new JbpmException("tasks related to an execution must be completed. they cannot just be deleted");
+ }
+
+ this.task = task;
+ this.reason = reason;
+ }
+
+ protected void updateHistoryActivityInstance(HistoryActivityInstanceImpl historyActivityInstance) {
+ super.updateHistoryActivityInstance(historyActivityInstance);
+
+ DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class);
+ HistoryTaskImpl historyTask = (HistoryTaskImpl) dbSession.get(HistoryTaskImpl.class, task.getDbid());
+ historyTask.setState(reason);
+ historyTask.setEndTime(Clock.getCurrentTime());
+ }
+
+ protected Class<? extends HistoryActivityInstanceImpl> getHistoryActivityInstanceClass() {
+ return HistoryTaskInstanceImpl.class;
+ }
+
+ public TaskImpl getTask() {
+ return task;
+ }
+
+ public String getReason() {
+ return reason;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskUpdated.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskUpdated.java
new file mode 100644
index 0000000..5cfece4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/TaskUpdated.java
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.events;
+
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.model.HistoryTaskImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskUpdated extends HistoryEvent {
+
+ private static final long serialVersionUID = 1L;
+
+ protected TaskImpl task;
+
+ public TaskUpdated(TaskImpl task) {
+ this.task = task;
+ }
+
+ public void process() {
+ DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class);
+ HistoryTaskImpl historyTask = dbSession.get(HistoryTaskImpl.class, task.getDbid());
+ historyTask.updated(task);
+ }
+
+ public TaskImpl getTask() {
+ return task;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/VariableCreate.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/VariableCreate.java
new file mode 100644
index 0000000..5a370df
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/VariableCreate.java
@@ -0,0 +1,77 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.events;
+
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.model.HistoryProcessInstanceImpl;
+import org.jbpm.pvm.internal.history.model.HistoryTaskImpl;
+import org.jbpm.pvm.internal.history.model.HistoryVariableImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.task.TaskImpl;
+import org.jbpm.pvm.internal.type.Variable;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class VariableCreate extends HistoryEvent {
+
+ private static final long serialVersionUID = 1L;
+
+ Variable variable;
+
+ public VariableCreate(Variable variable) {
+ this.variable = variable;
+ }
+
+ public void process() {
+ DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class);
+
+ dbSession.save(variable);
+
+ HistoryProcessInstanceImpl historyProcessInstance = null;
+ ExecutionImpl processInstance = variable.getProcessInstance();
+ if (processInstance!=null) {
+ long processInstanceDbid = processInstance.getDbid();
+ historyProcessInstance = (HistoryProcessInstanceImpl)
+ dbSession.get(HistoryProcessInstanceImpl.class, processInstanceDbid);
+ }
+
+ HistoryTaskImpl historyTask = null;
+ TaskImpl task = variable.getTask();
+ if (task!=null) {
+ long taskDbid = task.getDbid();
+ historyTask = (HistoryTaskImpl)
+ dbSession.get(HistoryTaskImpl.class, taskDbid);
+ }
+
+ HistoryVariableImpl historyVariable = new HistoryVariableImpl(historyProcessInstance, historyTask, variable);
+ dbSession.save(historyVariable);
+ }
+
+ public Variable getVariable() {
+ return variable;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/VariableUpdate.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/VariableUpdate.java
new file mode 100644
index 0000000..3ae7692
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/events/VariableUpdate.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.events;
+
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.model.HistoryVariableImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.type.Variable;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class VariableUpdate extends HistoryEvent {
+
+ private static final long serialVersionUID = 1L;
+
+ Variable variable;
+
+ public VariableUpdate(Variable variable) {
+ this.variable = variable;
+ }
+
+ @Override
+ public void process() {
+ DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class);
+ HistoryVariableImpl historyVariable = dbSession.get(HistoryVariableImpl.class, variable.getDbid());
+ historyVariable.updated(variable);
+ }
+
+ public Variable getVariable() {
+ return variable;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryActivityInstanceImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryActivityInstanceImpl.java
new file mode 100644
index 0000000..320b62c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryActivityInstanceImpl.java
@@ -0,0 +1,129 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.jbpm.api.history.HistoryActivityInstance;
+import org.jbpm.api.history.HistoryProcessInstance;
+import org.jbpm.pvm.internal.id.DbidGenerator;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+
+/** base activity instance class.
+ *
+ * @author Tom Baeyens
+ */
+public class HistoryActivityInstanceImpl implements HistoryActivityInstance, Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+ protected int dbversion;
+
+ protected HistoryProcessInstance historyProcessInstance;
+ protected String executionId;
+ protected ActivityImpl activity;
+ protected String type;
+ protected String activityName;
+
+ protected Date startTime;
+ protected Date endTime;
+ protected long duration;
+
+ protected String transitionName;
+
+ protected int nextDetailIndex = 1;
+
+ /** only here to get hibernate cascade */
+ protected Set<HistoryDetailImpl> details = new HashSet<HistoryDetailImpl>();
+
+
+ public HistoryActivityInstanceImpl() {
+ }
+
+ public HistoryActivityInstanceImpl(HistoryProcessInstance historyProcessInstanceImpl, ExecutionImpl execution) {
+ this.historyProcessInstance = historyProcessInstanceImpl;
+ this.activity = execution.getActivity();
+ this.executionId = execution.getId();
+ this.activityName = activity.getName();
+ this.startTime = execution.getHistoryActivityStart();
+ this.dbid = DbidGenerator.getDbidGenerator().getNextId();
+ }
+
+ // details //////////////////////////////////////////////////////////////////
+
+ public void addDetail(HistoryDetailImpl detail) {
+ detail.setHistoryActivityInstance(this, nextDetailIndex);
+ nextDetailIndex++;
+ }
+
+ public void setEndTime(Date endTime) {
+ this.endTime = endTime;
+ this.duration = endTime.getTime() - startTime.getTime();
+ }
+
+ public long getDbid() {
+ return dbid;
+ }
+ public ActivityImpl getActivity() {
+ return activity;
+ }
+ public String getActivityName() {
+ return activityName;
+ }
+ public Date getStartTime() {
+ return startTime;
+ }
+ public Date getEndTime() {
+ return endTime;
+ }
+ public long getDuration() {
+ return duration;
+ }
+ public HistoryProcessInstance getHistoryProcessInstance() {
+ return historyProcessInstance;
+ }
+ public String getExecutionId() {
+ return executionId;
+ }
+ public void setExecutionId(String executionId) {
+ this.executionId = executionId;
+ }
+ public String getTransitionName() {
+ return transitionName;
+ }
+ public void setTransitionName(String transitionName) {
+ this.transitionName = transitionName;
+ }
+ public String getType() {
+ return type;
+ }
+ public void setType(String type) {
+ this.type = type;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryAutomaticInstanceImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryAutomaticInstanceImpl.java
new file mode 100644
index 0000000..126ca59
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryAutomaticInstanceImpl.java
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.model;
+
+import org.jbpm.api.history.HistoryProcessInstance;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.util.Clock;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryAutomaticInstanceImpl extends HistoryActivityInstanceImpl {
+
+ private static final long serialVersionUID = 1L;
+
+ public HistoryAutomaticInstanceImpl() {
+ }
+
+ public HistoryAutomaticInstanceImpl(HistoryProcessInstance historyProcessInstanceImpl, ExecutionImpl execution) {
+ super(historyProcessInstanceImpl, execution);
+ setEndTime(Clock.getCurrentTime());
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryCommentImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryCommentImpl.java
new file mode 100644
index 0000000..887d36a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryCommentImpl.java
@@ -0,0 +1,78 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.history.HistoryComment;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryCommentImpl extends HistoryDetailImpl implements HistoryComment {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String message;
+ protected List<HistoryCommentImpl> replies = new ArrayList<HistoryCommentImpl>();
+
+ public HistoryCommentImpl() {
+ }
+
+ public HistoryCommentImpl(String message) {
+ // superclass has dummy string constructor to differentiate from
+ // the default constructor which is used by hibernate
+ super(null);
+ if (message==null) {
+ throw new JbpmException("message is null");
+ }
+ this.message = message;
+ }
+
+ public String toString() {
+ return (userId!=null ? userId+" comments: " : "comment: ")+message;
+ }
+
+ // replies //////////////////////////////////////////////////////////////////
+
+ public HistoryCommentImpl createReply(String message) {
+ HistoryCommentImpl reply = new HistoryCommentImpl(message);
+ replies.add(reply);
+ return reply;
+ }
+
+ public List<HistoryComment> getReplies() {
+ return (List) replies;
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public String getMessage() {
+ return message;
+ }
+ public void setMessage(String message) {
+ this.message = message;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryDecisionInstanceImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryDecisionInstanceImpl.java
new file mode 100644
index 0000000..d4cab2a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryDecisionInstanceImpl.java
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.model;
+
+import org.jbpm.api.history.HistoryProcessInstance;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryDecisionInstanceImpl extends HistoryAutomaticInstanceImpl {
+
+ private static final long serialVersionUID = 1L;
+
+ public HistoryDecisionInstanceImpl() {
+ }
+
+ public HistoryDecisionInstanceImpl(HistoryProcessInstance historyProcessInstanceImpl, ExecutionImpl execution, String transitionName) {
+ super(historyProcessInstanceImpl, execution);
+ this.transitionName = transitionName;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryDetailImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryDetailImpl.java
new file mode 100644
index 0000000..e4bd158
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryDetailImpl.java
@@ -0,0 +1,118 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.model;
+
+import java.util.Date;
+
+import org.jbpm.api.history.HistoryDetail;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.id.DbidGenerator;
+import org.jbpm.pvm.internal.util.Clock;
+import org.jbpm.pvm.internal.util.EqualsUtil;
+
+public class HistoryDetailImpl implements HistoryDetail {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+ protected int dbversion;
+ protected String userId = null;
+ protected Date time = null;
+
+ protected HistoryProcessInstanceImpl historyProcessInstance;
+ protected Integer historyProcessInstanceIndex;
+
+ protected HistoryActivityInstanceImpl historyActivityInstance;
+ protected Integer historyActivityInstanceIndex;
+
+ protected HistoryTaskImpl historyTask;
+ protected Integer historyTaskIndex;
+
+ protected HistoryVariableImpl historyVariable;
+ protected Integer historyVariableIndex;
+
+ protected HistoryDetailImpl() {
+ }
+
+ // dummy string constructor to differentiate from
+ // the default constructor which is used by hibernate
+ protected HistoryDetailImpl(String dummy) {
+ this.dbid = DbidGenerator.getDbidGenerator().getNextId();
+ this.time = Clock.getCurrentTime();
+
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ if (environment!=null) {
+ this.userId = environment.getAuthenticatedUserId();
+ }
+ }
+
+ // equals ///////////////////////////////////////////////////////////////////
+ // hack to support comparing hibernate proxies against the real objects
+ // since this always falls back to ==, we don't need to overwrite the hashcode
+ public boolean equals(Object o) {
+ return EqualsUtil.equals(this, o);
+ }
+
+ // cusomtized getters and setters ////////////////////////////////////////////
+
+ public String getId() {
+ return Long.toString(dbid);
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public long getDbid() {
+ return dbid;
+ }
+ public String getUserId() {
+ return userId;
+ }
+ public Date getTime() {
+ return time;
+ }
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+ public void setTime(Date time) {
+ this.time = time;
+ }
+
+ public void setHistoryProcessInstance(HistoryProcessInstanceImpl historyProcessInstance, int historyProcessInstanceIndex) {
+ this.historyProcessInstance = historyProcessInstance;
+ this.historyProcessInstanceIndex = historyProcessInstanceIndex;
+ }
+
+ public void setHistoryActivityInstance(HistoryActivityInstanceImpl historyActivityInstance, int historyActivityInstanceIndex) {
+ this.historyActivityInstance = historyActivityInstance;
+ this.historyActivityInstanceIndex = historyActivityInstanceIndex;
+ }
+
+ public void setHistoryTask(HistoryTaskImpl historyTask, int historyTaskIndex) {
+ this.historyTask = historyTask;
+ this.historyTaskIndex = historyTaskIndex;
+ }
+
+ public void setHistoryVariable(HistoryVariableImpl historyVariable, int historyVariableIndex) {
+ this.historyVariable = historyVariable;
+ this.historyVariableIndex = historyVariableIndex;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryPriorityUpdateImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryPriorityUpdateImpl.java
new file mode 100644
index 0000000..db9357c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryPriorityUpdateImpl.java
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.model;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryPriorityUpdateImpl extends HistoryDetailImpl {
+
+ private static final long serialVersionUID = 1L;
+
+ public int oldPriority;
+ public int newPriority;
+
+ public HistoryPriorityUpdateImpl() {
+ }
+
+ public HistoryPriorityUpdateImpl(int oldPriority, int newPriority) {
+ // superclass has dummy string constructor to differentiate from
+ // the default constructor which is used by hibernate
+ super(null);
+ this.oldPriority = oldPriority;
+ this.newPriority = newPriority;
+ }
+
+ public String toString() {
+ return (userId!=null ? userId+" updated priority" : "priority updated")+" from "+oldPriority+" to "+newPriority;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryProcessInstanceImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryProcessInstanceImpl.java
new file mode 100644
index 0000000..70fb736
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryProcessInstanceImpl.java
@@ -0,0 +1,129 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.model;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jbpm.api.history.HistoryProcessInstance;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.util.Clock;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryProcessInstanceImpl implements HistoryProcessInstance, Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+ protected int dbversion;
+
+ protected ProcessDefinitionImpl processDefinition;
+ protected String processDefinitionId;
+ protected String processInstanceId;
+ protected String key;
+ protected String state;
+ protected String endActivityName;
+ protected Date startTime;
+ protected Date endTime;
+ protected Long duration;
+ protected int nextDetailIndex = 1;
+
+ /** only here to get hibernate cascade */
+ protected Set<HistoryActivityInstanceImpl> historyActivityInstances;
+
+ /** only here to get hibernate cascade */
+ protected Set<HistoryVariableImpl> historyVariables;
+
+ /** only here to get hibernate cascade */
+ protected Set<HistoryDetailImpl> details = new HashSet<HistoryDetailImpl>();
+
+
+ public void addDetail(HistoryDetailImpl detail) {
+ detail.setHistoryProcessInstance(this, nextDetailIndex);
+ nextDetailIndex++;
+ }
+
+ public HistoryProcessInstanceImpl() {
+ }
+
+ public HistoryProcessInstanceImpl(ExecutionImpl processInstance) {
+ this.dbid = processInstance.getDbid();
+ this.processDefinition = processInstance.getProcessDefinition();
+ this.processDefinitionId = processDefinition.getId();
+ this.processInstanceId = processInstance.getId();
+ this.key = processInstance.getKey();
+ this.state = "active";
+ this.startTime = Clock.getCurrentTime();
+ }
+
+ public void setEndTime(Date endTime) {
+ this.endTime = endTime;
+ this.duration = endTime.getTime() - startTime.getTime();
+ this.state = "ended";
+ }
+
+ public Date getEndTime() {
+ return endTime;
+ }
+ public long getDbid() {
+ return dbid;
+ }
+ public ProcessDefinitionImpl getProcessDefinition() {
+ return processDefinition;
+ }
+ public Date getStartTime() {
+ return startTime;
+ }
+ public Long getDuration() {
+ return duration;
+ }
+ public String getProcessInstanceId() {
+ return processInstanceId;
+ }
+ public String getKey() {
+ return key;
+ }
+ public String getState() {
+ return state;
+ }
+ public void setState(String state) {
+ this.state = state;
+ }
+ public String getProcessDefinitionId() {
+ return processDefinitionId;
+ }
+ public void setProcessDefinitionId(String processDefinitionId) {
+ this.processDefinitionId = processDefinitionId;
+ }
+ public String getEndActivityName() {
+ return endActivityName;
+ }
+ public void setEndActivityName(String endActivityName) {
+ this.endActivityName = endActivityName;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryProcessInstanceMigrationImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryProcessInstanceMigrationImpl.java
new file mode 100644
index 0000000..8d44377
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryProcessInstanceMigrationImpl.java
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.model;
+
+
+/**
+ * @author Koen Aers
+ */
+public class HistoryProcessInstanceMigrationImpl extends HistoryDetailImpl {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String oldProcessDefinitionId;
+ protected String newProcessDefinitionId;
+
+ public HistoryProcessInstanceMigrationImpl() {
+ }
+
+ public HistoryProcessInstanceMigrationImpl(String oldProcessDefinitionId, String newProcessDefinitionId) {
+ // superclass has dummy string constructor to differentiate from
+ // the default constructor which is used by hibernate
+ super(null);
+ this.oldProcessDefinitionId = oldProcessDefinitionId;
+ this.newProcessDefinitionId = newProcessDefinitionId;
+ }
+
+ public String toString() {
+ return "migrated process instance " + this.historyProcessInstance.getProcessInstanceId() + " from " + oldProcessDefinitionId + " to " + newProcessDefinitionId;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryTaskAssignmentImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryTaskAssignmentImpl.java
new file mode 100644
index 0000000..41fb020
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryTaskAssignmentImpl.java
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.model;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryTaskAssignmentImpl extends HistoryDetailImpl {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String oldAssignee;
+ protected String newAssignee;
+
+ public HistoryTaskAssignmentImpl() {
+ }
+
+ public HistoryTaskAssignmentImpl(String oldAssignee, String newAssignee) {
+ // superclass has dummy string constructor to differentiate from
+ // the default constructor which is used by hibernate
+ super(null);
+ this.oldAssignee = oldAssignee;
+ this.newAssignee = newAssignee;
+ }
+
+ public String toString() {
+ return (userId!=null ? userId+" assigned task" : "task assigned")+" from "+oldAssignee+" to "+newAssignee;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryTaskDuedateUpdateImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryTaskDuedateUpdateImpl.java
new file mode 100644
index 0000000..31c8054
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryTaskDuedateUpdateImpl.java
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.model;
+
+import java.util.Date;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryTaskDuedateUpdateImpl extends HistoryDetailImpl {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Date oldDuedate;
+ protected Date newDuedate;
+
+ public HistoryTaskDuedateUpdateImpl() {
+ }
+
+ public HistoryTaskDuedateUpdateImpl(Date oldDuedate, Date newDuedate) {
+ // superclass has dummy string constructor to differentiate from
+ // the default constructor which is used by hibernate
+ super(null);
+ this.oldDuedate = oldDuedate;
+ this.newDuedate = newDuedate;
+ }
+
+ public String toString() {
+ return (userId!=null ? userId+" updated task duedate" : "task duedate updated")+" from "+oldDuedate+" to "+newDuedate;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryTaskImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryTaskImpl.java
new file mode 100644
index 0000000..3d61e96
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryTaskImpl.java
@@ -0,0 +1,165 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.jbpm.api.history.HistoryTask;
+import org.jbpm.pvm.internal.task.TaskImpl;
+import org.jbpm.pvm.internal.util.Clock;
+import org.jbpm.pvm.internal.util.EqualsUtil;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryTaskImpl implements Serializable, HistoryTask {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+ protected int dbversion;
+
+ protected String executionId;
+ protected String assignee;
+ protected String state;
+ protected String outcome;
+ protected int priority;
+ protected Date duedate;
+ protected Date createTime;
+ protected Date endTime;
+ protected long duration;
+ protected int nextDetailIndex = 1;
+
+ protected Set<HistoryTaskImpl> subTasks = new HashSet<HistoryTaskImpl>();
+
+ /** only here to get hibernate cascade */
+ protected Set<HistoryVariableImpl> historyVariables;
+
+ /** only here to get hibernate cascade */
+ protected Set<HistoryDetailImpl> details = new HashSet<HistoryDetailImpl>();
+
+ public HistoryTaskImpl() {
+ }
+
+ public HistoryTaskImpl(TaskImpl task) {
+ this.dbid = task.getDbid();
+ this.assignee = task.getAssignee();
+ this.priority = task.getPriority();
+ this.duedate = task.getDuedate();
+ this.createTime = Clock.getCurrentTime();
+ }
+
+ public void updated(TaskImpl task) {
+ if ( (assignee==null && task.getAssignee()!=null)
+ || (assignee!=null) && (!assignee.equals(task.getAssignee()))
+ ) {
+ addDetail(new HistoryTaskAssignmentImpl(assignee, task.getAssignee()));
+ this.assignee = task.getAssignee();
+ }
+ if (priority!=task.getPriority()) {
+ addDetail(new HistoryPriorityUpdateImpl(priority, task.getPriority()));
+ this.priority = task.getPriority();
+ }
+ if ( (duedate==null && task.getDuedate()!=null)
+ || (duedate!=null) && (!duedate.equals(task.getDuedate()))
+ ) {
+ addDetail(new HistoryTaskDuedateUpdateImpl(duedate, task.getDuedate()));
+ this.duedate = task.getDuedate();
+ }
+ }
+
+ // details //////////////////////////////////////////////////////////////////
+
+ public void addDetail(HistoryDetailImpl detail) {
+ detail.setHistoryTask(this, nextDetailIndex);
+ nextDetailIndex++;
+ }
+
+ // subtasks /////////////////////////////////////////////////////////////////
+
+ public void addSubTask(HistoryTaskImpl historyTask) {
+ subTasks.add(historyTask);
+ }
+
+ // equals ///////////////////////////////////////////////////////////////////
+ // hack to support comparing hibernate proxies against the real objects
+ // since this always falls back to ==, we don't need to overwrite the hashcode
+ public boolean equals(Object o) {
+ return EqualsUtil.equals(this, o);
+ }
+
+ // customized getters and setters ///////////////////////////////////////////
+
+ public String getId() {
+ return Long.toString(dbid);
+ }
+
+ public void setEndTime(Date endTime) {
+ this.endTime = endTime;
+ this.duration = endTime.getTime() - createTime.getTime();
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public String getState() {
+ return state;
+ }
+ public String getAssignee() {
+ return assignee;
+ }
+ public String getOutcome() {
+ return outcome;
+ }
+ public void setOutcome(String outcome) {
+ this.outcome = outcome;
+ }
+ public void setAssignee(String assignee) {
+ this.assignee = assignee;
+ }
+ public Date getCreateTime() {
+ return createTime;
+ }
+ public Date getEndTime() {
+ return endTime;
+ }
+ public long getDuration() {
+ return duration;
+ }
+ public void setDuration(long duration) {
+ this.duration = duration;
+ }
+ public String getExecutionId() {
+ return executionId;
+ }
+ public void setState(String state) {
+ this.state = state;
+ }
+ public void setExecutionId(String executionId) {
+ this.executionId = executionId;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryTaskInstanceImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryTaskInstanceImpl.java
new file mode 100644
index 0000000..2e5f33f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryTaskInstanceImpl.java
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.model;
+
+import org.jbpm.api.history.HistoryProcessInstance;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryTaskInstanceImpl extends HistoryActivityInstanceImpl {
+
+ private static final long serialVersionUID = 1L;
+
+ HistoryTaskImpl historyTask;
+
+ public HistoryTaskInstanceImpl() {
+ }
+
+ public HistoryTaskInstanceImpl(HistoryProcessInstance historyProcessInstanceImpl, ExecutionImpl execution, HistoryTaskImpl historyTask) {
+ super(historyProcessInstanceImpl, execution);
+ this.historyTask = historyTask;
+ }
+
+ public HistoryTaskImpl getHistoryTask() {
+ return historyTask;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryVariableImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryVariableImpl.java
new file mode 100644
index 0000000..f673d2c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryVariableImpl.java
@@ -0,0 +1,118 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.model;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.type.Variable;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryVariableImpl implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+ protected int dbversion;
+
+ protected HistoryProcessInstanceImpl historyProcessInstance;
+ protected HistoryTaskImpl historyTask;
+
+ protected String processInstanceId;
+ protected String executionId;
+ protected String variableName;
+ protected String value;
+ protected int nextDetailIndex = 1;
+
+ /** only here to get hibernate cascade */
+ protected Set<HistoryDetailImpl> details = new HashSet<HistoryDetailImpl>();
+
+ protected HistoryVariableImpl() {
+ }
+
+ public HistoryVariableImpl(HistoryProcessInstanceImpl historyProcessInstance, HistoryTaskImpl historyTask, Variable variable) {
+ this.dbid = variable.getDbid();
+
+ this.historyProcessInstance = historyProcessInstance;
+ this.historyTask = historyTask;
+
+ ExecutionImpl processInstance = variable.getProcessInstance();
+ if (processInstance!=null) {
+ this.processInstanceId = processInstance.getId();
+ }
+ // this.executionId = variable.getExecution().getId();
+
+ this.variableName = variable.getKey();
+ this.value = variable.getTextValue();
+ }
+
+ public void updated(Variable variable) {
+ String newValue = variable.getTextValue();
+ if ( (value==null && newValue!=null)
+ || (value!=null && (!value.equals(newValue)))
+ ) {
+ addDetail(new HistoryVariableUpdateImpl(value, newValue));
+ }
+ }
+
+ public void addDetail(HistoryDetailImpl detail) {
+ detail.setHistoryVariable(this, nextDetailIndex);
+ nextDetailIndex++;
+ }
+
+
+ public long getDbid() {
+ return dbid;
+ }
+ public int getDbversion() {
+ return dbversion;
+ }
+ public HistoryProcessInstanceImpl getHistoryProcessInstance() {
+ return historyProcessInstance;
+ }
+ public HistoryTaskImpl getHistoryTask() {
+ return historyTask;
+ }
+ public String getProcessInstanceId() {
+ return processInstanceId;
+ }
+ public String getExecutionId() {
+ return executionId;
+ }
+ public String getVariableName() {
+ return variableName;
+ }
+ public String getValue() {
+ return value;
+ }
+ public int getNextDetailIndex() {
+ return nextDetailIndex;
+ }
+ public Set<HistoryDetailImpl> getDetails() {
+ return details;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryVariableUpdateImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryVariableUpdateImpl.java
new file mode 100644
index 0000000..e08c473
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/model/HistoryVariableUpdateImpl.java
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.history.model;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryVariableUpdateImpl extends HistoryDetailImpl {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String oldValue;
+ protected String newValue;
+
+ public HistoryVariableUpdateImpl() {
+ }
+
+ public HistoryVariableUpdateImpl(String oldValue, String newValue) {
+ // superclass has dummy string constructor to differentiate from
+ // the default constructor which is used by hibernate
+ super(null);
+ this.oldValue = oldValue;
+ this.newValue = newValue;
+ }
+
+ public String toString() {
+ return (userId!=null ? userId+" " : "")+"updated variable "+this.historyVariable.getVariableName()+" from "+oldValue+" to "+newValue;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/package.html
new file mode 100644
index 0000000..f4c688e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/history/package.html
@@ -0,0 +1,4 @@
+<body>infrastructure for listening to process event logs that
+can be used to build up historic information about process
+executions.
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/AcquireDbidBlockCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/AcquireDbidBlockCmd.java
new file mode 100644
index 0000000..49fa2be
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/AcquireDbidBlockCmd.java
@@ -0,0 +1,39 @@
+ package org.jbpm.pvm.internal.id;
+
+ import org.hibernate.Query;
+ import org.hibernate.Session;
+ import org.jbpm.api.cmd.Command;
+ import org.jbpm.api.cmd.Environment;
+
+ public class AcquireDbidBlockCmd
+ implements Command<Long>
+ {
+ private static final long serialVersionUID = 1L;
+ long blocksize;
+
+ public AcquireDbidBlockCmd(long blocksize)
+ {
+ this.blocksize = blocksize;
+ }
+
+ public Long execute(Environment environment) throws Exception {
+ Session session = (Session)environment.get(Session.class);
+
+ Session newsession = session.getSessionFactory().openSession();
+ newsession.beginTransaction();
+ PropertyImpl property = (PropertyImpl)newsession.createQuery("select property from " + PropertyImpl.class.getName() + " as property " + "where property.key = '" + "next.dbid" + "'").uniqueResult();
+
+ String nextIdText = property.getValue();
+ Long nextId = new Long(nextIdText);
+
+ property.setValue(Long.toString(nextId.longValue() + this.blocksize));
+
+ newsession.update(property);
+ newsession.flush();
+ newsession.getTransaction().commit();
+ newsession.close();
+ newsession = null;
+
+ return nextId;
+ }
+ }
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/DatabaseDbidGenerator.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/DatabaseDbidGenerator.java
new file mode 100644
index 0000000..67b9fd0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/DatabaseDbidGenerator.java
@@ -0,0 +1,113 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.id;
+
+import java.util.Random;
+
+import org.hibernate.StaleStateException;
+import org.jbpm.api.JbpmException;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.cmd.CommandService;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DatabaseDbidGenerator extends DbidGenerator {
+
+ private static Log log = Log.getLog(DatabaseDbidGenerator.class.getName());
+
+ static Random random = new Random();
+
+ // configuration
+ CommandService commandService;
+ long blocksize = 10000;
+ int maxAttempts = 3;
+
+ // runtime state
+ long lastId = -2;
+ long nextId = -1;
+
+ public synchronized long getNextId() {
+ // if no more ids available
+ if (lastId<nextId) {
+ // acquire a next block of ids
+
+ log.debug("last id "+lastId+" was consumed. acquiring new block...");
+
+ // reset the id block
+ lastId = -2;
+ nextId = -1;
+
+ // try couple of times
+ try {
+ acquireDbidBlock();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't acquire block of ids", e);
+ }
+ }
+
+ return nextId++;
+ }
+
+ protected void acquireDbidBlock() {
+ for ( int attempts = maxAttempts; (attempts>0) && (nextId==-1) ; attempts-- ) {
+ try {
+ // acquire block
+ nextId = commandService.execute(new AcquireDbidBlockCmd(blocksize));
+ lastId = nextId + blocksize - 1;
+
+ log.debug("acquired new id block ["+nextId+"-"+lastId+"]");
+
+ } catch (StaleStateException e) {
+ // optimistic locking exception indicating another thread tried to
+ // acquire a block of ids concurrently
+ attempts--;
+
+ // if no attempts left
+ if (attempts==0) {
+ // fail the surrounding transaction
+ throw new JbpmException("couldn't acquire block of ids, tried "+maxAttempts+" times");
+ }
+
+ // if there are still attempts left, first wait a bit
+ int millis = 20 + random.nextInt(200);
+ log.debug("optimistic locking failure while trying to acquire id block. retrying in "+millis+" millis");
+ try {
+ Thread.sleep(millis);
+ } catch (InterruptedException e1) {
+ log.debug("waiting after id block locking failure got interrupted");
+ }
+ }
+ }
+ }
+
+ public void reset() {
+ initialize(); // resetting the DatabaseIdGenerator means just reinitializing the id
+ }
+
+ public void initialize() {
+ nextId = commandService.execute(new InitializePropertiesCmd(blocksize));
+ lastId = nextId + blocksize - 1;
+ log.debug("initial id block ["+nextId+"-"+lastId+"]");
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/DatabaseIdComposer.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/DatabaseIdComposer.java
new file mode 100644
index 0000000..e6020da
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/DatabaseIdComposer.java
@@ -0,0 +1,67 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.id;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.ProcessDefinition;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DatabaseIdComposer extends IdComposer {
+
+ private static Log log = Log.getLog(DatabaseIdComposer.class.getName());
+
+ public String createId(ProcessDefinition processDefinition, Execution parent, ExecutionImpl execution) {
+
+ String base = null;
+ if (parent!=null) {
+ base = parent.getId();
+ } else if (processDefinition.getKey()!=null){
+ base = processDefinition.getKey();
+ } else {
+ base = processDefinition.getId();
+ }
+
+ String executionPart = null;
+ if ( (parent==null)
+ && (execution.getKey()!=null)
+ ) {
+ executionPart = execution.getKey();
+
+ } else if (execution.getName()!=null) {
+ executionPart = execution.getName();
+
+ } else {
+ executionPart = Long.toString(execution.getDbid());
+ }
+
+ String executionId = base+"."+executionPart;
+
+ if (log.isDebugEnabled()) log.debug("generated execution id "+executionId);
+
+ return executionId;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/DbidGenerator.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/DbidGenerator.java
new file mode 100644
index 0000000..61b4ba4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/DbidGenerator.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.id;
+
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class DbidGenerator {
+
+ static DbidGenerator defaultIdGenerator = new MemoryDbidGenerator();
+
+ public static DbidGenerator getDbidGenerator() {
+ DbidGenerator dbidGenerator = EnvironmentImpl.getFromCurrent(DbidGenerator.class, false);
+ if (dbidGenerator!=null) {
+ return dbidGenerator;
+ }
+ return getDefaultIdGenerator();
+ }
+
+ public static DbidGenerator getDefaultIdGenerator() {
+ return defaultIdGenerator;
+ }
+
+ public abstract long getNextId();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/IdComposer.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/IdComposer.java
new file mode 100644
index 0000000..4f95ef0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/IdComposer.java
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.id;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.ProcessDefinition;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class IdComposer {
+
+ private static IdComposer defaultIdComposer = new MemoryIdComposer();
+
+ public static IdComposer getIdComposer() {
+ IdComposer idComposer = EnvironmentImpl.getFromCurrent(IdComposer.class, false);
+ if (idComposer!=null) {
+ return idComposer;
+ }
+ return getDefaultIdComposer();
+ }
+
+ public static IdComposer getDefaultIdComposer() {
+ return defaultIdComposer;
+ }
+
+ /** generates a unique id for the given execution. */
+ public abstract String createId(ProcessDefinition processDefinition, Execution parent, ExecutionImpl execution);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/InitializePropertiesCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/InitializePropertiesCmd.java
new file mode 100644
index 0000000..6b3c03a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/InitializePropertiesCmd.java
@@ -0,0 +1,163 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.id;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.Session;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.history.model.HistoryActivityInstanceImpl;
+import org.jbpm.pvm.internal.history.model.HistoryDetailImpl;
+import org.jbpm.pvm.internal.history.model.HistoryTaskImpl;
+import org.jbpm.pvm.internal.history.model.HistoryVariableImpl;
+import org.jbpm.pvm.internal.identity.impl.GroupImpl;
+import org.jbpm.pvm.internal.identity.impl.MembershipImpl;
+import org.jbpm.pvm.internal.identity.impl.UserImpl;
+import org.jbpm.pvm.internal.job.JobImpl;
+import org.jbpm.pvm.internal.lob.Lob;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.processengine.ProcessEngineImpl;
+import org.jbpm.pvm.internal.repository.DeploymentImpl;
+import org.jbpm.pvm.internal.repository.DeploymentProperty;
+import org.jbpm.pvm.internal.task.ParticipationImpl;
+import org.jbpm.pvm.internal.task.SwimlaneImpl;
+import org.jbpm.pvm.internal.task.TaskImpl;
+import org.jbpm.pvm.internal.type.Variable;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class InitializePropertiesCmd implements Command<Long> {
+
+ private static final long serialVersionUID = 1L;
+
+ private static Log log = Log.getLog(InitializePropertiesCmd.class.getName());
+
+ long blocksize;
+
+ public InitializePropertiesCmd(long blocksize) {
+ this.blocksize = blocksize;
+ }
+
+ public Long execute(Environment environment) throws Exception {
+ Session session = environment.get(Session.class);
+
+ Long nextId = initializeNextId(session);
+ initializeSchemaVersion(session);
+
+ session.flush();
+
+ return nextId;
+ }
+
+ void initializeSchemaVersion(Session session) {
+ PropertyImpl property = (PropertyImpl) session.createQuery(
+ "select property " +
+ "from "+PropertyImpl.class.getName()+" as property " +
+ "where property.key = '"+PropertyImpl.DB_VERSION_KEY+"'"
+ ).uniqueResult();
+
+ log.debug("version of jbpm library: "+ProcessEngineImpl.JBPM_LIBRARY_VERSION);
+
+ if (property==null) {
+ log.info("version of jbpm db schema: none");
+
+ } else {
+ String dbSchemaVersion = property.getValue();
+ log.debug("version of jbpm db schema: "+dbSchemaVersion);
+ if (!ProcessEngineImpl.JBPM_LIBRARY_VERSION.equals(dbSchemaVersion)) {
+ throw new JbpmException("jBPM runtime version "+ProcessEngineImpl.JBPM_LIBRARY_VERSION+" doesn't match with DB schema, which is version ");
+ }
+ }
+ }
+
+ Long initializeNextId(Session session) {
+ PropertyImpl property = (PropertyImpl) session.createQuery(
+ "select property " +
+ "from "+PropertyImpl.class.getName()+" as property " +
+ "where property.key = '"+PropertyImpl.NEXT_DBID_KEY+"'"
+ ).uniqueResult();
+
+ Long nextId;
+ if (property==null) {
+ nextId = getMaxDbid(session);
+ nextId++;
+ property = new PropertyImpl(PropertyImpl.NEXT_DBID_KEY, Long.toString(nextId+blocksize));
+ session.save(property);
+
+ } else {
+ String nextIdText = property.getValue();
+ nextId = new Long(nextIdText);
+ property.setValue(Long.toString(nextId.longValue()+blocksize));
+ session.update(property);
+ }
+
+ return nextId;
+ }
+
+ private Long getMaxDbid(Session session) {
+ Long nextId;
+ nextId = 0L;
+
+ List<String> persistedTypes = new ArrayList<String>();
+ persistedTypes.add(DeploymentImpl.class.getName());
+ persistedTypes.add(DeploymentProperty.class.getName());
+ persistedTypes.add(ExecutionImpl.class.getName());
+ persistedTypes.add(GroupImpl.class.getName());
+ persistedTypes.add(HistoryActivityInstanceImpl.class.getName());
+ persistedTypes.add(HistoryDetailImpl.class.getName());
+ persistedTypes.add(HistoryTaskImpl.class.getName());
+ persistedTypes.add(HistoryVariableImpl.class.getName());
+ persistedTypes.add(JobImpl.class.getName());
+ persistedTypes.add(Lob.class.getName());
+ persistedTypes.add(MembershipImpl.class.getName());
+ persistedTypes.add(ParticipationImpl.class.getName());
+ persistedTypes.add(PropertyImpl.class.getName());
+ persistedTypes.add(SwimlaneImpl.class.getName());
+ persistedTypes.add(TaskImpl.class.getName());
+ persistedTypes.add(UserImpl.class.getName());
+ persistedTypes.add(Variable.class.getName());
+
+ for (String persistedType: persistedTypes) {
+ try {
+ Long maxDbid = (Long) session.createQuery(
+ "select max(object.dbid) " +
+ "from "+persistedType+" as object"
+ ).uniqueResult();
+
+ if ( (maxDbid!=null)
+ && (maxDbid.longValue()>nextId)
+ ) {
+ nextId = maxDbid.longValue();
+ }
+ } catch (Exception e) {
+ log.info("couldn't get max dbid for "+persistedType);
+ }
+ }
+ return nextId;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/MemoryDbidGenerator.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/MemoryDbidGenerator.java
new file mode 100644
index 0000000..35b74cb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/MemoryDbidGenerator.java
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.id;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class MemoryDbidGenerator extends DbidGenerator {
+
+ long nextId = 1;
+
+ public synchronized long getNextId() {
+ return nextId++;
+ }
+
+ public synchronized void reset() {
+ nextId = 1;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/MemoryIdComposer.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/MemoryIdComposer.java
new file mode 100644
index 0000000..6745e0a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/MemoryIdComposer.java
@@ -0,0 +1,37 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.id;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.ProcessDefinition;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class MemoryIdComposer extends IdComposer {
+
+ public String createId(ProcessDefinition processDefinition, Execution parent, ExecutionImpl execution) {
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/PropertyImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/PropertyImpl.java
new file mode 100644
index 0000000..cd755fb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/id/PropertyImpl.java
@@ -0,0 +1,201 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.id;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.criterion.Restrictions;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.history.model.HistoryActivityInstanceImpl;
+import org.jbpm.pvm.internal.history.model.HistoryDetailImpl;
+import org.jbpm.pvm.internal.history.model.HistoryTaskImpl;
+import org.jbpm.pvm.internal.history.model.HistoryVariableImpl;
+import org.jbpm.pvm.internal.identity.impl.GroupImpl;
+import org.jbpm.pvm.internal.identity.impl.MembershipImpl;
+import org.jbpm.pvm.internal.identity.impl.UserImpl;
+import org.jbpm.pvm.internal.job.JobImpl;
+import org.jbpm.pvm.internal.lob.Lob;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.processengine.ProcessEngineImpl;
+import org.jbpm.pvm.internal.repository.DeploymentImpl;
+import org.jbpm.pvm.internal.repository.DeploymentProperty;
+import org.jbpm.pvm.internal.task.ParticipationImpl;
+import org.jbpm.pvm.internal.task.SwimlaneImpl;
+import org.jbpm.pvm.internal.task.TaskImpl;
+import org.jbpm.pvm.internal.type.Variable;
+
+
+/** jbpm installation properties.
+ *
+ * currently there are 2 use cases for these properties:
+ * 1) include the jbpm schema version into the DB
+ * 2) have a record to maintain the next dbid for the id generator
+ *
+ * @author Tom Baeyens
+ */
+public class PropertyImpl {
+
+ private static Log log = Log.getLog(PropertyImpl.class.getName());
+
+ public static final String DB_VERSION_KEY = "db.version";
+ public static final String NEXT_DBID_KEY = "next.dbid";
+
+ protected int version;
+ protected String key;
+ protected String value;
+
+ protected PropertyImpl() {
+ }
+
+ public PropertyImpl(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public static Long getNextDbid(Session session) {
+ String dbidPropertyValue = getPropertyValue(session, PropertyImpl.NEXT_DBID_KEY);
+ if (dbidPropertyValue!=null) {
+ return Long.valueOf(dbidPropertyValue);
+ }
+ return null;
+ }
+
+ public static void setNextDbid(Session session, long nextDbid) {
+ setPropertyValue(session, PropertyImpl.NEXT_DBID_KEY, Long.toString(nextDbid));
+ }
+
+ public static String getDbVersion(Session session) {
+ String dbVersionPropertyValue = getPropertyValue(session, PropertyImpl.DB_VERSION_KEY);
+ if (dbVersionPropertyValue!=null) {
+ return dbVersionPropertyValue;
+ }
+ return null;
+ }
+
+ public static void setDbVersionToLibraryVersion(Session session) {
+ setPropertyValue(session, PropertyImpl.DB_VERSION_KEY, ProcessEngineImpl.JBPM_LIBRARY_VERSION);
+ }
+
+ public static void createProperties(Session session) {
+ setDbVersionToLibraryVersion(session);
+ setNextDbid(session, 1);
+ }
+
+ public static void upgradeProperties(Session session) {
+ setDbVersionToLibraryVersion(session);
+ long nextDbid = getMaxDbid(session)+1;
+ setNextDbid(session, nextDbid);
+ log.info("nextDbid is initialized to "+nextDbid);
+ }
+
+ public static boolean propertiesTableExists(Session session) {
+ try {
+ session.createQuery("from "+PropertyImpl.class.getName())
+ .setMaxResults(1)
+ .uniqueResult();
+ return true;
+
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ protected static long getMaxDbid(Session session) {
+ long maxDbid = 0;
+
+ List<String> persistedTypes = new ArrayList<String>();
+ persistedTypes.add(DeploymentImpl.class.getName());
+ persistedTypes.add(DeploymentProperty.class.getName());
+ persistedTypes.add(ExecutionImpl.class.getName());
+ persistedTypes.add(GroupImpl.class.getName());
+ persistedTypes.add(HistoryActivityInstanceImpl.class.getName());
+ persistedTypes.add(HistoryDetailImpl.class.getName());
+ persistedTypes.add(HistoryTaskImpl.class.getName());
+ persistedTypes.add(HistoryVariableImpl.class.getName());
+ persistedTypes.add(JobImpl.class.getName());
+ persistedTypes.add(Lob.class.getName());
+ persistedTypes.add(MembershipImpl.class.getName());
+ persistedTypes.add(ParticipationImpl.class.getName());
+ persistedTypes.add(SwimlaneImpl.class.getName());
+ persistedTypes.add(TaskImpl.class.getName());
+ persistedTypes.add(UserImpl.class.getName());
+ persistedTypes.add(Variable.class.getName());
+
+ for (String persistedType: persistedTypes) {
+ try {
+ Long typeMaxDbid = (Long) session.createQuery(
+ "select max(o.dbid) " +
+ "from "+persistedType+" as o"
+ ).uniqueResult();
+
+ if ( (typeMaxDbid!=null)
+ && (typeMaxDbid.longValue()>maxDbid)
+ ) {
+ maxDbid = typeMaxDbid.longValue();
+ }
+ } catch (Exception e) {
+ log.info("couldn't get max dbid for "+persistedType, e);
+ e.printStackTrace();
+ }
+ }
+
+ return maxDbid;
+ }
+
+ protected static String getPropertyValue(Session session, String propertyKey) {
+ PropertyImpl dbidProperty = getProperty(session, propertyKey);
+ if (dbidProperty==null) {
+ return null;
+ }
+ return dbidProperty.getValue();
+ }
+
+ protected static void setPropertyValue(Session session, String propertyKey, String propertyValue) {
+ PropertyImpl property = getProperty(session, propertyKey);
+ if (property==null) {
+ property = new PropertyImpl(propertyKey, propertyValue);
+ session.save(property);
+ } else {
+ property.setValue(propertyValue);
+ }
+ }
+
+ protected static PropertyImpl getProperty(Session session, String key) {
+ return (PropertyImpl) session.createCriteria(PropertyImpl.class)
+ .add(Restrictions.eq("key", key))
+ .uniqueResult();
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public String getKey() {
+ return key;
+ }
+ public String getValue() {
+ return value;
+ }
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/CreateGroupCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/CreateGroupCmd.java
new file mode 100644
index 0000000..571cb1f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/CreateGroupCmd.java
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.identity.spi.IdentitySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CreateGroupCmd implements Command<String> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String groupName;
+ protected String groupType;
+ protected String parentGroupId;
+
+ public CreateGroupCmd(String groupName, String groupType, String parentGroupId) {
+ this.groupName = groupName;
+ this.groupType = groupType;
+ this.parentGroupId = parentGroupId;
+ }
+
+ public String execute(Environment environment) throws Exception {
+ IdentitySession identitySession = environment.get(IdentitySession.class);
+ return identitySession.createGroup(groupName, groupType, parentGroupId);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/CreateMembershipCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/CreateMembershipCmd.java
new file mode 100644
index 0000000..45cb9dc
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/CreateMembershipCmd.java
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.identity.spi.IdentitySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CreateMembershipCmd implements Command<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String userId;
+ protected String groupId;
+ protected String role;
+
+ public CreateMembershipCmd(String userId, String groupId, String role) {
+ this.userId = userId;
+ this.groupId = groupId;
+ this.role = role;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ IdentitySession identitySession = environment.get(IdentitySession.class);
+ identitySession.createMembership(userId, groupId, role);
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/CreateUserCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/CreateUserCmd.java
new file mode 100644
index 0000000..8a42b13
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/CreateUserCmd.java
@@ -0,0 +1,61 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.identity.spi.IdentitySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CreateUserCmd implements Command<Void> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String userId;
+ protected String givenName;
+ protected String familyName;
+ protected String businessEmail;
+ protected String password;
+
+ public CreateUserCmd(String userId, String givenName, String familyName) {
+ this.userId = userId;
+ this.givenName = givenName;
+ this.familyName = familyName;
+ }
+
+ public CreateUserCmd(String userId, String givenName, String familyName, String businessEmail) {
+ this.userId = userId;
+ this.givenName = givenName;
+ this.familyName = familyName;
+ this.businessEmail = businessEmail;
+ }
+
+ public Void execute(Environment environment) throws Exception {
+ IdentitySession identitySession = environment.get(IdentitySession.class);
+ identitySession.createUser(userId, givenName, familyName, businessEmail);
+ return null;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/DeleteGroupCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/DeleteGroupCmd.java
new file mode 100644
index 0000000..d6d0087
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/DeleteGroupCmd.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.identity.spi.IdentitySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DeleteGroupCmd implements Command<Void> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String groupId;
+
+ public DeleteGroupCmd(String groupId) {
+ this.groupId = groupId;
+ }
+
+ public Void execute(Environment environment) throws Exception {
+ IdentitySession identitySession = environment.get(IdentitySession.class);
+ identitySession.deleteGroup(groupId);
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/DeleteMembershipCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/DeleteMembershipCmd.java
new file mode 100644
index 0000000..398337d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/DeleteMembershipCmd.java
@@ -0,0 +1,52 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.identity.spi.IdentitySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DeleteMembershipCmd implements Command<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String userId;
+ protected String groupId;
+ protected String role;
+
+ public DeleteMembershipCmd(String userId, String groupId, String role) {
+ this.userId = userId;
+ this.groupId = groupId;
+ this.role = role;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ IdentitySession identitySession = environment.get(IdentitySession.class);
+ identitySession.deleteMembership(userId, groupId, role);
+ return null;
+ }
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/DeleteUserCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/DeleteUserCmd.java
new file mode 100644
index 0000000..4a42ac3
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/DeleteUserCmd.java
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.identity.spi.IdentitySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DeleteUserCmd implements Command<Void> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String userId;
+
+ public DeleteUserCmd(String userId) {
+ this.userId = userId;
+ }
+
+ public Void execute(Environment environment) throws Exception {
+ IdentitySession identitySession = environment.get(IdentitySession.class);
+ identitySession.deleteUser(userId);
+ return null;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/FindGroupCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/FindGroupCmd.java
new file mode 100644
index 0000000..9172524
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/FindGroupCmd.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.identity.Group;
+import org.jbpm.pvm.internal.identity.spi.IdentitySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class FindGroupCmd implements Command<Group> {
+
+ private static final long serialVersionUID = 1L;
+
+ String groupId;
+
+ public FindGroupCmd(String groupId) {
+ this.groupId = groupId;
+ }
+
+ public Group execute(Environment environment) {
+ IdentitySession identitySession = environment.get(IdentitySession.class);
+ return identitySession.findGroupById(groupId);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/FindGroupsCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/FindGroupsCmd.java
new file mode 100644
index 0000000..d50d706
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/FindGroupsCmd.java
@@ -0,0 +1,58 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.cmd;
+
+import java.util.List;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.identity.Group;
+import org.jbpm.pvm.internal.identity.spi.IdentitySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class FindGroupsCmd implements Command<List<Group>> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String userId;
+ protected String groupType;
+
+ public FindGroupsCmd(String userId) {
+ this.userId = userId;
+ }
+
+ public FindGroupsCmd(String userId, String groupType) {
+ this.userId = userId;
+ this.groupType = groupType;
+ }
+
+ public List<Group> execute(Environment environment) throws Exception {
+ IdentitySession identitySession = environment.get(IdentitySession.class);
+ if (groupType!=null) {
+ return identitySession.findGroupsByUserAndGroupType(userId, groupType);
+ }
+ return identitySession.findGroupsByUser(userId);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/FindUserCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/FindUserCmd.java
new file mode 100644
index 0000000..dec0b0c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/FindUserCmd.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.cmd;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.identity.User;
+import org.jbpm.pvm.internal.identity.spi.IdentitySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class FindUserCmd implements Command<User> {
+
+ private static final long serialVersionUID = 1L;
+
+ String userId;
+
+ public FindUserCmd(String userId) {
+ this.userId = userId;
+ }
+
+ public User execute(Environment environment) {
+ IdentitySession identitySession = environment.get(IdentitySession.class);
+ return identitySession.findUserById(userId);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/FindUsersCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/FindUsersCmd.java
new file mode 100644
index 0000000..7a42bf7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/cmd/FindUsersCmd.java
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.cmd;
+
+import java.util.List;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.identity.User;
+import org.jbpm.pvm.internal.identity.spi.IdentitySession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class FindUsersCmd implements Command<List<User>> {
+
+ private static final long serialVersionUID = 1L;
+
+ public List<User> execute(Environment environment) {
+ IdentitySession identitySession = environment.get(IdentitySession.class);
+ return identitySession.findUsers();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/GroupImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/GroupImpl.java
new file mode 100644
index 0000000..4d09660
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/GroupImpl.java
@@ -0,0 +1,79 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.impl;
+
+import java.io.Serializable;
+
+import org.jbpm.api.identity.Group;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class GroupImpl implements Group, Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+ protected int dbversion;
+
+ protected GroupImpl parent;
+
+ protected String id;
+ protected String name;
+ protected String type;
+
+ public GroupImpl() {
+ }
+
+ public GroupImpl(String id) {
+ this.id = id;
+ }
+
+ public String getId() {
+ return id;
+ }
+ public void setId(String id) {
+ this.id = id;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public GroupImpl getParent() {
+ return parent;
+ }
+ public void setParent(GroupImpl parent) {
+ this.parent = parent;
+ }
+ public String getType() {
+ return type;
+ }
+ public void setType(String type) {
+ this.type = type;
+ }
+ public void setDbid(long dbid) {
+ this.dbid = dbid;
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/IdentitySessionImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/IdentitySessionImpl.java
new file mode 100644
index 0000000..74b6769
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/IdentitySessionImpl.java
@@ -0,0 +1,204 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.impl;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.criterion.Projections;
+import org.hibernate.criterion.Restrictions;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.identity.Group;
+import org.jbpm.api.identity.User;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.id.DbidGenerator;
+import org.jbpm.pvm.internal.identity.spi.IdentitySession;
+
+/**
+ * @author Tom Baeyens
+ */
+public class IdentitySessionImpl implements IdentitySession {
+
+ protected Session session;
+
+ public String createUser(String userName, String givenName, String familyName, String businessEmail) {
+ UserImpl user = new UserImpl(userName, givenName, familyName);
+ user.setBusinessEmail(businessEmail);
+
+ long dbid = EnvironmentImpl.getFromCurrent(DbidGenerator.class).getNextId();
+ user.setDbid(dbid);
+
+ session.save(user);
+
+ return user.getId();
+ }
+
+ public User findUserById(String userId) {
+ return (User) session.createCriteria(UserImpl.class)
+ .add(Restrictions.eq("id", userId))
+ .uniqueResult();
+ }
+
+ public List<User> findUsersById(String... userIds) {
+ List<User> users = session.createCriteria(UserImpl.class)
+ .add(Restrictions.in("id", userIds))
+ .list();
+ if (userIds.length != users.size()) {
+ throw new JbpmException("not all users were found: " + Arrays.toString(userIds));
+ }
+ return users;
+ }
+
+ public List<User> findUsers() {
+ return session.createCriteria(UserImpl.class).list();
+ }
+
+ public void deleteUser(String userId) {
+ // lookup the user
+ User user = findUserById(userId);
+
+ // cascade the deletion to the memberships
+ List<MembershipImpl> memberships = session.createCriteria(MembershipImpl.class)
+ .add(Restrictions.eq("user", user))
+ .list();
+
+ // delete the related memberships
+ for (MembershipImpl membership : memberships) {
+ session.delete(membership);
+ }
+
+ // delete the user
+ session.delete(user);
+ }
+
+ public String createGroup(String groupName, String groupType, String parentGroupId) {
+ GroupImpl group = new GroupImpl();
+ String groupId = groupType != null ? groupType + "." + groupName : groupName;
+ group.setId(groupId);
+
+ long dbid = EnvironmentImpl.getFromCurrent(DbidGenerator.class).getNextId();
+ group.setDbid(dbid);
+
+ group.setName(groupName);
+ group.setType(groupType);
+
+ if (parentGroupId != null) {
+ GroupImpl parentGroup = findGroupById(parentGroupId);
+ group.setParent(parentGroup);
+ }
+
+ session.save(group);
+
+ return group.getId();
+ }
+
+ public List<User> findUsersByGroup(String groupId) {
+ return session.createCriteria(MembershipImpl.class)
+ .createAlias("group", "g")
+ .add(Restrictions.eq("g.id", groupId))
+ .setProjection(Projections.property("user"))
+ .list();
+ }
+
+ public GroupImpl findGroupById(String groupId) {
+ return (GroupImpl) session.createCriteria(GroupImpl.class)
+ .add(Restrictions.eq("id", groupId))
+ .uniqueResult();
+ }
+
+ public List<Group> findGroupsByUserAndGroupType(String userId, String groupType) {
+ return session.createQuery("select distinct m.group"
+ + " from "
+ + MembershipImpl.class.getName()
+ + " as m where m.user.id = :userId"
+ + " and m.group.type = :groupType")
+ .setString("userId", userId)
+ .setString("groupType", groupType)
+ .list();
+ }
+
+ public List<Group> findGroupsByUser(String userId) {
+ return session.createQuery("select distinct m.group"
+ + " from "
+ + MembershipImpl.class.getName()
+ + " as m where m.user.id = :userId").setString("userId", userId).list();
+ }
+
+ public List<Group> findGroups() {
+ return session.createCriteria(GroupImpl.class).list();
+ }
+
+ public void deleteGroup(String groupId) {
+ // look up the group
+ GroupImpl group = findGroupById(groupId);
+
+ // cascade the deletion to the memberships
+ List<MembershipImpl> memberships = session.createCriteria(MembershipImpl.class)
+ .add(Restrictions.eq("group", group))
+ .list();
+
+ // delete the related memberships
+ for (MembershipImpl membership : memberships) {
+ session.delete(membership);
+ }
+
+ // delete the group
+ session.delete(group);
+ }
+
+ public void createMembership(String userId, String groupId, String role) {
+ User user = findUserById(userId);
+ if (user == null) {
+ throw new JbpmException("user " + userId + " doesn't exist");
+ }
+ Group group = findGroupById(groupId);
+ if (group == null) {
+ throw new JbpmException("group " + groupId + " doesn't exist");
+ }
+
+ MembershipImpl membership = new MembershipImpl();
+ membership.setUser(user);
+ membership.setGroup(group);
+ membership.setRole(role);
+
+ long dbid = EnvironmentImpl.getFromCurrent(DbidGenerator.class).getNextId();
+ membership.setDbid(dbid);
+
+ session.save(membership);
+ }
+
+ public void deleteMembership(String userId, String groupId, String role) {
+ MembershipImpl membership = (MembershipImpl) session.createCriteria(MembershipImpl.class)
+ .createAlias("user", "u")
+ .createAlias("group", "g")
+ .add(Restrictions.eq("u.id", userId))
+ .add(Restrictions.eq("g.id", groupId))
+ .uniqueResult();
+ session.delete(membership);
+ }
+
+ public void setSession(Session session) {
+ this.session = session;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/IdentitySessionResource.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/IdentitySessionResource.java
new file mode 100644
index 0000000..24c3d72
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/IdentitySessionResource.java
@@ -0,0 +1,68 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.impl;
+
+import org.jboss.identity.idm.api.IdentitySession;
+import org.jboss.identity.idm.api.Transaction;
+import org.jboss.identity.idm.common.exception.IdentityException;
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.tx.StandardResource;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class IdentitySessionResource implements StandardResource {
+
+ protected IdentitySession identitySession;
+ protected Transaction transaction;
+
+ public IdentitySessionResource(IdentitySession identitySession) {
+ this.identitySession = identitySession;
+
+ begin();
+ }
+
+ protected void begin() {
+ try {
+ transaction = identitySession.beginTransaction();
+ } catch (IdentityException e) {
+ throw new JbpmException("couldn't begin identity transaction", e);
+ }
+ }
+
+ public void prepare() {
+ try {
+ identitySession.save();
+ } catch (IdentityException e) {
+ throw new JbpmException("couldn't save identity transaction", e);
+ }
+ }
+
+ public void commit() {
+ transaction.commit();
+ }
+
+ public void rollback() {
+ transaction.rollback();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/JBossIdmIdentitySessionImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/JBossIdmIdentitySessionImpl.java
new file mode 100644
index 0000000..fdcf1ca
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/JBossIdmIdentitySessionImpl.java
@@ -0,0 +1,397 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.impl;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.jboss.identity.idm.api.Attribute;
+import org.jboss.identity.idm.api.AttributesManager;
+import org.jboss.identity.idm.api.IdentitySearchCriteria;
+import org.jboss.identity.idm.api.IdentitySession;
+import org.jboss.identity.idm.api.RoleType;
+import org.jboss.identity.idm.common.exception.FeatureNotSupportedException;
+import org.jboss.identity.idm.common.exception.IdentityException;
+import org.jboss.identity.idm.common.p3p.P3PConstants;
+import org.jboss.identity.idm.impl.api.SimpleAttribute;
+import org.jboss.identity.idm.impl.api.model.GroupId;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.identity.Group;
+import org.jbpm.api.identity.User;
+
+/**
+ * @author Tom Baeyens
+ * @author Jeff Yu
+ */
+public class JBossIdmIdentitySessionImpl implements org.jbpm.pvm.internal.identity.spi.IdentitySession {
+
+ protected IdentitySession identitySession;
+
+ public String DEFAULT_JBPM_MEMBER_ROLE = "default_jBPM_member_role";
+
+ public String DEFAUL_JBPM_GROUP_TYPE = "default_jBPM_Group_Type";
+
+ public JBossIdmIdentitySessionImpl(IdentitySession identitySession) {
+ this.identitySession = identitySession;
+ }
+
+ public String createUser(String userName, String givenName, String familyName, String businessEmail) {
+ try {
+
+ org.jboss.identity.idm.api.User idUser= identitySession.getPersistenceManager().createUser(userName);
+
+ List<Attribute> attrs = new ArrayList<Attribute>();
+ if (givenName != null) {
+ attrs.add(new SimpleAttribute(P3PConstants.INFO_USER_NAME_GIVEN, givenName));
+ }
+ if (familyName != null) {
+ attrs.add(new SimpleAttribute(P3PConstants.INFO_USER_NAME_FAMILY, familyName));
+ }
+ if (businessEmail != null) {
+ attrs.add(new SimpleAttribute(P3PConstants.INFO_USER_BUSINESS_INFO_ONLINE_EMAIL, businessEmail));
+ }
+
+ identitySession.getAttributesManager().addAttributes(idUser, attrs.toArray(new Attribute[attrs.size()]));
+ return idUser.getId();
+
+ } catch (IdentityException e) {
+ throw new JbpmException("couldn't create user "+userName, e);
+ }
+
+ }
+
+
+ public List<User> findUsers() {
+ try {
+ Collection<org.jboss.identity.idm.api.User> idUsers =
+ identitySession.getPersistenceManager().findUser((IdentitySearchCriteria)null);
+
+ List<User> users = new ArrayList<User>();
+ for (org.jboss.identity.idm.api.User idUser : idUsers) {
+ users.add(getUserInfo(idUser));
+ }
+
+ return users;
+
+ } catch (IdentityException e) {
+ throw new JbpmException("couldn't get users from identity component", e);
+ }
+ }
+
+ public User findUserById(String userId) {
+ try {
+ org.jboss.identity.idm.api.User idUser = identitySession.getPersistenceManager().findUser(userId);
+ if (idUser != null) {
+ return getUserInfo(idUser);
+ }
+ return null;
+ } catch (IdentityException e) {
+ throw new JbpmException("couldn't get user from id of " + userId, e);
+ }
+ }
+
+private User getUserInfo(org.jboss.identity.idm.api.User idUser) throws IdentityException {
+ String name = idUser.getId();
+ String givenName = getAttributeString(idUser, P3PConstants.INFO_USER_NAME_GIVEN);
+ String familyName = getAttributeString(idUser, P3PConstants.INFO_USER_NAME_FAMILY);
+ String businessEmail = getAttributeString(idUser, P3PConstants.INFO_USER_BUSINESS_INFO_ONLINE_EMAIL);
+
+ UserImpl user = new UserImpl(name, givenName, familyName);
+ user.setBusinessEmail(businessEmail);
+ return user;
+}
+
+ public List<User> findUsersById(String... userIds) {
+ List<User> users = new ArrayList<User>();
+ for (String userId : userIds){
+ User user = findUserById(userId);
+ if (user != null) {
+ users.add(user);
+ }
+ }
+
+ return users;
+ }
+
+ public List<User> findUsersByGroup(String groupId) {
+ try {
+ List<User> users = new ArrayList<User>();
+ org.jboss.identity.idm.api.Group idGroup = findIdmGroupByIdmGroupId(convertjbpmGroupId2IdmGroupId(groupId));
+ if (idGroup == null){
+ return users;
+ }
+ Collection<org.jboss.identity.idm.api.User> idusers =
+ identitySession.getRoleManager().findUsersWithRelatedRole(idGroup, null);
+ for (org.jboss.identity.idm.api.User iduser : idusers) {
+ users.add(findUserById(iduser.getId()));
+ }
+
+ return users;
+ } catch (IdentityException e) {
+ throw new JbpmException("couldn't find users by groupid: " + groupId, e);
+ } catch (FeatureNotSupportedException e) {
+ throw new JbpmException("couldn't find users by groupid: " + groupId, e);
+ }
+
+ }
+
+ public void deleteUser(String userName) {
+ try {
+ identitySession.getPersistenceManager().removeUser(userName, true);
+ } catch (IdentityException e) {
+ throw new JbpmException("couldn't delete user ["+userName + "]", e);
+ }
+ }
+
+ public String createGroup(String groupName, String groupType, String parentGroupId) {
+
+ try {
+ String gtype = groupType;
+ if (gtype == null) {
+ gtype = DEFAUL_JBPM_GROUP_TYPE;
+ }
+ org.jboss.identity.idm.api.Group group = identitySession.getPersistenceManager().createGroup(groupName, gtype);
+ String groupId = group.getId();
+
+ if (parentGroupId!=null) {
+ org.jboss.identity.idm.api.Group parentGroup = findIdmGroupByIdmGroupId(convertjbpmGroupId2IdmGroupId(parentGroupId));
+ if (parentGroup==null) {
+ throw new JbpmException("parent group "+parentGroupId+" doesn't exist");
+ }
+ identitySession.getRelationshipManager().associateGroups(parentGroup, group);
+ }
+ return convertIdmGroupId2jbpmGroupId(groupId);
+
+ } catch (IdentityException e) {
+ throw new JbpmException("couldn't create group "+groupName, e);
+ }
+
+ }
+
+ public Group findGroupById(String groupId) {
+ try {
+ org.jboss.identity.idm.api.Group idGroup = findIdmGroupByIdmGroupId(convertjbpmGroupId2IdmGroupId(groupId));
+ if (idGroup == null) {
+ return null;
+ }
+ GroupImpl group = new GroupImpl();
+ group.setId(convertIdmGroupId2jbpmGroupId(idGroup.getId()));
+ group.setType(idGroup.getGroupType());
+ group.setName(idGroup.getName());
+
+ Collection<org.jboss.identity.idm.api.Group> idParentGroups =
+ identitySession.getRelationshipManager().findAssociatedGroups(idGroup, null, false, false);
+
+ if (idParentGroups.size() > 0) {
+ org.jboss.identity.idm.api.Group idParent = idParentGroups.iterator().next();
+ GroupImpl parentGroup = new GroupImpl();
+ parentGroup.setId(convertIdmGroupId2jbpmGroupId(idParent.getId()));
+ parentGroup.setType(idParent.getGroupType());
+ parentGroup.setName(idParent.getName());
+
+ group.setParent(parentGroup);
+ }
+
+ return group;
+
+ } catch (IdentityException e) {
+ throw new JbpmException("couldn't find group by id [" + groupId + "]", e);
+ }
+ }
+
+ public List<Group> findGroupsByGroupType(String groupType) {
+ try {
+ Collection<org.jboss.identity.idm.api.Group> idGroups = identitySession.getPersistenceManager().
+ findGroup(groupType);
+
+ List<Group> groups = new ArrayList<Group>();
+ for (org.jboss.identity.idm.api.Group idGroup: idGroups) {
+ groups.add(findGroupById(convertIdmGroupId2jbpmGroupId(idGroup.getId())));
+ }
+
+ return groups;
+
+ } catch (IdentityException e) {
+ throw new JbpmException("couldn't get groups from identity component, groupType [" + groupType + "]", e);
+ }
+ }
+
+ public List<Group> findGroupsByUser(String userId) {
+
+ try {
+ Collection<org.jboss.identity.idm.api.Group> idGroups = identitySession.getRoleManager()
+ .findGroupsWithRelatedRole(userId, null);
+
+ List<Group> groups = new ArrayList<Group>();
+ for (org.jboss.identity.idm.api.Group idGroup : idGroups) {
+ groups.add(findGroupById(convertIdmGroupId2jbpmGroupId(idGroup.getId())));
+ }
+ return groups;
+ } catch (Exception e) {
+ throw new JbpmException("Couldn't get Groups by userId [" + userId + "]", e);
+
+ }
+ }
+
+ public List<Group> findGroupsByUserAndGroupType(String userName, String groupType) {
+ try {
+ org.jboss.identity.idm.api.User idUser = identitySession.getPersistenceManager().findUser(userName);
+
+ Collection<org.jboss.identity.idm.api.Group> idGroups = identitySession.getRoleManager()
+ .findGroupsWithRelatedRole(idUser, groupType, null);
+ List<Group> groups = new ArrayList<Group>();
+
+ for (org.jboss.identity.idm.api.Group idGroup : idGroups) {
+ groups.add(findGroupById(convertIdmGroupId2jbpmGroupId(idGroup.getId())));
+ }
+ return groups;
+ } catch (Exception e) {
+ throw new JbpmException("couldn't get groups for user "+userName+" and groupType "+groupType, e);
+ }
+ }
+
+ public void deleteGroup(String groupId) {
+ try {
+ org.jboss.identity.idm.api.Group group = findIdmGroupByIdmGroupId(convertjbpmGroupId2IdmGroupId(groupId));
+
+ if (group==null) {
+ return;
+ }
+
+ identitySession.getPersistenceManager().removeGroup(group, true);
+
+ } catch (IdentityException e) {
+ throw new JbpmException("couldn't delete group "+groupId, e);
+ }
+ }
+
+ public void createMembership(String userId, String groupId, String role) {
+ try {
+ org.jboss.identity.idm.api.Group group = findIdmGroupByIdmGroupId(convertjbpmGroupId2IdmGroupId(groupId));
+ if (group==null) {
+ throw new JbpmException("group "+groupId+" doesn't exist");
+ }
+
+ org.jboss.identity.idm.api.User idUser = identitySession.getPersistenceManager().findUser(userId);
+ if (idUser==null) {
+ throw new JbpmException("user "+userId+" doesn't exist");
+ }
+
+ if (role == null) {
+ role = DEFAULT_JBPM_MEMBER_ROLE;
+ }
+ RoleType roleType = identitySession.getRoleManager().getRoleType(role);
+ System.out.println("The Role Type is: " + roleType);
+ if (roleType == null) {
+ roleType = identitySession.getRoleManager().createRoleType(role);
+ }
+ identitySession.getRoleManager().createRole(roleType, idUser, group);
+
+ } catch (Exception e) {
+ throw new JbpmException("couldn't create membership "+userId+", "+groupId+", "+role, e);
+ }
+ }
+
+ public void deleteMembership(String userId, String groupId, String role) {
+ try {
+ RoleType rtype = identitySession.getRoleManager().getRoleType(role);
+ identitySession.getRoleManager().removeRole(rtype.getName(), userId, convertjbpmGroupId2IdmGroupId(groupId));
+ } catch (Exception e) {
+ throw new JbpmException("couldn't delete the membership [" + userId + "," + groupId + "," + role + "]", e);
+ }
+
+ }
+
+ protected org.jboss.identity.idm.api.Group findIdmGroupByIdmGroupId(String groupId) {
+ try {
+ return identitySession.getPersistenceManager().findGroupById(groupId);
+ } catch (IdentityException e) {
+ throw new JbpmException("couldn't find the group by groupId: " + groupId, e);
+ }
+ }
+
+ protected String getAttributeString(org.jboss.identity.idm.api.User idUser, String attributeName) throws IdentityException {
+ return getAttributeString(idUser, null, attributeName);
+ }
+
+ protected String getAttributeString(org.jboss.identity.idm.api.Group idGroup, String attributeName) throws IdentityException {
+ return getAttributeString(null, idGroup, attributeName);
+ }
+
+ protected String getAttributeString(org.jboss.identity.idm.api.User idUser, org.jboss.identity.idm.api.Group idGroup, String attributeName) throws IdentityException {
+ AttributesManager attributesManager = identitySession.getAttributesManager();
+ Attribute attribute = null;
+ if (idUser !=null) {
+ attribute = attributesManager.getAttribute(idUser, attributeName);
+ } else {
+ attribute = attributesManager.getAttribute(idGroup, attributeName);
+ }
+ if (attribute!=null) {
+ return (String) attribute.getValue();
+ }
+ return null;
+ }
+
+
+ /**
+ * Return jBPM groupId, which is: GroupType.GroupName, from IDM GroupId
+ *
+ * @param groupId
+ * @return
+ */
+ private String convertIdmGroupId2jbpmGroupId(String groupId) {
+ GroupId theGroupId = new GroupId(groupId);
+ if (this.DEFAUL_JBPM_GROUP_TYPE.equals(theGroupId.getType()) || theGroupId.getType() == null) {
+ return theGroupId.getName();
+ }
+ return theGroupId.getType() + "." + theGroupId.getName();
+ }
+
+ /**
+ * Convert the jBPM GroupId to IDM GroupId.
+ *
+ * @param jbpmGroupId
+ * @return
+ */
+ private String convertjbpmGroupId2IdmGroupId(String jbpmGroupId) {
+ StringTokenizer st = new StringTokenizer(jbpmGroupId, ".");
+ String type = DEFAUL_JBPM_GROUP_TYPE;
+ if (st.countTokens() > 1) {
+ type = st.nextToken();
+ }
+ String name = st.nextToken();
+
+ return new GroupId(name, type).getId();
+ }
+
+ public IdentitySession getIdentitySession() {
+ return identitySession;
+ }
+
+ public void setIdentitySession(IdentitySession identitySession) {
+ this.identitySession = identitySession;
+ }
+
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/JbpmIdentityStore.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/JbpmIdentityStore.java
new file mode 100644
index 0000000..2fdbd43
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/JbpmIdentityStore.java
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.impl;
+
+import org.hibernate.ejb.HibernateEntityManager;
+import org.jboss.identity.idm.common.exception.IdentityException;
+import org.jboss.identity.idm.impl.store.hibernate.HibernateIdentityStoreImpl;
+import org.jboss.identity.idm.spi.store.IdentityStoreInvocationContext;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class JbpmIdentityStore extends HibernateIdentityStoreImpl {
+
+ public JbpmIdentityStore(String id) {
+ super(id);
+ }
+
+ protected HibernateEntityManager bootstrapHibernateEntityManager(String persistenceUnit) throws IdentityException {
+ return getEntityManagerFromEnvironment();
+ }
+
+ protected HibernateEntityManager getHibernateEntityManager(IdentityStoreInvocationContext ctx) throws IdentityException {
+ return getEntityManagerFromEnvironment();
+ }
+
+ protected HibernateEntityManager getEntityManagerFromEnvironment() {
+ return EnvironmentImpl.getFromCurrent(HibernateEntityManager.class);
+ }
+
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/MembershipImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/MembershipImpl.java
new file mode 100644
index 0000000..21d5746
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/MembershipImpl.java
@@ -0,0 +1,67 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.impl;
+
+import org.jbpm.api.identity.Group;
+import org.jbpm.api.identity.User;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class MembershipImpl {
+
+ protected long dbid;
+ protected int dbversion;
+
+ protected User user;
+ protected Group group;
+ protected String role;
+
+ public User getUser() {
+ return user;
+ }
+
+ public void setUser(User user) {
+ this.user = user;
+ }
+
+ public Group getGroup() {
+ return group;
+ }
+
+ public void setGroup(Group group) {
+ this.group = group;
+ }
+
+ public String getRole() {
+ return role;
+ }
+
+ public void setRole(String role) {
+ this.role = role;
+ }
+
+ public void setDbid(long dbid) {
+ this.dbid = dbid;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/UserImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/UserImpl.java
new file mode 100644
index 0000000..8b9d9f0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/impl/UserImpl.java
@@ -0,0 +1,101 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.impl;
+
+import java.io.Serializable;
+
+import org.jbpm.api.identity.User;
+
+/**
+ * @author Tom Baeyens
+ */
+public class UserImpl implements User, Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+ protected int dbversion;
+
+ protected String id;
+ protected String password;
+ protected String givenName;
+ protected String familyName;
+ protected String businessEmail;
+
+ public UserImpl() {
+ }
+
+ public UserImpl(String id, String givenName, String familyName) {
+ this.id = id;
+ this.givenName = givenName;
+ this.familyName = familyName;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getGivenName() {
+ return givenName;
+ }
+
+ public String getFamilyName() {
+ return familyName;
+ }
+
+ public String getBusinessEmail() {
+ return businessEmail;
+ }
+
+ public String toString() {
+ return givenName != null ? familyName != null ? givenName + ' ' + familyName : givenName
+ : familyName != null ? familyName : id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public void setGivenName(String givenName) {
+ this.givenName = givenName;
+ }
+
+ public void setFamilyName(String familyName) {
+ this.familyName = familyName;
+ }
+
+ public void setBusinessEmail(String emailAddress) {
+ this.businessEmail = emailAddress;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public void setDbid(long dbid) {
+ this.dbid = dbid;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/spi/IdentitySession.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/spi/IdentitySession.java
new file mode 100644
index 0000000..cd8ad23
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/identity/spi/IdentitySession.java
@@ -0,0 +1,86 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.identity.spi;
+
+import java.util.List;
+
+import org.jbpm.api.identity.Group;
+import org.jbpm.api.identity.User;
+
+/**
+ * @author Tom Baeyens
+ */
+public interface IdentitySession {
+
+ /** create a new user */
+ String createUser(String userId, String givenName, String familyName, String businessEmail);
+
+ /** lookup a user.
+ * @return the user or null if no such user exists */
+ User findUserById(String userId);
+
+ /** lookup users with the given identifiers.
+ * @return an empty list if no such users exist */
+ List<User> findUsersById(String... userIds);
+
+ /** get all the users in the system.
+ * @return an empty list if no users exist. */
+ List<User> findUsers();
+
+ /** delete the given user.
+ * No effect (no exception) if the user does not exist. */
+ void deleteUser(String userId);
+
+ /** create a group new group
+ * @return the generated id for this group. */
+ String createGroup(String groupName, String groupType, String parentGroupId);
+
+ /**
+ * lookup users with membership in group.
+ * @return the users or an empty list if no users exist */
+ List<User> findUsersByGroup(String groupId);
+
+ /** lookup a group.
+ * @return the user or null if no such user exists */
+ Group findGroupById(String groupId);
+
+ /** groups of the given groupType for which the given user is a member.
+ * @return an empty list if no such groups exist. */
+ List<Group> findGroupsByUserAndGroupType(String userId, String groupType);
+
+ /** all groups for which this user is a member.
+ * @return an empty list if no such groups exist. */
+ List<Group> findGroupsByUser(String userId);
+
+ /** deletes the given group.
+ * No effect (no exception) if the group does not exist. */
+ void deleteGroup(String groupId);
+
+ /** makes the given user a member of the given group with the given role.
+ * Role can be null. */
+ void createMembership(String userId, String groupId, String role);
+
+ /** makes the given user a member of the given group with the given role.
+ * Role can be null. If no such membership exists, this method will
+ * not throw an exception and have no effect. */
+ void deleteMembership(String userId, String groupId, String role);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jms/JmsMessageSession.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jms/JmsMessageSession.java
new file mode 100644
index 0000000..d98d2b4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jms/JmsMessageSession.java
@@ -0,0 +1,95 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.jms;
+
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.job.Message;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.session.MessageSession;
+
+/** message service implementation based on JMS.
+ * @author Tom Baeyens
+ */
+public class JmsMessageSession implements MessageSession {
+
+ private static final long serialVersionUID = 1L;
+
+ /* injected */
+ DbSession dbSession;
+
+ /* injected */
+ Session jmsSession;
+
+ /* injected */
+ Destination jmsDestination;
+
+ // Connection connection;
+
+ // If you use an XA connection factory in JBoss, the parameters will be ignored. It will always take part in the global JTA transaction.
+ // If you use a non XQ connection factory, the first parameter specifies wether you want to have all message productions and
+ // consumptions as part of one transaction (TRUE) or wether you want all productions and consumptions to be instantanious (FALSE)
+ // Of course, we never want messages to be received before the current jbpm transaction commits so we just set it to true.
+ // Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
+
+
+ public void send(Message message) {
+ try {
+
+ dbSession.save(message);
+
+ javax.jms.Message jmsMessage = jmsSession.createMessage();
+ MessageProducer messageProducer = jmsSession.createProducer(jmsDestination);
+ try {
+ messageProducer.send(jmsMessage);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't send jms message: "+e.getMessage(), e);
+ } finally {
+ messageProducer.close();
+ }
+
+ jmsMessage.setStringProperty("jobId", message.getId());
+
+ /*
+ if (jobImpl.getToken()!=null) {
+ message.setLongProperty("tokenId", jobImpl.getToken().getId());
+ }
+ if (jobImpl.getProcessInstance()!=null) {
+ message.setLongProperty("processInstanceId", jobImpl.getProcessInstance().getId());
+ }
+ if (jobImpl.getTaskInstance()!=null) {
+ message.setLongProperty("taskInstanceId", jobImpl.getTaskInstance().getId());
+ }
+ */
+
+ } catch (JMSException e) {
+ throw new JbpmException("couldn't send jms message", e);
+ }
+ }
+
+ public void close() {
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jms/JmsMessageUtil.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jms/JmsMessageUtil.java
new file mode 100644
index 0000000..34561f8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jms/JmsMessageUtil.java
@@ -0,0 +1,76 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */package org.jbpm.pvm.internal.jms;
+
+import java.util.Enumeration;
+
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.ObjectMessage;
+import javax.jms.Queue;
+import javax.jms.Topic;
+
+import org.jbpm.internal.log.Log;
+
+/** message printing and destination name extraction.
+ * @author Tom Baeyens, Jim Rigsbee
+ */
+public class JmsMessageUtil {
+
+ private static final Log log = Log.getLog(JmsMessageUtil.class.getName());
+
+ public static String dump(Message message) {
+ StringBuilder dump = new StringBuilder();
+
+ dump.append("JMS MessageImpl Dump\n").append("MessageImpl type is " + message.getClass().getName() + "\n");
+
+ try {
+ if (message instanceof ObjectMessage) {
+ dump.append("MessageImpl object type is " + ((ObjectMessage) message).getObject().getClass().getName() + "\n");
+ }
+ dump.append("Reply to " + getDestinationName(message.getJMSReplyTo()) + "\n");
+ Enumeration<?> e = message.getPropertyNames();
+ while (e.hasMoreElements()) {
+ String propertyName = (String) e.nextElement();
+ Object property = message.getObjectProperty(propertyName);
+ dump.append("Property " + propertyName + " value " + property.toString() + "\n");
+ }
+ } catch (JMSException j) {
+ log.error("JMS exception while dumping message", j);
+ }
+
+ return dump.toString();
+ }
+
+ public static String getDestinationName(Destination d) {
+ try {
+ if (d instanceof Queue)
+ return ((Queue) d).getQueueName();
+ else if (d instanceof Topic)
+ return ((Topic) d).getTopicName();
+ } catch (JMSException j) {
+ log.error("JMS exception while getting destination name", j);
+ };
+
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/job/CommandMessage.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/job/CommandMessage.java
new file mode 100644
index 0000000..8447671
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/job/CommandMessage.java
@@ -0,0 +1,59 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.job;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CommandMessage extends MessageImpl<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ public CommandMessage() {
+ }
+
+ public CommandMessage(Descriptor commandDescriptor) {
+ throw new JbpmException("obsolete");
+ }
+
+ public CommandMessage(Command<?> command) {
+ setConfiguration(command);
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ Command<?> command = (Command<?>) getConfiguration();
+ command.execute(environment);
+
+ DbSession dbSession = environment.get(DbSession.class);
+ dbSession.delete(this);
+
+ return null;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/job/JobImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/job/JobImpl.java
new file mode 100644
index 0000000..116756c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/job/JobImpl.java
@@ -0,0 +1,197 @@
+package org.jbpm.pvm.internal.job;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.Date;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.job.Job;
+import org.jbpm.pvm.internal.lob.Lob;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+public abstract class JobImpl<T> implements Command<T>, Serializable, Job {
+
+ private static final long serialVersionUID = 1L;
+ // private static final DateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss,SSS");
+
+ public static final String STATE_WAITING = "waiting";
+ public static final String STATE_ACQUIRED = "acquired";
+ public static final String STATE_ERROR = "error";
+ public static final String STATE_SUSPENDED = "suspended";
+
+ protected long dbid;
+ protected int dbversion;
+
+ /** date until which the command should not be executed
+ * for async messages, this duedate should be set to null. */
+ protected Date duedate = null;
+
+ /** job state. */
+ protected String state = STATE_WAITING;
+
+ /** the execution (if any) for this job */
+ protected ExecutionImpl execution;
+
+ /** the process instance */
+ protected ExecutionImpl processInstance;
+
+ // execution members
+
+ /** specifies if this jobImpl can be executed concurrently with other jobs for the
+ * same execution. */
+ protected boolean isExclusive;
+
+ /** name of the jobImpl executor name that has locked this jobImpl. */
+ protected String lockOwner;
+
+ /** the time the lock on this jobImpl expires. */
+ protected Date lockExpirationTime;
+
+ /** stack trace of the exception that occurred during command execution. */
+ protected String exception;
+
+ /** number of attempts left to try. Should be decremented each time an exception
+ * occurs during command execution. */
+ protected int retries = 3;
+
+ protected Lob configurationBytes;
+
+ protected Object configuration;
+
+ /** a command that can be used as the behaviour of this job */
+ protected Descriptor commandDescriptor;
+
+ public JobImpl() {
+ }
+
+ public void setExecution(ExecutionImpl execution) {
+ this.execution = execution;
+ this.processInstance = execution.getProcessInstance();
+ }
+
+ public void acquire(String lockOwner, Date lockExpirationTime) {
+ this.state = STATE_ACQUIRED;
+ this.lockOwner = lockOwner;
+ this.lockExpirationTime = lockExpirationTime;
+ }
+ public void release() {
+ this.state = STATE_WAITING;
+ this.lockOwner = null;
+ this.lockExpirationTime = null;
+ }
+ public void setRetries(int retries) {
+ this.retries = retries;
+ if (this.retries==0) {
+ this.state = STATE_ERROR;
+ }
+ }
+ public void suspend() {
+ this.state = STATE_SUSPENDED;
+ }
+ public void resume() {
+ if (retries==0) {
+ this.state = STATE_ERROR;
+ } else {
+ this.state = STATE_WAITING;
+ }
+ }
+
+ public Object getConfiguration() {
+ if ( (configuration==null)
+ && (configurationBytes!=null)
+ ) {
+ try {
+ byte[] bytes = configurationBytes.extractBytes();
+ ByteArrayInputStream byteStream = new ByteArrayInputStream(bytes);
+ ObjectInputStream objectStream = new ObjectInputStream(byteStream);
+ configuration = objectStream.readObject();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't deserialize configuration object for "+this, e);
+ }
+ }
+ return configuration;
+ }
+
+ public void setConfiguration(Object configuration) {
+ this.configuration = configuration;
+
+ try {
+ ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
+ ObjectOutputStream objectStream = new ObjectOutputStream(byteStream);
+ objectStream.writeObject(configuration);
+ byte[] bytes = byteStream.toByteArray();
+ configurationBytes = new Lob(bytes, true);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't serialize configuration object for "+this, e);
+ }
+ }
+
+ // customized getters and setters ///////////////////////////////////////////
+
+ public String getId() {
+ return Long.toString(dbid);
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public long getDbid() {
+ return dbid;
+ }
+ public void setDbid(long id) {
+ dbid = id;
+ }
+ public String getLockOwner() {
+ return lockOwner;
+ }
+ /** @deprecated */
+ public Date getDueDate() {
+ return getDuedate();
+ }
+ public Date getDuedate() {
+ return duedate;
+ }
+ public void setDuedate(Date duedate) {
+ this.duedate = duedate;
+ }
+ public String getException() {
+ return exception;
+ }
+ public int getRetries() {
+ return retries;
+ }
+ public boolean isExclusive() {
+ return isExclusive;
+ }
+ public ExecutionImpl getExecution() {
+ return execution;
+ }
+ public void setExclusive(boolean isExclusive) {
+ this.isExclusive = isExclusive;
+ }
+ public void setLockOwner(String jobExecutorName) {
+ this.lockOwner = jobExecutorName;
+ }
+ public ExecutionImpl getProcessInstance() {
+ return processInstance;
+ }
+ public void setException(String exception) {
+ this.exception = exception;
+ }
+ public Date getLockExpirationTime() {
+ return lockExpirationTime;
+ }
+ public void setLockExpirationTime(Date lockExpirationTime) {
+ this.lockExpirationTime = lockExpirationTime;
+ }
+ public Descriptor getCommandDescriptor() {
+ return commandDescriptor;
+ }
+ public void setCommandDescriptor(Descriptor commandDescriptor) {
+ this.commandDescriptor = commandDescriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/job/MessageImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/job/MessageImpl.java
new file mode 100644
index 0000000..9e36fcc
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/job/MessageImpl.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.job;
+
+import org.jbpm.api.job.Message;
+import org.jbpm.pvm.internal.id.DbidGenerator;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class MessageImpl<T> extends JobImpl<T> implements Message {
+
+ private static final long serialVersionUID = 1L;
+
+ public MessageImpl() {
+ }
+
+ public String toString() {
+ return "message["+dbid+"]";
+ }
+
+ public MessageImpl(ExecutionImpl execution) {
+ this.execution = execution;
+ this.processInstance = execution.getProcessInstance();
+ this.dbid = DbidGenerator.getDbidGenerator().getNextId();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/job/TimerImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/job/TimerImpl.java
new file mode 100644
index 0000000..0dc15d0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/job/TimerImpl.java
@@ -0,0 +1,181 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.job;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.job.Timer;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.cal.BusinessCalendar;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.id.DbidGenerator;
+import org.jbpm.pvm.internal.jobexecutor.JobAddedNotification;
+import org.jbpm.pvm.internal.jobexecutor.JobExecutor;
+import org.jbpm.pvm.internal.model.ObservableElement;
+import org.jbpm.pvm.internal.script.ScriptManager;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.session.TimerSession;
+import org.jbpm.pvm.internal.tx.Transaction;
+import org.jbpm.pvm.internal.util.Clock;
+
+/** a runtime timer instance.
+ *
+ * <p>Timers can be
+ * </p>
+ *
+ * @author Tom Baeyens
+ * @author Pascal Verdage
+ * @author Alejandro Guizar
+ */
+public class TimerImpl extends JobImpl<Boolean> implements Timer {
+
+ private static final long serialVersionUID = 1L;
+ private static final Log log = Log.getLog(TimerImpl.class.getName());
+
+ private final static String dateFormat = "yyyy-MM-dd HH:mm:ss,SSS";
+
+ protected String signalName;
+ protected String eventName;
+ protected String repeat;
+
+ public static final String EVENT_TIMER = "timer";
+
+ public TimerImpl() {
+ }
+
+ public void schedule() {
+ this.dbid = DbidGenerator.getDbidGenerator().getNextId();
+ TimerSession timerSession = EnvironmentImpl.getFromCurrent(TimerSession.class);
+ timerSession.schedule(this);
+ }
+
+ public void setDueDateDescription(String dueDateDescription) {
+ ScriptManager scriptManager = ScriptManager.getScriptManager();
+ dueDateDescription = (String) scriptManager.evaluateExpression(dueDateDescription, null);
+ Date now = Clock.getCurrentTime();
+ BusinessCalendar businessCalendar = EnvironmentImpl.getFromCurrent(BusinessCalendar.class);
+ duedate = businessCalendar.add(now, dueDateDescription);
+ }
+
+ public Boolean execute(Environment environment) throws Exception {
+ if (log.isDebugEnabled()) log.debug("executing " + this);
+
+ if (environment==null) {
+ throw new JbpmException("environment is null");
+ }
+
+ if (signalName!=null) {
+ if (log.isDebugEnabled()) log.debug("feeding timer signal "+signalName+" into "+execution);
+ execution.signal(signalName);
+ }
+
+ if (eventName!=null) {
+ ObservableElement eventSource = execution.getActivity();
+ if (log.isDebugEnabled()) log.debug("firing event "+signalName+" into "+eventSource);
+ execution.fire(eventName, eventSource);
+ }
+
+ boolean deleteThisJob = true;
+ // if there is no repeat on this timer
+ if (repeat==null) {
+ // delete the job
+ if (log.isDebugEnabled()) log.debug("deleting " + this);
+ DbSession dbSession = environment.get(DbSession.class);
+ if (dbSession==null) {
+ throw new JbpmException("no "+DbSession.class.getName()+" in environment");
+ }
+ dbSession.delete(this);
+
+ } else { // there is a repeat on this timer
+ deleteThisJob = false;
+ // suppose that it took the timer runner thread a very long time to execute the timers
+ // then the repeat action duedate could already have passed
+ do {
+ setDueDateDescription(repeat);
+ } while (duedate.getTime() <= Clock.getCurrentTime().getTime());
+
+ if (log.isDebugEnabled()) log.debug("rescheduled "+this+" for "+formatDueDate(duedate));
+
+ // release the lock on the timer
+ release();
+
+ // notify the jobExecutor at the end of the transaction
+ JobExecutor jobExecutor = environment.get(JobExecutor.class);
+ if (jobExecutor!=null) {
+ Transaction transaction = environment.get(Transaction.class);
+ if (transaction==null) {
+ throw new JbpmException("no transaction in environment");
+ }
+ JobAddedNotification jobNotificator = new JobAddedNotification(jobExecutor);
+ transaction.registerSynchronization(jobNotificator);
+ }
+ }
+
+ return deleteThisJob;
+ }
+
+ public String toString() {
+ StringBuilder text = new StringBuilder();
+ text.append("timer[");
+ text.append(dbid);
+ if (duedate!=null) {
+ text.append("|");
+ text.append(formatDueDate(duedate));
+ }
+ if (signalName!=null) {
+ text.append("|");
+ text.append(signalName);
+ }
+ if (eventName!=null) {
+ text.append("|");
+ text.append(eventName);
+ }
+ text.append("]");
+ return text.toString();
+ }
+
+ public static String formatDueDate(Date date) {
+ return new SimpleDateFormat(dateFormat).format(date);
+ }
+
+ public String getSignalName() {
+ return signalName;
+ }
+ public void setSignalName(String signalName) {
+ this.signalName = signalName;
+ }
+ public String getEventName() {
+ return eventName;
+ }
+ public void setEventName(String eventName) {
+ this.eventName = eventName;
+ }
+ public String getRepeat() {
+ return repeat;
+ }
+ public void setRepeat(String repeat) {
+ this.repeat = repeat;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/AcquireJobsCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/AcquireJobsCmd.java
new file mode 100644
index 0000000..8548c2f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/AcquireJobsCmd.java
@@ -0,0 +1,98 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.jobexecutor;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.job.JobImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class AcquireJobsCmd implements Command<Collection<Long>> {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Log log = Log.getLog(AcquireJobsCmd.class.getName());
+ private static final DateFormat timeFormat = new SimpleDateFormat("HH:mm:ss,SSS");
+
+ JobExecutor jobExecutor;
+
+ public AcquireJobsCmd(JobExecutor jobExecutor) {
+ this.jobExecutor = jobExecutor;
+ }
+
+ public Collection<Long> execute(Environment environment) throws Exception {
+ Collection<Long> acquiredJobDbids = new ArrayList<Long>();
+
+ try {
+ Collection<JobImpl<?>> acquiredJobs = new ArrayList<JobImpl<?>>();
+
+ DbSession dbSession = environment.get(DbSession.class);
+ if (log.isTraceEnabled()) log.trace("start querying first acquirable job...");
+
+ JobImpl<?> job = dbSession.findFirstAcquirableJob();
+
+ if (job!=null) {
+ if (job.isExclusive()) {
+ if (log.isTraceEnabled()) log.trace("exclusive acquirable job found ("+job+"). querying for other exclusive jobs to lock them all in one tx...");
+ List<JobImpl<?>> otherExclusiveJobs = dbSession.findExclusiveJobs(job.getProcessInstance());
+ acquiredJobs.addAll(otherExclusiveJobs);
+ } else {
+ acquiredJobs.add(job);
+ }
+
+ for (JobImpl<?> acquiredJob: acquiredJobs) {
+ long lockExpirationTime = System.currentTimeMillis()+jobExecutor.getLockMillis();
+ if (log.isTraceEnabled()) log.trace("trying to obtain a lock for '"+acquiredJob+"' with exp "+timeFormat.format(new Date(lockExpirationTime)));
+ acquiredJob.acquire(jobExecutor.getName(), new Date(lockExpirationTime));
+ acquiredJobDbids.add(acquiredJob.getDbid());
+ }
+
+ } else {
+ if (log.isTraceEnabled()) log.trace("no acquirable jobs in job table");
+ }
+
+ if (log.isTraceEnabled()) log.trace("locking jobs "+acquiredJobDbids);
+
+ } catch (Exception e) {
+ // if jboss is still booting exceptions that are due to improper
+ // dependency configuration can be swallowed
+ // https://jira.jboss.org/jira/browse/JBPM-2501
+ if (e.getMessage().indexOf("JbpmDS not bound")==-1) {
+ throw e;
+ }
+ }
+
+ return acquiredJobDbids;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/DispatcherThread.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/DispatcherThread.java
new file mode 100644
index 0000000..db80766
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/DispatcherThread.java
@@ -0,0 +1,184 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.jobexecutor;
+
+import java.util.Collection;
+import java.util.Date;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.cmd.CommandService;
+
+/** this thread is responsible for acquiring jobs in the job that need to be
+ * executed and then let the JobExecutor dispatch the acquired ids to one of the
+ * JobExecutorThreads in the pool. There is only one dispatcher thread per
+ * JobExecutor.
+ *
+ * @author Tom Baeyens, Guillaume Porcher
+ */
+public class DispatcherThread extends Thread {
+
+ private static final Log log = Log.getLog(DispatcherThread.class.getName());
+
+ protected JobExecutor jobExecutor;
+ protected volatile boolean isActive = true;
+ protected boolean checkForNewJobs;
+ protected int currentIdleInterval;
+ protected Object semaphore = new Object();
+
+ protected DispatcherThread(JobExecutor jobExecutor) {
+ this(jobExecutor, "DispatcherThread");
+ }
+
+ protected DispatcherThread(JobExecutor jobExecutor, String name) {
+ super(name);
+ this.jobExecutor = jobExecutor;
+ }
+
+ public void run() {
+ log.info("starting " + getName());
+ currentIdleInterval = jobExecutor.getIdleMillis();
+ try {
+ while (isActive) {
+ try {
+ // checkForNewJobs is set to true in jobWasAdded() below
+ checkForNewJobs = false;
+
+ // try to acquire jobs
+ Collection<Long> acquiredJobDbids = acquireJobs();
+
+ // no exception so resetting the currentIdleInterval
+ currentIdleInterval = jobExecutor.getIdleMillis();
+ if ((acquiredJobDbids != null) && (!acquiredJobDbids.isEmpty())) {
+ submitAcquiredJobDbids(acquiredJobDbids);
+ log.debug("added jobs "+acquiredJobDbids+" to the queue");
+
+ } else if (isActive) {
+ long waitPeriod = getWaitPeriod();
+ if (waitPeriod > 0) {
+ synchronized (semaphore) {
+ if (!checkForNewJobs) {
+ log.trace(getName()+" will wait for max "+waitPeriod+"ms on "+jobExecutor);
+ semaphore.wait(waitPeriod);
+ log.trace(getName()+" woke up");
+ } else {
+ log.debug("skipped wait because new message arrived");
+ }
+ }
+ }
+ }
+
+ } catch (InterruptedException e) {
+ log.info((isActive ? "active" : "inactive") + " job dispatcher thread '" + getName() + "' got interrupted");
+ } catch (Exception e) {
+ // the exception doesn't have to be logged if jboss is still booting
+ // this should be replaced with proper dependency configuration
+ // https://jira.jboss.org/jira/browse/JBPM-2501
+ if (e.getMessage().indexOf("couldn't lookup 'UserTransaction' from jndi: UserTransaction not bound: UserTransaction not bound")==-1) {
+ log.error("exception in job executor thread. waiting " + currentIdleInterval + " milliseconds", e);
+ }
+ try {
+ synchronized (semaphore) {
+ semaphore.wait(currentIdleInterval);
+ }
+ } catch (InterruptedException e2) {
+ log.trace("delay after exception got interrupted", e2);
+ }
+ // after an exception, the current idle interval is doubled to prevent
+ // continuous exception generation when e.g. the db is unreachable
+ currentIdleInterval = currentIdleInterval * 2;
+ }
+ }
+ } finally {
+ log.info(getName() + " leaves cyberspace");
+ }
+ }
+
+ protected void submitAcquiredJobDbids(Collection<Long> jobDbids) {
+ log.debug("submitting jobs "+jobDbids);
+ jobExecutor.getThreadPool().submit(
+ new JobParcel(jobExecutor.getCommandExecutor(), jobDbids));
+ log.trace("jobs "+jobDbids+" were submitted");
+ }
+
+ protected Collection<Long> acquireJobs() {
+ CommandService commandService = jobExecutor.getCommandExecutor();
+ Command<Collection<Long>> acquireJobsCommand = jobExecutor.getAcquireJobsCommand();
+ return commandService.execute(acquireJobsCommand);
+ }
+
+ protected Date getNextDueDate() {
+ CommandService commandService = jobExecutor.getCommandExecutor();
+ Command<Date> getNextDueDate = jobExecutor.getNextDueDateCommand();
+ return commandService.execute(getNextDueDate);
+ }
+
+ protected long getWaitPeriod() {
+ long interval = jobExecutor.getIdleMillis();
+ Date nextDueDate = getNextDueDate();
+ if (nextDueDate != null) {
+ long currentTimeMillis = System.currentTimeMillis();
+ long nextDueDateTime = nextDueDate.getTime();
+ if (nextDueDateTime < currentTimeMillis + currentIdleInterval) {
+ interval = nextDueDateTime - currentTimeMillis;
+ }
+ }
+ if (interval < 0) {
+ interval = 0;
+ }
+ return interval;
+ }
+
+ public void deactivate() {
+ deactivate(false);
+ }
+
+ public void deactivate(boolean join) {
+ if (isActive) {
+ log.debug("deactivating "+getName());
+ isActive = false;
+ interrupt();
+ if (join) {
+ try {
+ log.debug("joining "+getName());
+ join();
+ } catch (InterruptedException e) {
+ log.trace("joining "+getName()+" got interrupted");
+ }
+ }
+ } else {
+ log.trace("ignoring deactivate: "+getName()+" is not active");
+ }
+ }
+
+ public void jobWasAdded() {
+ log.trace("notifying job executor dispatcher thread of new job");
+ synchronized (semaphore) {
+ checkForNewJobs = true;
+ semaphore.notify();
+ }
+ }
+
+ public boolean isActive() {
+ return isActive;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/GetNextDueDateCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/GetNextDueDateCmd.java
new file mode 100644
index 0000000..c299863
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/GetNextDueDateCmd.java
@@ -0,0 +1,61 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.jobexecutor;
+
+import java.util.Date;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.job.JobImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class GetNextDueDateCmd implements Command<Date> {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Log log = Log.getLog(GetNextDueDateCmd.class.getName());
+
+ JobExecutor jobExecutor;
+
+ public GetNextDueDateCmd(JobExecutor jobExecutor) {
+ this.jobExecutor = jobExecutor;
+ }
+
+ public Date execute(Environment environment) throws Exception {
+ Date nextDueDate = null;
+ if (log.isTraceEnabled()) log.trace("getting next due date...");
+ DbSession dbSession = environment.get(DbSession.class);
+ JobImpl<?> job = dbSession.findFirstDueJob();
+ if (job!=null) {
+ nextDueDate = job.getDueDate();
+ }
+ if (log.isTraceEnabled()) log.trace("next due date is "+nextDueDate);
+ return nextDueDate;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobAddedNotification.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobAddedNotification.java
new file mode 100644
index 0000000..1267d40
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobAddedNotification.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.jobexecutor;
+
+import javax.transaction.Synchronization;
+
+import org.jbpm.internal.log.Log;
+
+/** listener that can be registered as a listener to the transaction
+ * to notify the job executor of added jobs so that the dispatcher
+ * thread can wake up.
+ *
+ * @author Tom Baeyens
+ */
+public class JobAddedNotification implements Synchronization {
+
+ private static final Log log = Log.getLog(JobAddedNotification.class.getName());
+
+ JobExecutor jobExecutor;
+
+ public JobAddedNotification(JobExecutor jobExecutor) {
+ this.jobExecutor = jobExecutor;
+ }
+
+ public void afterCompletion(int arg0) {
+ log.trace("notifying job executor of added message");
+ jobExecutor.jobWasAdded();
+ }
+
+ public void beforeCompletion() {
+ }
+
+ public String toString() {
+ return "job-added-notification";
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExceptionHandler.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExceptionHandler.java
new file mode 100644
index 0000000..b23fe0e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExceptionHandler.java
@@ -0,0 +1,102 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.jobexecutor;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import javax.transaction.Synchronization;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.job.JobImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.tx.Transaction;
+
+/**
+ * @author Tom Baeyens
+ */
+public class JobExceptionHandler implements Synchronization, Command<Object> {
+
+ private static final Log log = Log.getLog(JobExceptionHandler.class.getName());
+ private static final long serialVersionUID = 1L;
+
+ protected CommandService commandService;
+ protected long jobDbid;
+ protected Throwable exception;
+
+ public JobExceptionHandler(long jobDbid, Throwable exception, CommandService commandService) {
+ this.commandService = commandService;
+ this.jobDbid = jobDbid;
+ this.exception = exception;
+ }
+
+
+ public void beforeCompletion() {
+ }
+
+ public void afterCompletion(int status) {
+ // after the transaction rolled back,
+ // execute this job exception handler object as a command with
+ // the command service so that this gets done in a separate
+ // transaction
+ log.debug("starting new transaction for handling job exception");
+ commandService.execute(this);
+ log.debug("completed transaction for handling job exception");
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ log.debug("handling job "+jobDbid+" exception: "+exception.getMessage());
+
+ // load the job from the db
+ DbSession dbSession = environment.get(DbSession.class);
+ if (dbSession==null) {
+ throw new JbpmException("no job-session configured to handle job");
+ }
+ JobImpl<?> job = (JobImpl<?>) dbSession.get(JobImpl.class, jobDbid);
+ // serialize the stack trace
+ StringWriter sw = new StringWriter();
+ exception.printStackTrace(new PrintWriter(sw));
+ if (job != null) {
+ // decrement the number of retries
+ int decrementedRetries = job.getRetries()-1;
+ log.debug("decrementing retries to "+decrementedRetries+" for "+job);
+ job.release();
+ job.setRetries(decrementedRetries);
+ job.setException(sw.toString());
+
+ // notify the job executor after the transaction is completed
+ Transaction transaction = environment.get(Transaction.class);
+ JobExecutor jobExecutor = environment.get(JobExecutor.class);
+ if ( (transaction!=null)
+ && (jobExecutor!=null)
+ ) {
+ log.trace("registering job executor notifier with "+transaction);
+ transaction.registerSynchronization(new JobAddedNotification(jobExecutor));
+ }
+ }
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExecutor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExecutor.java
new file mode 100644
index 0000000..a4fec02
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExecutor.java
@@ -0,0 +1,228 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.jobexecutor;
+
+import java.io.Serializable;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.RejectedExecutionHandler;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.cmd.CommandService;
+
+/** manager for job execution threads and their configuration.
+ *
+ * @author Tom Baeyens, Guillaume Porcher
+ */
+public class JobExecutor implements Serializable {
+
+ private static final Log log = Log.getLog(JobExecutor.class.getName());
+
+ private static final long serialVersionUID = 1L;
+
+ // configuration parameters
+
+ CommandService commandService;
+ String name = "JobExecutor-"+getHostName();
+ int nbrOfThreads = 3;
+ int idleMillis = 5*1000; // default normal poll interval is 5 seconds
+ int idleMillisMax = 5*60*1000; // default max poll interval in case of continuous exceptions is 5 minutes
+ int historySize = 200;
+ int lockMillis = 30*60*1000; // default max lock time is 30 minutes
+
+ // runtime state
+
+ Command<Collection<Long>> acquireJobsCommand;
+ Command<Date> nextDueDateCommand;
+
+ boolean isActive;
+
+ ExecutorService threadPool;
+ DispatcherThread dispatcherThread;
+
+ List<JobHistoryEntry> history = new ArrayList<JobHistoryEntry>();
+
+ /** starts the {@link DispatcherThread} and {@link JobExecutorThread}s for this job executor */
+ public synchronized void start() {
+ if (commandService==null) {
+ throw new JbpmException("no command executor available in job executor");
+ }
+ if (! isActive) {
+ acquireJobsCommand = new AcquireJobsCmd(this);
+ nextDueDateCommand = new GetNextDueDateCmd(this);
+
+ isActive = true;
+ log.trace("starting thread pool for job executor '"+name+"'...");
+ threadPool = new ThreadPoolExecutor(nbrOfThreads,
+ nbrOfThreads,
+ 0L,
+ TimeUnit.MILLISECONDS,
+ new ArrayBlockingQueue<Runnable>(nbrOfThreads),
+ JobRejectionHandler.INSTANCE);
+
+ log.trace("starting dispatcher thread for job executor '"+name+"'...");
+ dispatcherThread = new DispatcherThread(this);
+ dispatcherThread.start();
+
+ } else {
+ log.trace("ignoring start: job executor '"+name+"' is already started'");
+ }
+ }
+
+ static final class JobRejectionHandler implements RejectedExecutionHandler {
+
+ static final JobRejectionHandler INSTANCE = new JobRejectionHandler();
+
+ public void rejectedExecution(Runnable task, ThreadPoolExecutor executor) {
+ try {
+ executor.getQueue().put(task);
+ } catch (InterruptedException e) {
+ throw new RejectedExecutionException("queuing " + task + " got interrupted", e);
+ }
+ }
+ }
+
+ /** stops with join set to false.
+ * @see #stop(boolean) */
+ public synchronized void stop() {
+ stop(false);
+ }
+
+ /** signals to all threads managed by this job executor to stop. Stopping the
+ * dispatcher thread is blocking till the dispatcher is no more alive. If join is set to true,
+ * this method will block until all job executor threads
+ * are joined and actually dead. If join is false, the job executor threads are only told to
+ * stop, without waiting till they are actually stopped. It may be that job executor threads
+ * are in the middle of executing a job and they may finish after this method returned.
+ */
+ public synchronized void stop(boolean join) {
+ log.debug("stopping job executor");
+ if (isActive) {
+ isActive = false;
+ dispatcherThread.deactivate(true);
+ threadPool.shutdown();
+ if (join) {
+ try {
+ threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ log.trace("joining "+getName()+" got interrupted");
+ }
+ }
+ } else {
+ log.trace("ignoring stop: job executor '"+name+"' not started");
+ }
+ }
+
+ public void jobWasAdded() {
+ if ( (dispatcherThread!=null)
+ && (dispatcherThread.isActive())
+ ) {
+ dispatcherThread.jobWasAdded();
+ }
+ }
+
+ static String getHostName() {
+ try {
+ return InetAddress.getLocalHost().getHostAddress();
+ } catch (UnknownHostException e) {
+ return "localhost";
+ }
+ }
+
+ protected ExecutorService getThreadPool() {
+ return threadPool;
+ }
+
+ // getters //////////////////////////////////////////////////////////////////
+
+ public String getName() {
+ return name;
+ }
+ public int getHistorySize() {
+ return historySize;
+ }
+ public int getIdleMillis() {
+ return idleMillis;
+ }
+ public boolean isActive() {
+ return isActive;
+ }
+ public int getIdleMillisMax() {
+ return idleMillisMax;
+ }
+ public int getLockMillis() {
+ return lockMillis;
+ }
+ public int getNbrOfThreads() {
+ return nbrOfThreads;
+ }
+ public CommandService getCommandExecutor() {
+ return commandService;
+ }
+ public Command<Collection<Long>> getAcquireJobsCommand() {
+ return acquireJobsCommand;
+ }
+ public Command<Date> getNextDueDateCommand() {
+ return nextDueDateCommand;
+ }
+ public DispatcherThread getDispatcherThread() {
+ return dispatcherThread;
+ }
+ public List<JobHistoryEntry> getHistory() {
+ return history;
+ }
+
+ // configuration setters ////////////////////////////////////////////////////
+
+ public void setCommandExecutor(CommandService commandService) {
+ this.commandService = commandService;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public void setNbrOfJobExecutorThreads(int nbrOfJobExecutorThreads) {
+ this.nbrOfThreads = nbrOfJobExecutorThreads;
+ }
+ public void setIdleInterval(int idleInterval) {
+ this.idleMillis = idleInterval;
+ }
+ public void setMaxIdleInterval(int maxIdleInterval) {
+ this.idleMillisMax = maxIdleInterval;
+ }
+ public void setHistoryMaxSize(int historyMaxSize) {
+ this.historySize = historyMaxSize;
+ }
+ public void setMaxLockTime(int maxLockTime) {
+ this.lockMillis = maxLockTime;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExecutorMessageSession.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExecutorMessageSession.java
new file mode 100644
index 0000000..49a41f5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExecutorMessageSession.java
@@ -0,0 +1,63 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.jobexecutor;
+
+import org.jbpm.api.job.Message;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.session.MessageSession;
+import org.jbpm.pvm.internal.tx.Transaction;
+import org.jbpm.pvm.internal.util.ReflectUtil;
+
+/**
+ * @author Tom Baeyens
+ */
+public class JobExecutorMessageSession implements MessageSession {
+
+ private static final Log log = Log.getLog(JobExecutorMessageSession.class.getName());
+
+ /* injected */
+ DbSession dbSession;
+
+ /* injected */
+ Transaction transaction;
+
+ boolean isNotificationAdded;
+
+ public void send(Message message) {
+ log.debug("sending message "+ReflectUtil.getUnqualifiedClassName(message.getClass()));
+
+ dbSession.save(message);
+
+ if (!isNotificationAdded) {
+ isNotificationAdded = true;
+
+ JobExecutor jobExecutor = EnvironmentImpl.getCurrent().get(JobExecutor.class);
+ if (jobExecutor!=null) {
+ // notify the job executor after the transaction is completed
+ log.trace("registering job executor notifier with "+transaction);
+ transaction.registerSynchronization(new JobAddedNotification(jobExecutor));
+ }
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExecutorServlet.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExecutorServlet.java
new file mode 100644
index 0000000..fe7e569
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExecutorServlet.java
@@ -0,0 +1,118 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.jobexecutor;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jbpm.api.Configuration;
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.env.EnvironmentFactory;
+import org.jbpm.pvm.internal.processengine.ProcessEngineImpl;
+
+/**
+ * starts the job executor on init and closes the
+ * jbpm configuration upon destroy. The closing of the
+ * jbpm configuration will also shut down the job executor
+ * thread pool.
+ * <h1>Config parameters</h1>
+ * <table>
+ * <tr>
+ * <th>Name</th>
+ * <th>Description</th>
+ * <th>Type</th>
+ * <th>Default value</th>
+ * </tr>
+ * <tr>
+ * <td>jbpm.configuration.resource</td>
+ * <td>resource location of the jbpm.cfg.xml</td>
+ * <td>String</td>
+ * <td>jbpm.cfg.xml</td>
+ * </tr>
+ * </table>
+ *
+ * <p>Configuration example:
+ * <pre>
+ * <web-app>
+ * ...
+ * <servlet >
+ * <servlet-name>JobExecutorServlet</servlet-name>
+ * <servlet-class>org.jbpm.job.executor.JobExecutorServlet</servlet-class>
+ * <load-on-startup>1</load-on-startup>
+ * </servlet>
+ * <servlet-mapping >
+ * <servlet-name>JobExecutorServlet</servlet-name>
+ * <url-pattern>/jobexecutor</url-pattern>
+ * </servlet-mapping>
+ * ...
+ * </web-app>
+ * </pre>
+ * </p>
+ *
+ * @author Tom Baeyens
+ */
+public class JobExecutorServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ JobExecutor jobExecutor;
+
+ public void init() throws ServletException {
+ String configurationResource = getInitParameter("jbpm.configuration.resource", "jbpm.cfg.xml");
+ EnvironmentFactory environmentFactory = (EnvironmentFactory) new Configuration().setResource(configurationResource).buildProcessEngine();
+ jobExecutor = environmentFactory.get(JobExecutor.class);
+ if (jobExecutor==null) {
+ throw new JbpmException("no job executor configured in resource "+configurationResource);
+ }
+ jobExecutor.start();
+ }
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ PrintWriter out = response.getWriter();
+ out.println("<html>");
+ out.println("<body>");
+ out.println("<h2>JBoss jBPM job Executor Servlet</h2><hr />");
+ /* TODO
+ Iterator<Thread> iter = jobExecutor.getJobExecutorThreads().values().iterator();
+ while (iter.hasNext()) {
+ Thread thread = iter.next();
+ out.println("<h4>"+thread.getName()+"</h4>");
+ out.println("<b>isAlive</b>:"+thread.isAlive());
+ }
+ */
+ out.println("</body>");
+ out.println("</html>");
+ }
+
+ String getInitParameter(String name, String defaultValue) {
+ String value = getInitParameter(name);
+ if (value!=null) {
+ return value;
+ }
+ return defaultValue;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExecutorTimerSession.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExecutorTimerSession.java
new file mode 100644
index 0000000..f4a0030
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobExecutorTimerSession.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (C) 2007 Bull S. A. S.
+ * Bull, Rue Jean Jaures, B.P.68, 78340, Les Clayes-sous-Bois
+ * This library is free software; you can redistribute it and/or modify it under the terms
+ * of the GNU Lesser General Public License as published by the Free Software Foundation
+ * version 2.1 of the License.
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License along with this
+ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
+ * Floor, Boston, MA 02110-1301, USA.
+ **/
+package org.jbpm.pvm.internal.jobexecutor;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.jbpm.api.Execution;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.job.Timer;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.job.TimerImpl;
+import org.jbpm.pvm.internal.session.TimerSession;
+import org.jbpm.pvm.internal.tx.Transaction;
+
+/**
+ * Timers created with this service are committed at the end of the transaction,
+ * so their execution will be late if the delay is shorter than the transaction.
+ * In that case, they will be executed at the end of the transaction.
+ *
+ * @author Tom Baeyens, Pascal Verdage
+ */
+public class JobExecutorTimerSession implements TimerSession {
+
+ private static final Log log = Log.getLog(TimerSession.class.getName());
+
+ /* injected */
+ Transaction transaction;
+
+ /* injected */
+ JobExecutor jobExecutor;
+
+ /* injected */
+ Session session;
+
+ boolean jobExecutorNotificationScheduled = false;
+
+ public void schedule(Timer timer) {
+ if (timer == null) throw new JbpmException("null timer scheduled");
+ if (timer.getExecution() == null) throw new JbpmException("timer has no execution specified");
+ if ((timer.getSignalName() == null) && (timer.getEventName() == null)) throw new JbpmException("timer has no signalName or eventName specified");
+ if (timer.getDueDate() == null) throw new JbpmException("timer scheduled at null date");
+
+ log.debug("scheduling " + timer);
+ session.save(timer);
+
+ if ( (!jobExecutorNotificationScheduled)
+ && (jobExecutor!=null)
+ ) {
+ jobExecutorNotificationScheduled = true;
+
+ //a transaction is not required (can be null)
+ if (transaction != null) {
+ transaction.registerSynchronization(new JobAddedNotification(jobExecutor));
+ }
+ }
+ }
+
+ public void cancel(Timer timer) {
+ log.debug("canceling " + timer);
+ if (timer != null) {
+ session.delete(timer);
+ } else {
+ throw new JbpmException("timer is null");
+ }
+ }
+
+ public List<Timer> findTimersByExecution(Execution execution) {
+ Query query = session.createQuery(
+ "select timer " +
+ "from "+TimerImpl.class.getName()+" timer " +
+ "where timer.execution = :execution"
+ );
+ query.setEntity("execution", execution);
+ return query.list();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobHistoryEntry.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobHistoryEntry.java
new file mode 100644
index 0000000..a53ba5d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobHistoryEntry.java
@@ -0,0 +1,37 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.jobexecutor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/** one entry in the job execution history.
+ * @author Tom Baeyens
+ */
+public class JobHistoryEntry implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ Date executionTime;
+ String jobDescription;
+ String exception;
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobParcel.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobParcel.java
new file mode 100644
index 0000000..e5653aa
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/jobexecutor/JobParcel.java
@@ -0,0 +1,59 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.jobexecutor;
+
+import java.util.Collection;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.cmd.ExecuteJobCmd;
+
+/**
+ * @author Alejandro Guizar
+ */
+public class JobParcel implements Runnable {
+
+ private static final Log log = Log.getLog(JobParcel.class.getName());
+
+ private final CommandService commandService;
+ private final Collection<Long> jobDbids;
+
+ public JobParcel(CommandService commandService, Collection<Long> jobDbids) {
+ this.commandService = commandService;
+ this.jobDbids = jobDbids;
+ }
+
+ public void run() {
+ try {
+ for (Long jobDbid : jobDbids) {
+ commandService.execute(new ExecuteJobCmd(jobDbid));
+ }
+ } catch (RuntimeException e) {
+ log.error("exception in job block", e);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return JobParcel.class.getSimpleName() + jobDbids;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BlobStrategy.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BlobStrategy.java
new file mode 100644
index 0000000..4123335
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BlobStrategy.java
@@ -0,0 +1,7 @@
+package org.jbpm.pvm.internal.lob;
+
+public interface BlobStrategy {
+
+ void set(byte[] bytes, Lob lob);
+ byte[] get(Lob lob);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BlobStrategyBinary.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BlobStrategyBinary.java
new file mode 100644
index 0000000..43fcd5f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BlobStrategyBinary.java
@@ -0,0 +1,12 @@
+package org.jbpm.pvm.internal.lob;
+
+public class BlobStrategyBinary implements BlobStrategy {
+
+ public byte[] get(Lob lob) {
+ return lob.bytes;
+ }
+
+ public void set(byte[] bytes, Lob lob) {
+ lob.bytes = bytes;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BlobStrategyBlob.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BlobStrategyBlob.java
new file mode 100644
index 0000000..115edb1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BlobStrategyBlob.java
@@ -0,0 +1,32 @@
+package org.jbpm.pvm.internal.lob;
+
+import java.sql.SQLException;
+
+import org.hibernate.Hibernate;
+import org.jbpm.api.JbpmException;
+
+public class BlobStrategyBlob implements BlobStrategy {
+
+ public void set(byte[] bytes, Lob lob) {
+ if (bytes!=null) {
+ lob.cachedBytes = bytes;
+ lob.blob = Hibernate.createBlob(bytes);
+ }
+ }
+
+ public byte[] get(Lob lob) {
+ if (lob.cachedBytes!=null) {
+ return lob.cachedBytes;
+ }
+
+ java.sql.Blob sqlBlob = lob.blob;
+ if (sqlBlob!=null) {
+ try {
+ return sqlBlob.getBytes(1, (int) sqlBlob.length());
+ } catch (SQLException e) {
+ throw new JbpmException("couldn't extract bytes out of blob", e);
+ }
+ }
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BlobStrategyChopped.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BlobStrategyChopped.java
new file mode 100644
index 0000000..b78345a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BlobStrategyChopped.java
@@ -0,0 +1,53 @@
+package org.jbpm.pvm.internal.lob;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class BlobStrategyChopped implements BlobStrategy {
+
+ int chopSize = 1024;
+
+ public void set(byte[] bytes, Lob lob) {
+ lob.bytesChops = chop(bytes);
+ }
+
+ public byte[] get(Lob lob) {
+ return glue(lob.bytesChops);
+ }
+
+ public List<BytesChop> chop(byte[] bytes) {
+ List<BytesChop> chops = null;
+ if ( (bytes!=null)
+ && (bytes.length>0) ){
+ chops = new ArrayList<BytesChop>();
+ int index = 0;
+ while ( (bytes.length-index) > chopSize ) {
+ byte[] byteBlock = new byte[chopSize];
+ System.arraycopy(bytes, index, byteBlock, 0, chopSize);
+ chops.add(new BytesChop(byteBlock));
+ index+=chopSize;
+ }
+ byte[] byteBlock = new byte[bytes.length-index];
+ System.arraycopy(bytes, index, byteBlock, 0, bytes.length-index);
+ chops.add(new BytesChop(byteBlock));
+ }
+ return chops;
+ }
+
+ public byte[] glue(List<BytesChop> bytesChops) {
+ byte[] bytes = null;
+ if (bytesChops!=null) {
+ for (BytesChop bytesChop: bytesChops) {
+ if (bytes==null) {
+ bytes = bytesChop.getBytes();
+ } else {
+ byte[] oldValue = bytes;
+ bytes = new byte[bytes.length+bytesChop.getBytes().length];
+ System.arraycopy(oldValue, 0, bytes, 0, oldValue.length);
+ System.arraycopy(bytesChop.getBytes(), 0, bytes, oldValue.length, bytesChop.getBytes().length);
+ }
+ }
+ }
+ return bytes;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BytesChop.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BytesChop.java
new file mode 100644
index 0000000..5a98906
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/BytesChop.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.lob;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class BytesChop extends Chop {
+
+ private static final long serialVersionUID = 1L;
+
+ protected byte[] bytes;
+
+ public BytesChop(byte[] bytes) {
+ this.bytes = bytes;
+ }
+
+ public byte[] getBytes() {
+ return bytes;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/CharChop.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/CharChop.java
new file mode 100644
index 0000000..eb45a47
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/CharChop.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.lob;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CharChop extends Chop {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String text;
+
+ public CharChop(String text) {
+ this.text = text;
+ }
+
+ public String getText() {
+ return text;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/Chop.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/Chop.java
new file mode 100644
index 0000000..f7da25f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/Chop.java
@@ -0,0 +1,39 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.lob;
+
+import java.io.Serializable;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class Chop implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+
+ public long getDbid() {
+ return dbid;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/ClobStrategy.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/ClobStrategy.java
new file mode 100644
index 0000000..9a0f3d4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/ClobStrategy.java
@@ -0,0 +1,7 @@
+package org.jbpm.pvm.internal.lob;
+
+public interface ClobStrategy {
+
+ void set(char[] text, Lob lob);
+ char[] get(Lob lob);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/ClobStrategyChopped.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/ClobStrategyChopped.java
new file mode 100644
index 0000000..b96f904
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/ClobStrategyChopped.java
@@ -0,0 +1,50 @@
+package org.jbpm.pvm.internal.lob;
+
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ClobStrategyChopped implements ClobStrategy {
+
+ int chopSize = 1024;
+
+ public char[] get(Lob lob) {
+ return glue(lob.charChops);
+ }
+
+ public void set(char[] chars, Lob lob) {
+ lob.charChops = chop(chars);
+ }
+
+ public List<CharChop> chop(char[] chars) {
+ List<CharChop> charChops = null;
+ if ( (chars!=null)
+ && (chars.length>0) ){
+ charChops = new ArrayList<CharChop>();
+ int index = 0;
+ while ( (chars.length-index) > chopSize ) {
+ String chop = new String(chars, index, chopSize);
+ charChops.add(new CharChop(chop));
+ index+=chopSize;
+ }
+ // add remainder chop
+ String chop = new String(chars, index, chars.length-index);
+ charChops.add(new CharChop(chop));
+ }
+ return charChops;
+ }
+
+ public char[] glue(List<CharChop> charChops) {
+ if (charChops!=null) {
+ StringWriter writer = new StringWriter();
+
+ for (CharChop charChop: charChops) {
+ writer.write(charChop.getText());
+ }
+
+ return writer.toString().toCharArray();
+ }
+
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/ClobStrategyClob.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/ClobStrategyClob.java
new file mode 100644
index 0000000..2871755
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/ClobStrategyClob.java
@@ -0,0 +1,29 @@
+package org.jbpm.pvm.internal.lob;
+
+import java.sql.SQLException;
+
+import org.hibernate.Hibernate;
+import org.jbpm.api.JbpmException;
+
+public class ClobStrategyClob implements ClobStrategy {
+
+ public void set(char[] chars, Lob lob) {
+ if (chars!=null) {
+ lob.clob = Hibernate.createClob(new String(chars));
+ }
+ }
+
+ public char[] get(Lob lob) {
+ java.sql.Clob sqlClob = lob.clob;
+ if (sqlClob!=null) {
+ try {
+ int length = (int) sqlClob.length();
+ String text = sqlClob.getSubString(1, length);
+ return text.toCharArray();
+ } catch (SQLException e) {
+ throw new JbpmException("couldn't extract chars out of clob", e);
+ }
+ }
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/ClobStrategyText.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/ClobStrategyText.java
new file mode 100644
index 0000000..b9528b6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/ClobStrategyText.java
@@ -0,0 +1,14 @@
+package org.jbpm.pvm.internal.lob;
+
+public class ClobStrategyText implements ClobStrategy {
+
+ public char[] get(Lob lob) {
+ return lob.extractChars();
+ }
+
+ public void set(char[] chars, Lob lob) {
+ String text = new String(chars);
+ lob.text = text;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/Lob.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/Lob.java
new file mode 100644
index 0000000..1f3ab1f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/Lob.java
@@ -0,0 +1,147 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.lob;
+
+import java.io.ObjectStreamException;
+import java.io.Serializable;
+import java.util.List;
+
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.id.DbidGenerator;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class Lob implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final BlobStrategy DEFAULT_BLOB_STRATEGY = new BlobStrategyBlob();
+ public static final ClobStrategy DEFAULT_CLOB_STRATEGY = new ClobStrategyChopped();
+
+ protected long dbid;
+ protected int dbversion;
+
+ // cachedBytes is used by the BlobStrategyBlob as hibernate doesn't allow
+ // blobs to be read in the same session as they are created in.
+ // So cachedBytes should not be persisted
+ protected byte[] cachedBytes = null;
+ protected java.sql.Blob blob = null;
+ protected byte[] bytes = null;
+ protected List<BytesChop> bytesChops = null;
+
+ protected char[] cachedChars = null;
+ protected java.sql.Clob clob = null;
+ protected String text = null;
+ protected List<CharChop> charChops = null;
+
+
+ public long getDbid() {
+ return dbid;
+ }
+
+ public void setDbid(long dbid) {
+ this.dbid = dbid;
+ }
+
+ // Only for Hibernate. Do not use directly!
+ public Lob() {
+ }
+
+ /**
+ * @param bytes The actual bytes that will be stored.
+ * @param generateId If true, the default {@link DbidGenerator} will be used
+ * generate a dbid for this Lob object.
+ */
+ public Lob(byte[] bytes, boolean generateDbid) {
+ cachedBytes = bytes;
+ getBlobStrategy().set(bytes, this);
+
+ if (generateDbid) {
+ this.dbid = DbidGenerator.getDbidGenerator().getNextId();
+ }
+ }
+
+ public Lob(char[] text, boolean generateDbid) {
+ cachedChars = text;
+ getClobStrategy().set(text, this);
+
+ if (generateDbid) {
+ this.dbid = DbidGenerator.getDbidGenerator().getNextId();
+ }
+ }
+
+
+ public char[] extractChars() {
+ return getClobStrategy().get(this);
+ }
+
+
+
+ public byte[] extractBytes() {
+ return getBlobStrategy().get(this);
+ }
+
+ protected ClobStrategy getClobStrategy() {
+ ClobStrategy clobStrategy = null;
+
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ if (environment!=null) {
+ clobStrategy = environment.get(ClobStrategy.class);
+ }
+
+ if (clobStrategy==null) {
+ clobStrategy = DEFAULT_CLOB_STRATEGY;
+ }
+
+ return clobStrategy;
+ }
+
+ protected BlobStrategy getBlobStrategy() {
+ BlobStrategy blobStrategy = EnvironmentImpl.getFromCurrent(BlobStrategy.class, false);
+
+ if (blobStrategy==null) {
+ blobStrategy = DEFAULT_BLOB_STRATEGY;
+ }
+
+ return blobStrategy;
+ }
+
+ protected Object readResolve() throws ObjectStreamException {
+ if (cachedBytes!=null) {
+ getBlobStrategy().set(cachedBytes, this);
+ }
+ if (cachedChars!=null) {
+ getClobStrategy().set(cachedChars, this);
+ }
+ return this;
+ }
+
+ protected Object writeReplace() throws ObjectStreamException {
+ blob = null;
+ clob = null;
+ return this;
+ }
+
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/package.html
new file mode 100644
index 0000000..9e3662f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/lob/package.html
@@ -0,0 +1,4 @@
+<body>
+offers blob and clob objects to be used in pvm persistent objects so that
+persistence strategy is configurable.
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/AbortMigrationHandler.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/AbortMigrationHandler.java
new file mode 100644
index 0000000..453c5e1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/AbortMigrationHandler.java
@@ -0,0 +1,17 @@
+package org.jbpm.pvm.internal.migration;
+
+import org.jbpm.api.ExecutionService;
+import org.jbpm.api.ProcessDefinition;
+import org.jbpm.api.ProcessInstance;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+
+
+public class AbortMigrationHandler implements MigrationHandler {
+
+ public void migrateInstance(ProcessDefinition newProcessDefinition, ProcessInstance processInstance, MigrationDescriptor migrationDescriptor) {
+ ExecutionService executionService = EnvironmentImpl.getFromCurrent(ExecutionService.class);
+ if (executionService == null) return;
+ executionService.endProcessInstance(processInstance.getId(), "aborted");
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/DefaultMigrationHandler.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/DefaultMigrationHandler.java
new file mode 100644
index 0000000..9ea7bcf
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/DefaultMigrationHandler.java
@@ -0,0 +1,57 @@
+package org.jbpm.pvm.internal.migration;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.ProcessDefinition;
+import org.jbpm.api.ProcessInstance;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.events.ProcessInstanceMigration;
+import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+
+
+public class DefaultMigrationHandler implements MigrationHandler {
+
+ public void migrateInstance(
+ ProcessDefinition newProcessDefinition,
+ ProcessInstance processInstance,
+ MigrationDescriptor migrationDescriptor) {
+ migrateExecutions(newProcessDefinition, processInstance, migrationDescriptor);
+ logMigration(processInstance, newProcessDefinition);
+ }
+
+ private void migrateChildExecutions(
+ ProcessDefinition processDefinition,
+ Execution execution,
+ MigrationDescriptor migrationDescriptor) {
+ for (Execution child : execution.getExecutions()) {
+ migrateExecutions(processDefinition, child, migrationDescriptor);
+ }
+ }
+
+ private void migrateExecutions(ProcessDefinition processDefinition, Execution execution, MigrationDescriptor migrationDescriptor) {
+ migrateChildExecutions(processDefinition, execution, migrationDescriptor);
+ if (!(execution instanceof ExecutionImpl) || !(processDefinition instanceof ProcessDefinitionImpl))
+ return;
+ ((ExecutionImpl)execution).setProcessDefinition((ProcessDefinitionImpl)processDefinition);
+ String oldName = ((ExecutionImpl) execution).getActivityName();
+ if (oldName == null)
+ return;
+ String newName = migrationDescriptor.getNewName(MigrationDescriptor.ACTIVITY_TYPE, oldName);
+ if (newName == null)
+ newName = oldName;
+ Activity newActivity = ((ProcessDefinitionImpl) processDefinition).getActivity(newName);
+ if (newActivity != null) {
+ ((ExecutionImpl) execution).setActivity(newActivity);
+ } else {
+ throw new JbpmException("the activity " + newActivity + " could not be found in the new process definition.");
+ }
+ }
+
+ private static void logMigration(ProcessInstance processInstance, ProcessDefinition processDefinition) {
+ ProcessInstanceMigration processInstanceMigrate = new ProcessInstanceMigration(processInstance, processDefinition);
+ HistoryEvent.fire(processInstanceMigrate);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/InstanceMigrator.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/InstanceMigrator.java
new file mode 100644
index 0000000..08ca603
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/InstanceMigrator.java
@@ -0,0 +1,131 @@
+package org.jbpm.pvm.internal.migration;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.ExecutionService;
+import org.jbpm.api.ProcessDefinition;
+import org.jbpm.api.ProcessDefinitionQuery;
+import org.jbpm.api.ProcessInstance;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.session.RepositorySession;
+import org.jbpm.pvm.internal.util.ReflectUtil;
+
+public class InstanceMigrator {
+
+ private static Log log = Log.getLog(InstanceMigrator.class.getName());
+
+ public static void migrateAll(ProcessDefinition processDefinition, MigrationDescriptor migrationDescriptor) {
+// String oldVersionId = getOldVersionId(processDefinition.getName());
+// ExecutionService executionService = (ExecutionService) EnvironmentImpl.getFromCurrent(ExecutionService.class);
+// ProcessInstanceQuery processInstanceQuery = executionService
+// .createProcessInstanceQuery()
+// .processDefinitionId(oldVersionId);
+// List<ProcessInstance> processInstances = processInstanceQuery.list();
+ List<ProcessInstance> processInstances = getProcessInstancesToMigrate(processDefinition.getName(), migrationDescriptor);
+ for (ProcessInstance processInstance : processInstances) {
+ migrateInstance(processDefinition, processInstance, migrationDescriptor);
+ }
+ }
+
+ public static void migrateInstance(
+ ProcessDefinition processDefinition,
+ ProcessInstance processInstance,
+ MigrationDescriptor migrationDescriptor) {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ for (String className : migrationDescriptor.getMigrationHandlerClassNames()) {
+ try {
+ Class<?> clazz = classLoader.loadClass(className);
+ MigrationHandler handler = (MigrationHandler)ReflectUtil.newInstance(clazz);
+ handler.migrateInstance(processDefinition, processInstance, migrationDescriptor);
+ } catch (ClassNotFoundException e) {
+ log.error("Class " + className + " not found on the classpath.", e);
+ }
+ }
+ //migrateExecutions(processDefinition, processInstance, migrationDescriptor);
+ // migrateSwimlanes(processInstance, migrationDescriptor);
+ // migrateVariables(processInstance, migrationDescriptor);
+ //logMigration(processInstance, processDefinition);
+ }
+
+ private static void migrateExecutions(ProcessDefinition processDefinition, Execution execution, MigrationDescriptor migrationDescriptor) {
+ migrateChildExecutions(processDefinition, execution, migrationDescriptor);
+// if (!(execution instanceof ExecutionImpl) || !(processDefinition instanceof ProcessDefinitionImpl))
+// return;
+// ((ExecutionImpl)execution).setProcessDefinition((ProcessDefinitionImpl)processDefinition);
+// String oldName = ((ExecutionImpl) execution).getActivityName();
+// if (oldName == null)
+// return;
+// String newName = migrationDescriptor.getNewName(MigrationDescriptor.ACTIVITY_TYPE, oldName);
+// if (newName == null)
+// return;
+// Activity newActivity = ((ProcessDefinitionImpl) processDefinition).getActivity(newName);
+// if (newActivity != null) {
+// ((ExecutionImpl) execution).setActivity(newActivity);
+// }
+ }
+
+ private static void migrateChildExecutions(ProcessDefinition processDefinition, Execution execution, MigrationDescriptor migrationDescriptor) {
+ for (Execution child : execution.getExecutions()) {
+ migrateExecutions(processDefinition, child, migrationDescriptor);
+ }
+ }
+
+// private static void logMigration(ProcessInstance processInstance, ProcessDefinition processDefinition) {
+// ProcessInstanceMigration processInstanceMigrate = new ProcessInstanceMigration(processInstance, processDefinition);
+// HistoryEvent.fire(processInstanceMigrate);
+// }
+
+ private static List<ProcessInstance> getProcessInstancesToMigrate(String processDefinitionName, MigrationDescriptor migrationDescriptor) {
+ List<ProcessInstance> result = new ArrayList<ProcessInstance>();
+ ExecutionService executionService = (ExecutionService) EnvironmentImpl.getFromCurrent(ExecutionService.class);
+ List<ProcessDefinition> processesToMigrate = getProcessesToMigrate(processDefinitionName, migrationDescriptor);
+ for (ProcessDefinition processDefinition : processesToMigrate) {
+ result.addAll(
+ executionService
+ .createProcessInstanceQuery()
+ .processDefinitionId(processDefinition.getId()).list());
+ }
+ return result;
+ }
+
+ private static List<ProcessDefinition> getProcessesToMigrate(String processDefinitionName, MigrationDescriptor migrationDescriptor) {
+ RepositorySession repositorySession = EnvironmentImpl.getFromCurrent(RepositorySession.class);
+ List<ProcessDefinition> processDefinitions = repositorySession
+ .createProcessDefinitionQuery()
+ .processDefinitionName(processDefinitionName)
+ .orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION)
+ .list();
+ int startIndex = calculateStartIndex(processDefinitions.size() - 1, migrationDescriptor);
+ int endIndex = calculateEndIndex(processDefinitions.size() - 1, migrationDescriptor);
+ if (startIndex > endIndex) startIndex = endIndex;
+ return processDefinitions.subList(startIndex, endIndex);
+ }
+
+ private static int calculateStartIndex(int max, MigrationDescriptor migrationDescriptor) {
+ int result = max - 1;
+ if (migrationDescriptor.getStartVersion() != -1) {
+ result = migrationDescriptor.getStartVersion() - 1;
+ } else if (migrationDescriptor.getStartOffset() != -1) {
+ result = max - migrationDescriptor.getStartOffset();
+ }
+ if (result < 0) result = 0;
+ if (result > max - 1) result = max - 1;
+ return result;
+ }
+
+ private static int calculateEndIndex(int max, MigrationDescriptor migrationDescriptor) {
+ int result = max;
+ if (migrationDescriptor.getEndVersion() != -1) {
+ result = migrationDescriptor.getEndVersion();
+ } else if (migrationDescriptor.getEndOffset() != -1) {
+ result = max - migrationDescriptor.getEndOffset() + 1;
+ }
+ if (result < 1) result = 1;
+ if (result > max - 1) result = max;
+ return result;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/MigrationDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/MigrationDescriptor.java
new file mode 100644
index 0000000..0e8f8e2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/MigrationDescriptor.java
@@ -0,0 +1,81 @@
+package org.jbpm.pvm.internal.migration;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class MigrationDescriptor {
+
+ public static final String ACTIVITY_TYPE = "org.jbpm.pvm.internal.migration.activity";
+ public static final String VARIABLE_TYPE = "org.jbpm.pvm.internal.migration.variable";
+ public static final String SWIMLANE_TYPE = "org.jbpm.pvm.internal.migration.swimlane";
+
+ private Map<String, Map<String, String>> migrationMap = new HashMap<String, Map<String, String>>();
+ private List<String> migrationHandlerClassNames = new ArrayList<String>();
+
+ private int startOffset = -1;
+ private int endOffset = -1;
+
+ private int startVersion = -1;
+ private int endVersion = -1;
+
+ public void addMigrationElement(String type, String oldName, String newName) {
+ Map<String, String> typeMap = migrationMap.get(type);
+ if (typeMap == null) {
+ typeMap = new HashMap<String, String>();
+ migrationMap.put(type, typeMap);
+ }
+ typeMap.put(oldName, newName);
+ }
+
+ public String getNewName(String type, String oldName) {
+ String result = null;
+ Map<String, String> typeMap = migrationMap.get(type);
+ if (typeMap != null) {
+ result = typeMap.get(oldName);
+ }
+ return result;
+ }
+
+ public void addMigrationHandlerClassName(String className) {
+ migrationHandlerClassNames.add(className);
+ }
+
+ public List<String> getMigrationHandlerClassNames() {
+ return migrationHandlerClassNames;
+ }
+
+ public int getStartOffset() {
+ return startOffset;
+ }
+
+ public void setStartOffset(int startOffset) {
+ this.startOffset = startOffset;
+ }
+
+ public int getEndOffset() {
+ return endOffset;
+ }
+
+ public void setEndOffset(int endOffset) {
+ this.endOffset = endOffset;
+ }
+
+ public int getStartVersion() {
+ return startVersion;
+ }
+
+ public void setStartVersion(int startVersion) {
+ this.startVersion = startVersion;
+ }
+
+ public int getEndVersion() {
+ return endVersion;
+ }
+
+ public void setEndVersion(int endVersion) {
+ this.endVersion = endVersion;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/MigrationHandler.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/MigrationHandler.java
new file mode 100644
index 0000000..0fda4c7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/migration/MigrationHandler.java
@@ -0,0 +1,14 @@
+package org.jbpm.pvm.internal.migration;
+
+import org.jbpm.api.ProcessDefinition;
+import org.jbpm.api.ProcessInstance;
+
+
+public interface MigrationHandler {
+
+ void migrateInstance(
+ ProcessDefinition newProcessDefinition,
+ ProcessInstance processInstance,
+ MigrationDescriptor migrationDescriptor);
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/Activity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/Activity.java
new file mode 100644
index 0000000..4cf34a5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/Activity.java
@@ -0,0 +1,111 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * a activity in a {@link OpenProcessDefinition} graph.
+ *
+ * <p>The activity supports both graph based process models as well as
+ * block structured (tree based) process models. First we describe
+ * tranisions that can be used to formResourceName graph based process structures
+ * and then we'll describe activity composition to formResourceName block structured
+ * process models. Both models can be combined as well.
+ * </p>
+ *
+ * <p>Activities have {@link #getIncomingTransitions() incoming}
+ * and {@link #getOutgoingTransitions() outgoing transitions}.
+ * These are lists of transitions.
+ * </p>
+ *
+ * <p>Optionally, transitions can have names. In that case the
+ * transition {@link #getOutgoingTransition(String) names are associated
+ * to activity's outgoing transitions}. The {@link #getOutgoingTransitionsMap() map
+ * of outgoing transitions} provides easy access to the named transitions.
+ * </p>
+ *
+ * <p>One of the outgoing transitions can optionally be marked as
+ * {@link #getDefaultOutgoingTransition() the default transition}.
+ * </p>
+ *
+ * <p>Block structured process languages have composite activities that can be
+ * modeled with the {@link #getParent() parent}-{@link #getActivities() child}
+ * relation.
+ * </p>
+ *
+ * @author Tom Baeyens
+ */
+public interface Activity extends CompositeElement {
+
+ /** the list of outgoing transitions.
+ * Caution: the actual member is returned. No copy is made. */
+ List<Transition> getOutgoingTransitions();
+
+ /** the default outgoing transition. */
+ Transition getDefaultOutgoingTransition();
+
+ /** the first leaving transition with the given name or null of no
+ * such leaving transition exists. If the multiple transitions have
+ * the given transition name, the first (in order of {@link #getOutgoingTransitions()})
+ * will be returned.
+ *
+ * @param transitionName is the name of the transition to take. A null value will
+ * match the first unnamed transition. */
+ Transition getOutgoingTransition(String transitionName);
+
+ /** indicates if a leaving transition with the given transitionName exists.
+ * A null value matches an unnamed transition. */
+ boolean hasOutgoingTransition(String transitionName);
+
+ /** indicates if this activity has leaving transitions */
+ boolean hasOutgoingTransitions();
+
+ /** the leaving transitions, keyed by transition name. If a transition with
+ * the same name occurs mutltiple times, the first one is returned.
+ * Leaving transitions with a null value for their name are not included
+ * in the map.
+ * Beware: the actual member is returned. No copy is made. In fact, the
+ * returned map is maintained as a cache. So updates to the map will
+ * influence subsequent retrievals of outgoing transitions by name. */
+ Map<String, Transition> getOutgoingTransitionsMap();
+
+ /** searches for the given transitionName in this activity and then up the
+ * parent chain. Returns null if no such transition is found. */
+ Transition findOutgoingTransition(String transitionName);
+
+ /** the list of arriving transitions.
+ * Beware: the actual member is returned. No copy is made. */
+ List<Transition> getIncomingTransitions();
+
+ /** indicates if this activity has arriving transitions */
+ boolean hasIncomingTransitions();
+
+ /** retrieve the parent activity in the composite activity structure. This is
+ * different from {@link ObservableElement#getParent()} in that it is restricted
+ * to the parent activities. It doesn't take into account the process definition. */
+ Activity getParentActivity();
+
+ /** the type of this activity which corresponds to the xml tag */
+ String getType();
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ActivityCoordinatesImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ActivityCoordinatesImpl.java
new file mode 100644
index 0000000..6178378
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ActivityCoordinatesImpl.java
@@ -0,0 +1,63 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.io.Serializable;
+
+import org.jbpm.api.model.ActivityCoordinates;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ActivityCoordinatesImpl implements Serializable, ActivityCoordinates {
+
+ private static final long serialVersionUID = 1L;
+
+ int x;
+ int y;
+ int width;
+ int height;
+
+ public ActivityCoordinatesImpl(int x, int y, int width, int height) {
+ this.x = x;
+ this.y = y;
+ this.width = width;
+ this.height = height;
+ }
+
+ public int getX() {
+ return x;
+ }
+
+ public int getY() {
+ return y;
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public int getHeight() {
+ return height;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ActivityImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ActivityImpl.java
new file mode 100644
index 0000000..307a18c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ActivityImpl.java
@@ -0,0 +1,427 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.jbpm.api.activity.ActivityBehaviour;
+import org.jbpm.pvm.internal.util.ReflectUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ActivityImpl extends CompositeElementImpl implements Activity {
+
+ private static final long serialVersionUID = 1L;
+
+ protected ActivityBehaviour activityBehaviour;
+ protected boolean isActivityBehaviourStateful = false;
+ protected Descriptor activityBehaviourDescriptor;
+
+ protected List<TransitionImpl> outgoingTransitions = new ArrayList<TransitionImpl>();
+ protected List<TransitionImpl> incomingTransitions = new ArrayList<TransitionImpl>();
+ protected TransitionImpl defaultOutgoingTransition;
+ protected ActivityImpl parentActivity;
+
+ protected String type;
+ protected Continuation continuation = Continuation.SYNCHRONOUS;
+
+ protected ActivityCoordinatesImpl coordinates;
+
+ // Do not initialize. Caching is based on the nullity of this map
+ transient protected Map<String, TransitionImpl> outgoingTransitionsMap = null;
+
+ /**
+ * Use {@link ProcessDefinitionImpl#createActivity()} or {@link ActivityImpl#createActivity()} instead.
+ */
+ public ActivityImpl() {
+ super();
+ }
+
+ // specialized activity containment methods /////////////////////////////////////
+
+ public ActivityImpl addActivity(ActivityImpl activity) {
+ activity.setParentActivity(this);
+ super.addActivity(activity);
+ return activity;
+ }
+
+ public ActivityImpl findActivity(String activityName) {
+ if (activityName==null) {
+ if (name==null) {
+ return this;
+ }
+ } else if (activityName.equals(name)) {
+ return this;
+ }
+ return super.findActivity(activityName);
+ }
+
+ // outgoing transitions //////////////////////////////////////////////////////
+
+ /** creates an outgoing transition from this activity. */
+ public TransitionImpl createOutgoingTransition() {
+ // create a new transition
+ TransitionImpl transition = new TransitionImpl();
+ transition.setProcessDefinition(processDefinition);
+
+ // wire it between the source and destination
+ addOutgoingTransition(transition);
+
+ // if there is no default transition yet
+ if (defaultOutgoingTransition==null) {
+ // make this the default outgoing transition
+ defaultOutgoingTransition = transition;
+ }
+
+ return transition;
+ }
+
+ /**
+ * adds the given transition as a leaving transition to this activity.
+ * Also the source of the transition is set to this activity.
+ * Adding a transition that is already contained in the leaving
+ * transitions has no effect.
+ * @return the added transition.
+ * @throws NullPointerException if transition is null.
+ */
+ public Transition addOutgoingTransition(TransitionImpl transition) {
+ if (! outgoingTransitions.contains(transition)) {
+ transition.setSource(this);
+ transition.setSourceIndex(outgoingTransitions.size());
+ outgoingTransitions.add(transition);
+ clearOutgoingTransitionsMap();
+ }
+ return transition;
+ }
+
+ /**
+ * removes the given transition from the leaving transitions.
+ * Also the transition's source will be nulled.
+ * This method will do nothing if the transition is null or if
+ * the given transition is not in the list of this activity's leaving
+ * transitions.
+ * In case this is the transition that was in the
+ * outgoingTransitionsMap and another transition exists with the same
+ * name, that transition (the first) will be put in the
+ * outgoingTransitionsMap as a replacement for the removed transition.
+ * If the transition is actually removed from the list of
+ * leaving transitions, the transition's source will be nulled.
+ */
+ public boolean removeOutgoingTransition(TransitionImpl transition) {
+ if (transition!=null) {
+ boolean isRemoved = outgoingTransitions.remove(transition);
+ if (isRemoved) {
+ transition.setSource(null);
+ clearOutgoingTransitionsMap();
+ }
+ return isRemoved;
+ }
+ return false;
+ }
+
+ /** the first leaving transition with the given name or null of no
+ * such leaving transition exists.
+ */
+ public TransitionImpl getOutgoingTransition(String transitionName) {
+ return (getOutgoingTransitionsMap()!=null ? outgoingTransitionsMap.get(transitionName) : null);
+ }
+
+ /** searches for the given transitionName in this activity and then up the
+ * parent chain. Returns null if no such transition is found. */
+ public TransitionImpl findOutgoingTransition(String transitionName) {
+ TransitionImpl transition = getOutgoingTransition(transitionName);
+ if (transition!=null) {
+ return transition;
+ }
+ if (parentActivity!=null) {
+ return parentActivity.findOutgoingTransition(transitionName);
+ }
+ return null;
+ }
+
+ /** searches for the default transition in this activity and then up the
+ * parent chain. Returns null if no such transition is found. */
+ public TransitionImpl findDefaultTransition() {
+ if (defaultOutgoingTransition!=null) {
+ return defaultOutgoingTransition;
+ }
+ if (parentActivity!=null) {
+ return parentActivity.findDefaultTransition();
+ }
+ return null;
+ }
+
+
+ /** the list of leaving transitions.
+ * Beware: the actual member is returned. No copy is made.
+ */
+ public List<Transition> getOutgoingTransitions() {
+ return (List) outgoingTransitions;
+ }
+
+ /** indicates if a leaving transition with the given transitionName exists. */
+ public boolean hasOutgoingTransition(String transitionName) {
+ return (getOutgoingTransition(transitionName)!=null);
+ }
+
+ /** indicates if this activity has leaving transitions */
+ public boolean hasOutgoingTransitions() {
+ return !outgoingTransitions.isEmpty();
+ }
+
+ /** sets the outgoingTransitions to the given list of outgoingTransitions.
+ * A copy of the collection is made. Also the outgoingTransitionsMap will
+ * be updated and the source of all the transitions in the given list will
+ * be set to this activity.
+ * In case there was a leaving transitions list present, these transition's
+ * source will be nulled.
+ */
+ public void setOutgoingTransitions(List<TransitionImpl> outgoingTransitions) {
+ if (!this.outgoingTransitions.isEmpty()) {
+ List<TransitionImpl> removedTransitions = new ArrayList<TransitionImpl>(outgoingTransitions);
+ for (TransitionImpl removedTransition: removedTransitions) {
+ removeOutgoingTransition(removedTransition);
+ }
+ }
+ if (outgoingTransitions!=null) {
+ this.outgoingTransitions = new ArrayList<TransitionImpl>();
+ for (TransitionImpl addedTransition: outgoingTransitions) {
+ addOutgoingTransition(addedTransition);
+ }
+ } else {
+ this.outgoingTransitions = new ArrayList<TransitionImpl>();
+ }
+ clearOutgoingTransitionsMap();
+ }
+
+ // arriving transitions /////////////////////////////////////////////////////
+
+ /**
+ * adds the given transition as an arriving transition to this activity.
+ * Also the source of the transition is set to this activity.
+ * @return the added transition.
+ * @throws NullPointerException if transition is null.
+ */
+ public Transition addIncomingTransition(TransitionImpl transition) {
+ transition.setDestination(this);
+ incomingTransitions.add(transition);
+ return transition;
+ }
+
+ /** removes the given transition if it is contained in the arriving
+ * transitions of this activity. If this transition was actually removed,
+ * its destination pointer is nulled.
+ * @return true if a transition was removed.
+ */
+ public boolean removeIncomingTransition(TransitionImpl transition) {
+ if ( (transition!=null) && (incomingTransitions.remove(transition))) {
+ transition.setDestination(null);
+ return true;
+ }
+ return false;
+ }
+
+ /** the list of arriving transitions.
+ * Beware: the actual member is returned. No copy is made.
+ */
+ public List<Transition> getIncomingTransitions() {
+ return (List) incomingTransitions;
+ }
+
+ /** indicates if this activity has arriving transitions */
+ public boolean hasIncomingTransitions() {
+ return !incomingTransitions.isEmpty();
+ }
+
+
+ /** sets the incomingTransitions to the given list of incomingTransitions.
+ * A copy of the collection is made. Also the destination of all the transitions
+ * in the given list will be set to this activity.
+ * In case there was an arriving transitions list present, these transition's
+ * destination will be nulled.
+ */
+ public void setIncomingTransitions(List<TransitionImpl> incomingTransitions) {
+ if (!this.incomingTransitions.isEmpty()) {
+ for (TransitionImpl removedTransition: this.incomingTransitions) {
+ removedTransition.setDestination(null);
+ }
+ }
+ if (incomingTransitions!=null) {
+ this.incomingTransitions = new ArrayList<TransitionImpl>(incomingTransitions);
+ for (TransitionImpl addedTransition: incomingTransitions) {
+ addedTransition.setDestination(this);
+ }
+ } else {
+ this.incomingTransitions = null;
+ }
+ }
+
+ /** the leaving transitions, keyed by transition name. If a transition with
+ * the same name occurs mutltiple times, the first one is returned.
+ * Leaving transitions with a null value for their name are not included
+ * in the map.
+ * Beware: the actual member is returned. No copy is made.
+ */
+ public Map<String, Transition> getOutgoingTransitionsMap() {
+ if(outgoingTransitionsMap == null){
+ this.outgoingTransitionsMap = new HashMap<String, TransitionImpl>();
+ for (TransitionImpl transition: outgoingTransitions) {
+ if (! this.outgoingTransitionsMap.containsKey(transition.getName())) {
+ this.outgoingTransitionsMap.put(transition.getName(), transition);
+ }
+ }
+ }
+ return (Map) outgoingTransitionsMap;
+ }
+
+ void clearOutgoingTransitionsMap() {
+ outgoingTransitionsMap = null;
+ }
+
+ // various helper methods ///////////////////////////////////////////////////
+
+
+ static Map<String, ActivityImpl> getActivitiesMap(List<ActivityImpl> activities) {
+ Map<String, ActivityImpl> map = null;
+ if (activities!=null) {
+ map = new HashMap<String, ActivityImpl>();
+ for (ActivityImpl activity: activities) {
+ if (! map.containsKey(activity.getName())) {
+ map.put(activity.getName(), activity);
+ }
+ }
+ }
+ return map;
+ }
+
+ public String toString() {
+ if (name!=null) return "activity("+name+")";
+ if (dbid!=0) return "activity("+dbid+")";
+ return "activity("+System.identityHashCode(this)+")";
+ }
+
+ /** collects the full stack of parent in a list. This activity is the
+ * first element in the chain. The process definition will be the last element.
+ * the chain will never be null. */
+ public List<ObservableElementImpl> getParentChain() {
+ List<ObservableElementImpl> chain = new ArrayList<ObservableElementImpl>();
+ ObservableElementImpl processElement = this;
+ while (processElement!=null) {
+ chain.add(processElement);
+ processElement = processElement.getParent();
+ }
+ return chain;
+ }
+
+ public boolean isAsync() {
+ return ! (continuation==Continuation.SYNCHRONOUS);
+ }
+
+ public boolean contains(ActivityImpl activity) {
+ while (activity!=null) {
+ if (activity.getParent()==this) {
+ return true;
+ }
+ activity = activity.getParentActivity();
+ }
+ return false;
+ }
+
+ // customized getters and setters ///////////////////////////////////////////
+
+ public ActivityBehaviour getActivityBehaviour() {
+ if (activityBehaviour!=null) {
+ return activityBehaviour;
+ }
+ if (activityBehaviourDescriptor!=null) {
+ ActivityBehaviour createdBehaviour = (ActivityBehaviour) ReflectUtil.instantiateUserCode(activityBehaviourDescriptor, processDefinition);
+ if (!isActivityBehaviourStateful) {
+ activityBehaviour = createdBehaviour;
+ }
+ return createdBehaviour;
+ }
+ return null;
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public ObservableElementImpl getParent() {
+ return (parentActivity!=null ? parentActivity : processDefinition);
+ }
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public TransitionImpl getDefaultOutgoingTransition() {
+ return defaultOutgoingTransition;
+ }
+ public void setDefaultOutgoingTransition(TransitionImpl defaultOutgoingTransition) {
+ this.defaultOutgoingTransition = defaultOutgoingTransition;
+ }
+ public ActivityImpl getParentActivity() {
+ return parentActivity;
+ }
+ public void setParentActivity(ActivityImpl parentActivity) {
+ this.parentActivity = parentActivity;
+ }
+ public String getType() {
+ return type;
+ }
+ public void setType(String type) {
+ this.type = type;
+ }
+ public ActivityCoordinatesImpl getCoordinates() {
+ return coordinates;
+ }
+ public void setCoordinates(ActivityCoordinatesImpl coordinates) {
+ this.coordinates = coordinates;
+ }
+ public Continuation getContinuation() {
+ return continuation;
+ }
+ public void setContinuation(Continuation continuation) {
+ this.continuation = continuation;
+ }
+ public void setActivityBehaviour(ActivityBehaviour activityBehaviour) {
+ this.activityBehaviour = activityBehaviour;
+ }
+ public Descriptor getActivityBehaviourDescriptor() {
+ return activityBehaviourDescriptor;
+ }
+ public void setActivityBehaviourDescriptor(Descriptor activityBehaviourDescriptor) {
+ this.activityBehaviourDescriptor = activityBehaviourDescriptor;
+ }
+ public boolean isActivityBehaviourStateful() {
+ return isActivityBehaviourStateful;
+ }
+ public void setActivityBehaviourStateful(boolean isActivityBehaviourStateful) {
+ this.isActivityBehaviourStateful = isActivityBehaviourStateful;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/CompositeElement.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/CompositeElement.java
new file mode 100644
index 0000000..27e2b60
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/CompositeElement.java
@@ -0,0 +1,67 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.util.List;
+import java.util.Map;
+
+
+
+/** activity container base class for {@link OpenProcessDefinition} and {@link Activity}.
+ *
+ * @author Tom Baeyens
+ */
+public interface CompositeElement extends ObservableElement {
+
+ /** indicates if this processDefinition has activities. */
+ boolean hasActivities();
+
+ /** the list of direct composite activities. Recursively contained
+ * activities are not included in the list.
+ * Beware: the actual member is returned. No copy is made. */
+ List<? extends Activity> getActivities();
+
+ /** indicates if an activity with the given name exists directly in
+ * this element. Only the direct contained activities are
+ * searched. No recursive search is made. */
+ boolean hasActivity(String activityName);
+
+ /** the first composite activity with the given name or null of no
+ * such activity exists. Only the direct contained activities are
+ * searched. No recursive search is made. */
+ Activity getActivity(String activityName);
+
+ /** searches for the given activity in this element recursively,
+ * including this activity and all child activities. The search
+ * is done depth-first. A null value for activityName matches a activity
+ * without a name. */
+ Activity findActivity(String activityName);
+
+ /** the composite activities, keyed by activity name. If an activity
+ * with the same name occurs mutltiple times, the first in the list
+ * is included in the map. Activities with a null value for their name
+ * are not included in the map.
+ * Beware: the actual member is returned. No copy is made. In fact, the
+ * returned map is maintained as a cache. So updates to the map will
+ * influence subsequent retrievals of activities by name.*/
+ Map<String, Activity> getActivitiesMap();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/CompositeElementImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/CompositeElementImpl.java
new file mode 100644
index 0000000..87acaa8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/CompositeElementImpl.java
@@ -0,0 +1,151 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class CompositeElementImpl extends ScopeElementImpl implements CompositeElement {
+
+ private static final long serialVersionUID = 1L;
+
+ protected List<ActivityImpl> activities;
+ transient protected Map<String, ActivityImpl> activitiesMap;
+
+ // nested activities /////////////////////////////////////////////////////////////
+
+ /**
+ * creates a nested activity. Also the nested activity's parent pointer will be set
+ * appropriatly.
+ */
+ public ActivityImpl createActivity() {
+ return createActivity(null);
+ }
+
+ /**
+ * creates a nested activity with the given name. Also the nested activity's parent pointer will be set
+ * appropriatly.
+ * @param activityName may be null.
+ */
+ public ActivityImpl createActivity(String activityName) {
+ ActivityImpl activity = new ActivityImpl();
+ activity.setName(activityName);
+ addActivity(activity);
+ return activity;
+ }
+
+ public Activity addActivity(ActivityImpl activity) {
+ activity.setProcessDefinition(processDefinition);
+ if (activities==null) {
+ activities = new ArrayList<ActivityImpl>();
+ }
+ if (! activities.contains(activity)) {
+ activities.add(activity);
+ }
+ activitiesMap = null;
+ return activity;
+ }
+
+ /** removes the given activity from the nested activities.
+ * Also the activity's parent will be nulled.
+ * This method will do nothing if the activity is null or if
+ * the activity is not in the list of nested activities.
+ * If the activity is actually removed from the list of
+ * activities, the activity's source will be nulled.
+ * In case this is the activity that was in the
+ * activitiesMap and another activity exists with the same
+ * name, that activity (the first) will be put in the
+ * activitiesMap as a replacement for the removed activity.
+ */
+ public boolean removeActivity(ActivityImpl activity) {
+ if ( (activity!=null)
+ && (activities!=null)
+ ) {
+ boolean isRemoved = activities.remove(activity);
+ if (isRemoved) {
+ activity.setParentActivity(null);
+ if (activities.isEmpty()) {
+ activities = null;
+ }
+ activitiesMap = null;
+ }
+ return isRemoved;
+ }
+ return false;
+ }
+
+ /** the first nested activity with the given name or null of no
+ * such activity exists.
+ */
+ public ActivityImpl getActivity(String activityName) {
+ return (getActivitiesMap()!=null ? activitiesMap.get(activityName) : null);
+ }
+
+ /** is this activity present ? */
+ public boolean hasActivity(String activityName) {
+ return ((getActivitiesMap()!=null) && (activitiesMap.containsKey(activityName)));
+ }
+
+ public ActivityImpl findActivity(String activityName) {
+ if (activities!=null) {
+ for(ActivityImpl n : activities) {
+ ActivityImpl activity = n.findActivity(activityName);
+ if (activity!=null) {
+ return activity;
+ }
+ }
+ }
+ return null;
+ }
+
+ /** the list of nested activities.
+ * Beware: the actual member is returned. No copy is made.
+ */
+ public List<? extends Activity> getActivities() {
+ return (List) activities;
+ }
+
+ /** the nested activities, keyed by activity name. If a activity with
+ * the same name occurs mutltiple times, the first in the list
+ * is included in the map.
+ * Activities with a null value for their name are not included
+ * in the map.
+ * Beware: the actual member is returned. No copy is made.
+ */
+ public Map<String, Activity> getActivitiesMap() {
+ if (activitiesMap == null) {
+ this.activitiesMap = ActivityImpl.getActivitiesMap(activities);
+ }
+ return (Map) activitiesMap;
+ }
+
+ /** indicates if this processDefinition has activities. */
+ public boolean hasActivities() {
+ return ((activities!=null) && (!activities.isEmpty()));
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/Condition.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/Condition.java
new file mode 100644
index 0000000..85a3e9f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/Condition.java
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.io.Serializable;
+
+import org.jbpm.api.model.OpenExecution;
+
+/** user code that reflects a runtime calculation of a boolean value.
+ * Used for {@link Transition#getCondition() transition guard conditions} and
+ * {@link Transition#getWaitCondition() transition wait states}.
+ *
+ * @see Transition
+ *
+ * @author Tom Baeyens
+ */
+public interface Condition extends Serializable {
+
+ /** evaluates this condition in the context of the given execution. */
+ boolean evaluate(OpenExecution execution);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/Continuation.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/Continuation.java
new file mode 100644
index 0000000..dcb6e75
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/Continuation.java
@@ -0,0 +1,35 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public enum Continuation {
+
+ SYNCHRONOUS,
+
+ ASYNCHRONOUS,
+
+ EXCLUSIVE
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/EventImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/EventImpl.java
new file mode 100644
index 0000000..a21e2cb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/EventImpl.java
@@ -0,0 +1,105 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.api.model.Event;
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+/**
+ * @author Tom Baeyens
+ */
+public class EventImpl extends ProcessElementImpl implements Serializable, Event {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String name;
+ protected ObservableElementImpl observableElement;
+ protected List<EventListenerReference> listenerReferences;
+ protected Continuation continuation = Continuation.SYNCHRONOUS;
+
+ public String toString() {
+ return (name != null ? "event(" + name + ")" : "event");
+ }
+
+ // listener references //////////////////////////////////////////////////////
+
+ public EventListenerReference createEventListenerReference() {
+ if (listenerReferences==null) {
+ listenerReferences = new ArrayList<EventListenerReference>();
+ }
+ EventListenerReference activityReference = new EventListenerReference();
+ activityReference.setProcessDefinition(processDefinition);
+ listenerReferences.add(activityReference);
+ return activityReference;
+ }
+
+ public EventListenerReference createEventListenerReference(Descriptor descriptor) {
+ EventListenerReference eventListenerReference = createEventListenerReference();
+ eventListenerReference.setEventListenerDescriptor(descriptor);
+ return eventListenerReference;
+ }
+
+ public EventListenerReference createEventListenerReference(EventListener eventListener) {
+ EventListenerReference eventListenerReference = createEventListenerReference();
+ eventListenerReference.setEventListener(eventListener);
+ return eventListenerReference;
+ }
+
+ public boolean isAsync() {
+ return ! (continuation==Continuation.SYNCHRONOUS);
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public long getDbid() {
+ return dbid;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public List<EventListenerReference> getListenerReferences() {
+ return listenerReferences;
+ }
+ public void setListenerReferences(List<EventListenerReference> eventListenerReferences) {
+ this.listenerReferences = eventListenerReferences;
+ }
+ public Continuation getContinuation() {
+ return continuation;
+ }
+ public void setContinuation(Continuation continuation) {
+ this.continuation = continuation;
+ }
+ public ObservableElementImpl getObservableElement() {
+ return observableElement;
+ }
+ public void setObservableElement(ObservableElementImpl observableElement) {
+ this.observableElement = observableElement;
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/EventListenerReference.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/EventListenerReference.java
new file mode 100644
index 0000000..d0b7ce9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/EventListenerReference.java
@@ -0,0 +1,95 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.pvm.internal.util.ReflectUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+/**
+ * @author Tom Baeyens
+ */
+public class EventListenerReference extends ProcessElementImpl {
+
+ private static final long serialVersionUID = 1L;
+
+ protected EventListener eventListener;
+ protected boolean isEventListenerStateful= false;
+ protected Descriptor eventListenerDescriptor;
+ /** does this action accept propagated events ? */
+ protected boolean isPropagationEnabled = false;
+ protected Continuation continuation = Continuation.SYNCHRONOUS;
+
+ /** does this action accept propagated events ? Default is false. */
+ public boolean isPropagationEnabled() {
+ return isPropagationEnabled;
+ }
+
+ /** does this action accept propagated events ? Default is false. */
+ public void setPropagationEnabled(boolean isPropagationEnabled) {
+ this.isPropagationEnabled = isPropagationEnabled;
+ }
+
+ public boolean isAsync() {
+ return Continuation.SYNCHRONOUS!=continuation;
+ }
+
+ // customized getters and setters ///////////////////////////////////////////
+
+ public EventListener getEventListener() {
+ if (eventListener!=null) {
+ return eventListener;
+ }
+ if (eventListenerDescriptor!=null) {
+ EventListener createdEventListener = (EventListener) ReflectUtil.instantiateUserCode(eventListenerDescriptor, processDefinition);
+ if (!isEventListenerStateful) {
+ eventListener = createdEventListener;
+ }
+ return createdEventListener;
+ }
+ return null;
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public Continuation getContinuation() {
+ return continuation;
+ }
+ public void setContinuation(Continuation continuation) {
+ this.continuation = continuation;
+ }
+ public void setEventListener(EventListener eventListener) {
+ this.eventListener = eventListener;
+ }
+ public boolean isEventListenerStateful() {
+ return isEventListenerStateful;
+ }
+ public void setEventListenerStateful(boolean isEventListenerStateful) {
+ this.isEventListenerStateful = isEventListenerStateful;
+ }
+ public Descriptor getEventListenerDescriptor() {
+ return eventListenerDescriptor;
+ }
+ public void setEventListenerDescriptor(Descriptor eventListenerDescriptor) {
+ this.eventListenerDescriptor = eventListenerDescriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExceptionHandlerImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExceptionHandlerImpl.java
new file mode 100644
index 0000000..abd1b90
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExceptionHandlerImpl.java
@@ -0,0 +1,264 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.model.op.AtomicOperation;
+import org.jbpm.pvm.internal.model.op.MoveToChildActivity;
+import org.jbpm.pvm.internal.tx.Transaction;
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ExceptionHandlerImpl implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ static final Log log = Log.getLog(ExceptionHandlerImpl.class.getName());
+
+ protected long dbid;
+ protected int dbversion;
+ protected ProcessDefinitionImpl processDefinition;
+ protected String exceptionClassName;
+ protected boolean isTransactional;
+ protected boolean isRethrowMasked;
+ protected List<EventListenerReference> eventListenerReferences;
+ protected String transitionName; // mutually exclusive with activityName
+ protected String activityName; // mutually exclusive with transitionName
+
+ // construction methods /////////////////////////////////////////////////////
+
+ public EventListenerReference createEventListenerReference(EventListener eventListener) {
+ EventListenerReference eventListenerReference = createEventListenerReference();
+ eventListenerReference.setEventListener(eventListener);
+ return eventListenerReference;
+ }
+
+ public EventListenerReference createEventListenerReference(Descriptor descriptor) {
+ EventListenerReference eventListenerReference = createEventListenerReference();
+ eventListenerReference.setEventListenerDescriptor(descriptor);
+ return eventListenerReference;
+ }
+
+ public EventListenerReference createEventListenerReference() {
+ if (eventListenerReferences==null) {
+ eventListenerReferences = new ArrayList<EventListenerReference>();
+ }
+ EventListenerReference eventListenerReference = new EventListenerReference();
+ eventListenerReference.setProcessDefinition(processDefinition);
+ eventListenerReferences.add(eventListenerReference);
+ return eventListenerReference;
+ }
+
+ // runtime behaviour methods ////////////////////////////////////////////////
+
+ public boolean matches(Exception exception) {
+ return matches(exception.getClass());
+ }
+
+ public boolean matches(Class<?> exceptionClass) {
+ if (exceptionClass==null) {
+ return false;
+ }
+ if ( (exceptionClassName==null)
+ || (exceptionClass.getName().equals(exceptionClassName))
+ ) {
+ return true;
+ }
+ Class<?> superClass = exceptionClass.getSuperclass();
+ if (superClass!=null) {
+ return matches(superClass);
+ }
+ return false;
+ }
+
+ public void handle(ExecutionImpl execution, Exception exception) {
+ if (isTransactional) {
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ Transaction transaction = (environment!=null ? environment.get(Transaction.class) : null);
+ if (transaction!=null) {
+ log.trace("registering exception handler to "+transaction);
+ CommandService commandService = environment.get(CommandService.class);
+ if (commandService==null) {
+ throw new JbpmException("environment doesn't have a command service for registering transactional exception handler", exception);
+ }
+ ExceptionHandlerSynchronization exceptionHandlerSynchronization = new ExceptionHandlerSynchronization(
+ this, execution,
+ exception,
+ commandService
+ );
+ // registration of the synchronization is delegated to the AfterTxCompletionListener
+ // to avoid a dependency on class Synchronization
+ exceptionHandlerSynchronization.register(transaction);
+ log.trace("registering exception handler to "+transaction);
+ throw new JbpmException("transaction exception handler registered handler after transaction completed. make sure this transaction is rolled back", exception);
+ } else {
+ throw new JbpmException("no transaction present in the environment for transactional exception handler", exception);
+ }
+ } else {
+ executeHandler(execution, exception);
+ }
+ }
+
+ void executeHandler(ExecutionImpl execution, Exception exception) {
+ if (eventListenerReferences!=null) {
+ for (EventListenerReference eventListenerReference: eventListenerReferences) {
+
+ EventListener eventListener = eventListenerReference.getEventListener();
+
+ log.trace("executing "+eventListener+" for "+this);
+ try {
+ eventListener.notify(execution);
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new JbpmException("couldn't execute "+eventListener, e);
+ }
+ }
+ }
+
+ if (transitionName!=null) {
+ ActivityImpl activity = execution.getActivity();
+ if (activity==null) {
+ // If the execution is not positioned in a activity, it must be
+ // positioned in a transition. In that case we check if the
+ // transition is present on the enclosing activity.
+
+ // The weird way of getting checking and fetching the parent activity
+ // is because hibernate doesn't support instanceof. The transition-->parent
+ // relation is mapped as a ProcessElementImpl. So we can't cast it to
+ // a ActivityImpl. Ouch.
+ // The workaround is to check if the parent is equal to the
+ // process definition. If that is not the case, we can be sure
+ // that the parent is a activity. In that case we look up the activity
+ // from the process definition by name. OuchOuchSquare :-)
+
+ TransitionImpl transition = execution.getTransition();
+ log.trace("no current activity. searching for transition from parent of "+transition);
+ if (transition!=null) {
+ OpenProcessDefinition processDefinition = transition.getProcessDefinition();
+ ObservableElementImpl transitionParent = transition.getParent();
+
+ if ( (transitionParent!=null)
+ && (! transitionParent.equals(processDefinition))
+ ) {
+ activity = (ActivityImpl) processDefinition.findActivity(transitionParent.getName());
+ }
+ }
+ }
+
+ if (activity!=null) {
+ TransitionImpl transition = activity.findOutgoingTransition(transitionName);
+ if (transition!=null) {
+ log.trace(toString()+" takes transition "+transitionName);
+ execution.setTransition(transition);
+ execution.performAtomicOperationSync(AtomicOperation.TRANSITION_END_ACTIVITY);
+ } else {
+ log.info("WARNING: "+toString()+" couldn't find transition "+transitionName+" on "+activity);
+ }
+ } else {
+ log.info("WARNING: "+toString()+" couldn't find current activity to take transition "+transitionName);
+ }
+
+ } else if (activityName!=null) {
+ // execute child activity
+ ActivityImpl activity = execution.getActivity();
+ ActivityImpl childActivity = ( activity!=null ? activity.getActivity(activityName) : null );
+ if (childActivity!=null) {
+ log.trace(toString()+" takes transition "+transitionName);
+ execution.performAtomicOperationSync(new MoveToChildActivity(childActivity));
+ } else {
+ log.info("WARNING: "+toString()+" couldn't find child activity "+activityName);
+ }
+ }
+ }
+
+ public static void rethrow(Exception exception, String prefixMessage) {
+ log.trace("rethrowing "+exception);
+ if (exception instanceof RuntimeException) {
+ throw (RuntimeException) exception;
+ } else {
+ throw new JbpmException(prefixMessage+": "+exception.getMessage(), exception);
+ }
+ }
+
+ public String toString() {
+ return (exceptionClassName!=null ? "exception-handler("+exceptionClassName+")" : "exception-handler");
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public long getDbid() {
+ return dbid;
+ }
+ public String getExceptionClassName() {
+ return exceptionClassName;
+ }
+ public void setExceptionClassName(String exceptionClassName) {
+ this.exceptionClassName = exceptionClassName;
+ }
+ public boolean isTransactional() {
+ return isTransactional;
+ }
+ public void setTransactional(boolean isTransactional) {
+ this.isTransactional = isTransactional;
+ }
+ public String getTransitionName() {
+ return transitionName;
+ }
+ public void setTransitionName(String transitionName) {
+ this.transitionName = transitionName;
+ }
+ public String getActivityName() {
+ return activityName;
+ }
+ public void setActivityName(String activityName) {
+ this.activityName = activityName;
+ }
+ public boolean isRethrowMasked() {
+ return isRethrowMasked;
+ }
+ public void setRethrowMasked(boolean isRethrowMasked) {
+ this.isRethrowMasked = isRethrowMasked;
+ }
+ public List<EventListenerReference> getEventListenerReferences() {
+ return eventListenerReferences;
+ }
+ public void setEventListenerReferences(List<EventListenerReference> eventListenerReferences) {
+ this.eventListenerReferences = eventListenerReferences;
+ }
+ public ProcessDefinitionImpl getProcessDefinition() {
+ return processDefinition;
+ }
+ public void setProcessDefinition(ProcessDefinitionImpl processDefinition) {
+ this.processDefinition = processDefinition;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExceptionHandlerSynchronization.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExceptionHandlerSynchronization.java
new file mode 100644
index 0000000..1cf2c29
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExceptionHandlerSynchronization.java
@@ -0,0 +1,77 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.tx.Transaction;
+
+public class ExceptionHandlerSynchronization implements Synchronization, Command<Object> {
+
+ private final ExceptionHandlerImpl exceptionHandler;
+
+ private static final long serialVersionUID = 1L;
+
+ protected ExecutionImpl execution;
+ protected Exception exception;
+ protected CommandService commandService;
+
+ public ExceptionHandlerSynchronization(ExceptionHandlerImpl exceptionHandler, ExecutionImpl execution, Exception exception, CommandService commandService) {
+ this.exceptionHandler = exceptionHandler;
+ this.execution = execution;
+ this.exception = exception;
+ this.commandService = commandService;
+ }
+
+ public void afterCompletion(int status) {
+ if (status!=Status.STATUS_ROLLEDBACK) {
+ ExceptionHandlerImpl.log.info("WARNING: no rollback after transactional exception handler. did you forget to rollback the transaction ?");
+ }
+ commandService.execute(this);
+ }
+
+ public Object execute(Environment environment) {
+ // reload the execution
+ DbSession dbSession = environment.get(DbSession.class);
+ if (dbSession==null) {
+ throw new JbpmException("no "+DbSession.class.getName()+" available in the environment for reloading the execution");
+ }
+ execution = dbSession.get(ExecutionImpl.class, execution.getId());
+ exceptionHandler.executeHandler(execution, exception);
+ return null;
+ }
+
+ public void beforeCompletion() {
+ }
+
+ public void register(Transaction transaction) {
+ // registration of the synchronization is delegated to the AfterTxCompletionListener
+ // to avoid a dependency on class Synchronization in class ExceptionHandlerImpl
+ transaction.registerSynchronization(this);
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExecutionImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExecutionImpl.java
new file mode 100644
index 0000000..72e1487
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExecutionImpl.java
@@ -0,0 +1,1290 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.api.job.Job;
+import org.jbpm.api.job.Timer;
+import org.jbpm.api.listener.EventListenerExecution;
+import org.jbpm.api.model.Event;
+import org.jbpm.api.model.OpenExecution;
+import org.jbpm.api.task.Assignable;
+import org.jbpm.api.task.AssignmentHandler;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.client.ClientProcessDefinition;
+import org.jbpm.pvm.internal.client.ClientProcessInstance;
+import org.jbpm.pvm.internal.env.Context;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.env.ExecutionContext;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.events.ActivityEnd;
+import org.jbpm.pvm.internal.history.events.ActivityStart;
+import org.jbpm.pvm.internal.history.events.AutomaticEnd;
+import org.jbpm.pvm.internal.history.events.DecisionEnd;
+import org.jbpm.pvm.internal.history.events.ProcessInstanceCreate;
+import org.jbpm.pvm.internal.history.events.ProcessInstanceEnd;
+import org.jbpm.pvm.internal.id.DbidGenerator;
+import org.jbpm.pvm.internal.id.IdComposer;
+import org.jbpm.pvm.internal.job.JobImpl;
+import org.jbpm.pvm.internal.job.MessageImpl;
+import org.jbpm.pvm.internal.model.op.AtomicOperation;
+import org.jbpm.pvm.internal.model.op.MoveToChildActivity;
+import org.jbpm.pvm.internal.model.op.Signal;
+import org.jbpm.pvm.internal.script.ScriptManager;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.session.MessageSession;
+import org.jbpm.pvm.internal.session.RepositorySession;
+import org.jbpm.pvm.internal.session.TimerSession;
+import org.jbpm.pvm.internal.task.AssignableDefinitionImpl;
+import org.jbpm.pvm.internal.task.SwimlaneDefinitionImpl;
+import org.jbpm.pvm.internal.task.SwimlaneImpl;
+import org.jbpm.pvm.internal.type.Variable;
+import org.jbpm.pvm.internal.util.EqualsUtil;
+import org.jbpm.pvm.internal.util.Priority;
+import org.jbpm.pvm.internal.wire.usercode.UserCodeReference;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ExecutionImpl extends ScopeInstanceImpl
+ implements ClientProcessInstance,
+ ActivityExecution,
+ EventListenerExecution,
+ Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Log log = Log.getLog(ExecutionImpl.class.getName());
+
+ /** an optional name for this execution. can be used to
+ * differentiate concurrent paths of execution like e.g.
+ * the 'shipping' and 'billing' paths. */
+ protected String name;
+
+ /** a key for this execution. typically this is an externally provided reference
+ * that is unique within the scope of the process definition. */
+ protected String key;
+
+ /** a unique id for this execution. */
+ protected String id;
+
+ /** are concurrent executions that related to this execution. */
+ protected Collection<ExecutionImpl> executions = new ArrayList<ExecutionImpl>();
+
+ /** the parent child relation of executions is convenient for some forms of
+ * concurrency. */
+ protected ExecutionImpl parent = null;
+ protected ExecutionImpl processInstance;
+
+ /** the super process link in case this is a sub process execution */
+ protected ExecutionImpl superProcessExecution;
+
+ /** the sub process link in case of sub process execution */
+ protected ExecutionImpl subProcessInstance;
+
+ /** swimlanes */
+ protected Map<String, SwimlaneImpl> swimlanes = new HashMap<String, SwimlaneImpl>();
+
+ /** reference to the current activity instance history record */
+ protected Long historyActivityInstanceDbid;
+
+ /** start time of the activity for history purposes (not persisted) */
+ protected Date historyActivityStart;
+
+ protected int priority = Priority.NORMAL;
+
+ protected Map<String, Variable> systemVariables = new HashMap<String, Variable>();
+
+ // persistent indicators of the current position ////////////////////////////
+
+ /** persistent process definition reference */
+ protected String processDefinitionId;
+
+ /** persistent activity reference */
+ protected String activityName;
+
+ // transient cached indicators of the current position //////////////////////
+
+ /** transient cached process definition. persistence is managed in {@link #processDefinitionId} */
+ protected ProcessDefinitionImpl processDefinition;
+
+ /** transient cached current activity pointer. persistence is managed in {@link #activityName} */
+ private ActivityImpl activity;
+
+ /** transition is not to be made persistable by default */
+ protected TransitionImpl transition;
+
+ protected EventImpl event;
+
+ protected AtomicOperation eventCompletedOperation;
+
+ protected int eventListenerIndex;
+
+ protected ObservableElementImpl eventSource;
+
+ // cached named executions //////////////////////////////////////////////////
+
+ /** caches the child executions by execution name. This member might be
+ * null and is only created from the executions in case its needed. Note
+ * that not all executions are forced to have a name and duplicates are allowed.
+ * In case the {@link #executions} change, the executionsMap can be nulled or
+ * also updated (but a check needs to be added whether it exists). */
+ protected transient Map<String, Execution> executionsMap = null;
+
+ /** the queue of atomic operations to be performed for this execution. */
+ protected Queue<AtomicOperation> atomicOperations;
+
+ public enum Propagation {
+ UNSPECIFIED, WAIT, EXPLICIT
+ }
+ protected Propagation propagation = null;
+
+ // construction /////////////////////////////////////////////////////////////
+
+ public void initializeProcessInstance(ProcessDefinitionImpl processDefinition, String key) {
+ setProcessDefinition(processDefinition);
+ setActivity ( (ActivityImpl) processDefinition.getInitial() );
+ this.processInstance = this;
+ this.state = STATE_CREATED;
+ this.key = key;
+
+ save();
+ composeIds();
+
+ HistoryEvent.fire(new ProcessInstanceCreate(), this);
+ }
+
+ protected void save() {
+ this.dbid = DbidGenerator.getDbidGenerator().getNextId();
+ DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class, false);
+ if (dbSession!=null) {
+ dbSession.save(this);
+ }
+ }
+
+ protected void composeIds() {
+ this.id = IdComposer.getIdComposer().createId(processDefinition, parent, this);
+ }
+
+
+ // execution method : start /////////////////////////////////////////////////
+
+ public void start() {
+ if (!STATE_CREATED.equals(state)) {
+ throw new JbpmException(toString()+" is already begun: "+state);
+ }
+ this.state = STATE_ACTIVE_ROOT;
+ ExecutionImpl scopedExecution = initializeScopes();
+
+ fire(Event.START, getProcessDefinition());
+ if (getActivity()!=null) {
+ scopedExecution.performAtomicOperation(AtomicOperation.EXECUTE_ACTIVITY);
+ }
+ }
+
+ protected ExecutionImpl initializeScopes() {
+ LinkedList<ActivityImpl> enteredActivities = new LinkedList<ActivityImpl>();
+
+ ActivityImpl initial = getProcessDefinition().getInitial();
+ ExecutionImpl scopedExecution = null;
+
+ if (initial!=null) {
+ enteredActivities.add(initial);
+ ActivityImpl parentActivity = initial.getParentActivity();
+ while (parentActivity!=null) {
+ enteredActivities.addFirst(parentActivity);
+ parentActivity = parentActivity.getParentActivity();
+ }
+
+ scopedExecution = this;
+
+ initializeVariables(getProcessDefinition(), this);
+ initializeTimers(getProcessDefinition());
+
+ for (ActivityImpl enteredActivity: enteredActivities) {
+ if (enteredActivity.isLocalScope()) {
+ scopedExecution.setActivity(enteredActivity);
+ scopedExecution = scopedExecution.createScope(enteredActivity);
+ }
+ }
+
+ scopedExecution.setActivity(initial);
+ }
+ return scopedExecution;
+ }
+
+ public ExecutionImpl createScope(ScopeElementImpl scope) {
+ ExecutionImpl child = createExecution(scope.getName());
+
+ setState(STATE_INACTIVE_SCOPE);
+ child.setState(STATE_ACTIVE_ROOT);
+
+ // copy the current state from the child execution to the parent execution
+ child.setActivity(getActivity());
+ child.setTransition(getTransition());
+ child.setPropagation(getPropagation());
+
+ child.initializeVariables(scope, this);
+ child.initializeTimers(scope);
+
+ return child;
+ }
+
+ public ExecutionImpl destroyScope(CompositeElementImpl scope) {
+ destroyTimers(scope);
+
+ // copy the current state from the child execution to the parent execution
+ parent.setActivity(getActivity());
+ parent.setTransition(getTransition());
+ parent.setPropagation(getPropagation());
+
+ ExecutionImpl parentsParent = parent.getParent();
+ if ( (parentsParent!=null)
+ && (STATE_INACTIVE_CONCURRENT_ROOT.equals(parentsParent.getState()))
+ ) {
+ parent.setState(STATE_ACTIVE_CONCURRENT);
+ } else {
+ parent.setState(STATE_ACTIVE_ROOT);
+ }
+
+ // capture the parent execution cause the
+ // subsequent invocation of end() will set the parent to null
+ ExecutionImpl parent = this.parent;
+
+ end();
+
+ return parent;
+ }
+
+
+ protected void destroyTimers(CompositeElementImpl scope) {
+ TimerSession timerSession = EnvironmentImpl.getFromCurrent(TimerSession.class, false);
+ if (timerSession!=null) {
+ log.debug("destroying timers of "+this);
+ List<Timer> timers = timerSession.findTimersByExecution(this);
+ for (Timer timer: timers) {
+
+ Job job = EnvironmentImpl.getFromCurrent(JobImpl.class, false);
+ if (timer!=job) {
+ timerSession.cancel(timer);
+ }
+ }
+ }
+ }
+
+
+ // basic object methods /////////////////////////////////////////////////////
+
+ public String toString() {
+ if (getId()!=null) {
+ return "execution["+id+"]";
+ }
+ if (parent==null) {
+ return "process-instance";
+ }
+ return "execution";
+ }
+
+ // execution method : end ///////////////////////////////////////////////////
+
+ public void end() {
+ end(Execution.STATE_ENDED);
+ }
+
+ public void end(String state) {
+ if (state==null) {
+ throw new JbpmException("state is null");
+ }
+
+ if (state.equals(STATE_CREATED)
+ || state.equals(STATE_ACTIVE_ROOT)
+ || state.equals(STATE_ACTIVE_CONCURRENT)
+ || state.equals(STATE_INACTIVE_CONCURRENT_ROOT)
+ || state.equals(STATE_INACTIVE_SCOPE)
+ || state.equals(STATE_INACTIVE_JOIN)
+ || state.equals(STATE_SUSPENDED)
+ || state.equals(STATE_ASYNC)) {
+ throw new JbpmException("invalid end state: "+state);
+ }
+
+ if (log.isDebugEnabled()) {
+ if (state==STATE_ENDED) {
+ log.debug(toString()+" ends");
+ } else {
+ log.debug(toString()+" ends with state "+state);
+ }
+ }
+
+ // end all child executions
+ // making a copy of the executions to prevent ConcurrentMoidificationException
+ List<ExecutionImpl> executionsToEnd = new ArrayList<ExecutionImpl>(executions);
+ for (ExecutionImpl child: executionsToEnd) {
+ child.end(state);
+ }
+
+ setState(state);
+
+ this.propagation = Propagation.EXPLICIT;
+
+ DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class, false);
+
+ if (parent!=null) {
+ parent.removeExecution(this);
+ if (dbSession!=null) {
+ dbSession.delete(this);
+ }
+
+ } else { // this is a process instance
+ HistoryEvent.fire(new ProcessInstanceEnd(), this);
+ fire(Event.END, getProcessDefinition());
+
+ if (superProcessExecution!=null) {
+ log.trace(toString()+" signals super process execution");
+ superProcessExecution.signal();
+
+ } else if (dbSession!=null) {
+ dbSession.deleteProcessInstance(id, false);
+ }
+ }
+ }
+
+ public void end(OpenExecution executionToEnd) {
+ ((ExecutionImpl)executionToEnd).end();
+ }
+
+ public void end(OpenExecution executionToEnd, String state) {
+ ((ExecutionImpl)executionToEnd).end(state);
+ }
+
+
+ // execution method : signal ////////////////////////////////////////////////
+
+ public void signal() {
+ signal(null, (Map<String,?>)null);
+ }
+
+ public void signal(String signal) {
+ signal(signal, (Map<String,?>)null);
+ }
+
+ public void signal(Map<String, ?> parameters) {
+ signal(null, parameters);
+ }
+
+ public void signal(String signal, Map<String, ?> parameters) {
+ checkActive();
+ if (getProcessDefinition().isSuspended()) {
+ throw new JbpmException("process definition "+getProcessDefinition().getId()+" is suspended");
+ }
+ propagation = Propagation.EXPLICIT;
+ if (getActivity()!=null) {
+ performAtomicOperation(new Signal(signal, parameters));
+ } else if (transition!=null) {
+ performAtomicOperation(AtomicOperation.TRANSITION_START_ACTIVITY);
+ } else {
+ throw new JbpmException("execution is not in a activity or in a transition");
+ }
+ }
+
+ public void signal(Execution execution) {
+ ((ExecutionImpl)execution).signal(null, (Map<String,?>)null);
+ }
+
+ public void signal(String signalName, Execution execution) {
+ ((ExecutionImpl)execution).signal(signalName, (Map<String,?>)null);
+ }
+
+ public void signal(Map<String, ?> parameters, Execution execution) {
+ ((ExecutionImpl)execution).signal(null, parameters);
+ }
+
+ public void signal(String signalName, Map<String, ?> parameters, Execution execution) {
+ ((ExecutionImpl)execution).signal(signalName, parameters);
+ }
+
+ // execution method : take ////////////////////////////////////////////////
+
+ /** @see Execution#takeDefaultTransition() */
+ public void takeDefaultTransition() {
+ TransitionImpl defaultTransition = getActivity().getDefaultOutgoingTransition();
+ if (defaultTransition==null) {
+ throw new JbpmException("there is no default transition in "+getActivity());
+ }
+ take(defaultTransition);
+ }
+
+ /** @see Execution#take(String) */
+ public void take(String transitionName) {
+ if (getActivity()==null) {
+ throw new JbpmException(toString()+" is not positioned in activity");
+ }
+ TransitionImpl transition = findTransition(transitionName);
+ if (transition==null) {
+ throw new JbpmException("there is no transition "+transitionName+" in "+getActivity());
+ }
+ take(transition);
+ }
+
+ /** @see Execution#takeDefaultTransition() */
+ public void take(Transition transition) {
+ checkActive();
+
+ setPropagation(Propagation.EXPLICIT);
+
+ setTransition((TransitionImpl) transition);
+
+ fire(Event.END, getActivity(), AtomicOperation.TRANSITION_END_ACTIVITY);
+ }
+
+ public void take(Transition transition, Execution execution) {
+ ((ExecutionImpl)execution).take(transition);
+ }
+
+ // execution method : execute ///////////////////////////////////////////////
+
+ /** @see Execution#execute(String) */
+ public void execute(String activityName) {
+ if (getActivity()==null) {
+ throw new JbpmException("activity is null");
+ }
+ Activity nestedActivity = getActivity().getActivity(activityName);
+ if (nestedActivity==null) {
+ throw new JbpmException("activity "+activityName+" doesn't exist in "+getActivity());
+ }
+ execute(nestedActivity);
+ }
+
+ /** @see Execution#execute(Activity) */
+ public void execute(Activity activity) {
+ if (activity==null) {
+ throw new JbpmException("activity is null");
+ }
+ checkActive();
+
+ this.propagation = Propagation.EXPLICIT;
+ performAtomicOperation(new MoveToChildActivity((ActivityImpl) activity));
+ }
+
+ // execution method : waitForSignal /////////////////////////////////////////
+
+ public void waitForSignal() {
+ propagation = Propagation.WAIT;
+ }
+
+ // execution method : proceed ///////////////////////////////////////////////
+
+ public void proceed() {
+ checkActive();
+
+ // in graph based processDefinition languages we assume that a
+ // default transition is available
+ TransitionImpl defaultTransition = findDefaultTransition();
+ if (defaultTransition!=null) {
+ take(defaultTransition);
+
+ // in block structured processDefinition languages we assume that
+ // there is no default transition and that there is a
+ // parent activity of the current activity
+ } else {
+ ActivityImpl parentActivity = getActivity().getParentActivity();
+
+ // if there is a parent activity
+ if (parentActivity!=null) {
+ // propagate to the parent
+ performAtomicOperation(AtomicOperation.PROPAGATE_TO_PARENT);
+
+ } else {
+ // When we don't know how to proceed, i don't know if it's best to
+ // throw new PvmException("don't know how to proceed");
+ // or to end the execution. Because of convenience for testing,
+ // I opted to end the execution.
+ end();
+ }
+ }
+ }
+
+ public void setActivity(Activity activity, Execution execution) {
+ ((ExecutionImpl)execution).setActivity(activity);
+ }
+
+ public void setActivity(Activity activity) {
+ setActivity((ActivityImpl) activity);
+ }
+
+ // events ///////////////////////////////////////////////////////////////////
+
+ public void fire(String eventName, ObservableElement eventSource) {
+ fire(eventName, (ObservableElementImpl) eventSource, null);
+ }
+
+ public void fire(String eventName, ObservableElementImpl observableElement, AtomicOperation eventCompletedOperation) {
+ EventImpl event = findEvent(observableElement, eventName);
+ if (event!=null) {
+ setEvent(event);
+ setEventSource(observableElement);
+ setEventListenerIndex(0);
+ setEventCompletedOperation(eventCompletedOperation);
+ performAtomicOperation(AtomicOperation.EXECUTE_EVENT_LISTENER);
+ } else {
+ if (eventCompletedOperation!=null) {
+ performAtomicOperationSync(eventCompletedOperation);
+ }
+ }
+ }
+
+ public static EventImpl findEvent(ObservableElementImpl observableElement, String eventName) {
+ if (observableElement==null) {
+ return null;
+ }
+
+ EventImpl event = observableElement.getEvent(eventName);
+ if (event!=null) {
+ return event;
+ }
+
+ return findEvent(observableElement.getParent(), eventName);
+ }
+
+ // execution : internal methods /////////////////////////////////////////////
+
+ public void moveTo(ActivityImpl destination) {
+ // move the execution to the destination
+ setActivity(destination);
+ transition = null;
+ }
+
+ public ExecutionImpl startActivity(ActivityImpl activity) {
+ ExecutionImpl propagatingExecution = this;
+ if (activity.isLocalScope()) {
+ propagatingExecution = createScope(activity);
+ }
+ fire(Event.START, activity);
+ return propagatingExecution;
+ }
+
+ public ExecutionImpl endActivity(ActivityImpl activity) {
+ ExecutionImpl propagatingExecution = this;
+ fire(Event.END, activity);
+ if (activity.isLocalScope()) {
+ propagatingExecution = destroyScope(activity);
+ }
+ return propagatingExecution;
+ }
+
+ // asynchronous continuations ////////////////////////////////////////////////
+
+ public synchronized void performAtomicOperation(AtomicOperation operation) {
+ if (operation.isAsync(this)) {
+ sendContinuationMessage(operation);
+ } else {
+ performAtomicOperationSync(operation);
+ }
+ }
+
+ public void sendContinuationMessage(AtomicOperation operation) {
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ MessageSession messageSession = environment.get(MessageSession.class);
+ if (messageSession==null) {
+ throw new JbpmException("no message-session configured to send asynchronous continuation message");
+ }
+ MessageImpl<?> asyncMessage = operation.createAsyncMessage(this);
+ setState(Execution.STATE_ASYNC);
+ messageSession.send(asyncMessage);
+ }
+
+ public void performAtomicOperationSync(AtomicOperation operation) {
+ if (atomicOperations==null) {
+
+ // initialise the fifo queue of atomic operations
+ atomicOperations = new LinkedList<AtomicOperation>();
+ atomicOperations.offer(operation);
+
+ ExecutionContext originalExecutionContext = null;
+ ExecutionContext executionContext = null;
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ if (environment!=null) {
+ originalExecutionContext = (ExecutionContext) environment.getContext(Context.CONTEXTNAME_EXECUTION);
+ if ( (originalExecutionContext!=null)
+ && (originalExecutionContext.getExecution()==this)
+ ) {
+ originalExecutionContext = null;
+ } else {
+ executionContext = new ExecutionContext(this);
+ environment.setContext(executionContext);
+ }
+ }
+
+ try {
+ while (! atomicOperations.isEmpty()) {
+ AtomicOperation atomicOperation = atomicOperations.poll();
+ atomicOperation.perform(this);
+ }
+
+ } catch (RuntimeException e ) {
+ throw e;
+ } finally {
+ atomicOperations = null;
+
+ if (executionContext!=null) {
+ environment.removeContext(executionContext);
+ }
+ if (originalExecutionContext!=null) {
+ environment.setContext(originalExecutionContext);
+ }
+ }
+ } else {
+ atomicOperations.offer(operation);
+ }
+ }
+
+ public void handleException(ObservableElementImpl observableElement,
+ EventImpl event,
+ EventListenerReference eventListenerReference,
+ Exception exception,
+ String rethrowMessage) {
+
+ List<ProcessElementImpl> processElements = new ArrayList<ProcessElementImpl>();
+ if (eventListenerReference!=null) {
+ processElements.add(eventListenerReference);
+ }
+ if (event!=null) {
+ processElements.add(event);
+ }
+ while (observableElement!=null) {
+ processElements.add(observableElement);
+ observableElement = observableElement.getParent();
+ }
+
+ for (ProcessElementImpl processElement: processElements) {
+ List<ExceptionHandlerImpl> exceptionHandlers = processElement.getExceptionHandlers();
+ if (exceptionHandlers!=null) {
+ for (ExceptionHandlerImpl exceptionHandler: exceptionHandlers) {
+ if (exceptionHandler.matches(exception)) {
+ try {
+ exceptionHandler.handle(this, exception);
+ return;
+ } catch (Exception rethrowException) {
+ if (!exceptionHandler.isRethrowMasked()) {
+ exception = rethrowException;
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ log.trace("rethrowing exception cause no exception handler for "+exception);
+ ExceptionHandlerImpl.rethrow(exception, rethrowMessage+": "+exception.getMessage());
+ }
+
+
+ // tasks ////////////////////////////////////////////////////////////////////
+
+ /** tasks and swimlane assignment.
+ * SwimlaneDefinitionImpl is base class for TaskDefinitionImpl.
+ * Both Task and Swimlane implement Assignable. */
+ public void initializeAssignments(AssignableDefinitionImpl assignableDefinition, Assignable assignable) {
+ String assigneeExpression = assignableDefinition.getAssigneeExpression();
+ if (assigneeExpression!=null) {
+ String assignee = resolveAssignmentExpression(assigneeExpression,
+ assignableDefinition.getAssigneeExpressionLanguage());
+ assignable.setAssignee(assignee);
+
+ if (log.isTraceEnabled()) log.trace("task "+name+" assigned to "+assignee+" using expression "+assigneeExpression);
+ }
+
+ String candidateUsersExpression = assignableDefinition.getCandidateUsersExpression();
+ if (candidateUsersExpression!=null) {
+ String candidateUsers =
+ resolveAssignmentExpression(candidateUsersExpression,
+ assignableDefinition.getCandidateUsersExpressionLanguage());
+ StringTokenizer tokenizer = new StringTokenizer(candidateUsers, ",");
+ while (tokenizer.hasMoreTokens()) {
+ String candidateUser = tokenizer.nextToken().trim();
+ assignable.addCandidateUser(candidateUser);
+ }
+ }
+
+ String candidateGroupsExpression = assignableDefinition.getCandidateGroupsExpression();
+ if (candidateGroupsExpression!=null) {
+ String candidateGroups =
+ resolveAssignmentExpression(candidateGroupsExpression,
+ assignableDefinition.getCandidateGroupsExpressionLanguage());
+ StringTokenizer tokenizer = new StringTokenizer(candidateGroups, ",");
+ while (tokenizer.hasMoreTokens()) {
+ String candidateGroup = tokenizer.nextToken();
+ assignable.addCandidateGroup(candidateGroup);
+ }
+ }
+
+ UserCodeReference assignmentHandlerReference = assignableDefinition.getAssignmentHandlerReference();
+ if (assignmentHandlerReference!=null) {
+ AssignmentHandler assignmentHandler = (AssignmentHandler) assignmentHandlerReference.getObject(this.getProcessDefinition());
+ if (assignmentHandler!=null) {
+ try {
+ assignmentHandler.assign(assignable, this);
+ } catch (Exception e) {
+ throw new JbpmException("assignment handler threw exception: " + e, e);
+ }
+ }
+ }
+ }
+
+ protected String resolveAssignmentExpression(String expression, String expressionLanguage) {
+ ScriptManager scriptManager = EnvironmentImpl.getFromCurrent(ScriptManager.class);
+ Object result = scriptManager.evaluateExpression(expression, expressionLanguage);
+ if ( (result ==null)
+ || (result instanceof String)
+ ) {
+ return (String) result;
+ }
+ throw new JbpmException("result of assignment expression "+expression+" is "+result+" ("+result.getClass().getName()+") instead of String");
+ }
+
+ // swimlanes ////////////////////////////////////////////////////////////////
+
+ public void addSwimlane(SwimlaneImpl swimlane) {
+ swimlanes.put(swimlane.getName(), swimlane);
+ swimlane.setExecution(this);
+ }
+
+ public SwimlaneImpl getSwimlane(String swimlaneName) {
+ return swimlanes.get(swimlaneName);
+ }
+
+ public void removeSwimlane(SwimlaneImpl swimlane) {
+ swimlanes.remove(swimlane.getName());
+ swimlane.setExecution(null);
+ }
+
+ public SwimlaneImpl getInitializedSwimlane(SwimlaneDefinitionImpl swimlaneDefinition) {
+ String swimlaneName = swimlaneDefinition.getName();
+ SwimlaneImpl swimlane = swimlanes.get(swimlaneName);
+ if (swimlane==null) {
+ swimlane = createSwimlane(swimlaneName);
+ initializeAssignments(swimlaneDefinition, swimlane);
+ }
+
+ return swimlane;
+ }
+
+ public SwimlaneImpl createSwimlane(String swimlaneName) {
+ SwimlaneImpl swimlane = new SwimlaneImpl();
+ long dbid = EnvironmentImpl.getFromCurrent(DbidGenerator.class).getNextId();
+ swimlane.setDbid(dbid);
+ swimlane.setName(swimlaneName);
+ swimlane.setExecution(this);
+ swimlanes.put(swimlaneName, swimlane);
+ return swimlane;
+ }
+
+ // child executions /////////////////////////////////////////////////////////
+
+ public ExecutionImpl createExecution() {
+ return createExecution(null);
+ }
+
+ public ExecutionImpl createExecution(String name) {
+ // when an activity calls createExecution, propagation is explicit.
+ // this means that the default propagation (proceed()) will not be called
+ propagation = Propagation.EXPLICIT;
+
+ // create new execution
+ ExecutionImpl childExecution = newChildExecution();
+ // initialize child execution
+ childExecution.setProcessDefinition(getProcessDefinition());
+ childExecution.processInstance = this.processInstance;
+ childExecution.name = name;
+
+ childExecution.save();
+ // make sure that child execution are saved before added to a persistent collection
+ // cause of the 'assigned' id strategy, adding the childExecution to the persistent collection
+ // before the dbid is assigned will result in identifier of an instance of ExecutionImpl altered from 0 to x
+ addExecution(childExecution);
+ // composeIds uses the parent so the childExecution has to be added before the ids are composed
+ childExecution.composeIds();
+
+ log.debug("created "+childExecution);
+
+ return childExecution;
+ }
+
+ protected ExecutionImpl newChildExecution() {
+ return new ExecutionImpl();
+ }
+
+ public void addExecution(ExecutionImpl execution) {
+ execution.setParent(this);
+ executions.add(execution);
+ executionsMap = null;
+ }
+
+ /** @see Execution#getExecution(String) */
+ public ExecutionImpl getExecution(String name) {
+ Map<String, Execution> executionsMap = getExecutionsMap();
+ return (ExecutionImpl) (executionsMap!=null ? executionsMap.get(name) : null);
+ }
+
+ public void removeExecution(ExecutionImpl child) {
+ if (executions.contains(child)) {
+ if (executions.remove(child)) {
+ child.setParent(null);
+
+ // invalidate the executionsMap cache
+ executionsMap = null;
+ } else {
+ throw new JbpmException(child+" is not a child execution of "+this);
+ }
+ }
+ }
+
+ public Map<String, Execution> getExecutionsMap() {
+ if ((executionsMap==null)) {
+ // initialize executionsMap cache
+ executionsMap = new HashMap<String, Execution>();
+ for(ExecutionImpl execution: executions) {
+ String executionName = execution.getName();
+ // the next test makes sure that the first execution wins
+ // in case there are multiple executions with the same name
+ if (! executionsMap.containsKey(executionName)) {
+ executionsMap.put(executionName, execution);
+ }
+ }
+ }
+ return executionsMap;
+ }
+
+ public boolean hasExecution(String name) {
+ return ( (getExecutionsMap()!=null)
+ && executionsMap.containsKey(name)
+ );
+ }
+
+ public boolean isActive(String activityName) {
+ return findActiveActivityNames().contains(activityName);
+ }
+
+ public Set<String> findActiveActivityNames() {
+ return addActiveActivityNames(new HashSet<String>());
+ }
+
+ protected Set<String> addActiveActivityNames(Set<String> activityNames) {
+ if ( ( (state.equals(STATE_ACTIVE_ROOT)) || (state.equals(STATE_ACTIVE_CONCURRENT)) )
+ &&
+ (activityName!=null)
+ ) {
+ activityNames.add(activityName);
+ }
+
+ for (ExecutionImpl childExecution: executions) {
+ childExecution.addActiveActivityNames(activityNames);
+ }
+
+ return activityNames;
+ }
+
+ public ExecutionImpl findActiveExecutionIn(String activityName) {
+ if ( activityName.equals(this.activityName)
+ && isActive()) {
+ return this;
+ }
+
+ for (ExecutionImpl childExecution: executions) {
+ ExecutionImpl found = childExecution.findActiveExecutionIn(activityName);
+ if (found!=null) {
+ return found;
+ }
+ }
+
+ return null;
+ }
+
+ // system variables /////////////////////////////////////////////////////////
+
+ public void createSystemVariable(String key, Object value) {
+ createSystemVariable(key, value, null);
+ }
+
+ public void createSystemVariable(String key, Object value, String typeName) {
+ Variable variable = createVariableObject(key, value, typeName, false);
+ systemVariables.put(variable.getKey(), variable);
+ }
+
+ public void setSystemVariable(String key, Object value) {
+ Variable variable = systemVariables.get(key);
+ if (variable!=null) {
+ log.debug("setting system variable '"+key+"' in '"+this+"' to value '"+value+"'");
+ variable.setValue(value, this);
+ } else {
+ log.debug("creating system variable '"+key+"' in '"+this+"' to value '"+value+"'");
+ createSystemVariable(key, value, null);
+ }
+ }
+
+ public Object getSystemVariable(String key) {
+ Variable variable = systemVariables.get(key);
+ if (variable!=null) {
+ return variable.getValue(this);
+ }
+ return null;
+ }
+
+ public boolean removeSystemVariable(String key) {
+ if (systemVariables.containsKey(key)) {
+ return (systemVariables.remove(key)!=null);
+ }
+ return false;
+ }
+
+ // sub process creation /////////////////////////////////////////////////////
+
+ public ClientProcessInstance createSubProcessInstance(ClientProcessDefinition processDefinition) {
+ return createSubProcessInstance(processDefinition, null);
+ }
+
+ public ClientProcessInstance createSubProcessInstance(ClientProcessDefinition processDefinition, String key) {
+ if (subProcessInstance!=null) {
+ throw new JbpmException(toString()+" already has a sub process instance: "+subProcessInstance);
+ }
+ subProcessInstance = (ExecutionImpl) processDefinition.createProcessInstance(key);
+ subProcessInstance.setSuperProcessExecution(this);
+ return subProcessInstance;
+ }
+
+ public ClientProcessInstance startSubProcessInstance(ClientProcessDefinition processDefinition) {
+ return startSubProcessInstance(processDefinition, null);
+ }
+
+ public ClientProcessInstance startSubProcessInstance(ClientProcessDefinition processDefinition, String key) {
+ createSubProcessInstance(processDefinition, key);
+ subProcessInstance.start();
+ return subProcessInstance;
+ }
+
+ // state mgmt ///////////////////////////////////////////////////////////////
+
+ /** @see Execution#suspend() */
+ public void suspend() {
+ super.suspend();
+ this.propagation = Propagation.EXPLICIT;
+ DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class, false);
+ if (dbSession!=null) {
+ dbSession.cascadeExecutionSuspend(this);
+ }
+ }
+
+ /** @see Execution#resume() */
+ public void resume() {
+ super.resume();
+ DbSession hibernatePvmDbSession = EnvironmentImpl.getFromCurrent(DbSession.class, false);
+ if (hibernatePvmDbSession!=null) {
+ hibernatePvmDbSession.cascadeExecutionResume(this);
+ }
+ }
+
+ protected void checkActive() {
+ if (!isActive()) {
+ throw new JbpmException(toString()+" is not active: "+state);
+ }
+ }
+
+ public boolean isEnded() {
+ if (Execution.STATE_ENDED.equals(state)) {
+ return true;
+ }
+ if (Execution.STATE_CREATED.equals(state)) {
+ return false;
+ }
+ if (Execution.STATE_ACTIVE_ROOT.equals(state)) {
+ return false;
+ }
+ if (Execution.STATE_ACTIVE_CONCURRENT.equals(state)) {
+ return false;
+ }
+ if (Execution.STATE_INACTIVE_CONCURRENT_ROOT.equals(state)) {
+ return false;
+ }
+ if (Execution.STATE_INACTIVE_SCOPE.equals(state)) {
+ return false;
+ }
+ if (Execution.STATE_SUSPENDED.equals(state)) {
+ return false;
+ }
+ if (Execution.STATE_ASYNC.equals(state)) {
+ return false;
+ }
+ return true;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+
+ // overriding the ScopeInstanceImpl methods /////////////////////////////////
+
+ public ScopeInstanceImpl getParentVariableScope() {
+ return parent;
+ }
+
+ public ExecutionImpl getTimerExecution() {
+ return this;
+ }
+
+ // overridable by process languages /////////////////////////////////////////
+
+ /** by default this will use {@link ActivityImpl#findOutgoingTransition(String)} to
+ * search for the outgoing transition, which includes a search over the parent chain
+ * of the current activity. This method allows process languages to overwrite this default
+ * implementation of the transition lookup by transitionName.*/
+ protected TransitionImpl findTransition(String transitionName) {
+ return getActivity().findOutgoingTransition(transitionName);
+ }
+
+ protected TransitionImpl findDefaultTransition() {
+ return getActivity().findDefaultTransition();
+ }
+
+ // history //////////////////////////////////////////////////////////////////
+
+ public void historyAutomatic() {
+ HistoryEvent.fire(new AutomaticEnd(), this);
+ }
+
+ public void historyDecision(String transitionName) {
+ HistoryEvent.fire(new DecisionEnd(transitionName), this);
+ }
+
+ public void historyActivityStart() {
+ HistoryEvent.fire(new ActivityStart(), this);
+ }
+
+ public void historyActivityEnd() {
+ HistoryEvent.fire(new ActivityEnd(), this);
+ }
+
+ public void historyActivityEnd(String transitionName) {
+ HistoryEvent.fire(new ActivityEnd(transitionName), this);
+ }
+
+ // equals ///////////////////////////////////////////////////////////////////
+ // hack to support comparing hibernate proxies against the real objects
+ // since this always falls back to ==, we don't need to overwrite the hashcode
+ public boolean equals(Object o) {
+ return EqualsUtil.equals(this, o);
+ }
+
+ // process definition getter and setter /////////////////////////////////////
+ // this getter and setter is special because persistence is based on the //
+ // process definition id. //
+ /////////////////////////////////////////////////////////////////////////////
+
+
+ public ProcessDefinitionImpl getProcessDefinition() {
+ if ( (processDefinition==null)
+ && (processDefinitionId!=null)
+ ) {
+ RepositorySession repositorySession = EnvironmentImpl.getFromCurrent(RepositorySession.class);
+ processDefinition = (ProcessDefinitionImpl) repositorySession.findProcessDefinitionById(processDefinitionId);
+ if (processDefinition==null) {
+ throw new JbpmException("couldn't find process definition "+processDefinitionId+" in the repository");
+ }
+ }
+ return processDefinition;
+ }
+ public void setProcessDefinition(ProcessDefinitionImpl processDefinition) {
+ this.processDefinition = processDefinition;
+ this.processDefinitionId = processDefinition.getId();
+ }
+
+ // activity getter and setter ///////////////////////////////////////////////
+ // this getter and setter is special because persistence is based on the //
+ // activity name. //
+ /////////////////////////////////////////////////////////////////////////////
+
+ public ActivityImpl getActivity() {
+ if ( (activity==null)
+ && (activityName!=null)
+ ) {
+ activity = getProcessDefinition().findActivity(activityName);
+ }
+ return activity;
+ }
+
+ public void setActivity(ActivityImpl activity) {
+ this.activity = activity;
+ if (activity!=null) {
+ this.activityName = activity.getName();
+ } else {
+ this.activityName = null;
+ }
+ }
+
+ public String getActivityName() {
+ return activityName;
+ }
+
+ // special getters and setters /////////////////////////////////////////////////
+
+ public boolean hasAsyncEndEvent(List<ActivityImpl> leftActivities) {
+ for (ActivityImpl leftActivity : leftActivities) {
+ EventImpl endEvent = leftActivity.getEvent(Event.END);
+ if ( (endEvent!=null)
+ && (endEvent.isAsync())
+ ) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean getIsProcessInstance() {
+ return parent==null;
+ }
+
+ // getters and setters for scope instance //////////////////////////////////////
+
+ public ExecutionImpl getExecution() {
+ return this;
+ }
+
+ // getters and setters /////////////////////////////////////////////////////////
+
+ public TransitionImpl getTransition() {
+ return transition;
+ }
+ public void setTransition(TransitionImpl transition) {
+ this.transition = transition;
+ }
+ public EventImpl getEvent() {
+ return event;
+ }
+ public ObservableElementImpl getEventSource() {
+ return eventSource;
+ }
+ public Collection<ExecutionImpl> getExecutions() {
+ return (Collection) executions;
+ }
+ public String getName() {
+ return name;
+ }
+ public ExecutionImpl getParent() {
+ return parent;
+ }
+ public int getPriority() {
+ return priority;
+ }
+ public void setEvent(EventImpl event) {
+ this.event = event;
+ }
+ public void setEventSource(ObservableElementImpl eventSource) {
+ this.eventSource = eventSource;
+ }
+ public void setPriority(int priority) {
+ this.priority = priority;
+ }
+ public ExecutionImpl getProcessInstance() {
+ return processInstance;
+ }
+ public void setProcessInstance(ExecutionImpl processInstance) {
+ this.processInstance = processInstance;
+ }
+ public String getKey() {
+ return key;
+ }
+ public Propagation getPropagation() {
+ return propagation;
+ }
+ public void setPropagation(Propagation propagation) {
+ this.propagation = propagation;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public void setExecutions(Collection<ExecutionImpl> executions) {
+ this.executions = executions;
+ }
+ public void setParent(ExecutionImpl parent) {
+ this.parent = parent;
+ }
+ public ExecutionImpl getSuperProcessExecution() {
+ return superProcessExecution;
+ }
+ public void setSuperProcessExecution(ExecutionImpl superProcessExecution) {
+ this.superProcessExecution = superProcessExecution;
+ }
+ public ExecutionImpl getSubProcessInstance() {
+ return subProcessInstance;
+ }
+ public void setSubProcessInstance(ExecutionImpl subProcessExecution) {
+ this.subProcessInstance = subProcessExecution;
+ }
+ public void setKey(String key) {
+ this.key = key;
+ }
+ public String getId() {
+ return id;
+ }
+ public void setId(String id) {
+ this.id = id;
+ }
+ public Long getHistoryActivityInstanceDbid() {
+ return historyActivityInstanceDbid;
+ }
+ public void setHistoryActivityInstanceDbid(Long historyActivityInstanceDbid) {
+ this.historyActivityInstanceDbid = historyActivityInstanceDbid;
+ }
+ public Date getHistoryActivityStart() {
+ return historyActivityStart;
+ }
+ public void setHistoryActivityStart(Date historyActivityStart) {
+ this.historyActivityStart = historyActivityStart;
+ }
+ public String getProcessDefinitionId() {
+ return processDefinitionId;
+ }
+ public int getEventListenerIndex() {
+ return eventListenerIndex;
+ }
+ public void setEventListenerIndex(int eventListenerIndex) {
+ this.eventListenerIndex = eventListenerIndex;
+ }
+ public AtomicOperation getEventCompletedOperation() {
+ return eventCompletedOperation;
+ }
+ public void setEventCompletedOperation(AtomicOperation eventCompletedOperation) {
+ this.eventCompletedOperation = eventCompletedOperation;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExecutionKeyGenerator.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExecutionKeyGenerator.java
new file mode 100644
index 0000000..21e0585
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExecutionKeyGenerator.java
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.ProcessDefinition;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface ExecutionKeyGenerator {
+
+ String createKey(ProcessDefinition processDefinition, Execution execution, String executionRef);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExpressionCondition.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExpressionCondition.java
new file mode 100644
index 0000000..54f5e0e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ExpressionCondition.java
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.model.OpenExecution;
+import org.jbpm.pvm.internal.script.ScriptManager;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ExpressionCondition implements Condition {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String expression;
+ protected String language;
+
+ public boolean evaluate(OpenExecution execution) {
+ ScriptManager scriptManager = ScriptManager.getScriptManager();
+ Object result = scriptManager.evaluateExpression(expression, language);
+ if (result instanceof Boolean) {
+ return ((Boolean) result).booleanValue();
+ }
+ throw new JbpmException("expression condition '"+expression+"' did not return a boolean: "+result);
+ }
+
+ public void setExpression(String expression) {
+ this.expression = expression;
+ }
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ObservableElement.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ObservableElement.java
new file mode 100644
index 0000000..594085d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ObservableElement.java
@@ -0,0 +1,65 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.util.Set;
+
+
+/** a super class for process elements that have events.
+ *
+ * @author Tom Baeyens
+ */
+public interface ObservableElement {
+
+ /** the meaningless database primary key */
+ long getDbid();
+
+ /** the short display name given to this element. */
+ String getName();
+
+ /** the process definition to which this process element belongs */
+ OpenProcessDefinition getProcessDefinition();
+
+ /** the property value for the given key or null if no such
+ * configuration key is present.
+ *
+ * This is extra static configuration information that can be
+ * associated to a process element. Process languages can use this
+ * to store configuration properties for extensions in it. That way,
+ * these extensions can be added without changing the process model
+ * or the database schema. Examples of extensions that may use these
+ * configuration properties are simulation, predictive scheduling,
+ * graphical information,... */
+ Object getProperty(String key);
+
+ /** the set of available property keys or an empty set in case
+ * there are no keys. */
+ Set<String> getPropertyKeys();
+
+ /** indicates if the given event is defined no this element.
+ * This method only looks in this observable element and it will not
+ * search the parent hierarchy for the given event. */
+ boolean hasEvent(String eventName);
+
+ /** the enclosing activity or the process definition */
+ ObservableElement getParent();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ObservableElementImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ObservableElementImpl.java
new file mode 100644
index 0000000..27b7859
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ObservableElementImpl.java
@@ -0,0 +1,99 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jbpm.api.model.Event;
+
+
+/** observable and visible process elements.
+ *
+ * @author Tom Baeyens
+ */
+public class ObservableElementImpl extends ProcessElementImpl implements ObservableElement {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String name;
+ protected String description;
+ protected Map<String, EventImpl> events;
+
+ // default parent is null ///////////////////////////////////////////////////
+
+ public ObservableElementImpl getParent() {
+ return null;
+ }
+
+ // events ///////////////////////////////////////////////////////////////////
+
+ public EventImpl getEvent(String eventName) {
+ return (events != null ? events.get(eventName) : null);
+ }
+
+ public boolean hasEvent(String eventName) {
+ return (getEvent(eventName)!=null);
+ }
+
+ /** event factory method that also establishes the bidirectional relation. */
+ public EventImpl createEvent(String eventName) {
+ EventImpl event = new EventImpl();
+ event.setObservableElement(this);
+ event.setName(eventName);
+ event.setProcessDefinition(processDefinition);
+ return addEvent(event);
+ }
+
+ /**
+ * add an event to this processDefinition element.
+ * @throws NullPointerException if event is null.
+ */
+ public EventImpl addEvent(EventImpl event) {
+ if (events == null) {
+ events = new HashMap<String, EventImpl>();
+ }
+ events.put(event.getName(), event);
+ return event;
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getDescription() {
+ return description;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+ public Map<String, Event> getEvents() {
+ return (Map) events;
+ }
+ public void setEvents(Map<String, EventImpl> events) {
+ this.events = events;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/OpenProcessDefinition.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/OpenProcessDefinition.java
new file mode 100644
index 0000000..21d295f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/OpenProcessDefinition.java
@@ -0,0 +1,59 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import org.jbpm.api.ProcessDefinition;
+
+
+
+/**
+ * a graph (or tree) structure that can be executed.
+ *
+ * <h2>Purpose</h2>
+ * <p>ProcessDefinition is a base implementation that can be leveraged to build
+ * graph based execution languages. While the ProcessDefinition class is concrete and
+ * can be used as-is (e.g. by aggregation), most likely processDefinition languages
+ * will inherit from this ProcessDefinition and create more specialized implementations.
+ * </p>
+ *
+ * <p>The specialized processDefinition language classes can extend this ProcessDefinition
+ * with new datastructures relevant for that perticular processDefinition language.
+ * </p>
+ *
+ * <h2>Structure</h2>
+ * <p>A processDefinition contains a set of activities. Activities can be connected with
+ * transitions or activities can have nested activities. But the transitions and
+ * nested activities can be combined.
+ * </p>
+ *
+ * <h2>Execution</h2>
+ * <p>To create a new execution for a given processDefinition, see {@link #startExecution()}.
+ * </p>
+ *
+ * @author Tom Baeyens
+ */
+public interface OpenProcessDefinition extends ProcessDefinition, CompositeElement {
+
+ /** the initial activity of this process definition */
+ Activity getInitial();
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ProcessDefinitionImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ProcessDefinitionImpl.java
new file mode 100644
index 0000000..c9b4225
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ProcessDefinitionImpl.java
@@ -0,0 +1,204 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.JbpmException;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.client.ClientProcessDefinition;
+import org.jbpm.pvm.internal.client.ClientProcessInstance;
+import org.jbpm.pvm.internal.task.TaskDefinitionImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ProcessDefinitionImpl extends CompositeElementImpl implements OpenProcessDefinition, ClientProcessDefinition {
+
+ private static final long serialVersionUID = 1L;
+ private static final Log log = Log.getLog(ProcessDefinitionImpl.class.getName());
+
+ public static final int UNASSIGNED_VERSION = -1;
+
+ /** user provided short reference for the process definition that
+ * has the same scope as the name. Multiple versions of the same
+ * process can have the same key. The key is used to build the
+ * globally unique execution ids. */
+ protected String key;
+
+ /** the unique id (e.g. combination of name and versionnumber) for this
+ * process definition. */
+ protected String id;
+
+ /** the version number of the process definitions with the same name.*/
+ protected int version = UNASSIGNED_VERSION;
+
+ /** optional package name similar to the Java package name. */
+ protected String packageName;
+
+ /** time this process was deployed */
+ protected Date deploymentTime;
+
+ /** ref to the deployment */
+ protected long deploymentDbid;
+
+ /** propagated from deployment to process definition during deploy */
+ protected boolean isSuspended = false;
+
+ /** the activity which is executed when the process starts */
+ protected ActivityImpl initial;
+
+ /**
+ * 放开任务定义变量,取得流程定义中的任务
+ */
+public Map<String, TaskDefinitionImpl> taskDefinitions = new HashMap<String, TaskDefinitionImpl>();
+
+ protected String imageResourceName = null;
+
+
+ public ProcessDefinitionImpl() {
+ this.processDefinition = this;
+ }
+
+ // execution factory method /////////////////////////////////////////////////
+
+ public ClientProcessInstance createProcessInstance() {
+ return createProcessInstance(null, null);
+ }
+
+ public ClientProcessInstance createProcessInstance(String key) {
+ return createProcessInstance(key, null);
+ }
+
+ public ClientProcessInstance createProcessInstance(String key, Execution superProcessExecution) {
+ if (isSuspended) {
+ throw new JbpmException("process definition "+id+" is suspended");
+ }
+
+ ExecutionImpl processInstance = newProcessInstance();
+ log.debug("creating new execution for process '"+name+"'");
+ if (superProcessExecution!=null) {
+ // establish the bidirectional relation between super process activity instance
+ // and sub process instance
+ ExecutionImpl superProcessExecutionImpl = (ExecutionImpl) superProcessExecution;
+ processInstance.setSuperProcessExecution(superProcessExecutionImpl);
+ superProcessExecutionImpl.setSubProcessInstance(processInstance);
+ }
+ processInstance.initializeProcessInstance(this, key);
+ return processInstance;
+ }
+
+ public ClientProcessInstance startProcessInstance() {
+ ClientProcessInstance processInstance = createProcessInstance(null, null);
+ processInstance.start();
+ return processInstance;
+ }
+
+ public ClientProcessInstance startProcessInstance(String key) {
+ ClientProcessInstance processInstance = createProcessInstance(key, null);
+ processInstance.start();
+ return processInstance;
+ }
+
+ protected ExecutionImpl newProcessInstance() {
+ return new ExecutionImpl();
+ }
+
+ // task definitions /////////////////////////////////////////////////////////
+
+ public void addTaskDefinitionImpl(TaskDefinitionImpl taskDefinition) {
+ taskDefinitions.put(taskDefinition.getName(), taskDefinition);
+ }
+
+ public TaskDefinitionImpl getTaskDefinition(String name) {
+ return taskDefinitions.get(name);
+ }
+
+ // basic methods ////////////////////////////////////////////////////////////
+
+ public String toString() {
+ return (name!=null ? "process("+name+")" : "process");
+ }
+
+ // customized getters and setters ///////////////////////////////////////////
+
+ public String getDeploymentId() {
+ return Long.toString(deploymentDbid);
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public ActivityImpl getInitial() {
+ return initial;
+ }
+ public void setInitial(ActivityImpl initial) {
+ this.initial = initial;
+ }
+ public int getVersion() {
+ return version;
+ }
+ public void setVersion(int version) {
+ this.version = version;
+ }
+ public Date getDeploymentTime() {
+ return deploymentTime;
+ }
+ public void setDeploymentTime(Date deploymentTime) {
+ this.deploymentTime = deploymentTime;
+ }
+ public String getPackageName() {
+ return packageName;
+ }
+ public void setPackageName(String packageName) {
+ this.packageName = packageName;
+ }
+ public String getKey() {
+ return key;
+ }
+ public void setKey(String key) {
+ this.key = key;
+ }
+ public String getId() {
+ return id;
+ }
+ public void setId(String id) {
+ this.id = id;
+ }
+ public void setDeploymentDbid(long deploymentDbid) {
+ this.deploymentDbid = deploymentDbid;
+ }
+ public String getImageResourceName() {
+ return imageResourceName;
+ }
+ public void setImageResourceName(String imageResourceName) {
+ this.imageResourceName = imageResourceName;
+ }
+ public boolean isSuspended() {
+ return isSuspended;
+ }
+ public void setSuspended(boolean isSuspended) {
+ this.isSuspended = isSuspended;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ProcessElementImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ProcessElementImpl.java
new file mode 100644
index 0000000..a797cd1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ProcessElementImpl.java
@@ -0,0 +1,113 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+/**
+ * superclass for {@link ActivityImpl}, {@link TransitionImpl} and {@link ProcessDefinitionImpl}.
+ *
+ * @author Tom Baeyens
+ */
+
+public class ProcessElementImpl implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ private static final Log log = Log.getLog(ProcessElementImpl.class.getName());
+
+ protected long dbid;
+ protected int dbversion;
+ protected ProcessDefinitionImpl processDefinition;
+ protected List<ExceptionHandlerImpl> exceptionHandlers;
+ protected WireProperties properties;
+
+ // exception handlers ///////////////////////////////////////////////////////
+
+ public ExceptionHandlerImpl createExceptionHandler() {
+ ExceptionHandlerImpl exceptionHandler = new ExceptionHandlerImpl();
+ addExceptionHandler(exceptionHandler);
+ return exceptionHandler;
+ }
+
+ public void addExceptionHandler(ExceptionHandlerImpl exceptionHandler) {
+ if (exceptionHandlers==null) {
+ exceptionHandlers = new ArrayList<ExceptionHandlerImpl>();
+ }
+ exceptionHandler.setProcessDefinition(processDefinition);
+ exceptionHandlers.add(exceptionHandler);
+ }
+
+ // properties ///////////////////////////////////////////////////////////////
+
+ public void addProperty(Descriptor descriptor) {
+ if (properties==null) {
+ properties = new WireProperties();
+ }
+ properties.add(descriptor);
+ }
+
+ public Object getProperty(String key) {
+ if (properties==null) {
+ return null;
+ }
+ return properties.get(key);
+ }
+
+ public Set<String> getPropertyKeys() {
+ if (properties==null) {
+ return Collections.EMPTY_SET;
+ }
+ return properties.keys();
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ /** the database id. */
+ public long getDbid() {
+ return dbid;
+ }
+ public ProcessDefinitionImpl getProcessDefinition() {
+ return processDefinition;
+ }
+ public void setProcessDefinition(ProcessDefinitionImpl processDefinition) {
+ this.processDefinition = processDefinition;
+ }
+ public WireProperties getProperties() {
+ return properties;
+ }
+ public void setProperties(WireProperties properties) {
+ this.properties = properties;
+ }
+ public List<ExceptionHandlerImpl> getExceptionHandlers() {
+ return exceptionHandlers;
+ }
+ public void setExceptionHandlers(List<ExceptionHandlerImpl> exceptionHandlers) {
+ this.exceptionHandlers = exceptionHandlers;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ProcessModificationsImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ProcessModificationsImpl.java
new file mode 100644
index 0000000..a43b576
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ProcessModificationsImpl.java
@@ -0,0 +1,125 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ProcessModificationsImpl implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+ protected int version;
+
+ // TODO: as an optimisation, boolean flag properties could be added
+ // as persistent memberfields to indicate if the collections are
+ // empty or not. That way, when a process modification object
+ // is consulted, before accessing any of the collections it can
+ // first check if the collections are empty, hence preventing a
+ // database query for the empty collections.
+
+ // Removed items just can be referenced in the process definition
+
+ // Adding is harder. Full information of added items cannot be stored
+ // in the process
+ // definition database part as those tables will be cached and
+ // marked with read-only. So the added items must be stored in
+ // the runtime (=execution) part of the database schema.
+ // That is why subclasses of the real process definition classes
+ // are created.
+
+ protected List<AddedAction> addedActions;
+ protected List<EventListenerReference> removedActions;
+ protected List<AddedTransition> addedTransitions;
+ protected List<TransitionImpl> removedTransitions;
+ protected List<AddedActivity> addedActivities;
+ protected List<ActivityImpl> removedActivities;
+
+ // TODO : convert to top level types
+
+ public static class AddedAction extends EventListenerReference {
+ private static final long serialVersionUID = 1L;
+ EventImpl event;
+ }
+
+ public static class AddedTransition extends TransitionImpl {
+ private static final long serialVersionUID = 1L;
+
+ }
+
+ public static class AddedActivity extends ActivityImpl {
+ private static final long serialVersionUID = 1L;
+ }
+
+ // next this class would implement methods to merge the
+ // modifications with the process definition information.
+
+ // the ExecutionImpl would have to do lookups in
+ // the process definition model conscientious through
+ // these merging methods
+
+ public TransitionImpl getOutgoingTransition(ActivityImpl activity, String transitionName) {
+ // first check if the requested transition is in the added transition list
+ if (addedTransitions!=null) {
+ for (AddedTransition addedTransition : addedTransitions) {
+ if ( activity.equals(addedTransition.getSource())
+ && addedTransition.getName()!=null
+ && addedTransition.getName().equals(transitionName)
+ ) {
+ return addedTransition;
+ }
+ }
+ }
+
+ // now, check if it is in the normal transition list in the process definition
+ TransitionImpl transition = activity.getOutgoingTransition(transitionName);
+
+ if ( (transition!=null) // if the transition exists
+ && (removedTransitions!=null) // and if there are removed transitions
+ && (removedTransitions.contains(transition)) // and if the transition found in the process definition is present in the removedTransitions collection
+ ) {
+ // then pretent it wasn't there :-)
+ return null;
+ }
+
+ return transition;
+ }
+
+ // furhermore, action, activity and transition creation methods
+ // will have to be exposed through the user interface classes.
+ // We have to make sure that the user is able to access and find
+ // all the input parameters for these creation methods from the
+ // org.jbpm.pvm classes, without ever needing org.jbpm.pvm.internal.model
+ // classes.
+ // for example:
+
+ public void addTransition(Activity source, String name, Activity destination) {
+ // TODO
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ScopeElementImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ScopeElementImpl.java
new file mode 100644
index 0000000..1451997
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ScopeElementImpl.java
@@ -0,0 +1,83 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ScopeElementImpl extends ObservableElementImpl {
+
+ private static final long serialVersionUID = 1L;
+
+ protected List<VariableDefinitionImpl> variableDefinitions = new ArrayList<VariableDefinitionImpl>();
+ protected Set<TimerDefinitionImpl> timerDefinitions = new HashSet<TimerDefinitionImpl>();
+
+ public boolean isLocalScope() {
+ return hasVariableDefinitions() || hasTimerDefinitions();
+ }
+
+ // variable definitions /////////////////////////////////////////////////////
+
+ public boolean hasVariableDefinitions() {
+ return !variableDefinitions.isEmpty();
+ }
+
+ public List<VariableDefinitionImpl> getVariableDefinitions() {
+ if (!hasVariableDefinitions()) {
+ return Collections.emptyList();
+ }
+ return variableDefinitions;
+ }
+
+ public VariableDefinitionImpl createVariableDefinition() {
+ VariableDefinitionImpl variableDefinition = new VariableDefinitionImpl();
+ variableDefinitions.add(variableDefinition);
+ return variableDefinition;
+ }
+
+ // timer definitions ////////////////////////////////////////////////////////
+
+ public boolean hasTimerDefinitions() {
+ return ( (timerDefinitions!=null)
+ && (!timerDefinitions.isEmpty())
+ );
+ }
+
+ public Set<TimerDefinitionImpl> getTimerDefinitions() {
+ if (!hasTimerDefinitions()) {
+ return Collections.emptySet();
+ }
+ return timerDefinitions;
+ }
+
+ public TimerDefinitionImpl createTimerDefinition() {
+ TimerDefinitionImpl timerDefinition = new TimerDefinitionImpl();
+ timerDefinitions.add(timerDefinition);
+ return timerDefinition;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ScopeInstanceImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ScopeInstanceImpl.java
new file mode 100644
index 0000000..dabf6c9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/ScopeInstanceImpl.java
@@ -0,0 +1,395 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.JbpmException;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.events.VariableCreate;
+import org.jbpm.pvm.internal.id.DbidGenerator;
+import org.jbpm.pvm.internal.job.TimerImpl;
+import org.jbpm.pvm.internal.task.TaskImpl;
+import org.jbpm.pvm.internal.type.Converter;
+import org.jbpm.pvm.internal.type.Type;
+import org.jbpm.pvm.internal.type.TypeSet;
+import org.jbpm.pvm.internal.type.Variable;
+import org.jbpm.pvm.internal.type.variable.NullVariable;
+import org.jbpm.pvm.internal.type.variable.UnpersistableVariable;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ScopeInstanceImpl implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ private static Log log = Log.getLog(ScopeInstanceImpl.class.getName());
+
+ protected long dbid;
+ protected int dbversion;
+
+ protected boolean hasVariables;
+ protected Map<String, Variable> variables = new HashMap<String, Variable>();
+
+ protected String state;
+ protected String suspendHistoryState;
+
+ // variables ////////////////////////////////////////////////////////////////
+
+ protected void initializeVariables(ScopeElementImpl scope, ExecutionImpl outerExecution) {
+ // loop over all variable definitions
+ List<VariableDefinitionImpl> variableDefinitions = scope.getVariableDefinitions();
+ if (!variableDefinitions.isEmpty()){
+ if (log.isTraceEnabled()) {
+ log.trace("initializing variables in scope "+scope);
+ }
+ for (VariableDefinitionImpl variableDefinition: variableDefinitions) {
+ String key = variableDefinition.getName();
+ Object value = variableDefinition.getInitValue(outerExecution);
+ String typeName = variableDefinition.getTypeName();
+ boolean isHistoryEnabled = variableDefinition.isHistoryEnabled();
+ createVariable(key, value, typeName, isHistoryEnabled);
+ }
+ }
+ }
+
+ public void createVariable(String key, Object value) {
+ createVariable(key, value, null, false);
+ }
+
+ public void createVariable(String key, Object value, String typeName, boolean isHistoryEnabled) {
+ Variable variable = createVariableObject(key, value, typeName, isHistoryEnabled);
+ variables.put(variable.getKey(), variable);
+ hasVariables = true;
+ }
+
+ protected Variable createVariableObject(String key, Object value, String typeName, boolean isHistoryEnabled) {
+ log.debug("create variable '"+key+"' in '"+this+"' with value '"+value+"'");
+
+ Type type = null;
+
+ if (type==null) {
+ TypeSet typeSet = EnvironmentImpl.getFromCurrent(TypeSet.class, false);
+ if (typeSet!=null) {
+ if (typeName!=null) {
+ type = typeSet.findTypeByName(typeName);
+ }
+ if (type==null) {
+ type = typeSet.findTypeByMatch(key, value);
+ }
+ }
+ }
+
+ Variable variable = null;
+
+ if (type!=null) {
+ Class<?> variableClass = type.getVariableClass();
+ try {
+ log.trace("creating new "+type+" variable "+key);
+ variable = (Variable) variableClass.newInstance();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't instantiate variable instance class '"+variableClass.getName()+"'");
+ }
+ Converter converter = type.getConverter();
+ variable.setConverter(converter);
+
+ } else {
+ if (value==null) {
+ log.trace("creating null variable for "+key);
+ variable = new NullVariable();
+ } else {
+ log.trace("creating new unpersistable variable for "+key);
+ variable = new UnpersistableVariable();
+ }
+ }
+
+ variable.setKey(key);
+ variable.setExecution(getExecution());
+ variable.setTask(getTask());
+ variable.setHistoryEnabled(isHistoryEnabled);
+
+ variable.setValue(value, this);
+
+ long dbid = DbidGenerator.getDbidGenerator().getNextId();
+ variable.setDbid(dbid);
+
+ if (isHistoryEnabled) {
+ HistoryEvent.fire(new VariableCreate(variable));
+ }
+
+
+ return variable;
+ }
+
+ public void setVariable(String key, Object value) {
+ if (key==null) {
+ throw new JbpmException("variableName is null");
+ }
+
+ Variable variable = getVariableObject(key);
+ // if there is already a variable instance and it doesn't support the current type...
+ if ( (variable!=null)
+ && (!variable.supports(value, this))
+ ) {
+ // delete the old variable instance
+ log.debug("variable type change. deleting '"+key+"' from '"+this+"'");
+ removeVariable(key);
+ variable = null;
+ }
+
+ if (variable!=null) {
+ log.debug("updating variable '"+key+"' in '"+this+"' to value '"+value+"'");
+ variable.setValue(value, this);
+
+ } else if (getParentVariableScope()==null) {
+ createVariable(key, value, null, false);
+
+ } else {
+ getParentVariableScope().setVariable(key,value);
+ }
+ }
+
+ public void setVariables(Map<String, ?> variables) {
+ if (variables!=null) {
+ for (Map.Entry<String, ?> entry : variables.entrySet()) {
+ setVariable(entry.getKey(), entry.getValue());
+ }
+ }
+ }
+
+ public Object getVariable(String key) {
+ Variable variable = getVariableObject(key);
+ if (variable!=null) {
+ return variable.getValue(this);
+ }
+
+ ScopeInstanceImpl parentScope = getParentVariableScope();
+ if (parentScope!=null) {
+ return parentScope.getVariable(key);
+ }
+
+ return null;
+ }
+
+ public Variable getVariableObject(String key) {
+ return (hasVariables ? (Variable) variables.get(key) : null);
+ }
+
+ public boolean hasVariable(String key) {
+ ScopeInstanceImpl parentScope = getParentVariableScope();
+ return ( (hasVariables && variables.containsKey(key))
+ || (parentScope!=null && parentScope.hasVariable(key))
+ );
+ }
+
+ public Set<String> getVariableKeys() {
+ Set<String> variableKeys = null;
+ ScopeInstanceImpl parentScope = getParentVariableScope();
+ if (parentScope!=null) {
+ variableKeys = parentScope.getVariableKeys();
+ } else {
+ variableKeys = new TreeSet<String>();
+ }
+ if (hasVariables) {
+ variableKeys.addAll(variables.keySet());
+ }
+ return variableKeys;
+ }
+
+ public Map<String, Object> getVariables() {
+ Map<String, Object> values = null;
+ ScopeInstanceImpl parentScope = getParentVariableScope();
+ if (parentScope!=null) {
+ values = parentScope.getVariables();
+ } else {
+ values = new TreeMap<String, Object>();
+ }
+ if (hasVariables) {
+ for (Map.Entry<String, Variable> entry: variables.entrySet()) {
+ String name = (String) entry.getKey();
+ Variable variable = entry.getValue();
+ Object value = variable.getValue(this);
+ values.put(name, value);
+ }
+ }
+ return values;
+ }
+
+ public boolean hasVariables() {
+ ScopeInstanceImpl parentScope = getParentVariableScope();
+ return ( hasVariables
+ || (parentScope!=null && parentScope.hasVariables())
+ );
+ }
+
+ public boolean removeVariable(String key) {
+ Variable variable = null;
+ if (hasVariables) {
+ variable = variables.remove(key);
+ if (variables.isEmpty()) {
+ hasVariables = false;
+ }
+ if (variable!=null) {
+ return true;
+ }
+ }
+ ScopeInstanceImpl parentScope = getParentVariableScope();
+ if (parentScope!=null) {
+ return parentScope.removeVariable(key);
+ }
+ // the actual value is not returned to prevent that an object
+ // has to be fetched from the db for it to be deleted
+ return false;
+ }
+
+ public void removeVariables() {
+ if (hasVariables) {
+ variables.clear();
+ }
+ hasVariables = false;
+ }
+
+ // timers ///////////////////////////////////////////////////////////////////
+
+ protected TimerImpl newTimer() {
+ return new TimerImpl();
+ }
+
+ public TimerImpl createTimer() {
+ return createTimer(null);
+ }
+
+ public TimerImpl createTimer(TimerDefinitionImpl timerDefinition) {
+ if (log.isDebugEnabled()) {
+ log.debug("creating timer on "+this.toString());
+ }
+
+ TimerImpl timer = newTimer();
+ timer.setExecution(getTimerExecution());
+
+ if (timerDefinition!=null) {
+ timer.setEventName(timerDefinition.getEventName());
+ timer.setSignalName(timerDefinition.getSignalName());
+ timer.setDuedate(timerDefinition.getDueDate());
+ timer.setDueDateDescription(timerDefinition.getDueDateDescription());
+ Boolean isExclusive = timerDefinition.isExclusive();
+ if (isExclusive!=null) {
+ timer.setExclusive(isExclusive);
+ }
+ Integer retries = timerDefinition.getRetries();
+ if (retries!=null) {
+ timer.setRetries(retries);
+ }
+ timer.setRepeat(timerDefinition.getRepeat());
+ }
+
+ return timer;
+ }
+
+ protected void initializeTimers(ScopeElementImpl scope) {
+ // initialize the timers
+ Set<TimerDefinitionImpl> timerDefinitions = scope.getTimerDefinitions();
+ if (!timerDefinitions.isEmpty()) {
+ for (TimerDefinitionImpl timerDefinition: timerDefinitions) {
+ TimerImpl timer = createTimer(timerDefinition);
+ timer.schedule();
+ }
+ }
+ }
+
+ protected void destroyTimers(CompositeElementImpl scope) {
+ }
+
+ // state ////////////////////////////////////////////////////////////////////
+
+ /** @see Execution#suspend() */
+ public void suspend() {
+ if (Execution.STATE_SUSPENDED.equals(state)) {
+ return;
+ }
+ suspendHistoryState = state;
+ state = Execution.STATE_SUSPENDED;
+ }
+
+ /** @see Execution#resume() */
+ public void resume() {
+ if (!Execution.STATE_SUSPENDED.equals(state)) {
+ return;
+ }
+ state = suspendHistoryState;
+ suspendHistoryState = null;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+
+
+ /** @see Execution#getState() */
+ public String getState() {
+ return state;
+ }
+
+ /** @see Execution#isActive() */
+ public boolean isActive() {
+ return Execution.STATE_ACTIVE_ROOT.equals(state)
+ || Execution.STATE_ACTIVE_CONCURRENT.equals(state);
+ }
+
+ public boolean isSuspended() {
+ return Execution.STATE_SUSPENDED.equals(state);
+ }
+
+ // customizable methods /////////////////////////////////////////////////////
+
+ public ExecutionImpl getExecution() {
+ return null;
+ }
+
+ public TaskImpl getTask() {
+ return null;
+ }
+
+ public ExecutionImpl getTimerExecution() {
+ return null;
+ }
+
+ public ScopeInstanceImpl getParentVariableScope() {
+ return null;
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public long getDbid() {
+ return dbid;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/TimerDefinitionImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/TimerDefinitionImpl.java
new file mode 100644
index 0000000..090312b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/TimerDefinitionImpl.java
@@ -0,0 +1,94 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * @author Tom Baeyens
+ * @author Pascal Verdage
+ */
+public class TimerDefinitionImpl implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+ protected int dbversion;
+ protected String dueDateDescription;
+ protected Date dueDate;
+ protected String repeat;
+ protected Boolean isExclusive;
+ protected Integer retries;
+ protected String eventName;
+ protected String signalName;
+
+ public TimerDefinitionImpl() {
+ }
+
+ public String getRepeat() {
+ return repeat;
+ }
+ public void setRepeat(String repeat) {
+ this.repeat = repeat;
+ }
+ public long getDbid() {
+ return dbid;
+ }
+ public String getDueDateDescription() {
+ return dueDateDescription;
+ }
+ public void setDueDateDescription(String dueDateDescription) {
+ this.dueDateDescription = dueDateDescription;
+ }
+ public Boolean isExclusive() {
+ return isExclusive;
+ }
+ public void setExclusive(Boolean isExclusive) {
+ this.isExclusive = isExclusive;
+ }
+ public Integer getRetries() {
+ return retries;
+ }
+ public void setRetries(Integer retries) {
+ this.retries = retries;
+ }
+ public String getSignalName() {
+ return signalName;
+ }
+ public void setSignalName(String signalName) {
+ this.signalName = signalName;
+ }
+ public String getEventName() {
+ return eventName;
+ }
+ public void setEventName(String eventName) {
+ this.eventName = eventName;
+ }
+ public Date getDueDate() {
+ return dueDate;
+ }
+ public void setDueDate(Date dueDate) {
+ this.dueDate = dueDate;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/Transition.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/Transition.java
new file mode 100644
index 0000000..e0d20bb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/Transition.java
@@ -0,0 +1,66 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+
+/**
+ * a transition in a {@link OpenProcessDefinition} graph.
+ *
+ * <h3 id="guardconditions">Guard conditions</h3>
+ * <p>TODO</p>
+ *
+ * <h3 id="transitionsaswaitstates">Transitions as wait states</h3>
+ * <p>A wait condition indicates wether a transition is to be taken synchronously
+ * or wether the transition will behave as a wait state.
+ * </p>
+ *
+ * <p>Transitions that are wait states can occur when an analyst has
+ * an actual state (e.g. 'making loss') and a desired state (e.g. 'making profit')
+ * and models a transition between those states. In that case the transition
+ * might take a long time and hence it results into a wait state for the system.
+ * </p>
+ *
+ * <p>If the wait condition is null or if it returns false, then the transition
+ * will be taking synchronously. Otherwise the transition will behave as
+ * a wait state and wait for a signal on the execution.
+ * </p>
+ *
+ * <p>Transitions as wait states has every thing to do with matching the
+ * process graph to transactions on the server. If the transition is taken
+ * in one (the current) transaction, then the async condition should be empty
+ * or evaluate to false. If the arrival of the execution in the destination
+ * activity should occur in a separate execution
+ *
+ * @author Tom Baeyens
+ */
+public interface Transition extends ObservableElement {
+
+ /** the activity from which this transition leaves. */
+ Activity getSource();
+
+ /** the activity in which this transition arrives. */
+ Activity getDestination();
+
+ /** the general purpose condition that can be used in various ways by the
+ * activities. */
+ Condition getCondition();
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/TransitionImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/TransitionImpl.java
new file mode 100644
index 0000000..32570f3
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/TransitionImpl.java
@@ -0,0 +1,135 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.util.List;
+
+import org.jbpm.api.model.Event;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class TransitionImpl extends ObservableElementImpl implements Transition {
+
+ private static final long serialVersionUID = 1L;
+
+ protected ActivityImpl source;
+ protected Integer sourceIndex;
+ protected ActivityImpl destination;
+ protected Condition condition;
+
+ /* Use one of the ActivityImpl.createOutgoingTransition methods instead. */
+ TransitionImpl() {
+ super();
+ }
+
+ public void makeDefault() {
+ source.setDefaultOutgoingTransition(this);
+ }
+
+ public String toString() {
+ String destinationName = (destination!=null ? destination.getName() : null);
+ String sourceName = (source!=null ? source.getName() : null);
+ return (sourceName!=null ? "("+sourceName+")--" : "--") +
+ (name!=null ? name+"-->" : ">") +
+ (destinationName!=null ? "("+destinationName+")" : "");
+ }
+
+ public EventImpl createEvent() {
+ EventImpl event = new EventImpl();
+ event.setName(Event.TAKE);
+ addEvent(event);
+ return event;
+ }
+
+ public EventImpl getEvent() {
+ return getEvent(Event.TAKE);
+ }
+
+ // get parent ///////////////////////////////////////////////////////////////
+
+ /** the first common parent between the source and the destination activity. The
+ * source and destination itself are included in the search except if
+ * source and destination are equal. In that case (self-transition), then
+ * it's the parent of the activity. */
+ public ObservableElementImpl getParent() {
+ // if one of the two ends is null
+ if ( (source==null)
+ || (destination==null)
+ ) {
+ // the process definition is returned
+ return processDefinition;
+ }
+ // if this is a self transition
+ if (source.equals(destination)) {
+ // the parent of the activity is returned
+ return source.getParent();
+ }
+ // if none of the above, we search for the first common element in the parent chains
+ List<ObservableElementImpl> sourceChain = source.getParentChain();
+ List<ObservableElementImpl> destinationChain = destination.getParentChain();
+ for (ObservableElementImpl sourceElement : sourceChain) {
+ for (ObservableElementImpl destinationElement : destinationChain) {
+ if (sourceElement.equals(destinationElement)) {
+ return sourceElement;
+ }
+ }
+ }
+ return null;
+ }
+
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public void setName(String name) {
+ this.name = name;
+ if (source!=null) {
+ source.clearOutgoingTransitionsMap();
+ }
+ }
+
+ public ActivityImpl getSource() {
+ return source;
+ }
+ public void setSource(ActivityImpl source) {
+ this.source = source;
+ }
+ public ActivityImpl getDestination() {
+ return destination;
+ }
+ public void setDestination(ActivityImpl destination) {
+ this.destination = destination;
+ }
+ public Integer getSourceIndex() {
+ return sourceIndex;
+ }
+ public void setSourceIndex(Integer sourceIndex) {
+ this.sourceIndex = sourceIndex;
+ }
+ public Condition getCondition() {
+ return condition;
+ }
+ public void setCondition(Condition condition) {
+ this.condition = condition;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/VariableDefinitionImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/VariableDefinitionImpl.java
new file mode 100644
index 0000000..0291cb5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/VariableDefinitionImpl.java
@@ -0,0 +1,99 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.io.Serializable;
+
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.script.ScriptManager;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/** a declaration of a variable.
+ *
+ * The source properties denote how the variable gets initialized upon creation.
+ *
+ * The destination properties indicate how information from the current scope
+ * gets propagated back into the outer scope.
+ *
+ * @author Tom Baeyens
+ */
+public class VariableDefinitionImpl implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String name;
+ protected String typeName;
+ protected boolean isHistoryEnabled;
+
+ protected String initExpression;
+ protected String initLanguage;
+ protected Descriptor initDescriptor;
+
+ public Object getInitValue(ExecutionImpl execution) {
+ if (initDescriptor!=null) {
+ return WireContext.create(initDescriptor);
+ }
+ if (initExpression!=null) {
+ ScriptManager scriptManager = EnvironmentImpl.getFromCurrent(ScriptManager.class);
+ return scriptManager.evaluateExpression(initExpression, initLanguage);
+ }
+ return null;
+ }
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getInitExpression() {
+ return initExpression;
+ }
+ public void setInitExpression(String initExpression) {
+ this.initExpression = initExpression;
+ }
+ public Descriptor getInitDescriptor() {
+ return initDescriptor;
+ }
+ public void setInitDescriptor(Descriptor inDescriptor) {
+ this.initDescriptor = inDescriptor;
+ }
+ public String getTypeName() {
+ return typeName;
+ }
+ public void setTypeName(String typeName) {
+ this.typeName = typeName;
+ }
+ public String getInitLanguage() {
+ return initLanguage;
+ }
+ public void setInitLanguage(String initLanguage) {
+ this.initLanguage = initLanguage;
+ }
+ public boolean isHistoryEnabled() {
+ return isHistoryEnabled;
+ }
+ public void setHistoryEnabled(boolean isHistoryEnabled) {
+ this.isHistoryEnabled = isHistoryEnabled;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/VariableOutDefinitionImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/VariableOutDefinitionImpl.java
new file mode 100644
index 0000000..3f2aa7c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/VariableOutDefinitionImpl.java
@@ -0,0 +1,56 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.io.Serializable;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class VariableOutDefinitionImpl implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String name;
+ protected String expression;
+ protected String language;
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getExpression() {
+ return expression;
+ }
+ public void setExpression(String expression) {
+ this.expression = expression;
+ }
+ public String getLanguage() {
+ return language;
+ }
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/VariableOutDefinitionSet.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/VariableOutDefinitionSet.java
new file mode 100644
index 0000000..2b2ef1c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/VariableOutDefinitionSet.java
@@ -0,0 +1,81 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.script.ScriptManager;
+
+/**
+ * @author Tom Baeyens
+ */
+public class VariableOutDefinitionSet implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected List<VariableOutDefinitionImpl> variableOutDefinitions;
+
+ public void processOutVariables(ExecutionImpl outerExecution, ScopeInstanceImpl innerScopeInstance) {
+ // loop over all variable definitions
+ if (hasVariableOutDefinitions()) {
+ for (VariableOutDefinitionImpl variableOutDefinition: variableOutDefinitions) {
+ String variableName = variableOutDefinition.getName();
+ if (variableName!=null) {
+ ScriptManager scriptManager = EnvironmentImpl.getFromCurrent(ScriptManager.class);
+
+ // TODO update evaluateExpression so that scopeInstance can be passed in directly
+ String expression = variableOutDefinition.getExpression();
+ String language = variableOutDefinition.getLanguage();
+
+ Object value = scriptManager.evaluateExpression(expression, language);
+ outerExecution.setVariable(variableName, value);
+ }
+ }
+ }
+ }
+
+ public boolean hasVariableOutDefinitions() {
+ return ( (variableOutDefinitions!=null)
+ && (!variableOutDefinitions.isEmpty())
+ );
+ }
+
+ public List<VariableOutDefinitionImpl> getVariableOutDefinitions() {
+ if (variableOutDefinitions==null) {
+ return Collections.EMPTY_LIST;
+ }
+ return variableOutDefinitions;
+ }
+
+ public VariableOutDefinitionImpl createVariableOutDefinition() {
+ VariableOutDefinitionImpl variableOutDefinition = new VariableOutDefinitionImpl();
+ if (variableOutDefinitions==null) {
+ variableOutDefinitions = new ArrayList<VariableOutDefinitionImpl>();
+ }
+ variableOutDefinitions.add(variableOutDefinition);
+ return variableOutDefinition;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/WireProperties.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/WireProperties.java
new file mode 100644
index 0000000..397bda2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/WireProperties.java
@@ -0,0 +1,73 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.Set;
+
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+
+/**
+ * @author Tom Baeyens
+ */
+public class WireProperties implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+ protected int dbversion;
+ protected WireContext wireContext;
+
+ public Object get(String key) {
+ if (wireContext==null) {
+ return null;
+ }
+ return wireContext.get(key);
+ }
+
+ public Set<String> keys() {
+ if (wireContext==null) {
+ return Collections.EMPTY_SET;
+ }
+ return wireContext.keys();
+ }
+
+ public void add(Descriptor descriptor) {
+ if (wireContext==null) {
+ wireContext = new WireContext(new WireDefinition());
+ }
+ wireContext.getWireDefinition().addDescriptor(descriptor);
+ }
+
+ public WireContext getWireContext() {
+ return wireContext;
+ }
+ public void setWireContext(WireContext wireContext) {
+ this.wireContext = wireContext;
+ }
+ public long getDbid() {
+ return dbid;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/AsyncContinuations.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/AsyncContinuations.java
new file mode 100644
index 0000000..8740069
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/AsyncContinuations.java
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model.op;
+
+import org.jbpm.api.Execution;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class AsyncContinuations {
+
+ public static void restoreState(ExecutionImpl execution) {
+ ExecutionImpl parent = execution.getParent();
+ if ( (parent!=null)
+ && (Execution.STATE_INACTIVE_CONCURRENT_ROOT.equals(parent.getState()))
+ ) {
+ execution.setState(Execution.STATE_ACTIVE_CONCURRENT);
+ } else {
+ execution.setState(Execution.STATE_ACTIVE_ROOT);
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/AtomicOperation.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/AtomicOperation.java
new file mode 100644
index 0000000..82f9669
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/AtomicOperation.java
@@ -0,0 +1,61 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model.op;
+
+import java.io.Serializable;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.job.MessageImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class AtomicOperation implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ public static final AtomicOperation EXECUTE_ACTIVITY = new ExecuteActivity();
+ public static final AtomicOperation PROPAGATE_TO_PARENT = new MoveToParentActivity();
+ public static final AtomicOperation TRANSITION_TAKE = new TransitionTake();
+ public static final AtomicOperation TRANSITION_START_ACTIVITY = new TransitionStartActivity();
+ public static final AtomicOperation EXECUTE_EVENT_LISTENER = new ExecuteEventListener();
+ public static final AtomicOperation TRANSITION_END_ACTIVITY = new TransitionEndActivity();
+
+ public abstract boolean isAsync(ExecutionImpl execution);
+ public abstract MessageImpl<?> createAsyncMessage(ExecutionImpl execution);
+ public abstract void perform(ExecutionImpl execution);
+
+ public static AtomicOperation parseAtomicOperation(String text) {
+ if (text==null) {
+ return null;
+ }
+
+ if (TRANSITION_END_ACTIVITY.toString().equals(text)) return TRANSITION_END_ACTIVITY;
+ if (EXECUTE_EVENT_LISTENER.toString().equals(text)) return EXECUTE_EVENT_LISTENER;
+ if (EXECUTE_ACTIVITY.toString().equals(text)) return EXECUTE_ACTIVITY;
+ if (TRANSITION_TAKE.toString().equals(text)) return TRANSITION_TAKE;
+ if (TRANSITION_START_ACTIVITY.toString().equals(text)) return TRANSITION_START_ACTIVITY;
+ if (PROPAGATE_TO_PARENT.toString().equals(text)) return PROPAGATE_TO_PARENT;
+
+ throw new JbpmException("invalid atomic operation text: "+text);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/ExecuteActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/ExecuteActivity.java
new file mode 100644
index 0000000..6e96b08
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/ExecuteActivity.java
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model.op;
+
+import org.jbpm.api.activity.ActivityBehaviour;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.job.MessageImpl;
+import org.jbpm.pvm.internal.model.Continuation;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl.Propagation;
+import org.jbpm.pvm.internal.util.Clock;
+
+public class ExecuteActivity extends AtomicOperation {
+
+ private static final long serialVersionUID = 1L;
+
+ private static Log log = Log.getLog(ExecuteActivity.class.getName());
+
+ public boolean isAsync(ExecutionImpl execution) {
+ return execution.getActivity().isAsync();
+ }
+
+ public void perform(ExecutionImpl execution) {
+ ActivityImpl activity = execution.getActivity();
+
+ if (log.isDebugEnabled()) {
+ if (execution.getName()!=null) {
+ log.debug(execution.toString()+" executes "+activity);
+ } else {
+ log.debug("executing "+activity);
+ }
+ }
+
+ ActivityBehaviour activityBehaviour = activity.getActivityBehaviour();
+
+ try {
+ execution.setPropagation(Propagation.UNSPECIFIED);
+ execution.setHistoryActivityStart(Clock.getCurrentTime());
+
+ activityBehaviour.execute(execution);
+
+ } catch (Exception e) {
+ execution.handleException(activity, null, null, e, execution.toString()+" couldn't execute "+activityBehaviour+" for activity "+activity);
+ }
+
+ if (execution.getPropagation()==Propagation.UNSPECIFIED) {
+ execution.proceed();
+ }
+ }
+
+ public String toString() {
+ return "ExecuteActivity";
+ }
+
+ public MessageImpl<?> createAsyncMessage(ExecutionImpl execution) {
+ ExecuteActivityMessage executeActivityMessage = new ExecuteActivityMessage(execution);
+ if (execution.getActivity().getContinuation()==Continuation.EXCLUSIVE) {
+ executeActivityMessage.setExclusive(true);
+ }
+ return executeActivityMessage;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/ExecuteActivityMessage.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/ExecuteActivityMessage.java
new file mode 100644
index 0000000..9b4425f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/ExecuteActivityMessage.java
@@ -0,0 +1,58 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model.op;
+
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.job.MessageImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ExecuteActivityMessage extends MessageImpl<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ public ExecuteActivityMessage() {
+ }
+
+ public ExecuteActivityMessage(ExecutionImpl execution) {
+ super(execution);
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ AsyncContinuations.restoreState(execution);
+
+ execution.performAtomicOperationSync(AtomicOperation.EXECUTE_ACTIVITY);
+
+ DbSession dbSession = environment.get(DbSession.class);
+ dbSession.delete(this);
+
+ return null;
+ }
+
+ public String toString() {
+ return "ExecuteActivityMessage["+dbid+"]";
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/ExecuteEventListener.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/ExecuteEventListener.java
new file mode 100644
index 0000000..b786ec8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/ExecuteEventListener.java
@@ -0,0 +1,136 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model.op;
+
+import java.util.List;
+
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.job.MessageImpl;
+import org.jbpm.pvm.internal.model.EventImpl;
+import org.jbpm.pvm.internal.model.EventListenerReference;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ObservableElement;
+import org.jbpm.pvm.internal.model.ObservableElementImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ExecuteEventListener extends AtomicOperation {
+
+ private static final long serialVersionUID = 1L;
+
+ private static Log log = Log.getLog(ExecuteEventListener.class.getName());
+
+ public boolean isAsync(ExecutionImpl execution) {
+ int eventListenerIndex = execution.getEventListenerIndex();
+ EventImpl event = execution.getEvent();
+
+ if ( (eventListenerIndex==0)
+ && (event.isAsync())
+ ) {
+ return true;
+ }
+
+ List<EventListenerReference> eventListenerReferences = event.getListenerReferences();
+ if ( (eventListenerReferences==null)
+ || (eventListenerReferences.isEmpty())
+ ) {
+ return false;
+ }
+
+ EventListenerReference eventListenerReference = eventListenerReferences.get(eventListenerIndex);
+ return eventListenerReference.isAsync();
+ }
+
+ public void perform(ExecutionImpl execution) {
+ EventImpl event = execution.getEvent();
+ ObservableElementImpl observableElement = event.getObservableElement();
+ int eventListenerIndex = execution.getEventListenerIndex();
+ List<EventListenerReference> eventListenerReferences = event.getListenerReferences();
+ if ( (eventListenerReferences!=null)
+ && (!eventListenerReferences.isEmpty())
+ ) {
+ EventListenerReference eventListenerReference = eventListenerReferences.get(eventListenerIndex);
+ ObservableElement eventSource = execution.getEventSource();
+ if ((eventSource == observableElement) || (eventListenerReference.isPropagationEnabled())) {
+ EventListener eventListener = eventListenerReference.getEventListener();
+ log.trace("executing " + eventListener + " for " + event);
+ try {
+ // TODO can/should this invocation be unified with the exception handler invocation of the event notification method?
+ eventListener.notify(execution);
+ } catch (Exception e) {
+ log.trace("exception during action: " + e);
+ execution.handleException((ObservableElementImpl) observableElement, event, eventListenerReference, e, "couldn't run action " + eventListener);
+ }
+ }
+ // increment the event listener index
+ eventListenerIndex++;
+ execution.setEventListenerIndex(eventListenerIndex);
+ }
+
+ // if there are more listeners in this event
+ if ( (eventListenerReferences!=null)
+ && (eventListenerIndex < eventListenerReferences.size())
+ ) {
+ // execute the next listener
+ execution.performAtomicOperation(AtomicOperation.EXECUTE_EVENT_LISTENER);
+
+ } else {
+ // there are no more listeners in this event
+
+ ObservableElementImpl parent = observableElement.getParent();
+ // find the next event with listeners
+ EventImpl propagatedEvent = ExecutionImpl.findEvent(parent, event.getName());
+
+ // if there is an propagated event with listeners
+ if (propagatedEvent != null) {
+ // propagate to the that event
+ execution.setEvent(propagatedEvent);
+ execution.setEventListenerIndex(0);
+ execution.performAtomicOperation(AtomicOperation.EXECUTE_EVENT_LISTENER);
+
+ } else {
+ // event is completed, perform the eventCompletedOperation
+ AtomicOperation eventCompletedOperation = execution.getEventCompletedOperation();
+
+ execution.setEvent(null);
+ execution.setEventSource(null);
+ execution.setEventListenerIndex(0);
+ execution.setEventCompletedOperation(null);
+
+ if (eventCompletedOperation != null) {
+ execution.performAtomicOperation(eventCompletedOperation);
+ }
+ }
+ }
+ }
+
+ public MessageImpl< ? > createAsyncMessage(ExecutionImpl execution) {
+ return new ExecuteEventListenerMessage(execution);
+ }
+
+ public String toString() {
+ return "ExecuteEventListener";
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/ExecuteEventListenerMessage.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/ExecuteEventListenerMessage.java
new file mode 100644
index 0000000..ac78cd2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/ExecuteEventListenerMessage.java
@@ -0,0 +1,161 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model.op;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.job.MessageImpl;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.EventImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ObservableElementImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.model.TransitionImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ExecuteEventListenerMessage extends MessageImpl<Object> {
+
+ private static final String KEY_EVENT_COMPLETED_OPERATION = "ECO";
+ private static final String KEY_EVENT_LISTENER_INDEX = "ELI";
+ private static final String KEY_EVENT_NAME = "EN";
+ private static final String KEY_EVENT_OBSERVABLE_PARENT_LEVEL = "EOPL";
+ private static final String KEY_TRANSITION_SOURCE_INDEX = "TSI";
+ private static final String KEY_TRANSITION_SOURCE = "TS";
+ private static final String KEY_EVENT_SOURCE_TRANSITION = "EST";
+ private static final String KEY_EVENT_SOURCE_ACTIVITY = "ESA";
+ private static final String KEY_EVENT_SOURCE_PROCESS_DEFINITION = "ESPD";
+ private static final String KEY_STATE = "S";
+
+ private static final long serialVersionUID = 1L;
+
+ public ExecuteEventListenerMessage() {
+ }
+
+ public ExecuteEventListenerMessage(ExecutionImpl execution) {
+ super(execution);
+
+ Map<String, Object> asyncExecutionInfo = new HashMap<String, Object>();
+
+ TransitionImpl transition = execution.getTransition();
+ if (transition!=null) {
+ ActivityImpl source = transition.getSource();
+ asyncExecutionInfo.put(KEY_TRANSITION_SOURCE, source.getName());
+ asyncExecutionInfo.put(KEY_TRANSITION_SOURCE_INDEX, source.getOutgoingTransitions().indexOf(transition));
+ }
+
+ asyncExecutionInfo.put(KEY_STATE, execution.getState());
+
+ ObservableElementImpl eventSource = (ObservableElementImpl) execution.getEventSource();
+ if (eventSource instanceof ProcessDefinitionImpl) {
+ asyncExecutionInfo.put(KEY_EVENT_SOURCE_PROCESS_DEFINITION, null);
+
+ } else if (eventSource instanceof ActivityImpl) {
+ asyncExecutionInfo.put(KEY_EVENT_SOURCE_ACTIVITY, eventSource.getName());
+
+ } else if (eventSource instanceof TransitionImpl) {
+ asyncExecutionInfo.put(KEY_EVENT_SOURCE_TRANSITION, null);
+ }
+
+ EventImpl event = execution.getEvent();
+ asyncExecutionInfo.put(KEY_EVENT_OBSERVABLE_PARENT_LEVEL, getEventObservableParentLevel(eventSource, event.getObservableElement()));
+ asyncExecutionInfo.put(KEY_EVENT_NAME, event.getName());
+
+ asyncExecutionInfo.put(KEY_EVENT_LISTENER_INDEX, execution.getEventListenerIndex());
+
+ AtomicOperation eventCompletedOperation = execution.getEventCompletedOperation();
+ String eventCompletedOperationText = null;
+ if (eventCompletedOperation!=null) {
+ eventCompletedOperationText = eventCompletedOperation.toString();
+ }
+ asyncExecutionInfo.put(KEY_EVENT_COMPLETED_OPERATION, eventCompletedOperationText);
+
+ setConfiguration(asyncExecutionInfo);
+ }
+
+ public Integer getEventObservableParentLevel(ObservableElementImpl eventSource, ObservableElementImpl observableElement) {
+ int parentLevel = 0;
+ while (eventSource!=observableElement) {
+ parentLevel++;
+ eventSource = eventSource.getParent();
+ }
+ return parentLevel;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ Map<String, Object> asyncExecutionInfo = (Map) getConfiguration();
+
+ String transitionSourceName = (String) asyncExecutionInfo.get(KEY_TRANSITION_SOURCE);
+ TransitionImpl transition = null;
+ if (transitionSourceName!=null) {
+ ProcessDefinitionImpl processDefinition = execution.getProcessDefinition();
+ ActivityImpl transitionSource = processDefinition.findActivity(transitionSourceName);
+ Integer transitionIndex = (Integer) asyncExecutionInfo.get(KEY_TRANSITION_SOURCE_INDEX);
+ transition = (TransitionImpl) transitionSource.getOutgoingTransitions().get(transitionIndex);
+ execution.setTransition(transition);
+ }
+
+ if (asyncExecutionInfo.containsKey(KEY_EVENT_SOURCE_PROCESS_DEFINITION)){
+ ProcessDefinitionImpl processDefinition = execution.getProcessDefinition();
+ execution.setEventSource(processDefinition);
+
+ } else if (asyncExecutionInfo.containsKey(KEY_EVENT_SOURCE_ACTIVITY)){
+ ProcessDefinitionImpl processDefinition = execution.getProcessDefinition();
+ String activityName = (String) asyncExecutionInfo.get(KEY_EVENT_SOURCE_ACTIVITY);
+ ActivityImpl activity = processDefinition.findActivity(activityName);
+ execution.setEventSource(activity);
+
+ } else if (asyncExecutionInfo.containsKey(KEY_EVENT_SOURCE_TRANSITION)){
+ execution.setEventSource(transition);
+ }
+
+ ObservableElementImpl observableElement = (ObservableElementImpl) execution.getEventSource();
+ int parentLevel = (Integer) asyncExecutionInfo.get(KEY_EVENT_OBSERVABLE_PARENT_LEVEL);
+ for (int i=0; i<parentLevel; parentLevel++) {
+ observableElement = observableElement.getParent();
+ }
+
+ String eventName = (String) asyncExecutionInfo.get(KEY_EVENT_NAME);
+ EventImpl event = observableElement.getEvent(eventName);
+ execution.setEvent(event);
+
+ Integer eventListenerIndex = (Integer) asyncExecutionInfo.get(KEY_EVENT_LISTENER_INDEX);
+ execution.setEventListenerIndex(eventListenerIndex);
+
+ String eventCompletedOperationText = (String) asyncExecutionInfo.get(KEY_EVENT_COMPLETED_OPERATION);
+ AtomicOperation eventCompletedOperation = AtomicOperation.parseAtomicOperation(eventCompletedOperationText);
+ execution.setEventCompletedOperation(eventCompletedOperation);
+
+ execution.setState((String) asyncExecutionInfo.get(KEY_STATE));
+
+ execution.performAtomicOperationSync(AtomicOperation.EXECUTE_EVENT_LISTENER);
+
+ DbSession dbSession = environment.get(DbSession.class);
+ dbSession.delete(this);
+
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/MoveToChildActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/MoveToChildActivity.java
new file mode 100644
index 0000000..ea2e07d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/MoveToChildActivity.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model.op;
+
+import org.jbpm.pvm.internal.job.MessageImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class MoveToChildActivity extends AtomicOperation {
+
+ private static final long serialVersionUID = 1L;
+
+ ActivityImpl activity;
+
+ public MoveToChildActivity(ActivityImpl activity) {
+ this.activity = activity;
+ }
+
+ public void perform(ExecutionImpl execution) {
+ execution.setActivity(activity);
+ ExecutionImpl propagatingExecution = execution.startActivity(activity);
+ propagatingExecution.performAtomicOperation(AtomicOperation.EXECUTE_ACTIVITY);
+ }
+
+ public boolean isAsync(ExecutionImpl execution) {
+ return false;
+ }
+
+ public MessageImpl<?> createAsyncMessage(ExecutionImpl execution) {
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/MoveToParentActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/MoveToParentActivity.java
new file mode 100644
index 0000000..758316b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/MoveToParentActivity.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model.op;
+
+import org.jbpm.pvm.internal.job.MessageImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class MoveToParentActivity extends AtomicOperation {
+
+ private static final long serialVersionUID = 1L;
+
+ public void perform(ExecutionImpl execution) {
+ ActivityImpl activity = execution.getActivity();
+ ActivityImpl parentActivity = activity.getParentActivity();
+ ExecutionImpl propagatingExecution = execution.endActivity(activity);
+
+ propagatingExecution.setActivity(parentActivity);
+ propagatingExecution.performAtomicOperation(new Signal(null, null));
+ }
+
+ public MessageImpl<?> createAsyncMessage(ExecutionImpl execution) {
+ return null;
+ }
+
+ public boolean isAsync(ExecutionImpl execution) {
+ return false;
+ }
+
+ public String toString() {
+ return "MoveToParentActivity";
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/Signal.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/Signal.java
new file mode 100644
index 0000000..280395c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/Signal.java
@@ -0,0 +1,89 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model.op;
+
+import java.util.Map;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.activity.ExternalActivityBehaviour;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.job.MessageImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl.Propagation;
+
+/**
+ * @author Tom Baeyens
+ */
+public class Signal extends AtomicOperation {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Log log = Log.getLog(Signal.class.getName());
+
+ String signalName;
+ Map<String, ?> parameters;
+
+ public Signal(String signalName, Map<String, ?> parameters) {
+ this.signalName = signalName;
+ this.parameters = parameters;
+ }
+
+ public boolean isAsync(ExecutionImpl execution) {
+ return false;
+ }
+
+ public void perform(ExecutionImpl execution) {
+ ActivityImpl activity = execution.getActivity();
+
+ if (execution.getName()!=null) {
+ log.debug(execution.toString()+" signals "+activity);
+ } else {
+ log.debug("signalling "+activity+", signalName="+signalName);
+ }
+
+ ExternalActivityBehaviour externalActivityBehaviour = (ExternalActivityBehaviour) activity.getActivityBehaviour();
+
+ try {
+ execution.setPropagation(Propagation.UNSPECIFIED);
+ externalActivityBehaviour.signal(execution, signalName, parameters);
+
+ } catch (RuntimeException e) {
+ throw e;
+
+ } catch (Exception e) {
+ throw new JbpmException("couldn't signal "+activity+": "+e.getMessage(), e);
+ }
+
+ if (execution.getPropagation() == Propagation.UNSPECIFIED) {
+ execution.proceed();
+ }
+ }
+
+ public String toString() {
+ return "Signal";
+ }
+
+ public MessageImpl<?> createAsyncMessage(ExecutionImpl execution) {
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/SignalMessage.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/SignalMessage.java
new file mode 100644
index 0000000..0778cd5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/SignalMessage.java
@@ -0,0 +1,66 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model.op;
+
+import java.util.Map;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.job.MessageImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+/**
+ * @author Tom Baeyens
+ */
+public class SignalMessage extends MessageImpl<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ String signalName;
+ Map<String, ?> parameters;
+
+ public SignalMessage() {
+ }
+
+ public SignalMessage(ExecutionImpl execution, String signalName, Map<String, ?> parameters) {
+ super(execution);
+ this.signalName = signalName;
+ this.parameters = parameters;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ execution.setState(Execution.STATE_ACTIVE_ROOT);
+
+ Signal signal = new Signal(signalName, parameters);
+ execution.performAtomicOperationSync(signal);
+
+ DbSession dbSession = environment.get(DbSession.class);
+ dbSession.delete(this);
+
+ return null;
+ }
+
+ public String toString() {
+ return "SignalMessage["+dbid+"]";
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/TransitionEndActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/TransitionEndActivity.java
new file mode 100644
index 0000000..8822eb7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/TransitionEndActivity.java
@@ -0,0 +1,69 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model.op;
+
+import org.jbpm.api.model.Event;
+import org.jbpm.pvm.internal.job.MessageImpl;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ObservableElementImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class TransitionEndActivity extends AtomicOperation {
+
+ private static final long serialVersionUID = 1L;
+
+ public boolean isAsync(ExecutionImpl execution) {
+ return false;
+ }
+
+ public void perform(ExecutionImpl execution) {
+ ActivityImpl activity = execution.getActivity();
+
+ ExecutionImpl propagatingExecution = execution;
+ if (activity.isLocalScope()) {
+ propagatingExecution = execution.destroyScope(activity);
+ }
+
+ ActivityImpl parentActivity = activity.getParentActivity();
+ ActivityImpl destination = execution.getTransition().getDestination();
+ if ( (parentActivity!=null)
+ && (!parentActivity.contains(destination))
+ ) {
+ propagatingExecution.setActivity(parentActivity);
+ propagatingExecution.fire(Event.END, parentActivity, AtomicOperation.TRANSITION_END_ACTIVITY);
+ } else {
+ propagatingExecution.performAtomicOperation(AtomicOperation.TRANSITION_TAKE);
+ }
+ }
+
+ public MessageImpl< ? > createAsyncMessage(ExecutionImpl execution) {
+ throw new UnsupportedOperationException("please implement me");
+ }
+
+ public String toString() {
+ return "TransitionEndActivity";
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/TransitionStartActivity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/TransitionStartActivity.java
new file mode 100644
index 0000000..a3998db
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/TransitionStartActivity.java
@@ -0,0 +1,96 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model.op;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.model.Event;
+import org.jbpm.pvm.internal.job.MessageImpl;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.TransitionImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class TransitionStartActivity extends AtomicOperation {
+
+ private static final long serialVersionUID = 1L;
+
+ public boolean isAsync(ExecutionImpl execution) {
+ return false;
+ }
+
+ public void perform(ExecutionImpl execution) {
+ TransitionImpl transition = execution.getTransition();
+ ActivityImpl source = transition.getSource();
+ ActivityImpl destination = transition.getDestination();
+
+ ActivityImpl activity = execution.getActivity();
+ if (activity==null) {
+ // find outer most activity to start
+ activity = destination;
+ while ( (activity.getParentActivity()!=null)
+ && (!activity.getParentActivity().contains(source))
+ ) {
+ activity = activity.getParentActivity();
+ }
+
+ } else if (activity==destination){
+ activity = null;
+
+ } else {
+ ActivityImpl parent = activity;
+ activity = destination;
+ while ( (activity!=null)
+ && (activity.getParent()!=parent)
+ ) {
+ activity = activity.getParentActivity();
+ }
+ if (activity==null) {
+ throw new JbpmException("implementation bug: couldn't find parent "+parent+" around destination "+destination);
+ }
+ }
+
+ if (activity==null) {
+ execution.setTransition(null);
+ execution.performAtomicOperation(AtomicOperation.EXECUTE_ACTIVITY);
+
+ } else {
+ execution.setActivity(activity);
+
+ ExecutionImpl propagatingExecution = execution;
+ if (activity.isLocalScope()) {
+ propagatingExecution = execution.createScope(activity);
+ }
+
+ propagatingExecution.fire(Event.START, activity, AtomicOperation.TRANSITION_START_ACTIVITY);
+ }
+ }
+
+ public MessageImpl<?> createAsyncMessage(ExecutionImpl execution) {
+ throw new UnsupportedOperationException("please implement me");
+ }
+
+ public String toString() {
+ return "TransitionStartActivity";
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/TransitionStartActivityMessage.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/TransitionStartActivityMessage.java
new file mode 100644
index 0000000..5cbed4f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/TransitionStartActivityMessage.java
@@ -0,0 +1,57 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model.op;
+
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.job.MessageImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+
+/**
+ * @author Tom Baeyens
+ */
+public class TransitionStartActivityMessage extends MessageImpl<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ public TransitionStartActivityMessage() {
+ }
+
+ public TransitionStartActivityMessage(ExecutionImpl execution) {
+ super(execution);
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ AsyncContinuations.restoreState(execution);
+
+ execution.performAtomicOperationSync(AtomicOperation.TRANSITION_START_ACTIVITY);
+
+ DbSession dbSession = environment.get(DbSession.class);
+ dbSession.delete(this);
+
+ return null;
+ }
+
+ public String toString() {
+ return "ProceedToDestinationMessage["+dbid+"]";
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/TransitionTake.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/TransitionTake.java
new file mode 100644
index 0000000..516f4be
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/TransitionTake.java
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.model.op;
+
+import org.jbpm.api.model.Event;
+import org.jbpm.pvm.internal.job.MessageImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.TransitionImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class TransitionTake extends AtomicOperation {
+
+ private static final long serialVersionUID = 1L;
+
+ public boolean isAsync(ExecutionImpl execution) {
+ return false;
+ }
+
+ public void perform(ExecutionImpl execution) {
+ TransitionImpl transition = execution.getTransition();
+ execution.setActivity(null);
+ execution.fire(Event.TAKE, transition, AtomicOperation.TRANSITION_START_ACTIVITY);
+ }
+
+ public MessageImpl< ? > createAsyncMessage(ExecutionImpl execution) {
+ return null;
+ }
+
+ public String toString() {
+ return "TransitionTake";
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/package.html
new file mode 100644
index 0000000..42ab145
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/op/package.html
@@ -0,0 +1,2 @@
+<body>atomic operations and asynchronous continuation messages
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/package.html
new file mode 100644
index 0000000..e1122b2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/model/package.html
@@ -0,0 +1,20 @@
+<body>
+default implementation of process execution in {@link org.jbpm.pvm.internal.model.ExecutionImpl}
+based on {@link org.jbpm.pvm.internal.model.AtomicOperation}s
+
+<h3>Bidirectional relations</h3>
+<p>In this process model thoughout the pvm codebase, there are several bidirectional
+relations. By convention, the bidirectional relations are maintained on the many side.
+This means that when you call for example {@link org.jbpm.pvm.internal.model.ProcessDefinitionImpl#addActivity(org.jbpm.pvm.internal.model.ActivityImpl)}, that
+method will also update the inverse pointer by invoking the
+{@link org.jbpm.pvm.internal.model.ActivityImpl#setProcessDefinition(org.jbpm.pvm.internal.model.ProcessDefinitionImpl)} setter. Setter methods will be plain setter
+methods and they will NOT update the inverse reference. (that would cause
+an infinite loop).
+</p>
+
+<p>In the same spirit, there is the convention that the many side of bidirection
+relations provide factory methods for the related objects. Those factory methods
+will also establish the bidirectional relation. E.g. {@link org.jbpm.pvm.internal.model.ProcessDefinitionImpl#createActivity(String)}.
+</p>
+
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/processengine/ProcessEngineImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/processengine/ProcessEngineImpl.java
new file mode 100644
index 0000000..ffabcba
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/processengine/ProcessEngineImpl.java
@@ -0,0 +1,310 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.processengine;
+
+import java.io.Serializable;
+import java.sql.Connection;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.jbpm.api.ExecutionService;
+import org.jbpm.api.HistoryService;
+import org.jbpm.api.IdentityService;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.ManagementService;
+import org.jbpm.api.ProcessEngine;
+import org.jbpm.api.RepositoryService;
+import org.jbpm.api.TaskService;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.cfg.ConfigurationImpl;
+import org.jbpm.pvm.internal.cmd.CheckDbCmd;
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.env.Context;
+import org.jbpm.pvm.internal.env.EnvironmentFactory;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.env.PvmEnvironment;
+import org.jbpm.pvm.internal.env.UserProvidedEnvironmentObject;
+import org.jbpm.pvm.internal.jobexecutor.JobExecutor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+
+/**
+ * an environment factory that also is the process-engine context.
+ *
+ * <p>
+ * This environment factory will produce environments with 2 contexts: the
+ * process-engine context and the block context.
+ * </p>
+ *
+ * <p>
+ * An process-engine context is build from two wire definitions: the
+ * process-engine wire definition and the environment wire definition.
+ * </p>
+ *
+ * <p>
+ * The process-engine context itself is build from the process-engine
+ * wire definition. So all objects that are created in this context remain
+ * cached for the lifetime of this process-engine context object.
+ * </p>
+ *
+ * <p>
+ * This process-engine context is also a environment factory. The produced
+ * environments contain 2 contexts: the process-engine context itself and a
+ * new environment context, build from the environment wire definition. For each
+ * created environment, a new environment context will be created from the same
+ * environment wire definition. Objects in the environment context will live for
+ * as long as the environment.
+ * </p>
+ *
+ * @author Tom Baeyens
+ */
+public class ProcessEngineImpl implements Context, ProcessEngine, EnvironmentFactory, Serializable {
+
+ private static final long serialVersionUID = 1L;
+ private static final Log log = Log.getLog(ProcessEngineImpl.class.getName());
+
+ public static final String JBPM_LIBRARY_VERSION = "4.3";
+
+ transient protected WireContext processEngineWireContext;
+ transient protected WireDefinition transactionWireDefinition;
+
+ transient protected ThreadLocal<List<UserProvidedEnvironmentObject>> userProvidedEnvironmentObjectsThreadLocal = new ThreadLocal<List<UserProvidedEnvironmentObject>>();
+ transient protected ThreadLocal<String> authenticatedUserIdThreadLocal = new ThreadLocal<String>();
+
+ transient protected CommandService userCommandService = null;
+
+ public ProcessEngineImpl() {
+ }
+
+ public ProcessEngineImpl(ConfigurationImpl configuration) {
+ initializeProcessEngine(configuration);
+ checkDb(configuration);
+ }
+
+ protected void initializeProcessEngine(ConfigurationImpl configuration) {
+ configuration.setProducedProcessEngine(this);
+ this.processEngineWireContext = configuration.getProcessEngineWireContext();
+ this.transactionWireDefinition = configuration.getTransactionWireDefinition();
+
+ if (log.isTraceEnabled()) {
+ log.trace("created ProcessEngine "+System.identityHashCode(this));
+ if ( (processEngineWireContext!=null)
+ && (processEngineWireContext.getWireDefinition()!=null)
+ && (processEngineWireContext.getWireDefinition().getDescriptorTypes()!=null)
+ ) {
+ log.trace(" process-engine-context "+System.identityHashCode(processEngineWireContext));
+ for (Class<?> descriptorType: processEngineWireContext.getWireDefinition().getDescriptorTypes()) {
+ log.trace(" "+descriptorType.getName());
+ }
+ }
+ if ( (transactionWireDefinition!=null)
+ && (transactionWireDefinition.getDescriptorTypes()!=null)
+ ) {
+ log.trace(" transaction-context:");
+ for (Class<?> descriptorType: transactionWireDefinition.getDescriptorTypes()) {
+ log.trace(" "+descriptorType.getName());
+ }
+ }
+ }
+
+ processEngineWireContext.create();
+ userCommandService = (CommandService) processEngineWireContext.get(CommandService.NAME_TX_REQUIRED_COMMAND_SERVICE);
+
+ String jndiName = configuration.getJndiName();
+ if (jndiName!=null) {
+ try {
+ log.debug("publishing jBPM ProcessEngine in jndi at "+jndiName);
+ InitialContext initialContext = new InitialContext();
+ initialContext.bind(jndiName, this);
+ } catch (NamingException e) {
+ throw new JbpmException("JNDI binding problem", e);
+ }
+ }
+
+ }
+
+ protected void checkDb(ConfigurationImpl configuration) {
+ if (configuration.isCheckDb()) {
+ userCommandService.execute(new CheckDbCmd());
+ }
+ }
+
+ public ExecutionService getExecutionService() {
+ return get(ExecutionService.class);
+ }
+ public HistoryService getHistoryService() {
+ return get(HistoryService.class);
+ }
+ public ManagementService getManagementService() {
+ return get(ManagementService.class);
+ }
+ public TaskService getTaskService() {
+ return get(TaskService.class);
+ }
+ public IdentityService getIdentityService() {
+ return get(IdentityService.class);
+ }
+ public RepositoryService getRepositoryService() {
+ return get(RepositoryService.class);
+ }
+
+ public EnvironmentImpl openEnvironment() {
+ PvmEnvironment environment = new PvmEnvironment(this);
+
+ if (log.isTraceEnabled()) log.trace("opening " + environment);
+
+ installAuthenticatedUserId(environment);
+ installProcessEngineContext(environment);
+ installTransactionContext(environment);
+
+ return environment;
+ }
+
+ protected void installAuthenticatedUserId(EnvironmentImpl environment) {
+ String authenticatedUserId = authenticatedUserIdThreadLocal.get();
+ if (authenticatedUserId!=null) {
+ environment.setAuthenticatedUserId(authenticatedUserId);
+ authenticatedUserIdThreadLocal.set(null);
+ }
+ }
+
+ protected void installTransactionContext(PvmEnvironment environment) {
+ WireContext transactionContext = new WireContext(transactionWireDefinition, Context.CONTEXTNAME_TRANSACTION, true);
+ // add the environment block context to the environment
+ environment.setContext(transactionContext);
+
+ EnvironmentImpl.pushEnvironment(environment);
+ try {
+ // finish the creation of the environment wire context
+ transactionContext.create();
+
+ } catch (RuntimeException e) {
+ EnvironmentImpl.popEnvironment();
+ throw e;
+ }
+ }
+
+ protected void installProcessEngineContext(PvmEnvironment environment) {
+ // add the process-engine context
+ environment.setContext(processEngineWireContext);
+ }
+
+ public void close() {
+ JobExecutor jobExecutor = get(JobExecutor.class);
+ if (jobExecutor!=null) {
+ // stop the job executor and wait till all job executor threads have stopped.
+ jobExecutor.stop(true);
+ }
+ processEngineWireContext.fire(WireContext.EVENT_CLOSE, null);
+ }
+
+ // process-engine context delegation methods
+ // ///////////////////////////////////
+
+ public Object get(String key) {
+ return processEngineWireContext.get(key);
+ }
+
+ public <T> T get(Class<T> type) {
+ return processEngineWireContext.get(type);
+ }
+
+ public String getName() {
+ return processEngineWireContext.getName();
+ }
+
+ public boolean has(String key) {
+ return processEngineWireContext.has(key);
+ }
+
+ public Set<String> keys() {
+ return processEngineWireContext.keys();
+ }
+
+ public Object set(String key, Object value) {
+ return processEngineWireContext.set(key, value);
+ }
+
+ public void addProcessEngineWireDefinition(WireDefinition wireDefinition) {
+ processEngineWireContext.getWireDefinition().addWireDefinition(wireDefinition);
+ }
+
+ public void addTransactionWireDefinition(WireDefinition wireDefinition) {
+ transactionWireDefinition.addWireDefinition(wireDefinition);
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public void setTransactionWireDefinition(WireDefinition transactionWireDefinition) {
+ this.transactionWireDefinition = transactionWireDefinition;
+ }
+ public WireContext getProcessEngineWireContext() {
+ return processEngineWireContext;
+ }
+ public void setProcessEngineWireContext(WireContext processEngineWireContext) {
+ this.processEngineWireContext = processEngineWireContext;
+ }
+ public WireDefinition getTransactionWireDefinition() {
+ return transactionWireDefinition;
+ }
+
+ public ProcessEngine setAuthenticatedUserId(String authenticatedUserId) {
+ authenticatedUserIdThreadLocal.set(authenticatedUserId);
+ return this;
+ }
+
+ public ProcessEngine setHibernateSession(Object hibernateSession) {
+ addUserProvidedEnvironmentObject(new UserProvidedEnvironmentObject(hibernateSession, null, true));
+ return this;
+ }
+
+ public ProcessEngine setJdbcConnection(Connection jdbcConnection) {
+ addUserProvidedEnvironmentObject(new UserProvidedEnvironmentObject(jdbcConnection, null, true));
+ return this;
+ }
+
+ protected synchronized void addUserProvidedEnvironmentObject(UserProvidedEnvironmentObject userProvidedEnvironmentObject) {
+ List<UserProvidedEnvironmentObject> environmentObjects = userProvidedEnvironmentObjectsThreadLocal.get();
+ if (environmentObjects==null) {
+ environmentObjects = new ArrayList<UserProvidedEnvironmentObject>();
+ userProvidedEnvironmentObjectsThreadLocal.set(environmentObjects);
+ }
+ environmentObjects.add(userProvidedEnvironmentObject);
+ }
+
+ public <T> T execute(Command<T> command) {
+ return userCommandService.execute(command);
+ }
+
+ // left in for legacy test code
+ public static EnvironmentFactory parseXmlString(String jbpmConfigurationXml) {
+ return (EnvironmentFactory) new ConfigurationImpl()
+ .setXmlString(jbpmConfigurationXml)
+ .skipDbCheck()
+ .buildProcessEngine();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/AbstractQuery.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/AbstractQuery.java
new file mode 100644
index 0000000..2ab27ca
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/AbstractQuery.java
@@ -0,0 +1,180 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.query;
+
+import java.io.ObjectStreamException;
+import java.sql.SQLException;
+import java.util.List;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class AbstractQuery implements Command<Object> {
+
+ private static Log log = Log.getLog(AbstractQuery.class.getName());
+
+ private static final long serialVersionUID = 1L;
+
+ protected CommandService commandService;
+ protected String orderByClause = null;
+ protected Page page = null;
+ protected boolean isWhereAdded = false;
+ protected boolean count = false;
+
+ protected abstract void applyParameters(Query query);
+
+ public abstract String hql();
+
+ /* reuse by copy and paste:
+ * (return type can't be changed)
+ public ConcreteQuery page(int firstResult, int maxResults) {
+ this.page = new Page(firstResult, maxResults);
+ return this;
+ }
+ */
+
+ public List untypedList() {
+ if (commandService!=null) {
+ return (List) commandService.execute(this);
+ }
+ Session session = EnvironmentImpl.getFromCurrent(Session.class);
+ return (List) execute(session);
+ }
+
+ protected Object untypedUniqueResult() {
+ List list = untypedList();
+ if (list.isEmpty()) {
+ return null;
+ }
+ if (list.size()>1) {
+ throw new JbpmException("result not unique: "+list.size());
+ }
+ return list.get(0);
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ Session session = environment.get(Session.class);
+ return execute(session);
+ }
+
+ public Object execute(Session session) {
+ String hql = hql();
+ try {
+ Query query = session.createQuery(hql);
+ applyParameters(query);
+ applyPage(query);
+ return query.list();
+ } catch (HibernateException e) {
+ Throwable t = e;
+ while (t!=null) {
+ if (t instanceof SQLException) {
+ SQLException sqlException = (SQLException) t;
+ SQLException nextException = sqlException.getNextException();
+ if (nextException!=null) {
+ log.error("cause of "+nextException+": ", e);
+ }
+ }
+ t = t.getCause();
+ }
+ throw e;
+ } finally {
+ resetQuery(); // reset the query member fields so the query can be reused.
+ }
+ }
+
+ /**
+ * Returns the count of the query.
+ * Query types that want to use this count method should
+ * - add the operation signature to their interface
+ * - use the 'count' variable in their hql() method.
+ */
+ public long count() {
+ count = true;
+
+ // Page and count cannot be used together, because paging is applied after the query is formed
+ if (page != null) {
+ throw new JbpmException("page(firstResult, maxResult) and count() cannot be used together");
+ }
+
+ return (Long) untypedUniqueResult();
+ }
+
+ /**
+ * Resets the query so it can be reused after an invocation.
+ */
+ private void resetQuery() {
+ isWhereAdded = false;
+ count = false;
+ }
+
+ protected void appendWhereClause(String whereClause, StringBuilder hql) {
+ if (isWhereAdded) {
+ hql.append(" and ");
+ } else {
+ isWhereAdded = true;
+ hql.append("where ");
+ }
+ hql.append(whereClause);
+ }
+
+ protected void appendOrderByClause(StringBuilder hql) {
+ if (orderByClause!=null) {
+ hql.append("order by ");
+ hql.append(orderByClause);
+ }
+ }
+
+ protected void applyPage(Query query) {
+ if (page!=null) {
+ query.setFirstResult(page.firstResult);
+ query.setMaxResults(page.maxResults);
+ }
+ }
+
+ protected void addOrderByClause(String clause) {
+ if (orderByClause==null) {
+ orderByClause = clause;
+ } else {
+ orderByClause += ", " + clause;
+ }
+ }
+
+ protected Object writeReplace() throws ObjectStreamException {
+ this.commandService = null;
+ return this;
+ }
+
+ public void setCommandService(CommandService commandService) {
+ this.commandService = commandService;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/AvgDurationPerActivityQueryCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/AvgDurationPerActivityQueryCmd.java
new file mode 100644
index 0000000..43fc468
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/AvgDurationPerActivityQueryCmd.java
@@ -0,0 +1,76 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.query;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.history.model.HistoryActivityInstanceImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class AvgDurationPerActivityQueryCmd implements Command<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String processDefinitionId;
+
+ public AvgDurationPerActivityQueryCmd(String processDefinitionId) {
+ this.processDefinitionId = processDefinitionId;
+ }
+
+ public Object execute(Environment environment) throws Exception {
+ Session session = environment.get(Session.class);
+
+ Query query = session.createQuery(
+ "select distinct hai.activityName " +
+ "from "+HistoryActivityInstanceImpl.class.getName()+" as hai " +
+ "where hai.historyProcessInstance.processDefinitionId = :processDefinitionId"
+ );
+ query.setString("processDefinitionId", processDefinitionId);
+
+ Map<String, Long> avgDuration = new HashMap<String, Long>();
+
+ List<String> activityNames = query.list();
+ for (String activityName: activityNames) {
+ query = session.createQuery(
+ "select avg(hai.duration) " +
+ "from "+HistoryActivityInstanceImpl.class.getName()+" as hai " +
+ "where hai.historyProcessInstance.processDefinitionId = :processDefinitionId " +
+ " and hai.activityName = :activityName"
+ );
+ query.setString("processDefinitionId", processDefinitionId);
+ query.setString("activityName", activityName);
+
+ Number number = (Number) query.uniqueResult();
+ avgDuration.put(activityName, new Long(number.longValue()));
+ }
+
+ return avgDuration;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/ChoiceDistributionQueryCmd.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/ChoiceDistributionQueryCmd.java
new file mode 100644
index 0000000..d0904a6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/ChoiceDistributionQueryCmd.java
@@ -0,0 +1,76 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.query;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.pvm.internal.history.model.HistoryActivityInstanceImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ChoiceDistributionQueryCmd implements Command<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String processDefinitionId;
+ protected String activityName;
+
+ public ChoiceDistributionQueryCmd(String processDefinitionId, String activityName) {
+ this.processDefinitionId = processDefinitionId;
+ this.activityName = activityName;
+ }
+
+ public Object execute(Environment environment) {
+ Session session = environment.get(Session.class);
+
+ Query query = session.createQuery(
+ "select hai.transitionName, count(hai) " +
+ "from "+HistoryActivityInstanceImpl.class.getName()+" as hai " +
+ "where hai.historyProcessInstance.processDefinitionId = :processDefinitionId " +
+ " and hai.activityName = :activityName " +
+ "group by hai.transitionName "
+ );
+ query.setString("processDefinitionId", processDefinitionId);
+ query.setString("activityName", activityName);
+
+ List<Object[]> transitionCounts = query.list();
+
+ Map<String, Integer> choiceDistributionCounts = new HashMap<String, Integer>();
+
+ for (Object[] pair: transitionCounts) {
+ String transitionName = (String) pair[0];
+ Number number = (Number) pair[1];
+
+ choiceDistributionCounts.put(transitionName, new Integer(number.intValue()));
+ }
+
+ return choiceDistributionCounts;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/DeploymentQueryImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/DeploymentQueryImpl.java
new file mode 100644
index 0000000..cee2f67
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/DeploymentQueryImpl.java
@@ -0,0 +1,111 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.query;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.jbpm.api.Deployment;
+import org.jbpm.api.DeploymentQuery;
+import org.jbpm.pvm.internal.repository.DeploymentImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DeploymentQueryImpl extends AbstractQuery implements DeploymentQuery {
+
+ protected String deploymentId = null;
+ protected Boolean suspended = null;
+
+ public String hql() {
+ StringBuilder hql = new StringBuilder();
+
+ hql.append("select ");
+ if (count) {
+ hql.append("count(d) ");
+ } else {
+ hql.append("d ");
+ }
+
+ hql.append("from ");
+ hql.append(DeploymentImpl.class.getName());
+ hql.append(" as d ");
+
+ if (deploymentId!=null) {
+ appendWhereClause("d.dbid = "+deploymentId+" ", hql);
+ }
+
+ if (suspended!=null) {
+ if (suspended) {
+ appendWhereClause(" d.state = '"+Deployment.STATE_SUSPENDED+"' ", hql);
+ } else {
+ appendWhereClause(" d.state != '"+Deployment.STATE_SUSPENDED+"' ", hql);
+ }
+ }
+
+ appendOrderByClause(hql);
+
+ return hql.toString();
+ }
+
+ protected void applyParameters(Query query) {
+ }
+
+ public DeploymentQuery deploymentId(String deploymentId) {
+ this.deploymentId = deploymentId;
+ return this;
+ }
+
+ public DeploymentQuery notSuspended() {
+ suspended = false;
+ return this;
+ }
+
+ public DeploymentQuery suspended() {
+ suspended = true;
+ return this;
+ }
+
+ public DeploymentQuery orderAsc(String property) {
+ addOrderByClause("d."+property+" asc");
+ return this;
+ }
+
+ public DeploymentQuery orderDesc(String property) {
+ addOrderByClause("d."+property+" desc");
+ return this;
+ }
+
+ public DeploymentQuery page(int firstResult, int maxResults) {
+ this.page = new Page(firstResult, maxResults);
+ return this;
+ }
+
+ public List<Deployment> list() {
+ return untypedList();
+ }
+
+ public Deployment uniqueResult() {
+ return (Deployment) untypedUniqueResult();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/HistoryActivityInstanceQueryImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/HistoryActivityInstanceQueryImpl.java
new file mode 100644
index 0000000..5940203
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/HistoryActivityInstanceQueryImpl.java
@@ -0,0 +1,174 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.query;
+
+import java.util.Date;
+import java.util.List;
+
+import org.hibernate.Query;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.history.HistoryActivityInstance;
+import org.jbpm.api.history.HistoryActivityInstanceQuery;
+import org.jbpm.pvm.internal.history.model.HistoryActivityInstanceImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryActivityInstanceQueryImpl extends AbstractQuery implements HistoryActivityInstanceQuery {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String processDefinitionId;
+ protected Long tookLessThen;
+ protected Long tookLongerThen;
+ protected Date startedBefore;
+ protected Date startedAfter;
+ protected String executionId;
+ protected String activityName;
+
+ public String hql() {
+ StringBuilder hql = new StringBuilder();
+
+ hql.append("select ");
+ if (count) {
+ hql.append("count(hai) ");
+ } else {
+ hql.append("hai ");
+ }
+
+ hql.append("from ");
+ hql.append(HistoryActivityInstanceImpl.class.getName());
+ hql.append(" as hai ");
+
+ if (processDefinitionId!=null) {
+ appendWhereClause(" hai.historyProcessInstance.processDefinitionId = '"+processDefinitionId+"' ", hql);
+ }
+
+ if (tookLessThen!=null) {
+ appendWhereClause(" hai.duration < :tookLessThen ", hql);
+ }
+
+ if (tookLongerThen!=null) {
+ appendWhereClause(" hai.duration > :tookLongerThen ", hql);
+ }
+
+ if (startedBefore!=null) {
+ appendWhereClause(" hai.startTime < :startedBefore ", hql);
+ }
+
+ if (startedAfter!=null) {
+ appendWhereClause(" hai.startTime > :startedAfter ", hql);
+ }
+
+ if (executionId!=null) {
+ appendWhereClause(" hai.executionId = '"+executionId+"'", hql);
+ }
+
+ if (activityName!=null) {
+ appendWhereClause(" hai.activityName = '"+activityName+"'", hql);
+ }
+
+ appendOrderByClause(hql);
+
+ return hql.toString();
+ }
+
+ protected void applyParameters(Query query) {
+ if (tookLessThen!=null) {
+ query.setLong("tookLessThen", tookLessThen);
+ }
+
+ if (tookLongerThen!=null) {
+ query.setLong("tookLongerThen", tookLongerThen);
+ }
+
+ if (startedBefore!=null) {
+ query.setTimestamp("startedBefore", startedBefore);
+ }
+
+ if (startedAfter!=null) {
+ query.setTimestamp("startedAfter", startedAfter);
+ }
+ }
+
+ public List<HistoryActivityInstance> list() {
+ return (List) untypedList();
+ }
+
+ public HistoryActivityInstance uniqueResult() {
+ return (HistoryActivityInstance)untypedUniqueResult();
+ }
+
+ public HistoryActivityInstanceQuery activityName(String activityName) {
+ this.activityName = activityName;
+ return this;
+ }
+
+ public HistoryActivityInstanceQuery executionId(String executionId) {
+ this.executionId = executionId;
+ return this;
+ }
+
+ public HistoryActivityInstanceQuery orderAsc(String property) {
+ addOrderByClause("hai."+property+" asc");
+ return this;
+ }
+
+ public HistoryActivityInstanceQuery orderDesc(String property) {
+ addOrderByClause("hai."+property+" desc");
+ return this;
+ }
+
+ public HistoryActivityInstanceQuery page(int firstResult, int maxResults) {
+ this.page = new Page(firstResult, maxResults);
+ return this;
+ }
+
+ public HistoryActivityInstanceQuery processDefinitionId(String processDefinitionId) {
+ if (processDefinitionId==null) {
+ throw new JbpmException("processInstanceId is null");
+ }
+ this.processDefinitionId = processDefinitionId;
+ return this;
+ }
+
+ public HistoryActivityInstanceQuery startedAfter(Date time) {
+ this.startedAfter = time;
+ return this;
+ }
+
+ public HistoryActivityInstanceQuery startedBefore(Date time) {
+ this.startedBefore = time;
+ return this;
+ }
+
+ public HistoryActivityInstanceQuery tookLessThen(long durationInMillis) {
+ this.tookLessThen = durationInMillis;
+ return this;
+ }
+
+ public HistoryActivityInstanceQuery tookLongerThen(long durationInMillis) {
+ this.tookLongerThen = durationInMillis;
+ return this;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/HistoryDetailQueryImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/HistoryDetailQueryImpl.java
new file mode 100644
index 0000000..f6f699a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/HistoryDetailQueryImpl.java
@@ -0,0 +1,142 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.query;
+
+import java.util.Date;
+import java.util.List;
+
+import org.hibernate.Query;
+import org.jbpm.api.history.HistoryDetail;
+import org.jbpm.api.history.HistoryDetailQuery;
+import org.jbpm.pvm.internal.history.model.HistoryCommentImpl;
+import org.jbpm.pvm.internal.history.model.HistoryDetailImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryDetailQueryImpl extends AbstractQuery implements HistoryDetailQuery {
+
+ protected Class<?> type = HistoryDetailImpl.class;
+
+ protected Date timeBefore;
+ protected Date timeAfter;
+
+ protected String processInstanceId;
+ protected String activityInstanceId;
+ protected String taskId;
+
+ public String hql() {
+ StringBuilder hql = new StringBuilder();
+ hql.append("select hd ");
+ hql.append("from ");
+ hql.append(type.getName());
+ hql.append(" as hd ");
+
+ if (taskId!=null) {
+ appendWhereClause(" hd.historyTask.dbid = "+taskId+" ", hql);
+ }
+
+ if (processInstanceId!=null) {
+ appendWhereClause(" hd.historyProcessInstance.processInstanceId = '"+processInstanceId+"' ", hql);
+ }
+
+ if (activityInstanceId!=null) {
+ appendWhereClause(" hd.historyActivityInstance.dbid = "+activityInstanceId+" ", hql);
+ }
+
+ if (timeBefore!=null) {
+ appendWhereClause(" hd.time < :timeBefore ", hql);
+ }
+
+ if (timeAfter!=null) {
+ appendWhereClause(" hd.time > :timeAfter ", hql);
+ }
+
+ appendOrderByClause(hql);
+
+ return hql.toString();
+ }
+
+ protected void applyParameters(Query query) {
+ if (timeAfter!=null) {
+ query.setTime("timeAfter", timeAfter);
+ }
+
+ if (timeBefore!=null) {
+ query.setTime("timeBefore", timeBefore);
+ }
+ }
+
+ public List<HistoryDetail> list() {
+ return (List) untypedList();
+ }
+
+ public HistoryDetail uniqueResult() {
+ return (HistoryDetail) untypedUniqueResult();
+ }
+
+ public HistoryDetailQuery taskId(String taskId) {
+ this.taskId = taskId;
+ return this;
+ }
+
+ public HistoryDetailQuery orderAsc(String property) {
+ addOrderByClause("hd."+property+" asc");
+ return this;
+ }
+
+ public HistoryDetailQuery orderDesc(String property) {
+ addOrderByClause("hd."+property+" desc");
+ return this;
+ }
+
+ public HistoryDetailQuery page(int firstResult, int maxResults) {
+ this.page = new Page(firstResult, maxResults);
+ return this;
+ }
+
+ public HistoryDetailQuery activityInstanceId(String activityInstanceId) {
+ this.activityInstanceId = activityInstanceId;
+ return this;
+ }
+
+ public HistoryDetailQuery processInstanceId(String processInstanceId) {
+ this.processInstanceId = processInstanceId;
+ return this;
+ }
+
+ public HistoryDetailQuery comments() {
+ type = HistoryCommentImpl.class;
+ return this;
+ }
+
+ public HistoryDetailQuery timeAfter(Date timeAfter) {
+ this.timeAfter = timeAfter;
+ return this;
+ }
+
+ public HistoryDetailQuery timeBefore(Date timeBefore) {
+ this.timeBefore = timeBefore;
+ return this;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/HistoryProcessInstanceQueryImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/HistoryProcessInstanceQueryImpl.java
new file mode 100644
index 0000000..9b995ea
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/HistoryProcessInstanceQueryImpl.java
@@ -0,0 +1,123 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.query;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.jbpm.api.history.HistoryProcessInstance;
+import org.jbpm.api.history.HistoryProcessInstanceQuery;
+import org.jbpm.pvm.internal.history.model.HistoryProcessInstanceImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryProcessInstanceQueryImpl extends AbstractQuery implements HistoryProcessInstanceQuery {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String processDefinitionId;
+ protected String state;
+ protected String processInstanceId;
+ protected String processInstanceKey;
+
+ public String hql() {
+ StringBuilder hql = new StringBuilder();
+
+ hql.append("select ");
+ if (count) {
+ hql.append("count(hpi) ");
+ } else {
+ hql.append("hpi ");
+ }
+
+ hql.append("from ");
+ hql.append(HistoryProcessInstanceImpl.class.getName());
+ hql.append(" as hpi ");
+
+ if (processInstanceId!=null) {
+ appendWhereClause(" hpi.processInstanceId = '"+processInstanceId+"' ", hql);
+ }
+
+ if (processDefinitionId!=null) {
+ appendWhereClause(" hpi.processDefinitionId = '"+processDefinitionId+"' ", hql);
+ }
+
+ if (state!=null) {
+ appendWhereClause(" hpi.state = '"+state+"' ", hql);
+ }
+
+ if (processInstanceKey!=null) {
+ appendWhereClause(" hpi.key = '" + processInstanceKey + "'", hql);
+ }
+
+ appendOrderByClause(hql);
+
+ return hql.toString();
+ }
+
+ protected void applyParameters(Query query) {
+ }
+
+ public List<HistoryProcessInstance> list() {
+ return (List) untypedList();
+ }
+
+ public HistoryProcessInstance uniqueResult() {
+ return (HistoryProcessInstance)untypedUniqueResult();
+ }
+
+ public HistoryProcessInstanceQuery processInstanceId(String processInstanceId) {
+ this.processInstanceId = processInstanceId;
+ return this;
+ }
+
+ public HistoryProcessInstanceQuery orderAsc(String property) {
+ addOrderByClause("hpi."+property+" asc");
+ return this;
+ }
+
+ public HistoryProcessInstanceQuery orderDesc(String property) {
+ addOrderByClause("hpi."+property+" desc");
+ return this;
+ }
+
+ public HistoryProcessInstanceQuery page(int firstResult, int maxResults) {
+ this.page = new Page(firstResult, maxResults);
+ return this;
+ }
+
+ public HistoryProcessInstanceQuery processDefinitionId(String processDefinitionId) {
+ this.processDefinitionId = processDefinitionId;
+ return this;
+ }
+
+ public HistoryProcessInstanceQuery processInstanceKey(String processInstanceKey) {
+ this.processInstanceKey = processInstanceKey;
+ return this;
+ }
+
+ public HistoryProcessInstanceQuery state(String state) {
+ this.state = state;
+ return this;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/HistoryTaskQueryImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/HistoryTaskQueryImpl.java
new file mode 100644
index 0000000..5edcfba
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/HistoryTaskQueryImpl.java
@@ -0,0 +1,189 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.query;
+
+import java.util.Date;
+import java.util.List;
+
+import org.hibernate.Query;
+import org.jbpm.api.history.HistoryTask;
+import org.jbpm.api.history.HistoryTaskQuery;
+import org.jbpm.pvm.internal.history.model.HistoryTaskImpl;
+import org.jbpm.pvm.internal.util.Clock;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryTaskQueryImpl extends AbstractQuery implements HistoryTaskQuery {
+
+ protected String taskId;
+ protected String executionId;
+ protected String assignee;
+ protected String state;
+ protected String outcome;
+ protected Long tookLessThen;
+ protected Long tookLongerThen;
+ protected Date startedBefore;
+ protected Date startedAfter;
+
+ public String hql() {
+ StringBuilder hql = new StringBuilder();
+
+ hql.append("select ");
+ if (count) {
+ hql.append("count(ht) ");
+ } else {
+ hql.append("ht ");
+ }
+
+ hql.append("from ");
+ hql.append(HistoryTaskImpl.class.getName());
+ hql.append(" as ht ");
+
+ if (taskId!=null) {
+ appendWhereClause(" ht.dbid = "+taskId+" ", hql);
+ }
+
+ if (executionId!=null) {
+ appendWhereClause(" ht.executionId = '"+executionId+"' ", hql);
+ }
+
+ if (assignee!=null) {
+ appendWhereClause(" ht.assignee = '"+assignee+"' ", hql);
+ }
+
+ if (state!=null) {
+ appendWhereClause(" ht.state = '"+state+"' ", hql);
+ }
+
+ if (outcome!=null) {
+ appendWhereClause(" ht.outcome = '"+outcome+"' ", hql);
+ }
+
+ if (tookLessThen!=null) {
+ appendWhereClause(" ht.duration < :tookLessThen ", hql);
+ }
+
+ if (tookLongerThen!=null) {
+ appendWhereClause(" ht.duration > :tookLongerThen ", hql);
+ }
+
+ if (startedBefore!=null) {
+ appendWhereClause(" ht.createTime < :startedBefore ", hql);
+ }
+
+ if (startedAfter!=null) {
+ appendWhereClause(" ht.createTime > :startedAfter ", hql);
+ }
+
+ appendOrderByClause(hql);
+
+ return hql.toString();
+ }
+
+ protected void applyParameters(Query query) {
+ if (tookLessThen!=null) {
+ query.setLong("tookLessThen", tookLessThen);
+ }
+
+ if (tookLongerThen!=null) {
+ query.setLong("tookLongerThen", tookLongerThen);
+ }
+
+ if (startedBefore!=null) {
+ query.setTimestamp("startedBefore", startedBefore);
+ }
+
+ if (startedAfter!=null) {
+ query.setTimestamp("startedAfter", startedAfter);
+ }
+ }
+
+ public List<HistoryTask> list() {
+ return (List) untypedList();
+ }
+
+ public HistoryTask uniqueResult() {
+ return (HistoryTask) untypedUniqueResult();
+ }
+
+ public HistoryTaskQuery taskId(String taskId) {
+ this.taskId = taskId;
+ return this;
+ }
+
+ public HistoryTaskQuery executionId(String executionId) {
+ this.executionId = executionId;
+ return this;
+ }
+
+ public HistoryTaskQuery assignee(String assignee) {
+ this.assignee = assignee;
+ return this;
+ }
+
+ public HistoryTaskQuery state(String state) {
+ this.state = state;
+ return this;
+ }
+
+ public HistoryTaskQuery outcome(String outcome) {
+ this.outcome = outcome;
+ return this;
+ }
+
+ public HistoryTaskQuery orderAsc(String property) {
+ addOrderByClause("ht."+property+" asc");
+ return this;
+ }
+
+ public HistoryTaskQuery orderDesc(String property) {
+ addOrderByClause("ht."+property+" desc");
+ return this;
+ }
+
+ public HistoryTaskQuery page(int firstResult, int maxResults) {
+ this.page = new Page(firstResult, maxResults);
+ return this;
+ }
+
+ public HistoryTaskQuery startedAfter(Date time) {
+ this.startedAfter = time;
+ return this;
+ }
+
+ public HistoryTaskQuery startedBefore(Date time) {
+ this.startedBefore = time;
+ return this;
+ }
+
+ public HistoryTaskQuery tookLessThen(long durationInMillis) {
+ this.tookLessThen = durationInMillis;
+ return this;
+ }
+
+ public HistoryTaskQuery tookLongerThen(long durationInMillis) {
+ this.tookLongerThen = durationInMillis;
+ return this;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/JobQueryImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/JobQueryImpl.java
new file mode 100644
index 0000000..a4ace95
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/JobQueryImpl.java
@@ -0,0 +1,128 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.query;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.jbpm.api.JobQuery;
+import org.jbpm.api.job.Job;
+import org.jbpm.pvm.internal.job.JobImpl;
+import org.jbpm.pvm.internal.job.MessageImpl;
+import org.jbpm.pvm.internal.job.TimerImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class JobQueryImpl extends AbstractQuery implements JobQuery {
+
+ private static final long serialVersionUID = 1L;
+
+ protected boolean messagesOnly = false;
+ protected boolean timersOnly = false;
+ protected String processInstanceId = null;
+ protected Boolean exception;
+
+ public String hql() {
+ StringBuilder hql = new StringBuilder();
+
+ hql.append("select ");
+ if (count) {
+ hql.append("count(j) ");
+ } else {
+ hql.append("j ");
+ }
+
+ hql.append("from ");
+ if (messagesOnly) {
+ hql.append(MessageImpl.class.getName());
+ } else if (timersOnly) {
+ hql.append(TimerImpl.class.getName());
+ } else {
+ hql.append(JobImpl.class.getName());
+ }
+ hql.append(" j ");
+
+ if (processInstanceId!=null) {
+ appendWhereClause("j.processInstance.id = '"+processInstanceId+"' ", hql);
+ }
+
+ if (exception!=null) {
+ if (exception) {
+ appendWhereClause("j.exception is not null ", hql);
+ } else {
+ appendWhereClause("j.exception is null ", hql);
+ }
+ }
+
+ appendOrderByClause(hql);
+
+ return hql.toString();
+ }
+
+ protected void applyParameters(Query query) {
+ }
+
+ public List<Job> list() {
+ return (List<Job>) untypedList();
+ }
+
+ public Job uniqueResult() {
+ return (Job)untypedUniqueResult();
+ }
+
+ public JobQuery messages() {
+ this.messagesOnly = true;
+ return this;
+ }
+
+ public JobQuery timers() {
+ this.timersOnly = true;
+ return this;
+ }
+
+ public JobQuery exception(boolean hasException) {
+ this.exception = hasException;
+ return this;
+ }
+
+ public JobQuery orderAsc(String property) {
+ addOrderByClause("j."+property+" asc");
+ return this;
+ }
+
+ public JobQuery orderDesc(String property) {
+ addOrderByClause("j."+property+" desc");
+ return this;
+ }
+
+ public JobQuery page(int firstResult, int maxResults) {
+ this.page = new Page(firstResult, maxResults);
+ return this;
+ }
+
+ public JobQuery processInstanceId(String processInstanceId) {
+ this.processInstanceId = processInstanceId;
+ return this;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/Page.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/Page.java
new file mode 100644
index 0000000..b3078e5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/Page.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.query;
+
+import java.io.Serializable;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class Page implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ public int firstResult;
+ public int maxResults;
+
+ public Page(int firstResult, int maxResults) {
+ this.firstResult = firstResult;
+ this.maxResults = maxResults;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/ProcessDefinitionQueryImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/ProcessDefinitionQueryImpl.java
new file mode 100644
index 0000000..128da6e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/ProcessDefinitionQueryImpl.java
@@ -0,0 +1,202 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.query;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.jbpm.api.Deployment;
+import org.jbpm.api.ProcessDefinition;
+import org.jbpm.api.ProcessDefinitionQuery;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.repository.DeploymentImpl;
+import org.jbpm.pvm.internal.repository.DeploymentProperty;
+import org.jbpm.pvm.internal.session.RepositorySession;
+
+
+/** returns partially initialized ProcessDefinitionImpl's that can only be exposed
+ * as {@link ProcessDefinition}.
+ *
+ * To get the properly initialized {@link ProcessDefinitionImpl} objects,
+ * use {@link RepositorySession#findProcessDefinitionById(String)} or
+ * {@link RepositorySession#findProcessDefinitionByKey(String)}
+ *
+ * You can use the query query capabilities in this class to find the id
+ * and then use {@link RepositorySession#findProcessDefinitionById(String)}
+ * to get the properly initialized ProcessDefinitionImpl.
+ *
+ * @author Tom Baeyens
+ */
+public class ProcessDefinitionQueryImpl extends AbstractQuery implements ProcessDefinitionQuery {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String id;
+ protected String key;
+ protected String nameLike;
+ protected String name;
+ protected Boolean suspended;
+ protected String deploymentId;
+
+ public Object execute(Session session) {
+ List<Map<String, Object>> propertyMaps = (List<Map<String, Object>>) super.execute(session);
+
+ List<ProcessDefinition> processDefinitions = new ArrayList<ProcessDefinition>();
+ for (Map<String, Object> properties: propertyMaps) {
+ String deploymentId = properties.get("deploymentDbid").toString();
+ String objectName = (String)properties.get("objectName");
+ RepositorySession repositorySession = EnvironmentImpl.getFromCurrent(RepositorySession.class);
+ ProcessDefinitionImpl processDefinition = (ProcessDefinitionImpl) repositorySession.getObject(deploymentId, objectName);
+ processDefinitions.add(processDefinition);
+ }
+
+ return processDefinitions;
+ }
+
+ public String hql() {
+ StringBuilder hql = new StringBuilder();
+ hql.append("select new map( idProperty.objectName as objectName, " +
+ "idProperty.deployment.dbid as deploymentDbid ) ");
+ hql.append("from ");
+ hql.append(DeploymentImpl.class.getName());
+ hql.append(" as deployment, ");
+ hql.append(DeploymentProperty.class.getName());
+ hql.append(" as idProperty, ");
+ hql.append(DeploymentProperty.class.getName());
+ hql.append(" as keyProperty, ");
+ hql.append(DeploymentProperty.class.getName());
+ hql.append(" as versionProperty ");
+
+ if (suspended!=null) {
+ if (suspended) {
+ appendWhereClause("deployment.state = '"+Deployment.STATE_SUSPENDED+"'", hql);
+ } else {
+ appendWhereClause("deployment.state != '"+Deployment.STATE_SUSPENDED+"'", hql);
+ }
+ }
+
+ appendWhereClause("idProperty.key = '"+DeploymentImpl.KEY_PROCESS_DEFINITION_ID+"'", hql);
+ appendWhereClause("idProperty.deployment = deployment ", hql);
+
+ appendWhereClause("keyProperty.key = '"+DeploymentImpl.KEY_PROCESS_DEFINITION_KEY+"' ", hql);
+ appendWhereClause("keyProperty.objectName = idProperty.objectName ", hql);
+ appendWhereClause("keyProperty.deployment = deployment ", hql);
+
+ appendWhereClause("versionProperty.key = '"+DeploymentImpl.KEY_PROCESS_DEFINITION_VERSION+"' ", hql);
+ appendWhereClause("versionProperty.objectName = idProperty.objectName ", hql);
+ appendWhereClause("versionProperty.deployment = deployment ", hql);
+
+ if (id!=null) {
+ appendWhereClause("idProperty.stringValue = '"+id+"'", hql);
+ }
+
+ if (nameLike!=null) {
+ appendWhereClause("idProperty.objectName like '"+nameLike+"' ", hql);
+ }
+
+ if (name!=null) {
+ appendWhereClause("idProperty.objectName = '"+name+"' ", hql);
+ }
+
+ if (key!=null) {
+ appendWhereClause("keyProperty.stringValue = '"+key+"' ", hql);
+ }
+
+ if (deploymentId!=null) {
+ appendWhereClause("idProperty.deployment.dbid = "+deploymentId+" ", hql);
+ }
+
+ appendOrderByClause(hql);
+
+ return hql.toString();
+ }
+
+ protected void applyParameters(Query query) {
+ }
+
+ public List<ProcessDefinition> list() {
+ return (List<ProcessDefinition>) untypedList();
+ }
+
+ public ProcessDefinition uniqueResult() {
+ return (ProcessDefinition) untypedUniqueResult();
+ }
+
+ @Override
+ public long count() {
+ return list().size(); // TODO: change this to a real db count, as with the other query types
+ }
+
+ public ProcessDefinitionQuery processDefinitionId(String id) {
+ this.id = id;
+ return this;
+ }
+
+ public ProcessDefinitionQuery processDefinitionKey(String key) {
+ this.key = key;
+ return this;
+ }
+
+ public ProcessDefinitionQuery suspended() {
+ this.suspended = true;
+ return this;
+ }
+
+ public ProcessDefinitionQuery notSuspended() {
+ this.suspended = false;
+ return this;
+ }
+
+ public ProcessDefinitionQuery processDefinitionNameLike(String name) {
+ this.nameLike = name;
+ return this;
+ }
+
+ public ProcessDefinitionQuery processDefinitionName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public ProcessDefinitionQuery deploymentId(String deploymentId) {
+ this.deploymentId = deploymentId;
+ return this;
+ }
+
+ public ProcessDefinitionQuery orderAsc(String property) {
+ addOrderByClause(property+" asc");
+ return this;
+ }
+
+ public ProcessDefinitionQuery orderDesc(String property) {
+ addOrderByClause(property+" desc");
+ return this;
+ }
+
+ public ProcessDefinitionQuery page(int firstResult, int maxResults) {
+ this.page = new Page(firstResult, maxResults);
+ return this;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/ProcessInstanceQueryImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/ProcessInstanceQueryImpl.java
new file mode 100644
index 0000000..4a65714
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/ProcessInstanceQueryImpl.java
@@ -0,0 +1,135 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.query;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.jbpm.api.ProcessInstance;
+import org.jbpm.api.ProcessInstanceQuery;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ProcessInstanceQueryImpl extends AbstractQuery implements ProcessInstanceQuery {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String processDefinitionId;
+ protected String processInstanceId;
+ protected String processInstanceKey;
+ protected Boolean suspended;
+
+ public ProcessInstance uniqueResult() {
+ return (ProcessInstance)untypedUniqueResult();
+ }
+
+ public List<ProcessInstance> list() {
+ return (List<ProcessInstance>) untypedList();
+ }
+
+ public String hql() {
+ StringBuilder hql = new StringBuilder();
+
+ hql.append("select ");
+ if (count) {
+ hql.append("count(processInstance) ");
+ } else {
+ hql.append("processInstance ");
+ }
+
+ hql.append("from ");
+ hql.append(ExecutionImpl.class.getName());
+ hql.append(" as processInstance ");
+
+ appendWhereClause("processInstance.parent is null ", hql);
+
+ if (suspended!=null) {
+ if (suspended) {
+ appendWhereClause("processInstance.state = '"+ExecutionImpl.STATE_SUSPENDED+"' ", hql);
+ } else {
+ appendWhereClause("processInstance.state != '"+ExecutionImpl.STATE_SUSPENDED+"' ", hql);
+ }
+ }
+
+ if (processInstanceId != null) {
+ appendWhereClause("processInstance.processInstance.id = '" + processInstanceId+"' ", hql);
+ }
+
+ if (processDefinitionId != null) {
+ appendWhereClause("processInstance.processDefinitionId = '" + processDefinitionId+"' ", hql);
+ }
+
+ if (processInstanceKey != null) {
+ appendWhereClause("processInstance.key = '" + processInstanceKey + "'", hql);
+ }
+
+ appendOrderByClause(hql);
+
+ return hql.toString();
+ }
+
+ protected void applyParameters(Query query) {
+ }
+
+ public ProcessInstanceQuery orderAsc(String property) {
+ addOrderByClause("processInstance."+property+" asc");
+ return this;
+ }
+
+ public ProcessInstanceQuery orderDesc(String property) {
+ addOrderByClause("processInstance."+property+" desc");
+ return this;
+ }
+
+ public ProcessInstanceQuery page(int firstResult, int maxResults) {
+ this.page = new Page(firstResult, maxResults);
+ return this;
+ }
+
+ public ProcessInstanceQuery processInstanceId(String processInstanceId) {
+ this.processInstanceId = processInstanceId;
+ return this;
+ }
+
+ public ProcessInstanceQuery processDefinitionId(String processDefinitionId) {
+ this.processDefinitionId = processDefinitionId;
+ return this;
+ }
+
+ public ProcessInstanceQuery suspended() {
+ this.suspended = true;
+ return this;
+ }
+
+ public ProcessInstanceQuery processInstanceKey(String processInstanceKey) {
+ this.processInstanceKey = processInstanceKey;
+ return this;
+ }
+
+ public ProcessInstanceQuery notSuspended() {
+ this.suspended = false;
+ return this;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/TaskQueryImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/TaskQueryImpl.java
new file mode 100644
index 0000000..7b46db5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/query/TaskQueryImpl.java
@@ -0,0 +1,217 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.query;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.Query;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.TaskQuery;
+import org.jbpm.api.identity.Group;
+import org.jbpm.api.task.Task;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.identity.spi.IdentitySession;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.task.ParticipationImpl;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+/**
+ * @author Tom Baeyens
+ * @author Heiko Braun <heiko.braun@jboss.com>
+ */
+public class TaskQueryImpl extends AbstractQuery implements TaskQuery {
+
+ private static final long serialVersionUID = 1L;
+
+ private static Log log = Log.getLog(TaskQueryImpl.class.getName());
+
+ protected boolean unassigned = false;
+ protected String assignee = null;
+ protected String candidate = null;
+ protected Boolean suspended = null;
+ protected String processInstanceId = null;
+ protected String processDefinitionId = null;
+ protected String activityName = null;
+
+ /* groupIds transports the groupIds from the hql to the applyParameters */
+ protected List<String> groupIds;
+
+ public TaskQuery assignee(String assignee) {
+ if (candidate!=null) {
+ throw new JbpmException("assignee(...) cannot be combined with candidate(...) in one query");
+ }
+ this.assignee = assignee;
+ return this;
+ }
+
+ public TaskQuery candidate(String userId) {
+ this.candidate = userId;
+ unassigned();
+ return this;
+ }
+
+ public TaskQuery processInstanceId(String processInstanceId) {
+ this.processInstanceId = processInstanceId;
+ return this;
+ }
+
+ public TaskQuery processDefinitionId(String processDefinitionId) {
+ this.processDefinitionId = processDefinitionId;
+ return this;
+ }
+
+ public TaskQuery activityName(String activityName) {
+ this.activityName = activityName;
+ return this;
+ }
+
+ public TaskQuery unassigned() {
+ this.assignee = null;
+ this.unassigned = true;
+ return this;
+ }
+
+ public TaskQuery suspended() {
+ this.suspended = true;
+ return this;
+ }
+
+ public TaskQuery notSuspended() {
+ this.suspended = false;
+ return this;
+ }
+
+ public TaskQuery orderAsc(String property) {
+ orderByClause = "task." + property + " asc ";
+ return this;
+ }
+
+ public TaskQuery orderDesc(String property) {
+ orderByClause = "task." + property + " desc ";
+ return this;
+ }
+
+ public TaskQuery page(int firstResult, int maxResults) {
+ page = new Page(firstResult, maxResults);
+ return this;
+ }
+
+ protected void applyParameters(Query query) {
+ if (assignee!=null) {
+ log.debug("setting parameter assignee: "+assignee);
+ query.setString("assignee", assignee);
+ }
+
+ if (candidate!=null) {
+ log.debug("setting parameter candidateUserId: "+candidate);
+ query.setString("candidateUserId", candidate);
+
+ if (groupIds!=null) {
+ log.debug("setting parameter candidateGroupIds: "+groupIds);
+ query.setParameterList("candidateGroupIds", groupIds);
+ }
+ }
+ }
+
+ public String hql() {
+ StringBuilder hql = new StringBuilder();
+ hql.append("select ");
+
+ if (count) {
+ hql.append("count(task) ");
+ } else {
+ hql.append("task ");
+ }
+
+ hql.append("from ");
+ hql.append(TaskImpl.class.getName());
+ hql.append(" as task ");
+
+ // participations
+ if (candidate!=null) {
+ hql.append(", ");
+ hql.append(ParticipationImpl.class.getName());
+ hql.append(" as participant ");
+
+ appendWhereClause("participant.task = task ", hql);
+ appendWhereClause("participant.type = 'candidate' ", hql);
+
+ IdentitySession identitySession = EnvironmentImpl.getFromCurrent(IdentitySession.class);
+ List<Group> groups = identitySession.findGroupsByUser(candidate);
+ if (groups.isEmpty()) {
+ groupIds = null;
+ appendWhereClause("participant.userId = :candidateUserId ", hql);
+
+ } else {
+ groupIds = new ArrayList<String>();
+ for (Group group: groups) {
+ groupIds.add(group.getId());
+ }
+ appendWhereClause("((participant.userId = :candidateUserId) or (participant.groupId in (:candidateGroupIds)))", hql);
+ }
+ }
+
+ if (suspended!=null) {
+ if (suspended) {
+ appendWhereClause("task.state = '"+ExecutionImpl.STATE_SUSPENDED+"' ", hql);
+ } else {
+ appendWhereClause("task.state != '"+ExecutionImpl.STATE_SUSPENDED+"' ", hql);
+ }
+ }
+
+ if (processInstanceId!=null) {
+ appendWhereClause("task.processInstance.id = '"+processInstanceId+"' ", hql);
+ }
+
+ if (activityName!=null) {
+ appendWhereClause("task.execution.activityName = '"+activityName+"' ", hql);
+ }
+
+ if (processDefinitionId!=null) {
+ appendWhereClause("task.processInstance.processDefinitionId = '"+processDefinitionId+"' ", hql);
+ }
+
+ if (assignee!=null) {
+ appendWhereClause("task.assignee = :assignee ", hql);
+ } else if (unassigned) {
+ appendWhereClause("task.assignee is null ", hql);
+ }
+
+ appendOrderByClause(hql);
+
+ String hqlQuery = hql.toString();
+
+ log.debug(hqlQuery);
+
+ return hqlQuery;
+ }
+
+ public List<Task> list() {
+ return (List<Task>) commandService.execute(this);
+ }
+
+ public Task uniqueResult() {
+ return (Task)untypedUniqueResult();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/Deployer.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/Deployer.java
new file mode 100644
index 0000000..a53c930
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/Deployer.java
@@ -0,0 +1,35 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.repository;
+
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface Deployer {
+
+ void deploy(DeploymentImpl deployment);
+
+ void updateResource(DeploymentImpl deployment, String resourceName, byte[] bytes);
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/DeployerManager.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/DeployerManager.java
new file mode 100644
index 0000000..3b3bc00
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/DeployerManager.java
@@ -0,0 +1,83 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.repository;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.xml.Problem;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DeployerManager {
+
+ private static Log LOG = Log.getLog(DeployerManager.class.getName());
+
+ List<Deployer> deployers;
+
+ public void deploy(DeploymentImpl deployment) {
+ deployment.setProblems(new ArrayList<Problem>());
+
+ for (Deployer deployer: deployers) {
+ deployer.deploy(deployment);
+ }
+
+ if (deployment.hasErrors()) {
+ JbpmException jbpmException = deployment.getJbpmException();
+ LOG.info("errors during deployment of "+deployment+": "+jbpmException.getMessage());
+ throw jbpmException;
+ }
+
+ RepositoryCache repositoryCache = EnvironmentImpl.getFromCurrent(RepositoryCache.class);
+
+ if (repositoryCache != null) {
+
+ // If there are no objects after deploying, then there is something wrong
+ if (deployment.getObjects() == null || deployment.getObjects().isEmpty()) {
+
+ if (LOG.isWarnEnabled()) {
+ LOG.warn("WARNING: no objects were deployed! Check if you have configured a correct deployer "
+ +"in your jbpm.cfg.xml file for the type of deployment you want to do.");
+ }
+
+ } else {
+
+ repositoryCache.set(deployment.getId(), deployment.getObjects());
+
+ }
+ }
+ }
+
+ public void updateResource(DeploymentImpl deployment, String resourceName, byte[] bytes) {
+ for (Deployer deployer: deployers) {
+ deployer.updateResource(deployment, resourceName, bytes);
+ }
+
+ RepositoryCache repositoryCache = EnvironmentImpl.getFromCurrent(RepositoryCache.class);
+ repositoryCache.remove(deployment.getId());
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/DeploymentClassLoader.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/DeploymentClassLoader.java
new file mode 100644
index 0000000..8def771
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/DeploymentClassLoader.java
@@ -0,0 +1,124 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.repository;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLStreamHandler;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.session.RepositorySession;
+import org.jbpm.pvm.internal.util.IoUtil;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DeploymentClassLoader extends ClassLoader {
+
+ private String deploymentId = null;
+
+ public DeploymentClassLoader(ClassLoader parent, String deploymentId ) {
+ super(parent);
+ this.deploymentId = deploymentId;
+ }
+
+ public URL findResource(String name) {
+ URL url = null;
+ byte[] bytes = getDeployment().getBytes(name);
+ if (bytes!=null) {
+ InputStream inputStream = new ByteArrayInputStream(bytes);
+ try {
+ url = new URL(null, "jbpm://"+deploymentId+"/"+name, new BytesUrlStreamHandler(inputStream));
+ } catch (MalformedURLException e) {
+ throw new JbpmException("couldn't create url", e);
+ }
+ }
+ return url;
+ }
+
+ protected DeploymentImpl getDeployment() {
+ RepositorySession repositorySession = EnvironmentImpl.getFromCurrent(RepositorySession.class);
+ return repositorySession.getDeployment(deploymentId);
+ }
+
+ public static class BytesUrlStreamHandler extends URLStreamHandler {
+ InputStream inputStream;
+ public BytesUrlStreamHandler(InputStream inputStream) {
+ this.inputStream = inputStream;
+ }
+ protected URLConnection openConnection(URL u) throws IOException {
+ return new BytesUrlConnection(inputStream, u);
+ }
+ }
+
+ public static class BytesUrlConnection extends URLConnection {
+ InputStream inputStream;
+ public BytesUrlConnection(InputStream inputStream, URL url) {
+ super(url);
+ this.inputStream = inputStream;
+ }
+ public void connect() throws IOException {
+ }
+ public InputStream getInputStream() throws IOException {
+ return inputStream;
+ }
+ }
+
+ public Class findClass(String name) throws ClassNotFoundException {
+ Class clazz = null;
+
+ String fileName = name.replace( '.', '/' ) + ".class";
+ byte[] bytes = getDeployment().getBytes(fileName);
+ if (bytes!=null) {
+ try {
+ InputStream inputStream = new ByteArrayInputStream(bytes);
+ byte[] classBytes = IoUtil.readBytes(inputStream);
+ clazz = defineClass(name, classBytes, 0, classBytes.length);
+
+ // Add the package information
+ final int packageIndex = name.lastIndexOf('.');
+ if (packageIndex != -1) {
+ final String packageName = name.substring(0, packageIndex);
+ final Package classPackage = getPackage(packageName);
+ if (classPackage == null) {
+ definePackage(packageName, null, null, null, null, null, null, null);
+ }
+ }
+
+ } catch (JbpmException e) {
+ clazz = null;
+ }
+ }
+
+ if (clazz==null) {
+ throw new ClassNotFoundException("class '"+name+"' could not be found in deployment "+deploymentId);
+ }
+
+ return clazz;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/DeploymentImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/DeploymentImpl.java
new file mode 100644
index 0000000..ee756ab
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/DeploymentImpl.java
@@ -0,0 +1,365 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.repository;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectStreamException;
+import java.io.Serializable;
+import java.net.URL;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import org.jbpm.api.Deployment;
+import org.jbpm.api.NewDeployment;
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.cmd.DeployCmd;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.id.DbidGenerator;
+import org.jbpm.pvm.internal.lob.Lob;
+import org.jbpm.pvm.internal.stream.ByteArrayStreamInput;
+import org.jbpm.pvm.internal.stream.FileStreamInput;
+import org.jbpm.pvm.internal.stream.InputStreamInput;
+import org.jbpm.pvm.internal.stream.ResourceStreamInput;
+import org.jbpm.pvm.internal.stream.StreamInput;
+import org.jbpm.pvm.internal.stream.StringStreamInput;
+import org.jbpm.pvm.internal.stream.UrlStreamInput;
+import org.jbpm.pvm.internal.util.IoUtil;
+import org.jbpm.pvm.internal.xml.ProblemList;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DeploymentImpl extends ProblemList implements NewDeployment, Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final String KEY_PROCESS_LANGUAGE_ID = "langid";
+ public static final String KEY_PROCESS_DEFINITION_ID = "pdid";
+ public static final String KEY_PROCESS_DEFINITION_KEY = "pdkey";
+ public static final String KEY_PROCESS_DEFINITION_VERSION = "pdversion";
+
+ protected long dbid;
+ protected String name;
+ protected long timestamp;
+ protected String state = Deployment.STATE_ACTIVE;
+ protected Map<String, Lob> resources;
+
+ protected CommandService commandService;
+ protected Map<String, Object> objects;
+ protected Set<DeploymentProperty> objectProperties;
+
+ public DeploymentImpl() {
+ }
+
+ public DeploymentImpl(CommandService commandService) {
+ this.commandService = commandService;
+ }
+
+ public String toString() {
+ return "deployment("+dbid+")";
+ }
+
+ public String deploy() {
+ return commandService.execute(new DeployCmd(this));
+ }
+
+ public NewDeployment addResourceFromClasspath(String resourceName) {
+ addResourceFromStreamInput(resourceName, new ResourceStreamInput(resourceName));
+ return this;
+ }
+
+ public NewDeployment addResourceFromString(String resourceName, String text) {
+ addResourceFromStreamInput(resourceName, new StringStreamInput(text));
+ return this;
+ }
+
+ public NewDeployment addResourcesFromZipInputStream(ZipInputStream zipInputStream) {
+ try {
+ ZipEntry zipEntry = zipInputStream.getNextEntry();
+ while(zipEntry!=null) {
+ String entryName = zipEntry.getName();
+ byte[] bytes = IoUtil.readBytes(zipInputStream);
+ if (bytes!=null) {
+ addResourceFromStreamInput(entryName, new ByteArrayStreamInput(bytes));
+ }
+ zipEntry = zipInputStream.getNextEntry();
+ }
+ } catch (Exception e) {
+ throw new JbpmException("couldn't read zip archive", e);
+ }
+ return this;
+ }
+
+ public NewDeployment addResourceFromInputStream(String resourceName, InputStream inputStream) {
+ addResourceFromStreamInput(resourceName, new InputStreamInput(inputStream));
+ return this;
+ }
+
+ public NewDeployment addResourceFromUrl(URL url) {
+ addResourceFromStreamInput(url.toString(), new UrlStreamInput(url));
+ return this;
+ }
+
+ public NewDeployment addResourceFromFile(File file) {
+ addResourceFromStreamInput(file.getPath(), new FileStreamInput(file));
+ return this;
+ }
+
+ public NewDeployment addResourceFromStreamInput(String name, StreamInput streamInput) {
+ if (resources==null) {
+ resources = new HashMap<String, Lob>();
+ }
+ byte[] bytes = null;
+ try {
+ InputStream inputStream = streamInput.openStream();
+ bytes = IoUtil.readBytes(inputStream);
+ inputStream.close();
+ } catch (IOException e) {
+ throw new JbpmException("couldn't read from "+streamInput, e);
+ }
+
+ // Since this method is probably called outside an environment block, we
+ // need to generate the dbid of the Lob later (during the actual deployment).
+ Lob lob = new Lob(bytes, false);
+ resources.put(name, lob);
+
+ return this;
+ }
+
+ public Set<String> getResourceNames() {
+ if (resources==null) {
+ return Collections.emptySet();
+ }
+ return resources.keySet();
+ }
+
+ /**
+ * This method should be called before saving the deployment. It will assign a
+ * generated dbid to the resource Lobs.
+ *
+ * Note: when using a database, this method must be called within an
+ * environment block!
+ */
+ public void initResourceLobDbids() {
+ for (Lob resource : resources.values()) {
+ long resourceDbid = DbidGenerator.getDbidGenerator().getNextId();
+ resource.setDbid(resourceDbid);
+ }
+ }
+
+ public byte[] getBytes(String resourceName) {
+ if (resources!=null) {
+ Lob lob = resources.get(resourceName);
+ if (lob!=null) {
+ return lob.extractBytes();
+ }
+ }
+ return null;
+ }
+
+ public void addObject(String objectName, Object object) {
+ if (objects==null) {
+ objects = new HashMap<String, Object>();
+ }
+ objects.put(objectName, object);
+ }
+
+ // object properties ////////////////////////////////////////////////////////
+
+ public void setProcessDefinitionId(String processDefinitionName, String processDefinitionId) {
+ setObjectProperty(processDefinitionName, KEY_PROCESS_DEFINITION_ID, processDefinitionId);
+ }
+
+ public String getProcessDefinitionId(String processDefinitionName) {
+ return (String) getObjectProperty(processDefinitionName, KEY_PROCESS_DEFINITION_ID);
+ }
+
+ public void setProcessDefinitionKey(String processDefinitionName, String processDefinitionKey) {
+ setObjectProperty(processDefinitionName, KEY_PROCESS_DEFINITION_KEY, processDefinitionKey);
+ }
+
+ public String getProcessDefinitionKey(String processDefinitionName) {
+ return (String) getObjectProperty(processDefinitionName, KEY_PROCESS_DEFINITION_KEY);
+ }
+
+ public void setProcessDefinitionVersion(String processDefinitionName, Long processDefinitionVersion) {
+ setObjectProperty(processDefinitionName, KEY_PROCESS_DEFINITION_VERSION, processDefinitionVersion);
+ }
+
+ public Long getProcessDefinitionVersion(String processDefinitionName) {
+ return (Long) getObjectProperty(processDefinitionName, KEY_PROCESS_DEFINITION_VERSION);
+ }
+
+ public String getProcessLanguageId(String processDefinitionName) {
+ return (String) getObjectProperty(processDefinitionName, KEY_PROCESS_LANGUAGE_ID);
+ }
+
+ public void setProcessLanguageId(String processDefinitionName, String processLanguageId) {
+ setObjectProperty(processDefinitionName, KEY_PROCESS_LANGUAGE_ID, processLanguageId);
+ }
+
+ public void setObjectProperty(String objectName, String key, Object value) {
+ if (objectProperties==null) {
+ objectProperties = new HashSet<DeploymentProperty>();
+ }
+ DeploymentProperty deploymentProperty = new DeploymentProperty(this, objectName, key);
+ deploymentProperty.setValue(value);
+ objectProperties.add(deploymentProperty);
+ }
+
+ public Object removeObjectProperty(String objectName, String key) {
+ if (objectProperties != null) {
+ for (DeploymentProperty deploymentProperty : objectProperties) {
+ if (deploymentProperty.getObjectName().equals(objectName)
+ && deploymentProperty.getKey().equals(key)) {
+ Object value = deploymentProperty.getValue();
+ objectProperties.remove(deploymentProperty);
+ return value;
+ }
+ }
+ }
+ return null;
+ }
+
+ public Object getObjectProperty(String objectName, String key) {
+ if (objectProperties!=null) {
+ for (DeploymentProperty deploymentProperty: objectProperties) {
+ if ( (deploymentProperty.getObjectName().equals(objectName))
+ && (deploymentProperty.getKey().equals(key))
+ ) {
+ return deploymentProperty.getValue();
+ }
+ }
+ }
+ return null;
+ }
+
+ public Set<String> getProcessDefinitionIds() {
+ Set<String> processDefinitionIds = new HashSet<String>();
+ if (objectProperties!=null) {
+ for (DeploymentProperty deploymentProperty: objectProperties) {
+ if (KEY_PROCESS_DEFINITION_ID.equals(deploymentProperty.getKey())) {
+ String processDefinitionId = deploymentProperty.getStringValue();
+ processDefinitionIds.add(processDefinitionId);
+ }
+ }
+ }
+ return processDefinitionIds;
+ }
+
+ public boolean hasObjectProperties(String objectName) {
+ if (objectProperties!=null) {
+ for (DeploymentProperty deploymentProperty: objectProperties) {
+ if ( deploymentProperty.getObjectName().equals(objectName)
+ && KEY_PROCESS_DEFINITION_ID.equals(deploymentProperty.getKey())
+ ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public void suspend() {
+ if (isSuspended()) {
+ throw new JbpmException("deployment is already suspended");
+ }
+
+ state = Deployment.STATE_SUSPENDED;
+
+ RepositorySessionImpl repositorySession = EnvironmentImpl.getFromCurrent(RepositorySessionImpl.class);
+ repositorySession.cascadeDeploymentSuspend(this);
+
+ RepositoryCache repositoryCache = EnvironmentImpl.getFromCurrent(RepositoryCache.class);
+ repositoryCache.remove(Long.toString(dbid));
+ }
+
+ public void resume() {
+ if (!isSuspended()) {
+ throw new JbpmException("deployment is not suspended");
+ }
+
+ state = Deployment.STATE_ACTIVE;
+
+ RepositorySessionImpl repositorySession = EnvironmentImpl.getFromCurrent(RepositorySessionImpl.class);
+ repositorySession.cascadeDeploymentResume(this);
+
+ RepositoryCache repositoryCache = EnvironmentImpl.getFromCurrent(RepositoryCache.class);
+ repositoryCache.remove(Long.toString(dbid));
+ }
+
+ public boolean isSuspended() {
+ return Deployment.STATE_SUSPENDED.equals(state);
+ }
+
+ protected Object writeReplace() throws ObjectStreamException {
+ commandService = null;
+ return this;
+ }
+
+ // customized getters and setters ///////////////////////////////////////////
+
+ public String getId() {
+ return Long.toString(dbid);
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public long getDbid() {
+ return dbid;
+ }
+ public Map<String, Object> getObjects() {
+ return objects;
+ }
+ public Set<DeploymentProperty> getObjectProperties() {
+ return objectProperties;
+ }
+ public String getName() {
+ return name;
+ }
+ public DeploymentImpl setName(String name) {
+ this.name = name;
+ return this;
+ }
+ public long getTimestamp() {
+ return timestamp;
+ }
+ public DeploymentImpl setTimestamp(long timestamp) {
+ this.timestamp = timestamp;
+ return this;
+ }
+ public String getState() {
+ return state;
+ }
+ public void setDbid(long dbid) {
+ this.dbid = dbid;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/DeploymentProperty.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/DeploymentProperty.java
new file mode 100644
index 0000000..8d07950
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/DeploymentProperty.java
@@ -0,0 +1,102 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.repository;
+
+import java.io.Serializable;
+
+import org.hibernate.Session;
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.id.DbidGenerator;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DeploymentProperty implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ long dbid;
+ protected DeploymentImpl deployment;
+ protected String objectName;
+ protected String key;
+ protected String stringValue;
+ protected Long longValue;
+
+ public DeploymentProperty() {
+ }
+
+ public DeploymentProperty(DeploymentImpl deployment, String objectName, String key) {
+ this.dbid = DbidGenerator.getDbidGenerator().getNextId();
+ EnvironmentImpl.getFromCurrent(Session.class).save(this);
+ this.deployment = deployment;
+ this.objectName = objectName;
+ this.key = key;
+ }
+
+ public String toString() {
+ return "{"+objectName+","+key+","+(stringValue!=null?stringValue:longValue)+"}";
+ }
+
+ public String getObjectName() {
+ return objectName;
+ }
+ public String getKey() {
+ return key;
+ }
+ public DeploymentImpl getDeployment() {
+ return deployment;
+ }
+ public String getStringValue() {
+ return stringValue;
+ }
+ public Long getLongValue() {
+ return longValue;
+ }
+ public void setStringValue(String stringValue) {
+ this.stringValue = stringValue;
+ }
+ public void setLongValue(Long longValue) {
+ this.longValue = longValue;
+ }
+
+ public void setValue(Object value) {
+ if (value==null) {
+ stringValue = null;
+ longValue = null;
+ } else if (value instanceof String) {
+ stringValue = (String)value;
+ } else if (value instanceof Long) {
+ longValue = (Long)value;
+ } else {
+ throw new JbpmException("value type "+value.getClass().getName()+" not supported (only string and long)");
+ }
+ }
+
+ public Object getValue() {
+ if (stringValue!=null) {
+ return stringValue;
+ }
+ return longValue;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/ProcessDeployer.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/ProcessDeployer.java
new file mode 100644
index 0000000..7da2b00
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/ProcessDeployer.java
@@ -0,0 +1,198 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.repository;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Map;
+
+import org.jbpm.api.ProcessDefinition;
+import org.jbpm.api.ProcessDefinitionQuery;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.migration.InstanceMigrator;
+import org.jbpm.pvm.internal.migration.MigrationDescriptor;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.session.RepositorySession;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ProcessDeployer implements Deployer {
+
+ private static final Log log = Log.getLog(ProcessDeployer.class.getName());
+
+ protected String extension;
+ protected Parser parser;
+
+ public ProcessDeployer(String extension, Parser parser) {
+ this.extension = extension;
+ this.parser = parser;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void deploy(DeploymentImpl deployment) {
+
+ for (String resourceName: deployment.getResourceNames()) {
+
+ if (resourceName.endsWith(extension)) {
+ byte[] bytes = deployment.getBytes(resourceName);
+ InputStream inputStream = new ByteArrayInputStream(bytes);
+ Parse parse = parser.createParse();
+ parse.contextMapPut(Parse.CONTEXT_KEY_DEPLOYMENT, deployment);
+ parse.setProblems(deployment.getProblems());
+ parse.setInputStream(inputStream);
+ parse.execute();
+ List<ProcessDefinitionImpl> processDefinitions = (List<ProcessDefinitionImpl>) parse.getDocumentObject();
+ if (processDefinitions!=null) {
+ for (ProcessDefinitionImpl processDefinition : processDefinitions) {
+ if ((processDefinition != null) && (processDefinition.getName() != null)) {
+ String processDefinitionName = processDefinition.getName();
+
+ processDefinition.setSuspended(deployment.isSuspended());
+
+ String imageResourceName = resourceName.substring(0, resourceName.lastIndexOf(extension)) + ".png";
+ if (deployment.getResourceNames().contains(imageResourceName)) {
+ processDefinition.setImageResourceName(imageResourceName);
+ }
+
+ processDefinition.setDeploymentDbid(deployment.getDbid());
+
+ if (deployment.hasObjectProperties(processDefinitionName)) {
+ String key = deployment.getProcessDefinitionKey(processDefinitionName);
+ String id = deployment.getProcessDefinitionId(processDefinitionName);
+ Long version = deployment.getProcessDefinitionVersion(processDefinitionName);
+ processDefinition.setId(id);
+ processDefinition.setKey(key);
+ processDefinition.setVersion(version.intValue());
+
+ } else {
+ checkKey(processDefinition, deployment);
+ checkVersion(processDefinition, deployment);
+ checkId(processDefinition, deployment);
+
+ deployment.setProcessDefinitionId(processDefinitionName, processDefinition.getId());
+ deployment.setProcessDefinitionKey(processDefinitionName, processDefinition.getKey());
+ deployment.setProcessDefinitionVersion(processDefinitionName, new Long(processDefinition.getVersion()));
+
+ //execute migration
+ Map<ProcessDefinition, MigrationDescriptor> migrations = (Map<ProcessDefinition, MigrationDescriptor>)parse.contextMapGet(Parse.CONTEXT_KEY_MIGRATIONS);
+ if (migrations != null) {
+ MigrationDescriptor migrationDescriptor = migrations.get(processDefinition);
+ if (migrationDescriptor != null) {
+ InstanceMigrator.migrateAll(processDefinition, migrationDescriptor);
+ }
+ }
+
+ }
+
+ deployment.addObject(processDefinitionName, processDefinition);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ protected void checkKey(ProcessDefinitionImpl processDefinition, DeploymentImpl deployment) {
+ String processDefinitionName = processDefinition.getName();
+ String processDefinitionKey = processDefinition.getKey();
+
+ // if no key was specified in the jpdl process file
+ if (processDefinitionKey==null) {
+ // derive the key from the name
+ // replace any non-word character with an underscore
+ processDefinitionKey = processDefinitionName.replaceAll("\\W", "_");
+ processDefinition.setKey(processDefinitionKey);
+ }
+
+ RepositorySession repositorySession = EnvironmentImpl.getFromCurrent(RepositorySession.class);
+
+ List<ProcessDefinition> existingProcesses = repositorySession.createProcessDefinitionQuery()
+ .processDefinitionName(processDefinitionName)
+ .list();
+
+ for (ProcessDefinition existingProcess: existingProcesses) {
+ if (!processDefinitionKey.equals(existingProcess.getKey())) {
+ deployment.addProblem("invalid key '"+processDefinitionKey+"' in process "+processDefinition.getName()+". Existing process has name '"+processDefinitionName+"' and key '"+processDefinitionKey+"'");
+ }
+ }
+
+ existingProcesses = repositorySession.createProcessDefinitionQuery()
+ .processDefinitionKey(processDefinitionKey)
+ .list();
+
+ for (ProcessDefinition existingProcess: existingProcesses) {
+ if (!processDefinitionName.equals(existingProcess.getName())) {
+ deployment.addProblem("invalid name '"+processDefinitionName+"' in process "+processDefinition.getName()+". Existing process has name '"+processDefinitionName+"' and key '"+processDefinitionKey+"'");
+ }
+ }
+ }
+
+ protected void checkId(ProcessDefinitionImpl processDefinition, DeploymentImpl deployment) {
+ String id = processDefinition.getId();
+ if (id==null) {
+ id = processDefinition.getKey()+"-"+processDefinition.getVersion();
+ if (log.isTraceEnabled()) log.trace("created id '"+id+"' for "+processDefinition);
+ processDefinition.setId(id);
+ }
+
+ RepositorySession repositorySession = EnvironmentImpl.getFromCurrent(RepositorySession.class);
+ ProcessDefinition existingProcessDefinition = repositorySession.createProcessDefinitionQuery()
+ .processDefinitionId(id)
+ .uniqueResult();
+ if (existingProcessDefinition != null) {
+ deployment.addProblem("process '" + id + "' already exists");
+ }
+ }
+
+ protected void checkVersion(ProcessDefinitionImpl processDefinition, DeploymentImpl deployment) {
+ int version = processDefinition.getVersion();
+ String key = processDefinition.getKey();
+ if (version==ProcessDefinitionImpl.UNASSIGNED_VERSION) {
+ RepositorySession repositorySession = EnvironmentImpl.getFromCurrent(RepositorySession.class);
+
+ ProcessDefinition latestDeployedVersion = repositorySession
+ .createProcessDefinitionQuery()
+ .processDefinitionKey(key)
+ .orderDesc(ProcessDefinitionQuery.PROPERTY_VERSION)
+ .page(0, 1)
+ .uniqueResult();
+
+ if (latestDeployedVersion!=null) {
+ version = latestDeployedVersion.getVersion() + 1;
+ } else {
+ version = 1;
+ }
+ if (log.isTraceEnabled()) log.trace("assigning version "+version+" to process definition "+key);
+ processDefinition.setVersion(version);
+ }
+ }
+
+ public void updateResource(DeploymentImpl deployment, String resourceName, byte[] bytes) {
+ deployment.addResourceFromInputStream(resourceName, new ByteArrayInputStream(bytes));
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RepositoryCache.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RepositoryCache.java
new file mode 100644
index 0000000..4670dfe
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RepositoryCache.java
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.repository;
+
+import java.util.Map;
+import java.util.Set;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface RepositoryCache {
+
+ void set(String deploymentId, Map<String, Object> deployedObjects);
+ void set(String deploymentId, String key, Object cachedObject);
+ Object get(String deploymentId, String objectName);
+ Set<String> getCachedDeploymentIds();
+ void remove(String deploymentId);
+ void clear();
+
+ DeploymentClassLoader getDeploymentClassLoader(String deploymentId, ClassLoader original);
+ void setDeploymentClassLoader(String deploymentId, ClassLoader original, DeploymentClassLoader deploymentClassLoader);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RepositoryCacheImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RepositoryCacheImpl.java
new file mode 100644
index 0000000..049dcdd
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RepositoryCacheImpl.java
@@ -0,0 +1,103 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.repository;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class RepositoryCacheImpl implements RepositoryCache {
+
+ Map<String, Map<String, Object>> deployments = new HashMap<String, Map<String,Object>>();
+ Map<Object, DeploymentClassLoader> deploymentClassLoaders = new HashMap<Object, DeploymentClassLoader>();
+
+ public Object get(String deploymentId, String objectName) {
+ Map<String, Object> deploymentObjects = deployments.get(deploymentId);
+ if (deploymentObjects==null) {
+ return null;
+ }
+ return deploymentObjects.get(objectName);
+ }
+
+ public void set(String deploymentId, String key, Object cachedObject) {
+ Map<String, Object> objects = new HashMap<String, Object>();
+ objects.put(key, cachedObject);
+ set(deploymentId, objects);
+ }
+
+ public void set(String deploymentId, Map<String, Object> objects) {
+ if (objects==null) {
+ deployments.put(deploymentId, null);
+ } else {
+ Map<String, Object> deploymentObjects = deployments.get(deploymentId);
+ if (deploymentObjects==null) {
+ deploymentObjects = new HashMap<String, Object>();
+ deployments.put(deploymentId, deploymentObjects);
+ }
+ for (String objectName: objects.keySet()) {
+ Object object = objects.get(objectName);
+ deploymentObjects.put(objectName, object);
+ }
+ }
+ }
+
+ public Set<String> getCachedDeploymentIds() {
+ if (deployments != null) {
+ return new HashSet<String>(deployments.keySet());
+ }
+ return Collections.emptySet();
+ }
+
+ public void remove(String deploymentDbid) {
+ if (deployments!=null) {
+ deployments.remove(deploymentDbid);
+ }
+ }
+
+ public void clear() {
+ deployments = new HashMap<String, Map<String,Object>>();
+ }
+
+ public DeploymentClassLoader getDeploymentClassLoader(String deploymentId, ClassLoader original) {
+ Object key = getDeploymentClassLoaderKey(deploymentId, original);
+ return deploymentClassLoaders.get(key);
+ }
+
+ public void setDeploymentClassLoader(String deploymentId, ClassLoader original, DeploymentClassLoader deploymentClassLoader) {
+ deploymentClassLoaders.put(getDeploymentClassLoaderKey(deploymentId, original), deploymentClassLoader);
+ }
+
+ protected Object getDeploymentClassLoaderKey(String deploymentId, ClassLoader original) {
+ List<Object> key = new ArrayList<Object>();
+ key.add(deploymentId);
+ key.add(original);
+ return key;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RepositoryServiceImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RepositoryServiceImpl.java
new file mode 100644
index 0000000..95a4cb7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RepositoryServiceImpl.java
@@ -0,0 +1,115 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.repository;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Set;
+
+import org.jbpm.api.DeploymentQuery;
+import org.jbpm.api.NewDeployment;
+import org.jbpm.api.ProcessDefinitionQuery;
+import org.jbpm.api.RepositoryService;
+import org.jbpm.api.model.ActivityCoordinates;
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.cmd.CreateDeploymentQueryCmd;
+import org.jbpm.pvm.internal.cmd.CreateProcessDefinitionQueryCmd;
+import org.jbpm.pvm.internal.cmd.DeleteDeploymentCmd;
+import org.jbpm.pvm.internal.cmd.GetActivityCoordinatesCmd;
+import org.jbpm.pvm.internal.cmd.GetDeploymentResourceNamesCmd;
+import org.jbpm.pvm.internal.cmd.GetResourceAsStreamCmd;
+import org.jbpm.pvm.internal.cmd.GetStartActivityNamesCmd;
+import org.jbpm.pvm.internal.cmd.GetStartFormResourceNameCmd;
+import org.jbpm.pvm.internal.cmd.ResumeDeploymentCmd;
+import org.jbpm.pvm.internal.cmd.SuspendDeploymentCmd;
+import org.jbpm.pvm.internal.cmd.UpdateDeploymentResourceCmd;
+import org.jbpm.pvm.internal.query.DeploymentQueryImpl;
+import org.jbpm.pvm.internal.query.ProcessDefinitionQueryImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class RepositoryServiceImpl implements RepositoryService {
+
+ CommandService commandService;
+
+ public NewDeployment createDeployment() {
+ return new DeploymentImpl(commandService);
+ }
+
+ public void suspendDeployment(String deploymentId) {
+ commandService.execute(new SuspendDeploymentCmd(deploymentId));
+ }
+
+ public void resumeDeployment(String deploymentId) {
+ commandService.execute(new ResumeDeploymentCmd(deploymentId));
+ }
+
+ public void deleteDeployment(String deploymentId) {
+ commandService.execute(new DeleteDeploymentCmd(deploymentId));
+ }
+
+ public void deleteDeploymentCascade(String deploymentId) {
+ commandService.execute(new DeleteDeploymentCmd(deploymentId, true));
+ }
+
+ public Set<String> getResourceNames(String deploymentId) {
+ return commandService.execute(new GetDeploymentResourceNamesCmd(deploymentId));
+ }
+
+ public InputStream getResourceAsStream(String deploymentId, String resource) {
+ byte[] bytes = commandService.execute(new GetResourceAsStreamCmd(deploymentId, resource));
+ if (bytes!=null) {
+ return new ByteArrayInputStream(bytes);
+ }
+ return null;
+ }
+
+ public ProcessDefinitionQuery createProcessDefinitionQuery() {
+ ProcessDefinitionQueryImpl query = commandService.execute(new CreateProcessDefinitionQueryCmd());
+ query.setCommandService(commandService);
+ return query;
+ }
+
+ public DeploymentQuery createDeploymentQuery() {
+ DeploymentQueryImpl query = commandService.execute(new CreateDeploymentQueryCmd());
+ query.setCommandService(commandService);
+ return query;
+ }
+
+ public ActivityCoordinates getActivityCoordinates(String processDefinitionId, String activityName) {
+ return commandService.execute(new GetActivityCoordinatesCmd(processDefinitionId, activityName));
+ }
+
+ public List<String> getStartActivityNames(String processDefinitionId) {
+ return commandService.execute(new GetStartActivityNamesCmd(processDefinitionId));
+ }
+
+ public String getStartFormResourceName(String processDefinitionId, String activityName) {
+ return commandService.execute(new GetStartFormResourceNameCmd(processDefinitionId, activityName));
+ }
+
+ public void updateDeploymentResource(String deploymentId, String resourceName, InputStream inputStream) {
+ commandService.execute(new UpdateDeploymentResourceCmd(deploymentId, resourceName, inputStream));
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RepositorySessionImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RepositorySessionImpl.java
new file mode 100644
index 0000000..2ffeadf
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RepositorySessionImpl.java
@@ -0,0 +1,216 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.repository;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.NewDeployment;
+import org.jbpm.api.ProcessDefinition;
+import org.jbpm.api.ProcessDefinitionQuery;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.id.DbidGenerator;
+import org.jbpm.pvm.internal.lob.Lob;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.query.ProcessDefinitionQueryImpl;
+import org.jbpm.pvm.internal.session.RepositorySession;
+
+/**
+ * @author Tom Baeyens
+ */
+public class RepositorySessionImpl implements RepositorySession {
+
+ private static Log log = Log.getLog(RepositorySessionImpl.class.getName());
+
+ protected Session session;
+ protected RepositoryCache repositoryCache;
+ protected DeployerManager deployerManager;
+
+ public String deploy(NewDeployment deployment) {
+ DeploymentImpl deploymentImpl = (DeploymentImpl) deployment;
+
+ long dbid = DbidGenerator.getDbidGenerator().getNextId();
+ deploymentImpl.setDbid(dbid);
+ deploymentImpl.initResourceLobDbids();
+
+ session.save(deploymentImpl); // will also save the attached resources
+ deployerManager.deploy(deploymentImpl);
+
+ return deploymentImpl.getId();
+ }
+
+ public void updateDeploymentResource(String deploymentId, String resourceName, byte[] bytes) {
+ DeploymentImpl deployment = getDeployment(deploymentId);
+ deployerManager.updateResource(deployment, resourceName, bytes);
+ }
+
+ public void cascadeDeploymentSuspend(DeploymentImpl deployment) {
+ // cascade to all executions in this deployment
+ Set<String> processDefinitionIds = deployment.getProcessDefinitionIds();
+ if (!processDefinitionIds.isEmpty()) {
+ Query query = session.createQuery(
+ "select execution " +
+ "from "+ExecutionImpl.class.getName()+" as execution " +
+ "where execution.processDefinitionId in (:processDefinitionIds) " +
+ " and execution.state != '"+ExecutionImpl.STATE_SUSPENDED+"'"
+ );
+ query.setParameterList("processDefinitionIds", processDefinitionIds);
+ List<ExecutionImpl> executions = query.list();
+ for (ExecutionImpl execution: executions) {
+ execution.suspend();
+ }
+ }
+
+ // TODO cleaning this cache should actually be done as a synchronization
+ // after the transaction. If a concurrent transaction for an execution
+ // starts between clearing the cache and committing the transaction, then
+ // that transaction could potentially re-initialize the process definition
+ // in the cache.
+ repositoryCache.remove(deployment.getId());
+ }
+
+ public void cascadeDeploymentResume(DeploymentImpl deployment) {
+ // cascade to all executions in this deployment
+ Set<String> processDefinitionIds = deployment.getProcessDefinitionIds();
+ if (!processDefinitionIds.isEmpty()) {
+ Query query = session.createQuery(
+ "select execution " +
+ "from "+ExecutionImpl.class.getName()+" as execution " +
+ "where execution.processDefinitionId in (:processDefinitionIds) " +
+ " and execution.state = '"+ExecutionImpl.STATE_SUSPENDED+"'"
+ );
+ query.setParameterList("processDefinitionIds", processDefinitionIds);
+ List<ExecutionImpl> executions = query.list();
+ for (ExecutionImpl execution: executions) {
+ execution.resume();
+ }
+ }
+ }
+
+ public DeploymentImpl getDeployment(String deploymentId) {
+ return (DeploymentImpl) session.get(DeploymentImpl.class, Long.parseLong(deploymentId));
+ }
+
+ public Object getObject(String deploymentId, String objectName) {
+ Object object = repositoryCache.get(deploymentId, objectName);
+ if (object!=null) {
+ log.trace("repository cache hit");
+
+ } else if (deploymentId==null) {
+ throw new JbpmException("deploymentId is null");
+
+ } else {
+ log.trace("loading deployment "+deploymentId+" from db");
+ DeploymentImpl deployment = (DeploymentImpl) session.load(DeploymentImpl.class, Long.parseLong(deploymentId));
+ deployerManager.deploy(deployment);
+ object = repositoryCache.get(deploymentId, objectName);
+ if (object==null) {
+ throw new JbpmException("deployment "+deploymentId+" doesn't contain object "+objectName);
+ }
+ }
+ return object;
+ }
+
+ public byte[] getBytes(String deploymentId, String resourceName) {
+ DeploymentImpl deployment = getDeployment(deploymentId);
+ if (deployment==null) {
+ return null;
+ }
+ return deployment.getBytes(resourceName);
+ }
+
+ // queries //////////////////////////////////////////////////////////////////
+
+ public ProcessDefinitionQueryImpl createProcessDefinitionQuery() {
+ return new ProcessDefinitionQueryImpl();
+ }
+
+ public ProcessDefinitionImpl findProcessDefinitionByKey(String processDefinitionKey) {
+ ProcessDefinition processDefinition = createProcessDefinitionQuery()
+ .processDefinitionKey(processDefinitionKey)
+ .orderDesc(ProcessDefinitionQuery.PROPERTY_VERSION)
+ .page(0, 1)
+ .uniqueResult();
+
+ if (processDefinition!=null) {
+ return findProcessDefinitionById(processDefinition.getId());
+ } else {
+ validateRepositoryCache();
+ }
+
+ return null;
+ }
+
+ public ProcessDefinitionImpl findProcessDefinitionById(String processDefinitionId) {
+ DeploymentProperty deploymentProperty = findDeploymentPropertyByProcessDefinitionId(processDefinitionId);
+
+ if (deploymentProperty!=null) {
+ String deploymentId = deploymentProperty.getDeployment().getId();
+ String objectName = deploymentProperty.getObjectName();
+
+ return (ProcessDefinitionImpl) getObject(deploymentId, objectName);
+ } else {
+ validateRepositoryCache();
+ }
+
+ return null;
+ }
+
+ public DeploymentProperty findDeploymentPropertyByProcessDefinitionId(String processDefinitionId) {
+ DeploymentProperty deploymentProperty = (DeploymentProperty) session.createQuery(
+ "select deploymentProperty " +
+ "from "+DeploymentProperty.class.getName()+" as deploymentProperty " +
+ "where deploymentProperty.key = '"+DeploymentImpl.KEY_PROCESS_DEFINITION_ID+"' " +
+ " and deploymentProperty.stringValue = '"+processDefinitionId+"' "
+ ).setMaxResults(1).uniqueResult();
+ return deploymentProperty;
+ }
+
+ /**
+ * Checks if every entry in the repositoryCache is still valid.
+ * If the entry is not found in the database, it is deleted from the cache.
+ */
+ @SuppressWarnings("unchecked")
+ private void validateRepositoryCache() {
+
+ log.trace("Validating repository cache ... ");
+ Set<Long> dbIds = new HashSet<Long>(session.createQuery("select dbid from " +
+ DeploymentImpl.class.getName() + " as deployment ")
+ .setReadOnly(true)
+ .list());
+
+ Set<String> cachedIds = repositoryCache.getCachedDeploymentIds();
+ for (String cachedId : cachedIds) {
+ if (!dbIds.contains(Long.valueOf(cachedId))) {
+ log.trace("Invalid entry in repositorycache found, removing now deployment id " + cachedId);
+ repositoryCache.remove(cachedId);
+ }
+ }
+
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RulesDeployer.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RulesDeployer.java
new file mode 100644
index 0000000..f2bc6cd
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/repository/RulesDeployer.java
@@ -0,0 +1,85 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.repository;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderError;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class RulesDeployer implements Deployer {
+
+ public static final String CACHEKEY_KNOWLEDGEBASE = "KnowledgeBase";
+
+ public void deploy(DeploymentImpl deployment) {
+ KnowledgeBuilder knowledgeBuilder = null;
+
+ for (String resourceName: deployment.getResourceNames()) {
+ if (resourceName.endsWith(".drl")) {
+ if (knowledgeBuilder==null) {
+ knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ }
+
+ byte[] drlBytes = deployment.getBytes(resourceName);
+
+ knowledgeBuilder.add(ResourceFactory.newByteArrayResource(drlBytes), ResourceType.DRL);
+ }
+ }
+
+ if (knowledgeBuilder!=null) {
+ if (knowledgeBuilder.hasErrors()) {
+ for (KnowledgeBuilderError error: knowledgeBuilder.getErrors()) {
+ deployment.addProblem("drl problem: "+error.getMessage());
+ }
+ } else {
+ KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
+ knowledgeBase.addKnowledgePackages(knowledgeBuilder.getKnowledgePackages());
+
+ RepositoryCache repositoryCache = EnvironmentImpl.getFromCurrent(RepositoryCache.class);
+ repositoryCache.set(deployment.getId(), CACHEKEY_KNOWLEDGEBASE, knowledgeBase);
+ }
+ }
+ }
+
+ public static KnowledgeBase getKnowledgeBase(String deploymentId) {
+ return getKnowledgeBase(deploymentId, CACHEKEY_KNOWLEDGEBASE);
+ }
+
+ public static KnowledgeBase getKnowledgeBase(String deploymentId, String knowledgeBaseName) {
+ RepositoryCache repositoryCache = EnvironmentImpl.getFromCurrent(RepositoryCache.class);
+ return (KnowledgeBase) repositoryCache.get(deploymentId, knowledgeBaseName);
+ }
+
+ public void updateResource(DeploymentImpl deployment, String resourceName, byte[] bytes) {
+ if (resourceName.endsWith(".drl")) {
+ throw new UnsupportedOperationException("drl resource updates is not implemented yet. please contribute :-)");
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/BshScriptEngine.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/BshScriptEngine.java
new file mode 100644
index 0000000..3650591
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/BshScriptEngine.java
@@ -0,0 +1,340 @@
+package org.jbpm.pvm.internal.script;
+
+import java.io.*;
+import java.util.Map;
+import javax.script.*;
+import bsh.*;
+import static javax.script.ScriptContext.*;
+
+/*
+ Notes
+ This engine supports open-ended pluggable scriptcontexts
+*/
+public class BshScriptEngine extends AbstractScriptEngine
+ implements Compilable, Invocable
+{
+ // The BeanShell global namespace for the interpreter is stored in the
+ // engine scope map under this key.
+ static final String engineNameSpaceKey = "org_beanshell_engine_namespace";
+
+ private BshScriptEngineFactory factory;
+ private bsh.Interpreter interpreter;
+
+ public BshScriptEngine() {
+ this( null );
+ }
+
+ public BshScriptEngine( BshScriptEngineFactory factory )
+ {
+ this.factory = factory;
+ getInterpreter(); // go ahead and prime the interpreter now
+ }
+
+ protected Interpreter getInterpreter()
+ {
+ if ( interpreter == null ) {
+ this.interpreter = new bsh.Interpreter();
+ interpreter.setNameSpace(null); // should always be set by context
+ }
+
+ return interpreter;
+ }
+
+ public Object eval( String script, ScriptContext scriptContext )
+ throws ScriptException
+ {
+ return evalSource( script, scriptContext );
+ }
+
+ public Object eval( Reader reader, ScriptContext scriptContext )
+ throws ScriptException
+ {
+ return evalSource( reader, scriptContext );
+ }
+
+ /*
+ This is the primary implementation method.
+ We respect the String/Reader difference here in BeanShell because
+ BeanShell will do a few extra things in the string case... e.g.
+ tack on a trailing ";" semicolon if necessary.
+ */
+ private Object evalSource( Object source, ScriptContext scriptContext )
+ throws ScriptException
+ {
+ bsh.NameSpace contextNameSpace = getEngineNameSpace( scriptContext );
+ Interpreter bsh = getInterpreter();
+ bsh.setNameSpace( contextNameSpace );
+
+ // This is a big hack, convert writer to PrintStream
+ bsh.setOut( new PrintStream(
+ new WriterOutputStream( scriptContext.getWriter() ) ) );
+ bsh.setErr( new PrintStream(
+ new WriterOutputStream( scriptContext.getErrorWriter() ) ) );
+
+ try {
+ if ( source instanceof Reader )
+ return bsh.eval( (Reader) source );
+ else
+ return bsh.eval( (String) source );
+ } catch ( ParseException e ) {
+ // explicit parsing error
+ throw new ScriptException(
+ e.toString(), e.getErrorSourceFile(), e.getErrorLineNumber() );
+ } catch ( TargetError e ) {
+ // The script threw an application level exception
+ // set it as the cause ?
+ ScriptException se = new ScriptException(
+ e.toString(), e.getErrorSourceFile(), e.getErrorLineNumber() );
+ se.initCause( e.getTarget() );
+ throw se;
+ } catch ( EvalError e ) {
+ // The script couldn't be evaluated properly
+ throw new ScriptException(
+ e.toString(), e.getErrorSourceFile(), e.getErrorLineNumber() );
+ } catch ( InterpreterError e ) {
+ // The interpreter had a fatal problem
+ throw new ScriptException( e.toString() );
+ }
+ }
+
+
+
+ /*
+ Check the context for an existing global namespace embedded
+ in the script context engine scope. If none exists, ininitialize the
+ context with one.
+ */
+ private static NameSpace getEngineNameSpace( ScriptContext scriptContext )
+ {
+ NameSpace ns = (NameSpace)scriptContext.getAttribute(
+ engineNameSpaceKey, ENGINE_SCOPE );
+
+ if ( ns == null )
+ {
+ // Create a global namespace for the interpreter
+ Map engineView = new ScriptContextEngineView( scriptContext );
+ ns = new ExternalNameSpace(
+ null/*parent*/, "javax_script_context", engineView );
+
+ scriptContext.setAttribute( engineNameSpaceKey, ns, ENGINE_SCOPE );
+ }
+
+ return ns;
+ }
+
+ public Bindings createBindings()
+ {
+ return new SimpleBindings();
+ }
+
+ public ScriptEngineFactory getFactory()
+ {
+ if ( factory == null )
+ factory = new BshScriptEngineFactory();
+ return factory;
+ }
+
+ /**
+ * Compiles the script (source represented as a <code>String</code>) for later
+ * execution.
+ *
+ * @param script The source of the script, represented as a
+ * <code>String</code>.
+ *
+ * @return An subclass of <code>CompiledScript</code> to be executed later
+ * using one of the <code>eval</code> methods of <code>CompiledScript</code>.
+ *
+ * @throws ScriptException if compilation fails.
+ * @throws NullPointerException if the argument is null.
+ */
+
+ public CompiledScript compile( String script ) throws
+ ScriptException
+ {
+ return compile( new StringReader( script ) );
+ }
+
+ /**
+ * Compiles the script (source read from <code>Reader</code>) for later
+ * execution. Functionality is identical to <code>compile(String)</code> other
+ * than the way in which the source is passed.
+ *
+ * @param script The reader from which the script source is obtained.
+ *
+ * @return An implementation of <code>CompiledScript</code> to be executed
+ * later using one of its <code>eval</code> methods of
+ * <code>CompiledScript</code>.
+ *
+ * @throws ScriptException if compilation fails.
+ * @throws NullPointerException if argument is null.
+ */
+ public CompiledScript compile( Reader script ) throws
+ ScriptException
+ {
+ // todo
+ throw new Error("unimplemented");
+ }
+
+ /**
+ * Calls a procedure compiled during a previous script execution, which is
+ * retained in the state of the <code>ScriptEngine<code>.
+ *
+ * @param name The name of the script method to be called.
+ * @param thiz thiz is an instance of the script class returned by a previous execution or
+ * invocation, the named method is called through that instance.
+ * @param args Arguments to pass to the procedure. The rules for converting
+ * the arguments to scripting variables are implementation-specific.
+ *
+ * @return The value returned by the method. The rules for converting the
+ * scripting variable returned by the procedure to a Java Object are
+ * implementation-specific.
+ *
+ * @throws javax.script.ScriptException if an error occurrs during invocation
+ * of the method.
+ * @throws NoSuchMethodException if method with given name or matching argument
+ * types cannot be found.
+ * @throws NullPointerException if method name is null.
+ */
+ public Object invokeMethod( Object thiz, String name, Object... args ) throws ScriptException, NoSuchMethodException
+ {
+ if ( ! (thiz instanceof bsh.This) )
+ throw new ScriptException( "Illegal objec type: " +thiz.getClass() );
+
+ bsh.This bshObject = (bsh.This)thiz;
+
+ try {
+ return bshObject.invokeMethod( name, args );
+ } catch ( ParseException e ) {
+ // explicit parsing error
+ throw new ScriptException(
+ e.toString(), e.getErrorSourceFile(), e.getErrorLineNumber() );
+ } catch ( TargetError e ) {
+ // The script threw an application level exception
+ // set it as the cause ?
+ ScriptException se = new ScriptException(
+ e.toString(), e.getErrorSourceFile(), e.getErrorLineNumber() );
+ se.initCause( e.getTarget() );
+ throw se;
+ } catch ( EvalError e ) {
+ // The script couldn't be evaluated properly
+ throw new ScriptException(
+ e.toString(), e.getErrorSourceFile(), e.getErrorLineNumber() );
+ } catch ( InterpreterError e ) {
+ // The interpreter had a fatal problem
+ throw new ScriptException( e.toString() );
+ }
+ }
+
+ /**
+ * Used to call top-level procedures defined in scripts.
+ *
+ * @param name Name of the procedure
+ * @param args Arguments to pass to the procedure
+ *
+ * @return The value returned by the procedure
+ *
+ * @throws javax.script.ScriptException if an error occurrs during invocation
+ * of the method.
+ * @throws NoSuchMethodException if procedure with given name or matching
+ * argument types cannot be found.
+ * @throws NullPointerException if procedure name is null.
+ */
+ public Object invokeFunction( String name, Object... args )
+ throws ScriptException, NoSuchMethodException
+ {
+ return invokeMethod( getGlobal(), name, args );
+ }
+
+ /**
+ * Returns an implementation of an interface using procedures compiled in the
+ * interpreter. The methods of the interface may be implemented using the
+ * <code>invokeFunction</code> method.
+ *
+ * @param clasz The <code>Class</code> object of the interface to return.
+ *
+ * @return An instance of requested interface - null if the requested interface
+ * is unavailable, i. e. if compiled methods in the
+ * <code>ScriptEngine</code> cannot be found matching the ones in the
+ * requested interface.
+ *
+ * @throws IllegalArgumentException if the specified <code>Class</code> object
+ * does not exist or is not an interface.
+ */
+ public <T> T getInterface( Class<T> clasz )
+ {
+ try {
+ return (T) getGlobal().getInterface( clasz );
+ } catch ( UtilEvalError utilEvalError ) {
+ utilEvalError.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * Returns an implementation of an interface using member functions of a
+ * scripting object compiled in the interpreter. The methods of the interface
+ * may be implemented using invokeMethod(Object, String, Object...) method.
+ *
+ * @param thiz The scripting object whose member functions are used to
+ * implement the methods of the interface.
+ * @param clasz The <code>Class</code> object of the interface to return.
+ *
+ * @return An instance of requested interface - null if the requested
+ * interface is unavailable, i. e. if compiled methods in the
+ * <code>ScriptEngine</code> cannot be found matching the ones in the
+ * requested interface.
+ *
+ * @throws IllegalArgumentException if the specified <code>Class</code> object
+ * does not exist or is not an interface, or if the specified Object is null
+ * or does not represent a scripting object.
+ */
+ public <T> T getInterface( Object thiz, Class<T> clasz )
+ {
+ if ( !(thiz instanceof bsh.This) )
+ throw new IllegalArgumentException(
+ "invalid object type: "+thiz.getClass() );
+
+ try {
+ bsh.This bshThis = (bsh.This)thiz;
+ return (T) bshThis.getInterface( clasz );
+ } catch ( UtilEvalError utilEvalError ) {
+ utilEvalError.printStackTrace( System.err );
+ return null;
+ }
+ }
+
+ private bsh.This getGlobal()
+ {
+ // requires 2.0b5 to make getThis() public
+ return getEngineNameSpace( getContext() ).getThis( getInterpreter() );
+ }
+
+ /*
+ This is a total hack. We need to introduce a writer to the
+ Interpreter.
+ */
+ class WriterOutputStream extends OutputStream
+ {
+ Writer writer;
+ WriterOutputStream( Writer writer )
+ {
+ this.writer = writer;
+ }
+
+ public void write( int b ) throws IOException
+ {
+ writer.write(b);
+ }
+
+ public void flush() throws IOException
+ {
+ writer.flush();
+ }
+
+ public void close() throws IOException
+ {
+ writer.close();
+ }
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/BshScriptEngineFactory.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/BshScriptEngineFactory.java
new file mode 100644
index 0000000..7a14d72
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/BshScriptEngineFactory.java
@@ -0,0 +1,115 @@
+package org.jbpm.pvm.internal.script;
+
+import javax.script.*;
+import java.util.List;
+import java.util.Arrays;
+
+public class BshScriptEngineFactory implements
+ javax.script.ScriptEngineFactory
+{
+ // Begin impl ScriptEnginInfo
+
+ final List<String> extensions = Arrays.asList( "bsh", "java" );
+
+ final List<String> mimeTypes = Arrays.asList(
+ "application/x-beanshell",
+ "application/x-bsh",
+ "application/x-java-source"
+ );
+
+ final List<String> names = Arrays.asList( "beanshell", "bsh", "java" );
+
+ public String getEngineName() {
+ return "BeanShell Engine";
+ }
+
+ public String getEngineVersion() {
+ return "1.0";
+ }
+
+ public List<String> getExtensions() {
+ return extensions;
+ }
+
+ public List<String> getMimeTypes() {
+ return mimeTypes;
+ }
+
+ public List<String> getNames() {
+ return names;
+ }
+
+ public String getLanguageName() {
+ return "BeanShell";
+ }
+
+ public String getLanguageVersion() {
+ return bsh.Interpreter.VERSION + "";
+ }
+
+ public Object getParameter( String param ) {
+ if ( param.equals( ScriptEngine.ENGINE ) )
+ return getEngineName();
+ if ( param.equals( ScriptEngine.ENGINE_VERSION ) )
+ return getEngineVersion();
+ if ( param.equals( ScriptEngine.NAME ) )
+ return getEngineName();
+ if ( param.equals( ScriptEngine.LANGUAGE ) )
+ return getLanguageName();
+ if ( param.equals( ScriptEngine.LANGUAGE_VERSION ) )
+ return getLanguageVersion();
+ if ( param.equals( "THREADING" ) )
+ return "MULTITHREADED";
+
+ return null;
+ }
+
+ public String getMethodCallSyntax(
+ String objectName, String methodName, String ... args )
+ {
+ // Note: this is very close to the bsh.StringUtil.methodString()
+ // method, which constructs a method signature from arg *types*. Maybe
+ // combine these later.
+
+ StringBuilder sb = new StringBuilder();
+ if ( objectName != null )
+ sb.append( objectName + "." );
+ sb.append( methodName + "(" );
+ if ( args.length > 0 )
+ sb.append(" ");
+ for( int i=0; i<args.length; i++ )
+ sb.append( ( (args[i] == null) ? "null" : args[i] )
+ + ( i < (args.length-1) ? ", " : " " ) );
+ sb.append(")");
+ return sb.toString();
+ }
+
+ public String getOutputStatement( String message ) {
+ return "print( \"" + message + "\" );";
+ }
+
+ public String getProgram( String ... statements )
+ {
+ StringBuilder sb = new StringBuilder();
+ for( int i=0; i< statements.length; i++ )
+ {
+ sb.append( statements[i] );
+ if ( !statements[i].endsWith(";") )
+ sb.append( ";" );
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+
+ // End impl ScriptEngineInfo
+
+ // Begin impl ScriptEngineFactory
+
+ public ScriptEngine getScriptEngine()
+ {
+ return new BshScriptEngine();
+ }
+
+ // End impl ScriptEngineFactory
+}
+
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/EnvironmentBindings.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/EnvironmentBindings.java
new file mode 100644
index 0000000..0a403aa
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/EnvironmentBindings.java
@@ -0,0 +1,91 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.script;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+
+import javax.script.Bindings;
+
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class EnvironmentBindings implements Bindings {
+
+ protected EnvironmentImpl environment;
+
+ public EnvironmentBindings(String[] readContextNames, String writeContextName) {
+ environment = EnvironmentImpl.getCurrent();
+ }
+
+ public Object get(Object key) {
+ return environment.get((String)key);
+ }
+
+ public boolean containsKey(Object key) {
+ return (get(key)!=null);
+ }
+
+ public Object put(String key, Object value) {
+ return null;
+ }
+
+ public void putAll(Map< ? extends String, ? extends Object> toMerge) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Object remove(Object key) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void clear() {
+ throw new UnsupportedOperationException();
+ }
+
+ public boolean containsValue(Object value) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Set<java.util.Map.Entry<String, Object>> entrySet() {
+ throw new UnsupportedOperationException();
+ }
+
+ public boolean isEmpty() {
+ throw new UnsupportedOperationException();
+ }
+
+ public Set<String> keySet() {
+ throw new UnsupportedOperationException();
+ }
+
+ public int size() {
+ throw new UnsupportedOperationException();
+ }
+
+ public Collection<Object> values() {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/GroovyCompiledScript.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/GroovyCompiledScript.java
new file mode 100644
index 0000000..15e70c2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/GroovyCompiledScript.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met: Redistributions of source code
+ * must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution. Neither the name of the Sun Microsystems nor the names of
+ * is contributors may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * GroovyCompiledScript.java
+ * @author Mike Grogan
+ * @author A. Sundararajan
+ */
+
+package org.jbpm.pvm.internal.script;
+import javax.script.*;
+
+
+public class GroovyCompiledScript extends CompiledScript {
+
+ private GroovyScriptEngine engine;
+ private Class clasz;
+
+ public GroovyCompiledScript(GroovyScriptEngine engine, Class clasz) {
+ this.engine = engine;
+ this.clasz = clasz;
+ }
+
+ public Object eval(ScriptContext context) throws ScriptException {
+ return engine.eval(clasz, context);
+ }
+
+ public ScriptEngine getEngine() {
+ return engine;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/GroovyScriptEngine.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/GroovyScriptEngine.java
new file mode 100644
index 0000000..272e1df
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/GroovyScriptEngine.java
@@ -0,0 +1,356 @@
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met: Redistributions of source code
+ * must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution. Neither the name of the Sun Microsystems nor the names of
+ * is contributors may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+/*
+ * GroovyScriptEngine.java
+ * @author Mike Grogan
+ * @author A. Sundararajan
+ */
+package org.jbpm.pvm.internal.script;
+import java.io.*;
+import java.util.*;
+import javax.script.*;
+import groovy.lang.*;
+import org.codehaus.groovy.syntax.SyntaxException;
+import org.codehaus.groovy.runtime.InvokerHelper;
+import org.codehaus.groovy.runtime.MetaClassHelper;
+import org.codehaus.groovy.runtime.MethodClosure;
+import org.codehaus.groovy.control.CompilerConfiguration;
+import org.codehaus.groovy.control.CompilationFailedException;
+import java.lang.reflect.*;
+
+public class GroovyScriptEngine
+ extends AbstractScriptEngine implements Compilable, Invocable {
+
+ private static boolean DEBUG = false;
+
+ // script-string-to-generated Class map
+ private Map<String, Class> classMap;
+ // global closures map - this is used to simulate a single
+ // global functions namespace
+ private Map<String, Closure> globalClosures;
+ // class loader for Groovy generated classes
+ private GroovyClassLoader loader;
+ // lazily initialized factory
+ private volatile GroovyScriptEngineFactory factory;
+
+ // counter used to generate unique global Script class names
+ private static int counter;
+
+ static {
+ counter = 0;
+ }
+
+ public GroovyScriptEngine() {
+ classMap = Collections.synchronizedMap(new HashMap<String, Class>());
+ globalClosures = Collections.synchronizedMap(new HashMap<String, Closure>());
+ loader = new GroovyClassLoader(getParentLoader(),
+ new CompilerConfiguration());
+ }
+
+ public Object eval(Reader reader, ScriptContext ctx)
+ throws ScriptException {
+ return eval(readFully(reader), ctx);
+ }
+
+ public Object eval(String script, ScriptContext ctx)
+ throws ScriptException {
+ try {
+ return eval(getScriptClass(script), ctx);
+ } catch (SyntaxException e) {
+ throw new ScriptException(e.getMessage(),
+ e.getSourceLocator(), e.getLine());
+ } catch (Exception e) {
+ if (DEBUG) e.printStackTrace();
+ throw new ScriptException(e);
+ }
+ }
+
+ public Bindings createBindings() {
+ return new SimpleBindings();
+ }
+
+ public ScriptEngineFactory getFactory() {
+ if (factory == null) {
+ synchronized (this) {
+ if (factory == null) {
+ factory = new GroovyScriptEngineFactory();
+ }
+ }
+ }
+ return factory;
+ }
+
+ // javax.script.Compilable methods
+ public CompiledScript compile(String scriptSource) throws ScriptException {
+ try {
+ return new GroovyCompiledScript(this,
+ getScriptClass(scriptSource));
+ } catch (SyntaxException e) {
+ throw new ScriptException(e.getMessage(),
+ e.getSourceLocator(), e.getLine());
+ } catch (IOException e) {
+ throw new ScriptException(e);
+ } catch (CompilationFailedException ee) {
+ throw new ScriptException(ee);
+ }
+ }
+
+ public CompiledScript compile(Reader reader) throws ScriptException {
+ return compile(readFully(reader));
+ }
+
+ // javax.script.Invocable methods.
+ public Object invokeFunction(String name, Object... args)
+ throws ScriptException, NoSuchMethodException {
+ return invokeImpl(null, name, args);
+ }
+
+ public Object invokeMethod(Object thiz, String name, Object... args)
+ throws ScriptException, NoSuchMethodException {
+ if (thiz == null) {
+ throw new IllegalArgumentException("script object is null");
+ }
+ return invokeImpl(thiz, name, args);
+ }
+
+ public <T> T getInterface(Class<T> clasz) {
+ return makeInterface(null, clasz);
+ }
+
+ public <T> T getInterface(Object thiz, Class<T> clasz) {
+ if (thiz == null) {
+ throw new IllegalArgumentException("script object is null");
+ }
+ return makeInterface(thiz, clasz);
+ }
+
+ // package-privates
+ Object eval(Class scriptClass, final ScriptContext ctx) throws ScriptException {
+ //add context to bindings
+ ctx.setAttribute("context", ctx, ScriptContext.ENGINE_SCOPE);
+
+ //direct output to ctx.getWriter
+ Writer writer = ctx.getWriter();
+ ctx.setAttribute("out", (writer instanceof PrintWriter) ?
+ writer :
+ new PrintWriter(writer),
+ ScriptContext.ENGINE_SCOPE);
+ /*
+ * We use the following Binding instance so that global variable lookup
+ * will be done in the current ScriptContext instance.
+ */
+ Binding binding = new Binding(ctx.getBindings(ScriptContext.ENGINE_SCOPE)) {
+ @Override
+ public Object getVariable(String name) {
+ synchronized (ctx) {
+ int scope = ctx.getAttributesScope(name);
+ if (scope != -1) {
+ return ctx.getAttribute(name, scope);
+ }
+ }
+ throw new MissingPropertyException(name, getClass());
+ }
+ @Override
+ public void setVariable(String name, Object value) {
+ synchronized (ctx) {
+ int scope = ctx.getAttributesScope(name);
+ if (scope == -1) {
+ scope = ScriptContext.ENGINE_SCOPE;
+ }
+ ctx.setAttribute(name, value, scope);
+ }
+ }
+ };
+
+ try {
+ Script scriptObject = InvokerHelper.createScript(scriptClass, binding);
+
+ // create a Map of MethodClosures from this new script object
+ Method[] methods = scriptClass.getMethods();
+ Map<String, Closure> closures = new HashMap<String, Closure>();
+ for (Method m : methods) {
+ String name = m.getName();
+ closures.put(name, new MethodClosure(scriptObject, name));
+ }
+
+ // save all current closures into global closures map
+ globalClosures.putAll(closures);
+
+ MetaClass oldMetaClass = scriptObject.getMetaClass();
+
+ /*
+ * We override the MetaClass of this script object so that we can
+ * forward calls to global closures (of previous or future "eval" calls)
+ * This gives the illusion of working on the same "global" scope.
+ */
+ scriptObject.setMetaClass(new DelegatingMetaClass(oldMetaClass) {
+ @Override
+ public Object invokeMethod(Object object, String name, Object args) {
+ if (args == null) {
+ return invokeMethod(object, name, MetaClassHelper.EMPTY_ARRAY);
+ }
+ if (args instanceof Tuple) {
+ return invokeMethod(object, name, ((Tuple)args).toArray());
+ }
+ if (args instanceof Object[]) {
+ return invokeMethod(object, name, (Object[]) args);
+ } else {
+ return invokeMethod(object, name, new Object[] { args });
+ }
+ }
+
+ @Override
+ public Object invokeMethod(Object object, String name, Object[] args) {
+ try {
+ return super.invokeMethod(object, name, args);
+ } catch (MissingMethodException mme) {
+ return callGlobal(name, args, ctx);
+ }
+ }
+ @Override
+ public Object invokeStaticMethod(Object object, String name, Object[] args) {
+ try {
+ return super.invokeStaticMethod(object, name, args);
+ } catch (MissingMethodException mme) {
+ return callGlobal(name, args, ctx);
+ }
+ }
+ });
+
+ return scriptObject.run();
+ } catch (Exception e) {
+ throw new ScriptException(e);
+ }
+ }
+
+ Class getScriptClass(String script)
+ throws SyntaxException,
+ CompilationFailedException,
+ IOException {
+ Class clazz = classMap.get(script);
+ if (clazz != null) {
+ return clazz;
+ }
+
+ InputStream stream = new ByteArrayInputStream(script.getBytes());
+ clazz = loader.parseClass(stream, generateScriptName());
+ classMap.put(script, clazz);
+ return clazz;
+ }
+
+ //-- Internals only below this point
+
+ // invokes the specified method/function on the given object.
+ private Object invokeImpl(Object thiz, String name, Object... args)
+ throws ScriptException, NoSuchMethodException {
+ if (name == null) {
+ throw new NullPointerException("method name is null");
+ }
+
+ try {
+ if (thiz != null) {
+ return InvokerHelper.invokeMethod(thiz, name, args);
+ } else {
+ return callGlobal(name, args);
+ }
+ } catch (MissingMethodException mme) {
+ throw new NoSuchMethodException(mme.getMessage());
+ } catch (Exception e) {
+ throw new ScriptException(e);
+ }
+ }
+
+ // call the script global function of the given name
+ private Object callGlobal(String name, Object[] args) {
+ return callGlobal(name, args, context);
+ }
+
+ private Object callGlobal(String name, Object[] args, ScriptContext ctx) {
+ Closure closure = globalClosures.get(name);
+ if (closure != null) {
+ return closure.call(args);
+ } else {
+ // Look for closure valued variable in the
+ // given ScriptContext. If available, call it.
+ Object value = ctx.getAttribute(name);
+ if (value instanceof Closure) {
+ return ((Closure)value).call(args);
+ } // else fall thru..
+ }
+ throw new MissingMethodException(name, getClass(), args);
+ }
+
+ // generate a unique name for top-level Script classes
+ private synchronized String generateScriptName() {
+ return "Script" + (++counter) + ".groovy";
+ }
+
+ private <T> T makeInterface(Object obj, Class<T> clazz) {
+ final Object thiz = obj;
+ if (clazz == null || !clazz.isInterface()) {
+ throw new IllegalArgumentException("interface Class expected");
+ }
+ return (T) Proxy.newProxyInstance(
+ clazz.getClassLoader(),
+ new Class[] { clazz },
+ new InvocationHandler() {
+ public Object invoke(Object proxy, Method m, Object[] args)
+ throws Throwable {
+ return invokeImpl(thiz, m.getName(), args);
+ }
+ });
+ }
+
+ // determine appropriate class loader to serve as parent loader
+ // for GroovyClassLoader instance
+ private ClassLoader getParentLoader() {
+ // check whether thread context loader can "see" Groovy Script class
+ ClassLoader ctxtLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ Class c = ctxtLoader.loadClass("org.codehaus.groovy.Script");
+ if (c == Script.class) {
+ return ctxtLoader;
+ }
+ } catch (ClassNotFoundException cnfe) {
+ }
+ // exception was thrown or we get wrong class
+ return Script.class.getClassLoader();
+ }
+
+ private String readFully(Reader reader) throws ScriptException {
+ char[] arr = new char[8*1024]; // 8K at a time
+ StringBuilder buf = new StringBuilder();
+ int numChars;
+ try {
+ while ((numChars = reader.read(arr, 0, arr.length)) > 0) {
+ buf.append(arr, 0, numChars);
+ }
+ } catch (IOException exp) {
+ throw new ScriptException(exp);
+ }
+ return buf.toString();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/GroovyScriptEngineFactory.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/GroovyScriptEngineFactory.java
new file mode 100644
index 0000000..f10b3f7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/GroovyScriptEngineFactory.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met: Redistributions of source code
+ * must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution. Neither the name of the Sun Microsystems nor the names of
+ * is contributors may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * GroovyScriptEngineFactory.java
+ * @author Mike Grogan
+ * @author A. Sundararajan
+ */
+
+package org.jbpm.pvm.internal.script;
+
+import javax.script.*;
+import java.util.*;
+
+public class GroovyScriptEngineFactory implements ScriptEngineFactory {
+
+ private static String VERSION = "1.5.6";
+
+ public String getEngineName() {
+ return "groovy";
+ }
+
+ public String getEngineVersion() {
+ return org.codehaus.groovy.runtime.InvokerHelper.getVersion();
+ }
+
+ public String getLanguageName() {
+ return "groovy";
+ }
+
+ public String getLanguageVersion() {
+ return VERSION;
+ }
+
+ public List<String> getExtensions() {
+ return extensions;
+ }
+
+ public List<String> getMimeTypes() {
+ return mimeTypes;
+ }
+
+ public List<String> getNames() {
+ return names;
+ }
+
+ public Object getParameter(String key) {
+
+ if (ScriptEngine.NAME.equals(key)) {
+ return "Groovy";
+ } else if (ScriptEngine.ENGINE.equals(key)) {
+ return "Groovy Script Engine";
+ } else if (ScriptEngine.ENGINE_VERSION.equals(key)) {
+ return org.codehaus.groovy.runtime.InvokerHelper.getVersion();
+ } else if (ScriptEngine.LANGUAGE.equals(key)) {
+ return "Groovy";
+ } else if (ScriptEngine.LANGUAGE_VERSION.equals(key)) {
+ return VERSION;
+ } else if ("THREADING".equals(key)) {
+ return "MULTITHREADED";
+ } else {
+ throw new IllegalArgumentException("Invalid key");
+ }
+
+ }
+
+
+ public ScriptEngine getScriptEngine() {
+ return new GroovyScriptEngine();
+ }
+
+ public String getMethodCallSyntax(String obj, String method,
+ String... args) {
+
+ String ret = obj + "." + method + "(";
+ int len = args.length;
+ if (len == 0) {
+ ret += ")";
+ return ret;
+ }
+
+ for (int i = 0; i < len; i++) {
+ ret += args[i];
+ if (i != len - 1) {
+ ret += ",";
+ } else {
+ ret += ")";
+ }
+ }
+ return ret;
+ }
+
+ public String getOutputStatement(String toDisplay) {
+ StringBuilder buf = new StringBuilder();
+ buf.append("println(\"");
+ int len = toDisplay.length();
+ for (int i = 0; i < len; i++) {
+ char ch = toDisplay.charAt(i);
+ switch (ch) {
+ case '"':
+ buf.append("\\\"");
+ break;
+ case '\\':
+ buf.append("\\\\");
+ break;
+ default:
+ buf.append(ch);
+ break;
+ }
+ }
+ buf.append("\")");
+ return buf.toString();
+ }
+
+ public String getProgram(String... statements) {
+ StringBuilder ret = new StringBuilder();
+ int len = statements.length;
+ for (int i = 0; i < len; i++) {
+ ret.append(statements[i]);
+ ret.append('\n');
+ }
+ return ret.toString();
+ }
+
+ private static List<String> names;
+ private static List<String> extensions;
+ private static List<String> mimeTypes;
+
+ static {
+ names = new ArrayList<String>(1);
+ names.add("groovy");
+ names = Collections.unmodifiableList(names);
+
+ extensions = names;
+
+ mimeTypes = new ArrayList<String>(0);
+ mimeTypes = Collections.unmodifiableList(mimeTypes);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/JuelScriptEngine.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/JuelScriptEngine.java
new file mode 100644
index 0000000..e6a9bd4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/JuelScriptEngine.java
@@ -0,0 +1,387 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.script;
+
+import de.odysseus.el.util.SimpleResolver;
+
+import javax.el.*;
+import javax.script.*;
+import java.io.IOException;
+import java.io.Reader;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
+class JuelScriptEngine extends AbstractScriptEngine
+ implements Compilable
+{
+ private ScriptEngineFactory factory;
+ private ExpressionFactory exprFactory;
+
+ public JuelScriptEngine(ScriptEngineFactory factory)
+ {
+ this.factory = factory;
+ this.exprFactory = new de.odysseus.el.ExpressionFactoryImpl();
+ }
+
+ public CompiledScript compile(String script)
+ throws ScriptException
+ {
+ ValueExpression expr = parse(script, this.context);
+
+ return new JuelCompiledScript(this, expr);
+ }
+
+ public CompiledScript compile(Reader reader)
+ throws ScriptException
+ {
+ return compile(readFully(reader));
+ }
+
+ public Object eval(String script, ScriptContext ctx)
+ throws ScriptException
+ {
+ ValueExpression expr = parse(script, ctx);
+
+ return evalExpr(expr, ctx);
+ }
+
+ public Object eval(Reader reader, ScriptContext ctx)
+ throws ScriptException
+ {
+ return eval(readFully(reader), ctx);
+ }
+
+ public ScriptEngineFactory getFactory()
+ {
+ synchronized (this)
+ {
+ if (this.factory == null)
+ {
+ this.factory = new JuelScriptEngineFactory();
+ }
+
+ }
+
+ return this.factory;
+ }
+
+ public Bindings createBindings()
+ {
+ return new SimpleBindings();
+ }
+
+ private ELContext toELContext(final ScriptContext ctx)
+ {
+ Object tmp = ctx.getAttribute("elcontext");
+
+ if (tmp instanceof ELContext)
+ {
+ return ((ELContext)tmp);
+ }
+
+ ctx.setAttribute("context", ctx, 100);
+
+ ctx.setAttribute("out:print", getPrintMethod(), 100);
+
+ SecurityManager manager = System.getSecurityManager();
+
+ if (manager == null)
+ {
+ ctx.setAttribute("lang:import", getImportMethod(), 100);
+ }
+
+ ELContext elContext = new ELContext()
+ {
+ ELResolver resolver = makeResolver();
+ VariableMapper varMapper = new ScriptContextVariableMapper(ctx);
+ FunctionMapper funcMapper = new ScriptContextFunctionMapper(ctx);
+
+ public ELResolver getELResolver()
+ {
+ return this.resolver;
+ }
+
+ public VariableMapper getVariableMapper()
+ {
+ return this.varMapper;
+ }
+
+ public FunctionMapper getFunctionMapper()
+ {
+ return this.funcMapper;
+ }
+
+ };
+
+ ctx.setAttribute("elcontext", elContext, 100);
+
+ return elContext;
+ }
+
+ private ELResolver makeResolver()
+ {
+ CompositeELResolver chain = new CompositeELResolver();
+
+ chain.add(new ArrayELResolver());
+
+ chain.add(new ListELResolver());
+
+ chain.add(new MapELResolver());
+
+ chain.add(new ResourceBundleELResolver());
+
+ chain.add(new BeanELResolver());
+
+ return new SimpleResolver(chain);
+ }
+
+ private ValueExpression parse(String script, ScriptContext ctx)
+ throws ScriptException
+ {
+ try
+ {
+ return this.exprFactory.createValueExpression(
+ toELContext(ctx), script, Object.class);
+ }
+ catch (ELException elexp)
+ {
+ throw new ScriptException(elexp);
+ }
+ }
+
+ private Object evalExpr(ValueExpression expr, ScriptContext ctx)
+ throws ScriptException
+ {
+ try
+ {
+ return expr.getValue(toELContext(ctx));
+ }
+ catch (ELException elexp)
+ {
+ throw new ScriptException(elexp);
+ }
+ }
+
+ private String readFully(Reader reader)
+ throws ScriptException
+ {
+ int numChars;
+ char[] arr = new char[8192];
+
+ StringBuilder text = new StringBuilder();
+ try
+ {
+ while ((numChars = reader.read(arr, 0, arr.length)) > 0)
+ {
+ text.append(arr, 0, numChars);
+ }
+
+ }
+ catch (IOException exp)
+ {
+ throw new ScriptException(exp);
+ }
+
+ return text.toString();
+ }
+
+ private static Method getPrintMethod()
+ {
+ Class myClass;
+ try
+ {
+ myClass = JuelScriptEngine.class;
+
+ Method method = myClass.getMethod(
+ "print", new Class[] { Object.class });
+
+ return method;
+ }
+ catch (Exception exp)
+ {
+ }
+
+ return null;
+ }
+
+ public static void print(Object obj)
+ {
+ System.out.print(obj);
+ }
+
+ private static Method getImportMethod()
+ {
+ Class myClass;
+ try
+ {
+ myClass = JuelScriptEngine.class;
+
+ Method method = myClass.getMethod(
+ "importFunctions",
+ new Class[] { ScriptContext.class,
+ String.class,
+ Object.class });
+
+ return method;
+ }
+ catch (Exception exp)
+ {
+ }
+
+ return null;
+ }
+
+ public static void importFunctions(ScriptContext ctx, String namespace, Object obj)
+ {
+ Class clazz = null;
+
+ if (obj instanceof Class)
+ {
+ clazz = (Class)obj;
+ } else {
+ if (obj instanceof String)
+ {
+ try
+ {
+ clazz = Class.forName((String)obj);
+ }
+ catch (ClassNotFoundException cnfe)
+ {
+ throw new ELException(cnfe);
+ }
+
+ }
+
+ throw new ELException("Class or class name is missing");
+ }
+
+ Method[] methods = clazz.getMethods();
+
+ for (Method m : methods)
+ {
+ int mod = m.getModifiers();
+
+ if ((Modifier.isStatic(mod)) &&
+ (Modifier.isPublic(mod)))
+ {
+ String name = namespace + ":" + m.getName();
+
+ ctx.setAttribute(name, m,
+ 100);
+ }
+ }
+ }
+
+ private class JuelCompiledScript extends CompiledScript
+ {
+ private ValueExpression expr;
+ private ScriptEngine engine;
+
+ JuelCompiledScript(ScriptEngine engine, ValueExpression expr)
+ {
+ this.engine = engine;
+ this.expr = expr;
+ }
+
+ public ScriptEngine getEngine()
+ {
+ return engine;
+ }
+
+ public Object eval(ScriptContext ctx)
+ throws ScriptException
+ {
+ return engine.eval(this.expr.getExpressionString(), ctx);
+ }
+ }
+
+ private class ScriptContextFunctionMapper extends FunctionMapper
+ {
+ private ScriptContext ctx;
+
+ ScriptContextFunctionMapper(ScriptContext ctx)
+ {
+ this.ctx = ctx;
+ }
+
+ private String getFullName(String prefix, String localName)
+ {
+ return prefix + ":" + localName;
+ }
+
+ public Method resolveFunction(String prefix, String localName)
+ {
+ String fullName = getFullName(prefix, localName);
+
+ int scope = this.ctx.getAttributesScope(fullName);
+
+ if (scope != -1)
+ {
+ Object tmp = this.ctx.getAttribute(fullName);
+
+ return ((tmp instanceof Method) ? (Method)tmp : null);
+ }
+
+ return null;
+ }
+ }
+
+ private class ScriptContextVariableMapper extends VariableMapper
+ {
+ private ScriptContext ctx;
+
+ ScriptContextVariableMapper(ScriptContext ctx)
+ {
+ this.ctx = ctx;
+ }
+
+ public ValueExpression resolveVariable(String variable)
+ {
+ int scope = this.ctx.getAttributesScope(variable);
+
+ if (scope != -1)
+ {
+ Object value = this.ctx.getAttribute(variable, scope);
+
+ if (value instanceof ValueExpression)
+ {
+ return ((ValueExpression)value);
+ }
+
+ return exprFactory.createValueExpression(
+ value, Object.class);
+ }
+
+ return null;
+ }
+
+
+ public ValueExpression setVariable(String variable, ValueExpression value)
+ {
+ ValueExpression oldValue = resolveVariable(variable);
+
+ this.ctx.setAttribute(variable, value, 100);
+
+ return oldValue;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/JuelScriptEngineFactory.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/JuelScriptEngineFactory.java
new file mode 100644
index 0000000..7ba4715
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/JuelScriptEngineFactory.java
@@ -0,0 +1,187 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.script;
+
+import javax.script.ScriptEngineFactory;
+import javax.script.ScriptEngine;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
+
+/**
+ * https://jira.jboss.org/jira/browse/JBPM-2120
+ *
+ * @author Heiko.Braun <heiko.braun@jboss.com>
+ */
+public class JuelScriptEngineFactory implements ScriptEngineFactory
+{
+
+ private static List<String> names = new ArrayList(1);
+ private static List<String> extensions;
+ private static List<String> mimeTypes;
+
+ public JuelScriptEngineFactory()
+ {
+ super();
+ }
+
+ static
+ {
+ names.add("juel");
+
+ names = Collections.unmodifiableList(names);
+
+ extensions = names;
+
+ mimeTypes = new ArrayList(0);
+
+ mimeTypes = Collections.unmodifiableList(mimeTypes);
+ }
+
+ public String getEngineName()
+ {
+ return "juel";
+ }
+
+ public String getEngineVersion()
+ {
+ return de.odysseus.el.ExpressionFactoryImpl.class.getPackage().getImplementationVersion();
+ }
+
+ public List<String> getExtensions()
+ {
+ return extensions;
+ }
+
+ public String getLanguageName()
+ {
+ return "JSP 2.1 EL";
+ }
+
+ public String getLanguageVersion()
+ {
+ return "2.1";
+ }
+
+ public String getMethodCallSyntax(String obj, String m, String[] args)
+ {
+ throw new UnsupportedOperationException("getMethodCallSyntax");
+ }
+
+ public List<String> getMimeTypes()
+ {
+ return mimeTypes;
+ }
+
+ public List<String> getNames()
+ {
+ return names;
+ }
+
+ public String getOutputStatement(String toDisplay)
+ {
+ StringBuilder statement = new StringBuilder();
+
+ statement.append("out:print(\"");
+
+ int len = toDisplay.length();
+
+ for (int i = 0; i < len; ++i)
+ {
+ char ch = toDisplay.charAt(i);
+
+ switch (ch)
+ {
+ case '"':
+ statement.append("\\\"");
+
+ break;
+ case '\\':
+ statement.append("\\\\");
+
+ break;
+ default:
+ statement.append(ch);
+ }
+
+ }
+
+ statement.append("\")");
+
+ return statement.toString();
+ }
+
+ public String getParameter(String key)
+ {
+ if (key.equals("javax.script.name"))
+ {
+ return getLanguageName();
+ }
+ if (key.equals("javax.script.engine"))
+ {
+ return getEngineName();
+ }
+ if (key.equals("javax.script.engine_version"))
+ {
+ return getEngineVersion();
+ }
+ if (key.equals("javax.script.language"))
+ {
+ return getLanguageName();
+ }
+ if (key.equals("javax.script.language_version"))
+ {
+ return getLanguageVersion();
+ }
+ if (key.equals("THREADING"))
+ {
+ return "MULTITHREADED";
+ }
+
+ return null;
+ }
+
+ public String getProgram(String[] statements)
+ {
+ StringBuilder program = new StringBuilder();
+
+ if (statements.length != 0)
+ {
+ for (int i = 0; i < statements.length; ++i)
+ {
+ program.append("${");
+
+ program.append(statements[i]);
+
+ program.append("} ");
+ }
+
+ }
+
+ return program.toString();
+ }
+
+ public ScriptEngine getScriptEngine()
+ {
+ return new JuelScriptEngine(this);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/ScriptContextEngineView.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/ScriptContextEngineView.java
new file mode 100644
index 0000000..8b3fdde
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/ScriptContextEngineView.java
@@ -0,0 +1,268 @@
+package org.jbpm.pvm.internal.script;
+
+import javax.script.ScriptContext;
+import java.util.*;
+import static javax.script.ScriptContext.*;
+
+/**
+ * This class implements an ENGINE_SCOPE centric Map view of the ScriptContext
+ * for engine implementations. This class can be used to simplify engine
+ * implementations which have the capability to bind their namespaces to Maps
+ * or other external interfaces.
+ *
+ * Get operations on this view delegate to the
+ * ScriptContext inheriting get() method that automatically traverses the
+ * binding scopes in order or precedence. Put operations on this view always
+ * store values in the ENGINE_SCOPE bindings. Other operations such as
+ * size() and contains() are implemented appropriately, but perhaps not as
+ * efficiently as possible.
+ *
+*/
+public class ScriptContextEngineView implements Map<String,Object>
+{
+ ScriptContext context;
+
+ public ScriptContextEngineView( ScriptContext context )
+ {
+ this.context = context;
+ }
+
+ /**
+ * Returns the number of unique object bindings in all scopes.
+ * (duplicate, shadowed, bindings count as a single binging).
+ */
+ public int size()
+ {
+ return totalKeySet().size();
+ }
+
+ /**
+ * Returns true if no bindings are present in any scope of the context.
+ */
+ public boolean isEmpty()
+ {
+ return totalKeySet().size() == 0;
+ }
+
+ /**
+ * Returns true if the key name is bound in any scope in the context.
+ * The key must be a String.
+ *
+ * @param key key whose presence in this map is to be tested.
+ *
+ * @return <tt>true</tt> if this map contains a mapping for the specified key.
+ *
+ * @throws ClassCastException if the key is of an inappropriate type for this
+ * map (optional).
+ * @throws NullPointerException if the key is <tt>null</tt> and this map does
+ * not permit <tt>null</tt> keys (optional).
+ */
+ // Why isn't the compiler allowing this?
+ //public boolean containsKey( String key )
+ public boolean containsKey( Object key )
+ {
+ return context.getAttribute( (String)key ) != null;
+ }
+
+ /**
+ * Returns <tt>true</tt> if this map maps one or more keys to the specified
+ * value. More formally, returns <tt>true</tt> if and only if this map
+ * contains at least one mapping to a value <tt>v</tt> such that
+ * <tt>(value==null ? v==null : value.equals(v))</tt>. This operation will
+ * probably require time linear in the map size for most implementations of the
+ * <tt>Map</tt> interface.
+ *
+ * @param value value whose presence in this map is to be tested.
+ *
+ * @return <tt>true</tt> if this map maps one or more keys to the specified
+ * value.
+ *
+ * @throws ClassCastException if the value is of an inappropriate type for this
+ * map (optional).
+ * @throws NullPointerException if the value is <tt>null</tt> and this map does
+ * not permit <tt>null</tt> values (optional).
+ */
+ public boolean containsValue( Object value )
+ {
+ Set values = totalValueSet();
+ return values.contains( value );
+ }
+
+ /**
+ * Returns the value bound in the most specific (lowest numbered)
+ * bindings space for this key.
+ * key must be a String.
+ *
+ * @param key key whose associated value is to be returned.
+ *
+ * @return the value to which this map maps the specified key, or <tt>null</tt>
+ * if the map contains no mapping for this key.
+ *
+ * @throws ClassCastException if the key is of an inappropriate type for this
+ * map (optional).
+ * @throws NullPointerException if the key is <tt>null</tt> and this map does
+ * not permit <tt>null</tt> keys (optional).
+ * @see #containsKey(Object)
+ */
+ public Object get( Object key )
+ {
+ return context.getAttribute( (String)key );
+ }
+
+ /**
+ * Set the key, value binding in the ENGINE_SCOPE of the context.
+ *
+ * @param key key with which the specified value is to be associated.
+ * @param value value to be associated with the specified key.
+ *
+ * @return previous value associated with specified key, or <tt>null</tt> if
+ * there was no mapping for key. A <tt>null</tt> return can also
+ * indicate that the map previously associated <tt>null</tt> with the
+ * specified key, if the implementation supports <tt>null</tt> values.
+ *
+ * @throws UnsupportedOperationException if the <tt>put</tt> operation is not
+ * supported by this map.
+ * @throws ClassCastException if the class of the specified key or value
+ * prevents it from being stored in this map.
+ * @throws IllegalArgumentException if some aspect of this key or value
+ * prevents it from being stored in this map.
+ * @throws NullPointerException if this map does not permit <tt>null</tt> keys
+ * or values, and the specified key or value is <tt>null</tt>.
+ */
+ public Object put( String key, Object value )
+ {
+ Object oldValue =
+ context.getAttribute( key, ENGINE_SCOPE );
+ context.setAttribute( key, value, ENGINE_SCOPE );
+ return oldValue;
+ }
+
+
+ /**
+ * Put the bindings into the ENGINE_SCOPE of the context.
+ *
+ * @param t Mappings to be stored in this map.
+ *
+ * @throws UnsupportedOperationException if the <tt>putAll</tt> method is not
+ * supported by this map.
+ * @throws ClassCastException if the class of a key or value in the specified
+ * map prevents it from being stored in this map.
+ * @throws IllegalArgumentException some aspect of a key or value in the
+ * specified map prevents it from being stored in this map.
+ * @throws NullPointerException if the specified map is <tt>null</tt>, or if
+ * this map does not permit <tt>null</tt> keys or values, and the specified map
+ * contains <tt>null</tt> keys or values.
+ */
+ public void putAll( Map<? extends String, ? extends Object> t )
+ {
+ context.getBindings( ENGINE_SCOPE ).putAll( t );
+ }
+
+ /**
+ * Removes the mapping from the engine scope.
+ * <p/>
+ * <p>Returns the value to which the map previously associated the key, or
+ * <tt>null</tt> if the map contained no mapping for this key. (A
+ * <tt>null</tt> return can also indicate that the map previously associated
+ * <tt>null</tt> with the specified key if the implementation supports
+ * <tt>null</tt> values.) The map will not contain a mapping for the specified
+ * key once the call returns.
+ *
+ * @param okey key whose mapping is to be removed from the map.
+ *
+ * @return previous value associated with specified key, or <tt>null</tt> if
+ * there was no mapping for key.
+ *
+ * @throws ClassCastException if the key is of an inappropriate type for this
+ * map (optional).
+ * @throws NullPointerException if the key is <tt>null</tt> and this map does
+ * not permit <tt>null</tt> keys (optional).
+ * @throws UnsupportedOperationException if the <tt>remove</tt> method is not
+ * supported by this map.
+ */
+ // Why is the compiler complaining about this?
+ //public Object remove( String key )
+ public Object remove( Object okey )
+ {
+ // This shouldn't be necessary... we don't map Objects, Strings.
+ String key = (String)okey;
+ Object oldValue =
+ context.getAttribute( key, ENGINE_SCOPE );
+ context.removeAttribute( key, ENGINE_SCOPE );
+ return oldValue;
+ }
+
+ /**
+ * Removes all mappings from this map (optional operation).
+ *
+ * @throws UnsupportedOperationException clear is not supported by this map.
+ */
+ public void clear()
+ {
+ context.getBindings( ENGINE_SCOPE ).clear();
+ }
+
+ /**
+ * Returns the total key set of all scopes.
+ * This method violates the Map contract by returning an unmodifiable set.
+ *
+ * @return a set view of the keys contained in this map.
+ */
+ public Set keySet()
+ {
+ return totalKeySet();
+ }
+
+ /**
+ *
+ * Returns the total values set of all scopes.
+ * This method violates the Map contract by returning an unmodifiable set.
+ *
+ * @return a collection view of the values contained in this map.
+ */
+ public Collection values()
+ {
+ return totalValueSet();
+ }
+
+ /**
+ * Returns a set view of the mappings contained in this map. Each element in
+ * the returned set is a {@link java.util.Map.Entry}. The set is backed by the
+ * map, so changes to the map are reflected in the set, and vice-versa. If the
+ * map is modified while an iteration over the set is in progress (except
+ * through the iterator's own <tt>remove</tt> operation, or through the
+ * <tt>setValue</tt> operation on a map entry returned by the iterator) the
+ * results of the iteration are undefined. The set supports element removal,
+ * which removes the corresponding mapping from the map, via the
+ * <tt>Iterator.remove</tt>, <tt>Set.remove</tt>, <tt>removeAll</tt>,
+ * <tt>retainAll</tt> and <tt>clear</tt> operations. It does not support the
+ * <tt>add</tt> or <tt>addAll</tt> operations.
+ *
+ * @return a set view of the mappings contained in this map.
+ */
+ public Set<Entry<String,Object>> entrySet()
+ {
+ throw new Error("unimplemented");
+ }
+
+ private Set totalKeySet()
+ {
+ Set keys = new HashSet();
+ List<Integer> scopes = context.getScopes();
+ for ( int i : scopes ) {
+ keys.addAll( context.getBindings( i ).keySet() );
+ }
+ return Collections.unmodifiableSet(keys);
+ }
+ private Set totalValueSet()
+ {
+ Set values = new HashSet();
+ List<Integer> scopes = context.getScopes();
+ for ( int i : scopes ) {
+ values.addAll( context.getBindings( i ).values() );
+ }
+ return Collections.unmodifiableSet(values);
+ }
+
+}
+
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/ScriptManager.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/ScriptManager.java
new file mode 100644
index 0000000..7c9a77a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/ScriptManager.java
@@ -0,0 +1,140 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.script;
+
+import javax.script.Bindings;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.JbpmException;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ScriptManager {
+
+ private static Log log = Log.getLog(ScriptManager.class.getName());
+
+ private static ScriptManager defaultScriptManager = null;
+
+ protected String defaultExpressionLanguage;
+ protected String defaultScriptLanguage;
+ protected ScriptEngineManager scriptEngineManager;
+ protected String[] readContextNames = null;
+ protected String writeContextName;
+
+ /** looks up the configured script manager or returns the default
+ * script manager if there is no environment. */
+ public static ScriptManager getScriptManager() {
+ ScriptManager scriptManager = EnvironmentImpl.getFromCurrent(ScriptManager.class, false);
+ if (scriptManager!=null) {
+ return scriptManager;
+ }
+ return getDefaultScriptManager();
+ }
+
+ /** looks up the default script manager used for non persistent purposes where
+ * no environment is installed. */
+ public static synchronized ScriptManager getDefaultScriptManager() {
+ if (defaultScriptManager==null) {
+ WireDefinition wireDefinition = (WireDefinition) new WireParser()
+ .createParse()
+ .setString(
+ "<objects>" +
+ " <script-manager default-expression-language='juel'" +
+ " default-script-language='beanshell'>" +
+ " <script-language name='juel' factory='org.jbpm.pvm.internal.script.JuelScriptEngineFactory' />" +
+ " </script-manager>" +
+ "</objects>"
+ )
+ .execute()
+ .getDocumentObject();
+
+ WireContext wireContext = new WireContext(wireDefinition);
+ defaultScriptManager = wireContext.get(ScriptManager.class);
+ }
+ return defaultScriptManager;
+ }
+
+ /** {@link #evaluate(String, Execution, String) evaluates} the expression
+ * with the given language or with the defaultExpressionLanguage if the
+ * given language is null. */
+ public Object evaluateExpression(String expression, String language) {
+ return evaluate(expression, (language!=null ? language : defaultExpressionLanguage));
+ }
+
+ /** {@link #evaluate(String, Execution, String) evaluates} the script
+ * with the given language or with the defaultScriptLanguage if the
+ * given language is null. */
+ public Object evaluateScript(String script, String language) {
+ return evaluate(script, (language!=null ? language : defaultScriptLanguage));
+ }
+
+ /** evaluates the script with the given language.
+ * If script is null, then this method will return null.
+ * @throws JbpmException if language is null.
+ */
+ public Object evaluate(String script, String language) {
+ if (script==null) {
+ return null;
+ }
+ if (language==null) {
+ throw new JbpmException("no language specified");
+ }
+ ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(language);
+ if (scriptEngine==null) {
+ throw new JbpmException("no scripting engine configured for language "+language);
+ }
+
+ if (log.isTraceEnabled()) log.trace("evaluating "+language+" script "+script);
+
+ return evaluate(scriptEngine, script);
+ }
+
+ protected Object evaluate(ScriptEngine scriptEngine, String script) {
+ Bindings bindings = new EnvironmentBindings(readContextNames, writeContextName);
+ scriptEngine.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
+
+ try {
+ Object result = scriptEngine.eval(script);
+ if (log.isTraceEnabled()) log.trace("script evaluated to "+result);
+ return result;
+ } catch (ScriptException e) {
+ throw new JbpmException("script evaluation error: "+e.getMessage(), e);
+ }
+ }
+
+ public String getDefaultExpressionLanguage() {
+ return defaultExpressionLanguage;
+ }
+ public String getDefaultScriptLanguage() {
+ return defaultScriptLanguage;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/WriteBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/WriteBinding.java
new file mode 100644
index 0000000..1041947
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/WriteBinding.java
@@ -0,0 +1,35 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.script;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class WriteBinding {
+
+ protected String scriptVariable;
+ protected String contextName;
+ protected String contextVariableName;
+
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/XPathScriptEngine.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/XPathScriptEngine.java
new file mode 100644
index 0000000..ca20659
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/XPathScriptEngine.java
@@ -0,0 +1,458 @@
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met: Redistributions of source code
+ * must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution. Neither the name of the Sun Microsystems nor the names of
+ * is contributors may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * XPathScriptEngine.java
+ * @author A. Sundararajan
+ */
+
+package org.jbpm.pvm.internal.script;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.script.AbstractScriptEngine;
+import javax.script.Bindings;
+import javax.script.Compilable;
+import javax.script.CompiledScript;
+import javax.script.Invocable;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineFactory;
+import javax.script.ScriptException;
+import javax.script.SimpleBindings;
+import javax.xml.XMLConstants;
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathFactory;
+import javax.xml.xpath.XPathFunction;
+import javax.xml.xpath.XPathFunctionResolver;
+import javax.xml.xpath.XPathVariableResolver;
+
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+
+public class XPathScriptEngine extends AbstractScriptEngine implements Compilable {
+
+ // my factory, may be null
+ private ScriptEngineFactory factory;
+ private XPathFactory xpathFactory;
+
+ // special context variables for XPath result type and input
+ public static final String XPATH_RESULT_TYPE = "com.sun.script.xpath.resultType";
+ public static final String XPATH_INPUT_SRC = "com.sun.script.xpath.inputSource";
+
+ // XML namespace prefixes and URIs.
+ public static final String XMLNS_COLON = "xmlns:";
+ public static final String XPATH_CONTEXT_PREFIX = "context";
+ public static final String XPATH_CONTEXT_URI = "http://www.sun.com/java/jsr223/xpath/context";
+
+ private Document objectData;
+
+ public XPathScriptEngine() {
+ xpathFactory = XPathFactory.newInstance();
+ }
+
+ // my implementation for CompiledScript
+ private class XPathCompiledScript extends CompiledScript {
+
+ private XPathExpression expr;
+
+ XPathCompiledScript(XPathExpression expr) {
+ this.expr = expr;
+ }
+
+ public ScriptEngine getEngine() {
+ return XPathScriptEngine.this;
+ }
+
+ public Object eval(ScriptContext ctx) throws ScriptException {
+ return evalXPath(expr, ctx);
+ }
+ }
+
+ public CompiledScript compile(String script) throws ScriptException {
+ XPathExpression expr = compileXPath(script, context);
+ return new XPathCompiledScript(expr);
+ }
+
+ public CompiledScript compile(Reader reader) throws ScriptException {
+ return compile(readFully(reader));
+ }
+
+ public Object eval(String str, ScriptContext ctx) throws ScriptException {
+ XPathExpression expr = compileXPath(str, ctx);
+ return evalXPath(expr, ctx);
+ }
+
+ public Object eval(Reader reader, ScriptContext ctx) throws ScriptException {
+ return eval(readFully(reader), ctx);
+ }
+
+ public ScriptEngineFactory getFactory() {
+ synchronized (this) {
+ if (factory == null) {
+ factory = new XPathScriptEngineFactory();
+ }
+ }
+ return factory;
+ }
+
+ public Bindings createBindings() {
+ return new SimpleBindings();
+ }
+
+ void setFactory(ScriptEngineFactory factory) {
+ this.factory = factory;
+ }
+
+ // Internals only below this point
+
+ // find a variable of given qname in given context
+ private static Object findVariable(QName qname, ScriptContext ctx) {
+ String name;
+ int scope;
+
+ if (XPATH_CONTEXT_URI.equals(qname.getNamespaceURI())) {
+ name = qname.getLocalPart();
+ synchronized (ctx) {
+ scope = ctx.getAttributesScope(name);
+ if (scope != -1) {
+ return ctx.getAttribute(name, scope);
+ } // else fallthru
+ }
+ }
+ if (qname.getPrefix() == null || "".equals(qname.getPrefix())) {
+ name = qname.getLocalPart();
+ } else {
+ name = qname.getPrefix() + ":" + qname.getLocalPart();
+ }
+ synchronized (ctx) {
+ scope = ctx.getAttributesScope(name);
+ if (scope != -1) {
+ return ctx.getAttribute(name, scope);
+ } // else fallthru
+ }
+ return null;
+ }
+
+ private static void collectNamespaces(Map<String, String> map, Bindings scope) {
+ for (String key : scope.keySet()) {
+ if (key.startsWith(XMLNS_COLON)) {
+ Object uri = scope.get(key);
+ // collect all variables starting with "xmlns:" and
+ // collect the prefix to URI mappings.
+ String prefix = key.substring(XMLNS_COLON.length());
+ if (uri instanceof String) {
+ String tmp = (String) uri;
+ if (tmp.length() != 0) {
+ map.put(prefix, tmp);
+ }
+ }
+ }
+ }
+ }
+
+ private static NamespaceContext makeNamespaceContext(ScriptContext ctx) {
+ // namespace prefix-to-URI mappings
+ final Map<String, String> namespaces = new HashMap<String, String>();
+ for (int scope : ctx.getScopes()) {
+ Bindings bind = ctx.getBindings(scope);
+ if (bind != null) {
+ // TODO: See what needs to be done....
+ // collectNamespaces(namespaces, bind);
+ }
+ }
+
+ // look for mapping for default XML namespace
+ Object def = ctx.getAttribute(XMLConstants.XMLNS_ATTRIBUTE);
+ if (def instanceof String) {
+ namespaces.put(XMLConstants.DEFAULT_NS_PREFIX, (String) def);
+ }
+
+ // standard required mappings by XPath standard
+ namespaces.put(XMLConstants.XML_NS_PREFIX, XMLConstants.XML_NS_URI);
+ namespaces.put(XMLConstants.XMLNS_ATTRIBUTE, XMLConstants.XMLNS_ATTRIBUTE_NS_URI);
+
+ // add prefix mapping for XPATH_CONTEXT_PREFIX
+ namespaces.put(XPATH_CONTEXT_PREFIX, XPATH_CONTEXT_URI);
+
+ return new NamespaceContext() {
+
+ public String getNamespaceURI(String prefix) {
+ if (prefix == null) {
+ throw new IllegalArgumentException();
+ }
+ String uri = namespaces.get(prefix);
+ if (uri == null) {
+ return XMLConstants.NULL_NS_URI;
+ } else {
+ return uri;
+ }
+ }
+
+ public String getPrefix(String namespaceURI) {
+ if (namespaceURI == null) {
+ throw new IllegalArgumentException();
+ }
+ for (String prefix : namespaces.keySet()) {
+ String uri = namespaces.get(prefix);
+ if (namespaceURI.equals(uri)) {
+ return prefix;
+ }
+ }
+ return null;
+ }
+
+ public Iterator getPrefixes(String namespaceURI) {
+ if (namespaceURI == null) {
+ throw new IllegalArgumentException();
+ }
+ List list = new ArrayList();
+ for (String prefix : namespaces.keySet()) {
+ String uri = namespaces.get(prefix);
+ if (namespaceURI.equals(uri)) {
+ list.add(prefix);
+ }
+ }
+ return Collections.unmodifiableList(list).iterator();
+ }
+ };
+ }
+
+ private static XPathFunction makeXPathFunction(final Constructor ctr, int arity) {
+ if (ctr.getParameterTypes().length != arity) {
+ return null;
+ }
+ return new XPathFunction() {
+
+ public Object evaluate(List args) {
+ try {
+ return ctr.newInstance(args.toArray());
+ } catch (Exception exp) {
+ throw new RuntimeException(exp);
+ }
+ }
+ };
+ }
+
+ private static XPathFunction makeXPathFunction(final Method method, int arity) {
+ int modifiers = method.getModifiers();
+ int numArgs = method.getParameterTypes().length;
+ if (Modifier.isStatic(modifiers) && numArgs == arity) {
+ // static method. expose "as is".
+ return new XPathFunction() {
+
+ public Object evaluate(List args) {
+ try {
+ return method.invoke(null, args.toArray());
+ } catch (Exception exp) {
+ throw new RuntimeException(exp);
+ }
+ }
+ };
+ } else if ((numArgs + 1) == arity) {
+ // instance method. treat the first arg as 'this'
+ return new XPathFunction() {
+
+ public Object evaluate(List args) {
+ List tmp = args.subList(1, args.size());
+ try {
+ return method.invoke(args.get(0), tmp.toArray());
+ } catch (Exception exp) {
+ throw new RuntimeException(exp);
+ }
+ }
+ };
+ } else {
+ return null;
+ }
+ }
+
+ private static XPathFunction makeXPathFunction(final String funcName, final Invocable invocable) {
+ return new XPathFunction() {
+
+ public Object evaluate(List args) {
+ try {
+ return invocable.invokeFunction(funcName, args.toArray());
+ } catch (Exception exp) {
+ throw new RuntimeException(exp);
+ }
+ }
+ };
+ }
+
+ // make a XPathFunction from given object
+ private static XPathFunction makeXPathFunction(QName qname, Object obj, int arity) {
+ if (obj == null) {
+ return null;
+ } else if (obj instanceof XPathFunction) {
+ // already XPathFunction - just return
+ return (XPathFunction) obj;
+ } else if (obj instanceof Method) {
+ // a Method object. wrap as XPathFunction
+ return makeXPathFunction((Method) obj, arity);
+ } else if (obj instanceof Constructor) {
+ // a Constructor object. wrap as XPathFunction
+ return makeXPathFunction((Constructor) obj, arity);
+ } else if (obj instanceof Invocable) {
+ // wrap a script function as XPathFunction. Using this,
+ // scripts from other languages (for eg. JavaScript) can use
+ // this engine and pass script functions as XPathFunction extensions
+
+ return makeXPathFunction(qname.getLocalPart(), (Invocable) obj);
+ } else {
+ // can't map the object as XPathFunction.
+ return null;
+ }
+ }
+
+ // Internals only below this point
+ private XPathExpression compileXPath(String str, final ScriptContext ctx) throws ScriptException {
+ // JSR-223 requirement
+ ctx.setAttribute("context", ctx, ScriptContext.ENGINE_SCOPE);
+ try {
+ XPath xpath = xpathFactory.newXPath();
+ xpath.setXPathVariableResolver(new XPathVariableResolver() {
+
+ public Object resolveVariable(QName qname) {
+ return findVariable(qname, ctx);
+ }
+ });
+
+ xpath.setXPathFunctionResolver(new XPathFunctionResolver() {
+
+ public XPathFunction resolveFunction(QName qname, int arity) {
+ Object obj = findVariable(qname, ctx);
+ return makeXPathFunction(qname, obj, arity);
+ }
+ });
+ xpath.setNamespaceContext(makeNamespaceContext(ctx));
+ // xpath.setNamespaceContext(new BpmnFunctionResolver());
+ // xpath.setXPathFunctionResolver(new BpmnFunctionResolver());
+ int begin = str.indexOf("getObjectData") > -1 ? 14 : 0;
+ if (begin > 0) {
+ String objectDataRef = str.substring(begin + 1, str.indexOf(")") - 1);
+
+ objectData = (Document) ctx.getAttribute(objectDataRef);
+ // ctx.setAttribute(XPATH_INPUT_SRC, objectData , 100);
+
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ Source xmlSource = new DOMSource(objectData);
+ Result outputTarget = new StreamResult(outputStream);
+ TransformerFactory.newInstance().newTransformer().transform(xmlSource, outputTarget);
+ InputStream is = new ByteArrayInputStream(outputStream.toByteArray());
+ ctx.setReader(new InputStreamReader(is));
+
+ str = str.substring(str.indexOf(")") + 1);
+ }
+ XPathExpression xpe = xpath.compile(str);
+ return xpe;
+ } catch (Exception exp) {
+ throw new ScriptException(exp);
+ }
+ }
+
+ private Object getVariable(ScriptContext ctx, String name) {
+ synchronized (ctx) {
+ int scope = ctx.getAttributesScope(name);
+ if (scope != -1) {
+ return ctx.getAttribute(name, scope);
+ }
+ }
+ return null;
+ }
+ private Object evalXPath(XPathExpression expr, final ScriptContext ctx) throws ScriptException {
+
+ try {
+ Object resultType = getVariable(ctx, XPATH_RESULT_TYPE);
+ Object input = getVariable(ctx, XPATH_INPUT_SRC);
+
+ InputSource src;
+ if (input == null) {
+ // no input specified, use context reader
+ src = new InputSource(ctx.getReader());
+ } else {
+ // explicit InputSource specified
+ if (input instanceof InputSource) {
+ src = (InputSource) input;
+ } else if (input instanceof String) {
+ src = new InputSource((String) input);
+ } else if (input instanceof Reader) {
+ src = new InputSource((Reader) input);
+ } else if (input instanceof InputStream) {
+ src = new InputSource((InputStream) input);
+ } else {
+ // some other object input type specified (Node/NodeList)
+ src = null;
+ }
+ }
+
+ resultType = XPathConstants.BOOLEAN;
+
+ if (resultType instanceof QName) {
+ return (src != null) ? expr.evaluate(src, (QName) resultType) : expr.evaluate(input, (QName) resultType);
+ } else {
+ return (src != null) ? expr.evaluate(src) : expr.evaluate(input);
+ }
+ } catch (Exception exp) {
+ throw new ScriptException(exp);
+ }
+ }
+
+ private String readFully(Reader reader) throws ScriptException {
+ char[] arr = new char[8 * 1024]; // 8K at a time
+ StringBuilder buf = new StringBuilder();
+ int numChars;
+ try {
+ while ((numChars = reader.read(arr, 0, arr.length)) > 0) {
+ buf.append(arr, 0, numChars);
+ }
+ } catch (IOException exp) {
+ throw new ScriptException(exp);
+ }
+ return buf.toString();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/XPathScriptEngineFactory.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/XPathScriptEngineFactory.java
new file mode 100644
index 0000000..7e4ac6f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/script/XPathScriptEngineFactory.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met: Redistributions of source code
+ * must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution. Neither the name of the Sun Microsystems nor the names of
+ * is contributors may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * XPathScriptEngineFactory.java
+ * @author A. Sundararajan
+ */
+
+package org.jbpm.pvm.internal.script;
+
+import javax.script.*;
+import java.util.*;
+
+public class XPathScriptEngineFactory implements ScriptEngineFactory {
+ public String getEngineName() {
+ return "xpath";
+ }
+
+ public String getEngineVersion() {
+ return "1.0";
+ }
+
+ public List<String> getExtensions() {
+ return extensions;
+ }
+
+ public String getLanguageName() {
+ return "jaxp";
+ }
+
+ public String getLanguageVersion() {
+ return "1.4";
+ }
+
+ public String getMethodCallSyntax(String obj, String m, String... args) {
+ throw new UnsupportedOperationException("getMethodCallSyntax");
+ }
+
+ public List<String> getMimeTypes() {
+ return mimeTypes;
+ }
+
+ public List<String> getNames() {
+ return names;
+ }
+
+ public String getOutputStatement(String str) {
+ throw new UnsupportedOperationException("getOutputStatement");
+ }
+
+ public String getParameter(String key) {
+ if (key.equals(ScriptEngine.ENGINE)) {
+ return getEngineName();
+ } else if (key.equals(ScriptEngine.ENGINE_VERSION)) {
+ return getEngineVersion();
+ } else if (key.equals(ScriptEngine.NAME)) {
+ return getEngineName();
+ } else if (key.equals(ScriptEngine.LANGUAGE)) {
+ return getLanguageName();
+ } else if (key.equals(ScriptEngine.LANGUAGE_VERSION)) {
+ return getLanguageVersion();
+ } else if (key.equals("THREADING")) {
+ return "MULTITHREADED";
+ } else {
+ return null;
+ }
+ }
+
+ public String getProgram(String... statements) {
+ throw new UnsupportedOperationException("getProgram");
+ }
+
+ public ScriptEngine getScriptEngine() {
+ XPathScriptEngine engine = new XPathScriptEngine();
+ engine.setFactory(this);
+ return engine;
+ }
+
+ private static List<String> names;
+ private static List<String> extensions;
+ private static List<String> mimeTypes;
+ static {
+ names = new ArrayList<String>(1);
+ names.add("xpath");
+ names = Collections.unmodifiableList(names);
+ extensions = names;
+ mimeTypes = new ArrayList<String>(0);
+ mimeTypes = Collections.unmodifiableList(mimeTypes);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/session/DbSession.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/session/DbSession.java
new file mode 100644
index 0000000..7d19184
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/session/DbSession.java
@@ -0,0 +1,125 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.session;
+
+import java.util.List;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.history.HistoryComment;
+import org.jbpm.pvm.internal.client.ClientExecution;
+import org.jbpm.pvm.internal.client.ClientProcessDefinition;
+import org.jbpm.pvm.internal.job.JobImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.query.DeploymentQueryImpl;
+import org.jbpm.pvm.internal.query.HistoryActivityInstanceQueryImpl;
+import org.jbpm.pvm.internal.query.HistoryDetailQueryImpl;
+import org.jbpm.pvm.internal.query.HistoryProcessInstanceQueryImpl;
+import org.jbpm.pvm.internal.query.JobQueryImpl;
+import org.jbpm.pvm.internal.query.ProcessInstanceQueryImpl;
+import org.jbpm.pvm.internal.query.TaskQueryImpl;
+import org.jbpm.pvm.internal.task.TaskImpl;
+import org.jbpm.pvm.internal.tx.JtaTransaction;
+import org.jbpm.pvm.internal.tx.StandardTransaction;
+import org.jbpm.pvm.internal.type.Variable;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface DbSession {
+
+ void save(Object entity);
+ void update(Object entity);
+
+ <T> T get(Class<T> entityClass, Object primaryKey);
+ void delete(Object entity);
+ void flush();
+
+ /** all deployed process names. */
+ List<String> findProcessDefinitionKeys();
+
+ /** latest version of the processDefinition for the given key. */
+ ClientProcessDefinition findLatestProcessDefinitionByKey(String processDefinitionKey);
+
+ /** all versions of the processDefinition for the given key. */
+ List<ClientProcessDefinition> findProcessDefinitionsByKey(String processDefinitionKey);
+
+ /** the process definition uniquely identified by the given
+ * processDefinition id. */
+ ClientProcessDefinition findProcessDefinitionById(String processDefinitionId);
+
+ /** delete process definition */
+ void deleteProcessDefinition(String processDefinitionId, boolean deleteProcessInstances, boolean deleteHistory);
+
+ // process execution queries ////////////////////////////////////////////////
+
+ /** create a process instance query */
+ ProcessInstanceQueryImpl createProcessInstanceQuery();
+
+ /** create a task query */
+ TaskQueryImpl createTaskQuery();
+ HistoryProcessInstanceQueryImpl createHistoryProcessInstanceQuery();
+ HistoryActivityInstanceQueryImpl createHistoryActivityInstanceQuery();
+ HistoryDetailQueryImpl createHistoryDetailQuery();
+ JobQueryImpl createJobQuery();
+ DeploymentQueryImpl createDeploymentQuery();
+
+ List<HistoryComment> findCommentsByTaskId(String taskId);
+
+ /** the execution uniquely identified by the given executionKey.
+ * this method doesn't 'see' suspended executions. */
+ ClientExecution findExecutionById(String executionId);
+
+ /** the process instance uniquely identified by the given executionKey. */
+ ClientExecution findProcessInstanceById(String processInstanceId);
+
+ List<String> findProcessInstanceIds(String processDefinitionId);
+
+ /** deletes the history information for all process instances for
+ * the given process definition */
+ void deleteProcessDefinitionHistory(String processDefinitionId);
+
+ /** delete the process instance and optionally deletes the history. */
+ void deleteProcessInstance(String processInstanceId, boolean deleteHistory);
+
+ void cascadeExecutionSuspend(ExecutionImpl execution);
+
+ void cascadeExecutionResume(ExecutionImpl execution);
+
+ // task methods /////////////////////////////////////////////////////////////
+
+ TaskImpl createTask();
+
+ TaskImpl findTaskByExecution(Execution execution);
+
+ // job methods //////////////////////////////////////////////////////////////
+
+ /** the first job to finish among eligible and non-locked jobs or null if none */
+ public JobImpl<?> findFirstAcquirableJob();
+
+ /** the list of jobs of the process instance that mustn't be concurrent */
+ public List<JobImpl<?>> findExclusiveJobs(Execution processInstance);
+
+ /** the first job to finish among non-owned jobs or null if none */
+ public JobImpl<?> findFirstDueJob();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/session/MessageSession.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/session/MessageSession.java
new file mode 100644
index 0000000..430cd4c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/session/MessageSession.java
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.session;
+
+import org.jbpm.api.job.Message;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface MessageSession {
+
+ void send(Message message);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/session/RepositorySession.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/session/RepositorySession.java
new file mode 100644
index 0000000..cb499ec
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/session/RepositorySession.java
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.session;
+
+import org.jbpm.api.NewDeployment;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.query.ProcessDefinitionQueryImpl;
+import org.jbpm.pvm.internal.repository.DeploymentImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface RepositorySession {
+
+ String deploy(NewDeployment deployment);
+
+ DeploymentImpl getDeployment(String deploymentId);
+
+ Object getObject(String deploymentId, String objectName);
+
+ byte[] getBytes(String deploymentId, String resourceName);
+
+ /** create a process definition query */
+ ProcessDefinitionQueryImpl createProcessDefinitionQuery();
+
+ ProcessDefinitionImpl findProcessDefinitionById(String processDefinitionId);
+
+ ProcessDefinitionImpl findProcessDefinitionByKey(String processDefinitionKey);
+
+ void updateDeploymentResource(String deploymentId, String resourceName, byte[] bytes);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/session/TimerSession.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/session/TimerSession.java
new file mode 100644
index 0000000..920999a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/session/TimerSession.java
@@ -0,0 +1,60 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.session;
+
+import java.util.List;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.job.Timer;
+
+/**
+ * @author Tom Baeyens, Pascal Verdage
+ */
+public interface TimerSession {
+
+ /** Schedule the execution of a timer.
+ *
+ * @param timerImpl
+ * the timer to be executed.
+ * @throws IllegalArgumentException
+ * if the timer is null or if its activity is null or if its duedate
+ * is null or if its duedate is negative or if its duedate is past
+ * or if its duedate is equals to Long.MAX_VALUE
+ */
+ void schedule(Timer timer);
+
+ /** Cancels a timer. <br />
+ * If a transaction is in progress, the cancellation will be effective at the
+ * end of the transaction. If the timer has been created in the same
+ * transaction or if there is no transaction, the cancellation is immediately
+ * effective. <br />
+ * If the timer is executing when the cancellation becomes effective, the
+ * execution in progress will not be stopped.
+ *
+ * @param timerImpl
+ * the timer to be cancelled.
+ */
+ void cancel(Timer timer);
+
+ /** retrieve all the outstanding timers associated for the given execution */
+ List<Timer> findTimersByExecution(Execution execution);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/ByteArrayStreamInput.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/ByteArrayStreamInput.java
new file mode 100644
index 0000000..bd8c1f0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/ByteArrayStreamInput.java
@@ -0,0 +1,52 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.stream;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.Serializable;
+
+import org.jbpm.api.JbpmException;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ByteArrayStreamInput extends StreamInput implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected byte[] bytes;
+
+ /** @throws JbpmException if bytes is null */
+ public ByteArrayStreamInput(byte[] bytes) {
+ if (bytes==null) {
+ throw new JbpmException("bytes is null");
+ }
+ this.name = "byte-array";
+ this.bytes = bytes;
+ }
+
+ public InputStream openStream() {
+ return new ByteArrayInputStream(bytes);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/FileStreamInput.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/FileStreamInput.java
new file mode 100644
index 0000000..837ea6a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/FileStreamInput.java
@@ -0,0 +1,72 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.stream;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+
+import org.jbpm.api.JbpmException;
+
+/**
+ * @author Tom Baeyens
+ */
+public class FileStreamInput extends StreamInput {
+
+ protected File file;
+
+ /** @throws JbpmException if file is null */
+ public FileStreamInput(File file) {
+ if (file==null) {
+ throw new JbpmException("file is null");
+ }
+
+ try {
+ this.name = file.toURL().toString();
+ } catch (MalformedURLException e) {
+ this.name = file.toString();
+ }
+
+ this.file = file;
+ }
+
+ public InputStream openStream() {
+ InputStream stream = null;
+
+ try {
+ if (!file.exists()) {
+ throw new JbpmException("file "+file+" doesn't exist");
+ }
+ if (file.isDirectory()) {
+ throw new JbpmException("file "+file+" is a directory");
+ }
+ stream = new FileInputStream(file);
+
+ } catch (Exception e) {
+ throw new JbpmException("couldn't access file "+file+": "+e.getMessage(), e);
+ }
+
+ return stream;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/InputStreamInput.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/InputStreamInput.java
new file mode 100644
index 0000000..4aa0f4e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/InputStreamInput.java
@@ -0,0 +1,46 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.stream;
+
+import java.io.InputStream;
+
+import org.jbpm.api.JbpmException;
+
+/**
+ * @author Tom Baeyens
+ */
+public class InputStreamInput extends StreamInput {
+
+ protected InputStream inputStream;
+
+ public InputStreamInput(InputStream inputStream) {
+ if (inputStream==null) {
+ throw new JbpmException("inputStream is null");
+ }
+ this.name = "input-stream";
+ this.inputStream = inputStream;
+ }
+
+ public InputStream openStream() {
+ return inputStream;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/ResourceStreamInput.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/ResourceStreamInput.java
new file mode 100644
index 0000000..b4c983a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/ResourceStreamInput.java
@@ -0,0 +1,59 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.stream;
+
+import java.io.InputStream;
+
+import org.jbpm.api.JbpmException;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ResourceStreamInput extends StreamInput {
+
+ protected ClassLoader classLoader;
+ protected String resource;
+
+ /** @throws JbpmException if resource is null */
+ public ResourceStreamInput(String resource) {
+ this(resource, null);
+ }
+
+ /** @throws JbpmException if resource is null */
+ public ResourceStreamInput(String resource, ClassLoader classLoader) {
+ if (resource==null) {
+ throw new JbpmException("resource is null");
+ }
+ this.name = "resource://"+resource;
+ this.resource = resource;
+ this.classLoader = classLoader;
+ }
+
+ public InputStream openStream() {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ InputStream stream = classLoader.getResourceAsStream(resource);
+ if (stream==null) {
+ throw new JbpmException("resource "+resource+" does not exist");
+ }
+ return stream;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/StreamInput.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/StreamInput.java
new file mode 100644
index 0000000..27b1b94
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/StreamInput.java
@@ -0,0 +1,46 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.stream;
+
+import java.io.InputStream;
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class StreamInput {
+
+ protected String name;
+
+ public abstract InputStream openStream();
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String toString() {
+ return name;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/StringStreamInput.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/StringStreamInput.java
new file mode 100644
index 0000000..8577428
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/StringStreamInput.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.stream;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class StringStreamInput extends StreamInput {
+
+ String string;
+
+ public StringStreamInput(String string) {
+ this.name = "string";
+ this.string = string;
+ }
+
+ public InputStream openStream() {
+ byte[] bytes = string.getBytes();
+ return new ByteArrayInputStream(bytes);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/UrlStreamInput.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/UrlStreamInput.java
new file mode 100644
index 0000000..86faed2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/stream/UrlStreamInput.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.stream;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import org.jbpm.api.JbpmException;
+
+/**
+ * @author Tom Baeyens
+ */
+public class UrlStreamInput extends StreamInput {
+
+ protected URL url;
+
+ /** @throws JbpmException if url is null */
+ public UrlStreamInput(URL url) {
+ if (url==null) {
+ throw new JbpmException("url is null");
+ }
+ this.name = url.toString();
+ this.url = url;
+ }
+
+ public InputStream openStream() {
+ InputStream stream = null;
+ try {
+ stream = url.openStream();
+ } catch (IOException e) {
+ throw new JbpmException("couldn't open URL stream", e);
+ }
+ return stream;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AbstractServiceImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AbstractServiceImpl.java
new file mode 100644
index 0000000..500cbf0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AbstractServiceImpl.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.svc;
+
+import org.jbpm.pvm.internal.cmd.CommandService;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class AbstractServiceImpl {
+
+ protected CommandService commandService;
+
+ public CommandService getCommandService() {
+ return commandService;
+ }
+
+ public void setCommandService(CommandService commandService) {
+ this.commandService = commandService;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AsyncCommandMessage.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AsyncCommandMessage.java
new file mode 100644
index 0000000..7c8a092
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AsyncCommandMessage.java
@@ -0,0 +1,73 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.svc;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.job.Job;
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.job.MessageImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class AsyncCommandMessage extends MessageImpl<Object> {
+
+ private static final long serialVersionUID = 1L;
+
+ Command<?> command;
+ String userId;
+
+ public AsyncCommandMessage(Command<?> command) {
+ this.command = command;
+ }
+
+ public AsyncCommandMessage(Command<?> command, String userId) {
+ this.command = command;
+ this.userId = userId;
+ }
+
+ public Object execute(Environment environmentInterface) throws Exception {
+ EnvironmentImpl environment = (EnvironmentImpl) environmentInterface;
+ execution.setState(Execution.STATE_ACTIVE_ROOT);
+
+ if (userId!=null) {
+ environment.setAuthenticatedUserId(userId);
+ }
+ try {
+ CommandService commandService = environment.get(CommandService.class);
+ commandService.execute(command);
+ } finally {
+ if (userId!=null) {
+ environment.setAuthenticatedUserId(null);
+ }
+ }
+ return null;
+ }
+
+ public String toString() {
+ return "AsyncCommandMessage["+dbid+"]";
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AsyncCommandService.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AsyncCommandService.java
new file mode 100644
index 0000000..2e41980
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AsyncCommandService.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.svc;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.session.MessageSession;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class AsyncCommandService implements CommandService {
+
+ boolean propagateUserId = true;
+
+ public <T> T execute(Command<T> command) {
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ if (environment==null) {
+ throw new JbpmException("no environment for verifying authorization");
+ }
+ MessageSession messageSession = environment.get(MessageSession.class);
+ if (messageSession==null) {
+ throw new JbpmException("no message session for executing command asynchronously");
+ }
+ String userId = (propagateUserId ? environment.getAuthenticatedUserId() : null);
+ messageSession.send(new AsyncCommandMessage(command, userId));
+ return null;
+ }
+
+ public void setPropagateUserId(boolean propagateUserId) {
+ this.propagateUserId = propagateUserId;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AuthorizationInterceptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AuthorizationInterceptor.java
new file mode 100644
index 0000000..b1c6f4b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AuthorizationInterceptor.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.svc;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+
+/** performs an authorization check before the command is executed.
+ * @author Tom Baeyens
+ */
+public class AuthorizationInterceptor extends Interceptor {
+
+ public <T> T execute(Command<T> command) {
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ if (environment==null) {
+ throw new JbpmException("no environment for verifying authorization");
+ }
+ AuthorizationSession authorizationSession = environment.get(AuthorizationSession.class);
+ if (authorizationSession==null) {
+ throw new JbpmException("no AuthorizationSession in environment for verifying authorization");
+ }
+ authorizationSession.checkPermission(command, environment);
+ // if the authorization check succeeded, proceed
+ return next.execute(command);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AuthorizationSession.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AuthorizationSession.java
new file mode 100644
index 0000000..35b2096
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/AuthorizationSession.java
@@ -0,0 +1,9 @@
+package org.jbpm.pvm.internal.svc;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+
+public interface AuthorizationSession {
+
+ void checkPermission(Command<?> command, EnvironmentImpl environment);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/DefaultCommandService.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/DefaultCommandService.java
new file mode 100644
index 0000000..2aa4fd7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/DefaultCommandService.java
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.svc;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DefaultCommandService implements CommandService {
+
+ private static final Log log = Log.getLog(DefaultCommandService.class.getName());
+
+ public <T> T execute(Command<T> command) {
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+
+ try {
+ return command.execute(environment);
+
+ } catch (RuntimeException e) {
+ log.info("exception while executing command "+command, e);
+ throw e;
+
+ } catch (Exception e) {
+ log.info("exception while executing command "+command, e);
+ throw new JbpmException("exception while executing command "+command, e);
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/EnvironmentInterceptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/EnvironmentInterceptor.java
new file mode 100644
index 0000000..e89b0f7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/EnvironmentInterceptor.java
@@ -0,0 +1,77 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.svc;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.pvm.internal.env.EnvironmentFactory;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+
+
+/** sets up an environment around the execution of the command.
+ *
+ * @author Tom Baeyens
+ */
+public class EnvironmentInterceptor extends Interceptor {
+
+ protected EnvironmentFactory environmentFactory;
+ protected Policy policy = Policy.REQUIRES;
+
+ public <T> T execute(Command<T> command) {
+ if ( isEnvironmentCreationNecessary() ) {
+ return executeInNewEnvironment(command);
+ } else {
+ return executeInExistingEnvironment(command);
+ }
+ }
+
+ protected <T> T executeInExistingEnvironment(Command<T> command) {
+ return next.execute(command);
+ }
+
+ protected <T> T executeInNewEnvironment(Command<T> command) {
+ EnvironmentImpl environment = environmentFactory.openEnvironment();
+ try {
+ return next.execute(command);
+
+ } finally {
+ environment.close();
+ }
+ }
+
+ protected boolean isEnvironmentCreationNecessary() {
+ return policy==Policy.REQUIRES_NEW
+ || (EnvironmentImpl.getCurrent()==null);
+ }
+
+ public EnvironmentFactory getEnvironmentFactory() {
+ return environmentFactory;
+ }
+ public void setEnvironmentFactory(EnvironmentFactory environmentFactory) {
+ this.environmentFactory = environmentFactory;
+ }
+ public Policy getPolicy() {
+ return policy;
+ }
+ public void setPolicy(Policy policy) {
+ this.policy = policy;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/ExecutionServiceImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/ExecutionServiceImpl.java
new file mode 100644
index 0000000..2bbd095
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/ExecutionServiceImpl.java
@@ -0,0 +1,153 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.svc;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.ExecutionService;
+import org.jbpm.api.ProcessInstance;
+import org.jbpm.api.ProcessInstanceQuery;
+import org.jbpm.pvm.internal.cmd.CreateProcessInstanceQueryCmd;
+import org.jbpm.pvm.internal.cmd.DeleteProcessInstance;
+import org.jbpm.pvm.internal.cmd.EndProcessInstance;
+import org.jbpm.pvm.internal.cmd.FindExecutionCmd;
+import org.jbpm.pvm.internal.cmd.GetExecutionVariableNamesCmd;
+import org.jbpm.pvm.internal.cmd.GetExecutionVariablesCmd;
+import org.jbpm.pvm.internal.cmd.SetExecutionVariablesCmd;
+import org.jbpm.pvm.internal.cmd.SignalCmd;
+import org.jbpm.pvm.internal.cmd.StartProcessInstanceCmd;
+import org.jbpm.pvm.internal.cmd.StartProcessInstanceInLatestCmd;
+import org.jbpm.pvm.internal.query.ProcessInstanceQueryImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ExecutionServiceImpl extends AbstractServiceImpl implements ExecutionService {
+
+ public ProcessInstance startProcessInstanceById(String processDefinitionId){
+ return commandService.execute(new StartProcessInstanceCmd(processDefinitionId, null, null));
+ }
+
+ public ProcessInstance startProcessInstanceById(String processDefinitionId, String executionKey) {
+ return commandService.execute(new StartProcessInstanceCmd(processDefinitionId, null, executionKey));
+ }
+
+ public ProcessInstance startProcessInstanceById(String processDefinitionId, Map<String, Object> variables){
+ return commandService.execute(new StartProcessInstanceCmd(processDefinitionId, variables, null));
+ }
+
+ public ProcessInstance startProcessInstanceById(String processDefinitionId, Map<String, Object> variables, String executionKey){
+ return commandService.execute(new StartProcessInstanceCmd(processDefinitionId, variables, executionKey));
+ }
+
+ public ProcessInstance startProcessInstanceByKey(String processDefinitionKey) {
+ return commandService.execute(new StartProcessInstanceInLatestCmd(processDefinitionKey, null, null));
+ }
+
+ public ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, ?> variables){
+ return commandService.execute(new StartProcessInstanceInLatestCmd(processDefinitionKey, variables, null));
+ }
+
+ public ProcessInstance startProcessInstanceByKey(String processDefinitionKey, String executionKey) {
+ return commandService.execute(new StartProcessInstanceInLatestCmd(processDefinitionKey, null, executionKey));
+ }
+
+ public ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, ?> variables, String executionKey){
+ return commandService.execute(new StartProcessInstanceInLatestCmd(processDefinitionKey, variables, executionKey));
+ }
+
+
+
+ public ProcessInstance signalExecutionById(String executionId) {
+ return commandService.execute(new SignalCmd(executionId, null, null));
+ }
+
+ public ProcessInstance signalExecutionById(String executionId, String signalName) {
+ return commandService.execute(new SignalCmd(executionId, signalName, null));
+ }
+
+ public ProcessInstance signalExecutionById(String executionId, String signalName, Map<String, ?> parameters) {
+ return commandService.execute(new SignalCmd(executionId, signalName, parameters));
+ }
+
+ public ProcessInstance signalExecutionById(String executionId, Map<String, ?> parameters) {
+ return commandService.execute(new SignalCmd(executionId, null, parameters));
+ }
+
+
+ public Execution findExecutionById(String executionId) {
+ return commandService.execute(new FindExecutionCmd(executionId));
+ }
+
+ public ProcessInstance findProcessInstanceById(String executionId) {
+ return (ProcessInstance) commandService.execute(new FindExecutionCmd(executionId));
+ }
+
+
+ public ProcessInstanceQuery createProcessInstanceQuery() {
+ ProcessInstanceQueryImpl query = commandService.execute(new CreateProcessInstanceQueryCmd());
+ query.setCommandService(commandService);
+ return query;
+ }
+
+ public void endProcessInstance(String processInstanceId, String state) {
+ commandService.execute(new EndProcessInstance(processInstanceId, state));
+ }
+
+ public void deleteProcessInstance(String processInstanceId) {
+ commandService.execute(new DeleteProcessInstance(processInstanceId));
+ }
+
+ public void deleteProcessInstanceCascade(String processInstanceId) {
+ commandService.execute(new DeleteProcessInstance(processInstanceId, true));
+ }
+
+ public Object getVariable(String executionId, String variableName) {
+ Set<String> variableNames = new HashSet<String>();
+ variableNames.add(variableName);
+ Map<String, Object> variables = commandService.execute(new GetExecutionVariablesCmd(executionId, variableNames));
+ return variables.get(variableName);
+ }
+
+ public Set<String> getVariableNames(String executionId) {
+ return commandService.execute(new GetExecutionVariableNamesCmd(executionId));
+ }
+
+ public Map<String, Object> getVariables(String executionId, Set<String> variableNames) {
+ return commandService.execute(new GetExecutionVariablesCmd(executionId, variableNames));
+ }
+
+ public void setVariable(String executionId, String name, Object value) {
+ SetExecutionVariablesCmd cmd = new SetExecutionVariablesCmd(executionId);
+ cmd.addVariable(name, value);
+ commandService.execute(cmd);
+ }
+
+ public void setVariables(String executionId, Map<String, ?> variables) {
+ SetExecutionVariablesCmd cmd = new SetExecutionVariablesCmd(executionId);
+ cmd.setVariables(variables);
+ commandService.execute(cmd);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/FindGroupIds.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/FindGroupIds.java
new file mode 100644
index 0000000..2d7b1dd
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/FindGroupIds.java
@@ -0,0 +1,35 @@
+package org.jbpm.pvm.internal.svc;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.identity.Group;
+import org.jbpm.pvm.internal.identity.cmd.FindGroupsCmd;
+
+
+public class FindGroupIds implements Command<List<String>> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String userId;
+
+ public FindGroupIds(String userId) {
+ this.userId = userId;
+ }
+
+ public List<String> execute(Environment environment) throws Exception {
+ List<String> groupIds = new ArrayList<String>();
+
+ FindGroupsCmd findGroupsCmd = new FindGroupsCmd(userId);
+ List<Group> groups = findGroupsCmd.execute(environment);
+ for (Group group: groups) {
+ groupIds.add(group.getId());
+ }
+
+ return groupIds;
+ }
+
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/HistoryServiceImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/HistoryServiceImpl.java
new file mode 100644
index 0000000..4a2108f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/HistoryServiceImpl.java
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.svc;
+
+import java.util.List;
+import java.util.Map;
+
+import org.jbpm.api.HistoryService;
+import org.jbpm.api.history.HistoryActivityInstanceQuery;
+import org.jbpm.api.history.HistoryComment;
+import org.jbpm.api.history.HistoryDetailQuery;
+import org.jbpm.api.history.HistoryProcessInstanceQuery;
+import org.jbpm.api.history.HistoryTaskQuery;
+import org.jbpm.pvm.internal.cmd.CreateHistoryActivityInstanceQueryCmd;
+import org.jbpm.pvm.internal.cmd.CreateHistoryDetailQueryCmd;
+import org.jbpm.pvm.internal.cmd.CreateHistoryProcessInstanceQueryCmd;
+import org.jbpm.pvm.internal.cmd.CreateHistoryTaskQueryCmd;
+import org.jbpm.pvm.internal.cmd.GetTaskCommentsCmd;
+import org.jbpm.pvm.internal.query.AvgDurationPerActivityQueryCmd;
+import org.jbpm.pvm.internal.query.ChoiceDistributionQueryCmd;
+import org.jbpm.pvm.internal.query.HistoryActivityInstanceQueryImpl;
+import org.jbpm.pvm.internal.query.HistoryDetailQueryImpl;
+import org.jbpm.pvm.internal.query.HistoryProcessInstanceQueryImpl;
+import org.jbpm.pvm.internal.query.HistoryTaskQueryImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryServiceImpl extends AbstractServiceImpl implements HistoryService {
+
+ public Map<String, Long> avgDurationPerActivity(String processDefinitionId) {
+ return (Map) commandService.execute(new AvgDurationPerActivityQueryCmd(processDefinitionId));
+ }
+
+ public Map<String, Integer> choiceDistribution(String processDefinitionId, String activityName) {
+ return (Map) commandService.execute(new ChoiceDistributionQueryCmd(processDefinitionId, activityName));
+ }
+
+ public HistoryProcessInstanceQuery createHistoryProcessInstanceQuery() {
+ HistoryProcessInstanceQueryImpl query = commandService.execute(new CreateHistoryProcessInstanceQueryCmd());
+ query.setCommandService(commandService);
+ return query;
+ }
+
+ public HistoryActivityInstanceQuery createHistoryActivityInstanceQuery() {
+ HistoryActivityInstanceQueryImpl query = commandService.execute(new CreateHistoryActivityInstanceQueryCmd());
+ query.setCommandService(commandService);
+ return query;
+ }
+
+ public HistoryTaskQuery createHistoryTaskQuery() {
+ HistoryTaskQueryImpl query = commandService.execute(new CreateHistoryTaskQueryCmd());
+ query.setCommandService(commandService);
+ return query;
+ }
+
+ public HistoryDetailQuery createHistoryDetailQuery() {
+ HistoryDetailQueryImpl query = commandService.execute(new CreateHistoryDetailQueryCmd());
+ query.setCommandService(commandService);
+ return query;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/IdentityServiceImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/IdentityServiceImpl.java
new file mode 100644
index 0000000..70f334e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/IdentityServiceImpl.java
@@ -0,0 +1,113 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.svc;
+
+import java.util.List;
+
+import org.jbpm.api.IdentityService;
+import org.jbpm.api.identity.Group;
+import org.jbpm.api.identity.User;
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.identity.cmd.CreateGroupCmd;
+import org.jbpm.pvm.internal.identity.cmd.CreateMembershipCmd;
+import org.jbpm.pvm.internal.identity.cmd.CreateUserCmd;
+import org.jbpm.pvm.internal.identity.cmd.DeleteGroupCmd;
+import org.jbpm.pvm.internal.identity.cmd.DeleteMembershipCmd;
+import org.jbpm.pvm.internal.identity.cmd.DeleteUserCmd;
+import org.jbpm.pvm.internal.identity.cmd.FindGroupCmd;
+import org.jbpm.pvm.internal.identity.cmd.FindGroupsCmd;
+import org.jbpm.pvm.internal.identity.cmd.FindUserCmd;
+import org.jbpm.pvm.internal.identity.cmd.FindUsersCmd;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class IdentityServiceImpl extends AbstractServiceImpl implements IdentityService {
+
+ protected CommandService commandService;
+
+ public void createUser(String userId, String givenName, String familyName) {
+ commandService.execute(new CreateUserCmd(userId, givenName, familyName));
+ }
+
+ public void createUser(String userId, String givenName, String familyName, String businessEmail) {
+ commandService.execute(new CreateUserCmd(userId, givenName, familyName, businessEmail));
+ }
+
+ public User findUserById(String userId) {
+ return commandService.execute(new FindUserCmd(userId));
+ }
+
+ public List<User> findUsers() {
+ return commandService.execute(new FindUsersCmd());
+ }
+
+ public void deleteUser(String userId) {
+ commandService.execute(new DeleteUserCmd(userId));
+ }
+
+ public String createGroup(String groupName) {
+ return commandService.execute(new CreateGroupCmd(groupName, null, null));
+ }
+
+ public String createGroup(String groupName, String groupType) {
+ return commandService.execute(new CreateGroupCmd(groupName, groupType, null));
+ }
+
+ public String createGroup(String groupName, String groupType, String parentGroupId) {
+ return commandService.execute(new CreateGroupCmd(groupName, groupType, parentGroupId));
+ }
+
+ public Group findGroupById(String groupId) {
+ return commandService.execute(new FindGroupCmd(groupId));
+ }
+
+ public List<String> findGroupIdsByUser(String userId) {
+ return commandService.execute(new FindGroupIds(userId));
+ }
+
+ public List<Group> findGroupsByUser(String userId) {
+ return commandService.execute(new FindGroupsCmd(userId));
+ }
+
+ public List<Group> findGroupsByUserAndGroupType(String userId, String groupType) {
+ return commandService.execute(new FindGroupsCmd(userId, groupType));
+ }
+
+ public void deleteGroup(String groupId) {
+ commandService.execute(new DeleteGroupCmd(groupId));
+ }
+
+ public void createMembership(String userId, String groupId) {
+ commandService.execute(new CreateMembershipCmd(userId, groupId, null));
+ }
+
+ public void createMembership(String userId, String groupId, String role) {
+ commandService.execute(new CreateMembershipCmd(userId, groupId, role));
+ }
+
+
+ public void deleteMembership(String userId, String groupId, String role) {
+ commandService.execute(new DeleteMembershipCmd(userId, groupId, role));
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/Interceptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/Interceptor.java
new file mode 100644
index 0000000..f081b7c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/Interceptor.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.svc;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.cmd.CommandService;
+
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class Interceptor implements CommandService {
+
+ private static final Log log = Log.getLog(Interceptor.class.getName());
+
+ protected CommandService next;
+
+ public CommandService getNext() {
+ return next;
+ }
+ public void setNext(CommandService next) {
+ this.next = next;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/ManagementServiceImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/ManagementServiceImpl.java
new file mode 100644
index 0000000..5bef1b2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/ManagementServiceImpl.java
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.svc;
+
+import org.jbpm.api.JobQuery;
+import org.jbpm.api.ManagementService;
+import org.jbpm.pvm.internal.cmd.CreateJobQueryCmd;
+import org.jbpm.pvm.internal.cmd.ExecuteJobCmd;
+import org.jbpm.pvm.internal.query.JobQueryImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ManagementServiceImpl extends AbstractServiceImpl implements ManagementService {
+
+ public void executeJob(String jobId) {
+ commandService.execute(new ExecuteJobCmd(jobId));
+ }
+
+ public JobQuery createJobQuery() {
+ JobQueryImpl query = commandService.execute(new CreateJobQueryCmd());
+ query.setCommandService(commandService);
+ return query;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/Policy.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/Policy.java
new file mode 100644
index 0000000..dd297b8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/Policy.java
@@ -0,0 +1,27 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.svc;
+
+public enum Policy {
+ REQUIRES,
+ REQUIRES_NEW
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/RetryInterceptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/RetryInterceptor.java
new file mode 100644
index 0000000..dc2a516
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/RetryInterceptor.java
@@ -0,0 +1,90 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.svc;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.internal.log.Log;
+
+import org.hibernate.StaleStateException;
+
+/** retries the command execution in case hibernate throws optimistic locking
+ * (StaleObjectException) exceptions.
+ *
+ * @author Tom Baeyens
+ */
+public class RetryInterceptor extends Interceptor {
+
+ private static final Log log = Log.getLog(RetryInterceptor.class.getName());
+
+ int retries = 3;
+ long delay = 50;
+ long delayFactor = 4;
+
+ public <T> T execute(Command<T> command) {
+
+ // TODO JBPM-2196 unify the retry code with the JtaTransactionInterceptor
+
+ int attempt = 1;
+ long sleepTime = delay;
+ while (attempt<=retries) {
+ if (attempt>1) {
+ log.trace("retrying...");
+ }
+ try {
+
+ return next.execute(command);
+
+ } catch (StaleStateException e) {
+ attempt++;
+ log.trace("optimistic locking failed: "+e);
+ log.trace("waiting "+sleepTime+" millis");
+ try {
+ Thread.sleep(sleepTime);
+ } catch (InterruptedException e1) {
+ log.trace("retry sleeping got interrupted");
+ }
+ sleepTime *= delayFactor;
+ }
+ }
+ throw new JbpmException("gave up after "+attempt+" attempts");
+ }
+
+ public int getRetries() {
+ return retries;
+ }
+ public void setRetries(int retries) {
+ this.retries = retries;
+ }
+ public long getDelay() {
+ return delay;
+ }
+ public void setDelay(long delay) {
+ this.delay = delay;
+ }
+ public long getDelayFactor() {
+ return delayFactor;
+ }
+ public void setDelayFactor(long delayFactor) {
+ this.delayFactor = delayFactor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/SerializeInterceptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/SerializeInterceptor.java
new file mode 100644
index 0000000..2a2f093
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/SerializeInterceptor.java
@@ -0,0 +1,61 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.svc;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.internal.log.Log;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class SerializeInterceptor extends Interceptor {
+
+ private static final Log log = Log.getLog(SerializeInterceptor.class.getName());
+
+ public <T> T execute(Command<T> command) {
+ log.info("serializing command "+command);
+ Command<T> serializedCommand = (Command<T>) serialize(command);
+ T returnValue = next.execute(serializedCommand);
+ T serializedReturnValue = (T) serialize(returnValue);
+ return serializedReturnValue;
+ }
+
+ public Object serialize(Object o) {
+ try {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(baos);
+ oos.writeObject(o);
+ ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+ ObjectInputStream ois = new ObjectInputStream(bais);
+ return ois.readObject();
+ } catch (Exception e) {
+ throw new JbpmException("serialization exception", e);
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/SkipInterceptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/SkipInterceptor.java
new file mode 100644
index 0000000..d8ae431
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/SkipInterceptor.java
@@ -0,0 +1,46 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.svc;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class SkipInterceptor extends Interceptor {
+
+ static DefaultCommandService defaultCommandService = new DefaultCommandService();
+
+ public <T> T execute(Command<T> command) {
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ // if there is an environment active
+ if (environment!=null) {
+ // skip the rest of the interceptor stack and just execute the command
+ return defaultCommandService.execute(command);
+ }
+
+ return next.execute(command);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/TaskServiceImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/TaskServiceImpl.java
new file mode 100644
index 0000000..7fb35ac
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/svc/TaskServiceImpl.java
@@ -0,0 +1,206 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.svc;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.jbpm.api.TaskQuery;
+import org.jbpm.api.TaskService;
+import org.jbpm.api.history.HistoryComment;
+import org.jbpm.api.task.Participation;
+import org.jbpm.api.task.Task;
+import org.jbpm.pvm.internal.cmd.AddParticipationCmd;
+import org.jbpm.pvm.internal.cmd.AddReplyCommentCmd;
+import org.jbpm.pvm.internal.cmd.AddTaskCommentCmd;
+import org.jbpm.pvm.internal.cmd.AssignTaskCmd;
+import org.jbpm.pvm.internal.cmd.CompositeCmd;
+import org.jbpm.pvm.internal.cmd.DeleteTaskCmd;
+import org.jbpm.pvm.internal.cmd.CompleteTaskCmd;
+import org.jbpm.pvm.internal.cmd.CreateTaskQueryCmd;
+import org.jbpm.pvm.internal.cmd.DeleteCommentCmd;
+import org.jbpm.pvm.internal.cmd.GetOutcomes;
+import org.jbpm.pvm.internal.cmd.GetParticipantsCmd;
+import org.jbpm.pvm.internal.cmd.GetSubTasksCmd;
+import org.jbpm.pvm.internal.cmd.GetTaskCmd;
+import org.jbpm.pvm.internal.cmd.GetTaskCommentsCmd;
+import org.jbpm.pvm.internal.cmd.GetTaskVariableNamesCmd;
+import org.jbpm.pvm.internal.cmd.GetTaskVariablesCmd;
+import org.jbpm.pvm.internal.cmd.NewTaskCmd;
+import org.jbpm.pvm.internal.cmd.RemoveParticipantCmd;
+import org.jbpm.pvm.internal.cmd.SaveTaskCmd;
+import org.jbpm.pvm.internal.cmd.SetTaskVariablesCmd;
+import org.jbpm.pvm.internal.query.TaskQueryImpl;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+/**
+ * @author Alejandro Guizar, Tom Baeyens
+ * @author Heiko Braun <heiko.braun@jboss.com>
+ */
+public class TaskServiceImpl extends AbstractServiceImpl implements TaskService {
+
+ public Task newTask() {
+ return commandService.execute(new NewTaskCmd(null));
+ }
+
+ public Task getTask(String taskId) {
+ return commandService.execute(new GetTaskCmd(taskId));
+ }
+
+ public String saveTask(Task task) {
+ return commandService.execute(new SaveTaskCmd((TaskImpl) task));
+ }
+
+ public void deleteTask(String taskId) {
+ commandService.execute(new DeleteTaskCmd(taskId));
+ }
+
+ public void deleteTask(String taskId, String reason) {
+ commandService.execute(new DeleteTaskCmd(taskId, reason));
+ }
+
+ public void deleteTaskCascade(String taskId) {
+ commandService.execute(new DeleteTaskCmd(taskId, true));
+ }
+
+ public void completeTask(String taskId) {
+ commandService.execute(new CompleteTaskCmd(taskId));
+ }
+
+ public void completeTask(String taskId, Map<String, Object> variables) {
+ completeTask(taskId, null, variables);
+ }
+
+ public void completeTask(String taskId, String outcome) {
+ commandService.execute(new CompleteTaskCmd(taskId, outcome));
+ }
+
+ public void completeTask(String taskId, String outcome, Map<String, Object> variables) {
+ SetTaskVariablesCmd setTaskVariablesCmd = new SetTaskVariablesCmd(taskId);
+ setTaskVariablesCmd.setVariables(variables);
+ CompositeCmd compositeCmd = new CompositeCmd();
+ compositeCmd.addCommand(setTaskVariablesCmd);
+ compositeCmd.addCommand(new CompleteTaskCmd(taskId, outcome));
+ commandService.execute(compositeCmd);
+ }
+
+ public void addTaskParticipatingUser(String taskId, String userId, String participation) {
+ commandService.execute(new AddParticipationCmd(taskId, null, userId, null, participation));
+ }
+
+ public void addTaskParticipatingGroup(String taskId, String groupId, String participation) {
+ commandService.execute(new AddParticipationCmd(taskId, null, null, groupId, participation));
+ }
+
+ public List<Participation> getTaskParticipations(String taskId) {
+ return commandService.execute(new GetParticipantsCmd(taskId, null));
+ }
+
+ public void removeTaskParticipatingUser(String taskId, String userId, String participation) {
+ commandService.execute(new RemoveParticipantCmd(taskId, null, userId, null, participation));
+ }
+
+ public void removeTaskParticipatingGroup(String taskId, String groupId, String participation) {
+ commandService.execute(new RemoveParticipantCmd(taskId, null, null, groupId, participation));
+ }
+
+
+ public List<Task> findPersonalTasks(String userId) {
+ return createTaskQuery()
+ .assignee(userId)
+ .orderDesc(TaskQuery.PROPERTY_PRIORITY)
+ .list();
+ }
+
+ public List<Task> findGroupTasks(String userId) {
+ return createTaskQuery()
+ .candidate(userId)
+ .orderDesc(TaskQuery.PROPERTY_PRIORITY)
+ .list();
+ }
+
+ public TaskQuery createTaskQuery() {
+ TaskQueryImpl query = commandService.execute(new CreateTaskQueryCmd());
+ query.setCommandService(commandService);
+ return query;
+ }
+
+ public List<Task> getSubTasks(String taskId) {
+ return commandService.execute(new GetSubTasksCmd(taskId));
+ }
+
+ public Task newTask(String parentTaskId) {
+ return commandService.execute(new NewTaskCmd(parentTaskId));
+ }
+
+ public HistoryComment addTaskComment(String taskId, String message) {
+ return commandService.execute(new AddTaskCommentCmd(taskId, message));
+ }
+
+ public List<HistoryComment> getTaskComments(String taskId) {
+ return commandService.execute(new GetTaskCommentsCmd(taskId));
+ }
+
+ public void deleteComment(String commentId) {
+ commandService.execute(new DeleteCommentCmd(commentId));
+ }
+
+ public HistoryComment addReplyComment(String commentId, String message) {
+ return commandService.execute(new AddReplyCommentCmd(commentId, message));
+ }
+
+ public void assignTask(String taskId, String userId) {
+ commandService.execute(new AssignTaskCmd(taskId, userId));
+ }
+
+ public void takeTask(String taskId, String userId) {
+ commandService.execute(new AssignTaskCmd(taskId, userId, true));
+ }
+
+ public Object getVariable(String taskId, String variableName) {
+ Set<String> variableNames = new HashSet<String>();
+ variableNames.add(variableName);
+ GetTaskVariablesCmd cmd = new GetTaskVariablesCmd(taskId, variableNames);
+ Map<String, Object> variables = commandService.execute(cmd);
+ return variables.get(variableName);
+ }
+
+ public Set<String> getVariableNames(String taskDbid) {
+ return commandService.execute(new GetTaskVariableNamesCmd(taskDbid));
+ }
+
+ public Map<String, Object> getVariables(String taskDbid, Set<String> variableNames) {
+ return commandService.execute(new GetTaskVariablesCmd(taskDbid, variableNames));
+ }
+
+ public void setVariables(String taskDbid, Map<String, Object> variables) {
+ SetTaskVariablesCmd cmd = new SetTaskVariablesCmd(taskDbid);
+ cmd.setVariables(variables);
+ commandService.execute(cmd);
+ }
+
+ public Set<String> getOutcomes(String taskId) {
+ return commandService.execute(new GetOutcomes(taskId));
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/AssignableDefinitionImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/AssignableDefinitionImpl.java
new file mode 100644
index 0000000..7bb2c2e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/AssignableDefinitionImpl.java
@@ -0,0 +1,110 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.task;
+
+import org.jbpm.pvm.internal.model.ProcessElementImpl;
+import org.jbpm.pvm.internal.util.EqualsUtil;
+import org.jbpm.pvm.internal.wire.usercode.UserCodeReference;
+
+/**
+ * @author Tom Baeyens
+ */
+public class AssignableDefinitionImpl extends ProcessElementImpl {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String name;
+ protected String description;
+
+ protected String assigneeExpression;
+ protected String assigneeExpressionLanguage;
+ protected String candidateUsersExpression;
+ protected String candidateUsersExpressionLanguage;
+ protected String candidateGroupsExpression;
+ protected String candidateGroupsExpressionLanguage;
+ protected UserCodeReference assignmentHandlerReference;
+
+ // equals ///////////////////////////////////////////////////////////////////
+ // hack to support comparing hibernate proxies against the real objects
+ // since this always falls back to ==, we don't need to overwrite the hashcode
+ public boolean equals(Object o) {
+ return EqualsUtil.equals(this, o);
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public String getAssigneeExpression() {
+ return assigneeExpression;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getDescription() {
+ return description;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+ public void setAssigneeExpression(String assigneeExpression) {
+ this.assigneeExpression = assigneeExpression;
+ }
+ public UserCodeReference getAssignmentHandlerReference() {
+ return assignmentHandlerReference;
+ }
+ public void setAssignmentHandlerReference(UserCodeReference assignmentHandlerReference) {
+ this.assignmentHandlerReference = assignmentHandlerReference;
+ }
+ public String getAssigneeExpressionLanguage() {
+ return assigneeExpressionLanguage;
+ }
+ public void setAssigneeExpressionLanguage(String assigneeExpressionLanguage) {
+ this.assigneeExpressionLanguage = assigneeExpressionLanguage;
+ }
+ public String getCandidateUsersExpression() {
+ return candidateUsersExpression;
+ }
+ public void setCandidateUsersExpression(String candidateUsersExpression) {
+ this.candidateUsersExpression = candidateUsersExpression;
+ }
+ public String getCandidateUsersExpressionLanguage() {
+ return candidateUsersExpressionLanguage;
+ }
+ public void setCandidateUsersExpressionLanguage(String candidateUsersExpressionLanguage) {
+ this.candidateUsersExpressionLanguage = candidateUsersExpressionLanguage;
+ }
+ public String getCandidateGroupsExpression() {
+ return candidateGroupsExpression;
+ }
+ public void setCandidateGroupsExpression(String candidateGroupsExpression) {
+ this.candidateGroupsExpression = candidateGroupsExpression;
+ }
+ public String getCandidateGroupsExpressionLanguage() {
+ return candidateGroupsExpressionLanguage;
+ }
+ public void setCandidateGroupsExpressionLanguage(String candidateGroupsExpressionLanguage) {
+ this.candidateGroupsExpressionLanguage = candidateGroupsExpressionLanguage;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/FormBehaviour.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/FormBehaviour.java
new file mode 100644
index 0000000..2765626
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/FormBehaviour.java
@@ -0,0 +1,32 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.task;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface FormBehaviour {
+
+ String getFormResourceName();
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/LifeCycle.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/LifeCycle.java
new file mode 100644
index 0000000..c2ce25a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/LifeCycle.java
@@ -0,0 +1,95 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.task;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.id.IdComposer;
+import org.jbpm.pvm.internal.model.Activity;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public class LifeCycle extends ProcessDefinitionImpl {
+
+ private static final long serialVersionUID = 1L;
+ private static LifeCycleParser lifeCycleParser = new LifeCycleParser();
+ private static Map<String, ProcessDefinitionImpl> lifeCycleProcesses = new HashMap<String, ProcessDefinitionImpl>();
+
+ public static String initialise(TaskImpl task) {
+ ProcessDefinitionImpl lifeCycle = getLifeCycle(task);
+ Map<String, Object> lifeCycleVariables = new HashMap<String, Object>();
+ lifeCycleVariables.put("task", task);
+ ExecutionImpl lifeCycleExecution = (ExecutionImpl) lifeCycle.createProcessInstance();
+ lifeCycleExecution.setVariables(lifeCycleVariables);
+ lifeCycleExecution.start();
+ return lifeCycleExecution.getActivity().getName();
+ }
+
+ public static ProcessDefinitionImpl getLifeCycle(TaskImpl task) {
+ if (task==null) {
+ throw new JbpmException("task is null");
+ }
+ String resource = task.getLifeCycleResource();
+ if (resource==null) {
+ throw new JbpmException("task "+task.getClass().getName()+" did'nt return a lifecycle");
+ }
+ ProcessDefinitionImpl lifeCycleProcess;
+ synchronized (lifeCycleProcesses) {
+ lifeCycleProcess = lifeCycleProcesses.get(resource);
+ if (lifeCycleProcess==null) {
+ lifeCycleProcess = (ProcessDefinitionImpl) lifeCycleParser
+ .createParse()
+ .setResource(resource)
+ .execute()
+ .checkErrors("task lifecycle")
+ .getDocumentObject();
+ lifeCycleProcesses.put(resource, lifeCycleProcess);
+ }
+ }
+ return lifeCycleProcess;
+ }
+
+ protected static void fireLifeCycleEvent(String eventName, TaskImpl task) {
+ ExecutionImpl lifeCycleExecution = new ExecutionImpl();
+ ProcessDefinitionImpl lifeCycleProcess = getLifeCycle(task);
+ lifeCycleExecution.setProcessDefinition(lifeCycleProcess);
+ String state = task.getState();
+ Activity activity = lifeCycleProcess.getActivity(state);
+ lifeCycleExecution.setActivity((ActivityImpl) activity);
+ lifeCycleExecution.signal(eventName);
+ task.setState(lifeCycleExecution.getActivity().getName());
+ }
+
+ public IdComposer getIdGenerator() {
+ // overrides the default ProcessDefinitionImpl behaviour that will end up
+ // in the execution being persisted
+ return null;
+ }
+
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/LifeCycleParser.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/LifeCycleParser.java
new file mode 100644
index 0000000..ee424c7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/LifeCycleParser.java
@@ -0,0 +1,109 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.task;
+
+import java.util.List;
+
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.model.TransitionImpl;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/**
+ * @author Tom Baeyens
+ */
+public class LifeCycleParser extends Parser {
+
+ public Object parseDocumentElement(Element element, Parse parse) {
+ ProcessDefinitionImpl lifeCycleProcess = new LifeCycle();
+ lifeCycleProcess.setName("TaskLifeCycle");
+
+ List<Element> stateElements = XmlUtil.elements(element, "state");
+ for (Element stateElement: stateElements) {
+ parseState(stateElement, lifeCycleProcess, parse);
+ }
+ for (Element stateElement: stateElements) {
+ parseTransitions(stateElement, lifeCycleProcess, parse);
+ }
+
+ String initialStateName = null;
+ if (element.hasAttribute("initial")) {
+ initialStateName = element.getAttribute("initial");
+ ActivityImpl initial = (ActivityImpl) lifeCycleProcess.getActivity(initialStateName);
+ if (initial!=null) {
+ lifeCycleProcess.setInitial(initial);
+ } else {
+ parse.addProblem("initial "+initialStateName+" doesn't exist", element);
+ }
+ }
+
+ return lifeCycleProcess;
+ }
+
+ public void parseTransitions(Element element, ProcessDefinitionImpl lifeCycleProcess, Parse parse) {
+ if (! element.hasAttribute("name")) {
+ parse.addProblem("state doesn't have a name: "+XmlUtil.toString(element), element);
+ return;
+ }
+ String stateName = element.getAttribute("name");
+ ActivityImpl state = (ActivityImpl) lifeCycleProcess.getActivity(stateName);
+
+ List<Element> transitionElements = XmlUtil.elements(element, "transition");
+ for (Element transitionElement: transitionElements) {
+ parseTransition(transitionElement, state, parse);
+ }
+ }
+
+ public void parseTransition(Element element, ActivityImpl state, Parse parse) {
+ if (! element.hasAttribute("name")) {
+ parse.addProblem("transition doesn't have a name: "+XmlUtil.toString(element), element);
+ return;
+ }
+ String transitionName = element.getAttribute("name");
+ if (! element.hasAttribute("to")) {
+ parse.addProblem("transition "+transitionName+" doesn't have a to attribute indicating the destination state: "+XmlUtil.toString(element), element);
+ return;
+ }
+ String destinationName = element.getAttribute("to");
+ ActivityImpl destination = (ActivityImpl) state.getProcessDefinition().getActivity(destinationName);
+ if (destination!=null) {
+ TransitionImpl transition = state.createOutgoingTransition();
+ transition.setDestination(destination);
+ transition.setName(transitionName);
+ } else {
+ parse.addProblem("destination "+destinationName+" of "+transitionName+" is unknown", element);
+ }
+ }
+
+ public void parseState(Element element, ProcessDefinitionImpl lifeCycleProcess, Parse parse) {
+ if (! element.hasAttribute("name")) {
+ parse.addProblem("state doesn't have an id: "+XmlUtil.toString(element), element);
+ return;
+ }
+ String stateName = element.getAttribute("name");
+ ActivityImpl state = lifeCycleProcess.createActivity(stateName);
+ state.setActivityBehaviour(new LifeCycleState());
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/LifeCycleState.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/LifeCycleState.java
new file mode 100644
index 0000000..7d0d377
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/LifeCycleState.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.task;
+
+import java.util.Map;
+
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.api.activity.ExternalActivityBehaviour;
+
+/**
+ * @author Tom Baeyens
+ */
+public class LifeCycleState implements ExternalActivityBehaviour {
+
+ private static final long serialVersionUID = 1L;
+
+ public void execute(ActivityExecution execution) throws Exception {
+ execution.waitForSignal();
+ }
+
+ public void signal(ActivityExecution execution, String signalName,
+ Map<String, ?> parameters) throws Exception {
+ execution.take(signalName);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/OpenTask.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/OpenTask.java
new file mode 100644
index 0000000..2f10be7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/OpenTask.java
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.task;
+
+import org.jbpm.api.model.OpenExecution;
+import org.jbpm.api.task.Assignable;
+import org.jbpm.api.task.Task;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface OpenTask extends Task, Assignable {
+
+ OpenExecution getExecution();
+
+ OpenTask createSubTask();
+ OpenTask createSubTask(String name);
+
+ boolean isSignalling();
+ void setSignalling(boolean isSignalling);
+
+ void delete(String reason);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/OpenTaskDefinition.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/OpenTaskDefinition.java
new file mode 100644
index 0000000..cd8cffa
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/OpenTaskDefinition.java
@@ -0,0 +1,30 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.task;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface OpenTaskDefinition {
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/ParticipationImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/ParticipationImpl.java
new file mode 100644
index 0000000..9e58c62
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/ParticipationImpl.java
@@ -0,0 +1,99 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.task;
+
+import java.io.Serializable;
+
+import org.jbpm.api.task.Participation;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.id.DbidGenerator;
+
+
+/** the relation between a task and a person.
+ * @author Tom Baeyens
+ */
+public class ParticipationImpl implements Serializable, Participation
+{
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+ protected int dbversion;
+
+ protected String userId;
+ protected String groupId;
+ protected String type;
+ protected TaskImpl task;
+ protected SwimlaneImpl swimlane;
+
+ public ParticipationImpl() {
+ }
+
+ public ParticipationImpl(String userId, String groupId, String type) {
+ this.dbid = EnvironmentImpl.getFromCurrent(DbidGenerator.class).getNextId();
+ this.userId = userId;
+ this.groupId = groupId;
+ this.type = type;
+ }
+
+ // customized getters and setters ///////////////////////////////////////////
+
+ public String getId() {
+ return Long.toString(dbid);
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public TaskImpl getTask() {
+ return task;
+ }
+ public void setTask(TaskImpl task) {
+ this.task = task;
+ }
+ public long getDbid() {
+ return dbid;
+ }
+ public SwimlaneImpl getSwimlane() {
+ return swimlane;
+ }
+ public void setSwimlane(SwimlaneImpl swimlane) {
+ this.swimlane = swimlane;
+ }
+ public String getType() {
+ return type;
+ }
+ public void setType(String type) {
+ this.type = type;
+ }
+ public String getUserId() {
+ return userId;
+ }
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+ public String getGroupId() {
+ return groupId;
+ }
+ public void setGroupId(String groupId) {
+ this.groupId = groupId;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/SwimlaneDefinitionImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/SwimlaneDefinitionImpl.java
new file mode 100644
index 0000000..bf02a7c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/SwimlaneDefinitionImpl.java
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.task;
+
+import java.io.Serializable;
+
+/**
+ * is a process role (aka participatingUser).
+ */
+public class SwimlaneDefinitionImpl extends AssignableDefinitionImpl implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/SwimlaneImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/SwimlaneImpl.java
new file mode 100644
index 0000000..3ce1109
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/SwimlaneImpl.java
@@ -0,0 +1,153 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.task;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.task.Assignable;
+import org.jbpm.api.task.Participation;
+import org.jbpm.api.task.Swimlane;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.util.EqualsUtil;
+
+/**
+ * runtime process role for a specific process instance.
+ */
+public class SwimlaneImpl implements Serializable, Swimlane, Assignable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+ protected int dbversion;
+ protected String name = null;
+ protected String assignee = null;
+ protected ExecutionImpl execution = null;
+ protected Set<ParticipationImpl> participations = new HashSet<ParticipationImpl>();
+ protected SwimlaneDefinitionImpl swimlaneDefinition = null;
+
+ // cloning //////////////////////////////////////////////////////////////////
+
+ /** initialize this swimlane's assignee and participations from the
+ * other swimlane. */
+ public void initialize(SwimlaneImpl other) {
+ this.assignee = other.getAssignee();
+ if (other.getParticipations()!=null) {
+ for (ParticipationImpl otherParticipation: other.getParticipations()) {
+ addParticipation(
+ otherParticipation.getUserId(),
+ otherParticipation.getGroupId(),
+ otherParticipation.getType()
+ );
+ }
+ }
+ }
+
+ // assignment methods ///////////////////////////////////////////////////////
+
+ public String getAssignee() {
+ return assignee;
+ }
+
+ public void setAssignee(String assignee) {
+ this.assignee = assignee;
+ }
+
+ // participations /////////////////////////////////////////////////////////////
+
+ public Set<ParticipationImpl> getParticipations() {
+ return participations;
+ }
+
+ public void addCandidateGroup(String groupId) {
+ addParticipation(null, groupId, Participation.CANDIDATE);
+ }
+
+ public void addCandidateUser(String userId) {
+ addParticipation(userId, null, Participation.CANDIDATE);
+ }
+
+ public Participation addParticipation(String userId, String groupId, String type) {
+ return addParticipation(new ParticipationImpl(userId, groupId, type));
+ }
+
+ private Participation addParticipation(ParticipationImpl participation) {
+ participation.setSwimlane(this);
+ participations.add(participation);
+ return participation;
+ }
+
+ public void removeParticipant(ParticipationImpl participant) {
+ if (participant==null) {
+ throw new JbpmException("participant is null");
+ }
+ if (participations.remove(participant)) {
+ ((ParticipationImpl)participant).setSwimlane(null);
+ }
+ }
+
+ // equals ///////////////////////////////////////////////////////////////////
+ // hack to support comparing hibernate proxies against the real objects
+ // since this always falls back to ==, we don't need to overwrite the hashcode
+ public boolean equals(Object o) {
+ return EqualsUtil.equals(this, o);
+ }
+
+ public String toString() {
+ return "Swimlane("+name+")";
+ }
+
+ // customized getters and setters ///////////////////////////////////////////
+
+ public String getId() {
+ return Long.toString(dbid);
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public long getDbid() {
+ return dbid;
+ }
+ public String getName() {
+ return name;
+ }
+ public SwimlaneDefinitionImpl getSwimlaneDefinition() {
+ return swimlaneDefinition;
+ }
+ public void setSwimlaneDefinition(SwimlaneDefinitionImpl swimlaneDefinition) {
+ this.swimlaneDefinition = swimlaneDefinition;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public ExecutionImpl getExecution() {
+ return execution;
+ }
+ public void setExecution(ExecutionImpl execution) {
+ this.execution = execution;
+ }
+ public void setDbid(long dbid) {
+ this.dbid = dbid;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/TaskConstants.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/TaskConstants.java
new file mode 100644
index 0000000..ccf5936
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/TaskConstants.java
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.task;
+
+/**
+ * Class containing static constants regarding tasks.
+ *
+ * @author Joram Barrez
+ */
+public final class TaskConstants {
+
+ private TaskConstants() {}
+
+ /**
+ * Only to be used internally!
+ * This constant is used when completing a task and not specifying
+ * an outcome.
+ *
+ * IMPORTANT: end-users cannot use this String as the name of an
+ * outgoing transition on a task!
+ */
+ public static final String NO_TASK_OUTCOME_SPECIFIED = "jbpm_no_task_outcome_specified_jbpm";
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/TaskDefinitionImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/TaskDefinitionImpl.java
new file mode 100644
index 0000000..edc6ccd
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/TaskDefinitionImpl.java
@@ -0,0 +1,73 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.task;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.pvm.internal.util.Priority;
+
+/**
+ * defines a task and how the actor(s) must be calculated at runtime.
+ */
+public class TaskDefinitionImpl extends AssignableDefinitionImpl implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String dueDateDuration;
+ protected String formResourceName;
+ protected List<TaskDefinitionImpl> subTaskDefinitions = new ArrayList<TaskDefinitionImpl>();
+ protected int priority = Priority.NORMAL;
+ protected SwimlaneDefinitionImpl swimlaneDefinition;
+
+ public int getPriority() {
+ return priority;
+ }
+ public void setPriority(int priority) {
+ this.priority = priority;
+ }
+ public List<TaskDefinitionImpl> getSubTaskDefinitions() {
+ return subTaskDefinitions;
+ }
+ public void setSubTaskDefinitions(List<TaskDefinitionImpl> subTaskDefinitions) {
+ this.subTaskDefinitions = subTaskDefinitions;
+ }
+ public SwimlaneDefinitionImpl getSwimlaneDefinition() {
+ return swimlaneDefinition;
+ }
+ public void setSwimlaneDefinition(SwimlaneDefinitionImpl swimlaneDefinition) {
+ this.swimlaneDefinition = swimlaneDefinition;
+ }
+ public String getDueDateDuration() {
+ return dueDateDuration;
+ }
+ public void setDueDateDuration(String dueDateDuration) {
+ this.dueDateDuration = dueDateDuration;
+ }
+ public String getFormResourceName() {
+ return formResourceName;
+ }
+ public void setFormResourceName(String form) {
+ this.formResourceName = form;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/TaskExecution.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/TaskExecution.java
new file mode 100644
index 0000000..7a0a923
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/TaskExecution.java
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.task;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface TaskExecution {
+
+ void decouple();
+
+ void complete();
+ void complete(boolean cascade);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/TaskImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/TaskImpl.java
new file mode 100644
index 0000000..3bbb312
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/task/TaskImpl.java
@@ -0,0 +1,494 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.task;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jbpm.api.Execution;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.model.Event;
+import org.jbpm.api.task.Assignable;
+import org.jbpm.api.task.Participation;
+import org.jbpm.api.task.Swimlane;
+import org.jbpm.api.task.Task;
+import org.jbpm.pvm.internal.client.ClientExecution;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.events.TaskComplete;
+import org.jbpm.pvm.internal.history.events.TaskDelete;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.util.EqualsUtil;
+import org.jbpm.pvm.internal.util.Priority;
+
+/**
+ * is one task instance that can be assigned to an actor (read: put in someone's task list) and that
+ * can trigger the continuation of execution of the token upon completion.
+ */
+public class TaskImpl extends ScopeInstanceImpl implements Serializable, OpenTask, Assignable {
+
+ private static final long serialVersionUID = 1L;
+
+ // private static Log log = Log.getLog(TaskImpl.class.getName());
+
+ protected boolean isNew;
+ protected String name;
+ protected String description;
+
+ protected String assignee;
+ protected Set<ParticipationImpl> participations = new HashSet<ParticipationImpl>();
+
+ protected String formResourceName;
+ protected Date createTime;
+ protected Date duedate;
+ protected Integer progress;
+ protected boolean isSignalling;
+
+ protected int priority = Priority.NORMAL;
+
+ protected String state = Task.STATE_OPEN;
+
+ protected String taskDefinitionName;
+ protected TaskDefinitionImpl taskDefinition;
+
+ protected ExecutionImpl execution;
+ protected ExecutionImpl processInstance;
+
+ // local storage of the execution id such that it
+ // can be lazily loaded when not needed.
+ protected String executionId;
+
+ protected String activityName;
+
+ protected SwimlaneImpl swimlane;
+
+ protected TaskImpl superTask;
+ protected Set<TaskImpl> subTasks;
+
+ protected Long executionDbid;
+ protected Long superTaskDbid;
+
+ public TaskImpl() {
+ }
+
+ // parent for variable lookup ///////////////////////////////////////////////
+
+ public ScopeInstanceImpl getParentVariableScope() {
+ return execution;
+ }
+
+ public TaskImpl getTask() {
+ return this;
+ }
+
+ // assignment ///////////////////////////////////////////////////////////////
+
+ public void take(String userId) {
+ if (assignee != null) {
+ throw new JbpmException("task already taken by " + this.assignee);
+ }
+ setAssignee(userId, true);
+ }
+
+ public void setAssignee(String userId) {
+ setAssignee(userId, false);
+ }
+
+ public void setAssignee(String assignee, boolean propagateToSwimlane) {
+ this.assignee = assignee;
+ if (propagateToSwimlane) {
+ propagateAssigneeToSwimlane();
+ }
+ if (execution != null) {
+ execution.fire(Event.ASSIGN, execution.getActivity());
+ }
+ }
+
+ protected void propagateAssigneeToSwimlane() {
+ if (swimlane != null) {
+ swimlane.setAssignee(assignee);
+ }
+ }
+
+ // participations /////////////////////////////////////////////////////////////
+
+ // TODO: Why does it return the impl. not the interface?
+ public Set<ParticipationImpl> getParticipations() {
+ return participations;
+ }
+
+ public Set<ParticipationImpl> getAllParticipants() {
+ Set<ParticipationImpl> allRoles = new HashSet<ParticipationImpl>();
+ if (!participations.isEmpty()) {
+ allRoles = new HashSet<ParticipationImpl>(participations);
+ }
+ if (swimlane != null) {
+ allRoles.addAll((Set) swimlane.getParticipations());
+ }
+ return allRoles;
+ }
+
+ public void addCandidateGroup(String groupId) {
+ addParticipation(null, groupId, Participation.CANDIDATE);
+ }
+
+ public void addCandidateUser(String userId) {
+ addParticipation(userId, null, Participation.CANDIDATE);
+ }
+
+ public Participation addParticipation(String userId, String groupId, String type) {
+ return addParticipant(new ParticipationImpl(userId, groupId, type));
+ }
+
+ private Participation addParticipant(ParticipationImpl participation) {
+ participation.setTask(this);
+ participations.add(participation);
+ return participation;
+ }
+
+ public void removeParticipant(ParticipationImpl participation) {
+ if (participation == null) {
+ throw new JbpmException("participant is null");
+ }
+ if (participations.remove(participation)) {
+ participation.setTask(null);
+ }
+ }
+
+ // completion ///////////////////////////////////////////////////////////////
+
+ public void complete() {
+ complete(TaskConstants.NO_TASK_OUTCOME_SPECIFIED);
+ }
+
+ public void complete(String outcome) {
+ historyTaskComplete(outcome);
+
+ if (isSignalling()) {
+ ClientExecution execution = (ClientExecution) getExecution();
+ execution.signal(outcome);
+ }
+
+ if (superTask != null) {
+ superTask.subTaskComplete(this, outcome);
+ }
+ }
+
+ protected void subTaskComplete(TaskImpl subTask, String outcome) {
+ }
+
+ public void delete(String reason) {
+ historyTaskDelete(reason);
+ }
+
+ // state ////////////////////////////////////////////////////////////////////
+
+ public boolean isCompleted() {
+ if (Task.STATE_COMPLETED.equals(state)) {
+ return true;
+ }
+ if ((Task.STATE_OPEN.equals(state)) || (Task.STATE_SUSPENDED.equals(state))) {
+ return false;
+ }
+ return true;
+ }
+
+ // subtasks /////////////////////////////////////////////////////////////////
+
+ public Set<Task> getSubTasks() {
+ if (subTasks == null) {
+ return Collections.emptySet();
+ }
+ return (Set) subTasks;
+ }
+
+ public TaskImpl createSubTask() {
+ DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class);
+ TaskImpl subTask = (TaskImpl) dbSession.createTask();
+ if (subTasks == null) {
+ subTasks = new HashSet<TaskImpl>();
+ }
+ addSubTask(subTask);
+ return subTask;
+ }
+
+ public TaskImpl createSubTask(String name) {
+ // TODO look up the task definition in the current task's
+ // subtask definitions and in the process's task definitions
+ TaskImpl subtask = createSubTask();
+ subtask.setName(name);
+ return subtask;
+ }
+
+ public TaskImpl addSubTask(TaskImpl subtask) {
+ if (subTasks == null) {
+ subTasks = new HashSet<TaskImpl>();
+ }
+ subtask.setSuperTask(this);
+ subTasks.add(subtask);
+ return subtask;
+ }
+
+ public void removeSubTask(Task subtask) {
+ if (subtask == null) {
+ throw new JbpmException("subtask is null");
+ }
+ if ((subTasks != null) && (subTasks.remove(subtask))) {
+ ((TaskImpl) subtask).setSuperTask(null);
+ }
+ }
+
+ // equals ///////////////////////////////////////////////////////////////////
+ // hack to support comparing hibernate proxies against the real objects
+ // since this always falls back to ==, we don't need to overwrite the hashcode
+ public boolean equals(Object o) {
+ return EqualsUtil.equals(this, o);
+ }
+
+ public String toString() {
+ return "Task(" + name + ")";
+ }
+
+ public String getLifeCycleResource() {
+ // the default lifecycle can be overridden in subclasses
+ return "jbpm.task.lifecycle.xml";
+ }
+
+ // modified getters and setters /////////////////////////////////////////////
+ public void setProgress(Integer progress) {
+ if ((progress < 0) || (progress > 100)) {
+ throw new JbpmException(
+ "task progress is a percentage (integer) and must be expressed between 0 and 100");
+ }
+ this.progress = progress;
+ }
+
+ public void cancelExecution(String signal) {
+ if (execution != null) {
+ execution.end("cancel");
+ }
+ }
+
+ public void historyTaskDelete(String reason) {
+ if (execution != null) {
+ HistoryEvent.fire(new TaskDelete(this, reason), execution);
+ }
+ }
+
+ public void historyTaskComplete(String outcome) {
+ if (execution != null) {
+ HistoryEvent.fire(new TaskComplete(outcome), execution);
+ }
+ }
+
+ public void signalExecution(String signalName) {
+ if (execution != null) {
+ execution.signal(signalName);
+ }
+ }
+
+ // special getters and setters //////////////////////////////////////////////
+
+ public TaskDefinitionImpl getTaskDefinition() {
+ if ((taskDefinition == null) && (taskDefinitionName != null) && (execution != null)) {
+ ProcessDefinitionImpl processDefinition = execution.getProcessDefinition();
+ taskDefinition = processDefinition.getTaskDefinition(taskDefinitionName);
+ }
+
+ return taskDefinition;
+ }
+
+ // customized getters and setters //////////////////////////////////////////
+
+ public String getId() {
+ return Long.toString(dbid);
+ }
+
+ public void setTaskDefinition(TaskDefinitionImpl taskDefinition) {
+ this.taskDefinition = taskDefinition;
+ this.taskDefinitionName = taskDefinition.getName();
+ }
+
+ public void setExecution(ExecutionImpl execution) {
+ this.execution = execution;
+ this.executionId = execution.getId();
+ this.activityName = execution.getActivityName();
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public int getPriority() {
+ return priority;
+ }
+
+ public void setPriority(int priority) {
+ this.priority = priority;
+ }
+
+ public Date getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(Date create) {
+ this.createTime = create;
+ }
+
+ public Date getDuedate() {
+ return duedate;
+ }
+
+ public void setDuedate(Date duedate) {
+ this.duedate = duedate;
+ }
+
+ public ExecutionImpl getExecution() {
+ return execution;
+ }
+
+ public void setExecution(Execution execution) {
+ this.execution = (ExecutionImpl) execution;
+ }
+
+ public String getState() {
+ return state;
+ }
+
+ public String getAssignee() {
+ return assignee;
+ }
+
+ public Swimlane getSwimlane() {
+ return swimlane;
+ }
+
+ public void setSwimlane(SwimlaneImpl swimlane) {
+ this.swimlane = swimlane;
+ }
+
+ public TaskImpl getSuperTask() {
+ return superTask;
+ }
+
+ public void setSuperTask(TaskImpl superTask) {
+ this.superTask = superTask;
+ }
+
+ public Integer getProgress() {
+ return progress;
+ }
+
+ public Long getExecutionDbid() {
+ return executionDbid;
+ }
+
+ public void setExecutionDbid(Long executionDbid) {
+ this.executionDbid = executionDbid;
+ }
+
+ public Long getSuperTaskDbid() {
+ return superTaskDbid;
+ }
+
+ public void setSuperTaskDbid(Long parentTaskDbid) {
+ this.superTaskDbid = parentTaskDbid;
+ }
+
+ public void setParticipations(Set<ParticipationImpl> participations) {
+ this.participations = participations;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+
+ public String getExecutionId() {
+ return executionId;
+ }
+
+ public String getActivityName() {
+ return activityName;
+ }
+
+ public void setActivityName(String activityName) {
+ this.activityName = activityName;
+ }
+
+ public void setSubTasks(Set<TaskImpl> subTasks) {
+ this.subTasks = subTasks;
+ }
+
+ public ExecutionImpl getProcessInstance() {
+ return processInstance;
+ }
+
+ public void setProcessInstance(ExecutionImpl processInstance) {
+ this.processInstance = processInstance;
+ }
+
+ public boolean isSignalling() {
+ return isSignalling;
+ }
+
+ public void setSignalling(boolean isSignalling) {
+ this.isSignalling = isSignalling;
+ }
+
+ public String getFormResourceName() {
+ return formResourceName;
+ }
+
+ public void setFormResourceName(String form) {
+ this.formResourceName = form;
+ }
+ public boolean isNew() {
+ return isNew;
+ }
+ public void setNew(boolean isNew) {
+ this.isNew = isNew;
+ }
+
+ public void setDbid(long dbid) {
+ this.dbid = dbid;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/test/JobTestHelper.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/test/JobTestHelper.java
new file mode 100644
index 0000000..9d65e43
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/test/JobTestHelper.java
@@ -0,0 +1,85 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.test;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.jbpm.api.Execution;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.api.cmd.Environment;
+import org.jbpm.api.job.Job;
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.cmd.ExecuteJobCmd;
+import org.jbpm.pvm.internal.job.MessageImpl;
+import org.jbpm.pvm.internal.job.TimerImpl;
+
+
+/** helper class for testing that executes messages and timers
+ * in the test runner thread. This way, the test can simulate
+ * timers and messages being executed. The duedate is ignored.
+ *
+ * @author Tom Baeyens
+ */
+public class JobTestHelper {
+
+ CommandService commandService;
+
+ public Execution executeMessage(final long executionDbid) {
+ return commandService.execute(new Command<Execution>() {
+ private static final long serialVersionUID = 1L;
+ public Execution execute(Environment environment) throws Exception {
+ Session session = environment.get(Session.class);
+ Query query = session.createQuery(
+ "select m.dbid " +
+ "from "+MessageImpl.class.getName()+" as m " +
+ "where m.execution.dbid = :executionDbid"
+ );
+ query.setLong("executionDbid", executionDbid);
+ query.setMaxResults(1);
+ Long messageDbid = (Long) query.uniqueResult();
+ ExecuteJobCmd executeJobCommand = new ExecuteJobCmd(messageDbid);
+ Job job = executeJobCommand.execute(environment);
+ return job.getExecution();
+ }
+ });
+ }
+
+ public Execution executeTimer(final long timerDbid) {
+ return commandService.execute(new Command<Execution>() {
+ private static final long serialVersionUID = 1L;
+ public Execution execute(Environment environment) throws Exception {
+ Session session = environment.get(Session.class);
+ Query query = session.createQuery(
+ "select t.dbid " +
+ "from "+TimerImpl.class.getName()+" as t " +
+ "where t.dbid = :timerDbid"
+ );
+ query.setLong("timerDbid", timerDbid);
+ query.setMaxResults(1);
+ Long timerDbid = (Long) query.uniqueResult();
+ ExecuteJobCmd executeJobCommand = new ExecuteJobCmd(timerDbid);
+ Job job = executeJobCommand.execute(environment);
+ return job.getExecution();
+ }
+ });
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/AbstractTransaction.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/AbstractTransaction.java
new file mode 100644
index 0000000..4ef5445
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/AbstractTransaction.java
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.tx;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class AbstractTransaction implements Transaction {
+
+ List<DeserializedObject> deserializedObjects = null;
+
+ public void registerDeserializedObject(DeserializedObject deserializedObject) {
+ if (deserializedObjects==null) {
+ deserializedObjects = new ArrayList<DeserializedObject>();
+ }
+ deserializedObjects.add(deserializedObject);
+ }
+
+ public void flushDeserializedObjects() {
+ if (deserializedObjects!=null) {
+ for (DeserializedObject deserializedObject: deserializedObjects) {
+ deserializedObject.flush();
+ }
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/DeserializedObject.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/DeserializedObject.java
new file mode 100644
index 0000000..6d98044
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/DeserializedObject.java
@@ -0,0 +1,67 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.tx;
+
+import java.util.Arrays;
+
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.type.converter.SerializableToBytesConverter;
+import org.jbpm.pvm.internal.type.variable.BlobVariable;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DeserializedObject {
+
+ private static final SerializableToBytesConverter serializableToBytesConverter = new SerializableToBytesConverter();
+
+ Object deserializedObject;
+ ScopeInstanceImpl scopeInstance;
+ BlobVariable blobVariable;
+
+ public DeserializedObject(Object deserializedObject, ScopeInstanceImpl scopeInstance, BlobVariable blobVariable) {
+ this.deserializedObject = deserializedObject;
+ this.scopeInstance = scopeInstance;
+ this.blobVariable = blobVariable;
+ }
+
+ public void flush() {
+ String variableName = blobVariable.getKey();
+ Object currentValue = scopeInstance.getVariable(variableName);
+
+ // first check if the deserialized object still is the value for that variable.
+ // a different, new object (of any type) might have been set in the meantime in that key-value-pair
+ if ( (currentValue!=null)
+ && (currentValue==deserializedObject)
+ ) {
+ // next, we check if the serialized object was actually changed or not
+ byte[] newBytes = (byte[]) serializableToBytesConverter.convert(currentValue, null, null);
+ byte[] persistedBytes = blobVariable.getLob().extractBytes();
+ // if it is changed
+ if (!Arrays.equals(persistedBytes, newBytes)) {
+ // then do an automatic update
+ blobVariable.setValue(deserializedObject, scopeInstance);
+ }
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/HibernateSessionResource.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/HibernateSessionResource.java
new file mode 100644
index 0000000..bec03ac
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/HibernateSessionResource.java
@@ -0,0 +1,85 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.tx;
+
+import org.hibernate.Session;
+import org.jbpm.internal.log.Log;
+
+/**
+ * @author Tom Baeyens
+ */
+public class HibernateSessionResource implements StandardResource {
+
+ private static final Log log = Log.getLog(HibernateSessionResource.class.getName());
+
+ protected Session session;
+ protected org.hibernate.Transaction transaction;
+
+ public HibernateSessionResource(Session session) {
+ this.session = session;
+ if (log.isDebugEnabled()) {
+ log.debug("----- beginning hibernate tx "+System.identityHashCode(session)+" --------------------------------------------------------");
+ }
+
+ try {
+ this.transaction = session.beginTransaction();
+ } catch (RuntimeException e) {
+ log.error("hibernate transaction begin failed. closing hibernate session", e);
+ session.close();
+ throw e;
+ }
+
+ if (log.isTraceEnabled()) log.trace("begun hibernate tx "+System.identityHashCode(transaction)+" on hibernate session "+System.identityHashCode(session));
+ }
+
+ public void prepare() {
+ if (log.isTraceEnabled()) log.trace("flushing hibernate session "+System.identityHashCode(session));
+ session.flush();
+ }
+
+ public void commit() {
+ if (log.isDebugEnabled()) {
+ log.debug("----- committing hibernate tx "+System.identityHashCode(transaction)+" -------------------------------------------------------");
+ }
+ try {
+ transaction.commit();
+ } finally {
+ closeSession();
+ }
+ }
+
+ private void closeSession() {
+ if (log.isTraceEnabled()) log.trace("closing hibernate session "+System.identityHashCode(session));
+ session.close();
+ }
+
+ public void rollback() {
+ if (log.isDebugEnabled()) {
+ log.debug("----- rolling back hibernate tx "+System.identityHashCode(transaction)+" -----------------------------------------------------");
+ }
+ try {
+ transaction.rollback();
+ } finally {
+ closeSession();
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/JtaRetryInterceptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/JtaRetryInterceptor.java
new file mode 100644
index 0000000..4247a36
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/JtaRetryInterceptor.java
@@ -0,0 +1,58 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.tx;
+
+import javax.transaction.Status;
+import javax.transaction.UserTransaction;
+
+import org.jbpm.api.cmd.Command;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.svc.RetryInterceptor;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class JtaRetryInterceptor extends RetryInterceptor {
+
+ private static Log log = Log.getLog(JtaRetryInterceptor.class.getName());
+
+ public <T> T execute(Command<T> command) {
+ JtaTransaction jtaTransaction = EnvironmentImpl.getFromCurrent(JtaTransaction.class);
+ UserTransaction userTransaction = jtaTransaction.lookupJeeUserTransaction();
+ int status = JtaTransaction.getUserTransactionStatus(userTransaction);
+ if (status == Status.STATUS_NO_TRANSACTION) {
+ return executeWithRetry(command);
+ }
+ log.trace("transaction in progress. skipping retry interceptor");
+ return executeWithoutRetry(command);
+ }
+
+ public <T> T executeWithRetry(Command<T> command) {
+ return super.execute(command);
+ }
+
+ public <T> T executeWithoutRetry(Command<T> command) {
+ return next.execute(command);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/JtaStatusHelper.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/JtaStatusHelper.java
new file mode 100644
index 0000000..5fe0a31
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/JtaStatusHelper.java
@@ -0,0 +1,57 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.tx;
+
+import javax.transaction.Status;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class JtaStatusHelper {
+
+ public static String toString(int txStatus) {
+ if (txStatus==Status.STATUS_ACTIVE) {
+ return "STATUS_ACTIVE";
+ } else if (txStatus==Status.STATUS_COMMITTED) {
+ return "STATUS_COMMITTED";
+ } else if (txStatus==Status.STATUS_COMMITTING) {
+ return "STATUS_COMMITTING";
+ } else if (txStatus==Status.STATUS_MARKED_ROLLBACK) {
+ return "STATUS_MARKED_ROLLBACK";
+ } else if (txStatus==Status.STATUS_NO_TRANSACTION) {
+ return "STATUS_NO_TRANSACTION";
+ } else if (txStatus==Status.STATUS_PREPARED) {
+ return "STATUS_PREPARED";
+ } else if (txStatus==Status.STATUS_PREPARING) {
+ return "STATUS_PREPARING";
+ } else if (txStatus==Status.STATUS_ROLLEDBACK) {
+ return "STATUS_ROLLEDBACK";
+ } else if (txStatus==Status.STATUS_ROLLING_BACK) {
+ return "STATUS_ROLLING_BACK";
+ } else if (txStatus==Status.STATUS_UNKNOWN) {
+ return "STATUS_UNKNOWN";
+ } else {
+ return "unknown";
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/JtaTransaction.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/JtaTransaction.java
new file mode 100644
index 0000000..825d9ad
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/JtaTransaction.java
@@ -0,0 +1,152 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.tx;
+
+import javax.naming.InitialContext;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.TransactionManager;
+import javax.transaction.UserTransaction;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.internal.log.Log;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class JtaTransaction extends AbstractTransaction implements Transaction {
+
+ private static Log log = Log.getLog(JtaTransaction.class.getName());
+
+ public static final String JNDINAME_USERTRANSACTION_JBOSS_GLOBAL = "UserTransaction";
+ public static final String JNDINAME_TRANSACTIONMANAGER_JBOSS_GLOBAL = "java:/TransactionManager";
+
+ protected String userTransactionJndiName = JNDINAME_USERTRANSACTION_JBOSS_GLOBAL;
+ protected String transactionManagerJndiName = JNDINAME_TRANSACTIONMANAGER_JBOSS_GLOBAL;
+
+ public boolean isRollbackOnly() {
+ try {
+ return lookupJeeUserTransaction().getStatus()==Status.STATUS_MARKED_ROLLBACK;
+ } catch (SystemException e) {
+ throw new JbpmException("couldn't get status of user transaction: "+e.getMessage(), e);
+ }
+ }
+
+ public void setRollbackOnly() {
+ try {
+ lookupJeeUserTransaction().setRollbackOnly();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't set user transaction to rollback only: "+e.getMessage(), e);
+ }
+ }
+
+ public void registerSynchronization(Synchronization synchronization) {
+ try {
+ lookupJeeTransaction().registerSynchronization(synchronization);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't register synchronization: "+e.getMessage(), e);
+ }
+ }
+
+ public void begin() {
+ try {
+ lookupJeeUserTransaction().begin();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't begin transaction: "+e.getMessage(), e);
+ }
+ }
+
+ public void rollback() {
+ try {
+ lookupJeeUserTransaction().rollback();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't rollback: "+e.getMessage(), e);
+ }
+ }
+
+ public void commit() {
+ try {
+ flushDeserializedObjects();
+
+ lookupJeeUserTransaction().commit();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't commit: "+e.getMessage(), e);
+ }
+ }
+
+ public javax.transaction.Transaction suspend() {
+ try {
+ return lookupJeeTransactionManager().suspend();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't suspend: "+e.getMessage(), e);
+ }
+ }
+
+ public void resume(javax.transaction.Transaction transaction) {
+ try {
+ lookupJeeTransactionManager().resume(transaction);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't resume: "+e.getMessage(), e);
+ }
+ }
+
+ // lookups //////////////////////////////////////////////////////////////////
+
+ public UserTransaction lookupJeeUserTransaction() {
+ return (UserTransaction) lookupFromJndi(userTransactionJndiName);
+ }
+
+ public javax.transaction.Transaction lookupJeeTransaction() {
+ try {
+ TransactionManager transactionManager = lookupJeeTransactionManager();
+ return transactionManager.getTransaction();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't get transaction from transaction manager "+transactionManagerJndiName+": "+e.getMessage(), e);
+ }
+ }
+
+ public TransactionManager lookupJeeTransactionManager() {
+ return (TransactionManager) lookupFromJndi(transactionManagerJndiName);
+ }
+
+ public static Object lookupFromJndi(String jndiName) {
+ try {
+ InitialContext initialContext = new InitialContext();
+ return initialContext.lookup(jndiName);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't lookup '"+jndiName+"' from jndi: "+e.getMessage()+": "+e.getMessage(), e);
+ }
+ }
+
+ public static int getUserTransactionStatus(UserTransaction userTransaction) {
+ int status = -1;
+ try {
+ status = userTransaction.getStatus();
+ } catch (SystemException e) {
+ throw new JbpmException("couldn't get transaction status: "+e.getMessage(), e);
+ }
+ log.trace("jta transaction status: "+JtaStatusHelper.toString(status));
+ return status;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/JtaTransactionInterceptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/JtaTransactionInterceptor.java
new file mode 100644
index 0000000..008ede4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/JtaTransactionInterceptor.java
@@ -0,0 +1,108 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.tx;
+
+import javax.transaction.Status;
+import javax.transaction.Transaction;
+import javax.transaction.UserTransaction;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.svc.Interceptor;
+import org.jbpm.pvm.internal.svc.Policy;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class JtaTransactionInterceptor extends Interceptor {
+
+ private static Log log = Log.getLog(JtaTransactionInterceptor.class.getName());
+
+ protected Policy policy = Policy.REQUIRES;
+
+ public <T> T execute(Command<T> command) {
+ JtaTransaction jtaTransaction = EnvironmentImpl.getFromCurrent(JtaTransaction.class);
+
+ UserTransaction userTransaction = jtaTransaction.lookupJeeUserTransaction();
+
+ int status = JtaTransaction.getUserTransactionStatus(userTransaction);
+
+ if ( (status == Status.STATUS_ACTIVE)
+ && (! (policy==Policy.REQUIRES_NEW))
+ ) {
+ return executeInExistingTx(command);
+ }
+
+ if ( (status != Status.STATUS_NO_TRANSACTION)
+ && (status != Status.STATUS_COMMITTED)
+ && (status != Status.STATUS_ROLLEDBACK)
+ && (policy != Policy.REQUIRES_NEW)
+ ) {
+ throw new JbpmException("invalid transaction state: "+JtaStatusHelper.toString(status));
+ }
+
+ return executeInNewTx(command, jtaTransaction, status);
+ }
+
+ protected <T> T executeInExistingTx(Command<T> command) {
+ return next.execute(command);
+ }
+
+ protected <T> T executeInNewTx(Command<T> command, JtaTransaction jtaTransaction, int status) {
+ Transaction suspendedTransaction = null;
+ if ( (status == Status.STATUS_ACTIVE)
+ || (status == Status.STATUS_COMMITTED)
+ || (status == Status.STATUS_ROLLEDBACK)
+ ) {
+ suspendedTransaction = jtaTransaction.suspend();
+ }
+
+ T returnValue = null;
+
+ try {
+ jtaTransaction.begin();
+
+ returnValue = next.execute(command);
+
+ jtaTransaction.commit();
+
+ } catch (RuntimeException e) {
+ jtaTransaction.rollback();
+ throw e;
+
+ } finally {
+
+ if (suspendedTransaction!=null) {
+ jtaTransaction.resume(suspendedTransaction);
+ }
+ }
+
+ return returnValue;
+ }
+
+ public void setPolicy(Policy policy) {
+ this.policy = policy;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/StandardResource.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/StandardResource.java
new file mode 100644
index 0000000..c016138
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/StandardResource.java
@@ -0,0 +1,36 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.tx;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface StandardResource {
+
+ void prepare();
+
+ void commit();
+
+ void rollback();
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/StandardSynchronization.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/StandardSynchronization.java
new file mode 100644
index 0000000..6e6d18b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/StandardSynchronization.java
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.tx;
+
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class StandardSynchronization {
+
+ Synchronization synchronization;
+
+ public StandardSynchronization(Synchronization synchronization) {
+ this.synchronization = synchronization;
+ }
+
+ public void afterCompletion(StandardTransaction.State transactionState) {
+ if (transactionState==StandardTransaction.State.COMMITTED) {
+ synchronization.afterCompletion(Status.STATUS_COMMITTED);
+
+ } else if (transactionState==StandardTransaction.State.ROLLEDBACK) {
+ synchronization.afterCompletion(Status.STATUS_ROLLEDBACK);
+
+ } else {
+ throw new TransactionException("invalid transaction state: "+transactionState);
+ }
+ }
+
+ public void beforeCompletion() {
+ synchronization.beforeCompletion();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/StandardTransaction.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/StandardTransaction.java
new file mode 100644
index 0000000..5d66c4d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/StandardTransaction.java
@@ -0,0 +1,246 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.tx;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.transaction.Synchronization;
+
+import org.jbpm.internal.log.Log;
+
+
+/** simple 2 phase commit transaction.
+ * no logging or recovery.
+ * non thread safe (which is ok).
+ * @author Tom Baeyens
+ */
+public class StandardTransaction extends AbstractTransaction implements Transaction, Serializable {
+
+ private static final long serialVersionUID = 1L;
+ private static Log log = Log.getLog(StandardTransaction.class.getName());
+
+ enum State {
+ CREATED,
+ ACTIVE,
+ ROLLBACKONLY,
+ COMMITTED,
+ ROLLEDBACK
+ }
+
+ protected List<StandardResource> resources;
+ protected List<StandardSynchronization> synchronizations;
+ protected State state = State.CREATED;
+
+ // methods for interceptor //////////////////////////////////////////////////
+
+ public void begin() {
+ if (log.isTraceEnabled()) log.trace("beginning "+this);
+ state = State.ACTIVE;
+ }
+
+ public void complete() {
+ if (state==State.ACTIVE) {
+ commit();
+ } else if (state==State.ROLLBACKONLY){
+ rollback();
+ } else {
+ throw new TransactionException("complete on transaction in state "+state);
+ }
+ }
+
+ // public tx methods ////////////////////////////////////////////////////////
+
+ public void setRollbackOnly() {
+ if (state!=State.ACTIVE) {
+ throw new TransactionException("transaction was not active: "+state);
+ }
+ state = State.ROLLBACKONLY;
+ }
+
+ public boolean isRollbackOnly() {
+ return ( (state==State.ROLLBACKONLY)
+ || (state==State.ROLLEDBACK)
+ );
+ }
+
+ // commit ///////////////////////////////////////////////////////////////////
+
+ /** implements simplest two phase commit. */
+ public void commit() {
+ flushDeserializedObjects();
+
+ if (state!=State.ACTIVE) {
+ throw new TransactionException("commit on transaction in state "+state);
+ }
+
+ log.trace("committing "+this);
+
+ try {
+ beforeCompletion();
+
+ if (resources!=null) {
+ // prepare //////////////////////////////////////////////////////////////
+ // the prepare loop will be skipped at the first exception
+ for (StandardResource standardResource: resources) {
+ if (log.isTraceEnabled()) log.trace("preparing resource "+standardResource);
+ standardResource.prepare();
+ }
+ }
+
+ // for any exception in the prepare phase, we'll rollback
+ } catch (Exception exception) {
+ try {
+ if (log.isTraceEnabled()) log.trace("resource threw exception in prepare. rolling back.");
+ rollbackResources();
+ } catch (Exception rollbackException) {
+ log.error("rollback failed as well", rollbackException);
+ }
+
+ // rethrow
+ if (exception instanceof RuntimeException) {
+ throw (RuntimeException) exception;
+ }
+ throw new TransactionException("prepare failed", exception);
+ }
+
+ // here is the point of no return :-)
+
+ // commit ///////////////////////////////////////////////////////////////
+ Throwable commitException = null;
+ if (resources!=null) {
+ // The commit loop will try to send the commit to every resource,
+ // No matter what it takes. If exceptions come out of resource.commit's
+ // they will be suppressed and the first exception will be rethrown after
+ // all the resources are commited
+ for (StandardResource standardResource: resources) {
+ try {
+ if (log.isTraceEnabled()) log.trace("committing resource "+standardResource);
+ standardResource.commit();
+
+ // Exceptions in the commit phase will not lead to rollback, since some resources
+ // might have committed and can't go back.
+ } catch (Throwable t) {
+ // TODO this should go to a special log for sys admin recovery
+ log.error("commit failed for resource "+standardResource, t);
+ if (commitException==null) {
+ commitException = t;
+ }
+ }
+ }
+ }
+
+ state = State.COMMITTED;
+ afterCompletion();
+ if (log.isTraceEnabled()) log.trace("committed "+this);
+
+ if (commitException!=null) {
+ if (commitException instanceof RuntimeException) {
+ throw (RuntimeException) commitException;
+ } else if (commitException instanceof Error) {
+ throw (Error) commitException;
+ }
+ throw new TransactionException("resource failed to commit", commitException);
+ }
+ }
+
+ // rollback /////////////////////////////////////////////////////////////////
+
+ public void rollback() {
+ if ( (state!=State.ACTIVE)
+ && (state!=State.ROLLBACKONLY)
+ ) {
+ throw new TransactionException("rollback on transaction in state "+state);
+ }
+
+ if (log.isTraceEnabled()) log.trace("rolling back "+this);
+
+ beforeCompletion();
+ rollbackResources();
+ }
+
+
+ void rollbackResources() {
+ if (resources!=null) {
+ for (StandardResource resource: resources) {
+ try {
+ if (log.isTraceEnabled()) log.trace("rolling back resource "+resource);
+ resource.rollback();
+ } catch (Exception e) {
+ log.error("rollback failed for resource "+resource);
+ }
+ }
+ }
+
+ state = State.ROLLEDBACK;
+
+ afterCompletion();
+
+ if (log.isTraceEnabled()) log.trace("rolled back");
+ }
+
+ // synchronizations /////////////////////////////////////////////////////////
+
+ public void registerSynchronization(Synchronization synchronization) {
+ if (synchronizations==null) {
+ synchronizations = new ArrayList<StandardSynchronization>();
+ }
+ synchronizations.add(new StandardSynchronization(synchronization));
+ }
+
+ public void afterCompletion() {
+ if (synchronizations!=null) {
+ for (StandardSynchronization synchronization: synchronizations) {
+ synchronization.afterCompletion(state);
+ }
+ }
+ }
+
+ public void beforeCompletion() {
+ if (synchronizations!=null) {
+ for (StandardSynchronization synchronization: synchronizations) {
+ synchronization.beforeCompletion();
+ }
+ }
+ }
+
+ // resource enlisting ///////////////////////////////////////////////////////
+
+ public void enlistResource(StandardResource standardResource) {
+ if (resources==null) {
+ resources = new ArrayList<StandardResource>();
+ }
+ log.trace("enlisting resource "+standardResource+" to standard transaction");
+ resources.add(standardResource);
+ }
+
+ List<StandardResource> getResources() {
+ return resources;
+ }
+
+ // general methods //////////////////////////////////////////////////////////
+
+ public String toString() {
+ return "StandardTransaction["+System.identityHashCode(this)+"]";
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/StandardTransactionInterceptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/StandardTransactionInterceptor.java
new file mode 100644
index 0000000..2cc2b02
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/StandardTransactionInterceptor.java
@@ -0,0 +1,83 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.tx;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.cmd.Command;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.svc.Interceptor;
+
+
+/** calls setRollbackOnly on the transaction in the environment
+ * in case an exception occurs during execution of the command.
+ *
+ * @author Tom Baeyens
+ */
+public class StandardTransactionInterceptor extends Interceptor {
+
+ private static final Log log = Log.getLog(StandardTransactionInterceptor.class.getName());
+
+ public <T> T execute(Command<T> command) {
+// EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+// if (environment==null) {
+// throw new JbpmException("no environment for managing hibernate transaction");
+// }
+//
+// StandardTransaction standardTransaction = environment.get(StandardTransaction.class);
+// if (standardTransaction==null) {
+// throw new JbpmException("no standard-transaction in environment");
+// }
+
+// standardTransaction.begin();
+
+// try {
+// return next.execute(command);
+//
+// } catch (RuntimeException e) {
+// standardTransaction.setRollbackOnly();
+// throw e;
+//
+// }
+// finally {
+// standardTransaction.complete();
+// }
+
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ if (environment == null) {
+ throw new JbpmException("no environment for managing hibernate transaction");
+ }
+
+ StandardTransaction standardTransaction = (StandardTransaction)environment.get(StandardTransaction.class);
+ if (standardTransaction == null) {
+ throw new JbpmException("no standard-transaction in environment");
+ }
+
+ try
+ {
+ return this.next.execute(command);
+ }
+ catch (RuntimeException e) {
+ throw e;
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/Transaction.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/Transaction.java
new file mode 100644
index 0000000..299a870
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/Transaction.java
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.tx;
+
+import javax.transaction.Synchronization;
+
+
+
+/** provides access to the transaction in the environment.
+ *
+ * @author Tom Baeyens
+ */
+public interface Transaction {
+
+ /** register a transaction listener. This method will have no
+ * effect if the transactionListener is null. */
+ void registerSynchronization(Synchronization synchronization);
+
+ /** for auto update of deserialized objects */
+ void registerDeserializedObject(DeserializedObject deserializedObject);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/TransactionException.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/TransactionException.java
new file mode 100644
index 0000000..7877315
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/tx/TransactionException.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.tx;
+
+import org.jbpm.api.JbpmException;
+
+/**
+ * @author Tom Baeyens
+ */
+public class TransactionException extends JbpmException {
+
+ private static final long serialVersionUID = 1L;
+
+ public TransactionException(String msg) {
+ super(msg);
+ }
+
+ public TransactionException(Throwable cause) {
+ super(cause);
+ }
+
+ TransactionException(String msg, Throwable cause) {
+ super(msg, cause);
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/Converter.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/Converter.java
new file mode 100644
index 0000000..1dcefa7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/Converter.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type;
+
+import java.io.Serializable;
+
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+
+/**
+ * @author Tom Baeyens
+ */
+public interface Converter extends Serializable {
+
+ /**
+ * is true if this converter supports the given type, false otherwise.
+ */
+ boolean supports(Object value, ScopeInstanceImpl scopeInstance, Variable variable);
+
+ /**
+ * converts a given object to its persistable format.
+ */
+ Object convert(Object o, ScopeInstanceImpl scopeInstance, Variable variable);
+
+ /**
+ * reverts a persisted object to its original formResourceName.
+ */
+ Object revert(Object o, ScopeInstanceImpl scopeInstance, Variable variable);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/DefaultTypeSet.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/DefaultTypeSet.java
new file mode 100644
index 0000000..5d55158
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/DefaultTypeSet.java
@@ -0,0 +1,70 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class DefaultTypeSet implements TypeSet, Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected List<TypeMapping> typeMappings;
+
+ public Type findTypeByMatch(String key, Object value) {
+ if (typeMappings!=null) {
+ for (TypeMapping typeMapping: typeMappings) {
+ if (typeMapping.matches(key, value)) {
+ return typeMapping.getType();
+ }
+ }
+ }
+
+ return null;
+ }
+
+ public Type findTypeByName(String typeName) {
+ if ( (typeMappings!=null)
+ && (typeName!=null)
+ ) {
+ for (TypeMapping typeMapping: typeMappings) {
+ Type type = typeMapping.getType();
+ if (typeName.equals(type.getName())) {
+ return type;
+ }
+ }
+ }
+ return null;
+ }
+
+ public void addTypeMapping(TypeMapping typeMapping) {
+ if (typeMappings==null) {
+ typeMappings = new ArrayList<TypeMapping>();
+ }
+ typeMappings.add(typeMapping);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/Matcher.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/Matcher.java
new file mode 100644
index 0000000..60023ad
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/Matcher.java
@@ -0,0 +1,9 @@
+package org.jbpm.pvm.internal.type;
+
+import java.io.Serializable;
+
+
+public interface Matcher extends Serializable {
+
+ boolean matches(String name, Object value);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/Type.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/Type.java
new file mode 100644
index 0000000..a421431
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/Type.java
@@ -0,0 +1,75 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type;
+
+import java.io.Serializable;
+
+import org.jbpm.pvm.internal.util.ReflectUtil;
+
+
+/** a variable type.
+ * @author Tom Baeyens
+ */
+public class Type implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String name;
+ protected Converter converter;
+ protected Class<?> variableClass;
+
+ public String toString() {
+ if (name!=null) {
+ return name;
+ }
+ StringBuilder text = new StringBuilder();
+ if (converter!=null) {
+ text.append(converter.toString());
+ text.append("-->");
+ }
+ if (variableClass!=null) {
+ text.append(ReflectUtil.getUnqualifiedClassName(variableClass));
+ } else {
+ text.append("undefined");
+ }
+ return text.toString();
+ }
+
+ public Converter getConverter() {
+ return converter;
+ }
+ public void setConverter(Converter converter) {
+ this.converter = converter;
+ }
+ public Class< ? > getVariableClass() {
+ return variableClass;
+ }
+ public void setVariableClass(Class< ? > variableClass) {
+ this.variableClass = variableClass;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/TypeMapping.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/TypeMapping.java
new file mode 100644
index 0000000..4f789cd
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/TypeMapping.java
@@ -0,0 +1,33 @@
+package org.jbpm.pvm.internal.type;
+
+import java.io.Serializable;
+
+
+public class TypeMapping implements Serializable {
+
+ Matcher matcher;
+ Type type;
+
+ private static final long serialVersionUID = 1L;
+
+ public boolean matches(String name, Object value) {
+ return matcher.matches(name, value);
+ }
+
+ public String toString() {
+ return "("+matcher+"-->"+type+")";
+ }
+
+ public void setMatcher(Matcher matcher) {
+ this.matcher = matcher;
+ }
+ public Type getType() {
+ return type;
+ }
+ public void setType(Type type) {
+ this.type = type;
+ }
+ public Matcher getMatcher() {
+ return matcher;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/TypeSet.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/TypeSet.java
new file mode 100644
index 0000000..5ede138
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/TypeSet.java
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public interface TypeSet {
+
+ Type findTypeByMatch(String key, Object value);
+ Type findTypeByName(String typeName);
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/Variable.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/Variable.java
new file mode 100644
index 0000000..e7731b9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/Variable.java
@@ -0,0 +1,168 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type;
+
+import java.io.Serializable;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.history.HistoryEvent;
+import org.jbpm.pvm.internal.history.HistorySession;
+import org.jbpm.pvm.internal.history.events.VariableUpdate;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.task.TaskImpl;
+
+/**
+ * is a jbpm-internal class that serves as a base class for classes
+ * that store variable values in the database.
+ */
+public abstract class Variable implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid = -1;
+ protected int dbversion = 0;
+
+ protected String key = null;
+ protected Converter converter = null;
+ protected String textValue = null;
+ protected boolean isHistoryEnabled = false;
+
+ protected ExecutionImpl execution;
+ protected TaskImpl task;
+
+ // constructors /////////////////////////////////////////////////////////////
+
+ // abstract methods /////////////////////////////////////////////////////////
+
+ /**
+ * is true if this variable-instance supports the given value, false otherwise.
+ */
+ public abstract boolean isStorable(Object value);
+ /**
+ * is the value, stored by this variable instance.
+ */
+ protected abstract Object getObject();
+ /**
+ * stores the value in this variable instance.
+ */
+ protected abstract void setObject(Object value);
+
+ // variable management //////////////////////////////////////////////////////
+
+ public boolean supports(Object value, ScopeInstanceImpl scopeInstance) {
+ if (converter!=null) {
+ return converter.supports(value, scopeInstance, this);
+ }
+ return isStorable(value);
+ }
+
+ public void setValue(Object value, ScopeInstanceImpl scopeInstance) {
+ if (converter!=null) {
+ if (! converter.supports(value, scopeInstance, this)) {
+ throw new JbpmException("the converter '"+converter.getClass().getName()+"' in variable instance '"+this.getClass().getName()+"' does not support values of type '"+value.getClass().getName()+"'. to change the type of a variable, you have to delete it first");
+ }
+ value = converter.convert(value, scopeInstance, this);
+ }
+ if ( (value!=null)
+ && (! this.isStorable(value)) ) {
+ throw new JbpmException("variable instance '"+this.getClass().getName()+"' does not support values of type '"+value.getClass().getName()+"'. to change the type of a variable, you have to delete it first");
+ }
+ setObject(value);
+
+ HistorySession historySession = EnvironmentImpl.getFromCurrent(HistorySession.class, false);
+ if ( isHistoryEnabled
+ && (historySession!=null)
+ ) {
+ HistoryEvent.fire(new VariableUpdate(this));
+ }
+ }
+
+ public Object getValue(ScopeInstanceImpl scopeInstance) {
+ Object value = getObject();
+ if ( (value!=null)
+ && (converter!=null) ) {
+ value = converter.revert(value, scopeInstance, this);
+ }
+ return value;
+ }
+
+ // utility methods /////////////////////////////////////////////////////////
+
+ public String toString() {
+ return "${"+key+"}";
+ }
+
+ public Type getType() {
+ Type type = new Type();
+ type.setConverter(converter);
+ type.setVariableClass(getClass());
+ return type;
+ }
+
+ public ExecutionImpl getProcessInstance() {
+ return (execution!=null ? execution.getProcessInstance() : null);
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public String getKey() {
+ return key;
+ }
+ public long getDbid() {
+ return dbid;
+ }
+ public Converter getConverter() {
+ return converter;
+ }
+ public void setConverter(Converter converter) {
+ this.converter = converter;
+ }
+ public void setKey(String key) {
+ this.key = key;
+ }
+ public String getTextValue() {
+ return textValue;
+ }
+ public ExecutionImpl getExecution() {
+ return execution;
+ }
+ public void setExecution(ExecutionImpl execution) {
+ this.execution = execution;
+ }
+ public TaskImpl getTask() {
+ return task;
+ }
+ public void setTask(TaskImpl task) {
+ this.task = task;
+ }
+ public boolean isHistoryEnabled() {
+ return isHistoryEnabled;
+ }
+ public void setHistoryEnabled(boolean isHistoryEnabled) {
+ this.isHistoryEnabled = isHistoryEnabled;
+ }
+ public void setDbid(long dbid) {
+ this.dbid = dbid;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/BooleanToStringConverter.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/BooleanToStringConverter.java
new file mode 100644
index 0000000..aa67a15
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/BooleanToStringConverter.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.converter;
+
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.type.Converter;
+import org.jbpm.pvm.internal.type.Variable;
+
+public class BooleanToStringConverter implements Converter {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final String TRUE_TEXT = "T";
+ public static final String FALSE_TEXT = "F";
+
+ public boolean supports(Object value, ScopeInstanceImpl scopeInstance, Variable variable) {
+ if (value==null) return true;
+ return (value.getClass()==Boolean.class);
+ }
+
+ public Object convert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ String convertedValue = FALSE_TEXT;
+ if (((Boolean)o).booleanValue()) {
+ convertedValue = TRUE_TEXT;
+ }
+ return convertedValue;
+ }
+
+ public Object revert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ Boolean revertedValue = Boolean.FALSE;
+ if (TRUE_TEXT.equals(o)) {
+ revertedValue = Boolean.TRUE;
+ }
+ return revertedValue;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/ByteToLongConverter.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/ByteToLongConverter.java
new file mode 100644
index 0000000..2f05041
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/ByteToLongConverter.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.converter;
+
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.type.Converter;
+import org.jbpm.pvm.internal.type.Variable;
+
+public class ByteToLongConverter implements Converter {
+
+ private static final long serialVersionUID = 1L;
+
+ public boolean supports(Object value, ScopeInstanceImpl scopeInstance, Variable variable) {
+ if (value==null) return true;
+ return (value.getClass()==Byte.class);
+ }
+
+ public Object convert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return new Long( ((Number)o).longValue() );
+ }
+
+ public Object revert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return new Byte(((Long)o).byteValue());
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/CharacterToStringConverter.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/CharacterToStringConverter.java
new file mode 100644
index 0000000..90657a2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/CharacterToStringConverter.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.converter;
+
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.type.Converter;
+import org.jbpm.pvm.internal.type.Variable;
+
+public class CharacterToStringConverter implements Converter {
+
+ private static final long serialVersionUID = 1L;
+
+ public boolean supports(Object value, ScopeInstanceImpl scopeInstance, Variable variable) {
+ if (value==null) return true;
+ return (value.getClass()==Character.class);
+ }
+
+ public Object convert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return o.toString();
+ }
+
+ public Object revert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return new Character(((String)o).charAt(0));
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/DateToLongConverter.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/DateToLongConverter.java
new file mode 100644
index 0000000..8d65eac
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/DateToLongConverter.java
@@ -0,0 +1,46 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.converter;
+
+import java.util.Date;
+
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.type.Converter;
+import org.jbpm.pvm.internal.type.Variable;
+
+public class DateToLongConverter implements Converter {
+
+ private static final long serialVersionUID = 1L;
+
+ public boolean supports(Object value, ScopeInstanceImpl scopeInstance, Variable variable) {
+ if (value==null) return true;
+ return (Date.class.isAssignableFrom(value.getClass()));
+ }
+
+ public Object convert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return new Long(((Date)o).getTime());
+ }
+
+ public Object revert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return new Date(((Long)o).longValue());
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/DateToStringConverter.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/DateToStringConverter.java
new file mode 100644
index 0000000..9ebed81
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/DateToStringConverter.java
@@ -0,0 +1,62 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.converter;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.type.Converter;
+import org.jbpm.pvm.internal.type.Variable;
+
+/**
+ * @author Tom Baeyens
+ */
+public class DateToStringConverter implements Converter {
+
+ private static final long serialVersionUID = 1L;
+
+ DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS");
+
+ public Object convert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return dateFormat.format((Date)o);
+ }
+
+ public Object revert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ try {
+ return dateFormat.parseObject((String)o);
+ } catch (ParseException e) {
+ throw new JbpmException("invalid date format in date variable: "+o, e);
+ }
+ }
+
+ public boolean supports(Object value, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return ((value!=null) && (value instanceof Date));
+ }
+
+ public void setFormat(String format) {
+ dateFormat = new SimpleDateFormat(format);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/DoubleToStringConverter.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/DoubleToStringConverter.java
new file mode 100644
index 0000000..9c8e4b0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/DoubleToStringConverter.java
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.converter;
+
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.type.Converter;
+import org.jbpm.pvm.internal.type.Variable;
+
+public class DoubleToStringConverter implements Converter {
+
+ private static final long serialVersionUID = 1L;
+
+ public boolean supports(Object value, ScopeInstanceImpl scopeInstance, Variable variable) {
+ if (value==null) return true;
+ return (value.getClass()==Double.class);
+ }
+
+ public Object convert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return o.toString();
+ }
+
+ public Object revert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return new Double((String)o);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/FloatToDoubleConverter.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/FloatToDoubleConverter.java
new file mode 100644
index 0000000..0839f51
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/FloatToDoubleConverter.java
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.converter;
+
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.type.Converter;
+import org.jbpm.pvm.internal.type.Variable;
+
+public class FloatToDoubleConverter implements Converter {
+
+ private static final long serialVersionUID = 1L;
+
+ public boolean supports(Object value, ScopeInstanceImpl scopeInstance, Variable variable) {
+ if (value==null) return true;
+ return (value.getClass()==Float.class);
+ }
+
+ public Object convert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return new Double(((Float)o).doubleValue());
+ }
+
+ public Object revert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return new Float(((Double)o).floatValue());
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/FloatToStringConverter.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/FloatToStringConverter.java
new file mode 100644
index 0000000..a1baa7d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/FloatToStringConverter.java
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.converter;
+
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.type.Converter;
+import org.jbpm.pvm.internal.type.Variable;
+
+public class FloatToStringConverter implements Converter {
+
+ private static final long serialVersionUID = 1L;
+
+ public boolean supports(Object value, ScopeInstanceImpl scopeInstance, Variable variable) {
+ if (value==null) return true;
+ return (value.getClass()==Float.class);
+ }
+
+ public Object convert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return o.toString();
+ }
+
+ public Object revert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return new Float((String)o);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/IntegerToLongConverter.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/IntegerToLongConverter.java
new file mode 100644
index 0000000..89fb981
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/IntegerToLongConverter.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.converter;
+
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.type.Converter;
+import org.jbpm.pvm.internal.type.Variable;
+
+public class IntegerToLongConverter implements Converter {
+
+ private static final long serialVersionUID = 1L;
+
+ public boolean supports(Object value, ScopeInstanceImpl scopeInstance, Variable variable) {
+ if (value==null) return true;
+ return (Integer.class.equals(value.getClass()));
+ }
+
+ public Object convert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return new Long( ((Number)o).longValue() );
+ }
+
+ public Object revert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return new Integer(((Long)o).intValue());
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/SerializableToBytesConverter.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/SerializableToBytesConverter.java
new file mode 100644
index 0000000..50f658f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/SerializableToBytesConverter.java
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.converter;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.tx.DeserializedObject;
+import org.jbpm.pvm.internal.tx.Transaction;
+import org.jbpm.pvm.internal.type.Converter;
+import org.jbpm.pvm.internal.type.Variable;
+import org.jbpm.pvm.internal.type.variable.BlobVariable;
+
+public class SerializableToBytesConverter implements Converter {
+
+ private static final long serialVersionUID = 1L;
+
+ public boolean supports(Object value, ScopeInstanceImpl scopeInstance, Variable variable) {
+ if (value==null) return true;
+ return Serializable.class.isAssignableFrom(value.getClass());
+ }
+
+ public Object convert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ byte[] bytes = null;
+ try {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(baos);
+ oos.writeObject(o);
+ oos.flush();
+ bytes = baos.toByteArray();
+ } catch (IOException e) {
+ throw new JbpmException("couldn't serialize '"+o+"'", e);
+ }
+
+ return bytes;
+ }
+
+ public Object revert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ byte[] bytes = (byte[]) o;
+ try {
+ ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+ ObjectInputStream ois = new ObjectInputStream(bais);
+ Object object = ois.readObject();
+
+ Transaction transaction = EnvironmentImpl.getFromCurrent(Transaction.class, false);
+ if (transaction!=null) {
+ transaction.registerDeserializedObject(new DeserializedObject(object, scopeInstance, (BlobVariable) variable));
+ }
+
+ return object;
+
+ } catch (Exception e) {
+ throw new JbpmException("couldn't deserialize object", e);
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/ShortToLongConverter.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/ShortToLongConverter.java
new file mode 100644
index 0000000..98e06ec
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/ShortToLongConverter.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.converter;
+
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.type.Converter;
+import org.jbpm.pvm.internal.type.Variable;
+
+public class ShortToLongConverter implements Converter {
+
+ private static final long serialVersionUID = 1L;
+
+ public boolean supports(Object value, ScopeInstanceImpl scopeInstance, Variable variable) {
+ if (value==null) return true;
+ return (value.getClass()==Short.class);
+ }
+
+ public Object convert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return new Long( ((Number)o).longValue() );
+ }
+
+ public Object revert(Object o, ScopeInstanceImpl scopeInstance, Variable variable) {
+ return new Short(((Long)o).shortValue());
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/package.html
new file mode 100644
index 0000000..45c1ad4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/converter/package.html
@@ -0,0 +1,3 @@
+<body>
+implementations of Converter.
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/ClassNameMatcher.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/ClassNameMatcher.java
new file mode 100644
index 0000000..d1e7a00
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/ClassNameMatcher.java
@@ -0,0 +1,63 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.matcher;
+
+import org.jbpm.pvm.internal.type.Matcher;
+
+
+public class ClassNameMatcher implements Matcher {
+
+ private static final long serialVersionUID = 1L;
+
+ String className = null;
+
+ public ClassNameMatcher(String className) {
+ this.className = className;
+ }
+
+ public String toString() {
+ return className;
+ }
+
+ public boolean matches(String name, Object value) {
+ if (value==null) {
+ return true;
+ }
+
+ Class<?> valueClass = value.getClass();
+
+ while (valueClass!=null) {
+ if (className.equals(value.getClass().getName())) {
+ return true;
+ } else {
+ Class<?>[] interfaces = valueClass.getInterfaces();
+ for (int i=0; i<interfaces.length; i++) {
+ if (className.equals(interfaces[i].getName())) {
+ return true;
+ }
+ }
+ valueClass = valueClass.getSuperclass();
+ }
+ }
+ return false;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/HibernateIdMatcher.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/HibernateIdMatcher.java
new file mode 100644
index 0000000..9c28a79
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/HibernateIdMatcher.java
@@ -0,0 +1,78 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.matcher;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.metadata.ClassMetadata;
+import org.hibernate.type.Type;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.type.Matcher;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class HibernateIdMatcher implements Matcher {
+
+ private static final long serialVersionUID = 1L;
+ private static Log log = Log.getLog(HibernateIdMatcher.class.getName());
+
+ String hibernateSessionFactoryName;
+
+ public HibernateIdMatcher(String hibernateSessionFactoryName) {
+ this.hibernateSessionFactoryName = hibernateSessionFactoryName;
+ }
+
+ protected abstract Class<? extends Type> getIdType();
+
+ public boolean matches(String name, Object value) {
+ boolean matches = false;
+
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ if (environment!=null) {
+ SessionFactory sessionFactory = null;
+ if (hibernateSessionFactoryName!=null) {
+ sessionFactory = (SessionFactory) environment.get(hibernateSessionFactoryName);
+ } else {
+ sessionFactory = environment.get(SessionFactory.class);
+ }
+ if (sessionFactory!=null) {
+ ClassMetadata classMetadata = sessionFactory.getClassMetadata(value.getClass());
+ matches = ( (classMetadata!=null)
+ && (classMetadata.getIdentifierType().getClass()==getIdType())
+ );
+ }
+ } else {
+ log.trace("no current environment so valueClass cannot be stored as an id-ref to a hibernate object");
+ matches = false;
+ }
+ return matches;
+ }
+
+ public String getHibernateSessionFactoryName() {
+ return hibernateSessionFactoryName;
+ }
+ public void setHibernateSessionFactoryName(String hibernateSessionFactoryName) {
+ this.hibernateSessionFactoryName = hibernateSessionFactoryName;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/HibernateLongIdMatcher.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/HibernateLongIdMatcher.java
new file mode 100644
index 0000000..e66ea79
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/HibernateLongIdMatcher.java
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.matcher;
+
+import org.hibernate.type.LongType;
+import org.hibernate.type.Type;
+
+public class HibernateLongIdMatcher extends HibernateIdMatcher {
+
+ private static final long serialVersionUID = 1L;
+
+ public HibernateLongIdMatcher(String hibernateSessionFactoryName) {
+ super(hibernateSessionFactoryName);
+ }
+
+ public String toString() {
+ return "hibernatable-long-id";
+ }
+
+ protected Class<? extends Type> getIdType() {
+ return LongType.class;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/HibernateStringIdMatcher.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/HibernateStringIdMatcher.java
new file mode 100644
index 0000000..7a03364
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/HibernateStringIdMatcher.java
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.matcher;
+
+import org.hibernate.type.StringType;
+import org.hibernate.type.Type;
+
+public class HibernateStringIdMatcher extends HibernateIdMatcher {
+
+ private static final long serialVersionUID = 1L;
+
+ public HibernateStringIdMatcher(String hibernateSessionFactoryName) {
+ super(hibernateSessionFactoryName);
+ }
+
+ public String toString() {
+ return "hibernatable-string-id";
+ }
+
+ protected Class<? extends Type> getIdType() {
+ return StringType.class;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/SerializableMatcher.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/SerializableMatcher.java
new file mode 100644
index 0000000..5213f4f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/matcher/SerializableMatcher.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.matcher;
+
+import java.io.Serializable;
+
+import org.jbpm.pvm.internal.type.Matcher;
+
+
+public class SerializableMatcher implements Matcher {
+
+ private static final long serialVersionUID = 1L;
+
+ public String toString() {
+ return "serializable";
+ }
+
+ public boolean matches(String name, Object value) {
+ return (Serializable.class.isAssignableFrom(value.getClass()));
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/BlobVariable.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/BlobVariable.java
new file mode 100644
index 0000000..1c6ce7b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/BlobVariable.java
@@ -0,0 +1,73 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.variable;
+
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.lob.Lob;
+import org.jbpm.pvm.internal.model.ScopeInstanceImpl;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.type.Variable;
+
+public class BlobVariable extends Variable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Lob lob = null;
+ protected Object cachedValue = null;
+
+ public boolean isStorable(Object value) {
+ if (value==null) return true;
+ return (byte[].class.isAssignableFrom(value.getClass()));
+ }
+
+ public Object getObject() {
+ if (lob==null) return null;
+ return lob.extractBytes();
+ }
+
+ public void setObject(Object value) {
+ if (this.lob!=null) {
+ DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class, false);
+ if (dbSession!=null) {
+ dbSession.delete(this.lob);
+ }
+ }
+ this.lob = new Lob((byte[])value, true);
+ }
+
+ public Object getValue(ScopeInstanceImpl scopeInstance) {
+ if (cachedValue!=null) {
+ return cachedValue;
+ }
+ cachedValue = super.getValue(scopeInstance);
+ return cachedValue;
+ }
+
+ public void setValue(Object value, ScopeInstanceImpl scopeInstance) {
+ super.setValue(value, scopeInstance);
+ cachedValue = value;
+ }
+
+ public Lob getLob() {
+ return lob;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/ClobVariable.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/ClobVariable.java
new file mode 100644
index 0000000..43d5928
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/ClobVariable.java
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.variable;
+
+import org.jbpm.pvm.internal.lob.Lob;
+import org.jbpm.pvm.internal.type.Variable;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ClobVariable extends Variable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Lob lob = null;
+
+ public boolean isStorable(Object value) {
+ if (value==null) return true;
+ return (char[].class.isAssignableFrom(value.getClass()));
+ }
+
+ public Object getObject() {
+ if (lob==null) return null;
+ return lob.extractChars();
+ }
+
+ public void setObject(Object value) {
+ this.lob = new Lob((char[])value, true);
+ }
+
+ public Lob getLob() {
+ return lob;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/DateVariable.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/DateVariable.java
new file mode 100644
index 0000000..de08faf
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/DateVariable.java
@@ -0,0 +1,56 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.variable;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.jbpm.pvm.internal.type.Variable;
+
+
+public class DateVariable extends Variable {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final String dateFormat = "dd/MM/yyyy HH:mm:ss";
+
+ protected Date date = null;
+
+ public boolean isStorable(Object value) {
+ if (value==null) return true;
+ return (Date.class.isAssignableFrom(value.getClass()));
+ }
+
+ public Object getObject() {
+ return date;
+ }
+
+ public void setObject(Object value) {
+ this.date = (Date) value;
+ if (value!=null) {
+ this.textValue = new SimpleDateFormat(dateFormat).format(value);
+ } else {
+ this.textValue = null;
+ }
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/DoubleVariable.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/DoubleVariable.java
new file mode 100644
index 0000000..3701a9c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/DoubleVariable.java
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.variable;
+
+import org.jbpm.pvm.internal.type.Variable;
+
+
+public class DoubleVariable extends Variable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Double d = null;
+
+ public boolean isStorable(Object value) {
+ if (value==null) return true;
+ return (Double.class==value.getClass());
+ }
+
+ public Object getObject() {
+ return d;
+ }
+
+ public void setObject(Object value) {
+ this.d = (Double) value;
+ if (value!=null) {
+ this.textValue = value.toString();
+ } else {
+ this.textValue = null;
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/HibernateLongVariable.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/HibernateLongVariable.java
new file mode 100644
index 0000000..2411230
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/HibernateLongVariable.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.variable;
+
+import org.jbpm.pvm.internal.type.Variable;
+
+
+public class HibernateLongVariable extends Variable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Object hibernatable = null;
+
+ public boolean isStorable(Object value) {
+ return true;
+ }
+
+ public Object getObject() {
+ return hibernatable;
+ }
+
+ public void setObject(Object value) {
+ this.hibernatable = value;
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/HibernateStringVariable.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/HibernateStringVariable.java
new file mode 100644
index 0000000..72ce4f2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/HibernateStringVariable.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.variable;
+
+import org.jbpm.pvm.internal.type.Variable;
+
+
+public class HibernateStringVariable extends Variable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Object hibernatable = null;
+
+ public boolean isStorable(Object value) {
+ return true;
+ }
+
+ public Object getObject() {
+ return hibernatable;
+ }
+
+ public void setObject(Object value) {
+ this.hibernatable = value;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/LongVariable.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/LongVariable.java
new file mode 100644
index 0000000..52e4b95
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/LongVariable.java
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.variable;
+
+import org.jbpm.pvm.internal.type.Variable;
+
+
+public class LongVariable extends Variable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Long l = null;
+
+ public boolean isStorable(Object value) {
+ if (value==null) return true;
+ return (Long.class==value.getClass());
+ }
+
+ public Object getObject() {
+ return l;
+ }
+
+ public void setObject(Object value) {
+ this.l = (Long) value;
+ if (value!=null) {
+ this.textValue = value.toString();
+ } else {
+ this.textValue = null;
+ }
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/NullVariable.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/NullVariable.java
new file mode 100644
index 0000000..9ab5bc0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/NullVariable.java
@@ -0,0 +1,20 @@
+package org.jbpm.pvm.internal.type.variable;
+
+import org.jbpm.pvm.internal.type.Variable;
+
+
+public class NullVariable extends Variable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Object getObject() {
+ return null;
+ }
+
+ public boolean isStorable(Object value) {
+ return (value==null);
+ }
+
+ protected void setObject(Object value) {
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/StringVariable.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/StringVariable.java
new file mode 100644
index 0000000..7489dea
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/StringVariable.java
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.variable;
+
+import org.jbpm.pvm.internal.type.Variable;
+
+
+public class StringVariable extends Variable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String string = null;
+
+ public boolean isStorable(Object value) {
+ if (value==null) return true;
+ return (String.class==value.getClass());
+ }
+
+ public Object getObject() {
+ return string;
+ }
+
+ public void setObject(Object value) {
+ this.string = (String) value;
+ if (value!=null) {
+ this.textValue = string;
+ } else {
+ this.textValue = null;
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/TextVariable.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/TextVariable.java
new file mode 100644
index 0000000..2e5bc0f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/TextVariable.java
@@ -0,0 +1,52 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.type.variable;
+
+import org.jbpm.pvm.internal.type.Variable;
+
+
+public class TextVariable extends Variable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String text = null;
+
+ public boolean isStorable(Object value) {
+ if (value==null) return true;
+ return (char[].class==value.getClass());
+ }
+
+ public Object getObject() {
+ if (text==null) {
+ return null;
+ }
+ return text.toCharArray();
+ }
+
+ public void setObject(Object value) {
+ if (value!=null) {
+ this.text = new String((char[])value);
+ } else {
+ this.text = null;
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/UnpersistableVariable.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/UnpersistableVariable.java
new file mode 100644
index 0000000..1c3f08c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/type/variable/UnpersistableVariable.java
@@ -0,0 +1,27 @@
+package org.jbpm.pvm.internal.type.variable;
+
+import org.jbpm.pvm.internal.type.Variable;
+
+
+/**
+ * uses the cache in variable instance to store any object
+ * without persisting it.
+ */
+public class UnpersistableVariable extends Variable {
+
+ private static final long serialVersionUID = 1L;
+
+ Object value;
+
+ protected Object getObject() {
+ return value;
+ }
+
+ public boolean isStorable(Object value) {
+ return true;
+ }
+
+ protected void setObject(Object value) {
+ this.value = value;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/ClassLoaderContext.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/ClassLoaderContext.java
new file mode 100644
index 0000000..693bd49
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/ClassLoaderContext.java
@@ -0,0 +1,30 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.util;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ClassLoaderContext {
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Clock.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Clock.java
new file mode 100644
index 0000000..893266e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Clock.java
@@ -0,0 +1,19 @@
+package org.jbpm.pvm.internal.util;
+
+import java.util.Date;
+
+public abstract class Clock {
+
+ protected static Date currentTime = null;
+
+ public static Date getCurrentTime() {
+ if (currentTime==null) {
+ return new Date();
+ }
+ return currentTime;
+ }
+
+ public static void setCurrentTime(Date currentTime) {
+ Clock.currentTime = currentTime;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Closable.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Closable.java
new file mode 100644
index 0000000..652d182
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Closable.java
@@ -0,0 +1,30 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.util;
+
+/**
+ * @author Tom Baeyens
+ */
+public interface Closable {
+
+ void close();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/DOMWriter.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/DOMWriter.java
new file mode 100644
index 0000000..24b5678
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/DOMWriter.java
@@ -0,0 +1,634 @@
+package org.jbpm.pvm.internal.util;
+
+/*
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary formResourceName must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Traverse a DOM tree in order to print a document that is parsed.
+ *
+ * @author Andy Clark, IBM
+ * @author Thomas.Diesler@jboss.org
+ */
+@SuppressWarnings("unchecked")
+public class DOMWriter
+{
+ // Print writer
+ private PrintWriter out;
+ // True, if canonical output
+ private boolean canonical;
+ // True, if pretty printing should be used
+ private boolean prettyprint;
+ // True, if the XML declaration should be written
+ private boolean writeXMLDeclaration;
+ // True, if whitespace should be ignored
+ private boolean ignoreWhitespace;
+ // Explicit character set encoding
+ private String charsetName;
+ // indent for the pretty printer
+ private int prettyIndent;
+ // True, if the XML declaration has been written
+ private boolean wroteXMLDeclaration;
+ // The node that started the write
+ private Node rootNode;
+ // True if we want namespace completion
+ private boolean completeNamespaces = true;
+ // The current default namespace
+ private String currentDefaultNamespace;
+
+ public DOMWriter(Writer w)
+ {
+ this.out = new PrintWriter(w);
+ }
+
+ public DOMWriter(Writer w, String charsetName)
+ {
+ this.out = new PrintWriter(w);
+ this.charsetName = charsetName;
+ this.writeXMLDeclaration = true;
+ }
+
+ public DOMWriter(OutputStream stream)
+ {
+ try
+ {
+ this.out = new PrintWriter(new OutputStreamWriter(stream, "UTF-8"));
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ // ignore, UTF-8 should be available
+ }
+ }
+
+ public DOMWriter(OutputStream stream, String charsetName)
+ {
+ try
+ {
+ this.out = new PrintWriter(new OutputStreamWriter(stream, charsetName));
+ this.charsetName = charsetName;
+ this.writeXMLDeclaration = true;
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ throw new IllegalArgumentException("Unsupported encoding: " + charsetName);
+ }
+ }
+
+ /**
+ * Print a node with explicit prettyprinting.
+ * The defaults for all other DOMWriter properties apply.
+ *
+ */
+ public static String printNode(Node node, boolean prettyprint)
+ {
+ StringWriter strw = new StringWriter();
+ new DOMWriter(strw).setPrettyprint(prettyprint).print(node);
+ return strw.toString();
+ }
+
+ public boolean isCanonical()
+ {
+ return canonical;
+ }
+
+ /**
+ * Set wheter entities should appear in their canonical formResourceName.
+ * The default is false.
+ */
+ public DOMWriter setCanonical(boolean canonical)
+ {
+ this.canonical = canonical;
+ return this;
+ }
+
+ public boolean isIgnoreWhitespace()
+ {
+ return ignoreWhitespace;
+ }
+
+ /**
+ * Set whether whitespace should be ignored.
+ * The default is false.
+ */
+ public DOMWriter setIgnoreWhitespace(boolean ignoreWhitespace)
+ {
+ this.ignoreWhitespace = ignoreWhitespace;
+ return this;
+ }
+
+ /**
+ * Set wheter subelements should have their namespaces completed.
+ * Setting this to false may lead to invalid XML fragments.
+ * The default is true.
+ */
+ public DOMWriter setCompleteNamespaces(boolean complete)
+ {
+ this.completeNamespaces = complete;
+ return this;
+ }
+
+ public boolean isPrettyprint()
+ {
+ return prettyprint;
+ }
+
+ /**
+ * Set wheter element should be indented.
+ * The default is false.
+ */
+ public DOMWriter setPrettyprint(boolean prettyprint)
+ {
+ this.prettyprint = prettyprint;
+ return this;
+ }
+
+ public boolean isWriteXMLDeclaration()
+ {
+ return writeXMLDeclaration;
+ }
+
+ /**
+ * Set wheter the XML declaration should be written.
+ * The default is false.
+ */
+ public DOMWriter setWriteXMLDeclaration(boolean flag)
+ {
+ this.writeXMLDeclaration = flag;
+ return this;
+ }
+
+ public void print(Node node)
+ {
+ if (prettyprint && ignoreWhitespace)
+ throw new IllegalStateException("Cannot pretty print and ignore whitespace");
+
+ rootNode = node;
+ printInternal(node, false);
+ }
+
+ private void printInternal(Node node, boolean indentEndMarker)
+ {
+ // is there anything to do?
+ if (node == null)
+ {
+ return;
+ }
+
+ // JBAS-2117 - Don't skip the DOCUMENT_NODE
+ // if (node instanceof Document) node = ((Document)node).getDocumentElement();
+
+ if (wroteXMLDeclaration == false && writeXMLDeclaration == true && canonical == false)
+ {
+ out.print("<?xml version='1.0'");
+ if (charsetName != null)
+ out.print(" encoding='" + charsetName + "'");
+
+ out.print("?>");
+ if (prettyprint)
+ out.println();
+
+ wroteXMLDeclaration = true;
+ }
+
+ int type = node.getNodeType();
+ boolean hasChildNodes = node.getChildNodes().getLength() > 0;
+
+ String nodeName = node.getNodeName();
+ switch (type)
+ {
+ // print document
+ case Node.DOCUMENT_NODE:
+ {
+ NodeList children = node.getChildNodes();
+ for (int iChild = 0; iChild < children.getLength(); iChild++)
+ {
+ printInternal(children.item(iChild), false);
+ }
+ out.flush();
+ break;
+ }
+
+ // print element with attributes
+ case Node.ELEMENT_NODE:
+ {
+ Element element = (Element)node;
+ if (prettyprint)
+ {
+ for (int i = 0; i < prettyIndent; i++)
+ {
+ out.print(' ');
+ }
+ prettyIndent++;
+ }
+
+ out.print('<');
+ out.print(nodeName);
+
+ Map nsMap = new HashMap();
+ String elPrefix = node.getPrefix();
+ String elNamespaceURI = node.getNamespaceURI();
+ if (elPrefix != null)
+ {
+ String nsURI = getNamespaceURI(elPrefix, element, rootNode);
+ nsMap.put(elPrefix, nsURI);
+ }
+
+ Attr attrs[] = sortAttributes(node.getAttributes());
+ for (int i = 0; i < attrs.length; i++)
+ {
+ Attr attr = attrs[i];
+ String atPrefix = attr.getPrefix();
+ String atName = attr.getNodeName();
+ String atValue = normalize(attr.getNodeValue(), canonical);
+
+ if (atName.equals("xmlns"))
+ currentDefaultNamespace = atValue;
+
+ if (atPrefix != null && !atPrefix.equals("xmlns") && !atPrefix.equals("xml"))
+ {
+ String nsURI = getNamespaceURI(atPrefix, element, rootNode);
+ nsMap.put(atPrefix, nsURI);
+ // xsi:type='ns1:SubType', xsi:type='xsd:string'
+ if (atName.equals(atPrefix + ":type") && atValue.indexOf(":") > 0)
+ {
+ // xsi defined on the envelope
+ if (nsURI == null)
+ nsURI = getNamespaceURI(atPrefix, element, null);
+
+ if ("http://www.w3.org/2001/XMLSchema-instance".equals(nsURI))
+ {
+ String typePrefix = atValue.substring(0, atValue.indexOf(":"));
+ String typeURI = getNamespaceURI(typePrefix, element, rootNode);
+ nsMap.put(typePrefix, typeURI);
+ }
+ }
+ }
+
+ out.print(" " + atName + "='" + atValue + "'");
+ }
+
+ // Add namespace declaration for prefixes
+ // that are defined further up the tree
+ if (completeNamespaces)
+ {
+ Iterator itPrefix = nsMap.keySet().iterator();
+ while (itPrefix.hasNext())
+ {
+ String prefix = (String)itPrefix.next();
+ String nsURI = (String)nsMap.get(prefix);
+ if (nsURI == null)
+ {
+ nsURI = getNamespaceURI(prefix, element, null);
+ out.print(" xmlns:" + prefix + "='" + nsURI + "'");
+ }
+ }
+ }
+
+ // The SAX ContentHandler will by default not add the namespace declaration
+ // <Hello xmlns='http://somens'>World</Hello>
+ if (elPrefix == null && elNamespaceURI != null)
+ {
+ String defaultNamespace = element.getAttribute("xmlns");
+ if (defaultNamespace.length() == 0 && !elNamespaceURI.equals(currentDefaultNamespace))
+ {
+ out.print(" xmlns='" + elNamespaceURI + "'");
+ currentDefaultNamespace = elNamespaceURI;
+ }
+ }
+
+ if (hasChildNodes)
+ {
+ out.print('>');
+ }
+
+ // Find out if the end marker is indented
+ indentEndMarker = isEndMarkerIndented(node);
+
+ if (indentEndMarker)
+ {
+ out.print('\n');
+ }
+
+ NodeList childNodes = node.getChildNodes();
+ int len = childNodes.getLength();
+ for (int i = 0; i < len; i++)
+ {
+ Node childNode = childNodes.item(i);
+ printInternal(childNode, false);
+ }
+ break;
+ }
+
+ // handle entity reference nodes
+ case Node.ENTITY_REFERENCE_NODE:
+ {
+ if (canonical)
+ {
+ NodeList children = node.getChildNodes();
+ if (children != null)
+ {
+ int len = children.getLength();
+ for (int i = 0; i < len; i++)
+ {
+ printInternal(children.item(i), false);
+ }
+ }
+ }
+ else
+ {
+ out.print('&');
+ out.print(nodeName);
+ out.print(';');
+ }
+ break;
+ }
+
+ // print cdata sections
+ case Node.CDATA_SECTION_NODE:
+ {
+ if (canonical)
+ {
+ out.print(normalize(node.getNodeValue(), canonical));
+ }
+ else
+ {
+ out.print("<![CDATA[");
+ out.print(node.getNodeValue());
+ out.print("]]>");
+ }
+ break;
+ }
+
+ // print text
+ case Node.TEXT_NODE:
+ {
+ String text = normalize(node.getNodeValue(), canonical);
+ if (text.trim().length() > 0)
+ {
+ out.print(text);
+ }
+ else if (prettyprint == false && ignoreWhitespace == false)
+ {
+ out.print(text);
+ }
+ break;
+ }
+
+ // print processing instruction
+ case Node.PROCESSING_INSTRUCTION_NODE:
+ {
+ out.print("<?");
+ out.print(nodeName);
+ String data = node.getNodeValue();
+ if (data != null && data.length() > 0)
+ {
+ out.print(' ');
+ out.print(data);
+ }
+ out.print("?>");
+ break;
+ }
+
+ // print comment
+ case Node.COMMENT_NODE:
+ {
+ for (int i = 0; i < prettyIndent; i++)
+ {
+ out.print(' ');
+ }
+
+ out.print("<!--");
+ String data = node.getNodeValue();
+ if (data != null)
+ {
+ out.print(data);
+ }
+ out.print("-->");
+
+ if (prettyprint)
+ {
+ out.print('\n');
+ }
+
+ break;
+ }
+ }
+
+ if (type == Node.ELEMENT_NODE)
+ {
+ if (prettyprint)
+ prettyIndent--;
+
+ if (hasChildNodes == false)
+ {
+ out.print("/>");
+ }
+ else
+ {
+ if (indentEndMarker)
+ {
+ for (int i = 0; i < prettyIndent; i++)
+ {
+ out.print(' ');
+ }
+ }
+
+ out.print("</");
+ out.print(nodeName);
+ out.print('>');
+ }
+
+ if (prettyIndent > 0)
+ {
+ out.print('\n');
+ }
+ }
+ out.flush();
+ }
+
+ private String getNamespaceURI(String prefix, Element element, Node stopNode)
+ {
+ Node parent = element.getParentNode();
+ String nsURI = element.getAttribute("xmlns:" + prefix);
+ if (nsURI.length() == 0 && element != stopNode && parent instanceof Element)
+ return getNamespaceURI(prefix, (Element)parent, stopNode);
+
+ return (nsURI.length() > 0 ? nsURI : null);
+ }
+
+ private boolean isEndMarkerIndented(Node node)
+ {
+ if (prettyprint)
+ {
+ NodeList childNodes = node.getChildNodes();
+ int len = childNodes.getLength();
+ for (int i = 0; i < len; i++)
+ {
+ Node children = childNodes.item(i);
+ if (children.getNodeType() == Node.ELEMENT_NODE)
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /** Returns a sorted list of attributes. */
+ private Attr[] sortAttributes(NamedNodeMap attrs)
+ {
+
+ int len = (attrs != null) ? attrs.getLength() : 0;
+ Attr array[] = new Attr[len];
+ for (int i = 0; i < len; i++)
+ {
+ array[i] = (Attr)attrs.item(i);
+ }
+ for (int i = 0; i < len - 1; i++)
+ {
+ String name = array[i].getNodeName();
+ int index = i;
+ for (int j = i + 1; j < len; j++)
+ {
+ String curName = array[j].getNodeName();
+ if (curName.compareTo(name) < 0)
+ {
+ name = curName;
+ index = j;
+ }
+ }
+ if (index != i)
+ {
+ Attr temp = array[i];
+ array[i] = array[index];
+ array[index] = temp;
+ }
+ }
+ return (array);
+ }
+
+ /** Normalizes the given string. */
+ public static String normalize(String s, boolean canonical)
+ {
+ StringBuilder normal = new StringBuilder();
+
+ int len = (s != null) ? s.length() : 0;
+ for (int i = 0; i < len; i++)
+ {
+ char ch = s.charAt(i);
+ switch (ch)
+ {
+ case '<':
+ {
+ normal.append("<");
+ break;
+ }
+ case '>':
+ {
+ normal.append(">");
+ break;
+ }
+ case '&':
+ {
+ normal.append("&");
+ break;
+ }
+ case '"':
+ {
+ normal.append(""");
+ break;
+ }
+ case '\'':
+ {
+ normal.append("'");
+ break;
+ }
+ case '\r':
+ case '\n':
+ {
+ if (canonical)
+ {
+ normal.append("&#");
+ normal.append(Integer.toString(ch));
+ normal.append(';');
+ break;
+ }
+ // else, default append char
+ }
+ default:
+ {
+ normal.append(ch);
+ }
+ }
+ }
+ return (normal.toString());
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/DefaultObservable.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/DefaultObservable.java
new file mode 100644
index 0000000..48ebbc8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/DefaultObservable.java
@@ -0,0 +1,74 @@
+package org.jbpm.pvm.internal.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.api.JbpmException;
+
+/** default implementation of the {@link Observable} interface.
+ *
+ * @author Tom Baeyens
+ */
+public class DefaultObservable implements Observable {
+
+ protected List<Listener> listeners = null;
+
+ public void addListener(Listener listener) {
+ if (listener==null) {
+ throw new JbpmException("listener is null");
+ }
+ if (listeners==null) {
+ listeners = new ArrayList<Listener>();
+ }
+ listeners.add(listener);
+ }
+
+ public void removeListener(Listener listener) {
+ if (listener==null) {
+ throw new JbpmException("listener is null");
+ }
+ if (listeners!=null) {
+ listeners.remove(listener);
+ }
+ }
+
+ public Listener addListener(Listener listener, String eventName) {
+ if (eventName==null) {
+ throw new JbpmException("eventName is null");
+ }
+
+ List<String> eventNames = new ArrayList<String>();
+ eventNames.add(eventName);
+
+ return addListener(listener, eventNames);
+ }
+
+
+ public Listener addListener(Listener listener, List<String> eventNames) {
+ if (listener==null) {
+ throw new JbpmException("listener is null");
+ }
+ if (eventNames==null) {
+ throw new JbpmException("eventNames is null");
+ }
+ FilterListener filterListener = new FilterListener(listener, eventNames);
+ addListener(filterListener);
+ return filterListener;
+ }
+
+ public void fire(String eventName) {
+ fire(eventName, null);
+ }
+
+ public void fire(String eventName, Object info) {
+ if (listeners!=null) {
+ for (Listener listener: listeners) {
+ listener.event(this, eventName, info);
+ }
+ }
+ }
+
+ public List<Listener> getListeners() {
+ return listeners;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/EqualsUtil.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/EqualsUtil.java
new file mode 100644
index 0000000..f956a7a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/EqualsUtil.java
@@ -0,0 +1,59 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.util;
+
+public abstract class EqualsUtil {
+
+ public static boolean equals(Object thisObject, Object otherObject) {
+ if ( (thisObject==null) || (otherObject==null) ) return false;
+
+ if (isProxy(otherObject)) {
+ return otherObject.equals(thisObject);
+ } else {
+ return otherObject==thisObject;
+ }
+ }
+
+ static boolean isInitialized = false;
+ static boolean isHibernateInClasspth = true;
+ static Class<?> hibernateProxyClass = null;
+
+ static boolean isProxy(Object otherObject) {
+ boolean isProxy = false;
+ if (!isInitialized) initializeHibernateProxyClass();
+
+ if (isHibernateInClasspth) {
+ return hibernateProxyClass.isAssignableFrom(otherObject.getClass());
+ }
+ return isProxy;
+ }
+
+ static synchronized void initializeHibernateProxyClass() {
+ try {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ hibernateProxyClass = classLoader.loadClass("org.hibernate.proxy.HibernateProxy");
+ } catch (ClassNotFoundException e) {
+ isHibernateInClasspth = false;
+ }
+ isInitialized = true;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/FilterListener.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/FilterListener.java
new file mode 100644
index 0000000..941084d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/FilterListener.java
@@ -0,0 +1,56 @@
+package org.jbpm.pvm.internal.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.api.JbpmException;
+
+/** listener that only delegates events to a given listener if
+ * they pass the filter based on event names. */
+public class FilterListener implements Listener {
+
+ protected Listener listener;
+ protected List<String> eventNames;
+
+ public FilterListener(Listener listener, String eventName) {
+ if (listener==null) throw new JbpmException("listener is null");
+ this.listener = listener;
+ if (eventName==null) throw new JbpmException("eventName is null");
+ this.eventNames = new ArrayList<String>();
+ this.eventNames.add(eventName);
+ }
+
+ public FilterListener(Listener listener, List<String> eventNames) {
+ if (listener==null) throw new JbpmException("listener is null");
+ this.listener = listener;
+ if (eventNames==null) throw new JbpmException("eventNames is null");
+ this.eventNames = eventNames;
+ }
+
+ public void event(Object source, String name, Object info) {
+ if (! isFiltered(name)) {
+ listener.event(source, name, info);
+ }
+ }
+
+ public boolean isFiltered(String eventName) {
+ if (eventNames.contains(eventName)) {
+ return false;
+ }
+ return true;
+ }
+
+ public boolean equals(Object object) {
+ if (object==null) return false;
+ if (object==this) return true;
+ if ( (object instanceof Listener)
+ && (listener.equals(object))
+ ) {
+ return true;
+ }
+ return false;
+ }
+ public int hashCode() {
+ return 17+listener.hashCode();
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/IoUtil.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/IoUtil.java
new file mode 100644
index 0000000..86af693
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/IoUtil.java
@@ -0,0 +1,66 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.jbpm.api.JbpmException;
+
+public abstract class IoUtil {
+
+ public static final int BUFFERSIZE = 4096;
+
+ public static byte[] readBytes(InputStream inputStream) {
+ byte[] bytes = null;
+ if (inputStream==null) {
+ throw new JbpmException("inputStream is null");
+ }
+ try {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ transfer(inputStream, outputStream);
+ bytes = outputStream.toByteArray();
+ outputStream.close();
+ return bytes;
+ } catch (IOException e) {
+ throw new JbpmException("couldn't read bytes from inputStream", e);
+ }
+ }
+
+ public static int transfer(InputStream in, OutputStream out) {
+ int total = 0;
+ byte[] buffer = new byte[BUFFERSIZE];
+ try {
+ int bytesRead = in.read( buffer );
+ while ( bytesRead != -1 ) {
+ out.write( buffer, 0, bytesRead );
+ total += bytesRead;
+ bytesRead = in.read( buffer );
+ }
+ return total;
+ } catch (IOException e) {
+ throw new JbpmException("couldn't write bytes to output stream", e);
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Listener.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Listener.java
new file mode 100644
index 0000000..e5b906d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Listener.java
@@ -0,0 +1,17 @@
+package org.jbpm.pvm.internal.util;
+
+/** listener to events that are produced by an {@link Observable}.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public interface Listener {
+
+ /** is called by the {@link Observable} when an event is fired.
+ * @param source {@link Observable} that fired the event.
+ * @param eventName name of the event.
+ * @param info more information about the fired event. See the concrete
+ * observable docs for more information about what information is provided.
+ */
+ public void event(Object source, String eventName, Object info);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Observable.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Observable.java
new file mode 100644
index 0000000..d21e257
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Observable.java
@@ -0,0 +1,52 @@
+package org.jbpm.pvm.internal.util;
+
+import java.util.List;
+
+
+/** dispatches events to which {@link Listener listeners} can subscribe.
+ * Aka publish-subscribe.
+ *
+ * @see DefaultObservable a default implementation of this interface
+ * @author Tom Baeyens
+ */
+public interface Observable {
+
+ /** subscribes a listener to every event
+ * @param listener is the object that will be notified on {@link #fire(String, Object) firing} of events.
+ */
+ void addListener(Listener listener);
+
+ /** removes a listener that was subscribed for every event
+ */
+ void removeListener(Listener listener);
+
+ /** subscribes the listener to receive event notifications only of the given eventName. Events with
+ * different eventNames will not be dispatched to the given listener.
+ * @param listener is the object that will be notified on {@link #fire(String, Object) firing} of events.
+ * @param eventName is the type of events the listener is interested in and this is mandatory.
+ * @return the {@link FilterListener} that is created as a wrapper for the given listener. That handle
+ * might be necessary to remove the listener later on.
+ * @throws NullPointerException in case listener or eventName is null. */
+ Listener addListener(Listener listener, String eventName);
+
+ /** subscribes the listener to receive event notifications only if event matches one of the
+ * given eventNames. Events with different eventNames will not be dispatched to the given listener.
+ * @param listener is the object that will be notified on {@link #fire(String, Object) firing} of events.
+ * @param eventNames is the type of events the listener is interested in and this is mandatory.
+ * @return the {@link FilterListener} that is created as a wrapper for the given listener. That handle
+ * might be necessary to remove the listener later on.
+ * @throws NullPointerException in case listener or eventName is null. */
+ Listener addListener(Listener listener, List<String> eventNames);
+
+ /** dispatches an event to the listeners.
+ * @param eventName identifies the type of event and is allowed to be null.
+ */
+ void fire(String eventName);
+
+ /** dispatches an event to the listeners.
+ * @param eventName identifies the type of event and is allowed to be null.
+ * @param info is the optional information that the observable wants to pass to it's listeners.
+ * Each observable should indicate which type of info it's passing for each event.
+ */
+ void fire(String eventName, Object info);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Priority.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Priority.java
new file mode 100644
index 0000000..3528f5e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/Priority.java
@@ -0,0 +1,61 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.util;
+
+import org.jbpm.api.JbpmException;
+
+public abstract class Priority {
+
+ public static final int HIGHEST = 2;
+ public static final int HIGH = 1;
+ public static final int NORMAL = 0;
+ public static final int LOW = -1;
+ public static final int LOWEST = -2;
+
+ public static final String TEXT_HIGHEST = "highest";
+ public static final String TEXT_HIGH = "high";
+ public static final String TEXT_NORMAL = "normal";
+ public static final String TEXT_LOW = "low";
+ public static final String TEXT_LOWEST = "lowest";
+
+ public static String toString(int priority) {
+ if (priority==3) return TEXT_NORMAL;
+ if (priority==2) return TEXT_HIGH;
+ if (priority==1) return TEXT_HIGHEST;
+ if (priority==4) return TEXT_LOW;
+ if (priority==5) return TEXT_LOWEST;
+ return Integer.toString(priority);
+ }
+
+ public static int parsePriority(String priorityText) {
+ if (TEXT_NORMAL.equalsIgnoreCase(priorityText)) return NORMAL;
+ else if (TEXT_HIGH.equalsIgnoreCase(priorityText)) return HIGH;
+ else if (TEXT_HIGHEST.equalsIgnoreCase(priorityText)) return HIGHEST;
+ else if (TEXT_LOW.equalsIgnoreCase(priorityText)) return LOW;
+ else if (TEXT_LOWEST.equalsIgnoreCase(priorityText)) return LOWEST;
+ try {
+ return Integer.parseInt(priorityText);
+ } catch (NumberFormatException e) {
+ throw new JbpmException("priority '"+priorityText+"' could not be parsed as a priority", e);
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/ReflectUtil.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/ReflectUtil.java
new file mode 100644
index 0000000..9422f5b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/ReflectUtil.java
@@ -0,0 +1,315 @@
+package org.jbpm.pvm.internal.util;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.List;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.repository.DeploymentClassLoader;
+import org.jbpm.pvm.internal.repository.RepositoryCache;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.descriptor.ArgDescriptor;
+
+public abstract class ReflectUtil {
+
+ private static Log log = Log.getLog(ReflectUtil.class.getName());
+
+ /** searches for the field in the given class and in its super classes */
+ public static Field findField(Class<?> clazz, String fieldName) {
+ return findField(clazz, fieldName, clazz);
+ }
+
+ private static Field findField(Class<?> clazz, String fieldName, Class<?> original) {
+ Field field = null;
+
+ try {
+ field = clazz.getDeclaredField(fieldName);
+ if (log.isTraceEnabled()) log.trace("found field "+fieldName+" in "+clazz.getName());
+ } catch (SecurityException e) {
+ throw new JbpmException("wasn't allowed to get field '"+clazz.getName()+"."+fieldName+"'", e);
+ } catch (NoSuchFieldException e) {
+ if (clazz.getSuperclass()!=null) {
+ return findField(clazz.getSuperclass(), fieldName, original);
+ } else {
+ throw new JbpmException("couldn't find field '"+original.getName()+"."+fieldName+"'", e);
+ }
+ }
+
+ return field;
+ }
+
+ /** searches for the method in the given class and in its super classes */
+ public static Method getMethod(Class<?> clazz, String methodName, Class<?>[] parameterTypes) {
+ return getMethod(clazz, methodName, parameterTypes, clazz);
+ }
+
+ private static Method getMethod(Class<?> clazz, String methodName, Class<?>[] parameterTypes, Class<?> original) {
+ Method method = null;
+
+ try {
+ method = clazz.getDeclaredMethod(methodName, parameterTypes);
+
+ if (log.isTraceEnabled()) log.trace("found method "+clazz.getName()+"."+methodName+"("+Arrays.toString(parameterTypes)+")");
+
+ } catch (SecurityException e) {
+ throw new JbpmException("wasn't allowed to get method '"+clazz.getName()+"."+methodName+"("+getParameterTypesText(parameterTypes)+")'", e);
+ } catch (NoSuchMethodException e) {
+ if (clazz.getSuperclass()!=null) {
+ return getMethod(clazz.getSuperclass(), methodName, parameterTypes, original);
+ } else {
+ throw new JbpmException("couldn't find method '"+original.getName()+"."+methodName+"("+getParameterTypesText(parameterTypes)+")'", e);
+ }
+ }
+
+ return method;
+ }
+
+ private static String getParameterTypesText(Class<?>[] parameterTypes) {
+ if (parameterTypes==null) return "";
+ StringBuilder parameterTypesText = new StringBuilder();
+ for (int i=0; i<parameterTypes.length; i++) {
+ Class<?> parameterType = parameterTypes[i];
+ parameterTypesText.append(parameterType.getName());
+ if (i!=parameterTypes.length-1) {
+ parameterTypesText.append(", ");
+ }
+ }
+ return parameterTypesText.toString();
+ }
+
+ public static <T> T newInstance(Class<T> clazz) {
+ return newInstance(clazz, null, null);
+ }
+ public static <T> T newInstance(Constructor<T> constructor) {
+ return newInstance(null, constructor, null);
+ }
+ public static <T> T newInstance(Constructor<T> constructor, Object[] args) {
+ return newInstance(null, constructor, args);
+ }
+
+ private static <T> T newInstance(Class<T> clazz, Constructor<T> constructor, Object[] args) {
+ if ( (clazz==null)
+ && (constructor==null)
+ ) {
+ throw new IllegalArgumentException("can't create new instance without clazz or constructor");
+ }
+
+ try {
+ if (log.isTraceEnabled()) log.trace("creating new instance for class '"+clazz.getName()+"' with args "+Arrays.toString(args));
+ if (constructor==null) {
+ if (log.isTraceEnabled()) log.trace("getting default constructor");
+ constructor = clazz.getConstructor((Class[])null);
+ }
+ if (!constructor.isAccessible()) {
+ if (log.isTraceEnabled()) log.trace("making constructor accessible");
+ constructor.setAccessible(true);
+ }
+ return constructor.newInstance(args);
+
+ } catch (Throwable t) {
+ throw new JbpmException("couldn't construct new '"+clazz.getName()+"' with args "+Arrays.toString(args), t);
+ }
+ }
+
+ public static Object get(Field field, Object object) {
+ if (field==null) {
+ throw new NullPointerException("field is null");
+ }
+ try {
+ Object value = field.get(object);
+ if (log.isTraceEnabled()) log.trace("got value '"+value+"' from field '"+field.getName()+"'");
+ return value;
+ } catch (Exception e) {
+ throw new JbpmException("couldn't get '"+field.getName()+"'", e);
+ }
+ }
+
+ public static void set(Field field, Object object, Object value) {
+ if (field==null) {
+ throw new NullPointerException("field is null");
+ }
+ try {
+ if (log.isTraceEnabled()) log.trace("setting field '"+field.getName()+"' to value '"+value+"'");
+ if (!field.isAccessible()) {
+ if (log.isTraceEnabled()) log.trace("making field accessible");
+ field.setAccessible(true);
+ }
+ field.set(object, value);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't set '"+field.getName()+"' to '"+value+"'", e);
+ }
+ }
+
+ public static Object invoke(Method method, Object target, Object[] args) {
+ if (method==null) {
+ throw new JbpmException("method is null");
+ }
+ try {
+ if (log.isTraceEnabled()) log.trace("invoking '"+method.getName()+"' on '"+target+"' with "+Arrays.toString(args));
+ if (!method.isAccessible()) {
+ log.trace("making method accessible");
+ method.setAccessible(true);
+ }
+ return method.invoke(target, args);
+ } catch (InvocationTargetException e) {
+ Throwable targetException = e.getTargetException();
+ throw new JbpmException("couldn't invoke '"+method.getName()+"' with "+Arrays.toString(args)+" on "+target+": "+targetException.getMessage(), targetException);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't invoke '"+method.getName()+"' with "+Arrays.toString(args)+" on "+target+": "+e.getMessage(), e);
+ }
+ }
+
+ public static Method findMethod(Class<?> clazz, String methodName, List<ArgDescriptor> argDescriptors, Object[] args) {
+ if (log.isTraceEnabled()) log.trace("searching for method "+methodName+" in "+clazz.getName());
+ Method[] candidates = clazz.getDeclaredMethods();
+ for (int i=0; i<candidates.length; i++) {
+ Method candidate = candidates[i];
+ if ( (candidate.getName().equals(methodName))
+ && (isArgumentMatch(candidate.getParameterTypes(), argDescriptors, args))
+ ) {
+
+ if (log.isTraceEnabled()) {
+ if (log.isTraceEnabled()) log.trace("found matching method "+clazz.getName()+"."+methodName);
+ }
+
+ return candidate;
+ }
+ }
+ if (clazz.getSuperclass()!=null) {
+ return findMethod(clazz.getSuperclass(), methodName, argDescriptors, args);
+ }
+ return null;
+ }
+
+ public static Constructor<?> findConstructor(Class<?> clazz, List<ArgDescriptor> argDescriptors, Object[] args) {
+ Constructor<?>[] constructors = clazz.getDeclaredConstructors();
+ for (int i=0; i<constructors.length; i++) {
+ if (isArgumentMatch(constructors[i].getParameterTypes(), argDescriptors, args)) {
+ return constructors[i];
+ }
+ }
+ return null;
+ }
+
+ public static boolean isArgumentMatch(Class<?>[] parameterTypes, List<ArgDescriptor> argDescriptors, Object[] args) {
+ int nbrOfArgs = 0;
+ if (args!=null) nbrOfArgs = args.length;
+
+ int nbrOfParameterTypes = 0;
+ if (parameterTypes!=null) nbrOfParameterTypes = parameterTypes.length;
+
+ if ( (nbrOfArgs==0)
+ && (nbrOfParameterTypes==0)
+ ) {
+ return true;
+ }
+
+ if (nbrOfArgs!=nbrOfParameterTypes) {
+ return false;
+ }
+
+ for (int i=0; (i<parameterTypes.length); i++) {
+ Class<?> parameterType = parameterTypes[i];
+ String argTypeName = (argDescriptors!=null ? argDescriptors.get(i).getTypeName() : null);
+ if (argTypeName!=null) {
+ if (! argTypeName.equals(parameterType.getName())) {
+ return false;
+ }
+ } else if ( (args[i]!=null)
+ && (! parameterType.isAssignableFrom(args[i].getClass()))
+ ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static String getSignature(String methodName, List<ArgDescriptor> argDescriptors, Object[] args) {
+ String signature = methodName+"(";
+ if (args!=null) {
+ for (int i=0; i<args.length; i++) {
+ String argType = null;
+ if (argDescriptors!=null) {
+ ArgDescriptor argDescriptor = argDescriptors.get(i);
+ if ( (argDescriptor!=null)
+ && (argDescriptor.getTypeName()!=null)
+ ) {
+ argType = argDescriptor.getTypeName();
+ }
+ }
+ if ( (argType==null)
+ && (args[i]!=null)
+ ) {
+ argType = args[i].getClass().getName();
+ }
+ signature += argType;
+ if (i<(args.length-1)) {
+ signature += ", ";
+ }
+ }
+ }
+ signature+=")";
+ return signature;
+ }
+
+ public static String getUnqualifiedClassName(Class<?> clazz) {
+ if (clazz==null) {
+ return null;
+ }
+ return getUnqualifiedClassName(clazz.getSimpleName());
+ }
+
+ public static String getUnqualifiedClassName(String className) {
+ if (className==null) {
+ return null;
+ }
+ int dotIndex = className.lastIndexOf('.');
+ if (dotIndex!=-1) {
+ className = className.substring(dotIndex+1);
+ }
+ return className;
+ }
+
+ public static ClassLoader installDeploymentClassLoader(ProcessDefinitionImpl processDefinition) {
+ String deploymentId = processDefinition.getDeploymentId();
+ if (deploymentId==null) {
+ return null;
+ }
+
+ Thread currentThread = Thread.currentThread();
+ ClassLoader original = currentThread.getContextClassLoader();
+
+ RepositoryCache repositoryCache = EnvironmentImpl.getFromCurrent(RepositoryCache.class);
+ DeploymentClassLoader deploymentClassLoader = repositoryCache.getDeploymentClassLoader(deploymentId, original);
+ if (deploymentClassLoader==null) {
+ deploymentClassLoader = new DeploymentClassLoader(original, deploymentId);
+ repositoryCache.setDeploymentClassLoader(deploymentId, original, deploymentClassLoader);
+ }
+
+ currentThread.setContextClassLoader(deploymentClassLoader);
+
+ return original;
+ }
+
+ public static void uninstallDeploymentClassLoader(ClassLoader original) {
+ if (original!=null) {
+ Thread.currentThread().setContextClassLoader(original);
+ }
+ }
+
+ public static Object instantiateUserCode(Descriptor descriptor, ProcessDefinitionImpl processDefinition) {
+ ClassLoader classLoader = ReflectUtil.installDeploymentClassLoader(processDefinition);
+ try {
+ return WireContext.create(descriptor);
+ } finally {
+ ReflectUtil.uninstallDeploymentClassLoader(classLoader);
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/StringUtil.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/StringUtil.java
new file mode 100644
index 0000000..e93d8a0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/StringUtil.java
@@ -0,0 +1,61 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.util;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.jbpm.api.JbpmException;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class StringUtil {
+
+ public static List<String> tokenize(String text, String delimiter) {
+ if (delimiter==null) {
+ throw new JbpmException("delimiter is null");
+ }
+ if (text==null) {
+ return Collections.EMPTY_LIST;
+ }
+
+ List<String> pieces = new ArrayList<String>();
+
+ int start = 0;
+ int end = text.indexOf(delimiter);
+ while (end!=-1) {
+ pieces.add(text.substring(start, end));
+ start = end+delimiter.length();
+ end = text.indexOf(delimiter, start);
+ }
+
+ if (start<text.length()) {
+ pieces.add(text.substring(start));
+ }
+
+ return pieces;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/TagBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/TagBinding.java
new file mode 100644
index 0000000..e35932a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/TagBinding.java
@@ -0,0 +1,91 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.util;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.xml.Binding;
+import org.jbpm.pvm.internal.xml.Bindings;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class TagBinding implements Binding {
+
+ protected String category;
+ protected String tagName;
+ protected String namespaceUri;
+
+ /** @param tagName is required and represents the local part of the tag name.
+ * @param namespaceUri is optional (null is allowed) and represents the full
+ * namespace URI of the element
+ * @param category is optional (null is allowed) and represents the category of
+ * the binding.
+ * @see Bindings */
+ public TagBinding(String tagName, String namespaceUri, String category) {
+ if (tagName==null) {
+ throw new JbpmException("tagName is null");
+ }
+ this.tagName = tagName;
+ this.namespaceUri = namespaceUri;
+ this.category = category;
+ }
+
+ public boolean matches(Element element) {
+ String elementNamespaceUri = element.getNamespaceURI();
+ if ( (elementNamespaceUri!=null)
+ && (namespaceUri!=null)
+ && (!namespaceUri.equals(elementNamespaceUri))
+ ) {
+ return false;
+ }
+ String elementTagLocalName = XmlUtil.getTagLocalName(element);
+ if (!tagName.equals(elementTagLocalName)) {
+ return false;
+ }
+ return true;
+ }
+
+ public String toString() {
+ // xml parsing error messages depend on this implementation of the toString to be meaningfull
+ return tagName;
+ }
+ public String getCategory() {
+ return category;
+ }
+ public String getTagName() {
+ return tagName;
+ }
+ public String getNamespaceUri() {
+ return namespaceUri;
+ }
+ public void setCategory(String category) {
+ this.category = category;
+ }
+ public void setTagName(String tagName) {
+ this.tagName = tagName;
+ }
+ public void setNamespaceUri(String namespaceUri) {
+ this.namespaceUri = namespaceUri;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/UrlEntity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/UrlEntity.java
new file mode 100644
index 0000000..db41188
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/UrlEntity.java
@@ -0,0 +1,69 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.xml.Entity;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+
+/**
+ * an implementation of {@link Entity} based on a {@link URL} used in the
+ * {@link Parser}s implementation of {@link EntityResolver}.
+ *
+ * @author Tom Baeyens
+ */
+public class UrlEntity implements Entity {
+
+ protected String systemId = null;
+ protected URL url = null;
+
+ public UrlEntity(URL url, String systemId) {
+ this.url = url;
+ this.systemId = systemId;
+ }
+
+ public UrlEntity(String resource, ClassLoader classLoader) {
+ this.url = classLoader.getResource(resource);
+ if (url!=null) {
+ this.systemId = url.toString();
+ } else {
+ throw new JbpmException("couldn't create Entity from resource "+resource);
+ }
+ }
+
+ public InputSource getInputSource() {
+ try {
+ InputStream stream = url.openStream();
+ InputSource inputSource = new InputSource(stream);
+ inputSource.setSystemId(systemId);
+ return inputSource;
+ } catch (IOException e) {
+ throw new JbpmException("couldn't open stream from url "+url, e);
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/XmlUtil.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/XmlUtil.java
new file mode 100644
index 0000000..3145ab2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/util/XmlUtil.java
@@ -0,0 +1,495 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.util;
+
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.xml.Parse;
+
+import javax.xml.namespace.QName;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.CharacterData;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * convenience methods to make reading org.w3c.dom models easier.
+ *
+ * @author Tom Baeyens
+ */
+public class XmlUtil {
+
+ private XmlUtil() {
+ // hide default constructor to prevent instantiation
+ }
+
+ public static List<Element> elements(Element element, String tagName) {
+ if (element==null) {
+ return Collections.emptyList();
+ }
+ NodeList activityList = element.getChildNodes();
+ if ( (activityList == null)
+ || (activityList.getLength()==0)
+ ) {
+ return Collections.emptyList();
+ }
+ List<Element> elements = new ArrayList<Element>();
+ for (int i = 0; i < activityList.getLength(); i++) {
+ Node child = activityList.item(i);
+ if (Element.class.isAssignableFrom(child.getClass())) {
+ Element childElement = (Element) child;
+ String childTagName = getTagLocalName(childElement);
+ if (childTagName.equals(tagName)) {
+ if (elements == null) {
+ elements = new ArrayList<Element>();
+ }
+ elements.add(childElement);
+ }
+ }
+ }
+ return elements;
+ }
+
+ public static List<Element> elements(Element element, Set<String> allowedTagNames) {
+ if (element==null) {
+ return Collections.emptyList();
+ }
+ NodeList activityList = element.getChildNodes();
+ if ( (activityList == null)
+ || (activityList.getLength()==0)
+ ) {
+ return Collections.emptyList();
+ }
+ List<Element> elements = new ArrayList<Element>();
+ for (int i = 0; i < activityList.getLength(); i++) {
+ Node child = activityList.item(i);
+ if (Element.class.isAssignableFrom(child.getClass())) {
+ Element childElement = (Element) child;
+ String childTagName = getTagLocalName(childElement);
+ if (allowedTagNames.contains(childTagName)) {
+ if (elements == null) {
+ elements = new ArrayList<Element>();
+ }
+ elements.add(childElement);
+ }
+ }
+ }
+ return elements;
+ }
+
+ public static Element element(Element element, String tagName) {
+ return element(element, tagName, false, null);
+ }
+
+ public static Element element(Element element, String tagName, boolean required, Parse parse) {
+ if (element==null) {
+ return null;
+ }
+ NodeList activityList = element.getChildNodes();
+ for (int i = 0; (i < activityList.getLength()); i++) {
+ Node child = activityList.item(i);
+ if ((Element.class.isAssignableFrom(child.getClass())) && (getTagLocalName((Element) child)).equals(tagName)) {
+ return (Element) child;
+ }
+ }
+
+ if (required && (parse!=null)) {
+ parse.addProblem("nested element <"+XmlUtil.getTagLocalName(element)+"><"+tagName+" ... />... is required", element);
+ }
+ return null;
+ }
+
+
+ public static List<Element> elements(Element element) {
+ if (element==null) {
+ return Collections.emptyList();
+ }
+ NodeList activityList = element.getChildNodes();
+ if ( (activityList == null)
+ || (activityList.getLength()==0)
+ ) {
+ return Collections.emptyList();
+ }
+ List<Element> elements = new ArrayList<Element>();
+ if ((activityList != null) && (activityList.getLength() > 0)) {
+ elements = new ArrayList<Element>();
+ for (int i = 0; i < activityList.getLength(); i++) {
+ Node activity = activityList.item(i);
+ if (activity instanceof Element) {
+ elements.add((Element) activity);
+ }
+ }
+ }
+ return elements;
+ }
+
+ public static List<Element> elements(Element element, String ns, String localName) {
+ if (element==null) {
+ return Collections.emptyList();
+ }
+ NodeList activityList = element.getChildNodes();
+ if ( (activityList == null)
+ || (activityList.getLength()==0)
+ ) {
+ return Collections.emptyList();
+ }
+ List<Element> matchingElements = new ArrayList<Element>();
+ NodeList nl = element.getChildNodes();
+ for (int i=0;i<nl.getLength();i++) {
+ Node n = nl.item(i);
+ if (n instanceof Element && n.getLocalName() != null && n.getLocalName().equals(localName) && n.getNamespaceURI() != null && n.getNamespaceURI().equals(ns)) {
+ matchingElements.add((Element)n);
+ }
+ }
+ return matchingElements;
+ }
+
+ public static List<Element> elementsQName(Element element, Set<QName> allowedTagNames) {
+ if (element==null) {
+ return Collections.emptyList();
+ }
+ NodeList activityList = element.getChildNodes();
+ if ( (activityList == null)
+ || (activityList.getLength()==0)
+ ) {
+ return Collections.emptyList();
+ }
+ List<Element> elements = new ArrayList<Element>();
+ if (activityList != null) {
+ for (int i = 0; i < activityList.getLength(); i++) {
+ Node child = activityList.item(i);
+ if (Element.class.isAssignableFrom(child.getClass())) {
+ Element childElement = (Element) child;
+ QName childElementQName = new QName(childElement.getNamespaceURI(), childElement.getLocalName());
+ if (allowedTagNames.contains(childElementQName)) {
+ if (elements == null) {
+ elements = new ArrayList<Element>();
+ }
+ elements.add(childElement);
+ }
+ }
+ }
+ }
+ return elements;
+ }
+
+ public static Element element(Element element) {
+ Element onlyChild = null;
+ List<Element> elements = elements(element);
+ if (!elements.isEmpty()) {
+ onlyChild = elements.get(0);
+ }
+ return onlyChild;
+ }
+
+ public static String toString(Node node) {
+ if (node == null) return "null";
+
+ try {
+ TransformerFactory transformerFactory = TransformerFactory.newInstance();
+ Transformer transformer = transformerFactory.newTransformer();
+ transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+
+ StringWriter stringWriter = new StringWriter();
+ transformer.transform(new DOMSource(node), new StreamResult(stringWriter));
+ return stringWriter.toString();
+ }
+ catch (TransformerException e) {
+ throw new JbpmException("could not transform dom node to string", e);
+ }
+ }
+
+ public static String getContentText(Element element) {
+ return element.getTextContent();
+ }
+
+ public static boolean isTextOnly(Element element) {
+ for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
+ if (child.getNodeType() == Node.ELEMENT_NODE)
+ return false;
+ }
+ return true;
+ }
+
+ public static List<Attr> attributes(Element element) {
+ NamedNodeMap attributeMap = element.getAttributes();
+ if ((attributeMap == null) || (attributeMap.getLength() == 0)) {
+ return Collections.emptyList();
+ }
+
+ List<Attr> attributes = new ArrayList<Attr>();
+ for (int i = 0; i < attributeMap.getLength(); i++) {
+ attributes.add((Attr) attributeMap.item(i));
+ }
+
+ return attributes;
+ }
+
+ public static List<Node> contents(Element element) {
+ NodeList activityList = element.getChildNodes();
+ if ((activityList == null) || (activityList.getLength() == 0)) {
+ return Collections.emptyList();
+ }
+
+ List<Node> contents = new ArrayList<Node>();
+ for (int i = 0; i < activityList.getLength(); i++) {
+ contents.add((Node) activityList.item(i));
+ }
+
+ return contents;
+ }
+
+ public static String getTagLocalName(Element element) {
+ if (element == null) {
+ return null;
+ }
+ String localName = element.getLocalName();
+ if (localName != null) {
+ return localName;
+ }
+ return element.getTagName();
+ }
+
+ /** the attribute value or null if the attribute is not present */
+ public static String attribute(Element element, String attributeName) {
+ if (element.hasAttribute(attributeName)) {
+ return element.getAttribute(attributeName);
+ } else {
+ return null;
+ }
+ }
+
+ /** convenience method to combine extraction of a string attribute value.
+ *
+ * If the attribute exists, it is returned. If the attribute is not present, null
+ * is returned. The attribute is not present and it is required,
+ * a problem will be added to the parse. */
+ public static String attribute(Element element, String attributeName, boolean required, Parse parse) {
+ return attribute(element, attributeName, required, parse, null);
+ }
+
+ /** convenience method to combine extraction of a string attribute value.
+ *
+ * If the attribute exists, it is returned. If the attribute is not present, the
+ * defaultValue is returned. The attribute is not present and it is required,
+ * a problem will be added to the parse. */
+ public static String attribute(Element element, String attributeName, boolean required, Parse parse, String defaultValue) {
+ if (element.hasAttribute(attributeName)) {
+ String value = element.getAttribute(attributeName);
+ if (required && "".equals(value)) {
+ parse.addProblem("attribute <"+XmlUtil.getTagLocalName(element)+" "+attributeName+"=\"\" is empty", element);
+ }
+ return value;
+ }
+
+ if (required) {
+ parse.addProblem("attribute <"+XmlUtil.getTagLocalName(element)+" "+attributeName+"=\"...\" is required", element);
+ }
+
+ return defaultValue;
+ }
+
+
+ /** parse an attribute as an integer. */
+ public static Integer attributeInteger(Element element, String attributeName, boolean required, Parse parse) {
+ String valueText = attribute(element, attributeName, required, parse);
+
+ if (valueText!=null) {
+ try {
+ return Integer.parseInt(valueText);
+ } catch (NumberFormatException e) {
+ parse.addProblem(errorMessageAttribute(element, attributeName, valueText, "value not parsable as integer"), element);
+ }
+ }
+
+ return null;
+ }
+
+ /** parse an attribute as an boolean. */
+ public static Boolean attributeBoolean(Element element, String attributeName, boolean required, Parse parse) {
+ return attributeBoolean(element, attributeName, required, parse, null);
+ }
+
+ /** parse an attribute as an boolean. */
+ public static Boolean attributeBoolean(Element element, String attributeName, boolean required, Parse parse, Boolean defaultValue) {
+ String valueText = attribute(element, attributeName, required, parse);
+ if (valueText!=null) {
+ Boolean value = parseBooleanValue(valueText);
+ if (value==null) {
+ parse.addProblem(errorMessageAttribute(element, attributeName, valueText, "value not in {true, enabled, on, false, disabled, off}"), element);
+ }
+ return value;
+ }
+ return defaultValue;
+ }
+
+ public static Boolean parseBooleanValue(String valueText) {
+ if (valueText!=null) {
+ // if we have to check for value true
+ if ( ("true".equals(valueText))
+ || ("enabled".equals(valueText))
+ || ("on".equals(valueText))
+ ) {
+ return Boolean.TRUE;
+
+ } else if ( ("false".equals(valueText))
+ || ("disabled".equals(valueText))
+ || ("off".equals(valueText))
+ ) {
+ return Boolean.FALSE;
+ }
+ }
+
+ return null;
+ }
+
+ public static String errorMessageAttribute(Element element, String attributeName, String attributeValue, String message) {
+ return "attribute <"+XmlUtil.getTagLocalName(element)+" "+attributeName+"=\""+attributeValue+"\" "+message;
+ }
+
+ public static List<String> parseList(Element element, String singularTagName) {
+ // a null value for text represents a wildcard
+ String text = XmlUtil.attribute(element, singularTagName + "s");
+ // so next we'll convert a '*' into the text null value, which indicates a
+ // wildcard
+ if ("*".equals(text)) {
+ text = null;
+ }
+ if (element.hasAttribute(singularTagName)) {
+ String eventText = element.getAttribute(singularTagName);
+ text = (text == null ? eventText : text + "," + eventText);
+ }
+ List<String> eventNames = parseCommaSeparatedList(text);
+ return eventNames;
+ }
+
+ /**
+ * parses comma or space separated list. A null return value means a wildcard.
+ *
+ * @return List of tokens or null if the commaSeparatedListText is null, '*',
+ * or empty
+ */
+ public static List<String> parseCommaSeparatedList(String commaSeparatedListText) {
+ List<String> entries = null;
+ if (commaSeparatedListText != null) {
+ if (!"*".equals(commaSeparatedListText)) {
+ StringTokenizer tokenizer = new StringTokenizer(commaSeparatedListText, ", ");
+ while (tokenizer.hasMoreTokens()) {
+ if (entries == null) {
+ entries = new ArrayList<String>();
+ }
+ entries.add(tokenizer.nextToken());
+ }
+ }
+ }
+ return entries;
+ }
+
+ public static class NamespaceValue {
+
+ public String prefix;
+ public String localPart;
+
+ public NamespaceValue(String prefix, String localPart) {
+ this.prefix = prefix;
+ this.localPart = localPart;
+ }
+ }
+
+ public static NamespaceValue attributeNamespaceValue(Element element, String attributeName) {
+ NamespaceValue namespaceValue = null;
+ String text = attribute(element, attributeName);
+ if (text != null) {
+ int colonIndex = text.indexOf(':');
+ if (colonIndex == -1) {
+ namespaceValue = new NamespaceValue(null, text);
+ } else {
+ String prefix = text.substring(0, colonIndex);
+ String localPart = null;
+ if (text.length() > colonIndex + 1) {
+ localPart = text.substring(colonIndex + 1);
+ }
+ namespaceValue = new NamespaceValue(prefix, localPart);
+ }
+ }
+ return namespaceValue;
+ }
+
+ public static QName attributeQName(Element element, String attributeName) {
+ QName qname = null;
+
+ NamespaceValue namespaceValue = attributeNamespaceValue(element, attributeName);
+ String text = attribute(element, attributeName);
+ if (namespaceValue!=null) {
+ if (namespaceValue.prefix==null) {
+ qname = new QName(text);
+ } else {
+ String uri = element.lookupNamespaceURI(namespaceValue.prefix);
+ if (uri==null) {
+ throw new JbpmException("unknown prefix in qname "+text);
+ } else if (namespaceValue.localPart==null) {
+ throw new JbpmException("no local part in qname "+text);
+ } else {
+ qname = new QName(uri, namespaceValue.localPart, namespaceValue.prefix);
+ }
+ }
+ }
+ return qname;
+ }
+
+ public static QName getQNameFromString(Element element, String qnameAsString) {
+ if (qnameAsString == null || element == null) {
+ return null;
+ }
+ int colonIndex = qnameAsString.indexOf(":");
+ String prefix = qnameAsString.substring(0, colonIndex);
+ String localName = qnameAsString.substring(colonIndex + 1);
+ String ns = getNamespaceURI(element, prefix);
+ return new QName(ns, localName, prefix);
+ }
+
+ public static String getNamespaceURI(final org.w3c.dom.Node n, final String prefix) {
+ Node prefixDeclaration = n.getAttributes().getNamedItem("xmlns:" + prefix);
+ if (prefixDeclaration != null) {
+ // we have found the good NameSpace
+ return prefixDeclaration.getNodeValue();
+ }
+ // we have found the good NameSpace
+ // we look for the NameSpace in the parent Node
+ return getNamespaceURI(n.getParentNode(), prefix);
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/Descriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/Descriptor.java
new file mode 100644
index 0000000..5721c3c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/Descriptor.java
@@ -0,0 +1,101 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire;
+
+import java.io.Serializable;
+
+import org.jbpm.pvm.internal.util.Observable;
+
+/**
+ * knows how an object can be created.
+ *
+ * <p>A {@link WireDefinition} contains a map of {@link Descriptor}s.
+ * They are used by the {@link WireContext} that will build and cache the
+ * objects.
+ * </p>
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ *
+ */
+public interface Descriptor extends Observable, Serializable {
+
+ /**
+ * is fired when construction of a wired object starts. The provided event is a {@link WireObjectEventInfo}.
+ * @see WireContext
+ */
+ String EVENT_CONSTRUCTING = "constructing";
+ /**
+ * is fired when initialization of a wired object starts (after construction). The provided event is a {@link WireObjectEventInfo}.
+ * @see WireContext
+ */
+ String EVENT_INITIALIZING = "initializing";
+ /**
+ * is fired when object construction is completed. The provided event is a {@link WireObjectEventInfo}.
+ * @see WireContext
+ */
+ String EVENT_CONSTRUCTED = "constructed";
+ /**
+ * is fired when an object is being set into the cache of this wire context with {@link WireContext#set(String, Object)}. The provided event is a {@link WireObjectEventInfo}.
+ * @see WireContext
+ */
+ String EVENT_SET = "set";
+ /**
+ * is fired when an object is being removed from the cache of the wire context with {@link WireContext#remove(String)}. The provided event is a {@link WireObjectEventInfo}.
+ * @see WireContext
+ */
+ String EVENT_REMOVE = "remove";
+
+ /** the name of this descriptor */
+ String getName();
+
+ /** the type of the produced object or null if that is not available */
+ Class<?> getType(WireDefinition wireDefinition);
+
+ /**
+ * if eager initialization is set, it means that an object must be created
+ * immediately during construction of the {@link WireContext}.
+ */
+ boolean isEagerInit();
+
+ /**
+ * constructs the object.
+ * @param wireContext {@link WireContext} in which the object is created. This is also the {@link WireContext}
+ * where the object will search for other object that may be needed during the initialization phase.
+ * @return the constructed object.
+ */
+ Object construct(WireContext wireContext);
+
+ /**
+ * Checks if the initialization should be done during the construction phase or if it can be done later.
+ * @return <code>false</code> if the initialization should be done during the creation phase, <code>true</code> if it can be done later.
+ */
+ boolean isDelayable();
+
+ /**
+ * called by the WireContext to initialize the specified object.
+ * For more information about initialization, see {@link WireContext} section lifecycle.
+ * @param object object to initialize.
+ * @param wireContext the context in which the object will be initialized.
+ */
+ void initialize(Object object, WireContext wireContext);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/JbpmClassNotFoundException.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/JbpmClassNotFoundException.java
new file mode 100644
index 0000000..60261b9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/JbpmClassNotFoundException.java
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire;
+
+import org.jbpm.api.JbpmException;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class JbpmClassNotFoundException extends JbpmException {
+
+ private static final long serialVersionUID = 1L;
+
+ public JbpmClassNotFoundException(String msg, Throwable cause) {
+ super(msg, cause);
+ }
+ public JbpmClassNotFoundException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/WireContext.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/WireContext.java
new file mode 100644
index 0000000..c290897
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/WireContext.java
@@ -0,0 +1,720 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.jbpm.api.activity.ActivityBehaviour;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.Context;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.model.ProcessElementImpl;
+import org.jbpm.pvm.internal.processengine.ProcessEngineImpl;
+import org.jbpm.pvm.internal.util.Closable;
+import org.jbpm.pvm.internal.util.DefaultObservable;
+import org.jbpm.pvm.internal.util.Observable;
+import org.jbpm.pvm.internal.wire.descriptor.AbstractDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.operation.FieldOperation;
+import org.jbpm.pvm.internal.wire.operation.InvokeOperation;
+import org.jbpm.pvm.internal.wire.operation.Operation;
+import org.jbpm.pvm.internal.wire.operation.PropertyOperation;
+import org.jbpm.pvm.internal.wire.operation.SubscribeOperation;
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+
+/**
+ * object factory that creates, initializes, wires and caches objects
+ * based on {@link Descriptor descriptors} (aka IoC container).
+ *
+ * <h3>General principle</h3>
+ *
+ * <p>As input, a WireContext takes a {@link WireDefinition}. The WireDefinition contains
+ * named {@link Descriptor}s that know how to create objects and wire them together.
+ * Each object has a name. The WireContext will maintain a cache (map) of the created
+ * objects. So that upon subsequent requests, the same object can be given from the cache.
+ * </p>
+ *
+ * <center><img src="wirescope.gif"/></center>
+ *
+ * <h3>Purpose</h3>
+ *
+ * <p>A WireContext is used often in combination with {@link EnvironmentImpl} to
+ * decouple the processDefinition virtual machine from its environment. In the
+ * {@link ProcessEngineImpl}, both the process-engine context and
+ * the environment contexts are WireContexts. The PVM will use the persistence service,
+ * asynchronous message service, timer service and other services through specified
+ * abstractions in the environment.
+ * </p>
+ *
+ * <p>Another usage of the WireContext is construction and configuration of user
+ * code objects in a persistable way. {@link ActivityBehaviour}s and {@link org.jbpm.api.activity.ExternalActivityBehaviour}
+ * and other user code can be instantiated with a WireContext. That way, they can
+ * be persisted in a fixed schema.
+ * </p>
+ *
+ * <p>Each {@link ProcessElementImpl} has configuration properties.
+ * Consider this extra metadata that can be associated to elements in a processDefinition definition.
+ * In that respect, it's somewhat similar to what annotations are in Java. Because of the wire
+ * persistence, all these configuration properties fit into the same process model and in its
+ * database schema.
+ * </p>
+ *
+ * <h3>Xml</h3>
+ * <p>Mostly often, {@link Descriptor}s and WireContext's are not used
+ * directly. Instead, the wire XML is used in a configuration file.
+ * The {@link WireParser wire XML parser} contains the documentation on
+ * the XML grammer. The {@link WireParser} will produce a {@link WireDefinition}
+ * with a bunch of {@link Descriptor}s in it.
+ *
+ * <h3 id="lifecycle">Object lifecycle</h3>
+ *
+ * <p>Objects are build in 2 phases: construction and initialization.
+ * The motivation for splitting these phases is to resolve many of the
+ * circular dependencies. Imagine 2 objects that have a bidirectional
+ * reference. By splitting the construction from the initialization
+ * phase, the objects can both be constructed first, and then during
+ * initialization, they will be injected into each other.
+ * </p>
+ *
+ * <h3>Construction</h3>
+ * <p>Construction of the object is all that needs to be done until a
+ * reference to the object is available.
+ * </p>
+ *
+ * <p>In the case of dynamically created
+ * objects ({@link ObjectDescriptor}), the simplest case this is
+ * accomplished with a constructor. But also static or non-static factory
+ * methods can be used to obtain a reference to an object.
+ * </p>
+ *
+ * <p>In case of immutable objects, the descriptor can just provide a reference
+ * to a singleton object.
+ * </p>
+ *
+ * <h3>Initialization</h3>
+ * <p>Initialization is optional and it is comprised of everything that needs
+ * to be done with an object after a reference to the object is available.
+ * {@link AbstractDescriptor} contains an empty default initialization method.
+ * </p>
+ *
+ * <p>For objects {@link ObjectDescriptor}s, this means that a a
+ * sequence of {@link Operation}s can be applied to the object. Following
+ * operations implementations are already available and can be applied to
+ * an object during initialization:
+ * </p>
+ *
+ * <ul>
+ * <li><b>{@link FieldOperation}</b>: injects another object into a field</li>
+ * <li><b>{@link PropertyOperation}</b>: injects another object with a setter method.</li>
+ * <li><b>{@link InvokeOperation}</b>: invokes a method.</li>
+ * <li><b>{@link SubscribeOperation}</b>: subscribes to an {@link Observable observable}.</li>
+ * </ul>
+ *
+ * <h3>EnvironmentImpl</h3>
+ *
+ * <p>When an environment is injected into a WireContext, lookup of all
+ * referenced object names will be done first in this WireContext, but
+ * if the object name is not defined there, the environment will be
+ * searched in the environment's default search order.
+ * </p>
+ *
+ * <h3>Events</h3>
+ * <p>Several objects will fire events to which can be subscribed:
+ * </p>
+ *
+ * <p>The WireContext itself fires the {@link #EVENT_OPEN} and {@link #EVENT_OPEN}
+ * events.
+ * </p>
+ *
+ * <p>The {@link Descriptor}s will fire the events {@link Descriptor#EVENT_CONSTRUCTING},
+ * {@link Descriptor#EVENT_INITIALIZING}, {@link Descriptor#EVENT_CONSTRUCTED},
+ * {@link Descriptor#EVENT_SET} and {@link Descriptor#EVENT_REMOVE}.
+ * </p>
+ *
+ * <p>And last but not least, the objects created by the WireContext can be
+ * {@link Observable} themselves.
+ * </p>
+ *
+ * <h3>Eager initialization</h3>
+ *
+ * <p>By default, all objects in a WireContext are lazily constructued and initialized.
+ * Eager initialization is specified on a named object and it means that the
+ * object is constructed and initialized during construction of the WireContext.
+ * You an only specify eager initialization when the object has a name.
+ * </p>
+ *
+ * <h3>Specifying how an object should be initialized.</h3>
+ *
+ * <p>The initialization can be specified with the {@link AbstractDescriptor#setInit(char)} method.</p>
+ * The possible value for <code>init</code> parameter is one of :
+ * <ul>
+ * <li>{@link AbstractDescriptor#INIT_LAZY}: for lazy creation and delayed initialization</li>
+ * <li>{@link AbstractDescriptor#INIT_REQUIRED}: for lazy creation and immediate initialization</li>
+ * <li>{@link AbstractDescriptor#INIT_EAGER}: for eager creation and delayed initialization</li>
+ * <li>{@link AbstractDescriptor#INIT_IMMEDIATE}: for eager creation and immediate initialization</li>
+ * </ul>
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class WireContext extends DefaultObservable implements Context, Closable, Serializable {
+
+ private static final long serialVersionUID = 1L;
+ private static Log log = Log.getLog(WireContext.class.getName());
+
+ // events ///////////////////////////////////////////////////////////////////
+
+ /**
+ * is fired when a new wiring environment is being opened. No event info provided.
+ */
+ public static final String EVENT_OPEN = "open";
+ /**
+ * is fired when the wiring environment is being closed. No event info provided.
+ */
+ public static final String EVENT_CLOSE = "close";
+
+ // member fields ////////////////////////////////////////////////////////////
+
+ protected String name = "wire-context";
+ protected WireDefinition wireDefinition;
+
+ /** objects that are being instantiated or constructed */
+ Set<String> underConstruction = null;
+
+ /** objects that are constructed, but waiting for the initialization operations (like e.g. injections) to be performed */
+ Map<String, PendingInitialization> pendingInitializations = null;
+
+ /** objects on which the initialization operations (like e.g. injections) are being performed */
+ Map<String, Object> underInitialization = null;
+
+ /** fully created and initialized objects */
+ Map<String, Object> cache = null;
+
+ /** exceptions throw by descriptor invocations */
+ Map<String, Exception> exceptions = null;
+
+
+ public WireContext() {
+ }
+
+ public WireContext(WireDefinition wireDefinition) {
+ this(wireDefinition, null, false);
+ }
+
+ /** when this {@link Context} is used in an {@link EnvironmentImpl}, it
+ * needs a name. */
+ public WireContext(WireDefinition wireDefinition, String name) {
+ this.wireDefinition = wireDefinition;
+ this.name = name;
+ create();
+ }
+
+ /**
+ * allows for postponing the creation of this wire context.
+ * @param delayCreate specifies if creation should be postponed till {@link #createTime()} is called explicitly.
+ * If delayCreate is set to false, creation is done as part of the constructor. If delayCreate is
+ * set to true, the {@link #createTime()} method needs to be called explicitly by the client after
+ * construction is complete. The use case is creation of environment where the transactionName needs to be
+ * set and the scope needs to be added to the environment before the creation of this wire scope is done.
+ * @see ProcessEngineImpl#openEnvironment()
+ */
+ public WireContext(WireDefinition wireDefinition, String name, boolean delayCreate) {
+ this.wireDefinition = wireDefinition;
+ this.name = name;
+
+ if (! delayCreate) {
+ create();
+ }
+ }
+
+ /** convenience method that wires the object for a given descriptor. */
+ public static Object create(Descriptor descriptor) {
+ WireContext wireContext = new WireContext();
+ return wireContext.create(descriptor, false);
+ }
+
+ /**
+ * initializes the eager objects and then fires the create event. This method
+ * only needs to be called explicitly in case <code>delayCreate</code> is true
+ * in {@link #WireContext(WireDefinition, String, EnvironmentImpl, boolean)}.
+ */
+ public void create() {
+ log.trace("creating "+name);
+ initializeEagerObjects();
+ fire(EVENT_OPEN, null);
+ }
+
+ /**
+ * Initializes all the eager objects defined in the {@link #wireDefinition}.
+ */
+ void initializeEagerObjects() {
+ if(wireDefinition != null) {
+ List<String> eagerInitObjectNames = wireDefinition.getEagerInitNames();
+ if (eagerInitObjectNames!=null) {
+ for (String eagerInitObjectName: eagerInitObjectNames) {
+ Descriptor descriptor = wireDefinition.getDescriptor(eagerInitObjectName);
+ if (descriptor.isEagerInit()) {
+ log.debug("eagerly initializing "+eagerInitObjectName);
+ get(eagerInitObjectName, descriptor.isDelayable());
+ }
+ }
+ while ( (! hasObjectUnderConstruction())
+ && (! hasObjectUnderInitialization())
+ && (hasPendingInitializations())
+ ) {
+ processPendingInitializations();
+ }
+ }
+ }
+ }
+
+ public String toString() {
+ return (name!=null ? name : super.toString());
+ }
+
+
+ // environment methods //////////////////////////////////////////////////////////
+
+ /** the list of object names defined in this context. This means the union of the
+ * object names that are defined in the {@link #wireDefinition} and the objects that
+ * are just {@link #set(String, Object)}. If there are no keys, an empty set will
+ * be returned. */
+ public Set<String> keys() {
+ Set<String> keys = new HashSet<String>();
+ if (cache!=null) keys.addAll(cache.keySet());
+ if (wireDefinition!=null) {
+ Map<String, Descriptor> descriptors = wireDefinition.getDescriptors();
+ if (descriptors!=null) {
+ keys.addAll(descriptors.keySet());
+ }
+ }
+ return keys;
+ }
+
+ /** checks if the given objectName is defined, either by means of a descriptor or by an explicit {@link #set(String, Object)}. */
+ public boolean has(String objectName) {
+ return (hasCached(objectName) || (wireDefinition != null ? wireDefinition.hasDescriptor(objectName) : false));
+ }
+
+ /** retrieves the object for the given objectName, ensuring it is constructed and initialized.
+ * @return the object found, or null if the object was not found. */
+ public Object get(String objectName) {
+ return get(objectName, false);
+ }
+
+ /** adds an object to this context, which means storing it in the cache. This doesn't have to be an object that is
+ * defined by the {@link WireDefinition}. If an object is set under a certain objectName that also is associated with
+ * a descriptor, the object provided in this set invocation will be delivered upon subsequent {@link #get(String)}
+ * requests.
+ * @return previous value of the object with the name objectName in the {@link #cache}
+ * @throws WireException when the objectName is null
+ */
+ public synchronized Object set(String objectName, Object object) {
+ if (objectName==null) throw new WireException("objectName is null");
+ if (cache==null) {
+ cache = new HashMap<String, Object>();
+ }
+ fireObjectEvent(Descriptor.EVENT_SET, objectName, object);
+ return cache.put(objectName, object);
+ }
+
+ /** removes an object from the context and fires the remove event.
+ * @return previous object associated with the given name, or null if there was no mapping for this name. */
+ public Object remove(String objectName) {
+ Object removed = null;
+ if (cache!=null) {
+ removed = cache.remove(objectName);
+ fireObjectEvent(Descriptor.EVENT_REMOVE, objectName, removed);
+ }
+ return removed;
+ }
+
+ /** clears the {@link #cache}. */
+ public synchronized void clear() {
+ if (cache!=null) {
+ Set<String> objectsInCache = new HashSet<String>(cache.keySet());
+ for (String object: objectsInCache) {
+ remove(object);
+ }
+ }
+ }
+
+ /** fires the close event then removes the listeners, and cleans up the constructed objects
+ * of the context (cleans up the object in the cache and the object in construction).
+ * @see #EVENT_CLOSE
+ */
+ public synchronized void close() {
+ log.trace("closing "+name+"...");
+
+ // fire the close event
+ fire(EVENT_CLOSE, null);
+ }
+
+ // object access helper methods /////////////////////////////////////////////
+
+ /** gets the object having the name <code>objectName</code> in this context.
+ * @param isDelayable indicates wether initialization is delayable. When isDelayable is set to false
+ * the returned object will be constructed and initialized. When isDelayable is set to true, the returned
+ * object will be constructed, but not necessarily initialized.
+ * @return the object found or created, or null if the object was not found and cannot be created.
+ * @throws WireException if a circular dependency was found during the object creation.
+ */
+ public synchronized Object get(String objectName, boolean isDelayable) {
+ if (hasException(objectName)) {
+ throw new WireException("getting "+objectName+" previously resulted in an exception", exceptions.get(objectName));
+ }
+
+ // first check if the object is in the cache
+ if (hasCached(objectName)) {
+ Object object = cache.get(objectName);
+ log.trace("delivering "+objectName);
+ return object;
+ }
+
+ // then check if it is constructed, but not yet in the cache (pending or under initialization)
+ Object constructed = getConstructed(objectName);
+ if ( isDelayable
+ && (null != constructed)
+ ) {
+ Object object = constructed;
+ log.trace("providing already constructed "+objectName);
+ return object;
+ }
+
+ // then check if we can create the object from a descriptor
+ boolean hasDescriptor = (wireDefinition!=null ? wireDefinition.hasDescriptor(objectName) : false);
+ if (hasDescriptor) {
+
+ if (isUnderConstruction(objectName) || isUnderInitialization(objectName)) {
+ throw new WireException("circular dependency for "+objectName);
+ }
+
+ return create(objectName, isDelayable);
+ }
+
+ // then check if we can find it in the environment (if one is available)
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ if (environment!=null) {
+ log.trace("delivering "+objectName+" from environment");
+ return environment.get(objectName);
+ }
+
+ log.trace("delivering null for undefined object "+objectName);
+ return null;
+ }
+
+ /** creates a new object for the given objectName as defined in the {@link #wireDefinition}.
+ * @param isDelayable indicates wether initialization is delayable. When isDelayable is set to false
+ * the returned object will be constructed and initialized. When isDelayable is set to true, the returned
+ * object will be constructed, but not necessarily initialized. */
+ protected Object create(String objectName, boolean isDelayable) {
+ Descriptor descriptor = wireDefinition.getDescriptor(objectName);
+ return create(descriptor, isDelayable);
+ }
+
+
+ /** creates a new object for the given descriptor.
+ * @param isDelayable indicates wether initialization is delayable. When isDelayable is set to false
+ * the returned object will be constructed and initialized. When isDelayable is set to true, the returned
+ * object will be constructed, but not necessarily initialized. */
+ public Object create(Descriptor descriptor, boolean isDelayable) {
+ Object object = null;
+
+ object = construct(descriptor);
+ initialize(object, descriptor, isDelayable);
+ processPendingInitializations();
+
+ return object;
+ }
+
+ Object construct(Descriptor descriptor) {
+ Object object;
+
+ String objectName = descriptor.getName();
+ if (objectName!=null) {
+ fireObjectEvent(Descriptor.EVENT_CONSTRUCTING, objectName, null);
+ if (underConstruction==null) {
+ underConstruction = new HashSet<String>();
+ }
+ underConstruction.add(objectName);
+ log.trace("constructing "+objectName);
+ }
+
+ try {
+ object = descriptor.construct(this);
+ } catch (RuntimeException e) {
+ addException(descriptor, e);
+ throw e;
+ }
+
+ if (objectName!=null) {
+ underConstruction.remove(objectName);
+ }
+
+ return object;
+ }
+
+ // initialization ///////////////////////////////////////////////////////////
+
+ private enum InitializationType {
+ NONE,
+ IMMEDIATE,
+ DELAYEBLE
+ }
+
+ void initialize(Object object, Descriptor descriptor, boolean isDelayable) {
+
+ InitializationType initializationType = getInitializationType(object, descriptor, isDelayable);
+
+ if (initializationType==InitializationType.IMMEDIATE) {
+ performInitialization(object, descriptor);
+
+ } else if (initializationType==InitializationType.DELAYEBLE) {
+ addPendingInitialization(object, descriptor);
+
+ } else {
+ String objectName = descriptor.getName();
+ if (objectName!=null) {
+ set(objectName, object);
+ }
+ }
+ }
+
+ InitializationType getInitializationType(Object object, Descriptor descriptor, boolean isDelayable) {
+ if (object==null) {
+ return InitializationType.NONE;
+ }
+
+ if (isDelayable && descriptor.isDelayable()) {
+ return InitializationType.DELAYEBLE;
+ }
+
+ return InitializationType.IMMEDIATE;
+ }
+
+ void performInitialization(Object object, Descriptor descriptor) {
+ String objectName = descriptor.getName();
+
+ if (objectName!=null) {
+ fireObjectEvent(Descriptor.EVENT_INITIALIZING, objectName, object);
+ if (underInitialization==null) {
+ underInitialization = new HashMap<String, Object>();
+ }
+ underInitialization.put(objectName, object);
+ log.trace("initializing "+objectName );
+ }
+
+ try {
+ descriptor.initialize(object, this);
+ } catch (RuntimeException e) {
+ addException(descriptor, e);
+ throw e;
+ }
+
+ if (objectName!=null) {
+ underInitialization.remove(objectName);
+ // event constructed is fired before the object is put in the cache
+ // because that generates a set event
+ fireObjectEvent(Descriptor.EVENT_CONSTRUCTED, objectName, object);
+ set(objectName, object);
+ }
+ }
+
+ void addPendingInitialization(Object object, Descriptor descriptor) {
+ if (pendingInitializations==null) {
+ pendingInitializations = new HashMap<String, PendingInitialization>();
+ }
+ pendingInitializations.put(descriptor.getName(), new PendingInitialization(object, descriptor));
+ }
+
+ void processPendingInitializations() {
+ if (pendingInitializations!=null) {
+ Collection<PendingInitialization> pendingInitializationValues = new HashSet<PendingInitialization>(pendingInitializations.values());
+ for (PendingInitialization pi: pendingInitializationValues) {
+ // move pi from pending initializations to under initialization
+ String objectName = pi.initializable.getName();
+ pi = pendingInitializations.remove(objectName);
+ if(pi != null) {
+ // initialize
+ performInitialization(pi.object, pi.initializable);
+ }
+ }
+ }
+ }
+
+ boolean hasPendingInitializations() {
+ return ( (pendingInitializations!=null)
+ && (!pendingInitializations.isEmpty())
+ );
+ }
+
+ /** container for an storing waiting objects and their initializable in the list
+ * {@link #pendingInitializations}, while waiting for initialization. */
+ class PendingInitialization implements Serializable {
+ private static final long serialVersionUID = 1L;
+ Object object;
+ Descriptor initializable;
+ public PendingInitialization(Object object, Descriptor descriptor) {
+ this.object = object;
+ this.initializable = descriptor;
+ }
+ public String toString() {
+ String objectName = initializable.getName();
+ return "PendingInitialization["+(objectName!=null ? objectName+"|" : "")+object+"]";
+ }
+ }
+
+ /** checks if the given objectName is available in the cache, which means it already has
+ * been constructed from a wire definition or it has been {@link #set(String, Object)}
+ * explicitely. */
+ public boolean hasCached(String objectName) {
+ return (cache!=null)
+ && (cache.containsKey(objectName));
+ }
+
+ /** finds the object in all stages after construction. */
+ Object getConstructed(String objectName) {
+ Object constructed = null;
+ if ( (pendingInitializations!=null)
+ && (pendingInitializations.containsKey(objectName))
+ ) {
+ constructed = pendingInitializations.get(objectName).object;
+ } else if ( (underInitialization!=null)
+ && (underInitialization.containsKey(objectName))
+ ) {
+ constructed = underInitialization.get(objectName);
+ }
+ return constructed;
+ }
+
+ /** fires a {@link WireObjectEventInfo}. */
+ protected void fireObjectEvent(String eventName, String objectName, Object object) {
+ WireObjectEventInfo wireEvent = null;
+
+ // first fire the event on the descriptor for object specific listeners
+ if (wireDefinition!=null) {
+ Map<String, Descriptor> descriptors = wireDefinition.getDescriptors();
+ if (descriptors!=null) {
+ Descriptor descriptor = descriptors.get(objectName);
+ if (descriptor!=null) {
+ if (wireEvent==null) {
+ wireEvent = new WireObjectEventInfo(eventName, objectName, object);
+ }
+ descriptor.fire(eventName, wireEvent);
+ }
+ }
+ }
+
+ // then fire the event on this wiring environment for global listeners
+ if ( (listeners!=null)
+ && (wireEvent==null)
+ ) {
+ wireEvent = new WireObjectEventInfo(eventName, objectName, object);
+ }
+
+ fire(eventName, wireEvent);
+ }
+
+
+ boolean hasObjectUnderConstruction() {
+ return ( (underConstruction!=null)
+ && (! underConstruction.isEmpty())
+ );
+ }
+
+ boolean hasObjectUnderInitialization() {
+ return ( (underInitialization!=null)
+ && (! underInitialization.isEmpty())
+ );
+ }
+
+ boolean isUnderConstruction(String objectName) {
+ return ( (underConstruction!=null)
+ && (underConstruction.contains(objectName))
+ ) ;
+ }
+
+ boolean isUnderInitialization(String objectName) {
+ return ( (underInitialization!=null)
+ && (underInitialization.containsKey(objectName))
+ ) ;
+ }
+
+ // search by class //////////////////////////////////////////////////////////
+
+ /** searches for the first descriptor that defines an object of the given type.
+ * In case of multiple objects of the same type, the first object that
+ * is declared of the given type will be found. Also super classes and interfaces
+ * are taken into account. Not all descriptor types will be type sensitive, only:
+ * <pre>
+ * | ObjectDescriptor | object |
+ * | HibernatePersistenceServiceDescriptor | business-calendar |
+ * | TransactionDescriptor | transaction |
+ * | PropertiesDescriptor | properties |
+ * | BusinessCalendarDescriptor | business-calendar |
+ * </ul>
+ * </pre>
+ */
+ public <T> T get(Class<T> type) {
+ if (wireDefinition!=null) {
+ String name = wireDefinition.getDescriptorName(type);
+ if (name!=null) {
+ log.trace("found "+type.getName()+" in "+this);
+ return type.cast(get(name));
+ } else {
+ log.trace(type.getName()+" not found in "+this+" "+System.identityHashCode(this));
+ }
+ }
+ return null;
+ }
+
+ protected boolean hasException(String objectName) {
+ return ( (exceptions!=null)
+ && (exceptions.containsKey(objectName))
+ );
+ }
+
+ protected void addException(Descriptor descriptor, Exception exception) {
+ if (exceptions==null) {
+ exceptions = new HashMap<String, Exception>();
+ }
+ exceptions.put(descriptor.getName(), exception);
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public String getName() {
+ return name;
+ }
+ public WireDefinition getWireDefinition() {
+ return wireDefinition;
+ }
+ public void setWireDefinition(WireDefinition wireDefinition) {
+ this.wireDefinition = wireDefinition;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/WireDefinition.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/WireDefinition.java
new file mode 100644
index 0000000..005307d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/WireDefinition.java
@@ -0,0 +1,216 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.jbpm.pvm.internal.env.UserProvidedEnvironmentObject;
+import org.jbpm.pvm.internal.wire.descriptor.AbstractDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ProvidedObjectDescriptor;
+
+
+/**
+ * map of {@link Descriptor}s that serve as input for a {@link WireContext}.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class WireDefinition implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ // static Log log = Log.getLog(WireDefinition.class.getName());
+
+ /** maps object names to {@link Descriptor}s */
+ Map<String, Descriptor> descriptors;
+ Map<Class<?>, String> descriptorNames;
+ boolean useTypes = true;
+
+ /** references all objects that must eagerly initialized.
+ * @see WireContext */
+ List<String> eagerInitNames;
+
+
+ public WireDefinition() {
+ }
+
+ public WireDefinition(WireDefinition other, List<UserProvidedEnvironmentObject> txWireObjects) {
+ if (other.descriptors!=null) {
+ this.descriptors = new HashMap<String, Descriptor>(other.descriptors);
+ }
+ if (other.descriptorNames!=null) {
+ this.descriptorNames = new HashMap<Class<?>, String>(other.descriptorNames);
+ }
+ if (other.eagerInitNames!=null) {
+ this.eagerInitNames = new ArrayList<String>(other.eagerInitNames);
+ }
+ this.useTypes = other.useTypes;
+
+ for (UserProvidedEnvironmentObject userProvidedEnvironmentObject: txWireObjects) {
+ ProvidedObjectDescriptor descriptor = new ProvidedObjectDescriptor(
+ userProvidedEnvironmentObject.getObject(),
+ userProvidedEnvironmentObject.isTypeExposed(),
+ userProvidedEnvironmentObject.getName()
+ );
+ addDescriptor(descriptor);
+ }
+ }
+
+ public void addDescriptor(Descriptor descriptor) {
+ if (descriptor!=null) {
+
+ String name = descriptor.getName();
+
+ if (useTypes) {
+ Class<?> type = descriptor.getType(this);
+
+ if (type!=null) {
+ if ( (name==null)
+ && (descriptor instanceof AbstractDescriptor)
+ ) {
+ name = type.getName();
+ ((AbstractDescriptor)descriptor).setName(type.getName());
+ }
+
+ if ( (name!=null)
+ && ( (descriptors==null)
+ || (!descriptors.containsKey(name))
+ )
+ ) {
+ // add all superclasses and interfaces to map to this descriptor
+ addDescriptorType(type, descriptor, name);
+ }
+ }
+ }
+
+ if ( (name!=null)
+ && (! hasDescriptor(name))
+ ) {
+ putDescriptor(name, descriptor);
+
+ if (descriptor.isEagerInit()) {
+ addEagerInitObjectName(name);
+ }
+ }
+
+ }
+ }
+
+ void putDescriptor(String name, Descriptor descriptor) {
+ if (descriptors==null) {
+ descriptors = new HashMap<String, Descriptor>();
+ }
+ descriptors.put(name, descriptor);
+ }
+
+ void addDescriptorType(Class<?> type, Descriptor descriptor, String descriptorName) {
+ if (type!=null) {
+ if (descriptorNames==null) {
+ descriptorNames = new HashMap<Class<?>, String>();
+ }
+ if (!descriptorNames.containsKey(type)) {
+ descriptorNames.put(type, descriptorName);
+ }
+ addDescriptorType(type.getSuperclass(), descriptor, descriptorName);
+ Class<?>[] interfaceTypes = type.getInterfaces();
+ if (interfaceTypes!=null) {
+ for (Class<?> interfaceType: interfaceTypes) {
+ addDescriptorType(interfaceType, descriptor, descriptorName);
+ }
+ }
+ }
+ }
+
+ public String getDescriptorName(Class<?> type) {
+ return (descriptorNames!=null ? descriptorNames.get(type) : null );
+ }
+
+ /** the descriptor with the given name from the WireDefinition or <code>null</code>
+ * if the object doesn't have a descriptor.
+ */
+ public Descriptor getDescriptor(String objectName) {
+ if (descriptors==null) {
+ return null;
+ }
+ return descriptors.get(objectName);
+ }
+
+ /** @return previous Descriptor associated with the given name, or null if there was no Descriptor for this name. */
+ public synchronized Descriptor addDescriptor(String objectName, Descriptor descriptor) {
+ if (descriptors==null) {
+ descriptors = new HashMap<String, Descriptor>();
+ }
+ return descriptors.put(objectName, descriptor);
+ }
+
+ /** @return previous Descriptor associated with the given name, or null if there was no Descriptor for this name. */
+ public synchronized Descriptor removeDescriptor(String objectName) {
+ if (descriptors!=null) {
+ return descriptors.remove(objectName);
+ }
+ return null;
+ }
+
+ public boolean hasDescriptor(String objectName) {
+ return (descriptors!=null)
+ && (descriptors.containsKey(objectName));
+ }
+
+ public void addEagerInitObjectName(String eagerInitObjectName) {
+ if (eagerInitObjectName!=null) {
+ if (eagerInitNames==null) {
+ eagerInitNames = new ArrayList<String>();
+ }
+ eagerInitNames.add(eagerInitObjectName);
+ }
+ }
+
+ public void addWireDefinition(WireDefinition wireDefinition) {
+ if ( (wireDefinition!=null)
+ && (wireDefinition.getDescriptors()!=null)
+ ) {
+ for (Descriptor descriptor: wireDefinition.getDescriptors().values()) {
+ addDescriptor(descriptor);
+ }
+ }
+ }
+
+ public Set<Class<?>> getDescriptorTypes() {
+ return (descriptorNames!=null ? descriptorNames.keySet() : null);
+ }
+ public Map<String, Descriptor> getDescriptors() {
+ return descriptors;
+ }
+ public List<String> getEagerInitNames() {
+ return eagerInitNames;
+ }
+ public void setEagerInitNames(List<String> eagerInitNames) {
+ this.eagerInitNames = eagerInitNames;
+ }
+ public void setDescriptors(Map<String, Descriptor> descriptors) {
+ this.descriptors = descriptors;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/WireException.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/WireException.java
new file mode 100644
index 0000000..34a220d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/WireException.java
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire;
+
+
+/**
+ * thrown during the creation or initialization of objects from the Wiring Context.
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class WireException extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+ public WireException() {
+ super();
+ }
+
+ public WireException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public WireException(String message) {
+ super(message);
+ }
+
+ public WireException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/WireObjectEventInfo.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/WireObjectEventInfo.java
new file mode 100644
index 0000000..3a39265
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/WireObjectEventInfo.java
@@ -0,0 +1,27 @@
+package org.jbpm.pvm.internal.wire;
+
+public class WireObjectEventInfo {
+
+ String eventName;
+ String objectName;
+ Object object;
+
+ public WireObjectEventInfo(String eventName, String objectName, Object object) {
+ this.eventName = eventName;
+ this.objectName = objectName;
+ this.object = object;
+ }
+
+ public String getEventName() {
+ return eventName;
+ }
+ public Object getObject() {
+ return object;
+ }
+ public String getObjectName() {
+ return objectName;
+ }
+ public String toString() {
+ return eventName+"("+objectName+")";
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/AbstractCollectionBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/AbstractCollectionBinding.java
new file mode 100644
index 0000000..f8247ad
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/AbstractCollectionBinding.java
@@ -0,0 +1,72 @@
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.descriptor.CollectionDescriptor;
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+public abstract class AbstractCollectionBinding extends WireDescriptorBinding {
+
+ public AbstractCollectionBinding(String tagName) {
+ super(tagName);
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ CollectionDescriptor descriptor = createDescriptor();
+
+ String className = XmlUtil.attribute(element,"class");
+
+ // verify if the given classname is specified and implements the collection interface
+ if (verify(className, getCollectionInterface(), parse, parser)) {
+ descriptor.setClassName(className);
+ }
+
+ Boolean isSynchronized = XmlUtil.attributeBoolean(element, "synchronized", false, parse);
+ if (isSynchronized!=null) {
+ descriptor.setSynchronized(isSynchronized.booleanValue());
+ }
+
+ List<Descriptor> valueDescriptors = new ArrayList<Descriptor>();
+ List<Element> elements = XmlUtil.elements(element);
+ for (Element valueElement: elements) {
+ Descriptor valueDescriptor = (Descriptor) parser.parseElement(valueElement, parse, WireParser.CATEGORY_DESCRIPTOR);
+ if (valueDescriptor!=null) {
+ valueDescriptors.add(valueDescriptor);
+ } else {
+ parse.addProblem("unrecognized element: "+XmlUtil.toString(valueElement));
+ }
+ }
+ descriptor.setValueDescriptors(valueDescriptors);
+ return descriptor;
+ }
+
+ /** verifies if the given classname is specified and implements the collection interface */
+ public static boolean verify(String className, Class< ? > collectionInterface, Parse parse, Parser parser) {
+ if (className==null) {
+ return false;
+ }
+
+ try {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ Class<?> collectionClass = Class.forName(className, true, classLoader);
+
+ if (collectionInterface.isAssignableFrom(collectionClass)) {
+ return true;
+ } else {
+ parse.addProblem("class "+ className+" is not a "+collectionInterface.getName());
+ }
+ } catch (Exception e) {
+ parse.addProblem("class "+className+" could not be found");
+ }
+ return false;
+ }
+
+ protected abstract Class<?> getCollectionInterface();
+ protected abstract CollectionDescriptor createDescriptor();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/AddressResolverBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/AddressResolverBinding.java
new file mode 100644
index 0000000..f9ae573
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/AddressResolverBinding.java
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.email.impl.DefaultAddressResolver;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/**
+ * @author Alejandro Guizar
+ */
+public class AddressResolverBinding extends WireDescriptorBinding {
+
+ public AddressResolverBinding() {
+ super("address-resolver");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ return new ObjectDescriptor(DefaultAddressResolver.class);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/AuthorizationInterceptorBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/AuthorizationInterceptorBinding.java
new file mode 100644
index 0000000..8b1064a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/AuthorizationInterceptorBinding.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.svc.AuthorizationInterceptor;
+import org.jbpm.pvm.internal.wire.descriptor.ProvidedObjectDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/**
+ * @author Tom Baeyens
+ */
+public class AuthorizationInterceptorBinding extends WireDescriptorBinding {
+
+ public AuthorizationInterceptorBinding() {
+ super("authorization-interceptor");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ AuthorizationInterceptor authorizationInterceptor = new AuthorizationInterceptor();
+ return new ProvidedObjectDescriptor(authorizationInterceptor);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/BasicTypeBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/BasicTypeBinding.java
new file mode 100644
index 0000000..51fd4f1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/BasicTypeBinding.java
@@ -0,0 +1,37 @@
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.descriptor.AbstractDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+public abstract class BasicTypeBinding extends WireDescriptorBinding {
+
+ public BasicTypeBinding(String tagName) {
+ super(tagName);
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ AbstractDescriptor descriptor = null;
+
+
+ if (element.hasAttribute("value")) {
+ String value = element.getAttribute("value");
+ descriptor = createDescriptor(value, element, parse);
+ } else {
+ parse.addProblem("attribute 'value' is required in element '"+XmlUtil.getTagLocalName(element)+"': "+XmlUtil.toString(element), element);
+ }
+
+ return descriptor;
+ }
+
+ public String createValueExceptionMessage(String message, Element element) {
+ return XmlUtil.getTagLocalName(element)+" has invalid formatted value attribute: "+(message!=null ? message+": " : "")+XmlUtil.toString(element);
+ }
+
+ /** subclasses can be sure that the value is not null.
+ * subclasses should use {@link #createValueExceptionMessage(String, Element) for
+ * reporting format problems in the parse. */
+ protected abstract AbstractDescriptor createDescriptor(String value, Element element, Parse parse);
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/BusinessCalendarBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/BusinessCalendarBinding.java
new file mode 100644
index 0000000..b75bbe5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/BusinessCalendarBinding.java
@@ -0,0 +1,206 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.List;
+import java.util.StringTokenizer;
+import java.util.TimeZone;
+
+import org.jbpm.pvm.internal.cal.BusinessCalendarImpl;
+import org.jbpm.pvm.internal.cal.Day;
+import org.jbpm.pvm.internal.cal.DayPart;
+import org.jbpm.pvm.internal.cal.Holiday;
+import org.jbpm.pvm.internal.util.StringUtil;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.descriptor.ProvidedObjectDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class BusinessCalendarBinding extends WireDescriptorBinding {
+
+ public BusinessCalendarBinding() {
+ super("business-calendar");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ BusinessCalendarImpl businessCalendarImpl = new BusinessCalendarImpl();
+
+ TimeZone timeZone = null;
+ if (element.hasAttribute("timezone")) {
+ timeZone = TimeZone.getTimeZone(element.getAttribute("timezone"));
+ } else {
+ timeZone = TimeZone.getDefault();
+ }
+ businessCalendarImpl.setTimeZone(timeZone);
+
+ String hourFormatText = "HH:mm";
+ if (element.hasAttribute("hour-format")) {
+ hourFormatText = element.getAttribute("hour-format");
+ }
+ DateFormat hourFormat = new SimpleDateFormat(hourFormatText);
+
+ Day[] days = new Day[8];
+ days[Calendar.SUNDAY] = parseDay(element, "sunday", hourFormat, businessCalendarImpl, parse);
+ days[Calendar.MONDAY] = parseDay(element, "monday", hourFormat, businessCalendarImpl, parse);
+ days[Calendar.TUESDAY] = parseDay(element, "tuesday", hourFormat, businessCalendarImpl, parse);
+ days[Calendar.WEDNESDAY] = parseDay(element, "wednesday", hourFormat, businessCalendarImpl, parse);
+ days[Calendar.THURSDAY] = parseDay(element, "thursday", hourFormat, businessCalendarImpl, parse);
+ days[Calendar.FRIDAY] = parseDay(element, "friday", hourFormat, businessCalendarImpl, parse);
+ days[Calendar.SATURDAY] = parseDay(element, "saturday", hourFormat, businessCalendarImpl, parse);
+ businessCalendarImpl.setDays(days);
+
+ String dayFormatText = "dd/MM/yyyy";
+ if (element.hasAttribute("day-format")) {
+ dayFormatText = element.getAttribute("day-format");
+ }
+ DateFormat dayFormat = new SimpleDateFormat(dayFormatText);
+
+ Holiday[] holidays = null;
+ List<Element> holidayElements = XmlUtil.elements(element, "holiday");
+ if (!holidayElements.isEmpty()) {
+ holidays = new Holiday[holidayElements.size()];
+ for (int i=0; i<holidayElements.size(); i++) {
+ holidays[i] = parseHoliday(holidayElements.get(i), dayFormat, businessCalendarImpl, parse);
+ }
+ }
+ businessCalendarImpl.setHolidays(holidays);
+
+ ProvidedObjectDescriptor descriptor = new ProvidedObjectDescriptor(businessCalendarImpl, true);
+ return descriptor;
+ }
+
+ private Day parseDay(Element daysElement, String dayText, DateFormat hourFormat, BusinessCalendarImpl businessCalendarImpl, Parse parse) {
+ Day day = new Day();
+ day.setBusinessCalendar(businessCalendarImpl);
+
+ Element dayElement = XmlUtil.element(daysElement, dayText);
+ if (dayElement!=null) {
+ List<DayPart> dayParts = new ArrayList<DayPart>();
+
+ if (dayElement.hasAttribute("hours")) {
+ int dayPartIndex = 0;
+ String hours = dayElement.getAttribute("hours");
+ for (String part: StringUtil.tokenize(hours, "and")) {
+ try {
+ int separatorIndex = part.indexOf('-');
+ if (separatorIndex==-1) throw new IllegalArgumentException("no dash (-)");
+ String fromText = part.substring(0, separatorIndex).trim().toLowerCase();
+ String toText = part.substring(separatorIndex+1).trim().toLowerCase();
+
+ Date from = hourFormat.parse(fromText);
+ Date to = hourFormat.parse(toText);
+
+ Calendar calendar = new GregorianCalendar();
+ calendar.setTime(from);
+ int fromHour = calendar.get(Calendar.HOUR_OF_DAY);
+ int fromMinute = calendar.get(Calendar.MINUTE);
+
+ calendar.setTime(to);
+ int toHour = calendar.get(Calendar.HOUR_OF_DAY);
+ if (toHour==0) {
+ toHour=24;
+ }
+ int toMinute = calendar.get(Calendar.MINUTE);
+
+ DayPart dayPart = new DayPart();
+ dayPart.setDay(day);
+ dayPart.setIndex(dayPartIndex);
+ dayPart.setFromHour(fromHour);
+ dayPart.setFromMinute(fromMinute);
+ dayPart.setToHour(toHour);
+ dayPart.setToMinute(toMinute);
+ dayParts.add(dayPart);
+
+ } catch(Exception e) {
+ parse.addProblem(dayText+" has invalid hours part '"+part+"': "+e.getMessage(), dayElement);
+ }
+
+ dayPartIndex++;
+ }
+
+ } else {
+ parse.addProblem(dayText+" must have attribute 'hours'", dayElement);
+ }
+
+ DayPart[] dayPartArray = new DayPart[dayParts.size()];
+ dayPartArray = dayParts.toArray(dayPartArray);
+ day.setDayParts(dayPartArray);
+ }
+ return day;
+ }
+
+ private Holiday parseHoliday(Element holidayElement, DateFormat dayFormat, BusinessCalendarImpl businessCalendarImpl, Parse parse) {
+ Holiday holiday = new Holiday();
+ try {
+ if (holidayElement.hasAttribute("period")) {
+ String holidayPeriodText = holidayElement.getAttribute("period");
+
+ int dashIndex = holidayPeriodText.indexOf('-');
+
+ String fromDateText = null;
+ String toDateText = null;
+ if (dashIndex!=-1) {
+ fromDateText = holidayPeriodText.substring(0, dashIndex).trim().toLowerCase();
+ toDateText = holidayPeriodText.substring(dashIndex+1).trim().toLowerCase();
+
+ } else {
+ fromDateText = holidayPeriodText.trim().toLowerCase();
+ toDateText = fromDateText;
+ }
+
+
+ Date fromDate = dayFormat.parse(fromDateText);
+ holiday.setFromDay(fromDate);
+
+ Date toDate = dayFormat.parse(toDateText);
+ holiday.setToDay(toDate);
+
+ } else {
+ parse.addProblem("attribute 'period' in element business-calendar is required", holidayElement);
+ }
+
+ // now we are going to set the toDay to the end of the day, rather then the beginning.
+ // we take the start of the next day as the end of the toDay.
+ Calendar calendar = businessCalendarImpl.createCalendar();
+ calendar.setTime(holiday.getToDay());
+ calendar.add(Calendar.DATE, 1);
+ Date toDay = calendar.getTime();
+ holiday.setToDay(toDay);
+
+ } catch (Exception e) {
+ parse.addProblem("couldn't parse holiday: "+XmlUtil.toString(holidayElement), holidayElement);
+ }
+
+ return holiday;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ByteBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ByteBinding.java
new file mode 100644
index 0000000..fdcb236
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ByteBinding.java
@@ -0,0 +1,56 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.descriptor.AbstractDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ByteDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating {@link Byte}s.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class ByteBinding extends BasicTypeBinding {
+
+ public ByteBinding() {
+ super("byte");
+ }
+
+ protected AbstractDescriptor createDescriptor(String value, Element element, Parse parse) {
+ ByteDescriptor byteDescriptor = new ByteDescriptor();
+ Byte byteValue;
+ try {
+ byteValue = Byte.parseByte(value);
+ byteDescriptor.setValue(byteValue);
+ return byteDescriptor;
+
+ } catch (NumberFormatException e) {
+ parse.addProblem(createValueExceptionMessage("'"+value+"' cannot be parsed to a byte", element), element);
+ }
+ return null;
+ }
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/CharBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/CharBinding.java
new file mode 100644
index 0000000..dc1766a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/CharBinding.java
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.descriptor.AbstractDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.CharacterDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating {@link Character}s.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class CharBinding extends BasicTypeBinding {
+
+ public CharBinding() {
+ super("char");
+ }
+
+ protected AbstractDescriptor createDescriptor(String value, Element element, Parse parse) {
+ CharacterDescriptor characterDescriptor = new CharacterDescriptor();
+ if (value.length()!=1) {
+ parse.addProblem(createValueExceptionMessage("length of value must be 1", element), element);
+ return null;
+ }
+ char c = value.charAt(0);
+ characterDescriptor.setValue(new Character(c));
+ return characterDescriptor;
+ }
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ClassBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ClassBinding.java
new file mode 100644
index 0000000..9a403d9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ClassBinding.java
@@ -0,0 +1,34 @@
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.descriptor.ClassDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a {@link Class}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class ClassBinding extends WireDescriptorBinding {
+
+ public ClassBinding() {
+ super("class");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ClassDescriptor classDescriptor = null;
+ String className = XmlUtil.attribute(element, "class-name");
+ if (className!=null) {
+ classDescriptor = new ClassDescriptor();
+ classDescriptor.setClassName(className);
+ } else {
+ parse.addProblem("class must have classname attribute: "+XmlUtil.toString(element), element);
+ }
+ return classDescriptor;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/CommandServiceBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/CommandServiceBinding.java
new file mode 100644
index 0000000..1a3e7ae
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/CommandServiceBinding.java
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.util.List;
+
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.svc.AsyncCommandService;
+import org.jbpm.pvm.internal.svc.DefaultCommandService;
+import org.jbpm.pvm.internal.svc.SerializeInterceptor;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.descriptor.CommandServiceDescriptor;
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for a creating {@link DefaultCommandService}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ */
+public class CommandServiceBinding extends WireDescriptorBinding {
+
+ public CommandServiceBinding() {
+ super("command-service");
+ }
+
+ protected CommandServiceBinding(String tagName) {
+ super(tagName);
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ CommandServiceDescriptor commandServiceDescriptor = new CommandServiceDescriptor();
+
+ CommandService commandService = getCommandService(element, parse, parser);
+ commandServiceDescriptor.setCommandService(commandService);
+
+ List<Element> interceptorElements = XmlUtil.elements(element);
+ for (Element interceptorElement : interceptorElements) {
+ Descriptor interceptorDescriptor = (Descriptor) parser.parseElement(interceptorElement, parse, WireParser.CATEGORY_INTERCEPTOR);
+ commandServiceDescriptor.addInterceptorDescriptor(interceptorDescriptor);
+ }
+
+ return commandServiceDescriptor;
+ }
+
+ protected CommandService getCommandService(Element element, Parse parse, Parser parser) {
+ if ( XmlUtil.attributeBoolean(element, "async", false, parse, Boolean.FALSE)) {
+
+ AsyncCommandService asyncCommandService = new AsyncCommandService();
+ if (XmlUtil.attributeBoolean(element, "propagate-auth", false, parse)) {
+ asyncCommandService.setPropagateUserId(true);
+ }
+ return asyncCommandService;
+ }
+
+ return new DefaultCommandService();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ContextRefBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ContextRefBinding.java
new file mode 100644
index 0000000..f96ada5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ContextRefBinding.java
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.env.Context;
+import org.jbpm.pvm.internal.wire.descriptor.ContextRefDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for obtaining a reference to the current {@link Context}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class ContextRefBinding extends WireDescriptorBinding {
+
+ public ContextRefBinding() {
+ super("context-ref");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ContextRefDescriptor descriptor = new ContextRefDescriptor();
+ if (element.hasAttribute("context-name")) {
+ descriptor.setContextName(element.getAttribute("context-name"));
+ }
+ return descriptor;
+ }
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/DbSessionBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/DbSessionBinding.java
new file mode 100644
index 0000000..ad72431
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/DbSessionBinding.java
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.wire.descriptor.DbSessionDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a {@link DbSession}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ */
+public class DbSessionBinding extends WireDescriptorBinding {
+
+ public static final String TAG = "db-session";
+
+ public DbSessionBinding() {
+ super(TAG);
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ DbSessionDescriptor descriptor = new DbSessionDescriptor();
+
+ if (element.hasAttribute("session")) {
+ descriptor.setSessionName(element.getAttribute("session"));
+ }
+
+ return descriptor;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/DeployerManagerBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/DeployerManagerBinding.java
new file mode 100644
index 0000000..af974f4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/DeployerManagerBinding.java
@@ -0,0 +1,75 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.util.List;
+
+import org.jbpm.pvm.internal.repository.DeployerManager;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.descriptor.ListDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.operation.FieldOperation;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/** parses a descriptor for creating a {@link DeployerManager}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ */
+public class DeployerManagerBinding extends WireDescriptorBinding {
+
+ private static final String DEPLOYER_MANAGER_TAG = "deployer-manager";
+ private static ListBinding listBinding = new ListBinding();
+
+ public DeployerManagerBinding() {
+ super(DEPLOYER_MANAGER_TAG);
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ObjectDescriptor objectDescriptor = new ObjectDescriptor(DeployerManager.class);
+
+ ListDescriptor listDescriptor = (ListDescriptor) listBinding.parse(element, parse, parser);
+
+ WireDefinition wireDefinition = parse.contextStackFind(WireDefinition.class);
+ String descriptorName = wireDefinition.getDescriptorName(DeployerManager.class);
+ if (descriptorName==null) {
+ // merge the new deployment managers with the existing ones
+ objectDescriptor = new ObjectDescriptor(DeployerManager.class);
+ objectDescriptor.addInjection("deployers", listDescriptor);
+
+ } else {
+ // merge the new deployment managers with the existing ones
+ objectDescriptor = (ObjectDescriptor) wireDefinition.getDescriptor(descriptorName);
+ FieldOperation injection = (FieldOperation) objectDescriptor.getOperations().get(0);
+ ListDescriptor existingDescriptor = (ListDescriptor) injection.getDescriptor();
+ List<Descriptor> valueDescriptors = existingDescriptor.getValueDescriptors();
+ valueDescriptors.addAll(listDescriptor.getValueDescriptors());
+ }
+
+ return objectDescriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/DoubleBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/DoubleBinding.java
new file mode 100644
index 0000000..4b42e76
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/DoubleBinding.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.descriptor.AbstractDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.DoubleDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a {@link java.lang.Double}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class DoubleBinding extends BasicTypeBinding {
+
+ public DoubleBinding() {
+ super("double");
+ }
+
+ protected AbstractDescriptor createDescriptor(String value, Element element, Parse parse) {
+ DoubleDescriptor doubleDescriptor = new DoubleDescriptor();
+ Double doubleValue;
+ try {
+ doubleValue = new Double(value);
+ } catch (NumberFormatException e) {
+ parse.addProblem(createValueExceptionMessage("'"+value+"' cannot be parsed to a double", element), element);
+ return null;
+ }
+ doubleDescriptor.setValue(doubleValue);
+ return doubleDescriptor;
+ }
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/EnlistBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/EnlistBinding.java
new file mode 100644
index 0000000..9d487e6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/EnlistBinding.java
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.operation.EnlistOperation;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating an {@link EnlistOperation enlist operation}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class EnlistBinding extends WireOperationBinding {
+
+ public EnlistBinding() {
+ super("enlist");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ EnlistOperation enlistOperation = new EnlistOperation();
+ if (element.hasAttribute("transaction")) {
+ enlistOperation.setTransactionName(element.getAttribute("transaction"));
+ }
+ return enlistOperation;
+ }
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/EnvBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/EnvBinding.java
new file mode 100644
index 0000000..6659731
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/EnvBinding.java
@@ -0,0 +1,52 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.descriptor.EnvDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class EnvBinding extends WireDescriptorBinding {
+
+ public EnvBinding() {
+ super("env");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ EnvDescriptor envDescriptor = new EnvDescriptor();
+
+ String typeName = XmlUtil.attribute(element, "type");
+ envDescriptor.setTypeName(typeName);
+
+ String objectName = XmlUtil.attribute(element, "object");
+ envDescriptor.setObjectName(objectName);
+
+ return envDescriptor;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/EnvRefBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/EnvRefBinding.java
new file mode 100644
index 0000000..5140264
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/EnvRefBinding.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.wire.descriptor.EnvironmentDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for obtaining a reference to the {@link EnvironmentImpl}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class EnvRefBinding extends WireDescriptorBinding {
+
+ public EnvRefBinding() {
+ super("env-ref");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ return new EnvironmentDescriptor();
+ }
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/EnvironmentInterceptorBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/EnvironmentInterceptorBinding.java
new file mode 100644
index 0000000..df0108e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/EnvironmentInterceptorBinding.java
@@ -0,0 +1,57 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.cfg.ConfigurationImpl;
+import org.jbpm.pvm.internal.env.EnvironmentFactory;
+import org.jbpm.pvm.internal.processengine.ProcessEngineImpl;
+import org.jbpm.pvm.internal.svc.Policy;
+import org.jbpm.pvm.internal.wire.descriptor.EnvironmentInterceptorDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/**
+ * @author Tom Baeyens
+ */
+public class EnvironmentInterceptorBinding extends WireInterceptorBinding {
+
+ public EnvironmentInterceptorBinding() {
+ super("environment-interceptor");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ EnvironmentInterceptorDescriptor environmentInterceptorDescriptor = new EnvironmentInterceptorDescriptor();
+
+ ConfigurationImpl configuration = (ConfigurationImpl) parse.contextStackFind(ConfigurationImpl.class);
+ environmentInterceptorDescriptor.setConfiguration(configuration);
+
+ if ( element.hasAttribute("policy")
+ && ("requiresNew".equals(element.getAttribute("policy")))
+ ) {
+ environmentInterceptorDescriptor.setPolicy(Policy.REQUIRES_NEW);
+ }
+
+ return environmentInterceptorDescriptor;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ExecutionServiceBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ExecutionServiceBinding.java
new file mode 100644
index 0000000..de95cb8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ExecutionServiceBinding.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.svc.ExecutionServiceImpl;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ReferenceDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ExecutionServiceBinding extends WireDescriptorBinding {
+
+ public ExecutionServiceBinding() {
+ super("execution-service");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ObjectDescriptor descriptor = new ObjectDescriptor(ExecutionServiceImpl.class);
+ descriptor.addInjection("commandService", new ReferenceDescriptor(CommandService.NAME_TX_REQUIRED_COMMAND_SERVICE));
+ return descriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/FalseBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/FalseBinding.java
new file mode 100644
index 0000000..27df327
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/FalseBinding.java
@@ -0,0 +1,46 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.descriptor.FalseDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating {@link Boolean.FALSE}
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (Documentation)
+ */
+public class FalseBinding extends WireDescriptorBinding {
+
+ public FalseBinding() {
+ super("false");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ return new FalseDescriptor();
+ }
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/FieldBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/FieldBinding.java
new file mode 100644
index 0000000..769f52e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/FieldBinding.java
@@ -0,0 +1,66 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.operation.FieldOperation;
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a field injection operation.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class FieldBinding extends WireOperationBinding {
+
+ public FieldBinding() {
+ super("field");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ FieldOperation fieldOperation = new FieldOperation();
+ if (element.hasAttribute("name")) {
+ fieldOperation.setFieldName(element.getAttribute("name"));
+ } else {
+ parse.addProblem("field must have name : "+XmlUtil.toString(element), element);
+ }
+ Element descriptorElement = XmlUtil.element(element);
+ if (descriptorElement!=null) {
+ Descriptor descriptor = (Descriptor) parser.parseElement(descriptorElement, parse, WireParser.CATEGORY_DESCRIPTOR);
+ if (descriptor!=null) {
+ fieldOperation.setDescriptor(descriptor);
+ } else {
+ parse.addProblem("unknown descriptor element "+descriptorElement.getTagName()+" inside field operation: "+XmlUtil.toString(element), element);
+ }
+ } else {
+ parse.addProblem("field must have 1 descriptor element out of "+parser.getBindings().getTagNames(WireParser.CATEGORY_DESCRIPTOR)+" as content: "+XmlUtil.toString(element), element);
+ }
+ return fieldOperation;
+ }
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/FloatBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/FloatBinding.java
new file mode 100644
index 0000000..c6d5cc5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/FloatBinding.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.descriptor.AbstractDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.FloatDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a {@link Float}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class FloatBinding extends BasicTypeBinding {
+
+ public FloatBinding() {
+ super("float");
+ }
+
+ protected AbstractDescriptor createDescriptor(String value, Element element, Parse parse) {
+ FloatDescriptor floatDescriptor = new FloatDescriptor();
+ Float floatValue;
+ try {
+ floatValue = new Float(value);
+ } catch (NumberFormatException e) {
+ parse.addProblem(createValueExceptionMessage("'"+value+"' cannot be parsed to a float", element), element);
+ return null;
+ }
+ floatDescriptor.setValue(floatValue);
+ return floatDescriptor;
+ }
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HibernateConfigurationBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HibernateConfigurationBinding.java
new file mode 100644
index 0000000..a46f975
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HibernateConfigurationBinding.java
@@ -0,0 +1,216 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.List;
+
+import org.hibernate.cfg.Configuration;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.stream.FileStreamInput;
+import org.jbpm.pvm.internal.stream.ResourceStreamInput;
+import org.jbpm.pvm.internal.stream.StreamInput;
+import org.jbpm.pvm.internal.stream.UrlStreamInput;
+import org.jbpm.pvm.internal.util.ReflectUtil;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.descriptor.HibernateConfigurationDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.PropertiesDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a hibernate Configuration.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ */
+public class HibernateConfigurationBinding extends WireDescriptorBinding {
+
+ private static final Log log = Log.getLog(HibernateConfigurationBinding.class.getName());
+
+ private static final PropertiesBinding propertiesBinding = new PropertiesBinding();
+
+ public HibernateConfigurationBinding() {
+ super("hibernate-configuration");
+ }
+
+ protected HibernateConfigurationBinding(String tagName) {
+ super(tagName);
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ HibernateConfigurationDescriptor descriptor = new HibernateConfigurationDescriptor();
+
+ String configurationClassName = null;
+ if ( element.hasAttribute("annotations")
+ && element.getAttribute("annotations").equalsIgnoreCase("enabled")
+ ) {
+ // don't replace the string with the reflective classname as that will
+ // introduce a hard dependency on the hibernate annotations library
+ configurationClassName = "org.hibernate.cfg.AnnotationConfiguration";
+
+ } else {
+ configurationClassName = Configuration.class.getName();
+ }
+
+ descriptor.setClassName(configurationClassName);
+
+ parseConfiguration(element, parse, descriptor, parser);
+
+ return descriptor;
+ }
+
+ private void parseConfiguration(Element element, Parse parse, HibernateConfigurationDescriptor descriptor, Parser parser)
+ {
+ List<Element> configElements = XmlUtil.elements(element);
+ for (Element configElement: configElements) {
+
+ if ("cfg".equals(XmlUtil.getTagLocalName(configElement))) {
+ if (configElement.hasAttribute("resource")) {
+ String resource = configElement.getAttribute("resource");
+ log.trace("adding hibernate configuration resource "+resource);
+ descriptor.addCfgResource(resource);
+
+ } else if (configElement.hasAttribute("file")) {
+ String fileName = configElement.getAttribute("file");
+ log.trace("adding hibernate configuration file "+fileName);
+ descriptor.addCfgFile(fileName);
+
+ } else if (configElement.hasAttribute("url")) {
+ String urlText = configElement.getAttribute("url");
+ log.trace("adding hibernate configuration url "+urlText);
+ descriptor.addCfgUrl(urlText);
+
+ } else {
+ parse.addProblem("exactly 1 attribute in {resource, file, url} was expected in cfg: "+XmlUtil.toString(configElement), element);
+ }
+
+ } else if ("mapping".equals(XmlUtil.getTagLocalName(configElement))) {
+ if (configElement.hasAttribute("resource")) {
+ String resource = configElement.getAttribute("resource");
+ log.trace("adding hibernate mapping resource "+resource);
+ descriptor.addMappingResource(resource);
+
+ } else if (configElement.hasAttribute("file")) {
+ String fileName = configElement.getAttribute("file");
+ log.trace("adding hibernate mapping file "+fileName);
+ descriptor.addMappingFile(fileName);
+
+ } else if (configElement.hasAttribute("class")) {
+ String className = configElement.getAttribute("class");
+ log.trace("adding hibernate mapping class "+className);
+ descriptor.addMappingClass(className);
+
+ } else if (configElement.hasAttribute("url")) {
+ String urlText = configElement.getAttribute("url");
+ log.trace("adding hibernate mapping url "+urlText);
+ descriptor.addMappingUrl(urlText);
+
+ } else {
+ parse.addProblem("exactly 1 attribute in {resource, file, class, url} was expected in mapping: "+XmlUtil.toString(element));
+ }
+
+ } else if ("properties".equals(XmlUtil.getTagLocalName(configElement))) {
+ PropertiesDescriptor propertiesDescriptor = (PropertiesDescriptor) propertiesBinding.parse(configElement, parse, parser);
+ descriptor.setPropertiesDescriptor(propertiesDescriptor);
+
+ } else if ("cache-configuration".equals(XmlUtil.getTagLocalName(configElement))) {
+ StreamInput streamSource = null;
+
+ String cacheUsage = configElement.getAttribute("usage");
+ if (! ( ("read-only".equals(cacheUsage))
+ || ("nonstrict-read-write".equals(cacheUsage))
+ || ("read-write".equals(cacheUsage))
+ || ("transactional".equals(cacheUsage))
+ )
+ ){
+ parse.addProblem("problem in cache-configuration: no usage attribute or illegal value: "+cacheUsage+" Possible values are {read-only, nonstrict-read-write, read-write, transactional}");
+ } else {
+
+ if (configElement.hasAttribute("file")) {
+ String fileName = configElement.getAttribute("file");
+ File file = new File(fileName);
+ if (file.exists() && file.isFile()) {
+ streamSource = new FileStreamInput(file);
+ } else {
+ parse.addProblem("file "+fileName+" isn't a file");
+ }
+ }
+
+ if (configElement.hasAttribute("resource")) {
+ String resource = configElement.getAttribute("resource");
+
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ streamSource = new ResourceStreamInput(resource, classLoader);
+ }
+
+ if (configElement.hasAttribute("url")) {
+ String urlText = configElement.getAttribute("url");
+ try {
+ URL url = new URL(urlText);
+ streamSource = new UrlStreamInput(url);
+ } catch (Exception e) {
+ parse.addProblem("couldn't open url "+urlText, e);
+ }
+ }
+
+ if (streamSource != null) {
+ parser.importStream(streamSource, configElement, parse);
+ }
+
+ // parse the cache configurations in the same way as the hibernate cfg schema
+ // translate the contents of the file into invoke operations for methods
+ // Configuration.setCacheConcurrencyStrategy(String clazz, String concurrencyStrategy, String region)
+ // Configuration.setCollectionCacheConcurrencyStrategy(String collectionRole, String concurrencyStrategy)
+ // <class-cache class="org.hibernate.auction.Item" usage="read-write"/>
+ // <class-cache class="org.hibernate.auction.Bid" usage="read-only"/>
+ // <collection-cache collection="org.hibernate.auction.Item.bids" usage="read-write"/>
+ List<Element> cacheElements = XmlUtil.elements(configElement);
+ if (cacheElements!=null) {
+ for (Element cacheElement : cacheElements) {
+
+ if ("class-cache".equals(XmlUtil.getTagLocalName(cacheElement))) {
+ String className = cacheElement.getAttribute("class");
+ descriptor.addClassToCache(className, cacheUsage);
+
+ } else if ("collection-cache".equals(XmlUtil.getTagLocalName(cacheElement))) {
+ String collection = cacheElement.getAttribute("collection");
+ descriptor.addCollectionToCache(collection, cacheUsage);
+
+ } else {
+ parse.addProblem("unknown hibernate cache configuration element "+XmlUtil.toString(configElement));
+ }
+ }
+ }
+ }
+
+ } else {
+ parse.addProblem("unknown hibernate configuration element "+XmlUtil.toString(configElement));
+ }
+ }
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HibernateSessionBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HibernateSessionBinding.java
new file mode 100644
index 0000000..913978c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HibernateSessionBinding.java
@@ -0,0 +1,79 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.descriptor.HibernateSessionDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a hibernate Session.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ */
+public class HibernateSessionBinding extends WireDescriptorBinding {
+
+ public HibernateSessionBinding() {
+ super("hibernate-session");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ HibernateSessionDescriptor descriptor = new HibernateSessionDescriptor();
+
+ if (element.hasAttribute("factory")) {
+ descriptor.setFactoryName(element.getAttribute("factory"));
+ }
+
+ Boolean tx = XmlUtil.attributeBoolean(element, "tx", false, parse);
+ if (tx!=null) {
+ descriptor.setTx(tx);
+ }
+
+ Boolean useCurrent = XmlUtil.attributeBoolean(element, "current", false, parse);
+ // if usage of current session is specified
+ if (useCurrent!=null) {
+ // set it accordingly
+ descriptor.setUseCurrent(useCurrent);
+ // and set the default of close appropriately
+ descriptor.setClose( !useCurrent );
+ }
+
+ Boolean close = XmlUtil.attributeBoolean(element, "close", false, parse);
+ if (close!=null) {
+ descriptor.setClose(close);
+ }
+
+ if (element.hasAttribute("standard-transaction")) {
+ descriptor.setStandardTransactionName(element.getAttribute("standard-transaction"));
+ }
+
+ if (element.hasAttribute("connection")) {
+ descriptor.setConnectionName(element.getAttribute("connection"));
+ }
+
+ return descriptor;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HibernateSessionFactoryBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HibernateSessionFactoryBinding.java
new file mode 100644
index 0000000..f00fdf1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HibernateSessionFactoryBinding.java
@@ -0,0 +1,58 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.descriptor.HibernateSessionFactoryDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a hibernate SessionFactory.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ */
+public class HibernateSessionFactoryBinding extends HibernateConfigurationBinding {
+
+ public HibernateSessionFactoryBinding() {
+ super("hibernate-session-factory");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ HibernateSessionFactoryDescriptor descriptor = new HibernateSessionFactoryDescriptor();
+
+ if (element.hasAttribute("configuration")) {
+ descriptor.setConfigurationName(element.getAttribute("configuration"));
+
+ // if hibernate session factory binding has sub elements, we assume that
+ // it is an inline configuration declaration
+ } else if (!XmlUtil.elements(element).isEmpty()) {
+ Descriptor configurationDescriptor = (Descriptor) super.parse(element, parse, parser);
+ descriptor.setConfigurationDescriptor(configurationDescriptor);
+ }
+
+ return descriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HistoryServiceBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HistoryServiceBinding.java
new file mode 100644
index 0000000..4787237
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HistoryServiceBinding.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.svc.HistoryServiceImpl;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ReferenceDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistoryServiceBinding extends WireDescriptorBinding {
+
+ public HistoryServiceBinding() {
+ super("history-service");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ObjectDescriptor descriptor = new ObjectDescriptor(HistoryServiceImpl.class);
+ descriptor.addInjection("commandService", new ReferenceDescriptor(CommandService.NAME_TX_REQUIRED_COMMAND_SERVICE));
+ return descriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HistorySessionsBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HistorySessionsBinding.java
new file mode 100644
index 0000000..89bbf2f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/HistorySessionsBinding.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.descriptor.CollectionDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.HistorySessionDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistorySessionsBinding extends WireDescriptorBinding {
+
+ private static final String KEY_HISTORY_SESSIONS_DESCRIPTOR = "historySessionsDescriptor";
+ private static final ListBinding LIST_BINDING = new ListBinding();
+
+ public HistorySessionsBinding() {
+ super("history-sessions");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ HistorySessionDescriptor historySessionsDescriptor = (HistorySessionDescriptor) parse.contextMapGet(KEY_HISTORY_SESSIONS_DESCRIPTOR);
+ if (historySessionsDescriptor==null) {
+ historySessionsDescriptor = new HistorySessionDescriptor();
+ parse.contextMapPut(KEY_HISTORY_SESSIONS_DESCRIPTOR, historySessionsDescriptor);
+ }
+
+ CollectionDescriptor listDescriptor = (CollectionDescriptor) LIST_BINDING.parse(element, parse, parser);
+ historySessionsDescriptor.add(listDescriptor);
+
+ return historySessionsDescriptor;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/IdentityServiceBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/IdentityServiceBinding.java
new file mode 100644
index 0000000..8f016ae
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/IdentityServiceBinding.java
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.svc.IdentityServiceImpl;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ReferenceDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class IdentityServiceBinding extends WireDescriptorBinding {
+
+ public IdentityServiceBinding() {
+ super("identity-service");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ObjectDescriptor descriptor = new ObjectDescriptor(IdentityServiceImpl.class);
+ descriptor.addInjection("commandService", new ReferenceDescriptor(CommandService.NAME_TX_REQUIRED_COMMAND_SERVICE));
+ return descriptor;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/IdentitySessionBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/IdentitySessionBinding.java
new file mode 100644
index 0000000..37bf554
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/IdentitySessionBinding.java
@@ -0,0 +1,46 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.hibernate.Session;
+import org.jbpm.pvm.internal.identity.impl.IdentitySessionImpl;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class IdentitySessionBinding extends WireDescriptorBinding {
+
+ public IdentitySessionBinding() {
+ super("identity-session");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ObjectDescriptor objectDescriptor = new ObjectDescriptor(IdentitySessionImpl.class);
+ objectDescriptor.addTypedInjection("session", Session.class);
+ return objectDescriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/IntBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/IntBinding.java
new file mode 100644
index 0000000..4056470
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/IntBinding.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.descriptor.AbstractDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.IntegerDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating an Integer.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class IntBinding extends BasicTypeBinding {
+
+ public IntBinding() {
+ super("int");
+ }
+
+ protected AbstractDescriptor createDescriptor(String value, Element element, Parse parse) {
+ IntegerDescriptor integerDescriptor = new IntegerDescriptor();
+ Integer integerValue;
+ try {
+ integerValue = new Integer(value);
+ } catch (NumberFormatException e) {
+ parse.addProblem(createValueExceptionMessage("'"+value+"' cannot be parsed to an int", element), element);
+ return null;
+ }
+ integerDescriptor.setValue(integerValue);
+ return integerDescriptor;
+ }
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/InvokeBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/InvokeBinding.java
new file mode 100644
index 0000000..869c77d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/InvokeBinding.java
@@ -0,0 +1,59 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.util.List;
+
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.descriptor.ArgDescriptor;
+import org.jbpm.pvm.internal.wire.operation.InvokeOperation;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating an {@link InvokeOperation invoke operation}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class InvokeBinding extends WireOperationBinding {
+
+ public InvokeBinding() {
+ super("invoke");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ InvokeOperation invokeOperation = new InvokeOperation();
+ if (element.hasAttribute("method")) {
+ invokeOperation.setMethodName(element.getAttribute("method"));
+ } else {
+ parse.addProblem("invoke must have method : "+XmlUtil.toString(element), element);
+ }
+ List<Element> argElements = XmlUtil.elements(element, "arg");
+ Parser wireParser = (Parser) parser;
+ List<ArgDescriptor> argDescriptors = wireParser.parseArgs(argElements, parse);
+ invokeOperation.setArgDescriptors(argDescriptors);
+ return invokeOperation;
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JbossIdmIdentitySessionBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JbossIdmIdentitySessionBinding.java
new file mode 100644
index 0000000..6e2f178
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JbossIdmIdentitySessionBinding.java
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.descriptor.JbossIdmIdentitySessionDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class JbossIdmIdentitySessionBinding extends WireDescriptorBinding {
+
+ public JbossIdmIdentitySessionBinding() {
+ super("jboss-idm-identity-session");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ JbossIdmIdentitySessionDescriptor descriptor = new JbossIdmIdentitySessionDescriptor();
+
+ if (element.hasAttribute("realm")) {
+ descriptor.setRealmName(element.getAttribute("realm"));
+ }
+
+ return descriptor;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JbossIdmIdentitySessionFactoryBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JbossIdmIdentitySessionFactoryBinding.java
new file mode 100644
index 0000000..d911092
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JbossIdmIdentitySessionFactoryBinding.java
@@ -0,0 +1,52 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.descriptor.JbossIdmIdentitySessionFactoryDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class JbossIdmIdentitySessionFactoryBinding extends WireDescriptorBinding {
+
+ public JbossIdmIdentitySessionFactoryBinding() {
+ super("jboss-idm-identity-session-factory");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ JbossIdmIdentitySessionFactoryDescriptor descriptor = new JbossIdmIdentitySessionFactoryDescriptor();
+
+ if (element.hasAttribute("jndi")) {
+ descriptor.setJndiName(element.getAttribute("jndi"));
+
+ } else if (element.hasAttribute("resource")) {
+ descriptor.setResource(element.getAttribute("resource"));
+ }
+
+ return descriptor;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JndiBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JndiBinding.java
new file mode 100644
index 0000000..53341d1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JndiBinding.java
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.descriptor.JndiDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for looking up an object from
+ * JNDI through the InitialContext.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ */
+public class JndiBinding extends WireDescriptorBinding {
+
+ public JndiBinding() {
+ super("jndi");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ if (element.hasAttribute("jndi-name")) {
+ String jndiName = element.getAttribute("jndi-name");
+ return new JndiDescriptor(jndiName);
+
+ } else {
+ parse.addProblem("jndi requires attribute 'jndi-name'", element);
+ }
+
+ return null;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JobExecutorBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JobExecutorBinding.java
new file mode 100644
index 0000000..031511e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JobExecutorBinding.java
@@ -0,0 +1,95 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.jobexecutor.JobExecutor;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.descriptor.AbstractDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.IntegerDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.JobExecutorDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ReferenceDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.StringDescriptor;
+import org.jbpm.pvm.internal.wire.operation.InvokeOperation;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a {@link JobExecutor}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Pascal Verdage
+ */
+public class JobExecutorBinding extends WireDescriptorBinding {
+
+ public JobExecutorBinding() {
+ super("job-executor");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ // create a jobImpl executor object
+ JobExecutorDescriptor descriptor = new JobExecutorDescriptor();
+
+ // inject the command executor
+
+ if (element.hasAttribute("command-service")) {
+ descriptor.addInjection("commandService",
+ new ReferenceDescriptor(element.getAttribute("command-service"))
+ );
+ } else {
+ descriptor.addInjection("commandService",
+ new ReferenceDescriptor(CommandService.NAME_TX_REQUIRED_COMMAND_SERVICE)
+ );
+ }
+
+ if (element.hasAttribute("name")) {
+ descriptor.addInjection("name", new StringDescriptor(element.getAttribute("name")));
+ }
+
+ parseIntAttribute(element, "threads", descriptor, "nbrOfThreads", parse);
+ parseIntAttribute(element, "idle", descriptor, "idleMillis", parse);
+ parseIntAttribute(element, "idle-max", descriptor, "idleMillisMax", parse);
+ parseIntAttribute(element, "history", descriptor, "historySize", parse);
+ parseIntAttribute(element, "lock", descriptor, "lockMillis", parse);
+
+ // by default invoke the start method, unless auto-start is disabled
+ if (XmlUtil.attributeBoolean(element, "auto-start", false, parse, true)) {
+ InvokeOperation invokeStartOperation = new InvokeOperation();
+ invokeStartOperation.setMethodName("start");
+ descriptor.addOperation(invokeStartOperation);
+ descriptor.setAutoStart(true);
+ descriptor.setInit(AbstractDescriptor.INIT_EAGER);
+ }
+
+ return descriptor;
+ }
+
+ private void parseIntAttribute(Element element, String attributeName, ObjectDescriptor descriptor, String fieldName, Parse parse) {
+ Integer intValue = XmlUtil.attributeInteger(element, attributeName, false, parse);
+ if (intValue!=null) {
+ descriptor.addInjection(fieldName, new IntegerDescriptor(intValue));
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JobTestHelperBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JobTestHelperBinding.java
new file mode 100644
index 0000000..4830994
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JobTestHelperBinding.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.test.JobTestHelper;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class JobTestHelperBinding extends WireDescriptorBinding {
+
+ public JobTestHelperBinding() {
+ super("job-test-helper");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ObjectDescriptor descriptor = new ObjectDescriptor(JobTestHelper.class);
+ descriptor.addTypedInjection("commandService", CommandService.class);
+ return descriptor;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JtaTransactionInterceptorBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JtaTransactionInterceptorBinding.java
new file mode 100644
index 0000000..63e4b02
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/JtaTransactionInterceptorBinding.java
@@ -0,0 +1,56 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.svc.Policy;
+import org.jbpm.pvm.internal.tx.JtaTransactionInterceptor;
+import org.jbpm.pvm.internal.wire.descriptor.ProvidedObjectDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/**
+ * Mapping between a <code>jta-transaction-interceptor</code> element and a
+ * {@link JtaTransactionInterceptor} object.
+ *
+ * @author Alejandro Guizar
+ * @author Tom Baeyens
+ */
+public class JtaTransactionInterceptorBinding extends WireInterceptorBinding {
+
+ public JtaTransactionInterceptorBinding() {
+ super("jta-transaction-interceptor");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ JtaTransactionInterceptor jtaTransactionInterceptor = new JtaTransactionInterceptor();
+
+ if ( element.hasAttribute("policy")
+ && ("requiresNew".equals(element.getAttribute("policy")))
+ ) {
+ jtaTransactionInterceptor.setPolicy(Policy.REQUIRES_NEW);
+ }
+
+ return new ProvidedObjectDescriptor(jtaTransactionInterceptor);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ListBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ListBinding.java
new file mode 100644
index 0000000..d89b186
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ListBinding.java
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.util.List;
+
+import org.jbpm.pvm.internal.jobexecutor.JobExecutor;
+import org.jbpm.pvm.internal.wire.descriptor.CollectionDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ListDescriptor;
+
+/** parses a descriptor for creating a {@link JobExecutor}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class ListBinding extends AbstractCollectionBinding {
+
+ public ListBinding() {
+ super("list");
+ }
+
+ protected CollectionDescriptor createDescriptor() {
+ return new ListDescriptor();
+ }
+
+ protected Class<?> getCollectionInterface() {
+ return List.class;
+ }
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/LongBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/LongBinding.java
new file mode 100644
index 0000000..1571fa0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/LongBinding.java
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.descriptor.AbstractDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.LongDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a {@link java.lang.Long}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class LongBinding extends BasicTypeBinding {
+
+ public LongBinding() {
+ super("long");
+ }
+
+ protected AbstractDescriptor createDescriptor(String value, Element element, Parse parse) {
+ LongDescriptor longDescriptor = new LongDescriptor();
+ Long longValue;
+ try {
+ longValue = new Long(value);
+ } catch (NumberFormatException e) {
+ parse.addProblem(createValueExceptionMessage("'"+value+"' cannot be parsed to a long", element), element);
+ return null;
+ }
+ longDescriptor.setValue(longValue);
+ return longDescriptor;
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/MailSessionBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/MailSessionBinding.java
new file mode 100644
index 0000000..6db8de4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/MailSessionBinding.java
@@ -0,0 +1,137 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.pvm.internal.email.impl.MailServer;
+import org.jbpm.pvm.internal.email.impl.MailSessionImpl;
+import org.jbpm.pvm.internal.email.impl.AddressFilter;
+import org.jbpm.pvm.internal.email.spi.MailSession;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ListDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.PatternDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/**
+ * Parses a descriptor for creating a {@link MailSession}.
+ *
+ * @author Alejandro Guizar
+ */
+public class MailSessionBinding extends WireDescriptorBinding {
+
+ private static final PropertiesBinding propertiesBinding = new PropertiesBinding();
+ private static final ObjectBinding objectBinding = new ObjectBinding();
+
+ public MailSessionBinding() {
+ super("mail-session");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ // mail servers
+ List<Descriptor> serverDescriptors = new ArrayList<Descriptor>();
+ for (Element serverElement : XmlUtil.elements(element, "mail-server")) {
+ // mail server
+ ObjectDescriptor serverDescriptor = new ObjectDescriptor(MailServer.class);
+ serverDescriptors.add(serverDescriptor);
+
+ // address filter
+ Element filterElement = XmlUtil.element(serverElement, "address-filter");
+ if (filterElement != null) {
+ // includes
+ List<Descriptor> includeDescriptors = new ArrayList<Descriptor>();
+ for (Element includeElement : XmlUtil.elements(filterElement, "include")) {
+ includeDescriptors.add(parsePattern(includeElement, parse, parser));
+ }
+ ListDescriptor includesDescriptor = new ListDescriptor();
+ includesDescriptor.setValueDescriptors(includeDescriptors);
+
+ // excludes
+ List<Descriptor> excludeDescriptors = new ArrayList<Descriptor>();
+ for (Element excludeElement : XmlUtil.elements(filterElement, "exclude")) {
+ excludeDescriptors.add(parsePattern(excludeElement, parse, parser));
+ }
+ ListDescriptor excludesDescriptor = new ListDescriptor();
+ excludesDescriptor.setValueDescriptors(excludeDescriptors);
+
+ // address filter
+ ObjectDescriptor filterDescriptor = new ObjectDescriptor(AddressFilter.class);
+ filterDescriptor.addInjection("includePatterns", includesDescriptor);
+ filterDescriptor.addInjection("excludePatterns", excludesDescriptor);
+
+ serverDescriptor.addInjection("addressFilter", filterDescriptor);
+ }
+
+ // mail session properties
+ Element propertiesElement = XmlUtil.element(serverElement, "session-properties");
+ if (propertiesElement != null) {
+ Descriptor propertiesDescriptor =
+ (Descriptor) propertiesBinding.parse(propertiesElement, parse, parser);
+ serverDescriptor.addInjection("sessionProperties", propertiesDescriptor);
+ }
+ else {
+ parse.addProblem("missing mail session properties", element);
+ }
+
+ // authenticator
+ Element authenticatorElement = XmlUtil.element(serverElement, "authenticator");
+ if (authenticatorElement != null) {
+ Descriptor authenticatorDescriptor =
+ (Descriptor) objectBinding.parse(authenticatorElement, parse, parser);
+ serverDescriptor.addInjection("authenticator", authenticatorDescriptor);
+ }
+ }
+
+ // mail servers
+ ListDescriptor serversDescriptor = new ListDescriptor();
+ serversDescriptor.setValueDescriptors(serverDescriptors);
+
+ // mail session
+ ObjectDescriptor sessionDescriptor = new ObjectDescriptor(MailSessionImpl.class);
+ sessionDescriptor.addInjection("mailServers", serversDescriptor);
+ return sessionDescriptor;
+ }
+
+ protected Descriptor parsePattern(Element patternElement, Parse parse, Parser parser) {
+ PatternDescriptor patternDescriptor =
+ new PatternDescriptor(XmlUtil.getContentText(patternElement));
+ // literal
+ String literalAttr = XmlUtil.attribute(patternElement, "literal");
+ if (literalAttr != null) {
+ Boolean literal = XmlUtil.parseBooleanValue(literalAttr);
+ if (literal != null) patternDescriptor.setLiteral(literal);
+ }
+ // canonEq
+ String canonEqAttr = XmlUtil.attribute(patternElement, "canonEq");
+ if (canonEqAttr != null) {
+ Boolean canonEq = XmlUtil.parseBooleanValue(canonEqAttr);
+ if (canonEq != null) patternDescriptor.setCanonEq(canonEq);
+ }
+ return patternDescriptor;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/MailTemplateBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/MailTemplateBinding.java
new file mode 100644
index 0000000..cd7a84d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/MailTemplateBinding.java
@@ -0,0 +1,136 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.w3c.dom.DocumentFragment;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+import org.jbpm.pvm.internal.email.impl.AddressTemplate;
+import org.jbpm.pvm.internal.email.impl.AttachmentTemplate;
+import org.jbpm.pvm.internal.email.impl.MailTemplate;
+import org.jbpm.pvm.internal.email.impl.MailTemplateRegistry;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.descriptor.ProvidedObjectDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+
+/**
+ * @author Alejandro Guizar
+ */
+public class MailTemplateBinding extends WireDescriptorBinding {
+
+ public MailTemplateBinding() {
+ super("mail-template");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ // MailTemplateRegistry is added to the WireDescriptor with a ProvidedObjectDescriptor
+ // The MailTemplateRegistry descriptor is lazy initialized by this binding
+ // mail-template will add a MailTemplate to the MailTemplateRegistry
+ ProvidedObjectDescriptor templateRegistryDescriptor;
+ MailTemplateRegistry templateRegistry;
+
+ WireDefinition wireDefinition = parse.contextStackFind(WireDefinition.class);
+ String templateRegistryDescriptorName = (wireDefinition != null ? wireDefinition.getDescriptorName(MailTemplateRegistry.class) : null);
+
+ if (templateRegistryDescriptorName != null) {
+ templateRegistryDescriptor = (ProvidedObjectDescriptor) wireDefinition.getDescriptor(templateRegistryDescriptorName);
+ templateRegistry = (MailTemplateRegistry) templateRegistryDescriptor.getProvidedObject();
+ } else {
+ templateRegistry = new MailTemplateRegistry();
+ templateRegistryDescriptor = new ProvidedObjectDescriptor(templateRegistry, true);
+ }
+
+ // create the mail template and add it to the registry
+ MailTemplate mailTemplate = parseMailTemplate(element, parse);
+ String templateName = XmlUtil.attribute(element, "name", true, parse);
+ templateRegistry.addTemplate(templateName, mailTemplate);
+
+ return templateRegistryDescriptor;
+ }
+
+ public static MailTemplate parseMailTemplate(Element element, Parse parse) {
+ MailTemplate mailTemplate = new MailTemplate();
+ mailTemplate.setLanguage(XmlUtil.attribute(element, "language"));
+
+ mailTemplate.setFrom(parseRecipientTemplate(element, "from", parse));
+ mailTemplate.setTo(parseRecipientTemplate(element, "to", parse));
+ mailTemplate.setCc(parseRecipientTemplate(element, "cc", parse));
+ mailTemplate.setBcc(parseRecipientTemplate(element, "bcc", parse));
+
+ Element subjectElement = XmlUtil.element(element, "subject");
+ if (subjectElement != null) {
+ mailTemplate.setSubject(XmlUtil.getContentText(subjectElement));
+ }
+
+ Element textElement = XmlUtil.element(element, "text");
+ if (textElement != null) {
+ mailTemplate.setText(XmlUtil.getContentText(textElement));
+ }
+
+ Element htmlElement = XmlUtil.element(element, "html");
+ if (htmlElement != null) {
+ // extract child nodes from html element
+ DocumentFragment fragment = htmlElement.getOwnerDocument().createDocumentFragment();
+ for (Node child = htmlElement.getFirstChild(), next; child != null; child = next) {
+ next = child.getNextSibling();
+ fragment.appendChild(child);
+ }
+ mailTemplate.setHtml(XmlUtil.toString(fragment));
+ }
+
+ // attachments
+ Element attachmentsElement = XmlUtil.element(element, "attachments");
+ if (attachmentsElement != null) {
+ for (Element attachmentElement : XmlUtil.elements(attachmentsElement, "attachment")) {
+ AttachmentTemplate attachmentTemplate = new AttachmentTemplate();
+ mailTemplate.addAttachmentTemplate(attachmentTemplate);
+
+ attachmentTemplate.setUrl(XmlUtil.attribute(attachmentElement, "url"));
+ attachmentTemplate.setResource(XmlUtil.attribute(attachmentElement, "resource"));
+ attachmentTemplate.setFile(XmlUtil.attribute(attachmentElement, "file"));
+ }
+ }
+ return mailTemplate;
+ }
+
+ private static AddressTemplate parseRecipientTemplate(Element element, String tagName, Parse parse) {
+ Element recipientElement = XmlUtil.element(element, tagName);
+ if (recipientElement == null) return null;
+
+ String addresses = XmlUtil.attribute(recipientElement, "addresses");
+ String users = XmlUtil.attribute(recipientElement, "users");
+ String groups = XmlUtil.attribute(recipientElement, "groups");
+
+ if (addresses == null && users == null && groups == null) {
+ parse.addProblem(tagName + " does not specify any recipient", element);
+ }
+
+ AddressTemplate addressTemplate = new AddressTemplate();
+ addressTemplate.setAddresses(addresses);
+ addressTemplate.setUsers(users);
+ addressTemplate.setGroups(groups);
+ return addressTemplate;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ManagementServiceBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ManagementServiceBinding.java
new file mode 100644
index 0000000..6dafbf9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ManagementServiceBinding.java
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.svc.ManagementServiceImpl;
+import org.jbpm.pvm.internal.wire.descriptor.ContextTypeRefDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ReferenceDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ManagementServiceBinding extends WireDescriptorBinding {
+
+ public ManagementServiceBinding() {
+ super("management-service");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ObjectDescriptor descriptor = new ObjectDescriptor(ManagementServiceImpl.class);
+ descriptor.addInjection("commandService", new ReferenceDescriptor(CommandService.NAME_TX_REQUIRED_COMMAND_SERVICE));
+ return descriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/MapBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/MapBinding.java
new file mode 100644
index 0000000..b15cbea
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/MapBinding.java
@@ -0,0 +1,92 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.descriptor.MapDescriptor;
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a {@link java.util.Map}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class MapBinding extends WireDescriptorBinding {
+
+ public MapBinding() {
+ super("map");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ MapDescriptor descriptor = new MapDescriptor();
+ String className = XmlUtil.attribute(element,"class");
+ if (AbstractCollectionBinding.verify(className, Map.class, parse, parser)) {
+ descriptor.setClassName(className);
+ }
+
+ Boolean isSynchronized = XmlUtil.attributeBoolean(element, "synchronized", false, parse);
+ if (isSynchronized!=null) {
+ descriptor.setSynchronized(isSynchronized.booleanValue());
+ }
+
+ List<Descriptor> keyDescriptors = new ArrayList<Descriptor>();
+ List<Descriptor> valueDescriptors = new ArrayList<Descriptor>();
+ List<Element> elements = XmlUtil.elements(element);
+ for (Element entryElement: elements) {
+ if ("entry".equals(XmlUtil.getTagLocalName(entryElement))) {
+ // key
+ Element keyElement = XmlUtil.element(entryElement, "key");
+ Element keyDescriptorElement = (keyElement!=null ? XmlUtil.element(keyElement) : null);
+ Descriptor keyDescriptor = (Descriptor) parser.parseElement(keyDescriptorElement, parse, WireParser.CATEGORY_DESCRIPTOR);
+ // value
+ Element valueElement = XmlUtil.element(entryElement, "value");
+ Element valueDescriptorElement = (valueElement!=null ? XmlUtil.element(valueElement) : null);
+ Descriptor valueDescriptor = (Descriptor) parser.parseElement(valueDescriptorElement, parse, WireParser.CATEGORY_DESCRIPTOR);
+
+ if ( (keyDescriptor!=null)
+ && (valueDescriptor!=null)
+ ) {
+ keyDescriptors.add(keyDescriptor);
+ valueDescriptors.add(valueDescriptor);
+ } else {
+ parse.addProblem("entry must have key and value element with a single descriptor as contents: "+XmlUtil.toString(entryElement), element);
+ }
+ } else {
+ parse.addProblem("map can only contain entry elements: "+XmlUtil.toString(entryElement));
+ }
+ }
+
+ descriptor.setKeyDescriptors(keyDescriptors);
+ descriptor.setValueDescriptors(valueDescriptors);
+ return descriptor;
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/MessageSessionBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/MessageSessionBinding.java
new file mode 100644
index 0000000..61dedff
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/MessageSessionBinding.java
@@ -0,0 +1,81 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.jms.JmsMessageSession;
+import org.jbpm.pvm.internal.jobexecutor.JobExecutorMessageSession;
+import org.jbpm.pvm.internal.session.DbSession;
+import org.jbpm.pvm.internal.session.MessageSession;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.descriptor.ContextTypeRefDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.JndiDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.TransactionRefDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a {@link MessageSession}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ */
+public class MessageSessionBinding extends WireDescriptorBinding {
+
+ public MessageSessionBinding() {
+ super("message-session");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ObjectDescriptor objectDescriptor = new ObjectDescriptor();
+
+ String target = XmlUtil.attribute(element, "target");
+ if ("jms".equals(target)) {
+ objectDescriptor.setClassName(JmsMessageSession.class.getName());
+ objectDescriptor.addInjection("dbSession", new ContextTypeRefDescriptor(DbSession.class));
+
+ if (element.hasAttribute("session-jndi")) {
+ String jmsSessionJndiName = element.getAttribute("session-jndi");
+ JndiDescriptor jndiDescriptor = new JndiDescriptor(jmsSessionJndiName);
+ objectDescriptor.addInjection("jmsSession", jndiDescriptor);
+ } else {
+ parse.addProblem("attribute <"+XmlUtil.getTagLocalName(element)+" session-jndi=\"...\" is required when target=\"jms\"", element);
+ }
+
+ if (element.hasAttribute("destination-jndi")) {
+ String jmsDestinationJndiName = element.getAttribute("destination-jndi");
+ JndiDescriptor jndiDescriptor = new JndiDescriptor(jmsDestinationJndiName);
+ objectDescriptor.addInjection("jmsDestination", jndiDescriptor);
+ } else {
+ parse.addProblem("attribute <"+XmlUtil.getTagLocalName(element)+" destination-jndi=\"...\" is required when target=\"jms\"", element);
+ }
+
+ } else {
+ objectDescriptor.setClassName(JobExecutorMessageSession.class.getName());
+ objectDescriptor.addInjection("transaction", new TransactionRefDescriptor());
+ objectDescriptor.addInjection("dbSession", new ContextTypeRefDescriptor(DbSession.class));
+ }
+
+ return objectDescriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/NullBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/NullBinding.java
new file mode 100644
index 0000000..3545d41
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/NullBinding.java
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.descriptor.NullDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a <code>null</code> value.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class NullBinding extends WireDescriptorBinding {
+
+ public NullBinding() {
+ super("null");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ return new NullDescriptor();
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ObjectBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ObjectBinding.java
new file mode 100644
index 0000000..7abafe4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ObjectBinding.java
@@ -0,0 +1,167 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ArgDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.operation.Operation;
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+import org.jbpm.pvm.internal.xml.Bindings;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a java object through reflection.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class ObjectBinding extends WireDescriptorBinding {
+
+ public static final String TAG = "object";
+ public static final ObjectBinding INSTANCE = new ObjectBinding();
+
+ public ObjectBinding() {
+ super(TAG);
+ }
+
+ public static boolean isObjectDescriptor(Element element) {
+ if (XmlUtil.attribute(element, "class")!=null) {
+ return true;
+ }
+ if (XmlUtil.attribute(element, "factory")!=null) {
+ return true;
+ }
+ if (XmlUtil.element(element, "factory")!=null) {
+ return true;
+ }
+ return false;
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ObjectDescriptor descriptor = new ObjectDescriptor();
+
+ Parser wireParser = (Parser) parser;
+ String className = XmlUtil.attribute(element, "class");
+ String expr = XmlUtil.attribute(element, "expr");
+ String factoryObjectName = XmlUtil.attribute(element, "factory");
+ Element factoryElement = XmlUtil.element(element, "factory");
+
+ if (className!=null) {
+ descriptor.setClassName(className);
+ if (factoryObjectName!=null) {
+ parse.addProblem("attribute 'factory' is specified together with attribute 'class' in element 'object': "+XmlUtil.toString(element), element);
+ }
+ if (factoryElement!=null) {
+ parse.addProblem("element 'factory' is specified together with attribute 'class' in element 'object': "+XmlUtil.toString(element), element);
+ }
+
+ Element constructorElement = XmlUtil.element(element, "constructor");
+ if (constructorElement!=null) {
+ List<Element> argElements = XmlUtil.elements(constructorElement, "arg");
+ List<ArgDescriptor> argDescriptors = wireParser.parseArgs(argElements, parse);
+ descriptor.setArgDescriptors(argDescriptors);
+
+ if (element.hasAttribute("method")) {
+ parse.addProblem("attributes 'class' and 'method' indicate static method and also a 'constructor' element is specified for element 'object': "+XmlUtil.toString(element), element);
+ }
+ }
+
+ } else if (factoryObjectName!=null) {
+ descriptor.setFactoryObjectName(factoryObjectName);
+ if (factoryElement!=null) {
+ parse.addProblem("element 'factory' is specified together with attribute 'factory' in element 'object': "+XmlUtil.toString(element), element);
+ }
+
+ } else if (factoryElement!=null) {
+ Element factoryDescriptorElement = XmlUtil.element(factoryElement);
+ Descriptor factoryDescriptor = (Descriptor) parser.parseElement(factoryDescriptorElement, parse, WireParser.CATEGORY_DESCRIPTOR);
+ descriptor.setFactoryDescriptor(factoryDescriptor);
+
+ } else if (expr!=null) {
+ descriptor.setExpr(expr);
+ String lang = XmlUtil.attribute(element, "lang");
+ descriptor.setLang(lang);
+
+ } else {
+ parse.addProblem("element 'object' must have one of {attribute 'class', attribute 'expr', attribute 'factory' or element 'factory'}: "+XmlUtil.toString(element), element);
+ }
+
+ // method
+ if (element.hasAttribute("method")) {
+ descriptor.setMethodName(element.getAttribute("method"));
+
+ List<Element> argElements = XmlUtil.elements(element, "arg");
+ List<ArgDescriptor> argDescriptors = wireParser.parseArgs(argElements, parse);
+ descriptor.setArgDescriptors(argDescriptors);
+ } else if ( (factoryObjectName!=null)
+ || (factoryElement!=null)
+ ) {
+ parse.addProblem("element 'object' with a element 'factory' or a attribute 'factory' must have a attribute 'method': "+XmlUtil.toString(element), element);
+ }
+
+ if( (className == null)
+ && (XmlUtil.element(element, "constructor") != null)
+ ) {
+ parse.addProblem("element 'object' with a 'constructor' element must have 'class' attribute: "+XmlUtil.toString(element), element);
+ }
+
+ // read the operations elements
+ List<Operation> operations = null;
+ List<Element> elements = XmlUtil.elements(element);
+
+ Set<String> operationTagNames = null;
+ Bindings bindings = parser.getBindings();
+ if (bindings!=null) {
+ operationTagNames = bindings.getTagNames(WireParser.CATEGORY_OPERATION);
+ } else {
+ operationTagNames = Collections.EMPTY_SET;
+ }
+
+ for (Element childElement: elements) {
+ if (operationTagNames.contains(childElement.getTagName())) {
+ Operation operation = (Operation) parser.parseElement(childElement, parse, WireParser.CATEGORY_OPERATION);
+ if (operations==null) {
+ operations = new ArrayList<Operation>();
+ }
+ operations.add(operation);
+ }
+ }
+ descriptor.setOperations(operations);
+
+ // autowiring
+ Boolean isAutoWireEnabled = XmlUtil.attributeBoolean(element, "auto-wire", false, parse);
+ if (isAutoWireEnabled!=null) {
+ descriptor.setAutoWireEnabled(isAutoWireEnabled.booleanValue());
+ }
+ return descriptor;
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/PolicyEvaluation.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/PolicyEvaluation.java
new file mode 100644
index 0000000..9ecb4c9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/PolicyEvaluation.java
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Heiko.Braun <heiko.braun@jboss.com>
+ */
+public class PolicyEvaluation
+{
+ private boolean doesApply = true;
+ private Map<String, String> results = new HashMap<String,String>();
+
+ public boolean doesApply()
+ {
+ return doesApply;
+ }
+
+ public void setDoesApply(boolean doesApply)
+ {
+ this.doesApply = doesApply;
+ }
+
+ public Map<String, String> getResults()
+ {
+ return results;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ProcessEngineRefBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ProcessEngineRefBinding.java
new file mode 100644
index 0000000..bdaec32
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ProcessEngineRefBinding.java
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.cfg.ConfigurationImpl;
+import org.jbpm.pvm.internal.env.EnvironmentFactory;
+import org.jbpm.pvm.internal.wire.descriptor.ProcessEngineDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/**parses a descriptor for obtaining a reference to the {@link EnvironmentFactory}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class ProcessEngineRefBinding extends WireDescriptorBinding {
+
+ public ProcessEngineRefBinding() {
+ super("process-engine-ref");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ConfigurationImpl configuration = (ConfigurationImpl) parse.contextStackFind(ConfigurationImpl.class);
+ return new ProcessEngineDescriptor(configuration);
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/PropertiesBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/PropertiesBinding.java
new file mode 100644
index 0000000..c2711c0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/PropertiesBinding.java
@@ -0,0 +1,96 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.descriptor.PropertiesDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.StringDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a java.util.Properties.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ */
+public class PropertiesBinding extends WireDescriptorBinding {
+
+ public PropertiesBinding() {
+ super("properties");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ PropertiesDescriptor descriptor = new PropertiesDescriptor();
+
+ if (element.hasAttribute("file")) {
+ descriptor.setFile(element.getAttribute("file"));
+ }
+
+ if (element.hasAttribute("resource")) {
+ descriptor.setResource(element.getAttribute("resource"));
+ }
+
+ if (element.hasAttribute("url")) {
+ descriptor.setUrl(element.getAttribute("url"));
+ }
+
+ Boolean isXml = XmlUtil.attributeBoolean(element, "is-xml", false, parse);
+ if (isXml!=null) {
+ descriptor.setXml(isXml.booleanValue());
+ }
+
+ List<Descriptor> keyDescriptors = new ArrayList<Descriptor>();
+ List<Descriptor> valueDescriptors = new ArrayList<Descriptor>();
+
+ List<Element> elements = XmlUtil.elements(element);
+ for (Element propertyElement: elements) {
+ if ("property".equals(XmlUtil.getTagLocalName(propertyElement))) {
+ // key
+ String name = XmlUtil.attribute(propertyElement, "name");
+ // value
+ String value = XmlUtil.attribute(propertyElement, "value");
+
+ if ( (name!=null)
+ && (value!=null)
+ ) {
+ keyDescriptors.add(new StringDescriptor(name));
+ valueDescriptors.add(new StringDescriptor(value));
+ } else {
+ parse.addProblem("property must have name and value attributes: "+XmlUtil.toString(propertyElement), element);
+ }
+ } else {
+ parse.addProblem("properties can only contain property elements: "+XmlUtil.toString(propertyElement), element);
+ }
+ }
+
+ descriptor.setKeyDescriptors(keyDescriptors);
+ descriptor.setValueDescriptors(valueDescriptors);
+
+ return descriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/PropertyBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/PropertyBinding.java
new file mode 100644
index 0000000..e992356
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/PropertyBinding.java
@@ -0,0 +1,104 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.operation.PropertyOperation;
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+import org.jbpm.pvm.internal.xml.Binding;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/**
+ * <p>This {@link Binding} specifies {@link PropertyOperation} (for property injection).</p>
+ *
+ * <p>A property injection is defined by a <b><code>{@literal <property>}</code></b> xml element.</p>
+ *
+ * <p>This element must have a attribute "name" or a attribute "setter".
+ * <ul>
+ * <li>the "name" attribute specifies the name of the property to inject. For a property <code>foo</code>, a setter method named <code>setFoo</code> should exist.</li>
+ * <li>the "setter" attribute specifies the name of the setter method to use to inject the property.</li>
+ * </ul>
+ * If both attributes are present, the setter method is used.
+ * </p>
+ *
+ * <p>This element should contain a child element that defines a {@link Descriptor}.
+ * This descriptor will be used to create the object that will be assigned to the field</p>
+ *
+ * <h3>Example</h3>
+ *
+ * Consider the following class:
+ * <pre> public class Foo {
+ * String bar;
+ * public void setBar(String bar) {
+ * this.bar = bar;
+ * }
+ * }</pre>
+ *
+ * The following Xml declaration will create an object 'o' of class 'Foo' (see {@link org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor}), and
+ * the value <code>hello</code> will be assigned to <code>o.bar</code> by calling the <code>setBar</code> method.
+ *
+ * <pre> <objects>
+ * <object name='o' class='Foo'>
+ * <property name='bar'>
+ * <string value='hello' />
+ * </property>
+ * </object>
+ * </objects></pre>
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ *
+ * @see ObjectBinding
+ * @see WireParser
+ */
+public class PropertyBinding extends WireOperationBinding {
+
+ public PropertyBinding() {
+ super("property");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ PropertyOperation propertyOperation = new PropertyOperation();
+ if (element.hasAttribute("setter")) {
+ propertyOperation.setSetterName(element.getAttribute("setter"));
+ } else if (element.hasAttribute("name")) {
+ propertyOperation.setPropertyName(element.getAttribute("name"));
+ } else {
+ parse.addProblem("property must have name or setter attribute: "+XmlUtil.toString(element), element);
+ }
+ Element descriptorElement = XmlUtil.element(element);
+ if (descriptorElement!=null) {
+ Descriptor descriptor = (Descriptor) parser.parseElement(descriptorElement, parse, WireParser.CATEGORY_DESCRIPTOR);
+ if (descriptor!=null) {
+ propertyOperation.setDescriptor(descriptor);
+ } else {
+ parse.addProblem("couldn't parse property content element as a value descriptor: "+XmlUtil.toString(element), element);
+ }
+ } else {
+ parse.addProblem("property must have 1 descriptor element out of "+parser.getBindings().getTagNames(WireParser.CATEGORY_DESCRIPTOR)+" as content: "+XmlUtil.toString(element), element);
+ }
+ return propertyOperation;
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RefBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RefBinding.java
new file mode 100644
index 0000000..d45c7f0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RefBinding.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.descriptor.ReferenceDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for referring to another object by name.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class RefBinding extends WireDescriptorBinding {
+
+ public RefBinding() {
+ super("ref");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ReferenceDescriptor descriptor = new ReferenceDescriptor();
+ if (element.hasAttribute("object")) {
+ descriptor.setValue(element.getAttribute("object"));
+ } else if (element.hasAttribute("type")) {
+ descriptor.setType(element.getAttribute("type"));
+
+ } else {
+ parse.addProblem("ref must have object attribute: "+XmlUtil.toString(element), element);
+ }
+ return descriptor;
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RepositoryCacheBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RepositoryCacheBinding.java
new file mode 100644
index 0000000..81004bf
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RepositoryCacheBinding.java
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.repository.RepositoryCacheImpl;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class RepositoryCacheBinding extends WireDescriptorBinding {
+
+ public RepositoryCacheBinding() {
+ super("repository-cache");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ObjectDescriptor objectDescriptor = new ObjectDescriptor(RepositoryCacheImpl.class);
+ objectDescriptor.setAutoWireEnabled(true);
+ return objectDescriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RepositoryServiceBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RepositoryServiceBinding.java
new file mode 100644
index 0000000..08eda1d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RepositoryServiceBinding.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.repository.RepositoryServiceImpl;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ReferenceDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class RepositoryServiceBinding extends WireDescriptorBinding {
+
+ public RepositoryServiceBinding() {
+ super("repository-service");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ObjectDescriptor descriptor = new ObjectDescriptor(RepositoryServiceImpl.class);
+ descriptor.addInjection("commandService", new ReferenceDescriptor(CommandService.NAME_TX_REQUIRED_COMMAND_SERVICE));
+ return descriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RepositorySessionBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RepositorySessionBinding.java
new file mode 100644
index 0000000..d5df8d5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RepositorySessionBinding.java
@@ -0,0 +1,46 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.repository.RepositorySessionImpl;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class RepositorySessionBinding extends WireDescriptorBinding {
+
+ public RepositorySessionBinding() {
+ super("repository-session");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ObjectDescriptor objectDescriptor = new ObjectDescriptor(RepositorySessionImpl.class);
+ objectDescriptor.setAutoWireEnabled(true);
+ return objectDescriptor;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RetryInterceptorBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RetryInterceptorBinding.java
new file mode 100644
index 0000000..11d91d0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/RetryInterceptorBinding.java
@@ -0,0 +1,87 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.svc.RetryInterceptor;
+import org.jbpm.pvm.internal.tx.JtaRetryInterceptor;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.descriptor.ProvidedObjectDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a {@link RetryInterceptor}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ */
+public class RetryInterceptorBinding extends WireInterceptorBinding {
+
+ public RetryInterceptorBinding() {
+ super("retry-interceptor");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ RetryInterceptor retryInterceptor = null;
+
+ String type = XmlUtil.attribute(element, "type");
+ if ("jta".equals(type)) {
+ retryInterceptor = new JtaRetryInterceptor();
+ } else {
+ retryInterceptor = new RetryInterceptor();
+ }
+
+
+ if (element.hasAttribute("retries")) {
+ String retriesText = element.getAttribute("retries");
+ try {
+ int retries = Integer.parseInt(retriesText);
+ retryInterceptor.setRetries(retries);
+ } catch (NumberFormatException e) {
+ parse.addProblem("couldn't parse retries "+retriesText, element);
+ }
+ }
+
+ if (element.hasAttribute("delay")) {
+ String delayText = element.getAttribute("delay");
+ try {
+ long delay = Long.parseLong(delayText);
+ retryInterceptor.setDelay(delay);
+ } catch (NumberFormatException e) {
+ parse.addProblem("couldn't parse delay "+delayText, element);
+ }
+ }
+
+ if (element.hasAttribute("delay-factor")) {
+ String delayFactorText = element.getAttribute("delay-factor");
+ try {
+ long delayFactor = Long.parseLong(delayFactorText);
+ retryInterceptor.setDelayFactor(delayFactor);
+ } catch (NumberFormatException e) {
+ parse.addProblem("couldn't parse delay-factor "+delayFactorText, element);
+ }
+ }
+
+ return new ProvidedObjectDescriptor(retryInterceptor);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SavePolicy.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SavePolicy.java
new file mode 100644
index 0000000..74639cd
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SavePolicy.java
@@ -0,0 +1,32 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.repository.DeploymentImpl;
+
+/**
+ * @author Heiko.Braun <heiko.braun@jboss.com>
+ */
+public interface SavePolicy
+{
+ PolicyEvaluation evaluate(DeploymentImpl deployment);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ScriptManagerBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ScriptManagerBinding.java
new file mode 100644
index 0000000..731ea56
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ScriptManagerBinding.java
@@ -0,0 +1,96 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.util.List;
+
+import javax.script.ScriptEngineFactory;
+import javax.script.ScriptEngineManager;
+
+import org.jbpm.pvm.internal.script.ScriptManager;
+import org.jbpm.pvm.internal.util.ReflectUtil;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ProvidedObjectDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.StringDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ScriptManagerBinding extends WireDescriptorBinding {
+
+ public ScriptManagerBinding() {
+ super("script-manager");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ObjectDescriptor descriptor = new ObjectDescriptor(ScriptManager.class);
+
+ if (element.hasAttribute("default-expression-language")) {
+ String defaultLanguage = element.getAttribute("default-expression-language");
+ descriptor.addInjection("defaultExpressionLanguage", new StringDescriptor(defaultLanguage));
+ }
+
+ if (element.hasAttribute("default-script-language")) {
+ String defaultLanguage = element.getAttribute("default-script-language");
+ descriptor.addInjection("defaultScriptLanguage", new StringDescriptor(defaultLanguage));
+ }
+
+ ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
+ List<Element> scriptElements = XmlUtil.elements(element, "script-language");
+ for (Element scriptElement : scriptElements) {
+ String languageName = null;
+ if (scriptElement.hasAttribute("name")) {
+ languageName = scriptElement.getAttribute("name");
+ } else {
+ parse.addProblem("'name' is a required attribute in element <script-language />", element);
+ }
+ String factoryClassName = null;
+ if (scriptElement.hasAttribute("factory")) {
+ factoryClassName = scriptElement.getAttribute("factory");
+ } else {
+ parse.addProblem("'name' is a required attribute in element <script-language />", element);
+ }
+
+ if ( (languageName!=null)
+ && (factoryClassName!=null)
+ ) {
+ try {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ Class<?> factoryClass = Class.forName(factoryClassName, true, classLoader);
+ ScriptEngineFactory scriptEngineFactory = (ScriptEngineFactory) factoryClass.newInstance();
+ scriptEngineManager.registerEngineName(languageName, scriptEngineFactory);
+ } catch (Exception e) {
+ parse.addProblem("couldn't instantiate ScriptEngineFactory "+factoryClassName, e);
+ }
+ }
+ }
+
+ descriptor.addInjection("scriptEngineManager", new ProvidedObjectDescriptor(scriptEngineManager));
+
+ return descriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SeamHibernateSessionBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SeamHibernateSessionBinding.java
new file mode 100644
index 0000000..53bd999
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SeamHibernateSessionBinding.java
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.descriptor.SeamHibernateSessionDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/**
+ * @author Tom Baeyens
+ */
+public class SeamHibernateSessionBinding extends WireDescriptorBinding {
+
+ public SeamHibernateSessionBinding() {
+ super("seam-hibernate-session");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ SeamHibernateSessionDescriptor seamHibernateSessionDescriptor = new SeamHibernateSessionDescriptor();
+
+ if (element.hasAttribute("component-name")) {
+ String componentName = element.getAttribute("component-name");
+ seamHibernateSessionDescriptor.setComponentName(componentName);
+ }
+
+ return seamHibernateSessionDescriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SerializeInterceptorBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SerializeInterceptorBinding.java
new file mode 100644
index 0000000..74727dc
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SerializeInterceptorBinding.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.svc.SerializeInterceptor;
+import org.jbpm.pvm.internal.wire.descriptor.ProvidedObjectDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class SerializeInterceptorBinding extends WireInterceptorBinding {
+
+ public SerializeInterceptorBinding() {
+ super("serialize-interceptor");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ return new ProvidedObjectDescriptor(new SerializeInterceptor());
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SetBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SetBinding.java
new file mode 100644
index 0000000..bec03be
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SetBinding.java
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.util.Set;
+
+import org.jbpm.pvm.internal.wire.descriptor.CollectionDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.SetDescriptor;
+
+/** parses a descriptor for creating a {@link java.util.Set}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class SetBinding extends AbstractCollectionBinding {
+
+ public SetBinding() {
+ super("set");
+ }
+
+ protected CollectionDescriptor createDescriptor() {
+ return new SetDescriptor();
+ }
+
+ protected Class<?> getCollectionInterface() {
+ return Set.class;
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ShortBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ShortBinding.java
new file mode 100644
index 0000000..29f57ea
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/ShortBinding.java
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.descriptor.AbstractDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ShortDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for a {@link java.lang.Short}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class ShortBinding extends BasicTypeBinding {
+
+ public ShortBinding() {
+ super("short");
+ }
+
+ protected AbstractDescriptor createDescriptor(String value, Element element, Parse parse) {
+ ShortDescriptor shortDescriptor = new ShortDescriptor();
+ Short shortValue;
+ try {
+ shortValue = new Short(value);
+ } catch (NumberFormatException e) {
+ parse.addProblem(createValueExceptionMessage("'"+value+"' cannot be parsed to a short", element), element);
+ return null;
+ }
+ shortDescriptor.setValue(shortValue);
+ return shortDescriptor;
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SkipInterceptorBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SkipInterceptorBinding.java
new file mode 100644
index 0000000..d901bf0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SkipInterceptorBinding.java
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.svc.SkipInterceptor;
+import org.jbpm.pvm.internal.wire.descriptor.ProvidedObjectDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class SkipInterceptorBinding extends WireInterceptorBinding {
+
+ public SkipInterceptorBinding() {
+ super("skip-interceptor");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ return new ProvidedObjectDescriptor(new SkipInterceptor());
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/StandardTransactionInterceptorBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/StandardTransactionInterceptorBinding.java
new file mode 100644
index 0000000..97d9ae7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/StandardTransactionInterceptorBinding.java
@@ -0,0 +1,46 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.tx.StandardTransactionInterceptor;
+import org.jbpm.pvm.internal.wire.descriptor.ProvidedObjectDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a {@link StandardTransactionInterceptor}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ */
+public class StandardTransactionInterceptorBinding extends WireInterceptorBinding {
+
+ public StandardTransactionInterceptorBinding() {
+ super("standard-transaction-interceptor");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ StandardTransactionInterceptor standardTransactionInterceptor = new StandardTransactionInterceptor();
+ return new ProvidedObjectDescriptor(standardTransactionInterceptor);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/StringBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/StringBinding.java
new file mode 100644
index 0000000..b4a7822
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/StringBinding.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.descriptor.AbstractDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.StringDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for a {@link java.lang.String}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class StringBinding extends BasicTypeBinding {
+
+ public StringBinding() {
+ super("string");
+ }
+
+ protected AbstractDescriptor createDescriptor(String value, Element element, Parse parse) {
+ StringDescriptor stringDescriptor = new StringDescriptor();
+ stringDescriptor.setValue(value);
+ return stringDescriptor;
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SubscribeBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SubscribeBinding.java
new file mode 100644
index 0000000..98c95f6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/SubscribeBinding.java
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.util.List;
+
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.descriptor.ArgDescriptor;
+import org.jbpm.pvm.internal.wire.operation.SubscribeOperation;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for a {@link SubscribeOperation subscribe operation}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class SubscribeBinding extends WireOperationBinding {
+
+ public SubscribeBinding() {
+ super("subscribe");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ SubscribeOperation subscribeOperation = new SubscribeOperation();
+
+ // these are the different ways of specifying observables:
+ // <subscribe [context='contextName'] [event(s)='...']... /> will use the context as the observable
+ // <subscribe [context='contextName'] object(s)='objectName' [event(s)='...'] ... /> will use the object(s) with the given name in the specified context
+ // <subscribe [context='contextName'] to='wire-events' event(s)='...' [object(s)='...'] ... /> will listen to wire events of a specific object in the specified context
+
+ // context
+ String contextName = XmlUtil.attribute(element, "context");
+ subscribeOperation.setContextName(contextName);
+
+ // to
+ String to = XmlUtil.attribute(element, "to");
+ if ("wire-events".equalsIgnoreCase(to)) {
+ subscribeOperation.setWireEvents(true);
+ }
+
+ // events
+ List<String> eventNames = XmlUtil.parseList(element, "event");
+ subscribeOperation.setEventNames(eventNames);
+
+ // objects
+ List<String> objectNames = XmlUtil.parseList(element, "object");
+ subscribeOperation.setObjectNames(objectNames);
+
+ // method & args
+ String methodName = XmlUtil.attribute(element, "method");
+ subscribeOperation.setMethodName(methodName);
+ List<Element> argElements = XmlUtil.elements(element, "arg");
+ Parser wireParser = (Parser) parser;
+ List<ArgDescriptor> argDescriptors = wireParser.parseArgs(argElements, parse);
+ subscribeOperation.setArgDescriptors(argDescriptors);
+
+ return subscribeOperation;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TaskServiceBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TaskServiceBinding.java
new file mode 100644
index 0000000..1de09ae
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TaskServiceBinding.java
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.svc.TaskServiceImpl;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ReferenceDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/**
+ * @author Tom Baeyens
+ */
+public class TaskServiceBinding extends WireDescriptorBinding {
+
+ public TaskServiceBinding() {
+ super("task-service");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ObjectDescriptor descriptor = new ObjectDescriptor(TaskServiceImpl.class);
+ descriptor.addInjection("commandService", new ReferenceDescriptor(CommandService.NAME_TX_REQUIRED_COMMAND_SERVICE));
+ return descriptor;
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TimerSessionBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TimerSessionBinding.java
new file mode 100644
index 0000000..c5a28b9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TimerSessionBinding.java
@@ -0,0 +1,70 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.hibernate.Session;
+import org.jbpm.pvm.internal.jobexecutor.JobExecutor;
+import org.jbpm.pvm.internal.jobexecutor.JobExecutorTimerSession;
+import org.jbpm.pvm.internal.session.TimerSession;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.descriptor.ContextTypeRefDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.EnvDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.TransactionRefDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a {@link TimerSession}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens, Pascal Verdage
+ */
+public class TimerSessionBinding extends WireDescriptorBinding {
+
+ public TimerSessionBinding() {
+ super("timer-session");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ObjectDescriptor objectDescriptor = new ObjectDescriptor();
+
+ String target = XmlUtil.attribute(element, "target");
+
+ if ((target!=null) && ("ejb".equalsIgnoreCase(target))) {
+ objectDescriptor.setClassName("org.jbpm.enterprise.internal.ejb.EnterpriseTimerSession");
+
+ } else {
+ // wire the JobExecutorTimerSession
+ objectDescriptor.setClassName(JobExecutorTimerSession.class.getName());
+
+ // inject fields
+ objectDescriptor.addInjection("transaction", new TransactionRefDescriptor());
+ objectDescriptor.addInjection("jobExecutor", new EnvDescriptor(JobExecutor.class));
+ objectDescriptor.addInjection("session", new ContextTypeRefDescriptor(Session.class));
+ }
+
+ return objectDescriptor;
+ }
+}
+
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TransactionBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TransactionBinding.java
new file mode 100644
index 0000000..7c64988
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TransactionBinding.java
@@ -0,0 +1,64 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.tx.JtaTransaction;
+import org.jbpm.pvm.internal.tx.StandardTransaction;
+import org.jbpm.pvm.internal.tx.Transaction;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for creating a {@link Transaction}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ */
+public class TransactionBinding extends WireDescriptorBinding {
+
+ public TransactionBinding() {
+ super("transaction");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ ObjectDescriptor transactionDescriptor = null;
+
+ String type = "standard";
+ if (element.hasAttribute("type")) {
+ type = element.getAttribute("type");
+ }
+
+ if ("standard".equals(type)) {
+ transactionDescriptor = new ObjectDescriptor(StandardTransaction.class);
+ } else if ("jta".equals(type)){
+ transactionDescriptor = new ObjectDescriptor(JtaTransaction.class);
+ } else if ("spring".equals(type)){
+// transactionDescriptor = new ObjectDescriptor(SpringTransaction.class);
+ } else {
+ parse.addProblem("unsupported transaction type: "+type, element);
+ }
+
+ return transactionDescriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TransactionRefBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TransactionRefBinding.java
new file mode 100644
index 0000000..52415a1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TransactionRefBinding.java
@@ -0,0 +1,46 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.tx.Transaction;
+import org.jbpm.pvm.internal.wire.descriptor.TransactionRefDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+
+/** parses a descriptor for referring to the {@link Transaction}.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ */
+public class TransactionRefBinding extends WireDescriptorBinding {
+
+ public TransactionRefBinding() {
+ super("transaction-ref");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ return new TransactionRefDescriptor();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TrueBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TrueBinding.java
new file mode 100644
index 0000000..8d2cb2e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TrueBinding.java
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.descriptor.TrueDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for Boolean.TRUE.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (Documentation)
+ */
+public class TrueBinding extends WireDescriptorBinding {
+
+ public TrueBinding() {
+ super("true");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ return new TrueDescriptor();
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TypesBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TypesBinding.java
new file mode 100644
index 0000000..2678ba0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/TypesBinding.java
@@ -0,0 +1,205 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.io.File;
+import java.net.URL;
+import java.util.List;
+
+import org.jbpm.pvm.internal.stream.FileStreamInput;
+import org.jbpm.pvm.internal.stream.ResourceStreamInput;
+import org.jbpm.pvm.internal.stream.StreamInput;
+import org.jbpm.pvm.internal.stream.UrlStreamInput;
+import org.jbpm.pvm.internal.type.Converter;
+import org.jbpm.pvm.internal.type.Matcher;
+import org.jbpm.pvm.internal.type.Type;
+import org.jbpm.pvm.internal.type.TypeMapping;
+import org.jbpm.pvm.internal.type.matcher.ClassNameMatcher;
+import org.jbpm.pvm.internal.type.matcher.HibernateLongIdMatcher;
+import org.jbpm.pvm.internal.type.matcher.HibernateStringIdMatcher;
+import org.jbpm.pvm.internal.type.matcher.SerializableMatcher;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.descriptor.TypesDescriptor;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/** parses a descriptor for Boolean.TRUE.
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ */
+public class TypesBinding extends WireDescriptorBinding {
+
+ public TypesBinding() {
+ super("types");
+ }
+
+ public Object parse(Element element, Parse parse, Parser parser) {
+ StreamInput streamSource = null;
+ if (element.hasAttribute("file")) {
+ String fileName = element.getAttribute("file");
+ File file = new File(fileName);
+ if (file.exists() && file.isFile()) {
+ streamSource = new FileStreamInput(file);
+ parser.importStream(streamSource, element, parse);
+ } else {
+ parse.addProblem("file "+fileName+" isn't a file", element);
+ }
+ }
+
+ if (element.hasAttribute("resource")) {
+ String resource = element.getAttribute("resource");
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ streamSource = new ResourceStreamInput(resource, classLoader);
+ parser.importStream(streamSource, element, parse);
+ }
+
+ if (element.hasAttribute("url")) {
+ String urlText = element.getAttribute("url");
+ try {
+ URL url = new URL(urlText);
+ streamSource = new UrlStreamInput(url);
+ parser.importStream(streamSource, element, parse);
+ } catch (Exception e) {
+ parse.addProblem("couldn't open url "+urlText, e);
+ }
+ }
+
+ TypesDescriptor typesDescriptor = new TypesDescriptor();
+
+ List<Element> typeElements = XmlUtil.elements(element, "type");
+ for (Element typeElement: typeElements) {
+ TypeMapping typeMapping = parseTypeMapping(typeElement, parse, parser);
+ typesDescriptor.addTypeMapping(typeMapping);
+ }
+ return typesDescriptor;
+ }
+
+ protected TypeMapping parseTypeMapping(Element element, Parse parse, Parser parser) {
+ TypeMapping typeMapping = new TypeMapping();
+ Type type = new Type();
+ typeMapping.setType(type);
+
+ // type name
+ if (element.hasAttribute("name")) {
+ type.setName(element.getAttribute("name"));
+ }
+
+ String hibernateSessionFactoryName = XmlUtil.attribute(element, "hibernate-session-factory");
+
+ // first we get the matcher
+ Matcher matcher = null;
+ if (element.hasAttribute("class")) {
+ String className = element.getAttribute("class");
+
+ // if type="serializable"
+ if ("serializable".equals(className)) {
+ matcher = new SerializableMatcher();
+
+ // if type="hibernatable"
+ } else if ("hibernatable".equals(className)) {
+ if (element.hasAttribute("id-type")) {
+ String idType = element.getAttribute("id-type");
+ if ("long".equalsIgnoreCase(idType)) {
+ matcher = new HibernateLongIdMatcher(hibernateSessionFactoryName);
+ } else if ("string".equalsIgnoreCase(idType)) {
+ matcher = new HibernateStringIdMatcher(hibernateSessionFactoryName);
+ } else {
+ parse.addProblem("id-type was not 'long' or 'string': "+idType, element);
+ }
+ } else {
+ parse.addProblem("id-type is required in a persistable type", element);
+ }
+
+ // otherwise, we expect type="some.java.ClassName"
+ } else {
+ matcher = new ClassNameMatcher(className);
+ }
+
+ } else {
+ // look for the matcher element
+ Element matcherElement = XmlUtil.element(element, "matcher");
+ Element matcherObjectElement = XmlUtil.element(matcherElement);
+ if (matcherObjectElement!=null) {
+ try {
+ Descriptor descriptor = (Descriptor) parser.parseElement(matcherObjectElement, parse);
+ matcher = (Matcher) WireContext.create(descriptor);
+ } catch (ClassCastException e) {
+ parse.addProblem("matcher is not a "+Matcher.class.getName()+": "+(matcher!=null ? matcher.getClass().getName() : "null"), element);
+ }
+ } else {
+ parse.addProblem("no matcher specified in "+XmlUtil.toString(element), element);
+ }
+ }
+
+ typeMapping.setMatcher(matcher);
+
+ // parsing the converter
+ Converter converter = null;
+ if (element.hasAttribute("converter")) {
+ String converterClassName = element.getAttribute("converter");
+ try {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ Class<?> converterClass = Class.forName(converterClassName, true, classLoader);
+ converter = (Converter) converterClass.newInstance();
+ } catch (Exception e) {
+ parse.addProblem("couldn't instantiate converter "+converterClassName, element);
+ }
+ } else {
+ // look for the matcher element
+ Element converterElement = XmlUtil.element(element, "converter");
+ Element converterObjectElement = XmlUtil.element(converterElement);
+ if (converterObjectElement!=null) {
+ try {
+ converter = (Converter) parser.parseElement(converterObjectElement, parse);
+ } catch (ClassCastException e) {
+ parse.addProblem("converter is not a "+Converter.class.getName()+": "+(converter!=null ? converter.getClass().getName() : "null"), element);
+ }
+ }
+ }
+
+ type.setConverter(converter);
+
+ // parsing the variable class
+
+ Class<?> variableClass = null;
+ if (element.hasAttribute("variable-class")) {
+ String variableClassName = element.getAttribute("variable-class");
+ try {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ variableClass = Class.forName(variableClassName, true, classLoader);
+ } catch (Exception e) {
+ parse.addProblem("couldn't instantiate variable-class "+variableClassName, e);
+ }
+ } else {
+ parse.addProblem("variable-class is required on a type: "+XmlUtil.toString(element), element);
+ }
+
+ type.setVariableClass(variableClass);
+
+ return typeMapping;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/VersionTimestampPolicy.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/VersionTimestampPolicy.java
new file mode 100644
index 0000000..bea9a5f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/VersionTimestampPolicy.java
@@ -0,0 +1,149 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import java.io.Serializable;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.repository.DeploymentImpl;
+
+/**
+ * @author Heiko.Braun <heiko.braun@jboss.com>
+ */
+public class VersionTimestampPolicy implements SavePolicy, Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private static Log log = Log.getLog(VersionTimestampPolicy.class.getName());
+
+ private static final String DEPLOYER_TIMESTAMP = "jbpmdeployer.deploymentArtifact.timestamp";
+ private static final String DEPLOYER_LOCATION = "jbpmdeployer.deploymentArtifact.location";
+
+ public PolicyEvaluation evaluate(DeploymentImpl deployment)
+ {
+ log.debug("Apply " + this.getClass().getName());
+
+ PolicyEvaluation evaluation = new PolicyEvaluation();
+
+ /*
+ TODO
+
+ for (String fileName: deployment.getFileNamesForType("jpdl"))
+ {
+ Document doc = deployment.getDocument(fileName);
+ if(null==doc)
+ throw new IllegalArgumentException("Policy expects JPDL document");
+
+ Element processEl = doc.getDocumentElement();
+ String nameAttribute = XmlUtil.attribute(processEl, "name");
+ String keyAttribute = XmlUtil.attribute(processEl, "key");
+ String versionAttribute = XmlUtil.attribute(processEl, "version");
+
+ // @see DeploymentAdaptor, it provides the timestamp
+ long currentTimestamp = deployment.getTimestamp();
+ String deloymentLocation = deployment.getName();
+
+ // provide evaluation properties
+ evaluation.getResults().put(DEPLOYER_TIMESTAMP, String.valueOf(currentTimestamp));
+ evaluation.getResults().put(DEPLOYER_LOCATION, deloymentLocation);
+
+ // can either be key or name given
+ String identifier = nameAttribute!=null ? nameAttribute : keyAttribute;
+
+ // query exisisting processes
+ ProcessService processService = getEnvironment().get(ProcessService.class);
+ ProcessDefinitionQuery query = processService.createProcessDefinitionQuery();
+ if(nameAttribute!=null)
+ query.nameLike(nameAttribute);
+ else
+ query.keyLike(keyAttribute);
+ List<ProcessDefinition> deployedProcesses = query.execute();
+
+ // apply either version or timestamp policy
+ if(versionAttribute!=null)
+ {
+ log.info("Version driven policy evaluation: process '"+identifier+"', version " +versionAttribute);
+
+ long processVersion = Long.valueOf(versionAttribute);
+ for(ProcessDefinition pd : deployedProcesses)
+ {
+ if(processVersion == pd.getVersion())
+ {
+ // explicit version version match
+ // the process will not be saved
+ evaluation.setDoesApply(false);
+
+ log.info("A process definition '"+identifier+"' with version "+versionAttribute+
+ " does already exist. The process will not be deployed: " + deloymentLocation);
+ break;
+ }
+ }
+ }
+ else
+ {
+ log.info("Timestamp driven policy evaluation: process '"+identifier+"', timestamp " +currentTimestamp);
+
+ for(ProcessDefinition pd : deployedProcesses)
+ {
+
+ byte[] bytes = ((ClientProcessDefinition)pd).getAttachment(DEPLOYER_TIMESTAMP);
+ if(null==bytes)
+ {
+ log.error("Failed to retrieve 'jbpmdeployer.deploymentArtifact.timestamp' from process attachments");
+ continue;
+ }
+
+ String s = new String(bytes);
+ long processTimestamp = Long.valueOf(s);
+
+ if(currentTimestamp <= processTimestamp)
+ {
+ // the timestamp of a given deployment artifact
+ // is less or equal to the already deployed process definition
+ // this prevents redeployments upon AS boot
+ evaluation.setDoesApply(false);
+
+ log.info("The deployment artifact doesn't seem to have changed: '"+deloymentLocation+"'."
+ +" Process "+identifier+" will not be deployed");
+ break;
+ }
+
+ }
+ }
+
+ }
+ */
+
+
+ return evaluation;
+ }
+
+ private EnvironmentImpl getEnvironment()
+ {
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ if (environment==null)
+ throw new RuntimeException("Failed to access current environment");
+ return environment;
+
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/WireBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/WireBinding.java
new file mode 100644
index 0000000..4c0eaa5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/WireBinding.java
@@ -0,0 +1,39 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.util.TagBinding;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class WireBinding extends TagBinding {
+
+ static final String WIRE_NAMESPACE = "http://jbpm.org/4/cfg";
+
+ public WireBinding(String tagName, String category) {
+ // the wire bindings currently don't use the namespace as
+ super(tagName, null, category);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/WireDescriptorBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/WireDescriptorBinding.java
new file mode 100644
index 0000000..41bf2db
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/WireDescriptorBinding.java
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class WireDescriptorBinding extends WireBinding {
+
+ public WireDescriptorBinding(String tagName) {
+ super(tagName, WireParser.CATEGORY_DESCRIPTOR);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/WireInterceptorBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/WireInterceptorBinding.java
new file mode 100644
index 0000000..1e37b2c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/WireInterceptorBinding.java
@@ -0,0 +1,35 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class WireInterceptorBinding extends WireBinding {
+
+ public WireInterceptorBinding(String tagName) {
+ super(tagName, WireParser.CATEGORY_INTERCEPTOR);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/WireOperationBinding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/WireOperationBinding.java
new file mode 100644
index 0000000..564b3b6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/WireOperationBinding.java
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.binding;
+
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class WireOperationBinding extends WireBinding {
+
+ public WireOperationBinding(String tagName) {
+ super(tagName, WireParser.CATEGORY_OPERATION);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/package.html
new file mode 100644
index 0000000..5c6f3ed
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/binding/package.html
@@ -0,0 +1,4 @@
+<body>
+each {@link org.jbpm.pvm.internal.xml.Binding} class creates a
+wire descriptor from a dom element.
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/AbstractDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/AbstractDescriptor.java
new file mode 100644
index 0000000..2281196
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/AbstractDescriptor.java
@@ -0,0 +1,97 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import java.io.Serializable;
+
+import org.jbpm.pvm.internal.util.DefaultObservable;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+
+/**
+ * base class for {@link Descriptor}s.
+ * @author Tom Baeyens
+ */
+public abstract class AbstractDescriptor extends DefaultObservable implements Serializable, Descriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ protected long dbid;
+ protected int dbversion;
+ protected int version;
+ protected String name = null;
+
+ /** lazy creation and delayed initialization */
+ public static final char INIT_LAZY='L';
+
+ /** eager creation and delayed initialization */
+ public static final char INIT_EAGER='E';
+
+ /** lazy creation and immediate initialization */
+ public static final char INIT_REQUIRED='R';
+
+ /** eager creation and immediate initialization */
+ public static final char INIT_IMMEDIATE='I';
+
+ protected char init = INIT_LAZY;
+
+ public AbstractDescriptor() {
+ }
+
+ public AbstractDescriptor(String name) {
+ this.name = name;
+ }
+
+ public Class<?> getType(WireDefinition wireDefinition) {
+ return null;
+ }
+
+ public boolean isEagerInit() {
+ return (init == INIT_EAGER || init == INIT_IMMEDIATE);
+ }
+
+ public boolean isDelayable() {
+ return (init == INIT_EAGER || init == INIT_LAZY);
+ }
+
+ public void initialize(Object object, WireContext wireContext) {
+ }
+
+ /** the db primary key. */
+ public Long getDbid() {
+ return dbid;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /** see section 'Initialization' of {@link WireContext} */
+ public void setInit(char init) {
+ this.init = init;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ArgDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ArgDescriptor.java
new file mode 100644
index 0000000..e2ec5a6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ArgDescriptor.java
@@ -0,0 +1,61 @@
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import java.io.Serializable;
+
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.operation.InvokeOperation;
+import org.jbpm.pvm.internal.wire.operation.SubscribeOperation;
+
+/**
+ * <p>This class specifies an argument to be supplied to a method.</p>
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ *
+ * @see ObjectDescriptor
+ * @see InvokeOperation
+ * @see SubscribeOperation
+ */
+public class ArgDescriptor implements Serializable{
+
+ private static final long serialVersionUID = 1L;
+
+ long dbid;
+ int dbversion;
+ String typeName;
+ Descriptor descriptor;
+
+ public ArgDescriptor() {
+ }
+
+ /**
+ * Gets the Descriptor used to construct the value given to the argument.
+ */
+ public Descriptor getDescriptor() {
+ return descriptor;
+ }
+
+ /**
+ * Sets the Descriptor used to construct the value given to the argument.
+ * @param descriptor
+ */
+ public void setDescriptor(Descriptor descriptor) {
+ this.descriptor = descriptor;
+ }
+
+ /**
+ * Gets the name of the type of this argument if it is defined.
+ * If the type name is not defined, the type of the Descriptor is used.
+ */
+ public String getTypeName() {
+ return typeName;
+ }
+
+ /**
+ * Sets the name of the type of this argument.
+ * @param typeName
+ */
+ public void setTypeName(String typeName) {
+ this.typeName = typeName;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/BooleanHelper.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/BooleanHelper.java
new file mode 100644
index 0000000..ce827ed
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/BooleanHelper.java
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+/** helper for converting boolean values into the appropriate descriptor.
+ *
+ * @author Tom Baeyens
+ */
+public abstract class BooleanHelper {
+
+ /** translates a tristate (true, false, null) Boolean value into
+ * the appropriate descriptor ({@link TrueDescriptor}, {@link FalseDescriptor}
+ * or {@link NullDescriptor}). */
+ public static AbstractDescriptor createDescriptor(Boolean tristate) {
+ if (tristate==null) {
+ return new NullDescriptor();
+ } else if (Boolean.TRUE.equals(tristate)) {
+ return new TrueDescriptor();
+ }
+ return new FalseDescriptor();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/BusinessCalendarDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/BusinessCalendarDescriptor.java
new file mode 100644
index 0000000..3633086
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/BusinessCalendarDescriptor.java
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.cal.BusinessCalendarImpl;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+
+public class BusinessCalendarDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ BusinessCalendarImpl businessCalendarImpl;
+
+ public BusinessCalendarDescriptor() {
+ }
+
+ public BusinessCalendarDescriptor(BusinessCalendarImpl businessCalendarImpl) {
+ this.businessCalendarImpl = businessCalendarImpl;
+ }
+
+ public Object construct(WireContext wireContext) {
+ return businessCalendarImpl;
+ }
+
+ public Class<?> getType(WireDefinition wireDefinition) {
+ return BusinessCalendarImpl.class;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ByteDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ByteDescriptor.java
new file mode 100644
index 0000000..4128972
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ByteDescriptor.java
@@ -0,0 +1,57 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class ByteDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Long longVal;
+
+ public ByteDescriptor() {
+ }
+
+ public ByteDescriptor(Byte value) {
+ setValue(value);
+ }
+
+ public Object construct(WireContext factory) {
+ if (longVal==null) {
+ return null;
+ }
+ return new Byte(longVal.byteValue());
+ }
+
+ public void setValue(Byte value) {
+ if (value==null) {
+ longVal = null;
+ } else {
+ longVal = new Long(value);
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/CharacterDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/CharacterDescriptor.java
new file mode 100644
index 0000000..71b2d4b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/CharacterDescriptor.java
@@ -0,0 +1,58 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class CharacterDescriptor extends AbstractDescriptor implements Descriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ String text;
+
+ public CharacterDescriptor() {
+ }
+
+ public CharacterDescriptor(Character value) {
+ setValue(value);
+ }
+
+ public Object construct(WireContext factory) {
+ if (text==null) {
+ return null;
+ }
+ return new Character( text.charAt(0) );
+ }
+
+ public void setValue(Character value) {
+ if (value==null) {
+ text = null;
+ } else {
+ text = value.toString();
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ClassDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ClassDescriptor.java
new file mode 100644
index 0000000..332995b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ClassDescriptor.java
@@ -0,0 +1,43 @@
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireException;
+
+/** loads the class with the specified class name using the WireContext class loader.
+ *
+ * @see WireContext#getClassLoader()
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class ClassDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ String text;
+
+ /** loads the class from the class loader of the specified WireContext.
+ * @throws WireException if the class could not be loaded.
+ */
+ public Object construct(WireContext wireContext) {
+ try {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ return Class.forName(text, true, classLoader);
+ } catch (Exception e) {
+ Throwable cause = (e.getCause()!=null ? e.getCause() : e);
+ throw new WireException("couldn't load class '"+text+"': "+cause.getMessage(), cause);
+ }
+ }
+
+ public void setClassName(String className) {
+ this.text = className;
+ }
+
+ public void setClass(Class<?> clazz) {
+ if (clazz==null) {
+ text = null;
+ } else {
+ this.text = clazz.getName();
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ClassLoaderDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ClassLoaderDescriptor.java
new file mode 100644
index 0000000..ee9a7eb
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ClassLoaderDescriptor.java
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+
+/** returns the class loader of the wire context.
+ *
+ * @author Tom Baeyens
+ */
+public class ClassLoaderDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ public Object construct(WireContext wireContext) {
+ return Thread.currentThread().getContextClassLoader();
+ }
+
+ public Class<?> getType(WireDefinition wireDefinition) {
+ return ClassLoader.class;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/CollectionDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/CollectionDescriptor.java
new file mode 100644
index 0000000..60ea778
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/CollectionDescriptor.java
@@ -0,0 +1,111 @@
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.SortedSet;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireException;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class CollectionDescriptor extends AbstractDescriptor implements Descriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ private static Log log = Log.getLog(CollectionDescriptor.class.getName());
+
+ protected String className;
+ protected List<Descriptor> valueDescriptors;
+ protected boolean isSynchronized;
+
+ protected CollectionDescriptor() { }
+
+ public CollectionDescriptor(String defaultImplClassName) {
+ this.className = defaultImplClassName;
+ }
+
+ public Object construct(WireContext wireContext) {
+ Object object = null;
+ try {
+ // instantiate
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ Class<?> clazz = Class.forName(className, true, classLoader);
+ object = clazz.newInstance();
+
+ if (isSynchronized) {
+ if (object instanceof SortedSet) {
+ object = Collections.synchronizedSortedSet((SortedSet) object);
+ } else if (object instanceof SortedMap) {
+ object = Collections.synchronizedSortedMap((SortedMap) object);
+ } else if (object instanceof Set) {
+ object = Collections.synchronizedSet((Set) object);
+ } else if (object instanceof Map) {
+ object = Collections.synchronizedMap((Map) object);
+ } else if (object instanceof List) {
+ object = Collections.synchronizedList((List) object);
+ } else if (object instanceof Collection) {
+ object = Collections.synchronizedCollection((Collection) object);
+ }
+ }
+
+ } catch (Exception e) {
+ throw new WireException("couldn't create '"+(name!=null ? name : className)+"': "+e.getMessage(), e);
+ }
+ return object;
+ }
+
+ public void initialize(Object object, WireContext wireContext) {
+ Collection<Object> collection = (Collection<Object>) object;
+ try {
+ if (valueDescriptors!=null) {
+ for(Descriptor descriptor: valueDescriptors) {
+ Object element = wireContext.create(descriptor, true);
+ log.trace("adding element "+element+" to collection");
+ collection.add(element);
+ }
+ }
+ } catch (WireException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new WireException("couldn't initialize object '"+(name!=null ? name : className)+"'", e);
+ }
+ }
+
+ public void addValueDescriptors(List<Descriptor> otherValueDescriptors) {
+ if (valueDescriptors==null) {
+ valueDescriptors = new ArrayList<Descriptor>();
+ }
+ if (otherValueDescriptors!=null) {
+ valueDescriptors.addAll(otherValueDescriptors);
+ }
+ }
+
+ public String getClassName() {
+ return className;
+ }
+ public void setClassName(String className) {
+ this.className = className;
+ }
+ public List<Descriptor> getValueDescriptors() {
+ return valueDescriptors;
+ }
+ public void setValueDescriptors(List<Descriptor> valueDescriptors) {
+ this.valueDescriptors = valueDescriptors;
+ }
+ public boolean isSynchronized() {
+ return isSynchronized;
+ }
+ public void setSynchronized(boolean isSynchronized) {
+ this.isSynchronized = isSynchronized;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/CommandServiceDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/CommandServiceDescriptor.java
new file mode 100644
index 0000000..d25add2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/CommandServiceDescriptor.java
@@ -0,0 +1,70 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.pvm.internal.cmd.CommandService;
+import org.jbpm.pvm.internal.svc.Interceptor;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+
+/**
+ * @author Tom Baeyens
+ */
+public class CommandServiceDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ CommandService commandService;
+ List<Descriptor> interceptorDescriptors;
+
+ public Object construct(WireContext wireContext) {
+ CommandService interceptedCommandService = commandService;
+ if (interceptorDescriptors!=null) {
+ for (int i=interceptorDescriptors.size()-1 ; i>=0; i--) {
+ Descriptor descriptor = interceptorDescriptors.get(i);
+ Interceptor interceptor = (Interceptor) descriptor.construct(wireContext);
+ interceptor.setNext(interceptedCommandService);
+ interceptedCommandService = interceptor;
+ }
+ }
+ return interceptedCommandService;
+ }
+
+ public Class< ? > getType(WireDefinition wireDefinition) {
+ return (name==null ? CommandService.class : null);
+ }
+
+ public void addInterceptorDescriptor(Descriptor descriptor) {
+ if (interceptorDescriptors==null) {
+ interceptorDescriptors = new ArrayList<Descriptor>();
+ }
+ interceptorDescriptors.add(descriptor);
+ }
+
+ public void setCommandService(CommandService commandService) {
+ this.commandService = commandService;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ContextRefDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ContextRefDescriptor.java
new file mode 100644
index 0000000..4cb24db
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ContextRefDescriptor.java
@@ -0,0 +1,31 @@
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireException;
+
+public class ContextRefDescriptor extends AbstractDescriptor implements Descriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ String contextName;
+
+ public Object construct(WireContext wireContext) {
+ if (contextName==null) {
+ return wireContext;
+ }
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ if (environment==null) {
+ throw new WireException("can't get context '"+contextName+"': no current environment");
+ }
+ return environment.getContext(contextName);
+ }
+
+ public String getContextName() {
+ return contextName;
+ }
+ public void setContextName(String contextName) {
+ this.contextName = contextName;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ContextTypeRefDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ContextTypeRefDescriptor.java
new file mode 100644
index 0000000..3a95fb7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ContextTypeRefDescriptor.java
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ * @author Tom Baeyens
+ */
+public class ContextTypeRefDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+ private static final Log log = Log.getLog(ContextTypeRefDescriptor.class.getName());
+
+ Class<?> type;
+
+ public ContextTypeRefDescriptor(Class<?> type) {
+ this.type = type;
+ }
+
+ public Object construct(WireContext wireContext) {
+ log.trace("looking up "+type+" by type in "+wireContext);
+ if (type!=null) {
+ return wireContext.get(type);
+ }
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/DbSessionDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/DbSessionDescriptor.java
new file mode 100644
index 0000000..ecb97df
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/DbSessionDescriptor.java
@@ -0,0 +1,67 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.hibernate.Session;
+import org.jbpm.pvm.internal.hibernate.DbSessionImpl;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.WireException;
+
+/**
+ * @author Tom Baeyens
+ */
+public class DbSessionDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ String sessionName;
+
+ public Object construct(WireContext wireContext) {
+ return new DbSessionImpl();
+ }
+
+ public void initialize(Object object, WireContext wireContext) {
+ // get the hibernate-session
+ Session session = null;
+ if (sessionName!=null) {
+ session = (Session) wireContext.get(sessionName);
+ } else {
+ session = wireContext.get(Session.class);
+ }
+
+ if (session==null) {
+ throw new WireException("couldn't find hibernate-session "+(sessionName!=null ? "'"+sessionName+"'" : "by type ")+"to create db-session");
+ }
+
+ // inject the session
+ ((DbSessionImpl)object).setSession(session);
+ }
+
+ public Class<?> getType(WireDefinition wireDefinition) {
+ return DbSessionImpl.class;
+ }
+
+ public void setSessionName(String sessionName) {
+ this.sessionName = sessionName;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/DescriptorException.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/DescriptorException.java
new file mode 100644
index 0000000..0e2664a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/DescriptorException.java
@@ -0,0 +1,19 @@
+package org.jbpm.pvm.internal.wire.descriptor;
+
+public class DescriptorException extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+ public DescriptorException() {
+ super();
+ }
+ public DescriptorException(String message, Throwable cause) {
+ super(message, cause);
+ }
+ public DescriptorException(String message) {
+ super(message);
+ }
+ public DescriptorException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/DoubleDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/DoubleDescriptor.java
new file mode 100644
index 0000000..c89762e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/DoubleDescriptor.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class DoubleDescriptor extends AbstractDescriptor implements Descriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ Double doubleVal;
+
+ public DoubleDescriptor() {
+ }
+
+ public DoubleDescriptor(Double value) {
+ setValue(value);
+ }
+
+ public Object construct(WireContext factory) {
+ return doubleVal;
+ }
+
+ public Double getDoubleVal() {
+ return doubleVal;
+ }
+
+ public void setValue(Double value) {
+ this.doubleVal = value;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/EnvDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/EnvDescriptor.java
new file mode 100644
index 0000000..eb03d61
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/EnvDescriptor.java
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireException;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class EnvDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+ private static final Log log = Log.getLog(EnvDescriptor.class.getName());
+
+ protected String objectName;
+ protected String typeName;
+ protected Class<?> type;
+
+ public EnvDescriptor() {
+ }
+
+ public EnvDescriptor(Class<?> type) {
+ this.type = type;
+ }
+
+ public Object construct(WireContext wireContext) {
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+
+ if (environment==null) {
+ throw new WireException("no environment to get object "+(objectName!=null ? objectName : typeName));
+ }
+
+ if (objectName!=null) {
+ log.trace("looking up "+objectName+" by name in environment");
+ return environment.get(objectName);
+ }
+
+ log.trace("looking up an object of type "+typeName+" in environment");
+ if (type==null) {
+ try {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ type = classLoader.loadClass(typeName);
+ } catch (Exception e) {
+ throw new WireException("couldn't load class "+typeName, e);
+ }
+ }
+ return environment.get(type);
+ }
+
+ public void setObjectName(String objectName) {
+ this.objectName = objectName;
+ }
+ public void setTypeName(String typeName) {
+ this.typeName = typeName;
+ }
+ public void setType(Class< ? > type) {
+ this.type = type;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/EnvironmentDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/EnvironmentDescriptor.java
new file mode 100644
index 0000000..cf471d4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/EnvironmentDescriptor.java
@@ -0,0 +1,23 @@
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/** parses a descriptor for obtaining a reference to the environment
+ *
+ * See schema docs for more details.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ *
+ * @see Descriptor
+ */
+public class EnvironmentDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ public Object construct(WireContext wireContext) {
+ return EnvironmentImpl.getCurrent();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/EnvironmentInterceptorDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/EnvironmentInterceptorDescriptor.java
new file mode 100644
index 0000000..1816645
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/EnvironmentInterceptorDescriptor.java
@@ -0,0 +1,56 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.cfg.ConfigurationImpl;
+import org.jbpm.pvm.internal.env.EnvironmentFactory;
+import org.jbpm.pvm.internal.svc.EnvironmentInterceptor;
+import org.jbpm.pvm.internal.svc.Policy;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ * @author Tom Baeyens
+ */
+public class EnvironmentInterceptorDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ protected ConfigurationImpl configuration;
+ protected Policy policy;
+
+ public Object construct(WireContext wireContext) {
+ EnvironmentFactory environmentFactory = (EnvironmentFactory) configuration.getProducedProcessEngine();
+ EnvironmentInterceptor environmentInterceptor = new EnvironmentInterceptor();
+ environmentInterceptor.setEnvironmentFactory(environmentFactory);
+ if (policy!=null) {
+ environmentInterceptor.setPolicy(policy);
+ }
+ return environmentInterceptor;
+ }
+
+ public void setPolicy(Policy policy) {
+ this.policy = policy;
+ }
+ public void setConfiguration(ConfigurationImpl configuration) {
+ this.configuration = configuration;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ExpressionDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ExpressionDescriptor.java
new file mode 100644
index 0000000..16d21dc
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ExpressionDescriptor.java
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.script.ScriptManager;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ExpressionDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String expression;
+ protected String language;
+
+ public Object construct(WireContext wireContext) {
+ ScriptManager scriptManager = ScriptManager.getScriptManager();
+ Object result = scriptManager.evaluateExpression(expression, language);
+ return result;
+ }
+
+ public void setExpression(String expression) {
+ this.expression = expression;
+ }
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/FalseDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/FalseDescriptor.java
new file mode 100644
index 0000000..ee317e1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/FalseDescriptor.java
@@ -0,0 +1,36 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ * @author Tom Baeyens
+ */
+public class FalseDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ public Object construct(WireContext wireContext) {
+ return Boolean.FALSE;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/FloatDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/FloatDescriptor.java
new file mode 100644
index 0000000..f7f25f8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/FloatDescriptor.java
@@ -0,0 +1,59 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+
+/**
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class FloatDescriptor extends AbstractDescriptor implements Descriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ Double doubleVal;
+
+ public FloatDescriptor() {
+ }
+
+ public FloatDescriptor(Float value) {
+ setValue(value);
+ }
+
+ public Object construct(WireContext factory) {
+ if (doubleVal==null) {
+ return null;
+ }
+ return new Float(doubleVal.floatValue());
+ }
+
+ public void setValue(Float value) {
+ if (value==null) {
+ doubleVal = null;
+ } else {
+ doubleVal = new Double(value);
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/HibernateConfigurationDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/HibernateConfigurationDescriptor.java
new file mode 100644
index 0000000..e856cd3
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/HibernateConfigurationDescriptor.java
@@ -0,0 +1,316 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import org.hibernate.cfg.Configuration;
+import org.jbpm.api.JbpmException;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.util.ReflectUtil;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.WireException;
+import org.jbpm.pvm.internal.wire.operation.Operation;
+
+/**
+ * @author Tom Baeyens
+ */
+public class HibernateConfigurationDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Log log = Log.getLog(HibernateConfigurationDescriptor.class.getName());
+
+ String className;
+ String namingStrategyClassName;
+ List<Operation> cfgOperations = new ArrayList<Operation>();
+ List<Operation> cfgCacheOperations = new ArrayList<Operation>();
+ PropertiesDescriptor propertiesDescriptor = null;
+
+ public Object construct(WireContext wireContext) {
+ // instantiation of the configuration
+ Configuration configuration = null;
+ if (className!=null) {
+ try {
+ log.trace("instantiating hibernate configuration class "+className);
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ Class<?> configurationClass = Class.forName(className, true, classLoader);
+ configuration = (Configuration) ReflectUtil.newInstance(configurationClass);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't instantiate hibernate configuration class "+className, e);
+ }
+ } else {
+ log.trace("instantiating default hibernate configuration");
+ configuration = new Configuration();
+ }
+ return configuration;
+ }
+
+ public void initialize(Object object, WireContext wireContext) {
+ Configuration configuration = (Configuration) object;
+
+ apply(cfgOperations, configuration, wireContext);
+ apply(cfgCacheOperations, configuration, wireContext);
+
+ if (propertiesDescriptor!=null) {
+ Properties properties = (Properties) wireContext.create(propertiesDescriptor, false);
+ if (log.isDebugEnabled()) log.debug("adding properties to hibernate configuration: "+properties);
+ configuration.addProperties(properties);
+ }
+ }
+
+ private void apply(List<Operation> operations, Configuration configuration, WireContext wireContext) {
+ if (operations!=null) {
+ for (Operation operation: operations) {
+ log.trace(operation.toString());
+ operation.apply(configuration, wireContext);
+ }
+ }
+ }
+
+ public Class<?> getType(WireDefinition wireDefinition) {
+ if (className!=null) {
+ try {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ return Class.forName(className, true, classLoader);
+ } catch (Exception e) {
+ throw new WireException("couldn't create hibernate configuration '"+className+"': "+e.getMessage(), e.getCause());
+ }
+ }
+ return Configuration.class;
+ }
+
+ public void addCfgResource(String cfgResource) {
+ cfgOperations.add(new AddCfgResource(cfgResource));
+ }
+
+ public void addCfgFile(String cfgFile) {
+ cfgOperations.add(new AddCfgFile(cfgFile));
+ }
+
+ public void addCfgUrl(String cfgUrl) {
+ cfgOperations.add(new AddCfgUrl(cfgUrl));
+ }
+
+ public void addMappingResource(String mappingResource) {
+ cfgOperations.add(new AddMappingResource(mappingResource));
+ }
+
+ public void addMappingFile(String mappingFileName) {
+ cfgOperations.add(new AddMappingFile(mappingFileName));
+ }
+
+ public void addMappingClass(String mappingClassName) {
+ cfgOperations.add(new AddMappingClass(mappingClassName));
+ }
+
+ public void addMappingUrl(String mappingUrl) {
+ cfgOperations.add(new AddMappingUrl(mappingUrl));
+ }
+
+ public void addClassToCache(String className, String concurrencyStrategy) {
+ cfgCacheOperations.add(new SetCacheConcurrencyStrategy(className, concurrencyStrategy));
+ }
+
+ public void addCollectionToCache(String collectionName, String concurrencyStrategy) {
+ cfgCacheOperations.add(new SetCollectionCacheConcurrencyStrategy(collectionName, concurrencyStrategy));
+ }
+
+ public static class AddCfgResource implements Operation {
+ private static final long serialVersionUID = 1L;
+ String cfgResource;
+ public AddCfgResource(String cfgResource) {
+ this.cfgResource = cfgResource;
+ }
+ public void apply(Object target, WireContext wireContext) {
+ Configuration configuration = (Configuration) target;
+ configuration.configure(cfgResource);
+ }
+ public String toString() {
+ return "adding hibernate cfg resource "+cfgResource;
+ }
+ }
+
+ public static class AddCfgFile implements Operation {
+ private static final long serialVersionUID = 1L;
+ String cfgFileName;
+ public AddCfgFile(String cfgFileName) {
+ this.cfgFileName = cfgFileName;
+ }
+ public void apply(Object target, WireContext wireContext) {
+ Configuration configuration = (Configuration) target;
+ File file = new File(cfgFileName);
+ configuration.configure(file);
+ }
+ public String toString() {
+ return "adding hibernate cfg file "+cfgFileName;
+ }
+ }
+
+ public static class AddCfgUrl implements Operation {
+ private static final long serialVersionUID = 1L;
+ String cfgUrl;
+ public AddCfgUrl(String cfgUrl) {
+ this.cfgUrl = cfgUrl;
+ }
+ public void apply(Object target, WireContext wireContext) {
+ Configuration configuration = (Configuration) target;
+ try {
+ URL url = new URL(cfgUrl);
+ configuration.configure(url);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't configure hibernate with url "+cfgUrl, e);
+ }
+ }
+ public String toString() {
+ return "adding hibernate cfg url "+cfgUrl;
+ }
+ }
+
+ public static class AddMappingResource implements Operation {
+ private static final long serialVersionUID = 1L;
+ String resource;
+ public AddMappingResource(String resource) {
+ this.resource = resource;
+ }
+ public void apply(Object target, WireContext wireContext) {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ Configuration configuration = (Configuration) target;
+ configuration.addResource(resource, classLoader);
+ }
+ public String toString() {
+ return "adding mapping resource "+resource+" to hibernate configuration";
+ }
+ }
+
+ public static class AddMappingFile implements Operation {
+ private static final long serialVersionUID = 1L;
+ String fileName;
+ public AddMappingFile(String fileName) {
+ this.fileName = fileName;
+ }
+ public void apply(Object target, WireContext wireContext) {
+ Configuration configuration = (Configuration) target;
+ configuration.addFile(fileName);
+ }
+ public String toString() {
+ return "adding hibernate mapping file "+fileName+" to configuration";
+ }
+ }
+
+ public static class AddMappingClass implements Operation {
+ private static final long serialVersionUID = 1L;
+ String className;
+ public AddMappingClass(String className) {
+ this.className = className;
+ }
+ public void apply(Object target, WireContext wireContext) {
+ Configuration configuration = (Configuration) target;
+ try {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ Class<?> persistentClass = Class.forName(className, true, classLoader);
+ configuration.addClass(persistentClass);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't add mapping for class "+className, e);
+ }
+ }
+ public String toString() {
+ return "adding persistent class "+className+" to hibernate configuration";
+ }
+ }
+
+ public static class AddMappingUrl implements Operation {
+ private static final long serialVersionUID = 1L;
+ String url;
+ public AddMappingUrl(String url) {
+ this.url = url;
+ }
+ public void apply(Object target, WireContext wireContext) {
+ Configuration configuration = (Configuration) target;
+ try {
+ configuration.addURL(new URL(url));
+ } catch (Exception e) {
+ throw new JbpmException("couldn't add hibernate mapping from URL "+url, e);
+ }
+ }
+ }
+
+ public static class SetCacheConcurrencyStrategy implements Operation {
+ private static final long serialVersionUID = 1L;
+ String className;
+ String concurrencyStrategy;
+ public SetCacheConcurrencyStrategy(String className, String concurrencyStrategy) {
+ this.className = className;
+ this.concurrencyStrategy = concurrencyStrategy;
+ }
+ public void apply(Object target, WireContext wireContext) {
+ Configuration configuration = (Configuration) target;
+ configuration.setCacheConcurrencyStrategy(className, concurrencyStrategy);
+ }
+ public String toString() {
+ return "setting cache concurrency strategy on class "+className+" to "+concurrencyStrategy+" on hibernate configuration";
+ }
+ }
+
+ public static class SetCollectionCacheConcurrencyStrategy implements Operation {
+ private static final long serialVersionUID = 1L;
+ String collection;
+ String concurrencyStrategy;
+ public SetCollectionCacheConcurrencyStrategy(String collection, String concurrencyStrategy) {
+ this.collection = collection;
+ this.concurrencyStrategy = concurrencyStrategy;
+ }
+ public void apply(Object target, WireContext wireContext) {
+ Configuration configuration = (Configuration) target;
+ configuration.setCollectionCacheConcurrencyStrategy(collection, concurrencyStrategy);
+ }
+ public String toString() {
+ return "setting cache concurrency strategy on collection "+collection+" to "+concurrencyStrategy+" on hibernate configuration";
+ }
+ }
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public String getClassName() {
+ return className;
+ }
+ public void setClassName(String className) {
+ this.className = className;
+ }
+ public PropertiesDescriptor getPropertiesDescriptor() {
+ return propertiesDescriptor;
+ }
+ public void setPropertiesDescriptor(PropertiesDescriptor propertiesDescriptor) {
+ this.propertiesDescriptor = propertiesDescriptor;
+ }
+ public String getNamingStrategyClassName() {
+ return namingStrategyClassName;
+ }
+ public void setNamingStrategyClassName(String namingStrategyClassName) {
+ this.namingStrategyClassName = namingStrategyClassName;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/HibernateSessionDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/HibernateSessionDescriptor.java
new file mode 100644
index 0000000..d954a70
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/HibernateSessionDescriptor.java
@@ -0,0 +1,116 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import java.sql.Connection;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.impl.SessionImpl;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.tx.HibernateSessionResource;
+import org.jbpm.pvm.internal.tx.StandardTransaction;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.WireException;
+
+/**
+ * @author Tom Baeyens
+ */
+public class HibernateSessionDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+ private static final Log log = Log.getLog(HibernateSessionDescriptor.class.getName());
+
+ protected String factoryName;
+ protected boolean useCurrent = false;
+ protected boolean tx = true;
+ protected boolean close = true;
+ protected String standardTransactionName;
+ protected String connectionName;
+
+ public Object construct(WireContext wireContext) {
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ if (environment==null) {
+ throw new WireException("no environment");
+ }
+
+ // get the hibernate-session-factory
+ SessionFactory sessionFactory = null;
+ if (factoryName!=null) {
+ sessionFactory = (SessionFactory) wireContext.get(factoryName);
+ } else {
+ sessionFactory = environment.get(SessionFactory.class);
+ }
+ if (sessionFactory==null) {
+ throw new WireException("couldn't find hibernate-session-factory "+(factoryName!=null ? "'"+factoryName+"'" : "by type ")+"to open a hibernate-session");
+ }
+
+ // open the hibernate-session
+ Session session = null;
+ if (useCurrent) {
+ if (log.isTraceEnabled()) log.trace("getting current hibernate session");
+ session = sessionFactory.getCurrentSession();
+
+ } else if (connectionName!=null) {
+ Connection connection = (Connection) wireContext.get(connectionName);
+ if (log.isTraceEnabled()) log.trace("creating hibernate session with connection "+connection);
+ session = sessionFactory.openSession(connection);
+
+ } else {
+ if (log.isTraceEnabled()) log.trace("creating hibernate session");
+ session = sessionFactory.openSession();
+ }
+
+ StandardTransaction standardTransaction = environment.get(StandardTransaction.class);
+ if (standardTransaction!=null) {
+ HibernateSessionResource hibernateSessionResource = new HibernateSessionResource(session);
+ standardTransaction.enlistResource(hibernateSessionResource);
+ }
+
+ return session;
+ }
+
+ public Class<?> getType(WireDefinition wireDefinition) {
+ return SessionImpl.class;
+ }
+
+ public void setFactoryName(String factoryName) {
+ this.factoryName = factoryName;
+ }
+ public void setTx(boolean tx) {
+ this.tx = tx;
+ }
+ public void setStandardTransactionName(String standardTransactionName) {
+ this.standardTransactionName = standardTransactionName;
+ }
+ public void setConnectionName(String connectionName) {
+ this.connectionName = connectionName;
+ }
+ public void setUseCurrent(boolean useCurrent) {
+ this.useCurrent = useCurrent;
+ }
+ public void setClose(boolean close) {
+ this.close = close;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/HibernateSessionFactoryDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/HibernateSessionFactoryDescriptor.java
new file mode 100644
index 0000000..62e7a26
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/HibernateSessionFactoryDescriptor.java
@@ -0,0 +1,95 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.util.Listener;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.WireException;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.Configuration;
+
+import java.net.URL;
+
+/**
+ * @author Tom Baeyens
+ */
+public class HibernateSessionFactoryDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+ private static final Log log = Log.getLog(HibernateSessionFactoryDescriptor.class.getName());
+
+ String configurationName;
+ Descriptor configurationDescriptor;
+
+ public Object construct(WireContext wireContext) {
+ Configuration configuration = null;
+
+ if (configurationName!=null) {
+ configuration = (Configuration) wireContext.get(configurationName);
+
+ } else if (configurationDescriptor!=null) {
+ configuration = (Configuration) wireContext.create(configurationDescriptor, false);
+
+ } else {
+ configuration = wireContext.get(Configuration.class);
+ }
+
+ if (configuration==null) {
+ throw new WireException("couldn't find configuration");
+ }
+
+ SessionFactory sessionFactory = configuration.buildSessionFactory();
+
+ wireContext.addListener(new SessionFactoryCloser(sessionFactory));
+
+ return sessionFactory;
+ }
+
+ public static class SessionFactoryCloser implements Listener {
+ SessionFactory sessionFactory;
+ public SessionFactoryCloser(SessionFactory sessionFactory) {
+ this.sessionFactory = sessionFactory;
+ }
+ public void event(Object source, String eventName, Object info) {
+ if (WireContext.EVENT_CLOSE.equals(eventName)) {
+ log.trace("closing hibernate session factory");
+ sessionFactory.close();
+ }
+ }
+ }
+
+
+ public Class<?> getType(WireDefinition wireDefinition) {
+ return SessionFactory.class;
+ }
+
+ public void setConfigurationName(String configurationName) {
+ this.configurationName = configurationName;
+ }
+ public void setConfigurationDescriptor(Descriptor configurationDescriptor) {
+ this.configurationDescriptor = configurationDescriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/HistorySessionDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/HistorySessionDescriptor.java
new file mode 100644
index 0000000..aeb62ef
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/HistorySessionDescriptor.java
@@ -0,0 +1,56 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import java.util.List;
+
+import org.jbpm.pvm.internal.history.HistorySession;
+import org.jbpm.pvm.internal.history.HistorySessionChain;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class HistorySessionDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ CollectionDescriptor listDescriptor = new ListDescriptor();
+
+ public Object construct(WireContext wireContext) {
+ List<HistorySession> historySessions = (List<HistorySession>) WireContext.create(listDescriptor);
+ if (historySessions.size()==1) {
+ return historySessions.get(0);
+ }
+ return new HistorySessionChain(historySessions);
+ }
+
+ public void add(CollectionDescriptor otherListDescriptor) {
+ this.listDescriptor.addValueDescriptors(otherListDescriptor.getValueDescriptors());
+ }
+
+ public Class<?> getType(WireDefinition wireDefinition) {
+ return HistorySession.class;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/IdentitySessionDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/IdentitySessionDescriptor.java
new file mode 100644
index 0000000..1ccd193
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/IdentitySessionDescriptor.java
@@ -0,0 +1,69 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.hibernate.Session;
+import org.jbpm.pvm.internal.identity.impl.IdentitySessionImpl;
+import org.jbpm.pvm.internal.identity.spi.IdentitySession;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.WireException;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class IdentitySessionDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ String sessionName;
+
+ public Object construct(WireContext wireContext) {
+ return new IdentitySessionImpl();
+ }
+
+ public void initialize(Object object, WireContext wireContext) {
+ // get the hibernate-session
+ Session session = null;
+ if (sessionName!=null) {
+ session = (Session) wireContext.get(sessionName);
+ } else {
+ session = wireContext.get(Session.class);
+ }
+
+ if (session==null) {
+ throw new WireException("couldn't find hibernate-session "+(sessionName!=null ? "'"+sessionName+"'" : "by type ")+"to create identity-session");
+ }
+
+ // inject the session
+ ((IdentitySessionImpl)object).setSession(session);
+ }
+
+ public Class<?> getType(WireDefinition wireDefinition) {
+ return IdentitySession.class;
+ }
+
+ public void setSessionName(String sessionName) {
+ this.sessionName = sessionName;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/IntegerDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/IntegerDescriptor.java
new file mode 100644
index 0000000..2374013
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/IntegerDescriptor.java
@@ -0,0 +1,62 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ * <p>This {@link Descriptor} specifies an Integer.</p>
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ *
+ * @see Descriptor
+ */
+public class IntegerDescriptor extends AbstractDescriptor implements Descriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Long longVal;
+
+ public IntegerDescriptor() {
+ }
+
+ public IntegerDescriptor(Integer value) {
+ setValue(value);
+ }
+
+ public Object construct(WireContext factory) {
+ if (longVal==null) {
+ return null;
+ }
+ return new Integer(longVal.intValue());
+ }
+
+ public void setValue(Integer value) {
+ if (value==null) {
+ longVal = null;
+ } else {
+ longVal = new Long(value);
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/JbossIdmIdentitySessionDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/JbossIdmIdentitySessionDescriptor.java
new file mode 100644
index 0000000..234abc2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/JbossIdmIdentitySessionDescriptor.java
@@ -0,0 +1,72 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jboss.identity.idm.api.IdentitySession;
+import org.jboss.identity.idm.api.IdentitySessionFactory;
+import org.jboss.identity.idm.common.exception.IdentityException;
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.identity.impl.IdentitySessionResource;
+import org.jbpm.pvm.internal.identity.impl.JBossIdmIdentitySessionImpl;
+import org.jbpm.pvm.internal.tx.JtaTransaction;
+import org.jbpm.pvm.internal.tx.StandardTransaction;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class JbossIdmIdentitySessionDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String realmName;
+
+ public Object construct(WireContext wireContext) {
+
+ IdentitySessionFactory identitySessionFactory = EnvironmentImpl.getFromCurrent(IdentitySessionFactory.class);
+ try {
+ IdentitySession identitySession = identitySessionFactory.createIdentitySession(realmName);
+
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ StandardTransaction transaction = environment.get(StandardTransaction.class);
+ if (transaction != null) {
+ IdentitySessionResource identitySessionResource = new IdentitySessionResource(identitySession);
+ transaction.enlistResource(identitySessionResource);
+ }
+
+ return new JBossIdmIdentitySessionImpl(identitySession);
+ } catch (IdentityException e) {
+ throw new JbpmException("couldn't create the identity session for realm [" + realmName + "]");
+ }
+ }
+
+ public Class< ? > getType(WireDefinition wireDefinition) {
+ return org.jbpm.pvm.internal.identity.spi.IdentitySession.class;
+ }
+
+ public void setRealmName(String realmName) {
+ this.realmName = realmName;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/JbossIdmIdentitySessionFactoryDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/JbossIdmIdentitySessionFactoryDescriptor.java
new file mode 100644
index 0000000..12c5e64
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/JbossIdmIdentitySessionFactoryDescriptor.java
@@ -0,0 +1,72 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import javax.naming.InitialContext;
+
+import org.jboss.identity.idm.api.IdentitySessionFactory;
+import org.jboss.identity.idm.impl.configuration.IdentityConfigurationImpl;
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+
+
+/**
+ * @author Tom Baeyens
+ * @author Jeff Yu
+ */
+public class JbossIdmIdentitySessionFactoryDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String resource = "jbpm.identity.cfg.xml";
+ protected String jndiName = null;
+
+ public Object construct(WireContext wireContext) {
+ if (jndiName!=null) {
+ try {
+ InitialContext initialContext = new InitialContext();
+ IdentitySessionFactory identitySessionFactory = (IdentitySessionFactory) initialContext.lookup(jndiName);
+ return identitySessionFactory;
+ } catch (Exception e) {
+ throw new JbpmException("couldn't get idm session factory from jndi address "+jndiName, e);
+ }
+ }
+
+ try {
+ return new IdentityConfigurationImpl().configure(resource).buildIdentitySessionFactory();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't instanatiate identity session factory: "+e.getMessage(), e);
+ }
+ }
+
+ public Class< ? > getType(WireDefinition wireDefinition) {
+ return IdentitySessionFactory.class;
+ }
+
+ public void setResource(String resource) {
+ this.resource = resource;
+ }
+ public void setJndiName(String jndiName) {
+ this.jndiName = jndiName;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/JndiDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/JndiDescriptor.java
new file mode 100644
index 0000000..9e8213d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/JndiDescriptor.java
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireException;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class JndiDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ String jndiName;
+
+ protected JndiDescriptor() {
+ }
+
+ public JndiDescriptor(String jndiName) {
+ this.jndiName = jndiName;
+ }
+
+ public Object construct(WireContext wireContext) {
+ try {
+ InitialContext initialContext = new InitialContext();
+ return initialContext.lookup(jndiName);
+ } catch (NamingException e) {
+ throw new WireException("couldn't lookup '"+jndiName+"' from the initial context");
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/JobExecutorDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/JobExecutorDescriptor.java
new file mode 100644
index 0000000..86bcbcc
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/JobExecutorDescriptor.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (C) 2007 Bull S. A. S.
+ * Bull, Rue Jean Jaures, B.P.68, 78340, Les Clayes-sous-Bois
+ * This library is free software; you can redistribute it and/or modify it under the terms
+ * of the GNU Lesser General Public License as published by the Free Software Foundation
+ * version 2.1 of the License.
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License along with this
+ * program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
+ * Floor, Boston, MA 02110-1301, USA.
+ **/
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.jobexecutor.JobExecutor;
+import org.jbpm.pvm.internal.util.Listener;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ * @author Pascal Verdage
+ *
+ * Descriptor for the JobExecutor.
+ * If it is automatically started, a listener is created to stop it when
+ * the environementFactory is closed
+ * @see org.jbpm.pvm.internal.env.EnvironmentFactory
+ * @see org.jbpm.pvm.internal.wire.binding.JobExecutorBinding
+ */
+public class JobExecutorDescriptor extends ObjectDescriptor {
+ private static final long serialVersionUID = 1L;
+ private static final Log log = Log.getLog(JobExecutorDescriptor.class.getName());
+
+
+ private boolean autoStart = false;
+
+ public JobExecutorDescriptor() {
+ super(JobExecutor.class.getName());
+ }
+
+ public Object construct(WireContext wireContext) {
+ JobExecutor jobExecutor = (JobExecutor) super.construct(wireContext);
+ if (autoStart) {
+ wireContext.addListener(new JobExecutorStopper(jobExecutor));
+ }
+ return jobExecutor;
+ }
+
+ public void setAutoStart(boolean autoStart) {
+ this.autoStart = autoStart;
+ }
+
+ public static class JobExecutorStopper implements Listener {
+ JobExecutor jobExecutor;
+ public JobExecutorStopper(JobExecutor jobExecutor) {
+ this.jobExecutor = jobExecutor;
+ }
+ public void event(Object source, String eventName, Object info) {
+ if (WireContext.EVENT_CLOSE.equals(eventName)) {
+ log.trace("stopping jobExecutor");
+ // wait to prevent from calling stop before the run method (activation)
+ // has been called (after a system context switching)
+ //TODO: do not wait
+ try {
+ Thread.sleep(200);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ throw new JbpmException("exception while stopping JobExecutor");
+ }
+ jobExecutor.stop(true);
+ }
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ListDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ListDescriptor.java
new file mode 100644
index 0000000..c86f78d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ListDescriptor.java
@@ -0,0 +1,29 @@
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+/**
+ *
+ * <p>This {@link Descriptor} creates a {@link List}.</p>
+ *
+ * <p>If no specific implementation for the {@link List} is specified, an {@link ArrayList} will be used.
+ *
+ * <p>Entries can be added during the list initialization.
+ * The list of entries is specified with {@link #setValueDescriptors(List)}.</p>
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ *
+ * @see Descriptor
+ */
+public class ListDescriptor extends CollectionDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ public ListDescriptor() {
+ super(ArrayList.class.getName());
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/LongDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/LongDescriptor.java
new file mode 100644
index 0000000..a8bef55
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/LongDescriptor.java
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class LongDescriptor extends AbstractDescriptor implements Descriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Long longVal;
+
+ public LongDescriptor() {
+ }
+
+ public LongDescriptor(Long value) {
+ setValue(value);
+ }
+
+ public Object construct(WireContext factory) {
+ return longVal;
+ }
+
+ public void setValue(Long value) {
+ longVal = value;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/MapDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/MapDescriptor.java
new file mode 100644
index 0000000..2c0a389
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/MapDescriptor.java
@@ -0,0 +1,68 @@
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireException;
+
+/**
+ *
+ * <p>This {@link Descriptor} creates a {@link Map}.</p>
+ *
+ * <p>If no specific implementation for the {@link Map} is specified, a {@link HashMap} will be used.</p>
+ *
+ * <p>Entries can be added during the map initialization. The list of entries (key, value) to add must be specified with two operations:
+ * <ol>
+ * <li>{@link #setKeyDescriptors(List)} sets the list of the keys to generate.</li>
+ * <li>{@link #setValueDescriptors(List)} sets the list of value associated with these keys.</li>
+ * </ol>
+ * The two lists must be in the same order
+ * (the n-th element of the key list will be associated with the n-th element of the value list).</p>
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ *
+ * @see Descriptor
+ */
+public class MapDescriptor extends CollectionDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ List<Descriptor> keyDescriptors;
+
+ public MapDescriptor() {
+ super(HashMap.class.getName());
+ }
+
+ public void initialize(Object object, WireContext wireContext) {
+ Map<Object,Object> map = (Map<Object,Object>) object;
+ try {
+ if (keyDescriptors!=null) {
+ for (int i=0; i<keyDescriptors.size(); i++) {
+ Descriptor keyDescriptor = keyDescriptors.get(i);
+ Descriptor valueDescriptor = valueDescriptors.get(i);
+ Object key = wireContext.create(keyDescriptor, true);
+ Object value = wireContext.create(valueDescriptor, true);
+ map.put(key, value);
+ }
+ }
+ } catch (WireException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new WireException("couldn't initialize object '"+(name!=null ? name : className)+"'", e);
+ }
+ }
+
+
+
+ public List<Descriptor> getKeyDescriptors() {
+ return keyDescriptors;
+ }
+
+ public void setKeyDescriptors(List<Descriptor> keyDescriptors) {
+ this.keyDescriptors = keyDescriptors;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/NullDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/NullDescriptor.java
new file mode 100644
index 0000000..0241073
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/NullDescriptor.java
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ * <p>This {@link Descriptor} creates a <code>null</code> object.</p>
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ *
+ * @see Descriptor
+ */
+public class NullDescriptor extends AbstractDescriptor implements Descriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ public Object construct(WireContext factory) {
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ObjectDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ObjectDescriptor.java
new file mode 100644
index 0000000..d69186a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ObjectDescriptor.java
@@ -0,0 +1,462 @@
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.script.ScriptManager;
+import org.jbpm.pvm.internal.util.ReflectUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.JbpmClassNotFoundException;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.WireException;
+import org.jbpm.pvm.internal.wire.operation.FieldOperation;
+import org.jbpm.pvm.internal.wire.operation.Operation;
+import org.jbpm.pvm.internal.wire.operation.PropertyOperation;
+
+/**
+ * <p>This {@link Descriptor} creates and initializes an object.
+ * Objects can be instantiated from a constructor or from a method invocation.</p>
+ *
+ * <p>The way to create an object is specified one of these methods (see <a href='#createTime'>creating objects</a>):
+ * <ul>
+ * <li>className ({@link #setClassName(String)})</li>
+ * <li>factoryObjectName ({@link #setFactoryObjectName(String)})</li>
+ * <li>factoryDescriptor ({@link #setFactoryDescriptor(Descriptor)})</li>
+ * </ul>
+ * Only one of these methods can be used.
+ * </p>
+ *
+ * <h3 id='createTime'>Creating objects</h3>
+ * <h4>Creating object from a constructor</h4>
+ *
+ * <p>This method is used when <code>{@link #getClassName()}!=null && {@link #getMethodName()}==null</code>.</p>
+ *
+ * <p>The {@link #construct(WireContext)} method creates a new object
+ * from a constructor matching the given arguments
+ * (specified with {@link #setArgDescriptors(List)}).</p>
+ *
+ *
+ * <h4>Creating an object from a method invocation</h4>
+ *
+ * <p>The name of the method to call is specified by the method attribute.</p>
+ * <ul>
+ * <li>If the method is <i>static</i>, the related class is {@link #getClassName()}.</li>
+ * <li>If the method is an object method, the object to which the method will be applied is defined by:
+ * <ul>
+ * <li>If <code>{@link #getFactoryObjectName()}!=null</code>: the object with the name factoryObjectName will be fetched from the context.</li>
+ * <li>if <code>{@link #getFactoryDescriptor()}!=null</code>: the object will be created from the factory descriptor.</li>
+ * </ul>
+ * </li>
+ * </ul>
+ * <p>The object returned by {@link #construct(WireContext)} is the object returned by the method invocation.</p>
+ *
+ *
+ * <h3>Initializing Objects</h3>
+ * <h4>Auto Wiring</h4>
+ * <p>If the auto wiring is enabled for the object (<code>{@link #isAutoWireEnabled()}==true</code>),
+ * the WireContext will try to look for objects with the same name as the fields in the class.
+ * If it finds an object with that name, and if it is assignable to the field's type, it is automatically injected,
+ * without the need for explicit {@link FieldOperation} that specifies the injection in the wiring xml.</p>
+ * <p>If the auto wiring is enabled and the WireContext finds an object with the name of a field, but not assignable to this field,
+ * a warning message is generated.</p>
+ *
+ * <p>Auto-wiring is disabled by default.</p>
+ *
+ * <h4>Operations</h4>
+ * <p>Field injection or property injection are done after the auto-wiring. For more information, see {@link Operation}.</p>
+ *
+ * <p>If a field was injected by auto-wiring, its value can be overridden by specifying
+ * a {@link FieldOperation} or {@link PropertyOperation} operation.</p>
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ *
+ */
+public class ObjectDescriptor extends AbstractDescriptor implements Descriptor {
+
+ private static final long serialVersionUID = 1L;
+ private static Log log = Log.getLog(ObjectDescriptor.class.getName());
+
+ protected String className = null;
+
+ /** specifies the object reference on which the method will be invoked.
+ * Either className, objectName or a descriptor has to be specified.
+ *
+ * TODO check if this member can be replaced by a RefDescriptor in the factoryDescriptor member.
+ *
+ * */
+ String factoryObjectName = null;
+
+ protected String expr;
+
+ protected String lang;
+
+ /** specifies the object on which to invoke the method.
+ * Either className, objectName or a descriptor has to be specified. */
+ protected Descriptor factoryDescriptor = null;
+
+ protected String methodName = null;
+
+ /** map to db as a component */
+ protected List<ArgDescriptor> argDescriptors = null;
+ /** list of operations to perform during initialization. */
+ protected List<Operation> operations = null;
+
+ /** True if autowiring is enabled. */
+ protected boolean isAutoWireEnabled = false;
+
+ public ObjectDescriptor() {
+ }
+
+ public ObjectDescriptor(String className) {
+ this.className = className;
+ }
+
+ public ObjectDescriptor(Class<?> clazz) {
+ this.className = clazz.getName();
+ }
+
+ /**
+ * This method constructs a new Object from the ObjectDefinition.
+ * This object will be created from a class constructor or from a method invocation.
+ * @throws WireException one of the following exception occurred:
+ * <ul><li>if the object cannot be created (unable to load the specified class or no matching constructor found)</li>
+ * <li>if the invocation of the specified method failed</li>
+ * </ul>
+ * @see ObjectDescriptor
+ */
+ public Object construct(WireContext wireContext) {
+ Object object = null;
+ Class<?> clazz = null;
+
+ if (className!=null) {
+ try {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ clazz = Class.forName(className, true, classLoader);
+ } catch (Exception e) {
+ throw new JbpmClassNotFoundException("couldn't load class "+className, e);
+ }
+
+ if (methodName==null) {
+ // plain instantiation
+ try {
+ Object[] args = getArgs(wireContext, argDescriptors);
+ Constructor<?> constructor = ReflectUtil.findConstructor(clazz, argDescriptors, args);
+ if (constructor==null) {
+ throw new WireException("couldn't find constructor "+clazz.getName()+" with args "+Arrays.toString(args));
+ }
+ object = constructor.newInstance(args);
+ } catch (WireException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new WireException("couldn't create object '"+(name!=null ? name : className)+"': "+e.getMessage(), e);
+ }
+ }
+
+ } else if (factoryObjectName!=null) {
+ // referenced factory object
+ object = wireContext.get(factoryObjectName, false);
+ if (object==null) {
+ throw new WireException("can't invoke method '"+methodName+"' on null, resulted from fetching object '"+factoryObjectName+"' from this wiring environment");
+ }
+
+ } else if (factoryDescriptor!=null) {
+ // factory object descriptor
+ object = wireContext.create(factoryDescriptor, false);
+ if (object==null) {
+ throw new WireException("created factory object is null, can't invoke method '"+methodName+"' on it");
+ }
+ } else if (expr!=null) {
+ ScriptManager scriptManager = ScriptManager.getScriptManager();
+ object = scriptManager.evaluateExpression(expr, lang);
+ }
+
+ if (methodName!=null) {
+ try {
+ object = invokeMethod(methodName, argDescriptors, wireContext, object, clazz);
+
+ } catch (WireException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new WireException("couldn't invoke factory method "+methodName+": "+e.getMessage(), e);
+ }
+ }
+
+ return object;
+ }
+
+ public static Object invokeMethod(String methodName, List<ArgDescriptor> argDescriptors, WireContext wireContext, Object object, Class< ? > clazz) throws Exception {
+ // method invocation on object or static method invocation in case object is null
+ if (object!=null) {
+ clazz = object.getClass();
+ }
+ Object[] args = ObjectDescriptor.getArgs(wireContext, argDescriptors);
+ Method method = ReflectUtil.findMethod(clazz, methodName, argDescriptors, args);
+ if (method==null) {
+ // throw exception but first, generate decent message
+ throw new WireException("method "+ReflectUtil.getSignature(methodName, argDescriptors, args)+" is not available on "+
+ (object!=null ? "object "+object+" ("+clazz.getName()+")" : "class "+clazz.getName()));
+ }
+ if (object == null && (!Modifier.isStatic(method.getModifiers()))) {
+ // A non static method is invoked on a null object
+ throw new WireException("method "+ clazz.getName() + "." + ReflectUtil.getSignature(methodName, argDescriptors, args)+" is not static. It cannot be called on a null object.");
+ }
+ object = ReflectUtil.invoke(method, object, args);
+ return object;
+ }
+
+ /**
+ * Initializes the specified object.
+ * If auto-wiring was set to <code>true</code>, auto-wiring is performed (see {@link #autoWire(Object, WireContext)}). Fields and properties injections are then performed.
+ *
+ */
+ public void initialize(Object object, WireContext wireContext) {
+ try {
+ // specified operations takes precedence over auto-wiring.
+ // e.g. in case there is a collision between
+ // a field or property injection and an autowired value,
+ // the field or property injections should win.
+ // That is why autowiring is done first
+ if (isAutoWireEnabled) {
+ autoWire(object, wireContext);
+ }
+ if (operations!=null) {
+ for(Operation operation: operations) {
+ operation.apply(object, wireContext);
+ }
+ }
+ } catch (Exception e) {
+ throw new WireException("couldn't initialize object '"+(name!=null ? name : className)+"': "+e.getMessage(), e);
+ }
+ }
+
+ public Class<?> getType(WireDefinition wireDefinition) {
+ if (className!=null) {
+ try {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ return Class.forName(className, true, classLoader);
+ } catch (Exception e) {
+ throw new WireException("couldn't load class '"+className+"'", e);
+ }
+ }
+
+ Descriptor descriptor = null;
+ if (factoryDescriptor!=null) {
+ descriptor = factoryDescriptor;
+ } else if (factoryObjectName!=null) {
+ descriptor = wireDefinition.getDescriptor(factoryObjectName);
+ }
+
+ if (descriptor!=null) {
+ Class<?> factoryClass = descriptor.getType(wireDefinition);
+ if (factoryClass!=null) {
+ Method method = ReflectUtil.findMethod(factoryClass, methodName, argDescriptors, null);
+ if (method!=null) {
+ return method.getReturnType();
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Auto wire object present in the context and the specified object's fields.
+ * @param object object on which auto-wiring is performed.
+ * @param wireContext context in which the wiring objects are searched.
+ */
+ protected void autoWire(Object object, WireContext wireContext) {
+ Class<?> clazz = object.getClass();
+ while (clazz!=null) {
+ Field[] declaredFields = clazz.getDeclaredFields();
+ if (declaredFields!=null) {
+ for (Field field: declaredFields) {
+ if (! Modifier.isStatic(field.getModifiers())) {
+ String fieldName = field.getName();
+ Class<?> fieldType = field.getType();
+
+ Object autoWireValue = null;
+ if ("environment".equals(fieldName)) {
+ autoWireValue = EnvironmentImpl.getCurrent();
+
+ } else if ( ("context".equals(fieldName))
+ || ("wireContext".equals(fieldName))
+ ) {
+ autoWireValue = wireContext;
+
+ } else if (wireContext.has(fieldName)) {
+ autoWireValue = wireContext.get(fieldName);
+
+ } else {
+ autoWireValue = wireContext.get(fieldType);
+ }
+ // if auto wire value has not been found in current context,
+ // search in environment
+ if (autoWireValue == null) {
+ EnvironmentImpl currentEnvironment = EnvironmentImpl.getCurrent();
+ if (currentEnvironment != null) {
+ autoWireValue = currentEnvironment.get(fieldName);
+ if (autoWireValue == null) {
+ autoWireValue = currentEnvironment.get(fieldType);
+ }
+ }
+ }
+
+ if (autoWireValue!=null) {
+ try {
+ if (log.isTraceEnabled()) log.trace("auto wiring field "+fieldName+" in "+name);
+ ReflectUtil.set(field, object, autoWireValue);
+ } catch (JbpmException e) {
+ if(e.getCause() instanceof IllegalArgumentException) {
+ log.info("WARNING: couldn't auto wire "+fieldName+" (of type "+fieldType.getName()+") " +
+ "with value "+autoWireValue + " (of type "+autoWireValue.getClass().getName()+")");
+ } else {
+ log.info("WARNING: couldn't auto wire "+fieldName+" with value "+autoWireValue);
+ }
+ }
+ }
+ }
+ }
+ }
+ clazz = clazz.getSuperclass();
+ }
+ }
+
+ /**
+ * Creates a list of arguments (objects) from a list of argument descriptors.
+ * @param wireContext context used to create objects.
+ * @param argDescriptors list of argument descriptors.
+ * @return a list of object created from the descriptors.
+ * @throws Exception
+ */
+ public static Object[] getArgs(WireContext wireContext, List<ArgDescriptor> argDescriptors) throws Exception {
+ Object[] args = null;
+ if (argDescriptors!=null) {
+ args = new Object[argDescriptors.size()];
+ for(int i=0; i<argDescriptors.size(); i++) {
+ ArgDescriptor argDescriptor = argDescriptors.get(i);
+ Object arg;
+ try {
+ arg = wireContext.create(argDescriptor.getDescriptor(), true);
+ args[i] = arg;
+ } catch (RuntimeException e) {
+ // i have made sure that the runtime exception is caught everywhere the getArgs method
+ // is used so that a better descriptive exception can be rethrown
+ throw new Exception("couldn't create argument "+i+": "+e.getMessage(), e);
+ }
+ }
+ }
+ return args;
+ }
+
+ /**
+ * Adds a argument descriptor to the list of arguments descriptor to used when invoking the specified method.
+ * @param argDescriptor argument descriptor to add.
+ */
+ public void addArgDescriptor(ArgDescriptor argDescriptor) {
+ if (argDescriptors==null) {
+ argDescriptors = new ArrayList<ArgDescriptor>();
+ }
+ argDescriptors.add(argDescriptor);
+ }
+
+ /**
+ * Adds an operation to perform during initialization.
+ * @param operation operation to add.
+ */
+ public void addOperation(Operation operation) {
+ if (operations==null) {
+ operations = new ArrayList<Operation>();
+ }
+ operations.add(operation);
+ }
+
+ /** convenience method to add a type based field injection */
+ public void addTypedInjection(String fieldName, Class<?> type) {
+ addInjection(fieldName, new EnvDescriptor(type));
+ }
+
+ /** add a field injection based on a descriptor */
+ public void addInjection(String fieldName, Descriptor descriptor) {
+ FieldOperation injectionOperation = new FieldOperation();
+ injectionOperation.setFieldName(fieldName);
+ injectionOperation.setDescriptor(descriptor);
+ addOperation(injectionOperation);
+ }
+
+ /** add a property injection based on a descriptor */
+ public void addPropertyInjection(String propertyName,
+ Descriptor valueDescriptor) {
+ PropertyOperation operation = new PropertyOperation();
+ operation.setPropertyName(propertyName);
+ operation.setDescriptor(valueDescriptor);
+ addOperation(operation);
+ }
+
+
+ // getters and setters //////////////////////////////////////////////////////
+
+ public String getClassName() {
+ return className;
+ }
+ public void setClassName(String className) {
+ this.className = className;
+ }
+ public List<ArgDescriptor> getArgDescriptors() {
+ return argDescriptors;
+ }
+ public void setArgDescriptors(List<ArgDescriptor> argDescriptors) {
+ this.argDescriptors = argDescriptors;
+ }
+ public List<Operation> getOperations() {
+ return operations;
+ }
+ public void setOperations(List<Operation> operations) {
+ this.operations = operations;
+ }
+ public Descriptor getFactoryDescriptor() {
+ return factoryDescriptor;
+ }
+ public void setFactoryDescriptor(Descriptor factoryDescriptor) {
+ this.factoryDescriptor = factoryDescriptor;
+ }
+ public String getFactoryObjectName() {
+ return factoryObjectName;
+ }
+ public void setFactoryObjectName(String factoryObjectName) {
+ this.factoryObjectName = factoryObjectName;
+ }
+ public String getMethodName() {
+ return methodName;
+ }
+ public void setMethodName(String methodName) {
+ this.methodName = methodName;
+ }
+ public boolean isAutoWireEnabled() {
+ return isAutoWireEnabled;
+ }
+ public void setAutoWireEnabled(boolean isAutoWireEnabled) {
+ this.isAutoWireEnabled = isAutoWireEnabled;
+ }
+ public String getExpr() {
+ return expr;
+ }
+ public void setExpr(String expr) {
+ this.expr = expr;
+ }
+ public String getLang() {
+ return lang;
+ }
+ public void setLang(String lang) {
+ this.lang = lang;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/PatternDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/PatternDescriptor.java
new file mode 100644
index 0000000..a88cc23
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/PatternDescriptor.java
@@ -0,0 +1,69 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import java.util.regex.Pattern;
+
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ * @author Alejandro Guizar
+ */
+public class PatternDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String regex;
+ protected boolean literal;
+ protected boolean canonEq;
+
+ public PatternDescriptor() {
+ }
+
+ public PatternDescriptor(String regex) {
+ this.regex = regex;
+ }
+
+ public boolean isLiteral() {
+ return literal;
+ }
+
+ public void setLiteral(boolean literal) {
+ this.literal = literal;
+ }
+
+ public boolean isCanonEq() {
+ return canonEq;
+ }
+
+ public void setCanonEq(boolean canonEq) {
+ this.canonEq = canonEq;
+ }
+
+ public Object construct(WireContext wireContext) {
+ int flags = 0;
+ if (literal) flags |= Pattern.LITERAL;
+ if (canonEq) flags |= Pattern.CANON_EQ;
+ return Pattern.compile(regex, flags);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ProcessEngineDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ProcessEngineDescriptor.java
new file mode 100644
index 0000000..797475a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ProcessEngineDescriptor.java
@@ -0,0 +1,25 @@
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.cfg.ConfigurationImpl;
+import org.jbpm.pvm.internal.env.EnvironmentFactory;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/** the {@link EnvironmentFactory} of the current {@link WireContext}.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class ProcessEngineDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ protected ConfigurationImpl configuration;
+
+ public ProcessEngineDescriptor(ConfigurationImpl configuration) {
+ this.configuration = configuration;
+ }
+
+ public Object construct(WireContext wireContext) {
+ return configuration.getProducedProcessEngine();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/PropertiesDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/PropertiesDescriptor.java
new file mode 100644
index 0000000..2e6c74d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/PropertiesDescriptor.java
@@ -0,0 +1,122 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Properties;
+
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.WireException;
+
+/**
+ * @author Tom Baeyens
+ */
+public class PropertiesDescriptor extends MapDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String url;
+ protected String file;
+ protected String resource;
+ protected boolean isXml;
+
+ public PropertiesDescriptor() {
+ className = Properties.class.getName();
+ }
+
+ public Object construct(WireContext wireContext) {
+ return new Properties();
+ }
+
+ public void initialize(Object object, WireContext wireContext) {
+ String description = null;
+ try {
+ if (url!=null) {
+ description = "url "+url;
+ InputStream inputStream = new URL(url).openStream();
+ load(object, inputStream);
+ }
+
+ if (file!=null) {
+ description = "file "+file;
+ InputStream inputStream = new FileInputStream(file);
+ load(object, inputStream);
+ }
+
+ if (resource!=null) {
+ description = "resource "+resource;
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ InputStream inputStream = classLoader.getResourceAsStream(resource);
+ if (inputStream==null) {
+ throw new RuntimeException("resource "+resource+" doesn't exist");
+ }
+ load(object, inputStream);
+ }
+
+ } catch (Exception e) {
+ throw new WireException("couldn't read properties from "+description, e);
+ }
+
+ super.initialize(object, wireContext);
+ }
+
+ public Class<?> getType(WireDefinition wireDefinition) {
+ return Properties.class;
+ }
+
+ protected void load(Object object, InputStream inputStream) throws Exception {
+ Properties properties = (Properties) object;
+ if (isXml) {
+ properties.loadFromXML(inputStream);
+ } else {
+ properties.load(inputStream);
+ }
+ }
+
+ public String getFile() {
+ return file;
+ }
+ public void setFile(String file) {
+ this.file = file;
+ }
+ public String getResource() {
+ return resource;
+ }
+ public void setResource(String resource) {
+ this.resource = resource;
+ }
+ public String getUrl() {
+ return url;
+ }
+ public void setUrl(String url) {
+ this.url = url;
+ }
+ public boolean isXml() {
+ return isXml;
+ }
+ public void setXml(boolean isXml) {
+ this.isXml = isXml;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ProvidedObjectDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ProvidedObjectDescriptor.java
new file mode 100644
index 0000000..c1945ea
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ProvidedObjectDescriptor.java
@@ -0,0 +1,81 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class ProvidedObjectDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ Object providedObject;
+ boolean exposeType = false;
+
+ public ProvidedObjectDescriptor() {
+ }
+
+ public ProvidedObjectDescriptor(Object providedObject) {
+ this.providedObject = providedObject;
+ }
+
+ public ProvidedObjectDescriptor(Object providedObject, boolean exposeType) {
+ this.providedObject = providedObject;
+ this.exposeType = exposeType;
+ }
+
+ public ProvidedObjectDescriptor(Object providedObject, boolean exposeType, String name) {
+ this.exposeType = exposeType;
+ this.providedObject = providedObject;
+ this.name = name;
+ }
+
+ public Object construct(WireContext wireContext) {
+ return providedObject;
+ }
+
+ public Class< ? > getType(WireDefinition wireDefinition) {
+ if ( (!exposeType)
+ || (providedObject==null)
+ ) {
+ return null;
+ }
+ return providedObject.getClass();
+ }
+
+ public Object getProvidedObject() {
+ return providedObject;
+ }
+ public void setProvidedObject(Object providedObject) {
+ this.providedObject = providedObject;
+ }
+ public boolean isExposeType() {
+ return exposeType;
+ }
+ public void setExposeType(boolean exposeType) {
+ this.exposeType = exposeType;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ReferenceDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ReferenceDescriptor.java
new file mode 100644
index 0000000..623bcca
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ReferenceDescriptor.java
@@ -0,0 +1,59 @@
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ * <p>This {@link Descriptor} specifies a reference to an object.
+ * The object referenced should be declared somewhere else in the wireContext.</p>
+ *
+ * <p>The constructed object is the referenced object.</p>
+ *
+ * <p>The {@link #init} field can be used to force initialization of the referenced object.</p>
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class ReferenceDescriptor extends AbstractDescriptor implements Descriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ String text = null;
+ String type = null;
+
+ // TODO add a refExpression that is evaluated with el
+ // the base referenced descriptor always should have delayedInitialization = false;
+
+ public ReferenceDescriptor() {
+ }
+
+ public ReferenceDescriptor(String objectName) {
+ setValue(objectName);
+ }
+
+ public Object construct(WireContext wireContext) {
+ if (text!=null) {
+ return wireContext.get(text, isDelayedInitializationAllowed());
+ } else if (type!=null) {
+ try {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ Class<?> clazz = Class.forName(type, true, classLoader);
+ return wireContext.get(clazz);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't load "+type, e);
+ }
+ }
+ return null;
+ }
+
+ public boolean isDelayedInitializationAllowed() {
+ return (init == INIT_EAGER || init == INIT_LAZY);
+ }
+ public void setValue(String objectName) {
+ this.text = objectName;
+ }
+ public void setType(String type) {
+ this.type = type;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/SeamHibernateSessionDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/SeamHibernateSessionDescriptor.java
new file mode 100644
index 0000000..db13968
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/SeamHibernateSessionDescriptor.java
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.hibernate.Session;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+
+/**
+ * @author Tom Baeyens
+ */
+public class SeamHibernateSessionDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ protected String componentName = "hibernateSession";
+
+ public Object construct(WireContext wireContext) {
+ /*
+ return (Session) Component.getInstance(componentName, true);
+ */
+ return null;
+ }
+
+ public Class< ? > getType(WireDefinition wireDefinition) {
+ return Session.class;
+ }
+
+ public void setComponentName(String componentName) {
+ this.componentName = componentName;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/SetDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/SetDescriptor.java
new file mode 100644
index 0000000..dc2d596
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/SetDescriptor.java
@@ -0,0 +1,30 @@
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+/**
+*
+* <p>This {@link Descriptor} creates a {@link Set}.</p>
+*
+* <p>If no specific implementation for the {@link Set} is specified, a {@link HashSet} will be used.
+*
+* <p>Entries can be added during the set initialization.
+* The list of entries is specified with {@link #setValueDescriptors(List)}.</p>
+*
+* @author Tom Baeyens
+* @author Guillaume Porcher (documentation)
+*
+* @see Descriptor
+*/
+public class SetDescriptor extends CollectionDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ public SetDescriptor() {
+ super(HashSet.class.getName());
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ShortDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ShortDescriptor.java
new file mode 100644
index 0000000..5790c4b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/ShortDescriptor.java
@@ -0,0 +1,62 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ * <p>This {@link Descriptor} creates a Short.</p>
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ *
+ * @see Descriptor
+ */
+public class ShortDescriptor extends AbstractDescriptor implements Descriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ protected Long longVal;
+
+ public ShortDescriptor() {
+ }
+
+ public ShortDescriptor(Short value) {
+ setValue(value);
+ }
+
+ public Object construct(WireContext factory) {
+ if (longVal==null) {
+ return null;
+ }
+ return new Short(longVal.shortValue());
+ }
+
+ public void setValue(Short value) {
+ if (value==null) {
+ longVal = null;
+ } else {
+ longVal = new Long(value);
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/StringDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/StringDescriptor.java
new file mode 100644
index 0000000..ee385fa
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/StringDescriptor.java
@@ -0,0 +1,41 @@
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ *
+ * <p>This {@link Descriptor} creates a String.</p>
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ *
+ * @see Descriptor
+ */
+public class StringDescriptor extends AbstractDescriptor implements Descriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ String text;
+
+ public StringDescriptor() {
+ }
+
+ public StringDescriptor(String value) {
+ setValue(value);
+ }
+
+ public StringDescriptor(String name, String value) {
+ setName(name);
+ setValue(value);
+ }
+
+ public Object construct(WireContext factory) {
+ return text;
+ }
+
+ public void setValue(String value) {
+ this.text = value;
+ }
+}
+
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/TransactionRefDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/TransactionRefDescriptor.java
new file mode 100644
index 0000000..e1f0f69
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/TransactionRefDescriptor.java
@@ -0,0 +1,39 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.tx.Transaction;
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ * @author Tom Baeyens
+ */
+public class TransactionRefDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ public Object construct(WireContext wireContext) {
+ return EnvironmentImpl.getCurrent().get(Transaction.class);
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/TrueDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/TrueDescriptor.java
new file mode 100644
index 0000000..5ddca21
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/TrueDescriptor.java
@@ -0,0 +1,36 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ * @author Tom Baeyens
+ */
+public class TrueDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ public Object construct(WireContext wireContext) {
+ return Boolean.TRUE;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/TypesDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/TypesDescriptor.java
new file mode 100644
index 0000000..febc3db
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/TypesDescriptor.java
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import org.jbpm.pvm.internal.type.DefaultTypeSet;
+import org.jbpm.pvm.internal.type.TypeMapping;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+
+/**
+ * @author Tom Baeyens
+ */
+public class TypesDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ DefaultTypeSet defaultTypeSet = new DefaultTypeSet();
+
+ public Object construct(WireContext wireContext) {
+ return defaultTypeSet;
+ }
+
+ public Class< ? > getType(WireDefinition wireDefinition) {
+ return DefaultTypeSet.class;
+ }
+
+ public void addTypeMapping(TypeMapping typeMapping) {
+ defaultTypeSet.addTypeMapping(typeMapping);
+ }
+
+ public DefaultTypeSet getDefaultTypeSet() {
+ return defaultTypeSet;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/UrlDescriptor.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/UrlDescriptor.java
new file mode 100644
index 0000000..68f94f0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/descriptor/UrlDescriptor.java
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.descriptor;
+
+import java.net.URL;
+
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireException;
+
+/**
+ * @author Tom Baeyens
+ */
+public class UrlDescriptor extends AbstractDescriptor {
+
+ private static final long serialVersionUID = 1L;
+
+ String text = null;
+
+ public Object construct(WireContext wireContext) {
+ try {
+ return new URL(text);
+ } catch (Exception e) {
+ throw new WireException("couldn't create URL for text "+text, e);
+ }
+ }
+
+ public void setUrlText(String text) {
+ this.text = text;
+ }
+
+ public void setUrl(URL url) {
+ this.text = url.toString();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/AbstractOperation.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/AbstractOperation.java
new file mode 100644
index 0000000..e7e6c87
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/AbstractOperation.java
@@ -0,0 +1,35 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.operation;
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class AbstractOperation implements Operation {
+
+ protected long dbid;
+ protected int dbversion;
+
+ public long getDbid() {
+ return dbid;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/EnlistOperation.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/EnlistOperation.java
new file mode 100644
index 0000000..f6e76a2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/EnlistOperation.java
@@ -0,0 +1,74 @@
+package org.jbpm.pvm.internal.wire.operation;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.tx.StandardResource;
+import org.jbpm.pvm.internal.tx.StandardTransaction;
+import org.jbpm.pvm.internal.tx.Transaction;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireException;
+
+
+/**
+ * enlists this {@link StandardResource} with the current {@link Transaction}.
+ *
+ * <p>This {@link Operation} specifies that the object on which this operation is applied
+ * should be added as a {@link StandardResource} to the specified {@link Transaction}.
+ * </p>
+ *
+ * <p>property transactionName refers to the objectName of the {@link Transaction}
+ * and it may not be null.
+ * </p>
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class EnlistOperation implements Operation {
+
+ private static final long serialVersionUID = 1L;
+ private static Log log = Log.getLog(EnlistOperation.class.getName());
+
+ String transactionName = null;
+
+ /**
+ * @throws WireException if this operation is applied on an object which is not a resource
+ * or if the specified transaction cannot be found.
+ */
+ public void apply(Object target, WireContext wireContext) {
+ if (! (target instanceof StandardResource)) {
+ throw new WireException("operation enlist can only be applied on objects that implement "+StandardResource.class.getName()+": "+target+(target!=null ? " ("+target.getClass().getName()+")" : ""));
+ }
+
+ Object object = null;
+ if (transactionName!=null) {
+ object = wireContext.get(transactionName);
+ } else {
+ object = wireContext.get(Transaction.class);
+ }
+
+ if ( (object==null)
+ || (! (object instanceof StandardTransaction))
+ ) {
+ throw new WireException("couldn't find "+StandardTransaction.class.getName()+" "+(transactionName!=null ? "'"+transactionName+"'" : "by type")+" to enlist resource "+target);
+ }
+
+ StandardTransaction standardTransaction = (StandardTransaction) object;
+
+ log.trace("enlisting resource "+target+" with transaction");
+ standardTransaction.enlistResource((StandardResource)target);
+ }
+
+ /**
+ * Gets the name of the transaction to which the object should be added.
+ */
+ public String getTransactionName() {
+ return transactionName;
+ }
+
+ /**
+ * Sets the name of the transaction to which the object should be added.
+ * @param transactionName
+ */
+ public void setTransactionName(String transactionName) {
+ this.transactionName = transactionName;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/FieldOperation.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/FieldOperation.java
new file mode 100644
index 0000000..7c2b81a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/FieldOperation.java
@@ -0,0 +1,83 @@
+package org.jbpm.pvm.internal.wire.operation;
+
+import java.lang.reflect.Field;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.util.ReflectUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireException;
+
+
+/**
+ * injects another object into a field.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ *
+ */
+public class FieldOperation extends AbstractOperation {
+
+ private static final long serialVersionUID = 1L;
+
+ String fieldName = null;
+ Descriptor descriptor = null;
+
+ transient Field field = null;
+
+ public FieldOperation() {
+ }
+
+ public void apply(Object target, WireContext wireContext) {
+ if (target!=null) {
+
+ // Get field
+ synchronized(this) {
+ if (field==null) {
+ Class<?> clazz = target.getClass();
+ field = ReflectUtil.findField(clazz, fieldName);
+ }
+ }
+
+ // Create value
+ Object value = wireContext.create(descriptor, true);
+ // Set the field value
+ try {
+ ReflectUtil.set(field, target, value);
+ } catch (Exception e) {
+ throw new WireException("couldn't set "+fieldName+" to "+value, e);
+ }
+ }
+ }
+
+ /**
+ * Gets the name of the field that should be updated by this operation.
+ */
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ /**
+ * Sets the name of the field that should be updated by this operation.
+ * @param fieldName
+ */
+ public synchronized void setFieldName(String fieldName) {
+ this.fieldName = fieldName;
+ }
+
+ /**
+ * Gets the descriptor used to create the field's value.
+ */
+ public Descriptor getDescriptor() {
+ return descriptor;
+ }
+ /**
+ * Sets the descriptor used to create the field's value
+ * @param valueDescriptor
+ */
+ public synchronized void setDescriptor(Descriptor valueDescriptor) {
+ this.descriptor = valueDescriptor;
+ }
+
+ private static Log log = Log.getLog(FieldOperation.class.getName());
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/InvokeOperation.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/InvokeOperation.java
new file mode 100644
index 0000000..c9701d0
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/InvokeOperation.java
@@ -0,0 +1,85 @@
+package org.jbpm.pvm.internal.wire.operation;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jbpm.pvm.internal.util.ReflectUtil;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireException;
+import org.jbpm.pvm.internal.wire.descriptor.ArgDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+
+/**
+ * invokes a method.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ * @see ArgDescriptor
+ * @see ObjectDescriptor
+ */
+
+public class InvokeOperation extends AbstractOperation {
+
+ private static final long serialVersionUID = 1L;
+
+ /** name of the method to invoke. */
+ String methodName = null;
+ /** list of descriptors for creating arguments supplied to the method */
+ List<ArgDescriptor> argDescriptors = null;
+
+ public void apply(Object target, WireContext wireContext) {
+ try {
+ Object[] args = ObjectDescriptor.getArgs(wireContext, argDescriptors);
+ Class<?> clazz = target.getClass();
+ Method method = ReflectUtil.findMethod(clazz, methodName, argDescriptors, args);
+ if (method==null) {
+ throw new WireException("method "+ReflectUtil.getSignature(methodName, argDescriptors, args)+" unavailable");
+ }
+ ReflectUtil.invoke(method, target, args);
+ } catch (WireException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new WireException("couldn't invoke method "+methodName+": "+e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Adds a descriptor to the list of arguments descriptors.
+ */
+ public void addArgDescriptor(ArgDescriptor argDescriptor) {
+ if (argDescriptors==null) {
+ argDescriptors = new ArrayList<ArgDescriptor>();
+ }
+ argDescriptors.add(argDescriptor);
+ }
+
+ /**
+ * Gets the name of the method to invoke.
+ */
+ public String getMethodName() {
+ return methodName;
+ }
+
+ /**
+ * Sets the name of the method to invoke.
+ * @param methodName the name of the method to invoke.
+ */
+ public synchronized void setMethodName(String methodName) {
+ this.methodName = methodName;
+ }
+
+ /**
+ * Gets the list of descriptor to create arguments supplied to the method .
+ */
+ public List<ArgDescriptor> getArgDescriptors() {
+ return argDescriptors;
+ }
+
+ /**
+ * Sets the list of descriptor to create arguments supplied to the method .
+ */
+ public void setArgDescriptors(List<ArgDescriptor> argDescriptors) {
+ this.argDescriptors = argDescriptors;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/MethodInvokerListener.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/MethodInvokerListener.java
new file mode 100644
index 0000000..f50f5b7
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/MethodInvokerListener.java
@@ -0,0 +1,70 @@
+package org.jbpm.pvm.internal.wire.operation;
+
+import java.io.Serializable;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.util.Listener;
+import org.jbpm.pvm.internal.util.Observable;
+import org.jbpm.pvm.internal.util.ReflectUtil;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireException;
+import org.jbpm.pvm.internal.wire.descriptor.ArgDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+
+
+/**
+ * Wrapper for the subscribe operation.
+ * This class will be used to call a specified method on reception of an event.
+ * This class is used so that a non {@link Listener} class can subscribe to an {@link Observable} object.
+ *
+ * @see SubscribeOperation
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (Documentation)
+ */
+public class MethodInvokerListener implements Listener, Serializable {
+
+ private static final long serialVersionUID = 1L;
+ private static Log log = Log.getLog(MethodInvokerListener.class.getName());
+
+ String methodName;
+ List<ArgDescriptor> argDescriptors = null;
+ WireContext wireContext;
+ Object target;
+
+ transient Method method = null;
+
+ /**
+ * Creates a new Wrapper.
+ * When an event is received, the arguments <code>args</code> are created from the list <code>argDescriptors</code>, and <code>target.methodName(args)</code> is called.
+ * @param methodName name of the method to call when an event is received.
+ * @param argDescriptors list of descriptors of arguments given to the method.
+ * @param wireContext context to use to create the arguments
+ * @param target object on which the method will be called.
+ */
+ public MethodInvokerListener(String methodName, List<ArgDescriptor> argDescriptors, WireContext wireContext, Object target) {
+ this.methodName = methodName;
+ this.argDescriptors = argDescriptors;
+ this.wireContext = wireContext;
+ this.target = target;
+ }
+
+ public void event(Object source, String eventName, Object info) {
+ log.debug("invoking "+methodName+" on "+target+" for event "+eventName);
+ try {
+ Object[] args = ObjectDescriptor.getArgs(wireContext, argDescriptors);
+ Class<?> clazz = target.getClass();
+ Method method = ReflectUtil.findMethod(clazz, methodName, argDescriptors, args);
+ if(method == null) {
+ throw new WireException("method "+ReflectUtil.getSignature(methodName, argDescriptors, args)+" unavailable for "+target);
+ }
+ ReflectUtil.invoke(method, target, args);
+ } catch (WireException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new WireException("couldn't invoke listener method "+methodName+": "+e.getMessage(), e);
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/Operation.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/Operation.java
new file mode 100644
index 0000000..1125c84
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/Operation.java
@@ -0,0 +1,18 @@
+package org.jbpm.pvm.internal.wire.operation;
+
+import java.io.Serializable;
+
+import org.jbpm.pvm.internal.wire.WireContext;
+
+/**
+ * any field update or method invocation after the construction of an object.
+ */
+public interface Operation extends Serializable {
+
+ /**
+ * Apply this operation to the specified object, defined in the specified {@link WireContext}.
+ * @param target object on which the operation should be performed.
+ * @param wireContext context in which the operation is applied.
+ */
+ void apply(Object target, WireContext wireContext);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/PropertyOperation.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/PropertyOperation.java
new file mode 100644
index 0000000..69ddfcf
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/PropertyOperation.java
@@ -0,0 +1,77 @@
+package org.jbpm.pvm.internal.wire.operation;
+
+import java.lang.reflect.Method;
+
+import org.jbpm.pvm.internal.util.ReflectUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireException;
+
+/**
+ * injects another object with a setter method.
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ *
+ */
+public class PropertyOperation extends AbstractOperation {
+
+ private static final long serialVersionUID = 1L;
+
+ String setterName = null;
+ /* the method will be searched by reflection on the runtime value */
+ Descriptor descriptor = null;
+
+ public void apply(Object target, WireContext wireContext) {
+ // create the value to assign to the property
+ Object value = wireContext.create(descriptor, true);
+ Method method = null;
+ Class<?> clazz = target.getClass();
+ Object[] args = new Object[]{value};
+ method = ReflectUtil.findMethod(clazz, setterName, null, args);
+ if (method==null) {
+ throw new WireException("couldn't find property setter "+setterName+" for value "+value);
+ }
+ ReflectUtil.invoke(method, target, args);
+ }
+
+ /**
+ * Sets the name of the property that should be updated by this operation.
+ * If propertyName is <code>foo</code>, the method used to set the value will be <code>setFoo</code>.
+ * @param propertyName
+ */
+ public void setPropertyName(String propertyName) {
+ this.setterName = "set"+propertyName.substring(0,1).toUpperCase()+propertyName.substring(1);
+ }
+
+ /**
+ * Gets the name of the setter method used to inject the property value.
+ * @return name of the setter method used to inject the property value.
+ */
+ public String getSetterName() {
+ return setterName;
+ }
+
+ /**
+ * Sets the name of the setter method to use to inject the property value.
+ * @param setterName
+ */
+ public void setSetterName(String setterName) {
+ this.setterName = setterName;
+ }
+
+ /**
+ * Gets the descriptor used to create the field's value.
+ */
+ public Descriptor getDescriptor() {
+ return descriptor;
+ }
+
+ /**
+ * Sets the descriptor used to create the field's value
+ * @param valueDescriptor
+ */
+ public void setDescriptor(Descriptor valueDescriptor) {
+ this.descriptor = valueDescriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/SubscribeOperation.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/SubscribeOperation.java
new file mode 100644
index 0000000..7525d79
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/operation/SubscribeOperation.java
@@ -0,0 +1,227 @@
+package org.jbpm.pvm.internal.wire.operation;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.Context;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
+import org.jbpm.pvm.internal.util.FilterListener;
+import org.jbpm.pvm.internal.util.Listener;
+import org.jbpm.pvm.internal.util.Observable;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.WireException;
+import org.jbpm.pvm.internal.wire.descriptor.ArgDescriptor;
+
+
+/**
+ * subscribes to an {@link Observable observable}.
+ *
+ * <p>The target object can be a {@link Listener}
+ * or a specific method to call can be specified (by {@link #setMethodName(String)})</p>
+ *
+ * <p>The event can be filtered by specifying a {@link Context} (with {@link #setContextName(String)}),
+ * objects to observe (with {@link #setObjectNames(List)}) and events to observe
+ * (with {@link #setEventNames(List)}). If the objects or events are not specified,
+ * then all objects and events are observed.</p>
+ *
+ * <p>The {@link #setWireEvents(boolean)} specifies if the object or the {@link Descriptor} events
+ * should be observed.</p>
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ *
+ */
+public class SubscribeOperation implements Operation {
+
+ private static final long serialVersionUID = 1L;
+ private static Log log = Log.getLog(SubscribeOperation.class.getName());
+
+ String contextName = null;
+ List<String> eventNames = null;
+
+ boolean wireEvents = false;
+ List<String> objectNames = null;
+ String methodName = null;
+ List<ArgDescriptor> argDescriptors = null;
+
+ public void apply(Object target, WireContext targetWireContext) {
+ Listener listener = null;
+
+ // if a method has to be invoked, rather then using the observable interface
+ if (methodName!=null) {
+ listener = new MethodInvokerListener(
+ methodName,
+ argDescriptors,
+ targetWireContext,
+ target
+ );
+ } else {
+ try {
+ listener = (Listener) target;
+ } catch (ClassCastException e) {
+ throw new WireException("couldn't subscribe object "+target+ " because it is not a Listener");
+ }
+ }
+
+ // if there is a filter specified on the event names
+ if ( (eventNames!=null)
+ && (! eventNames.isEmpty())
+ ) {
+ listener = new FilterListener(listener, eventNames);
+ }
+
+ // identify the wireContext
+ WireContext wireContext = null;
+ if (contextName!=null) {
+ EnvironmentImpl environment = EnvironmentImpl.getCurrent();
+ if (environment!=null) {
+ try {
+ wireContext = (WireContext) environment.getContext(contextName);
+ if (wireContext==null) {
+ throw new WireException("couldn't subscribe because context "+contextName+" doesn't exist");
+ }
+ } catch (ClassCastException e) {
+ throw new WireException("couldn't subscribe because context "+contextName+" is not a WireContext", e);
+ }
+ } else {
+ throw new WireException("couldn't get context "+contextName+" for subscribe because no environment available in context "+targetWireContext);
+ }
+ } else {
+ wireContext = targetWireContext;
+ }
+
+ if (wireEvents) {
+ WireDefinition wireDefinition = wireContext.getWireDefinition();
+
+ // if there are objectNames specified
+ if (objectNames!=null) {
+ // subscribe to the descriptors for the all objectNames
+ for (String objectName: objectNames) {
+ Descriptor descriptor = wireDefinition.getDescriptor(objectName);
+ subscribe(listener, descriptor);
+ }
+
+ // if no objectNames are specified, subscribe to all the descriptors
+ } else {
+ Set<Descriptor> descriptors = new HashSet<Descriptor>(wireDefinition.getDescriptors().values());
+ for(Descriptor descriptor: descriptors) {
+ subscribe(listener, descriptor);
+ }
+ }
+
+ } else if ( (objectNames!=null)
+ && (!objectNames.isEmpty())
+ ) {
+ // for every objectName
+ for (String objectName: objectNames) {
+ // subscribe to the objects themselves
+ Object object = wireContext.get(objectName);
+ if (object==null) {
+ throw new WireException("couldn't subscribe to object in context "+wireContext.getName()+": object "+objectName+" unavailable");
+ }
+ if (! (object instanceof Observable)) {
+ throw new WireException("couldn't subscribe to object in context "+wireContext.getName()+": object "+objectName+" ("+object.getClass().getName()+") isn't "+Observable.class.getName());
+ }
+ subscribe(listener, (Observable)object);
+ }
+
+ } else {
+ // subscribe to the context
+ subscribe(listener, wireContext);
+ }
+ }
+
+ void subscribe(Listener listener, Observable observable) {
+ log.trace("adding "+listener+" as listener to "+observable);
+ observable.addListener(listener);
+ }
+
+
+ /**
+ * Gets the list of argDescriptor used to create the arguments given to the method (only if a specific method has to be called).
+ */
+ public List<ArgDescriptor> getArgDescriptors() {
+ return argDescriptors;
+ }
+ /**
+ * Sets the list of argDescriptor used to create the arguments given to the method.
+ */
+ public void setArgDescriptors(List<ArgDescriptor> argDescriptors) {
+ this.argDescriptors = argDescriptors;
+ }
+
+ /**
+ * Gets the list of events to listen to.
+ */
+ public List<String> getEventNames() {
+ return eventNames;
+ }
+ /**
+ * Sets the list of events to listen to.
+ */
+ public void setEventNames(List<String> eventNames) {
+ this.eventNames = eventNames;
+ }
+
+ /**
+ * Gets the name of the method to invoke when an event is received.
+ */
+ public String getMethodName() {
+ return methodName;
+ }
+
+ /**
+ * Sets the name of the method to invoke when an event is received.
+ */
+ public void setMethodName(String methodName) {
+ this.methodName = methodName;
+ }
+
+ /**
+ * Gets the name of the WireContext where the Observable should be found.
+ */
+ public String getContextName() {
+ return contextName;
+ }
+
+ /**
+ * Sets the name of the WireContext where the Observable should be found.
+ */
+ public void setContextName(String contextName) {
+ this.contextName = contextName;
+ }
+
+ /**
+ * Gets the list of name of the Observable objects to observe.
+ */
+ public List<String> getObjectNames() {
+ return objectNames;
+ }
+
+ /**
+ * Sets the list of name of the Observable objects to observe.
+ */
+ public void setObjectNames(List<String> objectNames) {
+ this.objectNames = objectNames;
+ }
+
+ /**
+ * <p><code>true</code> if the target object will listen to Descriptor related events.</p>
+ * <p><code>false</code> if the target object will listen to the object instance events.</p>
+ */
+ public boolean isWireEvents() {
+ return wireEvents;
+ }
+ /**
+ * Sets if the object should listen to descriptor events or to events fired by the named object.
+ * <p><code>true</code> if the target object will listen to Descriptor related events.</p>
+ * <p><code>false</code> if the target object will listen to the object instance events.</p>
+ */
+ public void setWireEvents(boolean wireEvents) {
+ this.wireEvents = wireEvents;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/package.html b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/package.html
new file mode 100644
index 0000000..0ffb99b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/package.html
@@ -0,0 +1,3 @@
+<body>
+wire context (aka IoC container), start reading {@link org.jbpm.pvm.internal.wire.WireContext}.
+</body>
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/usercode/UserCodeActivityBehaviour.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/usercode/UserCodeActivityBehaviour.java
new file mode 100644
index 0000000..8412dd4
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/usercode/UserCodeActivityBehaviour.java
@@ -0,0 +1,52 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.usercode;
+
+import java.util.Map;
+
+import org.jbpm.api.activity.ActivityBehaviour;
+import org.jbpm.api.activity.ActivityExecution;
+import org.jbpm.api.activity.ExternalActivityBehaviour;
+
+/**
+ * @author Tom Baeyens
+ */
+public class UserCodeActivityBehaviour implements ExternalActivityBehaviour {
+
+ private static final long serialVersionUID = 1L;
+
+ protected UserCodeReference customActivityReference;
+
+ public void execute(ActivityExecution execution) throws Exception {
+ ActivityBehaviour activityBehaviour = (ActivityBehaviour) customActivityReference.getObject(execution);
+ activityBehaviour.execute(execution);
+ }
+
+ public void signal(ActivityExecution execution, String signalName, Map<String, ? > parameters) throws Exception {
+ ExternalActivityBehaviour externalActivityBehaviour = (ExternalActivityBehaviour) customActivityReference.getObject(execution);
+ externalActivityBehaviour.signal(execution, signalName, parameters);
+ }
+
+ public void setCustomActivityReference(UserCodeReference customActivityReference) {
+ this.customActivityReference = customActivityReference;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/usercode/UserCodeCondition.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/usercode/UserCodeCondition.java
new file mode 100644
index 0000000..5831572
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/usercode/UserCodeCondition.java
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.usercode;
+
+import org.jbpm.api.model.OpenExecution;
+import org.jbpm.pvm.internal.model.Condition;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class UserCodeCondition implements Condition {
+
+ private static final long serialVersionUID = 1L;
+
+ protected UserCodeReference conditionReference;
+
+ public boolean evaluate(OpenExecution execution) {
+ Condition condition = (Condition) conditionReference.getObject(execution);
+ return condition.evaluate(execution);
+ }
+
+ public void setConditionReference(UserCodeReference conditionReference) {
+ this.conditionReference = conditionReference;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/usercode/UserCodeEventListener.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/usercode/UserCodeEventListener.java
new file mode 100644
index 0000000..96ca565
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/usercode/UserCodeEventListener.java
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.usercode;
+
+import org.jbpm.api.listener.EventListener;
+import org.jbpm.api.listener.EventListenerExecution;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class UserCodeEventListener implements EventListener {
+
+ private static final long serialVersionUID = 1L;
+
+ protected UserCodeReference eventListenerReference;
+
+ public void notify(EventListenerExecution execution) throws Exception {
+ EventListener eventListener = (EventListener) eventListenerReference.getObject(execution);
+ String variable = (String) execution.getVariable("revoke");
+ if(variable==null||!"revoke".equals(variable)){
+ eventListener.notify(execution);
+ }
+ }
+
+ public void setEventListenerReference(UserCodeReference eventListenerReference) {
+ this.eventListenerReference = eventListenerReference;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/usercode/UserCodeReference.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/usercode/UserCodeReference.java
new file mode 100644
index 0000000..2ddf7d1
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/usercode/UserCodeReference.java
@@ -0,0 +1,97 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.usercode;
+
+import java.io.Serializable;
+
+import org.jbpm.api.Execution;
+import org.jbpm.pvm.internal.model.ActivityImpl;
+import org.jbpm.pvm.internal.model.ExecutionImpl;
+import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.model.TransitionImpl;
+import org.jbpm.pvm.internal.util.ReflectUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class UserCodeReference implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ protected boolean isCached = true;
+ protected Object cachedObject;
+ protected Descriptor descriptor;
+
+ public Object getObject(Execution execution) {
+ return getObject(null, execution);
+ }
+
+ public Object getObject(ProcessDefinitionImpl processDefinition) {
+ return getObject(processDefinition, null);
+ }
+
+ protected Object getObject(ProcessDefinitionImpl processDefinition, Execution execution) {
+ if (cachedObject!=null) {
+ return cachedObject;
+ }
+ if (descriptor!=null) {
+ if (processDefinition==null) {
+ processDefinition = getProcessDefinition(execution);
+ }
+
+ Object usedObject = ReflectUtil.instantiateUserCode(descriptor, processDefinition);
+ if (isCached) {
+ cachedObject = usedObject;
+ }
+ return usedObject;
+ }
+ return null;
+ }
+
+ protected ProcessDefinitionImpl getProcessDefinition(Execution execution) {
+ ProcessDefinitionImpl processDefinition = null;
+ ExecutionImpl executionImpl = (ExecutionImpl) execution;
+ ActivityImpl activity = executionImpl.getActivity();
+ TransitionImpl transition = executionImpl.getTransition();
+ if (activity!=null) {
+ processDefinition = activity.getProcessDefinition();
+ }
+ if ( (processDefinition==null)
+ && (transition!=null)
+ ) {
+ processDefinition = transition.getProcessDefinition();
+ }
+ return processDefinition;
+ }
+
+ public void setCached(boolean isCached) {
+ this.isCached = isCached;
+ }
+ public void setDescriptor(Descriptor descriptor) {
+ this.descriptor = descriptor;
+ }
+ public Descriptor getDescriptor() {
+ return descriptor;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/wirecontext.gif b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/wirecontext.gif
new file mode 100644
index 0000000..9c8662f
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/wirecontext.gif
Binary files differ
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/xml/BindingParser.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/xml/BindingParser.java
new file mode 100644
index 0000000..94cb640
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/xml/BindingParser.java
@@ -0,0 +1,66 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.wire.xml;
+
+import java.util.List;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.xml.Binding;
+import org.jbpm.pvm.internal.xml.Bindings;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+public class BindingParser extends Parser {
+
+ private static final Log log = Log.getLog(BindingParser.class.getName());
+
+ public Object parseDocumentElement(Element documentElement, Parse parse) {
+ List<Element> elements = XmlUtil.elements(documentElement, "binding");
+ for (Element bindingElement : elements) {
+ String bindingClassName = XmlUtil.attribute(bindingElement, "class");
+
+ log.trace("adding wire binding for "+bindingClassName);
+
+ Binding binding = null;
+ if (bindingClassName!=null) {
+ try {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ Class<?> bindingClass = Class.forName(bindingClassName, true, classLoader);
+ binding = (Binding) bindingClass.newInstance();
+ } catch (Exception e) {
+ log.trace("couldn't instantiate binding "+bindingClassName);
+ }
+ } else {
+ parse.addProblem("class is a required attribute in a binding "+XmlUtil.toString(bindingElement), documentElement);
+ }
+
+ if (binding!=null) {
+ Bindings bindings = parse.contextStackFind(Bindings.class);
+ bindings.addBinding(binding);
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/xml/WireParser.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/xml/WireParser.java
new file mode 100644
index 0000000..715e06b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/wire/xml/WireParser.java
@@ -0,0 +1,295 @@
+package org.jbpm.pvm.internal.wire.xml;
+
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.List;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.WireDefinition;
+import org.jbpm.pvm.internal.wire.binding.ByteBinding;
+import org.jbpm.pvm.internal.wire.binding.CharBinding;
+import org.jbpm.pvm.internal.wire.binding.ClassBinding;
+import org.jbpm.pvm.internal.wire.binding.DoubleBinding;
+import org.jbpm.pvm.internal.wire.binding.FloatBinding;
+import org.jbpm.pvm.internal.wire.binding.IntBinding;
+import org.jbpm.pvm.internal.wire.binding.ListBinding;
+import org.jbpm.pvm.internal.wire.binding.MapBinding;
+import org.jbpm.pvm.internal.wire.binding.NullBinding;
+import org.jbpm.pvm.internal.wire.binding.ObjectBinding;
+import org.jbpm.pvm.internal.wire.binding.RefBinding;
+import org.jbpm.pvm.internal.wire.binding.SetBinding;
+import org.jbpm.pvm.internal.wire.binding.StringBinding;
+import org.jbpm.pvm.internal.wire.descriptor.AbstractDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.xml.Bindings;
+import org.jbpm.pvm.internal.xml.Parse;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.w3c.dom.Element;
+
+/**
+ * parses object wiring xml and constructs a WireDefinition.
+ *
+ * <p>To learn the full XML syntax, check out the xsd docs
+ * </p>
+ * <ul><li>To describe an object:<br/>
+ * <ul>
+ * <li><b><code><object .../></code></b>: see {@link ObjectBinding}</li>
+ * </ul></li>
+ * <li>To describe basic types:<br/>
+ * <ul>
+ * <li><b><code><boolean .../></code>, <code><true /></code> and <code><false/></code></b>: see {@link BooleanBinding}</li>
+ * <li><b><code><byte .../></code></b>: see {@link ByteBinding}</li>
+ * <li><b><code><char .../></code></b>: see {@link CharBinding}</li>
+ * <li><b><code><double .../></code></b>: see {@link DoubleBinding}</li>
+ * <li><b><code><float .../></code></b>: see {@link FloatBinding}</li>
+ * <li><b><code><int .../></code></b>: see {@link IntBinding}</li>
+ * <li><b><code><string .../></code></b>: see {@link StringBinding}</li>
+ * </ul></li>
+ * <li>To describe collections:<br/>
+ * <ul>
+ * <li><b><code><map .../></code></b>: see {@link MapBinding}</li>
+ * <li><b><code><set .../></code></b>: see {@link SetBinding}</li>
+ * <li><b><code><list .../></code></b>: see {@link ListBinding}</li>
+ * </ul></li>
+ * <li>Others:<br/>
+ * <ul>
+ * <li><b><code><class .../></code></b>: see {@link ClassBinding}</li>
+ * <li><b><code><ref .../></code></b>: see {@link RefBinding}</li>
+ * <li><b><code><null .../></code></b>: see {@link NullBinding}</li>
+ * </ul></li>
+ * </ul>
+ *
+ * <h3>Bindings</h3>
+ *
+ * <p>The defaults bindings for the Wiring XML are divided in two categories:
+ * </p>
+ *
+ * <ul>
+ * <li>Descriptors, registered with the {@link #CATEGORY_DESCRIPTOR} category</li>
+ * <li>Operations, registered with the {@link #CATEGORY_OPERATION} category</li>
+ * </ul>
+ *
+ * <p>Once a parser is created, bindings can be added, overwritten and removed
+ * to customize that parser instance.
+ * </p>
+ *
+ * <h3 id='args'>Describing arguments</h3>
+ *
+ * <p>An ArgDescriptor is defined by a <b><code><arg></code></b> xml element.</p>
+ *
+ * <p>This element can have an attribute "type", which specifies name of the argument's type.</p>
+ * <p>This element contains <b>one</b> child element that defines a {@link Descriptor}. This descriptor specifies the value to give to the argument.</p>
+ *
+ * <h4>Example</h4>
+ *
+ * Consider the following class:
+ * <pre> public class Hello {
+ * public static String sayHello(String name) {
+ * return "Hello " + name + " !";
+ * }
+ * }</pre>
+ *
+ * The following Xml declaration will create an object 's' of class 'String' (see {@link ObjectDescriptor}).
+ * This object is created by invoking <code>Hello.sayHello</code> with the value <code>world</code> as a parameter.
+ *
+ * <pre> <objects>
+ * <object name="s" class='Hello' method='sayHello'>
+ * <arg>
+ * <string value='world' />
+ * </arg>
+ * </object>
+ * </objects></pre>
+ *
+ * The created object 's' will be a String, containing "Hello world !".
+ *
+ * <h3 id='init'>Initialization</h3>
+ *
+ * <p>The initialization method can be defined with the <code>init</code> attribute.
+ * For more details on how initialization works, see section 'Initialization' of {@link WireContext}.</p>
+ *
+ * The <code>init</code> attribute can have these values:
+ * <ul>
+ * <li><code>lazy</code>: for lazy creation and delayed initialization</li>
+ * <li><code>required</code>: for lazy creation and immediate initialization</li>
+ * <li><code>eager</code>: for eager creation and delayed initialization</li>
+ * <li><code>immediate</code>: for eager creation and immediate initialization</li>
+ * </ul>
+ *
+ * @author Tom Baeyens
+ * @author Guillaume Porcher (documentation)
+ */
+public class WireParser extends Parser {
+
+ public static final String[] DEFAULT_WIRE_BINDING_RESOURCES = new String[]{
+ "jbpm.wire.bindings.xml",
+ "jbpm.user.wire.bindings.xml"
+ };
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Log log = Log.getLog(WireParser.class.getName());
+
+ public static final String CATEGORY_DESCRIPTOR = "descriptor";
+ public static final String CATEGORY_OPERATION = "operation";
+ public static final String CATEGORY_INTERCEPTOR = "interceptor";
+
+ /** static instance of WireParser */
+ private static WireParser instance;
+ /** default bindings for handling wiring xml elements. */
+ private static Bindings defaultBindings; // initialized at the bottom of this file
+
+ /**
+ * Constructs a new WireParser with the default bindings.
+ */
+ public WireParser() {
+ super(defaultBindings);
+ }
+
+ /**
+ * Default method to get an instance of the WireParser
+ * @return the static instance of WireParser
+ */
+ public static synchronized WireParser getInstance() {
+ if (instance==null) {
+ instance = new WireParser();
+ }
+ return instance;
+ }
+
+ /**
+ * Convenience method to parse a wiring xml.
+ * @param xmlString the xml string to parse
+ * @return the WireDefinition created by parsing the xml given in input.
+ * @see #parseXmlString(String)
+ */
+ public static WireDefinition parseXmlString(String xmlString) {
+ return (WireDefinition) getInstance()
+ .createParse()
+ .setString(xmlString)
+ .execute()
+ .checkErrors("wire definition xml string")
+ .getDocumentObject();
+ }
+
+ // document element parsing /////////////////////////////////////////////////
+
+ /**
+ * This method builds the WireDefinition from the DOM tree.
+ * This methods parses all child activities of the documentElement that correspond to a Descriptor definition.
+ * @param documentElement the root element of the document
+ * @param parse Parse object that contains all information for the current parse operation.
+ * @return an instance of WireDefinition containing the resulting WireDefinition.
+ * @see Parser#parseDocumentElement(Element, Parse)
+ */
+ public Object parseDocumentElement(Element documentElement, Parse parse) {
+ List<Element> elements = XmlUtil.elements(documentElement);
+
+
+ WireDefinition wireDefinition = parse.contextStackFind(WireDefinition.class);
+ if (wireDefinition==null) {
+ wireDefinition = new WireDefinition();
+ }
+
+ parse.contextStackPush(wireDefinition);
+ try {
+ for (Element descriptorElement: elements) {
+ Descriptor descriptor = (Descriptor) parseElement(descriptorElement, parse, CATEGORY_DESCRIPTOR);
+
+ // add the descriptor
+ if ( (wireDefinition!=null)
+ && (descriptor!=null)
+ ) {
+ wireDefinition.addDescriptor(descriptor);
+ }
+ }
+ } finally {
+ parse.contextStackPop();
+ }
+
+ return wireDefinition;
+ }
+
+ /**
+ * This method parses an arbitrary element in the document based on the bindings in the given category.
+ * This method calls the {@link Parser#parseElement(Element, Parse, String)} method to build the resulting object.
+ * If the resulting object is a subclass of {@link AbstractDescriptor}, the related fields are initialized.
+ *
+ * @param element the element to parse
+ * @param parse Parse object that contains all information for the current parse operation.
+ * @param category is the category in which the tagName should be resolved to an ElementHandler.
+ * If category is null, all the categories will be scanned for an appropriate binding in random order.
+ * @return the java object created from the DOM element
+ */
+ public Object parseElement(Element element, Parse parse, String category) {
+ if (element==null) return null;
+ Object object = super.parseElement(element, parse, category);
+ if ( (object!=null)
+ && (object instanceof Descriptor)
+ ) {
+
+ Descriptor descriptor = (Descriptor) object;
+
+ if (descriptor instanceof AbstractDescriptor) {
+ AbstractDescriptor abstractDescriptor = (AbstractDescriptor) descriptor;
+ if(element.hasAttribute("name")){
+ String name = element.getAttribute("name");
+ // get the name
+ abstractDescriptor.setName(name);
+ }
+
+ if (element.hasAttribute("init")) {
+ // get the init
+ String initText = element.getAttribute("init");
+
+ if("eager".equalsIgnoreCase(initText)){
+ abstractDescriptor.setInit(AbstractDescriptor.INIT_EAGER);
+ }else if("immediate".equalsIgnoreCase(initText)){
+ abstractDescriptor.setInit(AbstractDescriptor.INIT_IMMEDIATE);
+ } else if("required".equalsIgnoreCase(initText)){
+ abstractDescriptor.setInit(AbstractDescriptor.INIT_REQUIRED);
+ } else {
+ // init='lazy' or default value
+ abstractDescriptor.setInit(AbstractDescriptor.INIT_LAZY);
+ }
+ }
+ }
+ }
+ return object;
+ }
+
+ // other methods ////////////////////////////////////////////////////////////
+
+ static {
+ // default descriptor parsers ///////////////////////////////////////////////
+ defaultBindings = new Bindings();
+
+ BindingParser bindingParser = new BindingParser();
+
+ for (String wireResource: DEFAULT_WIRE_BINDING_RESOURCES) {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ Enumeration<URL> resourceUrls;
+ try {
+ resourceUrls = classLoader.getResources(wireResource);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't get resource urls for "+wireResource, e);
+ }
+ if (resourceUrls.hasMoreElements()) {
+ while (resourceUrls.hasMoreElements()) {
+ URL resourceUrl = resourceUrls.nextElement();
+ log.trace("loading wire bindings from resource: "+resourceUrl);
+ bindingParser.createParse()
+ .setUrl(resourceUrl)
+ .contextStackPush(defaultBindings)
+ .execute()
+ .checkErrors(resourceUrl.toString());
+ }
+ } else {
+ log.trace("skipping unavailable wire bindings resource "+wireResource);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Binding.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Binding.java
new file mode 100644
index 0000000..f80c6aa
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Binding.java
@@ -0,0 +1,46 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.xml;
+
+import org.w3c.dom.Element;
+
+/** a modular mapping between an xml element and a java object in the
+ * domain model, see also {@link Parser}.
+ *
+ * <a href="./Parser.html#bindings">See also 'Bindings'</a>.
+ *
+ * @see Parser
+ */
+public interface Binding {
+
+ String getCategory();
+
+ /** does this binding apply to the given element? */
+ boolean matches(Element element);
+
+ /** translates the given element into a domain model java object.
+ * Use the parse to report problems.
+ * @return the domain model java object.
+ * @see Parser
+ */
+ Object parse(Element element, Parse parse, Parser parser);
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Bindings.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Bindings.java
new file mode 100644
index 0000000..1cb645b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Bindings.java
@@ -0,0 +1,131 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.xml;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.w3c.dom.Element;
+
+/** a set of {@link Binding}s divided into categories managed by a {@link Parser}.
+ *
+ * <a href="./Parser.html#bindings">See also 'Bindinds'</a>
+ * @see Parser
+ * @author Tom Baeyens
+ */
+public class Bindings {
+
+ /** maps categories to a list of bindings */
+ protected Map<String, List<Binding>> bindings = null;
+
+ public Bindings() {
+ }
+
+ /** to be used when you want to customize the binding behaviour of a {@link Parser}. */
+ public Bindings(Bindings other) {
+ if (other.bindings!=null) {
+ bindings = new HashMap<String, List<Binding>>();
+ Set<String> categorieNames = other.bindings.keySet();
+ if (categorieNames!=null) {
+ for (String categoryName: categorieNames) {
+ List<Binding> categoryBindings = other.bindings.get(categoryName);
+ List<Binding> categoryBindingsCopy = new ArrayList<Binding>(categoryBindings);
+ bindings.put(categoryName, categoryBindingsCopy);
+ }
+ }
+ }
+ }
+
+ /** get a binding for the given element and category.
+ * If the category is null, then all the categories will be searched for a binding in random order.
+ */
+ public Binding getBinding(Element element) {
+ return getBinding(element, (String)null);
+ }
+
+ /** get a binding for the given element and category.
+ * If the category is null, then all the categories will be searched for a binding in random order.
+ */
+ public Binding getBinding(Element element, String category) {
+ if (bindings==null) {
+ return null;
+ }
+ // if no category is specified
+ if (category==null) {
+ // search in all categories
+ for (List<Binding> categoryBindings : bindings.values()) {
+ Binding binding = getBinding(element, categoryBindings);
+ if (binding != null) {
+ return binding;
+ }
+ }
+ } else {
+ List<Binding> categoryBindings = bindings.get(category);
+ if (categoryBindings!=null) {
+ return getBinding(element, categoryBindings);
+ }
+ }
+ return null;
+ }
+
+ protected Binding getBinding(Element element, List<Binding> categoryBindings) {
+ for (Binding binding: categoryBindings) {
+ if (binding.matches(element)) {
+ return binding;
+ }
+ }
+ return null;
+ }
+
+ /** add an elementParser to this parser that will handle parsing of
+ * elements of the given tagName for the default category. */
+ public void addBinding(Binding binding) {
+ if (bindings==null) {
+ bindings = new HashMap<String, List<Binding>>();
+ }
+ String category = binding.getCategory();
+ List<Binding> categoryBindings = bindings.get(category);
+ if (categoryBindings==null){
+ categoryBindings = new ArrayList<Binding>();
+ bindings.put(category, categoryBindings);
+ }
+ categoryBindings.add(binding);
+ }
+
+ /** the set of all tagNames for which there is a binding specified in the given category */
+ public Set<String> getTagNames(String category) {
+ Set<String> tagNames = new HashSet<String>();
+
+ List<Binding> categoryBindings = (bindings!=null ? bindings.get(category) : null );
+ if (categoryBindings!=null) {
+ for (Binding binding: categoryBindings) {
+ tagNames.add(binding.toString());
+ }
+ }
+
+ return tagNames;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/DomBuilder.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/DomBuilder.java
new file mode 100644
index 0000000..57e9be9
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/DomBuilder.java
@@ -0,0 +1,833 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id: DebugDomBuilder.java 1434 2008-07-01 10:32:10Z heiko.braun@jboss.com $
+ */
+package org.jbpm.pvm.internal.xml;
+
+import java.util.Stack;
+import java.util.Vector;
+
+import org.w3c.dom.CDATASection;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentFragment;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.Locator;
+import org.xml.sax.ext.LexicalHandler;
+import org.xml.sax.helpers.DefaultHandler;
+
+/** builds the dom model from SAX events, optionally adding the line and
+ * column number as attributes to every element. */
+public class DomBuilder extends DefaultHandler implements ContentHandler, LexicalHandler { /** Root document */
+
+ public Document document;
+
+ protected String lineAttributeName = "line";
+ protected String columnAttributeName = "column";
+
+ /** Current activity */
+ protected Node currentNode = null;
+
+ /** The root activity */
+ protected Node root = null;
+
+ /** The next sibling activity */
+ protected Node nextSibling = null;
+
+ /** First activity of document fragment or null if not a DocumentFragment */
+ public DocumentFragment docFrag = null;
+
+ /** Vector of element activities */
+ protected Stack elemStack = new Stack();
+
+ /** Namespace support */
+ protected Vector prefixMappings = new Vector();
+
+ /** to obtain the line number information */
+ protected Locator locator = null;
+
+ /**
+ * Get the root document or DocumentFragment of the DOM being created.
+ *
+ * @return The root document or document fragment if not null
+ */
+ public Node getRootDocument() {
+ return (null != this.docFrag) ? (Node) this.docFrag : (Node) this.document;
+ }
+
+ /**
+ * Get the root activity of the DOM tree.
+ */
+ public Node getRootNode() {
+ return this.root;
+ }
+
+ /**
+ * Get the activity currently being processed.
+ *
+ * @return the current activity being processed
+ */
+ public Node getCurrentNode() {
+ return this.currentNode;
+ }
+
+ /**
+ * Set the next sibling activity, which is where the result activities should be
+ * inserted before.
+ *
+ * @param nextSibling
+ * the next sibling activity.
+ */
+ public void setNextSibling(Node nextSibling) {
+ this.nextSibling = nextSibling;
+ }
+
+ /**
+ * Return the next sibling activity.
+ *
+ * @return the next sibling activity.
+ */
+ public Node getNextSibling() {
+ return this.nextSibling;
+ }
+
+ /**
+ * Return null since there is no Writer for this class.
+ *
+ * @return null
+ */
+ public java.io.Writer getWriter() {
+ return null;
+ }
+
+ /**
+ * Append a activity to the current container.
+ *
+ * @param newNode
+ * New activity to append
+ */
+ protected void append(Node newNode) throws org.xml.sax.SAXException {
+
+ Node currentNode = this.currentNode;
+
+ if (null != currentNode) {
+ if (currentNode == this.root && this.nextSibling != null)
+ currentNode.insertBefore(newNode, this.nextSibling);
+ else
+ currentNode.appendChild(newNode);
+
+ // System.out.println(newNode.getNodeName());
+ } else if (null != this.docFrag) {
+ if (this.nextSibling != null)
+ this.docFrag.insertBefore(newNode, this.nextSibling);
+ else
+ this.docFrag.appendChild(newNode);
+ } else {
+ boolean ok = true;
+ short type = newNode.getNodeType();
+
+ if (type == Node.TEXT_NODE) {
+ String data = newNode.getNodeValue();
+
+ if ((null != data) && (data.trim().length() > 0)) {
+ throw new org.xml.sax.SAXException("Warning: can't output text before document element! Ignoring...");
+ }
+
+ ok = false;
+ } else if (type == Node.ELEMENT_NODE) {
+ if (this.document.getDocumentElement() != null) {
+ ok = false;
+
+ throw new org.xml.sax.SAXException("Can't have more than one root on a DOM!");
+ }
+ }
+
+ if (ok) {
+ if (this.nextSibling != null)
+ this.document.insertBefore(newNode, this.nextSibling);
+ else
+ this.document.appendChild(newNode);
+ }
+ }
+ }
+
+ /**
+ * Receive an object for locating the origin of SAX document events.
+ *
+ * <p>
+ * SAX parsers are strongly encouraged (though not absolutely required) to
+ * supply a locator: if it does so, it must supply the locator to the
+ * application by invoking this method before invoking any of the other
+ * methods in the ContentHandler interface.
+ * </p>
+ *
+ * <p>
+ * The locator allows the application to determine the end position of any
+ * document-related event, even if the parser is not reporting an error.
+ * Typically, the application will use this information for reporting its own
+ * errors (such as character content that does not match an application's
+ * business rules). The information returned by the locator is probably not
+ * sufficient for use with a search engine.
+ * </p>
+ *
+ * <p>
+ * Note that the locator will return correct information only during the
+ * invocation of the events in this interface. The application should not
+ * attempt to use it at any other time.
+ * </p>
+ *
+ * @param locator
+ * An object that can return the location of any SAX document event.
+ * @see org.xml.sax.Locator
+ */
+ public void setDocumentLocator(Locator locator) {
+ this.locator = locator;
+ // No action for the moment.
+ }
+
+ /**
+ * Receive notification of the beginning of a document.
+ *
+ * <p>
+ * The SAX parser will invoke this method only once, before any other methods
+ * in this interface or in DTDHandler (except for setDocumentLocator).
+ * </p>
+ */
+ public void startDocument() throws org.xml.sax.SAXException {
+
+ // No action for the moment.
+ }
+
+ /**
+ * Receive notification of the end of a document.
+ *
+ * <p>
+ * The SAX parser will invoke this method only once, and it will be the last
+ * method invoked during the parse. The parser shall not invoke this method
+ * until it has either abandoned parsing (because of an unrecoverable error)
+ * or reached the end of input.
+ * </p>
+ */
+ public void endDocument() throws org.xml.sax.SAXException {
+
+ // No action for the moment.
+ }
+
+ /**
+ * Receive notification of the beginning of an element.
+ *
+ * <p>
+ * The Parser will invoke this method at the beginning of every element in the
+ * XML document; there will be a corresponding endElement() event for every
+ * startElement() event (even when the element is empty). All of the element's
+ * content will be reported, in order, before the corresponding endElement()
+ * event.
+ * </p>
+ *
+ * <p>
+ * If the element name has a namespace prefix, the prefix will still be
+ * attached. Note that the attribute list provided will contain only
+ * attributes with explicit values (specified or defaulted): #IMPLIED
+ * attributes will be omitted.
+ * </p>
+ *
+ *
+ * @param ns
+ * The namespace of the activity
+ * @param localName
+ * The local part of the qualified name
+ * @param name
+ * The element name.
+ * @param atts
+ * The attributes attached to the element, if any.
+ * @see #endElement
+ * @see org.xml.sax.Attributes
+ */
+ public void startElement(String ns, String localName, String name, Attributes atts) throws org.xml.sax.SAXException {
+
+ Element elem;
+
+ // Note that the namespace-aware call must be used to correctly
+ // construct a Level 2 DOM, even for non-namespaced activities.
+ if ((null == ns) || (ns.length() == 0))
+ elem = this.document.createElementNS(null, name);
+ else
+ elem = this.document.createElementNS(ns, name);
+
+ append(elem);
+
+ try {
+ int nAtts = atts.getLength();
+
+ if (0 != nAtts) {
+ for (int i = 0; i < nAtts; i++) {
+
+ // System.out.println("type " + atts.getType(i) + " name " +
+ // atts.getLocalName(i) );
+ // First handle a possible ID attribute
+ if (atts.getType(i).equalsIgnoreCase("ID"))
+ setIDAttribute(atts.getValue(i), elem);
+
+ String attrNS = atts.getURI(i);
+
+ if ("".equals(attrNS))
+ attrNS = null; // DOM represents no-namespace as null
+
+ // System.out.println("attrNS: "+attrNS+", localName:
+ // "+atts.getQName(i)
+ // +", qname: "+atts.getQName(i)+", value: "+atts.getValue(i));
+ // Crimson won't let us set an xmlns: attribute on the DOM.
+ String attrQName = atts.getQName(i);
+
+ // In SAX, xmlns[:] attributes have an empty namespace, while in DOM
+ // they
+ // should have the xmlns namespace
+ if (attrQName.startsWith("xmlns:") || attrQName.equals("xmlns")) {
+ attrNS = "http://www.w3.org/2000/xmlns/";
+ }
+
+ // ALWAYS use the DOM Level 2 call!
+ elem.setAttributeNS(attrNS, attrQName, atts.getValue(i));
+ }
+ }
+
+ if (locator!=null) {
+ int lineNumber = locator.getLineNumber();
+ int columnNumber = locator.getColumnNumber();
+
+ if (lineAttributeName!=null) {
+ elem.setUserData(lineAttributeName, lineNumber, null);
+ }
+ if (columnAttributeName!=null) {
+ elem.setUserData(columnAttributeName, columnNumber, null);
+ }
+ }
+
+
+ /*
+ * Adding namespace activities to the DOM tree;
+ */
+ int nDecls = this.prefixMappings.size();
+
+ String prefix, declURL;
+
+ for (int i = 0; i < nDecls; i += 2) {
+ prefix = (String) this.prefixMappings.elementAt(i);
+
+ if (prefix == null)
+ continue;
+
+ declURL = (String) this.prefixMappings.elementAt(i + 1);
+
+ elem.setAttributeNS("http://www.w3.org/2000/xmlns/", prefix, declURL);
+ }
+
+ this.prefixMappings.clear();
+
+ // append(elem);
+
+ this.elemStack.push(elem);
+
+ this.currentNode = elem;
+
+ // append(elem);
+ } catch (java.lang.Exception de) {
+ // de.printStackTrace();
+ throw new org.xml.sax.SAXException(de);
+ }
+
+ }
+
+ /**
+ *
+ *
+ *
+ * Receive notification of the end of an element.
+ *
+ * <p>
+ * The SAX parser will invoke this method at the end of every element in the
+ * XML document; there will be a corresponding startElement() event for every
+ * endElement() event (even when the element is empty).
+ * </p>
+ *
+ * <p>
+ * If the element name has a namespace prefix, the prefix will still be
+ * attached to the name.
+ * </p>
+ *
+ *
+ * @param ns
+ * the namespace of the element
+ * @param localName
+ * The local part of the qualified name of the element
+ * @param name
+ * The element name
+ */
+ public void endElement(String ns, String localName, String name) throws org.xml.sax.SAXException {
+ this.elemStack.pop();
+ this.currentNode = this.elemStack.isEmpty() ? null : (Node) this.elemStack.peek();
+ }
+
+ /**
+ * Set an ID string to activity association in the ID table.
+ *
+ * @param id
+ * The ID string.
+ * @param elem
+ * The associated ID.
+ */
+ public void setIDAttribute(String id, Element elem) {
+
+ // Do nothing. This method is meant to be overiden.
+ }
+
+ /**
+ * Receive notification of character data.
+ *
+ * <p>
+ * The Parser will call this method to report each chunk of character data.
+ * SAX parsers may return all contiguous character data in a single chunk, or
+ * they may split it into several chunks; however, all of the characters in
+ * any single event must come from the same external entity, so that the
+ * Locator provides useful information.
+ * </p>
+ *
+ * <p>
+ * The application must not attempt to read from the array outside of the
+ * specified range.
+ * </p>
+ *
+ * <p>
+ * Note that some parsers will report whitespace using the
+ * ignorableWhitespace() method rather than this one (validating parsers must
+ * do so).
+ * </p>
+ *
+ * @param ch
+ * The characters from the XML document.
+ * @param start
+ * The start position in the array.
+ * @param length
+ * The number of characters to read from the array.
+ * @see #ignorableWhitespace
+ * @see org.xml.sax.Locator
+ */
+ public void characters(char ch[], int start, int length) throws org.xml.sax.SAXException {
+ if (isOutsideDocElem() && isWhiteSpace(ch, start, length))
+ return; // avoid DOM006 Hierarchy request error
+
+ if (this.inCData) {
+ cdata(ch, start, length);
+
+ return;
+ }
+
+ String s = new String(ch, start, length);
+ Node childNode;
+ childNode = this.currentNode != null ? this.currentNode.getLastChild() : null;
+ if (childNode != null && childNode.getNodeType() == Node.TEXT_NODE) {
+ ((Text) childNode).appendData(s);
+ } else {
+ Text text = this.document.createTextNode(s);
+ append(text);
+ }
+ }
+
+ /**
+ * If available, when the disable-output-escaping attribute is used, output
+ * raw text without escaping. A PI will be inserted in front of the activity with
+ * the name "lotusxsl-next-is-raw" and a value of "formatter-to-dom".
+ *
+ * @param ch
+ * Array containing the characters
+ * @param start
+ * Index to start of characters in the array
+ * @param length
+ * Number of characters in the array
+ */
+ public void charactersRaw(char ch[], int start, int length) throws org.xml.sax.SAXException {
+ if (isOutsideDocElem() && isWhiteSpace(ch, start, length))
+ return; // avoid DOM006 Hierarchy request error
+
+ String s = new String(ch, start, length);
+
+ append(this.document.createProcessingInstruction("xslt-next-is-raw", "formatter-to-dom"));
+ append(this.document.createTextNode(s));
+ }
+
+ /**
+ * Report the beginning of an entity.
+ *
+ * The start and end of the document entity are not reported. The start and
+ * end of the external DTD subset are reported using the pseudo-name "[dtd]".
+ * All other events must be properly nested within start/end entity events.
+ *
+ * @param name
+ * The name of the entity. If it is a parameter entity, the name will
+ * begin with '%'.
+ * @see #endEntity
+ * @see org.xml.sax.ext.DeclHandler#internalEntityDecl
+ * @see org.xml.sax.ext.DeclHandler#externalEntityDecl
+ */
+ public void startEntity(String name) throws org.xml.sax.SAXException {
+
+ // Almost certainly the wrong behavior...
+ // entityReference(name);
+ }
+
+ /**
+ * Report the end of an entity.
+ *
+ * @param name
+ * The name of the entity that is ending.
+ * @see #startEntity
+ */
+ public void endEntity(String name) throws org.xml.sax.SAXException {
+ }
+
+ /**
+ * Receive notivication of a entityReference.
+ *
+ * @param name
+ * name of the entity reference
+ */
+ public void entityReference(String name) throws org.xml.sax.SAXException {
+ append(this.document.createEntityReference(name));
+ }
+
+ /**
+ * Receive notification of ignorable whitespace in element content.
+ *
+ * <p>
+ * Validating Parsers must use this method to report each chunk of ignorable
+ * whitespace (see the W3C XML 1.0 recommendation, section 2.10):
+ * non-validating parsers may also use this method if they are capable of
+ * parsing and using content models.
+ * </p>
+ *
+ * <p>
+ * SAX parsers may return all contiguous whitespace in a single chunk, or they
+ * may split it into several chunks; however, all of the characters in any
+ * single event must come from the same external entity, so that the Locator
+ * provides useful information.
+ * </p>
+ *
+ * <p>
+ * The application must not attempt to read from the array outside of the
+ * specified range.
+ * </p>
+ *
+ * @param ch
+ * The characters from the XML document.
+ * @param start
+ * The start position in the array.
+ * @param length
+ * The number of characters to read from the array.
+ * @see #characters
+ */
+ public void ignorableWhitespace(char ch[], int start, int length) throws org.xml.sax.SAXException {
+ if (isOutsideDocElem())
+ return; // avoid DOM006 Hierarchy request error
+
+ String s = new String(ch, start, length);
+
+ append(this.document.createTextNode(s));
+ }
+
+ /**
+ * Tell if the current activity is outside the document element.
+ *
+ * @return true if the current activity is outside the document element.
+ */
+ private boolean isOutsideDocElem() {
+ return (null == this.docFrag) && this.elemStack.size() == 0 && (null == this.currentNode || this.currentNode.getNodeType() == Node.DOCUMENT_NODE);
+ }
+
+ /**
+ * Receive notification of a processing instruction.
+ *
+ * <p>
+ * The Parser will invoke this method once for each processing instruction
+ * found: note that processing instructions may occur before or after the main
+ * document element.
+ * </p>
+ *
+ * <p>
+ * A SAX parser should never report an XML declaration (XML 1.0, section 2.8)
+ * or a text declaration (XML 1.0, section 4.3.1) using this method.
+ * </p>
+ *
+ * @param target
+ * The processing instruction target.
+ * @param data
+ * The processing instruction data, or null if none was supplied.
+ */
+ public void processingInstruction(String target, String data) throws org.xml.sax.SAXException {
+ append(this.document.createProcessingInstruction(target, data));
+ }
+
+ /**
+ * Report an XML comment anywhere in the document.
+ *
+ * This callback will be used for comments inside or outside the document
+ * element, including comments in the external DTD subset (if read).
+ *
+ * @param ch
+ * An array holding the characters in the comment.
+ * @param start
+ * The starting position in the array.
+ * @param length
+ * The number of characters to use from the array.
+ */
+ public void comment(char ch[], int start, int length) throws org.xml.sax.SAXException {
+ append(this.document.createComment(new String(ch, start, length)));
+ }
+
+ /** Flag indicating that we are processing a CData section */
+ protected boolean inCData = false;
+
+ /**
+ * Report the start of a CDATA section.
+ *
+ * @see #endCDATA
+ */
+ public void startCDATA() throws org.xml.sax.SAXException {
+ this.inCData = true;
+ append(this.document.createCDATASection(""));
+ }
+
+ /**
+ * Report the end of a CDATA section.
+ *
+ * @see #startCDATA
+ */
+ public void endCDATA() throws org.xml.sax.SAXException {
+ this.inCData = false;
+ }
+
+ /**
+ * Receive notification of cdata.
+ *
+ * <p>
+ * The Parser will call this method to report each chunk of character data.
+ * SAX parsers may return all contiguous character data in a single chunk, or
+ * they may split it into several chunks; however, all of the characters in
+ * any single event must come from the same external entity, so that the
+ * Locator provides useful information.
+ * </p>
+ *
+ * <p>
+ * The application must not attempt to read from the array outside of the
+ * specified range.
+ * </p>
+ *
+ * <p>
+ * Note that some parsers will report whitespace using the
+ * ignorableWhitespace() method rather than this one (validating parsers must
+ * do so).
+ * </p>
+ *
+ * @param ch
+ * The characters from the XML document.
+ * @param start
+ * The start position in the array.
+ * @param length
+ * The number of characters to read from the array.
+ * @see #ignorableWhitespace
+ * @see org.xml.sax.Locator
+ */
+ public void cdata(char ch[], int start, int length) throws org.xml.sax.SAXException {
+ if (isOutsideDocElem() && isWhiteSpace(ch, start, length))
+ return; // avoid DOM006 Hierarchy request error
+
+ String s = new String(ch, start, length);
+
+ CDATASection section = (CDATASection) this.currentNode.getLastChild();
+ section.appendData(s);
+ }
+
+ /**
+ * Report the start of DTD declarations, if any.
+ *
+ * Any declarations are assumed to be in the internal subset unless otherwise
+ * indicated.
+ *
+ * @param name
+ * The document type name.
+ * @param publicId
+ * The declared public identifier for the external DTD subset, or
+ * null if none was declared.
+ * @param systemId
+ * The declared system identifier for the external DTD subset, or
+ * null if none was declared.
+ * @see #endDTD
+ * @see #startEntity
+ */
+ public void startDTD(String name, String publicId, String systemId) throws org.xml.sax.SAXException {
+
+ // Do nothing for now.
+ }
+
+ /**
+ * Report the end of DTD declarations.
+ *
+ * @see #startDTD
+ */
+ public void endDTD() throws org.xml.sax.SAXException {
+
+ // Do nothing for now.
+ }
+
+ /**
+ * Begin the scope of a prefix-URI Namespace mapping.
+ *
+ * <p>
+ * The information from this event is not necessary for normal Namespace
+ * processing: the SAX XML reader will automatically replace prefixes for
+ * element and attribute names when the http://xml.org/sax/features/namespaces
+ * feature is true (the default).
+ * </p>
+ *
+ * <p>
+ * There are cases, however, when applications need to use prefixes in
+ * character data or in attribute values, where they cannot safely be expanded
+ * automatically; the start/endPrefixMapping event supplies the information to
+ * the application to expand prefixes in those contexts itself, if necessary.
+ * </p>
+ *
+ * <p>
+ * Note that start/endPrefixMapping events are not guaranteed to be properly
+ * nested relative to each-other: all startPrefixMapping events will occur
+ * before the corresponding startElement event, and all endPrefixMapping
+ * events will occur after the corresponding endElement event, but their order
+ * is not guaranteed.
+ * </p>
+ *
+ * @param prefix
+ * The Namespace prefix being declared.
+ * @param uri
+ * The Namespace URI the prefix is mapped to.
+ * @see #endPrefixMapping
+ * @see #startElement
+ */
+ public void startPrefixMapping(String prefix, String uri) throws org.xml.sax.SAXException {
+ if (null == prefix || prefix.equals(""))
+ prefix = "xmlns";
+ else
+ prefix = "xmlns:" + prefix;
+ this.prefixMappings.addElement(prefix);
+ this.prefixMappings.addElement(uri);
+ }
+
+ /**
+ * End the scope of a prefix-URI mapping.
+ *
+ * <p>
+ * See startPrefixMapping for details. This event will always occur after the
+ * corresponding endElement event, but the order of endPrefixMapping events is
+ * not otherwise guaranteed.
+ * </p>
+ *
+ * @param prefix
+ * The prefix that was being mapping.
+ * @see #startPrefixMapping
+ * @see #endElement
+ */
+ public void endPrefixMapping(String prefix) throws org.xml.sax.SAXException {
+ }
+
+ /**
+ * Receive notification of a skipped entity.
+ *
+ * <p>
+ * The Parser will invoke this method once for each entity skipped.
+ * Non-validating processors may skip entities if they have not seen the
+ * declarations (because, for example, the entity was declared in an external
+ * DTD subset). All processors may skip external entities, depending on the
+ * values of the http://xml.org/sax/features/external-general-entities and the
+ * http://xml.org/sax/features/external-parameter-entities properties.
+ * </p>
+ *
+ * @param name
+ * The name of the skipped entity. If it is a parameter entity, the
+ * name will begin with '%'.
+ */
+ public void skippedEntity(String name) throws org.xml.sax.SAXException {
+ }
+
+ /**
+ * Returns whether the specified <var>ch</var> conforms to the XML 1.0
+ * definition of whitespace. Refer to <A
+ * href="http://www.w3.org/TR/1998/REC-xml-19980210#NT-S"> the definition of
+ * <CODE>S</CODE></A> for details.
+ *
+ * @param ch
+ * Character to check as XML whitespace.
+ * @return =true if <var>ch</var> is XML whitespace; otherwise =false.
+ */
+ public static boolean isWhiteSpace(char ch) {
+ return (ch == 0x20) || (ch == 0x09) || (ch == 0xD) || (ch == 0xA);
+ }
+
+ /**
+ * Tell if the string is whitespace.
+ *
+ * @param ch
+ * Character array to check as XML whitespace.
+ * @param start
+ * Start index of characters in the array
+ * @param length
+ * Number of characters in the array
+ * @return True if the characters in the array are XML whitespace; otherwise,
+ * false.
+ */
+ public static boolean isWhiteSpace(char ch[], int start, int length) {
+
+ int end = start + length;
+
+ for (int s = start; s < end; s++) {
+ if (!isWhiteSpace(ch[s]))
+ return false;
+ }
+
+ return true;
+ }
+
+ public void setLineAttributeName(String lineAttributeName) {
+ this.lineAttributeName = lineAttributeName;
+ }
+ public void setColumnAttributeName(String columnAttributeName) {
+ this.columnAttributeName = columnAttributeName;
+ }
+ public String getLineAttributeName() {
+ return lineAttributeName;
+ }
+ public String getColumnAttributeName() {
+ return columnAttributeName;
+ }
+ public Document getDocument() {
+ return document;
+ }
+ public void setDocument(Document document) {
+ this.document = document;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Entity.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Entity.java
new file mode 100644
index 0000000..7c0f6d5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Entity.java
@@ -0,0 +1,36 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.xml;
+
+import org.xml.sax.InputSource;
+
+/** used by {@link Parser} to implement {@link org.xml.sax.EntityResolver} for
+ * entity resolving.
+ *
+ * <a href="./Parser.html#entityresolving">See also 'entity resolving'</a>.
+ *
+ * @author Tom Baeyens
+ */
+public interface Entity {
+
+ InputSource getInputSource();
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Parse.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Parse.java
new file mode 100644
index 0000000..b0fc3be
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Parse.java
@@ -0,0 +1,284 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.xml;
+
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Stack;
+
+import javax.xml.parsers.DocumentBuilder;
+
+import org.jbpm.pvm.internal.stream.FileStreamInput;
+import org.jbpm.pvm.internal.stream.InputStreamInput;
+import org.jbpm.pvm.internal.stream.ResourceStreamInput;
+import org.jbpm.pvm.internal.stream.StreamInput;
+import org.jbpm.pvm.internal.stream.StringStreamInput;
+import org.jbpm.pvm.internal.stream.UrlStreamInput;
+import org.w3c.dom.Document;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXParseException;
+
+/** information related to one single parse operation, for instructions
+ * see {@link Parser}.
+ *
+ * @author Tom Baeyens
+ */
+public class Parse extends ProblemList implements ErrorHandler {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final String CONTEXT_KEY_DEPLOYMENT = "deployment";
+ public static final String CONTEXT_KEY_PROCESS_LANGUAGE_ID = "proclangid";
+ public static final String CONTEXT_KEY_BINDINGS = "bindings";
+ public static final String CONTEXT_KEY_MIGRATIONS = "migrations";
+
+ protected Parser parser;
+
+ protected StreamInput streamInput;
+ protected InputStream inputStream;
+ protected InputSource inputSource;
+
+ protected DocumentBuilder documentBuilder = null;
+ protected Document document = null;
+
+ protected Map<String, Object> contextMap;
+ protected Stack<Object> contextStack;
+ protected Object documentObject;
+
+ protected Parse(Parser parser) {
+ this.parser = parser;
+ }
+
+ // specifying the input source //////////////////////////////////////////////
+
+ /** specify an input stream as the source for this parse */
+ public Parse setInputStream(InputStream inputStream) {
+ this.streamInput = new InputStreamInput(inputStream);
+ return this;
+ }
+
+ /** specify a URL as the source for this parse */
+ public Parse setUrl(URL url) {
+ this.streamInput = new UrlStreamInput(url);
+ return this;
+ }
+
+ /** specify a file as the source for this parse */
+ public Parse setFile(File file) {
+ this.streamInput = new FileStreamInput(file);
+ return this;
+ }
+
+ /** specify a resource as the source for this parse */
+ public Parse setResource(String resource) {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ this.streamInput = new ResourceStreamInput(resource, classLoader);
+ return this;
+ }
+
+ /** specify an XML string as the source for this parse */
+ public Parse setString(String xmlString) {
+ this.streamInput = new StringStreamInput(xmlString);
+ return this;
+ }
+
+ /** specify a {@link StreamInput} as the source for this parse */
+ public Parse setStreamSource(StreamInput streamInput) {
+ this.streamInput = streamInput;
+ return this;
+ }
+
+ /** specify an InputStream as the source for this parse */
+ public Parse setInputSource(InputSource inputSource) {
+ this.inputSource = inputSource;
+ return this;
+ }
+
+ /** normally the Document Object Model is created during the
+ * parse execution, but providing a document can be convenient when
+ * the DOM is already available and only the walking of the
+ * DOM needs to be done by the parser. If the document
+ * is provide, building the DOM from a source is skipped. */
+ public Parse setDocument(Document document) {
+ this.document = document;
+ return this;
+ }
+
+ /** provides the result of this parse operation. */
+ public Parse setDocumentObject(Object object) {
+ this.documentObject = object;
+ return this;
+ }
+
+ // retrieving input source //////////////////////////////////////////////////
+
+ protected InputSource getInputSource() {
+ if (inputSource!=null) {
+ return inputSource;
+ }
+
+ if (streamInput!=null) {
+ inputStream = streamInput.openStream();
+ return new InputSource(inputStream);
+ }
+
+ addProblem("no source specified to parse");
+ return null;
+ }
+
+ // parse execution //////////////////////////////////////////////////////////
+
+ /** perform the actual parse operation with the specified input source. */
+ public Parse execute() {
+ parser.execute(this);
+ return this;
+ }
+
+ // problems /////////////////////////////////////////////////////////////////
+
+ /** part of {@link ErrorHandler} to capture XML parsing problems. */
+ public void error(SAXParseException e) {
+ addXmlValidationProblem(e, ProblemImpl.TYPE_XML_VALIDATION_ERROR);
+ }
+
+ /** part of {@link ErrorHandler} to capture XML parsing problems. */
+ public void fatalError(SAXParseException e) {
+ addXmlValidationProblem(e, ProblemImpl.TYPE_XML_VALIDATION_ERROR);
+ }
+ /** part of {@link ErrorHandler} to capture XML parsing problems. */
+ public void warning(SAXParseException e) {
+ addXmlValidationProblem(e, ProblemImpl.TYPE_XML_VALIDATION_WARNING);
+ }
+
+ protected void addXmlValidationProblem(SAXParseException e, String type) {
+ ProblemImpl problem = new ProblemImpl(e.getMessage(), e, type);
+ problem.setLine(e.getLineNumber());
+ problem.setColumn(e.getColumnNumber());
+ addProblem(problem);
+ }
+
+ /** throws an exception with appropriate message in case the parse contains
+ * errors or fatal errors. This method also logs the problems with severity
+ * 'warning'. */
+ public Parse checkErrors(String description) {
+ if (hasErrors()) {
+ throw getJbpmException();
+ }
+ return this;
+ }
+
+ // context map //////////////////////////////////////////////////////////////
+
+ public Parse contextMapPut(String key, Object value) {
+ if (contextMap==null) {
+ contextMap = new HashMap<String, Object>();
+ }
+ contextMap.put(key, value);
+ return this;
+ }
+
+ public Object contextMapGet(String key) {
+ if (contextMap!=null) {
+ return contextMap.get(key);
+ }
+ return null;
+ }
+
+ public Parse contextMapRemove(String key) {
+ if (contextMap!=null) {
+ contextMap.remove(key);
+ }
+ return this;
+ }
+
+ public Parse propagateContexMap(Parse parse) {
+ if (parse.contextMap==null) {
+ parse.contextMap = new HashMap<String, Object>();
+ }
+ if (this.contextMap!=null) {
+ parse.contextMap.putAll(this.contextMap);
+ }
+ this.contextMap = parse.contextMap;
+ return this;
+ }
+
+
+ // contex stack /////////////////////////////////////////////////////////////
+
+ /** push a contextual object on the stack of this parse. */
+ public Parse contextStackPush(Object object) {
+ if (contextStack==null) {
+ contextStack = new Stack<Object>();
+ }
+ contextStack.push(object);
+ return this;
+ }
+
+ /** remove a contextual object from the stack. */
+ public Object contextStackPop() {
+ if (contextStack!=null) {
+ return contextStack.pop();
+ }
+ return null;
+ }
+
+ /** look up the top contextual object from the stack. */
+ public Object contextStackPeek() {
+ if (contextStack!=null) {
+ return contextStack.peek();
+ }
+ return null;
+ }
+
+ /** search a contextual object in the stack by type. */
+ public <T> T contextStackFind(Class<T> clazz) {
+ if ( (contextStack!=null)
+ && (! contextStack.isEmpty())
+ ) {
+ ListIterator<Object> listIter = contextStack.listIterator(contextStack.size());
+ while (listIter.hasPrevious()) {
+ Object object = listIter.previous();
+ if (clazz.isInstance(object)) {
+ return clazz.cast(object);
+ }
+ }
+ }
+ return null;
+ }
+
+ // getters //////////////////////////////////////////////////////////////////
+
+ /** the result of this parse operation. */
+ public Object getDocumentObject() {
+ return documentObject;
+ }
+ /** the Document Object Model (DOM). */
+ public Document getDocument() {
+ return document;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Parser.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Parser.java
new file mode 100644
index 0000000..5af1ca5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Parser.java
@@ -0,0 +1,546 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.xml;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.stream.StreamInput;
+import org.jbpm.pvm.internal.util.UrlEntity;
+import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.Descriptor;
+import org.jbpm.pvm.internal.wire.descriptor.ArgDescriptor;
+import org.jbpm.pvm.internal.wire.xml.WireParser;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+
+/** makes typical usage of JAXP more convenient, adds a binding framework,
+ * entity resolution and error handling.
+ *
+ * <h2>Purpose</h2>
+ * <p>This is a base parser for the common pattern where first JAXP is used
+ * to parse xml into a Document Object Model (DOM), and then, this DOM is
+ * examined to build a domain model object. The main purpose of this parser
+ * is to serve as a base class for implementing such parsers and to provide
+ * a more convenient API for working with JAXP.
+ * </p>
+ *
+ * <p>A {@link Parser} is a thread safe object. For each parse operation, a
+ * new {@link Parse} object is created with method {@link #createParse()}.
+ * Then the parse object is used to specify the input source, execute the
+ * parse operation and extract the results.
+ * </p>
+ *
+ * <p>{@link Binding}s capture parsing of a certain element type. This way,
+ * the parser becomes more modular and customizable.
+ * </p>
+ *
+ * <p>{@link Entity Entities} are schema's that specify the grammar of the
+ * XML files that are parsed by the parser.
+ * </p>
+ *
+ * <h2>API Usage</h2>
+ * <p>Parsers can be customized by inheritance (that will be covered below),
+ * but a parser can also be used as is:
+ * </p>
+ *
+ * <pre><i> 1 </i>| static Parser parser = new Parser();
+ *<i> 2 </i>|
+ *<i> 3 </i>| void someMethod() {
+ *<i> 4 </i>| MyDomainObject mdo = (MyDomainObject) parser
+ *<i> 5 </i>| .createParse()
+ *<i> 6 </i>| .setString(myXmlString)
+ *<i> 7 </i>| .execute()
+ *<i> 8 </i>| .checkProblems()
+ *<i> 9 </i>| .getDocumentObject();
+ *<i>10 </i>| }
+ * </pre>
+ *
+ * <p><b>line 1</b> shows that a single parser can be used for all threads as
+ * the parser is maintained in a static member field.
+ * </p>
+ *
+ * <p><b>line 5</b> shows that a new parse operation is always started with
+ * the {@link #createParse()} operation. The {@link Parse} object that is
+ * returned will maintain all data that is related to that single parse
+ * operation.
+ * </p>
+ *
+ * <p><b>line 6</b> shows how a simple XML string can be provided as the input
+ * source for the parse operation. Alternative methods to specify the input
+ * source are {@link Parse#setFile(java.io.File)},
+ * {@link Parse#setInputStream(java.io.InputStream)},
+ * {@link Parse#setInputSource(InputSource)},
+ * {@link Parse#setUrl(java.net.URL)} and
+ * {@link Parse#setStreamSource(StreamInput)}.
+ * </p>
+ *
+ * <p><b>line 7</b> shows how the execution of the parse is performed. The
+ * input source will be read, the resulting Document Object Model (DOM) will
+ * be walked and potentially problems are produced in the parse.
+ * </p>
+ *
+ * <p><b>line 8</b> shows how an exception can be thrown in case of an error.
+ * The parse execution itself tries to keep parsing as much as possible to
+ * provide the developer with as much feedback as possible in one parse cycle.
+ * The {@link Parse#getProblems() problems} are silently captured in the parse
+ * object. If an exception is thrown by
+ * {@link Parse#checkErrors(String)}, it will contain a report of
+ * all the parsing problems. Alternatively, the {@link Parse#getProblems() problems
+ * in the parse object} could be examined directly without the need for an exception.
+ * </p>
+ *
+ * <p><b>line 9</b> shows how the result of the parse operation is extracted
+ * from the parse object.
+ * </p>
+ *
+ * <h2 id="binding">Binding</h2>
+ * <p>Bindings are the link between a certain type of element in your XML document
+ * and the corresponding java object in your domain model.</p>
+ *
+ * <p>A parser can be configured with a set of {@link Binding}s. Each {@link Binding}
+ * knows how to transform a dom element of a given tagName to the corresponding Java
+ * object. {@link Bindings} has a notion of binding categories. For example, activities
+ * and actions can be seen as different categories in jPDL.
+ * </p>
+ *
+ * <p>The purpose of bindings is to make certain elements in the parsing configurable.
+ * E.g. in jPDL, the main structure of the document is fixed. But activity types can be
+ * added dynamically.
+ * </p>
+ *
+ * <p>The current {@link Bindings} implementation only supports matching of an
+ * element with a {@link Binding} based on tagName. If you want to take other things
+ * into account (e.g. when you want to differentiate between elements of the same
+ * tagName with a different attribute value), you can create a specialized
+ * {@link Bindings} class.</p>
+ *
+ * <p>Bindings are added by tagName, but they have to be looked up by element. That is
+ * to support more specialized bindings implementations that match an element with a
+ * binding on more information then just the tagName. In that case, a specialized subclass of
+ * {@link Binding} should be created and the method {@link #getBinding(Element, String)} and
+ * constructor {@link Bindings#Bindings(Bindings)} should be provided
+ * with the more specialized matching behaviour.
+ * </p>
+ *
+ * <h2 id="objectstack">Object stack</h2>
+ * <p>When implementing {@link Binding}s, you might want to make use of the
+ * contextual object stack that is provided on the {@link Parse}. The
+ * {@link Binding} implementations can maintain Java objects on that stack
+ * that are being created.
+ * </p>
+ *
+ * <p>E.g. you could push the ProcessDefinition element onto the object stack while it
+ * is being parsed like this:
+ * </p>
+ *
+ * <pre>public class MyProcessBinding implements Binding {
+ *
+ * public Object parse(Element element, Parse parse, Parser parser) {
+ * <i>// instantiate the object for this binding</i>
+ * MyProcess myProcess = new MyProcess();
+ *
+ * <i>// collect all the child elements of element</i>
+ * List<Element> elements = XmlUtil.elements(element);
+ *
+ * <i>// push my processDefinition onto the object stack</i>
+ * parse.pushObject(myProcess);
+ * try {
+ *
+ * for (Element activityElement: elements) {
+ * // parse the child elements with the bindings in category "activity"
+ * parseElement(activityElement, parse, "activity");
+ * }
+ * } finally {
+ * // make sure my processDefinition is popped.
+ * parse.popObject();
+ * }
+ * return myProcess;
+ * }
+ * }
+ * </pre>
+ *
+ * <p>Then, activity bindings might access the processDefinition like this:
+ * </p>
+ *
+ * <pre>public class MyNodeBinding implements Binding {
+ *
+ * public Object parse(Element element, Parse parse, Parser parser) {
+ * <i>// instantiate the object for this binding</i>
+ * MyNode myNode = new MyNode();
+ *
+ * <i>// add the activity to the processDefinition</i>
+ * MyProcess myProcess = parse.findObject(MyProcess.class);
+ * myProcess.addNode(myNode);
+ * myNode.setMyProcess(myProcess);
+ *
+ * return myNode;
+ * }
+ * }
+ * </pre>
+ *
+ * <p>A parser implementation will typically have a static Bindings object that
+ * is leveraged in all parser objects. To customize bindings for a such a parser
+ * be sure to make a deep copy with {@link Bindings#Bindings(Bindings)} before
+ * you start adding more bindings to the specialized parser. Otherwise the
+ * base parser's bindings will be updated as well.
+ * </p>
+ *
+ * <h2 id="buildingcustomparsers">Building custom parsers</h2>
+ *
+ * <p>This parser is build for inheritance.
+ * Overriding method {@link #parseDocumentElement(Element, Parse)} can be an easy
+ * way to start writing your own logic on walking the Document Object Model (DOM).
+ * Such customizations can still be combined with the usage of
+ * <a href="#binding">bindings</a>.
+ * </p>
+ *
+ * <h2 id="entityresolving">Entity resolving</h2>
+ * <p>A parser can be configured with a set of entities with the
+ * {@link #addEntity(String, Entity)} method. The {@link UrlEntity} has
+ * a convenience method to build entities from resources
+ * {@link UrlEntity#UrlEntity(String, ClassLoader)}.
+ * </p>
+ *
+ * <p>When a document builder is created, the default implementation of the
+ * {@link #setEntityResolver(DocumentBuilder)} will set this parser as the entity resolver.
+ * The implementation method of {@link EntityResolver} ({@link #resolveEntity(String, String)}
+ * will use the added {@link Entity}s to try and find a match based on the
+ * publicId. If one is found, the {@link Entity} inputSource is returned, otherwise
+ * the systemId is used.
+ * </p>
+ *
+ * <p>This class is intended to be used with aggregation as well as inheritence.
+ * </p>
+ *
+ * @author Tom Baeyens
+ */
+public class Parser {
+
+ private static Log log = Log.getLog(Parser.class.getName());
+
+ protected SAXParserFactory saxParserFactory;
+ protected String[] schemaResources;
+
+ protected DocumentBuilderFactory documentBuilderFactory = null;
+
+ protected Bindings bindings = null;
+ protected ClassLoader classLoader = null;
+
+ /** the default parser */
+ public Parser() {
+ initialize();
+ }
+
+ /** creates a new Parser with bindings that can be maintained statically in
+ * specialized subclasses of Parser. */
+ public Parser(Bindings bindings) {
+ initialize();
+ this.bindings = bindings;
+ }
+
+ /** creates a new Parser with bindings and entities that can be maintained statically
+ * in specialized subclasses of Parser.
+ * @deprecated entities should be replaced by {@link #setSchemaResources(List)} */
+ public Parser(Bindings bindings, Map<String, Entity> entities) {
+ initialize();
+ this.bindings = bindings;
+ }
+
+ // initialization ///////////////////////////////////////////////////////////
+
+ public void initialize() {
+ initializeSaxParserFactory();
+ initializeDocumentBuilderFactory();
+ }
+
+ public void initializeDocumentBuilderFactory() {
+ documentBuilderFactory = DocumentBuilderFactory.newInstance();
+ documentBuilderFactory.setNamespaceAware(true);
+ }
+
+ public void initializeSaxParserFactory() {
+ saxParserFactory = SAXParserFactory.newInstance();
+ saxParserFactory.setNamespaceAware(true);
+ }
+
+ // document builder methods /////////////////////////////////////////////////
+
+ /** customizable creation of a new document builder. Used by
+ * {@link #buildDom(Parse)}. */
+ protected DocumentBuilder createDocumentBuilder(Parse parse) {
+ try {
+ parse.documentBuilder = documentBuilderFactory.newDocumentBuilder();
+ } catch (Exception e) {
+ parse.addProblem("couldn't get new document builder", e);
+ return null;
+ }
+ parse.documentBuilder.setErrorHandler(parse);
+ return parse.documentBuilder;
+ }
+
+ // schema validation ////////////////////////////////////////////////////////
+
+ public void setSchemaResources(List<String> resources) {
+ saxParserFactory.setValidating(true);
+ saxParserFactory.setNamespaceAware(true);
+
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ List<String> schemaLocations = new ArrayList<String>(resources.size());
+ for (String schemaResource: resources) {
+ URL schemaUrl = classLoader.getResource(schemaResource);
+ if (schemaUrl!=null) {
+ String schemaLocation = schemaUrl.toString();
+ log.trace("schema resource found: " + schemaResource);
+ schemaLocations.add(schemaLocation);
+ } else {
+ log.debug("skipping unavailble schema resource: " + schemaResource);
+ }
+ }
+ schemaResources = schemaLocations.toArray(new String[schemaLocations.size()]);
+ }
+
+ // bindings /////////////////////////////////////////////////////////////////
+
+ /** the handlers for specific element types */
+ public Bindings getBindings() {
+ return bindings;
+ }
+
+ /** set the handlers for specific element types */
+ public void setBindings(Bindings bindings) {
+ this.bindings = bindings;
+ }
+
+ /** the handler for the given element */
+ public Binding getBinding(Element element) {
+ return getBinding(element, null);
+ }
+
+ /** the handler for the given element limited to a given category */
+ public Binding getBinding(Element element, String category) {
+ return (bindings!=null ? bindings.getBinding(element, category) : null);
+ }
+
+ // runtime parsing methods //////////////////////////////////////////////////
+
+ /** main method to start a new parse, check {@link Parse} for specifying
+ * input, executing the parse and extracting the results. */
+ public Parse createParse() {
+ return new Parse(this);
+ }
+
+ /** builds a dom from the importedStreamSource and appends the child elements
+ * of the document element to the destination element. Problems are reported
+ * in the importingParse. */
+ public void importStream(StreamInput importedStreamInput, Element destination, Parse importingParse) {
+ try {
+ // build the dom of the imported document
+ Parse importedParse = createParse();
+ importedParse.setStreamSource(importedStreamInput);
+ Document importedDocument = buildDom(importedParse);
+
+ // loop over all the imported document elements
+ Element importedDocumentElement = importedDocument.getDocumentElement();
+ for(Element e : XmlUtil.elements(importedDocumentElement)) {
+ // import the element into the destination element
+ destination.appendChild(destination.getOwnerDocument().importNode(e, true));
+ }
+
+ } catch (Exception e) {
+ importingParse.addProblem("couldn't import "+importedStreamInput, e);
+ }
+ }
+
+ /** customizable parse execution */
+ protected void execute(Parse parse) {
+ try {
+ if (parse.document==null) {
+ parse.document = buildDom(parse);
+ }
+
+ // walk the dom tree
+ if (parse.document!=null) {
+ try {
+ // walk the dom tree
+ parseDocument(parse.document, parse);
+
+ } catch (Exception e) {
+ parse.addProblem("parsing exception: "+e.getMessage(), e);
+ }
+ }
+
+ } finally {
+ if (parse.inputStream!=null) {
+ try {
+ parse.inputStream.close();
+ } catch (Exception e) {
+ parse.addProblem("couldn't close input stream", e);
+ }
+ }
+ }
+ }
+
+ protected Document buildDom(Parse parse) {
+ Document document = null;
+
+ try {
+ SAXParser saxParser = saxParserFactory.newSAXParser();
+ XMLReader xmlReader = saxParser.getXMLReader();
+
+ try {
+ saxParser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
+ } catch (Exception e){
+ log.info("couldn't set schema language property", e);
+ }
+
+ if (schemaResources!=null) {
+ try {
+ saxParser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", schemaResources);
+ } catch (Exception e){
+ log.info("couldn't set schema source property", e);
+ }
+ }
+
+ try {
+ xmlReader.setFeature("http://apache.org/xml/features/validation/dynamic", true);
+ } catch (Exception e){
+ log.info("couldn't set dynamic validation feature", e);
+ }
+
+ DocumentBuilder documentBuilder = createDocumentBuilder(parse);
+ document = documentBuilder.getDOMImplementation().createDocument(null, null, null);
+ parse.setDocument(document);
+
+ DomBuilder domBuilder = new DomBuilder();
+ domBuilder.setDocument(document);
+
+ xmlReader.setContentHandler(domBuilder);
+ xmlReader.setErrorHandler(parse);
+
+ InputSource inputSource = parse.getInputSource();
+ xmlReader.parse(inputSource);
+
+ } catch (Exception e) {
+ parse.addProblem("couldn't parse xml document", e);
+ }
+
+ return document;
+ }
+
+
+ // Document Object Model walking ////////////////////////////////////////////
+
+ /** start of the DOM walk.
+ *
+ * This method is used as part of
+ * {@link #execute(Parse) the parse execution}.
+ *
+ * This default implementation behaviour extracts the document element and
+ * delegates to {@link #parseDocumentElement(Element, Parse)}.
+ *
+ * This method can be overridden for customized behaviour.
+ *
+ * @return the object that is the result from parsing this document. */
+ public Object parseDocument(Document document, Parse parse) {
+ Object object = parseDocumentElement(document.getDocumentElement(), parse);
+ parse.documentObject = object;
+ return object;
+ }
+
+ /** parses the top level element in the document and produces the object that
+ * is the result from the parsing.
+ *
+ * @return the object that is the result from parsing this document element. */
+ public Object parseDocumentElement(Element documentElement, Parse parse) {
+ return parseElement(documentElement, parse);
+ }
+
+ /** parses an arbitrary element in the document with the first matching
+ * binding found using any of the categories.
+ *
+ * @return the object that is the result from parsing this element. */
+ public Object parseElement(Element element, Parse parse) {
+ return parseElement(element, parse, null);
+ }
+
+ /** parses an arbitrary element in the document based on the bindings in the
+ * given category.
+ *
+ * @param category is the category in which the tagName should be resolved to
+ * a {@link Binding}. If category is null, all the categories will be
+ * scanned for an appropriate binding in random order.
+ *
+ * @return the object that is the result from parsing this element. */
+ public Object parseElement(Element element, Parse parse, String category) {
+
+ Object object = null;
+ String tagName = XmlUtil.getTagLocalName(element);
+
+ Binding binding = getBinding(element, category);
+
+ if (binding!=null) {
+ object = binding.parse(element, parse, this);
+ } else if (log.isDebugEnabled()) {
+ log.debug("no element parser for tag "+tagName+(category!=null ? " in category "+category : " in the default category"));
+ }
+
+ return object;
+ }
+
+ public List<ArgDescriptor> parseArgs(List<Element> argElements, Parse parse) {
+ return parseArgs(argElements, parse, WireParser.CATEGORY_DESCRIPTOR);
+ }
+
+ public List<ArgDescriptor> parseArgs(List<Element> argElements, Parse parse, String category) {
+ List<ArgDescriptor> args = null;
+ if (argElements!=null) {
+ if (argElements.size()>0) {
+ args = new ArrayList<ArgDescriptor>(argElements.size());
+ }
+ for (Element argElement: argElements) {
+ ArgDescriptor argDescriptor = new ArgDescriptor();
+ argDescriptor.setTypeName(XmlUtil.attribute(argElement, "type"));
+ Element descriptorElement = XmlUtil.element(argElement);
+ if (descriptorElement==null) {
+ parse.addProblem("arg must contain exactly one descriptor element out of "+bindings.getTagNames(category)+" as contents:"+XmlUtil.toString((Element) argElement.getParentNode()), argElement);
+ } else {
+ Descriptor descriptor = (Descriptor) parseElement(descriptorElement, parse, category);
+ argDescriptor.setDescriptor(descriptor);
+ }
+ args.add(argDescriptor);
+ }
+ }
+ return args;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Problem.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Problem.java
new file mode 100644
index 0000000..f0958b2
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/Problem.java
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.xml;
+
+/**
+ * @author Tom Baeyens
+ */
+public interface Problem {
+
+ public abstract Throwable getCause();
+
+ public abstract int getColumn();
+
+ public abstract int getLine();
+
+ public abstract String getMsg();
+
+ public abstract String getResource();
+
+ public abstract String getSeverity();
+
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/ProblemImpl.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/ProblemImpl.java
new file mode 100644
index 0000000..4c1404a
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/ProblemImpl.java
@@ -0,0 +1,128 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.xml;
+
+import java.io.Serializable;
+
+import org.xml.sax.SAXParseException;
+
+/**
+ * a unification for an XML parsing errors and DOM interpretation problems, see also {@link Parser}.
+ *
+ * See also <a href="./Parser.html#problems">'Problems'</a>
+ * @author Tom Baeyens
+ */
+public class ProblemImpl implements Serializable, Problem {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final String TYPE_ERROR = "error";
+ public static final String TYPE_WARNING = "warning";
+ public static final String TYPE_XML_VALIDATION_ERROR = "xml validation error";
+ public static final String TYPE_XML_VALIDATION_WARNING = "xml validation warning";
+
+ String resource;
+ String type;
+ Integer line;
+ Integer column;
+ String msg;
+ Throwable cause;
+
+ public ProblemImpl(String msg, Exception e, String type) {
+ this.type = type;
+ this.msg = msg;
+ this.cause = e;
+ if (e instanceof SAXParseException) {
+ SAXParseException spe = (SAXParseException) e;
+ this.resource = spe.getPublicId();
+ this.line = spe.getLineNumber();
+ this.column = spe.getColumnNumber();
+ }
+ }
+
+ public Throwable getCause() {
+ return cause;
+ }
+ public void setCause(Throwable cause) {
+ this.cause = cause;
+ }
+ public int getColumn() {
+ return column;
+ }
+ public void setColumn(int columnNumber) {
+ this.column = columnNumber;
+ }
+ public int getLine() {
+ return line;
+ }
+ public void setLine(int lineNumber) {
+ this.line = lineNumber;
+ }
+ public String getMsg() {
+ return msg;
+ }
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+ public String getResource() {
+ return resource;
+ }
+ public void setResource(String resource) {
+ this.resource = resource;
+ }
+ public String getSeverity() {
+ return type;
+ }
+ public void setSeverity(String severity) {
+ this.type = severity;
+ }
+
+ public String toString() {
+ StringBuilder text = new StringBuilder();
+ text.append(type);
+ text.append(": ");
+ text.append(msg);
+ text.append(" ");
+
+ if ((line!=null) || (column!=null) || (resource!=null)) {
+ text.append("[");
+ if (line!=-1) {
+ text.append("line="+line+" ");
+ }
+
+ if (column!=-1) {
+ text.append("column="+column+" ");
+ }
+
+ if (resource!=null) {
+ text.append("resource="+resource+" ");
+ }
+ text.append("]");
+ }
+
+ if (cause!=null) {
+ text.append(": " + cause.toString());
+ }
+
+ return text.toString();
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/ProblemList.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/ProblemList.java
new file mode 100644
index 0000000..c87ea83
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/pvm/internal/xml/ProblemList.java
@@ -0,0 +1,177 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.pvm.internal.xml;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.pvm.internal.repository.DeploymentImpl;
+import org.w3c.dom.Element;
+
+/** list of problems. Base class for {@link Parse}
+ * and {@link DeploymentImpl}.
+ *
+ * @author Tom Baeyens
+ */
+public class ProblemList implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ static final String NEWLINE = System.getProperty("line.separator");
+
+ protected List<ProblemImpl> problems;
+
+ // problem constructor method ///////////////////////////////////////////////
+
+ public void addProblem(String msg, Exception e, String severity, Element element) {
+ ProblemImpl problem = new ProblemImpl(msg, e, severity);
+
+ if (element!=null) {
+ Integer line = (Integer) element.getUserData("line");
+ if (line!=null) {
+ problem.setLine(line);
+ }
+ Integer column = (Integer) element.getUserData("column");
+ if (column!=null) {
+ problem.setColumn(column);
+ }
+ }
+
+ addProblem(problem);
+ }
+
+ // problem constructor methods with default values //////////////////////////
+
+ /** add a problem with {@link ProblemImpl#TYPE_ERROR the default severity}.*/
+ public void addProblem(String msg) {
+ addProblem(msg, null, ProblemImpl.TYPE_ERROR, null);
+ }
+
+ /** add a problem with an exception cause and
+ * {@link ProblemImpl#TYPE_ERROR the default severity}.*/
+ public void addProblem(String msg, Exception e) {
+ addProblem(msg, e, ProblemImpl.TYPE_ERROR, null);
+ }
+
+ /** add a problem with {@link ProblemImpl#TYPE_ERROR the default severity}.*/
+ public void addProblem(String msg, Element element) {
+ addProblem(msg, null, ProblemImpl.TYPE_ERROR, element);
+ }
+
+ /** add a problem with an exception cause and
+ * {@link ProblemImpl#TYPE_ERROR the default severity}.*/
+ public void addProblem(String msg, Exception e, Element element) {
+ addProblem(msg, e, ProblemImpl.TYPE_ERROR, element);
+ }
+
+ // problem mgmt methods /////////////////////////////////////////////////////
+
+ /** all problems encountered */
+ public List<Problem> getProblems() {
+ if (problems==null) {
+ return Collections.emptyList();
+ }
+ return (List) problems;
+ }
+
+ /** to add parsing problems during XML parsing and DOM walking. */
+ public void addProblem(ProblemImpl problem) {
+ if (problems==null) {
+ problems = new ArrayList<ProblemImpl>();
+ }
+ problems.add(problem);
+ }
+
+ /** add all problems */
+ public void addProblems(List<Problem> problems) {
+ if (this.problems==null) {
+ this.problems = new ArrayList<ProblemImpl>();
+ }
+ this.problems.addAll((List)problems);
+ }
+
+ /** indicates presence of problems */
+ public boolean hasProblems() {
+ return ((problems != null) && (problems.size() > 0));
+ }
+
+ /** indicates presence of errors */
+ public boolean hasErrors() {
+ if (problems==null) {
+ return false;
+ }
+ for (Problem problem: problems) {
+ if (ProblemImpl.TYPE_ERROR.equals(problem.getSeverity())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /** allows to provide the list object that should be used to
+ * capture the parsing problems. */
+ public void setProblems(List<Problem> problems) {
+ this.problems = (List)problems;
+ }
+
+
+ public JbpmException getJbpmException() {
+ return getJbpmException(null);
+ }
+
+ public JbpmException getJbpmException(String message) {
+ if (! hasErrors()) {
+ return null;
+ }
+
+ Throwable cause = null;
+
+ StringBuilder errorMsg = new StringBuilder();
+ if (problems!=null) {
+ if (message!=null) {
+ errorMsg.append(message);
+ errorMsg.append(": ");
+ } else if (problems.size()==1) {
+ Throwable singleCause = problems.get(0).getCause();
+ if ( (singleCause!=null)
+ && (JbpmException.class.isAssignableFrom(singleCause.getClass()))
+ ) {
+ return (JbpmException) singleCause;
+ }
+ }
+
+ for (Problem p : getProblems()) {
+ errorMsg.append(NEWLINE);
+ errorMsg.append(" ");
+ errorMsg.append(p.toString());
+
+ if (p.getCause()!=null) {
+ cause = new JbpmException(p.getCause());
+ }
+ }
+ }
+ return new JbpmException(errorMsg.toString(), cause);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/BaseJbpmTestCase.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/BaseJbpmTestCase.java
new file mode 100644
index 0000000..6ad5bf8
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/BaseJbpmTestCase.java
@@ -0,0 +1,95 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.test;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.TestCase;
+
+import org.jbpm.internal.log.Jdk14LogFactory;
+import org.jbpm.internal.log.Log;
+import org.jbpm.internal.log.LogFormatter;
+
+/** base class for jbpm test cases.
+ *
+ * When this class is loaded (defined), then a search for a logging.properties
+ * file will be done.
+ *
+ * If a logging.properties file is present in the root of the classpath,
+ * it will be used to initialize the java.util.logging logging framework.
+ *
+ * If this logging.properties contains property 'redirect.commons.logging'
+ * then all commons logging will be redirected to java.util.logging during
+ * this logging initialization.
+ *
+ * Apart from logging initialization, this class will add some logging
+ * to setUp and tearDown.
+ *
+ * If the JbpmLogFormatter is used, it will display multiple threads with
+ * indentation.
+ *
+ * @author Tom Baeyens
+ */
+public abstract class BaseJbpmTestCase extends TestCase {
+
+ static {
+ Jdk14LogFactory.initializeJdk14Logging();
+ }
+
+ static protected Log log = Log.getLog(BaseJbpmTestCase.class.getName());
+
+ Throwable exception;
+
+ protected void setUp() throws Exception {
+ LogFormatter.resetIndentation();
+ log.debug("=== starting "+getName()+" =============================");
+ }
+
+ protected void tearDown() throws Exception {
+ log.debug("=== ending "+getName()+" =============================\n");
+ }
+
+ public void assertTextPresent(String expected, String value) {
+ if ( (value==null)
+ || (value.indexOf(expected)==-1)
+ ) {
+ fail("expected presence of '"+expected+"' but was '"+value+"'");
+ }
+ }
+
+ protected void runTest() throws Throwable {
+ try {
+ super.runTest();
+ } catch (AssertionFailedError e) {
+ log.error("");
+ log.error("ASSERTION FAILURE: "+e.getMessage(), e);
+ log.error("");
+ exception = e;
+ throw e;
+ } catch (Throwable t) {
+ log.error("");
+ log.error("TEST THROWS EXCEPTION: "+t.getMessage(), t);
+ log.error("");
+ exception = t;
+ throw t;
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/Db.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/Db.java
new file mode 100644
index 0000000..862a847
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/Db.java
@@ -0,0 +1,194 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.test;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.hibernate.Hibernate;
+import org.hibernate.SQLQuery;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.mapping.ForeignKey;
+import org.hibernate.mapping.Table;
+import org.jbpm.api.ProcessEngine;
+import org.jbpm.internal.log.Log;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class Db {
+
+ private static final Log log = Log.getLog(Db.class.getName());
+
+ static Map<ProcessEngine, String[]> cleanSqlCache = new HashMap<ProcessEngine, String[]>();
+ static Map<ProcessEngine, String[]> tableNamesCache = new HashMap<ProcessEngine, String[]>();
+
+ public static void clean(ProcessEngine processEngine) {
+ SessionFactory sessionFactory = processEngine.get(SessionFactory.class);
+ // when running this with a remote ejb invocation configuration, there is no
+ // session factory and no cleanup needs to be done
+ if (sessionFactory==null) {
+ return;
+ }
+
+ String[] cleanSql = cleanSqlCache.get(processEngine);
+
+ if (cleanSql == null) {
+ Configuration configuration = processEngine.get(Configuration.class);
+
+ SessionFactoryImplementor sessionFactoryImplementor = (SessionFactoryImplementor) sessionFactory;
+ Dialect dialect = sessionFactoryImplementor.getDialect();
+
+ // loop over all foreign key constraints
+ List<String> dropForeignKeysSql = new ArrayList<String>();
+ List<String> createForeignKeysSql = new ArrayList<String>();
+ Iterator<Table> iter = configuration.getTableMappings();
+
+ //if no session-factory is build, the configuration is not fully initialized.
+ //Hence, the ForeignKey's won't have a referenced table. This is calculated on
+ //second pass.
+ configuration.buildMappings();
+
+
+ while (iter.hasNext()) {
+ Table table = (Table) iter.next();
+ if (table.isPhysicalTable()) {
+ String catalog = table.getCatalog();
+ String schema = table.getSchema();
+ Iterator<ForeignKey> subIter = table.getForeignKeyIterator();
+ while (subIter.hasNext()) {
+ ForeignKey fk = (ForeignKey) subIter.next();
+ if (fk.isPhysicalConstraint()) {
+ // collect the drop foreign key constraint sql
+ dropForeignKeysSql.add(fk.sqlDropString(dialect, catalog, schema));
+ // MySQLDialect creates an index for each foreign key.
+ // see
+ // http://opensource.atlassian.com/projects/hibernate/browse/HHH-2155
+ // This index should be dropped or an error will be thrown during
+ // the creation phase
+ if (dialect instanceof MySQLDialect) {
+ dropForeignKeysSql.add("alter table " + table.getName() + " drop key " + fk.getName());
+ }
+ // and collect the create foreign key constraint sql
+ createForeignKeysSql.add(fk.sqlCreateString(dialect, sessionFactoryImplementor, catalog, schema));
+ }
+ }
+ }
+ }
+
+ List<String> deleteSql = new ArrayList<String>();
+ iter = configuration.getTableMappings();
+ while (iter.hasNext()) {
+ Table table = (Table) iter.next();
+ if (table.isPhysicalTable()) {
+ deleteSql.add("delete from " + table.getName());
+ }
+ }
+
+ // glue
+ // - drop foreign key constraints
+ // - delete contents of all tables
+ // - create foreign key constraints
+ // together to form the clean script
+ List<String> cleanSqlList = new ArrayList<String>();
+ cleanSqlList.addAll(dropForeignKeysSql);
+ cleanSqlList.addAll(deleteSql);
+ cleanSqlList.addAll(createForeignKeysSql);
+
+ cleanSql = (String[]) cleanSqlList.toArray(new String[cleanSqlList.size()]);
+
+ cleanSqlCache.put(processEngine, cleanSql);
+ }
+
+ Session session = sessionFactory.openSession();
+ try {
+ for (String query : cleanSql) {
+ // log.trace(query);
+ session.createSQLQuery(query).executeUpdate();
+ }
+ } finally {
+ session.close();
+ }
+ }
+
+ public static String verifyClean(ProcessEngine processEngine) {
+ SessionFactory sessionFactory = processEngine.get(SessionFactory.class);
+ // when running this with a remote ejb invocation configuration, there is no
+ // session factory and no cleanup needs to be done
+ if (sessionFactory==null) {
+ return null;
+ }
+
+ String[] tableNames = tableNamesCache.get(processEngine);
+
+ if (tableNames == null) {
+ Configuration configuration = processEngine.get(Configuration.class);
+
+ // loop over all foreign key constraints
+ List<String> tableNamesList = new ArrayList<String>();
+ Iterator iter = configuration.getTableMappings();
+ while (iter.hasNext()) {
+ Table table = (Table) iter.next();
+ if (table.isPhysicalTable()) {
+ tableNamesList.add(table.getName());
+ }
+ }
+
+ tableNames = tableNamesList.toArray(new String[tableNamesList.size()]);
+
+ tableNamesCache.put(processEngine, tableNames);
+ }
+
+ String recordsLeftMsg = "";
+ Session session = sessionFactory.openSession();
+ try {
+ for (String tableName : tableNames) {
+ if (!"JBPM4_PROPERTY".equals(tableName)) {
+ String countSql = "select count(*) as RECORD_COUNT_ from "+tableName;
+ SQLQuery sqlQuery = session.createSQLQuery(countSql);
+ sqlQuery.addScalar("RECORD_COUNT_", Hibernate.LONG);
+ Long recordCount = (Long) sqlQuery.uniqueResult();
+ if (recordCount>0L) {
+ recordsLeftMsg += tableName+":"+recordCount+", ";
+ }
+ }
+ }
+ } finally {
+ session.close();
+ }
+
+ if (recordsLeftMsg.length()>0) {
+ clean(processEngine);
+ }
+
+ return recordsLeftMsg;
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JbpmCustomCfgTestCase.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JbpmCustomCfgTestCase.java
new file mode 100644
index 0000000..2891746
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JbpmCustomCfgTestCase.java
@@ -0,0 +1,62 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.test;
+
+import org.jbpm.api.Configuration;
+import org.jbpm.api.RepositoryService;
+
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class JbpmCustomCfgTestCase extends JbpmTestCase {
+
+
+ protected synchronized void initialize() {
+ String cfgResource = getClass().getPackage().getName().replace(".", "/")+"/jbpm.cfg.xml";
+
+ // We can't call initialize(String, String) here, since it will do a null
+ // check on the statically cached process engine. Since the test-cfg
+ // is meant to test different configs (and hence different process engines)
+ // this caching is unwanted, which means we create the process engine
+ // ourselves here.
+
+ if (log.isDebugEnabled()) {
+ log.debug("building ProcessEngine from resource " + cfgResource);
+ }
+
+ Configuration configuration = new Configuration().setResource(cfgResource);
+
+ processEngine = configuration.buildProcessEngine();
+
+ repositoryService = processEngine.get(RepositoryService.class);
+ executionService = processEngine.getExecutionService();
+ historyService = processEngine.getHistoryService();
+ managementService = processEngine.getManagementService();
+ taskService = processEngine.getTaskService();
+ identityService = processEngine.getIdentityService();
+ }
+
+
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JbpmTestCase.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JbpmTestCase.java
new file mode 100644
index 0000000..01aeaf5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JbpmTestCase.java
@@ -0,0 +1,326 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import javax.jms.Session;
+
+import org.jbpm.api.Configuration;
+import org.jbpm.api.Execution;
+import org.jbpm.api.ExecutionService;
+import org.jbpm.api.HistoryService;
+import org.jbpm.api.IdentityService;
+import org.jbpm.api.JbpmException;
+import org.jbpm.api.ManagementService;
+import org.jbpm.api.ProcessEngine;
+import org.jbpm.api.ProcessInstance;
+import org.jbpm.api.RepositoryService;
+import org.jbpm.api.TaskService;
+import org.jbpm.api.task.Task;
+
+/** base class for persistent jBPM tests.
+ *
+ * This class exposes a lot of extra convenience methods for testing
+ * process executions.
+ *
+ * The ProcessEngine services will be initialized and available as
+ * member fields.
+ *
+ * This test assumes that each test will clean the DB itself and that
+ * no data is in the DB tables when the test finishes.
+ *
+ * During tearDown, a check will be done if all the DB tables are
+ * empty. If not, that is logged with a F I X M E and the DB tables
+ * are cleaned.
+ *
+ * @author Tom Baeyens
+ * @author Heiko Braun
+ */
+public abstract class JbpmTestCase extends BaseJbpmTestCase {
+
+ protected static ProcessEngine processEngine = null;
+
+ protected static RepositoryService repositoryService;
+ protected static ExecutionService executionService;
+ protected static ManagementService managementService;
+ protected static TaskService taskService;
+ protected static HistoryService historyService;
+ protected static IdentityService identityService;
+
+ /** registered deployments. registered deployments will be deleted automatically
+ * in the tearDown. This is a convenience function as each test is expected to clean up the DB. */
+ protected List<String> registeredDeployments = new ArrayList<String>();
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ initialize();
+ }
+
+ protected synchronized void initialize() {
+ if (processEngine==null) {
+ processEngine = Configuration.getProcessEngine();
+
+ repositoryService = processEngine.get(RepositoryService.class);
+ executionService = processEngine.getExecutionService();
+ historyService = processEngine.getHistoryService();
+ managementService = processEngine.getManagementService();
+ taskService = processEngine.getTaskService();
+ identityService = processEngine.getIdentityService();
+ }
+ }
+
+ protected void tearDown() throws Exception {
+ deleteRegisteredDeployments();
+ String errorMsg = verifyDbClean();
+
+ super.tearDown();
+
+ if (errorMsg!=null) {
+ if (exception==null) {
+ throw new JbpmException(errorMsg);
+ } else {
+ throw new JbpmException(errorMsg, exception);
+ }
+ }
+ }
+
+ public static void jmsCreateQueue(String connectionFactoryJndiName, String queueJndiName) {
+ JmsExtensions.createQueue(connectionFactoryJndiName, queueJndiName);
+ }
+
+ public static Object jmsConsumeMessageFromQueue(String connectionFactoryJndiName, String queueJndiName) {
+ return jmsConsumeMessageFromQueue(connectionFactoryJndiName, queueJndiName, 1000, true, Session.AUTO_ACKNOWLEDGE);
+ }
+
+ public static Object jmsConsumeMessageFromQueue(String connectionFactoryJndiName, String queueJndiName, long timeout, boolean transacted, int acknowledgeMode) {
+ return JmsExtensions.consumeMessageFromQueue(connectionFactoryJndiName, queueJndiName, timeout, transacted, acknowledgeMode);
+ }
+
+ public static Object jmsConsumeMessageFromQueueXA(String connectionFactoryJndiName, String queueJndiName, long timeout) {
+ return JmsExtensions.consumeMessageFromQueueXA(connectionFactoryJndiName, queueJndiName, timeout);
+ }
+
+ public static void jmsAssertQueueEmpty(String connectionFactoryJndiName, String queueJndiName, long timeout, boolean transacted, int acknowledgeMode) {
+ JmsExtensions.jmsAssertQueueEmpty(connectionFactoryJndiName, queueJndiName, timeout, transacted, acknowledgeMode);
+ }
+
+ public static void jmsAssertQueueEmptyXA(String connectionFactoryJndiName, String queueJndiName, long timeout) {
+ JmsExtensions.jmsAssertQueueEmptyXA(connectionFactoryJndiName, queueJndiName, timeout);
+ }
+
+ public static void jmsRemoveQueue(String connectionFactoryJndiName, String queueJndiName) {
+ JmsExtensions.removeQueue(connectionFactoryJndiName, queueJndiName);
+ }
+
+ public static void jmsCreateTopic(String connectionFactoryJndiName, String topicJndiName) {
+ JmsExtensions.createTopic(connectionFactoryJndiName, topicJndiName);
+ }
+
+ public static JmsTopicListener jmsStartTopicListener(String connectionFactoryJndiName, String topicJndiName, boolean transacted, int acknowledgeMode) {
+ return new JmsNonXATopicListener(connectionFactoryJndiName, topicJndiName, transacted, acknowledgeMode);
+ }
+
+ public static JmsTopicListener jmsStartTopicListenerXA(String connectionFactoryJndiName, String topicJndiName) {
+ return new JmsXATopicListener(connectionFactoryJndiName, topicJndiName);
+ }
+
+ public static void jmsRemoveTopic(String connectionFactoryJndiName, String topicJndiName) {
+ JmsExtensions.removeTopic(connectionFactoryJndiName, topicJndiName);
+ }
+
+ protected String verifyDbClean() {
+ String errorMsg = null;
+ String recordsLeftMsg = Db.verifyClean(processEngine);
+ if ( (recordsLeftMsg!=null)
+ && (recordsLeftMsg.length()>0)
+ ) {
+ errorMsg = "database was not clean after test: "+recordsLeftMsg;
+ }
+ return errorMsg;
+ }
+
+ protected void deleteRegisteredDeployments() {
+ for (String deploymentId : registeredDeployments) {
+ repositoryService.deleteDeploymentCascade(deploymentId);
+ }
+ }
+
+ // deployment helper methods ////////////////////////////////////////////////
+
+ /** deploys the process, keeps a reference to the deployment and
+ * automatically deletes the deployment in the tearDown */
+ public String deployJpdlXmlString(String jpdlXmlString) {
+ String deploymentDbid =
+ repositoryService.createDeployment()
+ .addResourceFromString("xmlstring.jpdl.xml", jpdlXmlString)
+ .deploy();
+
+ registerDeployment(deploymentDbid);
+
+ return deploymentDbid;
+ }
+
+ /** registered deployments will be deleted in the tearDown */
+ protected void registerDeployment(String deploymentId) {
+ registeredDeployments.add(deploymentId);
+ }
+
+ // task helper methods //////////////////////////////////////////////////////
+
+ public static void assertContainsTask(List<Task> taskList, String taskName) {
+ if (getTask(taskList, taskName)==null) {
+ fail("tasklist doesn't contain task '"+taskName+"': "+taskList);
+ }
+ }
+
+ public static void assertContainsTask(List<Task> taskList, String taskName, String assignee) {
+ if (getTask(taskList, taskName, assignee)==null) {
+ fail("tasklist doesn't contain task '"+taskName+"' for assignee '"+assignee+"': "+taskList);
+ }
+ }
+
+ public static Task getTask(List<Task> taskList, String taskName) {
+ for (Task task : taskList) {
+ if (taskName.equals(task.getName())) {
+ return task;
+ }
+ }
+ return null;
+ }
+
+ public static Task getTask(List<Task> taskList, String taskName, String assignee) {
+ for (Task task : taskList) {
+ if (taskName.equals(task.getName())) {
+ if (assignee==null) {
+ if (task.getAssignee()==null) {
+ return task;
+ }
+ } else {
+ if (assignee.equals(task.getAssignee())) {
+ return task;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ public void assertNoOpenTasks(String processInstanceId) {
+ List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstanceId).list();
+ assertTrue("There were still open tasks found for the process instance with id " +
+ processInstanceId + ". Current tasks are: " +
+ listAllOpenTasks(processInstanceId), tasks.isEmpty());
+ }
+
+ protected String listAllOpenTasks(String processInstanceId) {
+ List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstanceId).list();
+ StringBuilder result = new StringBuilder();
+ for (Task task : tasks) {
+ result.append("'" + task.getName() + "', ");
+ }
+
+ if (result.length() > 2) {
+ result.setLength(result.length() - 2); // remove the last ', '
+ }
+
+ return result.toString();
+ }
+
+ // execution helper methods //////////////////////////////////////////
+
+ public void assertExecutionEnded(String processInstanceId) {
+ assertNull("Error: an active process instance with id " + processInstanceId + " was found",
+ executionService.findProcessInstanceById(processInstanceId));
+ }
+
+ public void assertProcessInstanceEnded(String processInstanceId) {
+ assertExecutionEnded(processInstanceId);
+ }
+
+ public void assertProcessInstanceEnded(ProcessInstance processInstance) {
+ assertExecutionEnded(processInstance.getId());
+ }
+
+ public void assertProcessInstanceActive(ProcessInstance processInstance) {
+ assertProcessInstanceActive(processInstance.getId());
+ }
+
+ public void assertProcessInstanceActive(String processInstanceId) {
+ assertNotNull("Error: an active process instance with id " + processInstanceId + " was not found",
+ executionService.findProcessInstanceById(processInstanceId));
+ }
+
+ public void assertActivityActive(String executionId, String activityName) {
+ assertTrue("The execution with id '" + executionId +
+ "' is not active in the activity '" + activityName + "'." +
+ "Current activitites are: " + listAllActiveActivites(executionId),
+ executionService.findExecutionById(executionId).isActive(activityName));
+ }
+
+ public void assertNotActivityActive(String executionId, String activityName) {
+ Execution execution = executionService.findExecutionById(executionId);
+ assertFalse(execution.isActive(activityName));
+ }
+
+ public void assertActivitiesActive(String executionId, String ... activityNames) {
+ for (String activityName : activityNames) {
+ assertActivityActive(executionId, activityName);
+ }
+ }
+
+ /** Checks if the given execution is active in one (or more) of the given activities */
+ public void assertExecutionInOneOrMoreActivitiesActive(String executionId, String ... activityNames) {
+
+ boolean inOneActivityActive = false;
+ Execution execution = executionService.findExecutionById(executionId);
+
+ for (String activityName : activityNames) {
+ if (execution.isActive(activityName)) {
+ inOneActivityActive = true;
+ }
+ }
+
+ assertTrue("The execution with id '" + executionId +
+ "' is not active in one of these activities: " + activityNames +
+ "Current activitites are: " + listAllActiveActivites(executionId),
+ inOneActivityActive);
+ }
+
+ protected String listAllActiveActivites(String executionId) {
+ Execution execution = executionService.findExecutionById(executionId);
+ Set<String> activeActivities = execution.findActiveActivityNames();
+ StringBuilder result = new StringBuilder();
+ for (String activeActivity : activeActivities) {
+ result.append("'" + activeActivity + "', ");
+ }
+
+ if (result.length() > 2) {
+ result.setLength(result.length() - 2); // remove the last ', '
+ }
+
+ return result.toString();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JmsExtensions.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JmsExtensions.java
new file mode 100644
index 0000000..8ab1e7c
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JmsExtensions.java
@@ -0,0 +1,258 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.Queue;
+import javax.jms.QueueConnection;
+import javax.jms.QueueConnectionFactory;
+import javax.jms.QueueSession;
+import javax.jms.XAQueueConnection;
+import javax.jms.XAQueueConnectionFactory;
+import javax.jms.XAQueueSession;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import junit.framework.AssertionFailedError;
+
+import org.jbpm.api.JbpmException;
+
+import com.mockrunner.ejb.JNDIUtil;
+import com.mockrunner.jms.JMSTestModule;
+import com.mockrunner.mock.jms.JMSMockObjectFactory;
+import com.mockrunner.mock.jms.MockQueue;
+import com.mockrunner.mock.jms.MockQueueConnectionFactory;
+import com.mockrunner.mock.jms.MockTopic;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public abstract class JmsExtensions {
+
+ static {
+ try {
+ new InitialContext().getEnvironment();
+ } catch (NamingException e) {
+ try {
+ JNDIUtil.initMockContextFactory();
+ } catch (Exception e2) {
+ e.printStackTrace();
+ throw new RuntimeException("coudn't initialize mock jndi: "+e2.getMessage(), e2);
+ }
+ }
+ }
+
+ static Map<String, JMSMockObjectFactory> jmsMockObjectFactories = new HashMap<String, JMSMockObjectFactory>();
+ static Map<String, JMSTestModule> jmsTestModules = new HashMap<String, JMSTestModule>();
+
+ public static void createQueue(String connectionFactoryJndiName, String queueJndiName) {
+ MockQueue queue = getJmsTestModule(connectionFactoryJndiName)
+ .getDestinationManager()
+ .createQueue(queueJndiName);
+
+ bindToJndi(queueJndiName, queue);
+ }
+
+ public static void removeQueue(String connectionFactoryJndiName, String queueJndiName) {
+ getJmsTestModule(connectionFactoryJndiName)
+ .getDestinationManager()
+ .removeQueue(queueJndiName);
+
+ unbindFromJndi(queueJndiName);
+ }
+
+ public static void createTopic(String connectionFactoryJndiName, String topicJndiName) {
+ MockTopic topic = getJmsTestModule(connectionFactoryJndiName)
+ .getDestinationManager()
+ .createTopic(topicJndiName);
+
+ bindToJndi(topicJndiName, topic);
+ }
+
+ public static void removeTopic(String connectionFactoryJndiName, String topicJndiName) {
+ getJmsTestModule(connectionFactoryJndiName)
+ .getDestinationManager()
+ .removeTopic(topicJndiName);
+
+ unbindFromJndi(topicJndiName);
+ }
+
+ protected static void bindToJndi(String jndiName, Object object) {
+ try {
+ new InitialContext().bind(jndiName, object);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't bind object '"+object+"' to jndi name '"+jndiName+"': "+e.getMessage(), e);
+ }
+ }
+
+ protected static void unbindFromJndi(String jndiName) {
+ try {
+ new InitialContext().unbind(jndiName);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't unbind object from jndi name '"+jndiName+"': "+e.getMessage(), e);
+ }
+ }
+
+ private static JMSTestModule getJmsTestModule(String connectionFactoryJndiName) {
+ JMSTestModule jmsTestModule = jmsTestModules.get(connectionFactoryJndiName);
+ if (jmsTestModule==null) {
+ JMSMockObjectFactory jmsMockObjectFactory = getMockObjectFactory(connectionFactoryJndiName);
+ jmsTestModule = new JMSTestModule(jmsMockObjectFactory);
+ jmsTestModules.put(connectionFactoryJndiName, jmsTestModule);
+ }
+ return jmsTestModule;
+ }
+
+ private static JMSMockObjectFactory getMockObjectFactory(String connectionFactoryJndiName) {
+ JMSMockObjectFactory jmsMockObjectFactory = jmsMockObjectFactories.get(connectionFactoryJndiName);
+ if (jmsMockObjectFactory==null) {
+ jmsMockObjectFactory = new JMSMockObjectFactory();
+ jmsMockObjectFactories.put(connectionFactoryJndiName, jmsMockObjectFactory);
+ MockQueueConnectionFactory mockQueueConnectionFactory = jmsMockObjectFactory.getMockQueueConnectionFactory();
+ try {
+ new InitialContext().bind(connectionFactoryJndiName, mockQueueConnectionFactory);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't bind mock queue connection factory '"+connectionFactoryJndiName+"': "+e.getMessage(), e);
+ }
+ }
+ return jmsMockObjectFactory;
+ }
+
+ public static Object consumeMessageFromQueueXA(String connectionFactoryJndiName, String queueJndiName, long timeout) {
+ try {
+ InitialContext context = new InitialContext();
+ Queue queue = (Queue)context.lookup(queueJndiName);
+ XAQueueConnectionFactory xaQueueConnectionFactory = (XAQueueConnectionFactory) context.lookup(connectionFactoryJndiName);
+
+ XAQueueConnection xaQueueConnection = null;
+ XAQueueSession queueSession = null;
+ MessageConsumer messageConsumer = null;
+ try {
+ xaQueueConnection = xaQueueConnectionFactory.createXAQueueConnection();
+ xaQueueConnection.start();
+ queueSession = xaQueueConnection.createXAQueueSession();
+ messageConsumer = queueSession.createConsumer(queue);
+ Message message = messageConsumer.receive(timeout);
+ if (message==null) {
+ throw new AssertionFailedError("no message on queue "+queueJndiName);
+ }
+ return message;
+
+ } finally {
+ try {
+ messageConsumer.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ queueSession.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ xaQueueConnection.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new JbpmException("couldn't receive message from queue: "+e.getMessage(), e);
+ }
+ }
+
+ public static Message consumeMessageFromQueue(String connectionFactoryJndiName, String queueJndiName, long timeout, boolean transacted, int acknowledgeMode) {
+ try {
+ InitialContext context = new InitialContext();
+ QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory) context.lookup(connectionFactoryJndiName);
+ Queue queue = (Queue)context.lookup(queueJndiName);
+
+ QueueConnection queueConnection = null;
+ QueueSession queueSession = null;
+ MessageConsumer messageConsumer = null;
+
+ try {
+ queueConnection = queueConnectionFactory.createQueueConnection();
+ queueConnection.start();
+ queueSession = queueConnection.createQueueSession(transacted, acknowledgeMode);
+ messageConsumer = queueSession.createConsumer(queue);
+ Message message = messageConsumer.receive(timeout);
+ if (message==null) {
+ throw new AssertionFailedError("no message on queue "+queueJndiName);
+ }
+ if (transacted) {
+ queueSession.commit();
+ }
+ return message;
+
+ } finally {
+ try {
+ messageConsumer.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ queueSession.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ queueConnection.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new JbpmException("couldn't receive message from queue: "+e.getMessage(), e);
+ }
+ }
+
+ public static void jmsAssertQueueEmptyXA(String connectionFactoryJndiName, String queueJndiName, long timeout) {
+ try {
+ consumeMessageFromQueueXA(connectionFactoryJndiName, queueJndiName, timeout);
+ } catch (AssertionFailedError e) {
+ if (e.getMessage().startsWith("no message on queue")) {
+ return;
+ }
+ }
+ throw new AssertionFailedError("message available on queue "+queueJndiName);
+ }
+
+ public static void jmsAssertQueueEmpty(String connectionFactoryJndiName, String queueJndiName, long timeout, boolean transacted, int acknowledgeMode) {
+ try {
+ consumeMessageFromQueue(connectionFactoryJndiName, queueJndiName, timeout, transacted, acknowledgeMode);
+ } catch (AssertionFailedError e) {
+ if (e.getMessage().startsWith("no message on queue")) {
+ return;
+ }
+ }
+ throw new AssertionFailedError("message available on queue "+queueJndiName);
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JmsNonXATopicListener.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JmsNonXATopicListener.java
new file mode 100644
index 0000000..bd6891b
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JmsNonXATopicListener.java
@@ -0,0 +1,152 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.test;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.jms.Message;
+import javax.jms.MessageListener;
+import javax.jms.Topic;
+import javax.jms.TopicConnection;
+import javax.jms.TopicConnectionFactory;
+import javax.jms.TopicSession;
+import javax.jms.TopicSubscriber;
+import javax.naming.InitialContext;
+
+import junit.framework.TestCase;
+
+import org.jbpm.internal.log.Log;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class JmsNonXATopicListener implements JmsTopicListener {
+
+ private static Log log = Log.getLog(JmsNonXATopicListener.class.getName());
+
+ String topicJndiName = null;
+ String connectionFactoryJndiName = null;
+ boolean transacted;
+ int acknowledgeMode;
+ TopicConnectionFactory topicConnectionFactory = null;
+ Topic topic = null;
+ TopicConnection topicConnection = null;
+ TopicSession topicSession = null;
+ TopicSubscriber topicSubscriber = null;
+
+ List<Message> messages = null;
+
+ JmsNonXATopicListener(String connectionFactoryJndiName, String topicJndiName, boolean transacted, int acknowledgeMode) {
+ this.connectionFactoryJndiName = connectionFactoryJndiName;
+ this.topicJndiName = topicJndiName;
+ this.transacted = transacted;
+ this.acknowledgeMode = acknowledgeMode;
+ start();
+ }
+
+ void start() {
+ try {
+ messages = Collections.synchronizedList(new ArrayList<Message>());
+
+ InitialContext context = new InitialContext();
+ topicConnectionFactory = (TopicConnectionFactory) context.lookup(connectionFactoryJndiName);
+ topic = (Topic) context.lookup(topicJndiName);
+ topicConnection = topicConnectionFactory.createTopicConnection();
+ topicSession = topicConnection.createTopicSession(transacted, acknowledgeMode);
+ topicSubscriber = topicSession.createSubscriber(topic);
+ topicSubscriber.setMessageListener(new Listener());
+
+ topicConnection.start();
+
+ } catch (Exception e) {
+ stop();
+ throw new RuntimeException("couldn't subscribe message listener to topic '"+topicJndiName+"': "+e.getMessage(), e);
+ }
+ }
+
+ private class Listener implements MessageListener {
+ public void onMessage(Message message) {
+ messages.add(message);
+ }
+ }
+
+ public void stop() {
+ if ( transacted && (topicSession!=null)) {
+ try {
+ topicSession.commit();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ if (topicConnection!=null) {
+ try {
+ topicConnection.stop();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ if (topicSubscriber!=null) {
+ try {
+ topicSubscriber.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ topicSubscriber = null;
+ }
+ if (topicSession!=null) {
+ try {
+ topicSession.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ topicSession = null;
+ }
+ if (topicConnection!=null) {
+ try {
+ topicConnection.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ topicConnection = null;
+ }
+ }
+
+ public Message getNextMessage(long timeout) {
+ long start = System.currentTimeMillis();
+ while (true) {
+ if (!messages.isEmpty()) {
+ return messages.remove(0);
+ }
+ if (System.currentTimeMillis()-start > timeout) {
+ TestCase.fail("no message for topic "+topicJndiName);
+ }
+ try {
+ Thread.sleep(200);
+ } catch (InterruptedException e) {
+ log.info("waiting for next message got interrupted");
+ }
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JmsTopicListener.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JmsTopicListener.java
new file mode 100644
index 0000000..66b7a46
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JmsTopicListener.java
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.test;
+
+import javax.jms.Message;
+
+/**
+ * @author Tom Baeyens
+ */
+public interface JmsTopicListener {
+
+ Message getNextMessage(long timeout);
+
+ void stop();
+}
\ No newline at end of file
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JmsXATopicListener.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JmsXATopicListener.java
new file mode 100644
index 0000000..2ba029d
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/JmsXATopicListener.java
@@ -0,0 +1,141 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.test;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.Topic;
+import javax.jms.XATopicConnection;
+import javax.jms.XATopicConnectionFactory;
+import javax.jms.XATopicSession;
+import javax.naming.InitialContext;
+
+import junit.framework.TestCase;
+
+import org.jbpm.internal.log.Log;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class JmsXATopicListener implements JmsTopicListener {
+
+ private static Log log = Log.getLog(JmsXATopicListener.class.getName());
+
+ String topicJndiName = null;
+ String connectionFactoryJndiName = null;
+ Topic topic = null;
+ XATopicConnectionFactory topicConnectionFactory = null;
+ XATopicConnection topicConnection = null;
+ XATopicSession topicSession = null;
+ MessageConsumer messageConsumer = null;
+
+ List<Message> messages = null;
+
+ JmsXATopicListener(String connectionFactoryJndiName, String topicJndiName) {
+ this.connectionFactoryJndiName = connectionFactoryJndiName;
+ this.topicJndiName = topicJndiName;
+ start();
+ }
+
+ void start() {
+ try {
+ messages = Collections.synchronizedList(new ArrayList<Message>());
+
+ InitialContext context = new InitialContext();
+ topicConnectionFactory = (XATopicConnectionFactory) context.lookup(connectionFactoryJndiName);
+ topic = (Topic) context.lookup(topicJndiName);
+ topicConnection = topicConnectionFactory.createXATopicConnection();
+ topicSession = topicConnection.createXATopicSession();
+ messageConsumer = topicSession.createConsumer(topic);
+ messageConsumer.setMessageListener(new Listener());
+
+ topicConnection.start();
+
+ } catch (Exception e) {
+ stop();
+ throw new RuntimeException("couldn't subscribe message listener to topic '"+topicJndiName+"': "+e.getMessage(), e);
+ }
+ }
+
+ private class Listener implements MessageListener {
+ public void onMessage(Message message) {
+ messages.add(message);
+ }
+ }
+
+ public void stop() {
+ if (topicConnection!=null) {
+ try {
+ topicConnection.stop();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ if (messageConsumer!=null) {
+ try {
+ messageConsumer.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ messageConsumer = null;
+ }
+ if (topicSession!=null) {
+ try {
+ topicSession.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ topicSession = null;
+ }
+ if (topicConnection!=null) {
+ try {
+ topicConnection.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ topicConnection = null;
+ }
+ }
+
+ public Message getNextMessage(long timeout) {
+ long start = System.currentTimeMillis();
+ while (true) {
+ if (!messages.isEmpty()) {
+ return messages.remove(0);
+ }
+ if (System.currentTimeMillis()-start > timeout) {
+ TestCase.fail("no message for topic "+topicJndiName);
+ }
+ try {
+ Thread.sleep(200);
+ } catch (InterruptedException e) {
+ log.info("waiting for next message got interrupted");
+ }
+ }
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/MockRunnerTest.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/MockRunnerTest.java
new file mode 100644
index 0000000..b9d5f9e
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/MockRunnerTest.java
@@ -0,0 +1,57 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.test;
+
+import javax.jms.Queue;
+import javax.naming.InitialContext;
+
+import com.mockrunner.ejb.JNDIUtil;
+import com.mockrunner.jms.JMSTestModule;
+import com.mockrunner.mock.jms.JMSMockObjectFactory;
+import com.mockrunner.mock.jms.MockQueueConnectionFactory;
+
+
+/**
+ * @author Tom Baeyens
+ */
+public class MockRunnerTest extends BaseJbpmTestCase {
+
+ public void testMockRunner() throws Exception {
+ JNDIUtil.initMockContextFactory();
+ JMSMockObjectFactory jmsMockObjectFactory = new JMSMockObjectFactory();
+ MockQueueConnectionFactory mockQueueConnectionFactory = jmsMockObjectFactory.getMockQueueConnectionFactory();
+ JMSTestModule jmsTestModule = new JMSTestModule(jmsMockObjectFactory);
+
+
+ InitialContext initialContext = new InitialContext();
+
+ initialContext.bind("jms/ConnectionFactory", mockQueueConnectionFactory);
+
+ assertSame(mockQueueConnectionFactory, initialContext.lookup("jms/ConnectionFactory"));
+
+ Queue queue = jmsTestModule.getDestinationManager().createQueue("JmsActivityQueue");
+
+ initialContext.bind("queues/JmsActivityQueue", queue);
+
+ assertSame(queue, initialContext.lookup("queues/JmsActivityQueue"));
+ }
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/assertion/CollectionAssertions.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/assertion/CollectionAssertions.java
new file mode 100644
index 0000000..34ecb62
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/assertion/CollectionAssertions.java
@@ -0,0 +1,61 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+/**
+ *
+ */
+package org.jbpm.test.assertion;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import junit.framework.Assert;
+
+/**
+ * Utility class with assertions for collections.
+ *
+ * @author Joram Barrez
+ */
+public class CollectionAssertions {
+
+ public static <T> void assertElementsEqual(Collection<T> collection1, Collection<T> collection2) {
+
+ Assert.assertTrue( (collection1 == null && collection2 == null)
+ || (collection1 != null && collection2 != null) );
+
+ if (collection1 != null && collection2 != null) {
+
+ Assert.assertEquals(collection1.size(), collection2.size());
+
+ Iterator<T> it1 = collection1.iterator();
+ Iterator<T> it2 = collection2.iterator();
+
+ while (it1.hasNext()) {
+ T t1 = it1.next();
+ T t2 = it2.next();
+ Assert.assertEquals(t1, t2);
+ }
+
+ }
+
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/assertion/QueryAssertions.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/assertion/QueryAssertions.java
new file mode 100644
index 0000000..e384c06
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/assertion/QueryAssertions.java
@@ -0,0 +1,150 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+/**
+ *
+ */
+package org.jbpm.test.assertion;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import junit.framework.Assert;
+
+/**
+ * Utility class with assertions for query test.
+ *
+ * @author Joram Barrez
+ */
+public class QueryAssertions {
+
+ // No need to instantiate
+ private QueryAssertions() {
+ }
+
+ /**
+ * Assertion to be used to check if the result of a certain XXXQuery produces
+ * the correct result.
+ *
+ * Example usage:
+ *
+ * List<Task> taskListAsc = taskService.createTaskQuery().orderAsc(property).list(); List<Task>
+ * taskListDesc = taskService.createTaskQuery().orderDesc(property).list();
+ * QueryAssertions.assertOrderOnProperty(Task.class, property, taskListAsc, taskListDesc, Arrays.asList("a", "b", "c"));
+ *
+ * The assertion will do the following assertions:
+ *
+ * @param clazz
+ * Due to generics mumbo-jumbo, it's required to provide the class
+ * of the generic type T. If only we could do T.getClass() ...
+ * @param <T>
+ * The return type of the XXXQuery
+ * @param property
+ * The property on which the query was ordered
+ * @param listOrderedAsc
+ * The list resulting from executing the query with an 'order by asc'
+ * @param listOrderedDesc
+ * The list resulting from executing the query with an 'order by
+ * desc'
+ * @param expectedValuesAsc
+ * The hard coded list of expected elements, in ascending order. The
+ * assertion for the descending case will be done by reversing this
+ * list
+ */
+ public static <T> void assertOrderOnProperty(Class<T> clazz, String property,
+ List<T> listOrderedAsc, List<T> listOrderedDesc, List<Object> expectedValuesAsc) {
+
+ Assert.assertNotNull(listOrderedAsc);
+ Assert.assertEquals(expectedValuesAsc.size(), expectedValuesAsc.size());
+
+ Assert.assertNotNull(listOrderedDesc);
+ Assert.assertEquals(expectedValuesAsc.size(), listOrderedDesc.size());
+
+ for (int i = 0; i < expectedValuesAsc.size(); i++) {
+
+ Object realValueAsc = null;
+ Object realValueDesc = null;
+
+ try {
+
+ realValueAsc = invokeGetter(property, clazz, listOrderedAsc.get(i));
+ realValueDesc = invokeGetter(property, clazz, listOrderedDesc.get(i));
+
+ } catch (Exception e) {
+ Assert.fail(e.getMessage());
+ }
+
+ Assert.assertEquals("Incorrect order by ASC for property " + property,
+ expectedValuesAsc.get(i), realValueAsc);
+ Assert.assertEquals("Incorrect order by DESC for property " + property,
+ expectedValuesAsc.get((listOrderedDesc.size() -1) - i), realValueDesc);
+
+ }
+ }
+
+ /**
+ * Does the same as the assertOrderOnProperty assertion, but instead of
+ * checking if the resulting list have the correct elements now it is checked
+ * if the elements are naturally ordered ascending and descending.
+ *
+ * IMPORTANT: the type T must be implementing the {@link Comparable} interface!
+ */
+ @SuppressWarnings("unchecked")
+ public static <T> void assertOrderIsNatural(Class<T> clazz, String property, List<T> listOrderedAsc, List<T> listOrderedDesc, int nrOfExpectedElements) {
+
+ Assert.assertEquals(nrOfExpectedElements, listOrderedAsc.size());
+ Assert.assertEquals(nrOfExpectedElements, listOrderedDesc.size());
+
+ if (nrOfExpectedElements > 1) {
+
+ for (int i = 1; i < listOrderedAsc.size(); i++) {
+
+ // ascending check
+ Comparable c1 = (Comparable) invokeGetter(property, clazz, listOrderedAsc.get(i - 1));
+ Comparable c2 = (Comparable) invokeGetter(property, clazz, listOrderedAsc.get(i));
+ if (c1 != null && c2 != null) {
+ Assert.assertTrue("The ascending list does not have a natural order",c1.compareTo(c2) <= 0); // c1 <= c2 when ascending
+ }
+
+ // ascending check
+ Comparable c3 = (Comparable) invokeGetter(property, clazz, listOrderedDesc.get(i - 1));
+ Comparable c4 = (Comparable) invokeGetter(property, clazz, listOrderedDesc.get(i));
+ if (c3 != null && c4 != null) {
+ Assert.assertTrue("The descending list does not have a natural order", c3.compareTo(c4) >= 0); // c3 >= c4 when ascending
+ }
+
+ }
+
+ }
+
+ }
+
+ private static <T> Object invokeGetter(String property, Class<T> clazz, T obj) {
+ try {
+ Method getter = clazz.getMethod("get" + property.substring(0, 1).toUpperCase() + property.substring(1));
+ return getter.invoke(obj);
+ } catch (Exception e) {
+ throw new RuntimeException("Couldn't invoke getter for property " + property);
+ }
+ }
+
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/ejb/JbpmEjbMockTestCase.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/ejb/JbpmEjbMockTestCase.java
new file mode 100644
index 0000000..d28c3e5
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/ejb/JbpmEjbMockTestCase.java
@@ -0,0 +1,46 @@
+package org.jbpm.test.ejb;
+import org.jbpm.test.JbpmTestCase;
+
+import com.mockrunner.ejb.EJBTestModule;
+import com.mockrunner.mock.ejb.EJBMockObjectFactory;
+
+
+public class JbpmEjbMockTestCase extends JbpmTestCase
+{
+
+ private EJBMockObjectFactory ejbMockFactory;
+ private EJBTestModule ejbTestModule;
+
+ private EJBTestModule createEJBTestModule()
+ {
+ return new EJBTestModule(getEJBMockObjectFactory());
+ }
+
+ private EJBMockObjectFactory createEJBMockObjectFactory()
+ {
+ return new EJBMockObjectFactory();
+ }
+
+ private EJBMockObjectFactory getEJBMockObjectFactory()
+ {
+ synchronized(EJBMockObjectFactory.class)
+ {
+ if(ejbMockFactory == null)
+ {
+ ejbMockFactory = createEJBMockObjectFactory();
+ }
+ }
+ return ejbMockFactory;
+ }
+
+ protected void bindToContext(String name, Object object) {
+ ejbTestModule.bindToContext(name, object);
+ }
+
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ ejbTestModule = createEJBTestModule();
+ }
+
+}
diff --git a/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/jms/JbpmJmsMockTestCase.java b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/jms/JbpmJmsMockTestCase.java
new file mode 100644
index 0000000..b3514f6
--- /dev/null
+++ b/Source/ThirdPart/jbpm.4.3.2/src/org/jbpm/test/jms/JbpmJmsMockTestCase.java
@@ -0,0 +1,68 @@
+package org.jbpm.test.jms;
+import javax.jms.ConnectionFactory;
+import javax.jms.Queue;
+
+import org.jbpm.test.ejb.JbpmEjbMockTestCase;
+
+import com.mockrunner.jms.DestinationManager;
+import com.mockrunner.jms.JMSTestModule;
+import com.mockrunner.mock.jms.JMSMockObjectFactory;
+
+
+public class JbpmJmsMockTestCase extends JbpmEjbMockTestCase
+{
+
+ private JMSMockObjectFactory jmsMockFactory;
+ private JMSTestModule jmsTestModule;
+
+ private ConnectionFactory connectionFactory;
+ private Queue queue;
+
+ private JMSTestModule createJMSTestModule(JMSMockObjectFactory mockFactory)
+ {
+ return new JMSTestModule(mockFactory);
+ }
+
+ private JMSMockObjectFactory createJMSMockObjectFactory()
+ {
+ return new JMSMockObjectFactory();
+ }
+
+ private JMSMockObjectFactory getJMSMockObjectFactory()
+ {
+ synchronized(JMSMockObjectFactory.class)
+ {
+ if(jmsMockFactory == null)
+ {
+ jmsMockFactory = createJMSMockObjectFactory();
+ }
+ }
+ return jmsMockFactory;
+ }
+
+ private DestinationManager getDestinationManager()
+ {
+ return jmsTestModule.getDestinationManager();
+ }
+
+ protected ConnectionFactory getConnectionFactory() {
+ if (connectionFactory == null) {
+ connectionFactory = getJMSMockObjectFactory().createMockConnectionFactory();
+ }
+ return connectionFactory;
+ }
+
+ protected Queue getQueue() {
+ if (queue == null) {
+ queue = getDestinationManager().createQueue("testQueue");
+ }
+ return queue;
+ }
+
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ jmsTestModule = createJMSTestModule(getJMSMockObjectFactory());
+ }
+
+}
diff --git a/Source/build.properties b/Source/build.properties
new file mode 100644
index 0000000..4f8a188
--- /dev/null
+++ b/Source/build.properties
@@ -0,0 +1,12 @@
+
+src.dir = ${basedir}/src
+dest.dir=${basedir}/dist
+
+#app.dir=${vci_home}
+
+lib.dir = ${app_home}/lib
+common.dir=${lib.dir}/common
+service.dir=${lib.dir}/service
+client.dir=${lib.dir}/client
+
+platform.version=2024
\ No newline at end of file
diff --git a/Source/platformProject/platform-parent.iml b/Source/platformProject/platform-parent.iml
new file mode 100644
index 0000000..f409c0e
--- /dev/null
+++ b/Source/platformProject/platform-parent.iml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+ <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+ <output url="file://$MODULE_DIR$/target/classes" />
+ <output-test url="file://$MODULE_DIR$/target/test-classes" />
+ <content url="file://$MODULE_DIR$">
+ <excludeFolder url="file://$MODULE_DIR$/target" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ </component>
+</module>
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIDataController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIDataController.java
index ca771e0..d8b8a26 100644
--- a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIDataController.java
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIDataController.java
@@ -102,6 +102,7 @@
* @return 鎵ц鐨勭粨鏋�
*/
@PutMapping("/editSave")
+ @VciUnCheckRight
@VciBusinessLog(operateName = "淇敼鏁版嵁",description = "${param.btmname}閲岀殑${param.oid}")
public BaseResult<Map<String,Object>> editSave(@RequestBody FormDataDTO formDataDTO){
return uiDataService.editSave(formDataDTO);
diff --git a/grid/app/common/commons-lang3-3.1.jar b/grid/app/common/commons-lang3-3.1.jar
new file mode 100644
index 0000000..a85e539
--- /dev/null
+++ b/grid/app/common/commons-lang3-3.1.jar
Binary files differ
diff --git a/grid/app/common/dom4j-1.6.1.jar b/grid/app/common/dom4j-1.6.1.jar
new file mode 100644
index 0000000..c8c4dbb
--- /dev/null
+++ b/grid/app/common/dom4j-1.6.1.jar
Binary files differ
diff --git a/grid/app/common/fastjson-1.2.83.jar b/grid/app/common/fastjson-1.2.83.jar
new file mode 100644
index 0000000..fd843ae
--- /dev/null
+++ b/grid/app/common/fastjson-1.2.83.jar
Binary files differ
diff --git a/grid/app/common/freemarker.jar b/grid/app/common/freemarker.jar
new file mode 100644
index 0000000..b13671d
--- /dev/null
+++ b/grid/app/common/freemarker.jar
Binary files differ
diff --git a/grid/app/common/icegridgui.jar b/grid/app/common/icegridgui.jar
new file mode 100644
index 0000000..d9ede54
--- /dev/null
+++ b/grid/app/common/icegridgui.jar
Binary files differ
diff --git a/grid/app/common/junit-4.8.jar b/grid/app/common/junit-4.8.jar
new file mode 100644
index 0000000..efdaa58
--- /dev/null
+++ b/grid/app/common/junit-4.8.jar
Binary files differ
diff --git a/grid/app/common/log4j-api-2.12.4.jar b/grid/app/common/log4j-api-2.12.4.jar
new file mode 100644
index 0000000..d427c18
--- /dev/null
+++ b/grid/app/common/log4j-api-2.12.4.jar
Binary files differ
diff --git a/grid/app/common/log4j-core-2.12.4.jar b/grid/app/common/log4j-core-2.12.4.jar
new file mode 100644
index 0000000..53b1e9a
--- /dev/null
+++ b/grid/app/common/log4j-core-2.12.4.jar
Binary files differ
diff --git a/grid/app/common/mail.jar b/grid/app/common/mail.jar
new file mode 100644
index 0000000..463a64b
--- /dev/null
+++ b/grid/app/common/mail.jar
Binary files differ
diff --git a/grid/app/common/plt-common.jar b/grid/app/common/plt-common.jar
new file mode 100644
index 0000000..37ac4f0
--- /dev/null
+++ b/grid/app/common/plt-common.jar
Binary files differ
diff --git a/grid/app/common/plt-slice.jar b/grid/app/common/plt-slice.jar
new file mode 100644
index 0000000..24b6da9
--- /dev/null
+++ b/grid/app/common/plt-slice.jar
Binary files differ
diff --git a/grid/app/service/BOFService.jar b/grid/app/service/BOFService.jar
new file mode 100644
index 0000000..6dc805e
--- /dev/null
+++ b/grid/app/service/BOFService.jar
Binary files differ
diff --git a/grid/app/service/FrameService.jar b/grid/app/service/FrameService.jar
new file mode 100644
index 0000000..66eecc7
--- /dev/null
+++ b/grid/app/service/FrameService.jar
Binary files differ
diff --git a/grid/app/service/OMDService.jar b/grid/app/service/OMDService.jar
new file mode 100644
index 0000000..c8b63c7
--- /dev/null
+++ b/grid/app/service/OMDService.jar
Binary files differ
diff --git a/grid/app/service/OQService.jar b/grid/app/service/OQService.jar
new file mode 100644
index 0000000..1172b43
--- /dev/null
+++ b/grid/app/service/OQService.jar
Binary files differ
diff --git a/grid/app/service/ServiceBase.jar b/grid/app/service/ServiceBase.jar
new file mode 100644
index 0000000..83e7699
--- /dev/null
+++ b/grid/app/service/ServiceBase.jar
Binary files differ
diff --git a/grid/app/service/UIService.jar b/grid/app/service/UIService.jar
new file mode 100644
index 0000000..4228266
--- /dev/null
+++ b/grid/app/service/UIService.jar
Binary files differ
diff --git a/grid/app/service/VolumeService.jar b/grid/app/service/VolumeService.jar
new file mode 100644
index 0000000..4f23db4
--- /dev/null
+++ b/grid/app/service/VolumeService.jar
Binary files differ
diff --git a/grid/app/service/WFPlugins.jar b/grid/app/service/WFPlugins.jar
new file mode 100644
index 0000000..54e06ca
--- /dev/null
+++ b/grid/app/service/WFPlugins.jar
Binary files differ
diff --git a/grid/app/service/WFService.jar b/grid/app/service/WFService.jar
new file mode 100644
index 0000000..872dde0
--- /dev/null
+++ b/grid/app/service/WFService.jar
Binary files differ
diff --git a/grid/app/thrid/IKAnalyzer2012FF_u1.jar b/grid/app/thrid/IKAnalyzer2012FF_u1.jar
new file mode 100644
index 0000000..9ec77c8
--- /dev/null
+++ b/grid/app/thrid/IKAnalyzer2012FF_u1.jar
Binary files differ
diff --git a/grid/app/thrid/XmlSchema-1.1.jar b/grid/app/thrid/XmlSchema-1.1.jar
new file mode 100644
index 0000000..a52c562
--- /dev/null
+++ b/grid/app/thrid/XmlSchema-1.1.jar
Binary files differ
diff --git a/grid/app/thrid/activation.jar b/grid/app/thrid/activation.jar
new file mode 100644
index 0000000..df8003b
--- /dev/null
+++ b/grid/app/thrid/activation.jar
Binary files differ
diff --git a/grid/app/thrid/antlr-2.7.6.jar b/grid/app/thrid/antlr-2.7.6.jar
new file mode 100644
index 0000000..3702b64
--- /dev/null
+++ b/grid/app/thrid/antlr-2.7.6.jar
Binary files differ
diff --git a/grid/app/thrid/avalon-framework-4.1.5.jar b/grid/app/thrid/avalon-framework-4.1.5.jar
new file mode 100644
index 0000000..a24b1c7
--- /dev/null
+++ b/grid/app/thrid/avalon-framework-4.1.5.jar
Binary files differ
diff --git a/grid/app/thrid/axis-ant.jar b/grid/app/thrid/axis-ant.jar
new file mode 100644
index 0000000..17527ff
--- /dev/null
+++ b/grid/app/thrid/axis-ant.jar
Binary files differ
diff --git a/grid/app/thrid/axis.jar b/grid/app/thrid/axis.jar
new file mode 100644
index 0000000..20b09a5
--- /dev/null
+++ b/grid/app/thrid/axis.jar
Binary files differ
diff --git a/grid/app/thrid/bsf-2.3.0.jar b/grid/app/thrid/bsf-2.3.0.jar
new file mode 100644
index 0000000..caa4dea
--- /dev/null
+++ b/grid/app/thrid/bsf-2.3.0.jar
Binary files differ
diff --git a/grid/app/thrid/bsh.jar b/grid/app/thrid/bsh.jar
new file mode 100644
index 0000000..e326510
--- /dev/null
+++ b/grid/app/thrid/bsh.jar
Binary files differ
diff --git a/grid/app/thrid/c3p0-0.9.1.jar b/grid/app/thrid/c3p0-0.9.1.jar
new file mode 100644
index 0000000..693667a
--- /dev/null
+++ b/grid/app/thrid/c3p0-0.9.1.jar
Binary files differ
diff --git a/grid/app/thrid/commons-codec-1.3.jar b/grid/app/thrid/commons-codec-1.3.jar
new file mode 100644
index 0000000..957b675
--- /dev/null
+++ b/grid/app/thrid/commons-codec-1.3.jar
Binary files differ
diff --git a/grid/app/thrid/commons-collections-3.1.jar b/grid/app/thrid/commons-collections-3.1.jar
new file mode 100644
index 0000000..41e230f
--- /dev/null
+++ b/grid/app/thrid/commons-collections-3.1.jar
Binary files differ
diff --git a/grid/app/thrid/commons-dbcp-1.1.jar b/grid/app/thrid/commons-dbcp-1.1.jar
new file mode 100644
index 0000000..c3c4d1f
--- /dev/null
+++ b/grid/app/thrid/commons-dbcp-1.1.jar
Binary files differ
diff --git a/grid/app/thrid/commons-discovery-0.2.jar b/grid/app/thrid/commons-discovery-0.2.jar
new file mode 100644
index 0000000..b885548
--- /dev/null
+++ b/grid/app/thrid/commons-discovery-0.2.jar
Binary files differ
diff --git a/grid/app/thrid/commons-fileupload-1.2.2.jar b/grid/app/thrid/commons-fileupload-1.2.2.jar
new file mode 100644
index 0000000..131f192
--- /dev/null
+++ b/grid/app/thrid/commons-fileupload-1.2.2.jar
Binary files differ
diff --git a/grid/app/thrid/commons-httpclient-3.0.jar b/grid/app/thrid/commons-httpclient-3.0.jar
new file mode 100644
index 0000000..54a9300
--- /dev/null
+++ b/grid/app/thrid/commons-httpclient-3.0.jar
Binary files differ
diff --git a/grid/app/thrid/commons-io-2.0.1.jar b/grid/app/thrid/commons-io-2.0.1.jar
new file mode 100644
index 0000000..5b64b7d
--- /dev/null
+++ b/grid/app/thrid/commons-io-2.0.1.jar
Binary files differ
diff --git a/grid/app/thrid/commons-logging-1.0.4.jar b/grid/app/thrid/commons-logging-1.0.4.jar
new file mode 100644
index 0000000..b73a80f
--- /dev/null
+++ b/grid/app/thrid/commons-logging-1.0.4.jar
Binary files differ
diff --git a/grid/app/thrid/commons-net-1.4.1.jar b/grid/app/thrid/commons-net-1.4.1.jar
new file mode 100644
index 0000000..9666a92
--- /dev/null
+++ b/grid/app/thrid/commons-net-1.4.1.jar
Binary files differ
diff --git a/grid/app/thrid/commons-pool2-2.6.2.jar b/grid/app/thrid/commons-pool2-2.6.2.jar
new file mode 100644
index 0000000..4233f08
--- /dev/null
+++ b/grid/app/thrid/commons-pool2-2.6.2.jar
Binary files differ
diff --git a/grid/app/thrid/geronimo-stax-api_1.0_spec-1.0.jar b/grid/app/thrid/geronimo-stax-api_1.0_spec-1.0.jar
new file mode 100644
index 0000000..0d6d374
--- /dev/null
+++ b/grid/app/thrid/geronimo-stax-api_1.0_spec-1.0.jar
Binary files differ
diff --git a/grid/app/thrid/guava-20.0.jar b/grid/app/thrid/guava-20.0.jar
new file mode 100644
index 0000000..632772f
--- /dev/null
+++ b/grid/app/thrid/guava-20.0.jar
Binary files differ
diff --git a/grid/app/thrid/hibernate-jpa-2.0-api-1.0.1.Final.jar b/grid/app/thrid/hibernate-jpa-2.0-api-1.0.1.Final.jar
new file mode 100644
index 0000000..1e9f71b
--- /dev/null
+++ b/grid/app/thrid/hibernate-jpa-2.0-api-1.0.1.Final.jar
Binary files differ
diff --git a/grid/app/thrid/hibernate3.jar b/grid/app/thrid/hibernate3.jar
new file mode 100644
index 0000000..73df7b1
--- /dev/null
+++ b/grid/app/thrid/hibernate3.jar
Binary files differ
diff --git a/grid/app/thrid/inforbroker-core-5.1.0.jar b/grid/app/thrid/inforbroker-core-5.1.0.jar
new file mode 100644
index 0000000..352b2a5
--- /dev/null
+++ b/grid/app/thrid/inforbroker-core-5.1.0.jar
Binary files differ
diff --git a/grid/app/thrid/javassist-3.12.0.GA.jar b/grid/app/thrid/javassist-3.12.0.GA.jar
new file mode 100644
index 0000000..8f692f4
--- /dev/null
+++ b/grid/app/thrid/javassist-3.12.0.GA.jar
Binary files differ
diff --git a/grid/app/thrid/jaxen-1.1-beta-9.jar b/grid/app/thrid/jaxen-1.1-beta-9.jar
new file mode 100644
index 0000000..e290706
--- /dev/null
+++ b/grid/app/thrid/jaxen-1.1-beta-9.jar
Binary files differ
diff --git a/grid/app/thrid/jaxrpc.jar b/grid/app/thrid/jaxrpc.jar
new file mode 100644
index 0000000..a2c13d9
--- /dev/null
+++ b/grid/app/thrid/jaxrpc.jar
Binary files differ
diff --git a/grid/app/thrid/jbpm-4.3.2.jar b/grid/app/thrid/jbpm-4.3.2.jar
new file mode 100644
index 0000000..21ccd58
--- /dev/null
+++ b/grid/app/thrid/jbpm-4.3.2.jar
Binary files differ
diff --git a/grid/app/thrid/jcalendar-1.3.3.jar b/grid/app/thrid/jcalendar-1.3.3.jar
new file mode 100644
index 0000000..2e13b77
--- /dev/null
+++ b/grid/app/thrid/jcalendar-1.3.3.jar
Binary files differ
diff --git a/grid/app/thrid/jcommon-1.0.17.jar b/grid/app/thrid/jcommon-1.0.17.jar
new file mode 100644
index 0000000..f1bd165
--- /dev/null
+++ b/grid/app/thrid/jcommon-1.0.17.jar
Binary files differ
diff --git a/grid/app/thrid/jdom-1.0.jar b/grid/app/thrid/jdom-1.0.jar
new file mode 100644
index 0000000..30d3977
--- /dev/null
+++ b/grid/app/thrid/jdom-1.0.jar
Binary files differ
diff --git a/grid/app/thrid/jdsl.jar b/grid/app/thrid/jdsl.jar
new file mode 100644
index 0000000..c225421
--- /dev/null
+++ b/grid/app/thrid/jdsl.jar
Binary files differ
diff --git a/grid/app/thrid/jedis-2.9.0.jar b/grid/app/thrid/jedis-2.9.0.jar
new file mode 100644
index 0000000..f4d27d3
--- /dev/null
+++ b/grid/app/thrid/jedis-2.9.0.jar
Binary files differ
diff --git a/grid/app/thrid/jee-management-1.1.jar b/grid/app/thrid/jee-management-1.1.jar
new file mode 100644
index 0000000..1911f08
--- /dev/null
+++ b/grid/app/thrid/jee-management-1.1.jar
Binary files differ
diff --git a/grid/app/thrid/jfreechart-1.0.14.jar b/grid/app/thrid/jfreechart-1.0.14.jar
new file mode 100644
index 0000000..0e4d020
--- /dev/null
+++ b/grid/app/thrid/jfreechart-1.0.14.jar
Binary files differ
diff --git a/grid/app/thrid/jms-1.1.jar b/grid/app/thrid/jms-1.1.jar
new file mode 100644
index 0000000..dad227f
--- /dev/null
+++ b/grid/app/thrid/jms-1.1.jar
Binary files differ
diff --git a/grid/app/thrid/jta-1.1.jar b/grid/app/thrid/jta-1.1.jar
new file mode 100644
index 0000000..6d225b7
--- /dev/null
+++ b/grid/app/thrid/jta-1.1.jar
Binary files differ
diff --git a/grid/app/thrid/juel-engine.jar b/grid/app/thrid/juel-engine.jar
new file mode 100644
index 0000000..d1de8a7
--- /dev/null
+++ b/grid/app/thrid/juel-engine.jar
Binary files differ
diff --git a/grid/app/thrid/juel-impl.jar b/grid/app/thrid/juel-impl.jar
new file mode 100644
index 0000000..53c3522
--- /dev/null
+++ b/grid/app/thrid/juel-impl.jar
Binary files differ
diff --git a/grid/app/thrid/juel.jar b/grid/app/thrid/juel.jar
new file mode 100644
index 0000000..6fda56c
--- /dev/null
+++ b/grid/app/thrid/juel.jar
Binary files differ
diff --git a/grid/app/thrid/livetribe-jsr223.jar b/grid/app/thrid/livetribe-jsr223.jar
new file mode 100644
index 0000000..8d38ba1
--- /dev/null
+++ b/grid/app/thrid/livetribe-jsr223.jar
Binary files differ
diff --git a/grid/app/thrid/logkit-1.2.jar b/grid/app/thrid/logkit-1.2.jar
new file mode 100644
index 0000000..67d4866
--- /dev/null
+++ b/grid/app/thrid/logkit-1.2.jar
Binary files differ
diff --git a/grid/app/thrid/ognl-2.6.11.jar b/grid/app/thrid/ognl-2.6.11.jar
new file mode 100644
index 0000000..19cd379
--- /dev/null
+++ b/grid/app/thrid/ognl-2.6.11.jar
Binary files differ
diff --git a/grid/app/thrid/ojdbc8.jar b/grid/app/thrid/ojdbc8.jar
new file mode 100644
index 0000000..bf41243
--- /dev/null
+++ b/grid/app/thrid/ojdbc8.jar
Binary files differ
diff --git a/grid/app/thrid/picocontainer-1.2.jar b/grid/app/thrid/picocontainer-1.2.jar
new file mode 100644
index 0000000..fbb1c92
--- /dev/null
+++ b/grid/app/thrid/picocontainer-1.2.jar
Binary files differ
diff --git a/grid/app/thrid/plugin.jar b/grid/app/thrid/plugin.jar
new file mode 100644
index 0000000..52a401b
--- /dev/null
+++ b/grid/app/thrid/plugin.jar
Binary files differ
diff --git a/grid/app/thrid/poi-3.9-20121203.jar b/grid/app/thrid/poi-3.9-20121203.jar
new file mode 100644
index 0000000..0f46288
--- /dev/null
+++ b/grid/app/thrid/poi-3.9-20121203.jar
Binary files differ
diff --git a/grid/app/thrid/poi-ooxml-3.9-20121203.jar b/grid/app/thrid/poi-ooxml-3.9-20121203.jar
new file mode 100644
index 0000000..8792d46
--- /dev/null
+++ b/grid/app/thrid/poi-ooxml-3.9-20121203.jar
Binary files differ
diff --git a/grid/app/thrid/poi-ooxml-schemas-3.9-20121203.jar b/grid/app/thrid/poi-ooxml-schemas-3.9-20121203.jar
new file mode 100644
index 0000000..eda4ef4
--- /dev/null
+++ b/grid/app/thrid/poi-ooxml-schemas-3.9-20121203.jar
Binary files differ
diff --git a/grid/app/thrid/poi-scratchpad-3.9-20121203.jar b/grid/app/thrid/poi-scratchpad-3.9-20121203.jar
new file mode 100644
index 0000000..1520855
--- /dev/null
+++ b/grid/app/thrid/poi-scratchpad-3.9-20121203.jar
Binary files differ
diff --git a/grid/app/thrid/portalcustom.jar b/grid/app/thrid/portalcustom.jar
new file mode 100644
index 0000000..2c0af22
--- /dev/null
+++ b/grid/app/thrid/portalcustom.jar
Binary files differ
diff --git a/grid/app/thrid/proxool-0.8.3.jar b/grid/app/thrid/proxool-0.8.3.jar
new file mode 100644
index 0000000..c4f700c
--- /dev/null
+++ b/grid/app/thrid/proxool-0.8.3.jar
Binary files differ
diff --git a/grid/app/thrid/quartz-all-1.8.6.jar b/grid/app/thrid/quartz-all-1.8.6.jar
new file mode 100644
index 0000000..86901d1
--- /dev/null
+++ b/grid/app/thrid/quartz-all-1.8.6.jar
Binary files differ
diff --git a/grid/app/thrid/rsyntax.jar b/grid/app/thrid/rsyntax.jar
new file mode 100644
index 0000000..6903d1a
--- /dev/null
+++ b/grid/app/thrid/rsyntax.jar
Binary files differ
diff --git a/grid/app/thrid/saaj.jar b/grid/app/thrid/saaj.jar
new file mode 100644
index 0000000..4ea696e
--- /dev/null
+++ b/grid/app/thrid/saaj.jar
Binary files differ
diff --git a/grid/app/thrid/sapjco.jar b/grid/app/thrid/sapjco.jar
new file mode 100644
index 0000000..e18912e
--- /dev/null
+++ b/grid/app/thrid/sapjco.jar
Binary files differ
diff --git a/grid/app/thrid/slf4j-api-1.7.14.jar b/grid/app/thrid/slf4j-api-1.7.14.jar
new file mode 100644
index 0000000..d5d64c4
--- /dev/null
+++ b/grid/app/thrid/slf4j-api-1.7.14.jar
Binary files differ
diff --git a/grid/app/thrid/slf4j-jdk14-1.7.14.jar b/grid/app/thrid/slf4j-jdk14-1.7.14.jar
new file mode 100644
index 0000000..720f7fd
--- /dev/null
+++ b/grid/app/thrid/slf4j-jdk14-1.7.14.jar
Binary files differ
diff --git a/grid/app/thrid/xml-apis.jar b/grid/app/thrid/xml-apis.jar
new file mode 100644
index 0000000..d42c0ea
--- /dev/null
+++ b/grid/app/thrid/xml-apis.jar
Binary files differ
diff --git a/grid/app/thrid/xmlbeans-2.3.0.jar b/grid/app/thrid/xmlbeans-2.3.0.jar
new file mode 100644
index 0000000..ccd8163
--- /dev/null
+++ b/grid/app/thrid/xmlbeans-2.3.0.jar
Binary files differ
diff --git a/grid/app/thrid/xmlsec-1.3.0.jar b/grid/app/thrid/xmlsec-1.3.0.jar
new file mode 100644
index 0000000..6b69b80
--- /dev/null
+++ b/grid/app/thrid/xmlsec-1.3.0.jar
Binary files differ
diff --git a/grid/app/thrid/xstream-1.3.1.jar b/grid/app/thrid/xstream-1.3.1.jar
new file mode 100644
index 0000000..4ef4219
--- /dev/null
+++ b/grid/app/thrid/xstream-1.3.1.jar
Binary files differ
diff --git a/grid/application.xml b/grid/application.xml
new file mode 100644
index 0000000..727a5cf
--- /dev/null
+++ b/grid/application.xml
@@ -0,0 +1,332 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!-- This file was written by IceGrid GUI -->
+<icegrid>
+ <application name="VCI-PLT">
+ <variable name="LLIB_HOME" value="${LPLT_HOME}/lib"/>
+ <variable name="LPLT_HOME" value="/usr/vci-plt"/>
+ <variable name="WLIB_HOME" value="${WPLT_HOME}/lib"/>
+ <variable name="WPLT_HOME" value="D:/VCI-PLT/R2024"/>
+
+ <server-template id="BOFServerTemplWin">
+ <parameter name="id"/>
+ <icebox id="BOFServer-${id}" activation="on-demand" exe="java">
+ <option>com.zeroc.IceBox.Server</option>
+ <env>CLASSPATH=${WLIB_HOME}/thrid/*;${WLIB_HOME}/common/*;${WLIB_HOME}/service/*</env>
+ <properties>
+ <properties refid="props"/>
+ </properties>
+ <service name="BOFService" entry="com.vci.server.BOFactoryBoxService">
+ <properties>
+ <property name="${service}.Identity" value="${server}-${service}"/>
+ </properties>
+ <adapter name="BOFService" endpoints="default" id="BOFService-${id}" replica-group="BOFServiceRep"/>
+ </service>
+ </icebox>
+ </server-template>
+ <server-template id="BOFServerTemplate">
+ <parameter name="id"/>
+ <icebox id="BOFServer-${id}" activation="on-demand" exe="java">
+ <option>com.zeroc.IceBox.Server</option>
+ <env>CLASSPATH=${LLIB_HOME}/thrid/*:${LLIB_HOME}/common/*:${LLIB_HOME}/service/*</env>
+ <properties>
+ <properties refid="props"/>
+ </properties>
+ <service name="BOFService" entry="com.vci.server.BOFactoryBoxService">
+ <properties>
+ <property name="${service}.Identity" value="${server}-${service}"/>
+ </properties>
+ <adapter name="BOFService" endpoints="default" id="BOFService-${id}" replica-group="BOFServiceRep"/>
+ </service>
+ </icebox>
+ </server-template>
+ <server-template id="CacheServerTemplWin">
+ <parameter name="id"/>
+ <icebox id="CacheServer-${id}" activation="always" exe="java">
+ <option>com.zeroc.IceBox.Server</option>
+ <env>CLASSPATH=${WLIB_HOME}/thrid/*;${WLIB_HOME}/common/*;${WLIB_HOME}/service/*</env>
+ <properties>
+ <properties refid="props"/>
+ </properties>
+ <service name="CacheService" entry="com.vci.server.CacheBoxService">
+ <properties>
+ <property name="${service}.Identity" value="${server}-${service}"/>
+ </properties>
+ <adapter name="CacheService" endpoints="default" id="CacheService-${id}" replica-group="CacheServiceRep"/>
+ </service>
+ </icebox>
+ </server-template>
+ <server-template id="CacheServerTemplate">
+ <parameter name="id"/>
+ <icebox id="CacheServer-${id}" activation="always" exe="java">
+ <option>com.zeroc.IceBox.Server</option>
+ <env>CLASSPATH=${LLIB_HOME}/thrid/*:${LLIB_HOME}/common/*:${LLIB_HOME}/service/*</env>
+ <properties>
+ <properties refid="props"/>
+ </properties>
+ <service name="CacheService" entry="com.vci.server.CacheBoxService">
+ <properties>
+ <property name="${service}.Identity" value="${server}-${service}"/>
+ </properties>
+ <adapter name="CacheService" endpoints="default" id="CacheService-${id}" replica-group="CacheServiceRep"/>
+ </service>
+ </icebox>
+ </server-template>
+ <server-template id="FrameServerTemplWin">
+ <parameter name="id"/>
+ <icebox id="FrameServer-${id}" activation="on-demand" exe="java">
+ <option>com.zeroc.IceBox.Server</option>
+ <env>CLASSPATH=${WLIB_HOME}/thrid/*;${WLIB_HOME}/common/*;${WLIB_HOME}/service/*</env>
+ <properties>
+ <properties refid="props"/>
+ </properties>
+ <service name="FrameService" entry="com.vci.server.FrameBoxService">
+ <properties>
+ <property name="${service}.Identity" value="${server}-${service}"/>
+ </properties>
+ <adapter name="FrameService" endpoints="default" id="FrameService-${id}" replica-group="FrameServiceRep"/>
+ </service>
+ </icebox>
+ </server-template>
+ <server-template id="FrameServerTemplate">
+ <parameter name="id"/>
+ <icebox id="FrameServer-${id}" activation="on-demand" exe="java">
+ <option>com.zeroc.IceBox.Server</option>
+ <env>CLASSPATH=${LLIB_HOME}/thrid/*:${LLIB_HOME}/common/*:${LLIB_HOME}/service/*</env>
+ <properties>
+ <properties refid="props"/>
+ </properties>
+ <service name="FrameService" entry="com.vci.server.FrameBoxService">
+ <properties>
+ <property name="${service}.Identity" value="${server}-${service}"/>
+ </properties>
+ <adapter name="FrameService" endpoints="default" id="FrameService-${id}" replica-group="FrameServiceRep"/>
+ </service>
+ </icebox>
+ </server-template>
+ <server-template id="OMDServerTemplWin">
+ <parameter name="id"/>
+ <icebox id="OMDServer-${id}" activation="on-demand" exe="java">
+ <option>com.zeroc.IceBox.Server</option>
+ <env>CLASSPATH=${WLIB_HOME}/thrid/*;${WLIB_HOME}/common/*;${WLIB_HOME}/service/*</env>
+ <properties>
+ <properties refid="props"/>
+ </properties>
+ <service name="OMDService" entry="com.vci.server.OMDBoxService">
+ <properties>
+ <property name="${service}.Identity" value="${server}-${service}"/>
+ </properties>
+ <adapter name="OMDService" endpoints="default" id="OMDService-${id}" replica-group="OMDServiceRep"/>
+ </service>
+ </icebox>
+ </server-template>
+ <server-template id="OMDServerTemplate">
+ <parameter name="id"/>
+ <icebox id="OMDServer-${id}" activation="on-demand" exe="java">
+ <option>com.zeroc.IceBox.Server</option>
+ <env>CLASSPATH=${LLIB_HOME}/thrid/*:${LLIB_HOME}/common/*:${LLIB_HOME}/service/*</env>
+ <properties>
+ <properties refid="props"/>
+ </properties>
+ <service name="OMDService" entry="com.vci.server.OMDBoxService">
+ <properties>
+ <property name="${service}.Identity" value="${server}-${service}"/>
+ </properties>
+ <adapter name="OMDService" endpoints="default" id="OMDService-${id}" replica-group="OMDServiceRep"/>
+ </service>
+ </icebox>
+ </server-template>
+ <server-template id="OQServerTemplWin">
+ <parameter name="id"/>
+ <icebox id="OQServer-${id}" activation="on-demand" exe="java">
+ <option>com.zeroc.IceBox.Server</option>
+ <env>CLASSPATH=${WLIB_HOME}/thrid/*;${WLIB_HOME}/common/*;${WLIB_HOME}/service/*</env>
+ <properties>
+ <properties refid="props"/>
+ </properties>
+ <service name="OQService" entry="com.vci.server.ObjectQueryBoxService">
+ <properties>
+ <property name="${service}.Identity" value="${server}-${service}"/>
+ </properties>
+ <adapter name="OQService" endpoints="default" id="OQService-${id}" replica-group="OQServiceRep"/>
+ </service>
+ </icebox>
+ </server-template>
+ <server-template id="OQServerTemplate">
+ <parameter name="id"/>
+ <icebox id="OQServer-${id}" activation="on-demand" exe="java">
+ <option>com.zeroc.IceBox.Server</option>
+ <env>CLASSPATH=${LLIB_HOME}/thrid/*:${LLIB_HOME}/common/*:${LLIB_HOME}/service/*</env>
+ <properties>
+ <properties refid="props"/>
+ </properties>
+ <service name="OQService" entry="com.vci.server.ObjectQueryBoxService">
+ <properties>
+ <property name="${service}.Identity" value="${server}-${service}"/>
+ </properties>
+ <adapter name="OQService" endpoints="default" id="OQService-${id}" replica-group="OQServiceRep"/>
+ </service>
+ </icebox>
+ </server-template>
+ <server-template id="UIServerTemplWin">
+ <parameter name="id"/>
+ <icebox id="UIServer-${id}" activation="on-demand" exe="java">
+ <option>com.zeroc.IceBox.Server</option>
+ <env>CLASSPATH=${WLIB_HOME}/thrid/*;${WLIB_HOME}/common/*;${WLIB_HOME}/service/*</env>
+ <properties>
+ <properties refid="props"/>
+ </properties>
+ <service name="UIService" entry="com.vci.server.UIBoxService">
+ <properties>
+ <property name="${service}.Identity" value="${server}-${service}"/>
+ </properties>
+ <adapter name="UIService" endpoints="default" id="UIService-${id}" replica-group="UIServiceRep"/>
+ </service>
+ </icebox>
+ </server-template>
+ <server-template id="UIServerTemplate">
+ <parameter name="id"/>
+ <icebox id="UIServer-${id}" activation="on-demand" exe="java">
+ <option>com.zeroc.IceBox.Server</option>
+ <env>CLASSPATH=${LLIB_HOME}/thrid/*:${LLIB_HOME}/common/*:${LLIB_HOME}/service/*</env>
+ <properties>
+ <properties refid="props"/>
+ </properties>
+ <service name="UIService" entry="com.vci.server.UIBoxService">
+ <properties>
+ <property name="${service}.Identity" value="${server}-${service}"/>
+ </properties>
+ <adapter name="UIService" endpoints="default" id="UIService-${id}" replica-group="UIServiceRep"/>
+ </service>
+ </icebox>
+ </server-template>
+ <server-template id="VolumeServerTemplWin">
+ <parameter name="id"/>
+ <icebox id="VolumeServer-${id}" activation="on-demand" exe="java">
+ <option>com.zeroc.IceBox.Server</option>
+ <env>CLASSPATH=${WLIB_HOME}/thrid/*;${WLIB_HOME}/common/*;${WLIB_HOME}/service/*</env>
+ <properties>
+ <properties refid="props"/>
+ </properties>
+ <service name="DefaultVolumeService" entry="com.vci.server.VolumeBoxService">
+ <properties>
+ <property name="${service}.Identity" value="${server}-${service}"/>
+ </properties>
+ <adapter name="VolumeService" endpoints="default" id="VolumeService-${id}" replica-group="VolumeServiceRep"/>
+ </service>
+ </icebox>
+ </server-template>
+ <server-template id="VolumeServerTemplate">
+ <parameter name="id"/>
+ <icebox id="VolumeServer-${id}" activation="on-demand" exe="java">
+ <option>com.zeroc.IceBox.Server</option>
+ <env>CLASSPATH=${LLIB_HOME}/thrid/*:${LLIB_HOME}/common/*:${LLIB_HOME}/service/*</env>
+ <properties>
+ <properties refid="props"/>
+ </properties>
+ <service name="DefaultVolumeService" entry="com.vci.server.VolumeBoxService">
+ <properties>
+ <property name="${service}.Identity" value="${server}-${service}"/>
+ </properties>
+ <adapter name="VolumeService" endpoints="default" id="VolumeService-${id}" replica-group="VolumeServiceRep"/>
+ </service>
+ </icebox>
+ </server-template>
+ <server-template id="WFServerTemplWin">
+ <parameter name="id"/>
+ <icebox id="WFServer-${id}" activation="on-demand" exe="java">
+ <option>com.zeroc.IceBox.Server</option>
+ <env>CLASSPATH=${WLIB_HOME}/thrid/*;${WLIB_HOME}/common/*;${WLIB_HOME}/service/*</env>
+ <properties>
+ <properties refid="props"/>
+ </properties>
+ <service name="WFService" entry="com.vci.server.WorkflowBoxService">
+ <properties>
+ <property name="${service}.Identity" value="${server}-${service}"/>
+ </properties>
+ <adapter name="WFService" endpoints="default" id="WFService-${id}" replica-group="WFServiceRep"/>
+ </service>
+ </icebox>
+ </server-template>
+ <server-template id="WFServerTemplate">
+ <parameter name="id"/>
+ <icebox id="WFServer-${id}" activation="on-demand" exe="java">
+ <option>com.zeroc.IceBox.Server</option>
+ <env>CLASSPATH=${LLIB_HOME}/thrid/*:${LLIB_HOME}/common/*:${LLIB_HOME}/service/*</env>
+ <properties>
+ <properties refid="props"/>
+ </properties>
+ <service name="WFService" entry="com.vci.server.WorkflowBoxService">
+ <properties>
+ <property name="${service}.Identity" value="${server}-${service}"/>
+ </properties>
+ <adapter name="WFService" endpoints="default" id="WFService-${id}" replica-group="WFServiceRep"/>
+ </service>
+ </icebox>
+ </server-template>
+ <replica-group id="BOFServiceRep">
+ <load-balancing type="round-robin" n-replicas="0"/>
+ <object identity="BOFService" type="::vci::plt::service::BOFService"/>
+ </replica-group>
+ <replica-group id="CacheServiceRep">
+ <load-balancing type="round-robin" n-replicas="0"/>
+ <object identity="CacheService" type="::vci::plt::service::CacheService"/>
+ </replica-group>
+ <replica-group id="FrameServiceRep">
+ <load-balancing type="round-robin" n-replicas="0"/>
+ <object identity="FrameService" type="::vci::plt::service::FrameService"/>
+ </replica-group>
+ <replica-group id="OMDServiceRep">
+ <load-balancing type="round-robin" n-replicas="0"/>
+ <object identity="OMDService" type="::vci::plt::service::OMDService"/>
+ </replica-group>
+ <replica-group id="OQServiceRep">
+ <load-balancing type="round-robin" n-replicas="0"/>
+ <object identity="OQService" type="::vci::plt::service::OQService"/>
+ </replica-group>
+ <replica-group id="UIServiceRep">
+ <load-balancing type="round-robin" n-replicas="0"/>
+ <object identity="UIService" type="::vci::plt::service::UIService"/>
+ </replica-group>
+ <replica-group id="VolumeServiceRep">
+ <load-balancing type="round-robin" n-replicas="0"/>
+ <object identity="VolumeService" type="::vci::plt::service::VolumeService"/>
+ </replica-group>
+ <replica-group id="WFServiceRep">
+ <load-balancing type="round-robin" n-replicas="0"/>
+ <object identity="WFService" type="::vci::plt::service::WFService"/>
+ </replica-group>
+
+ <properties id="props">
+ <property name="Ice.ThreadPool.Server.Size" value="10"/>
+ </properties>
+ <node name="WinNode">
+ <variable name="name" value="WNode"/>
+ <server-instance template="CacheServerTemplWin" id="${name}-1"/>
+ <server-instance template="FrameServerTemplWin" id="${name}-1"/>
+ <server-instance template="FrameServerTemplWin" id="${name}-2"/>
+ <server-instance template="OMDServerTemplWin" id="${name}-1"/>
+ <server-instance template="OMDServerTemplWin" id="${name}-2"/>
+ <server-instance template="BOFServerTemplWin" id="${name}-1"/>
+ <server-instance template="BOFServerTemplWin" id="${name}-2"/>
+ <server-instance template="OQServerTemplWin" id="${name}-1"/>
+ <server-instance template="OQServerTemplWin" id="${name}-2"/>
+ <server-instance template="OQServerTemplWin" id="${name}-3"/>
+ <server-instance template="UIServerTemplWin" id="${name}-1"/>
+ <server-instance template="UIServerTemplWin" id="${name}-2"/>
+ <server-instance template="WFServerTemplWin" id="${name}-1"/>
+ <server-instance template="VolumeServerTemplWin" id="${name}-1"/>
+ </node>
+ <node name="LinuxNode">
+ <variable name="name" value="LNode"/>
+ <server-instance template="BOFServerTemplate" id="${name}-1"/>
+ <server-instance template="BOFServerTemplate" id="${name}-2"/>
+ <server-instance template="CacheServerTemplate" id="${name}-1"/>
+ <server-instance template="OQServerTemplate" id="${name}-1"/>
+ <server-instance template="OQServerTemplate" id="${name}-2"/>
+ <server-instance template="OQServerTemplate" id="${name}-3"/>
+ <server-instance template="UIServerTemplate" id="${name}-1"/>
+ <server-instance template="VolumeServerTemplate" id="${name}-1"/>
+ <server-instance template="WFServerTemplate" id="${name}-1"/>
+ </node>
+ </application>
+</icegrid>
diff --git a/grid/jre/COPYRIGHT b/grid/jre/COPYRIGHT
new file mode 100644
index 0000000..1d2682f
--- /dev/null
+++ b/grid/jre/COPYRIGHT
@@ -0,0 +1,69 @@
+Copyright � 1993, 2020, Oracle and/or its affiliates.
+All rights reserved.
+
+This software and related documentation are provided under a
+license agreement containing restrictions on use and
+disclosure and are protected by intellectual property laws.
+Except as expressly permitted in your license agreement or
+allowed by law, you may not use, copy, reproduce, translate,
+broadcast, modify, license, transmit, distribute, exhibit,
+perform, publish, or display any part, in any form, or by
+any means. Reverse engineering, disassembly, or
+decompilation of this software, unless required by law for
+interoperability, is prohibited.
+
+The information contained herein is subject to change
+without notice and is not warranted to be error-free. If you
+find any errors, please report them to us in writing.
+
+If this is software or related documentation that is
+delivered to the U.S. Government or anyone licensing it on
+behalf of the U.S. Government, the following notice is
+applicable:
+
+U.S. GOVERNMENT END USERS: Oracle programs, including any
+operating system, integrated software, any programs
+installed on the hardware, and/or documentation, delivered
+to U.S. Government end users are "commercial computer
+software" pursuant to the applicable Federal Acquisition
+Regulation and agency-specific supplemental regulations. As
+such, use, duplication, disclosure, modification, and
+adaptation of the programs, including any operating system,
+integrated software, any programs installed on the hardware,
+and/or documentation, shall be subject to license terms and
+license restrictions applicable to the programs. No other
+rights are granted to the U.S. Government.
+
+This software or hardware is developed for general use in a
+variety of information management applications. It is not
+developed or intended for use in any inherently dangerous
+applications, including applications that may create a risk
+of personal injury. If you use this software or hardware in
+dangerous applications, then you shall be responsible to
+take all appropriate fail-safe, backup, redundancy, and
+other measures to ensure its safe use. Oracle Corporation
+and its affiliates disclaim any liability for any damages
+caused by use of this software or hardware in dangerous
+applications.
+
+Oracle and Java are registered trademarks of Oracle and/or
+its affiliates. Other names may be trademarks of their
+respective owners.
+
+Intel and Intel Xeon are trademarks or registered trademarks
+of Intel Corporation. All SPARC trademarks are used under
+license and are trademarks or registered trademarks of SPARC
+International, Inc. AMD, Opteron, the AMD logo, and the AMD
+Opteron logo are trademarks or registered trademarks of
+Advanced Micro Devices. UNIX is a registered trademark of
+The Open Group.
+
+This software or hardware and documentation may provide
+access to or information on content, products, and services
+from third parties. Oracle Corporation and its affiliates
+are not responsible for and expressly disclaim all
+warranties of any kind with respect to third-party content,
+products, and services. Oracle Corporation and its
+affiliates will not be responsible for any loss, costs, or
+damages incurred due to your access to or use of third-party
+content, products, or services.
diff --git a/grid/jre/LICENSE b/grid/jre/LICENSE
new file mode 100644
index 0000000..6a33d4a
--- /dev/null
+++ b/grid/jre/LICENSE
@@ -0,0 +1 @@
+Please refer to https://java.com/otnlicense
diff --git a/grid/jre/README.txt b/grid/jre/README.txt
new file mode 100644
index 0000000..cdb30f2
--- /dev/null
+++ b/grid/jre/README.txt
@@ -0,0 +1 @@
+Please refer to http://java.com/licensereadme
diff --git a/grid/jre/THIRDPARTYLICENSEREADME-JAVAFX.txt b/grid/jre/THIRDPARTYLICENSEREADME-JAVAFX.txt
new file mode 100644
index 0000000..b1d2cf6
--- /dev/null
+++ b/grid/jre/THIRDPARTYLICENSEREADME-JAVAFX.txt
@@ -0,0 +1,3 @@
+The licenses for Third Party components included with this product can
+be found under the /legal/javafx subdirectory. Each component's license
+is available as a separate markdown (.md) file
diff --git a/grid/jre/THIRDPARTYLICENSEREADME.txt b/grid/jre/THIRDPARTYLICENSEREADME.txt
new file mode 100644
index 0000000..ac4e1ff
--- /dev/null
+++ b/grid/jre/THIRDPARTYLICENSEREADME.txt
@@ -0,0 +1,3 @@
+The licenses for Third Party components included with this product can
+be found under the /legal/jdk subdirectory. Each component's license is
+available as a separate markdown (.md) file.
diff --git a/grid/jre/Welcome.html b/grid/jre/Welcome.html
new file mode 100644
index 0000000..ca3ac16
--- /dev/null
+++ b/grid/jre/Welcome.html
@@ -0,0 +1,28 @@
+<html>
+<head>
+<title>
+Welcome to the Java(TM) Platform
+</title>
+</head>
+<body>
+
+<h2>Welcome to the Java<SUP><FONT SIZE=-2>TM</FONT></SUP> Platform</h2>
+<p> Welcome to the Java<SUP><FONT SIZE=-2>TM</FONT></SUP> Standard Edition Runtime
+ Environment. This provides complete runtime support for Java applications.
+<p> The runtime environment includes the Java<SUP><FONT SIZE=-2>TM</FONT></SUP>
+ Plug-in product which supports the Java environment inside web browsers.
+<h3>References</h3>
+<p>
+See the <a href="http://download.oracle.com/javase/7/docs/technotes/guides/plugin/">Java Plug-in</a> product
+documentation for more information on using the Java Plug-in product.
+<p> See the <a href=
+"http://www.oracle.com/technetwork/java/javase/overview/"
+>Java Platform</a> web site for
+ more information on the Java Platform.
+<hr>
+<font size="-2">
+Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
+</font>
+<p>
+</body>
+</html>
diff --git a/grid/jre/bin/JAWTAccessBridge-64.dll b/grid/jre/bin/JAWTAccessBridge-64.dll
new file mode 100644
index 0000000..07d3da3
--- /dev/null
+++ b/grid/jre/bin/JAWTAccessBridge-64.dll
Binary files differ
diff --git a/grid/jre/bin/JavaAccessBridge-64.dll b/grid/jre/bin/JavaAccessBridge-64.dll
new file mode 100644
index 0000000..fb6b7f7
--- /dev/null
+++ b/grid/jre/bin/JavaAccessBridge-64.dll
Binary files differ
diff --git a/grid/jre/bin/WindowsAccessBridge-64.dll b/grid/jre/bin/WindowsAccessBridge-64.dll
new file mode 100644
index 0000000..d0c38b2
--- /dev/null
+++ b/grid/jre/bin/WindowsAccessBridge-64.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-console-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-console-l1-1-0.dll
new file mode 100644
index 0000000..528187c
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-console-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-console-l1-2-0.dll b/grid/jre/bin/api-ms-win-core-console-l1-2-0.dll
new file mode 100644
index 0000000..4545f22
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-console-l1-2-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-datetime-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-datetime-l1-1-0.dll
new file mode 100644
index 0000000..4395104
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-datetime-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-debug-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-debug-l1-1-0.dll
new file mode 100644
index 0000000..343fa8e
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-debug-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-errorhandling-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-errorhandling-l1-1-0.dll
new file mode 100644
index 0000000..072e0dc
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-errorhandling-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-file-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-file-l1-1-0.dll
new file mode 100644
index 0000000..38c645b
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-file-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-file-l1-2-0.dll b/grid/jre/bin/api-ms-win-core-file-l1-2-0.dll
new file mode 100644
index 0000000..6f99bb8
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-file-l1-2-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-file-l2-1-0.dll b/grid/jre/bin/api-ms-win-core-file-l2-1-0.dll
new file mode 100644
index 0000000..91a9559
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-file-l2-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-handle-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-handle-l1-1-0.dll
new file mode 100644
index 0000000..efaf918
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-handle-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-heap-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-heap-l1-1-0.dll
new file mode 100644
index 0000000..8368d95
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-heap-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-interlocked-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-interlocked-l1-1-0.dll
new file mode 100644
index 0000000..2626b5f
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-interlocked-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-libraryloader-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-libraryloader-l1-1-0.dll
new file mode 100644
index 0000000..62b03d5
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-libraryloader-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-localization-l1-2-0.dll b/grid/jre/bin/api-ms-win-core-localization-l1-2-0.dll
new file mode 100644
index 0000000..4d9cf6e
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-localization-l1-2-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-memory-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-memory-l1-1-0.dll
new file mode 100644
index 0000000..2c42c9a
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-memory-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-namedpipe-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-namedpipe-l1-1-0.dll
new file mode 100644
index 0000000..b92a7e3
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-namedpipe-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-processenvironment-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-processenvironment-l1-1-0.dll
new file mode 100644
index 0000000..1607de8
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-processenvironment-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-processthreads-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-processthreads-l1-1-0.dll
new file mode 100644
index 0000000..73fe663
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-processthreads-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-processthreads-l1-1-1.dll b/grid/jre/bin/api-ms-win-core-processthreads-l1-1-1.dll
new file mode 100644
index 0000000..c194fef
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-processthreads-l1-1-1.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-profile-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-profile-l1-1-0.dll
new file mode 100644
index 0000000..53c2264
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-profile-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-rtlsupport-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-rtlsupport-l1-1-0.dll
new file mode 100644
index 0000000..215af2e
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-rtlsupport-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-string-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-string-l1-1-0.dll
new file mode 100644
index 0000000..eb16d63
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-string-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-synch-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-synch-l1-1-0.dll
new file mode 100644
index 0000000..a832560
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-synch-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-synch-l1-2-0.dll b/grid/jre/bin/api-ms-win-core-synch-l1-2-0.dll
new file mode 100644
index 0000000..98afd0c
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-synch-l1-2-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-sysinfo-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-sysinfo-l1-1-0.dll
new file mode 100644
index 0000000..e87aa67
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-sysinfo-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-timezone-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-timezone-l1-1-0.dll
new file mode 100644
index 0000000..9759c75
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-timezone-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-core-util-l1-1-0.dll b/grid/jre/bin/api-ms-win-core-util-l1-1-0.dll
new file mode 100644
index 0000000..7260a18
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-core-util-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-crt-conio-l1-1-0.dll b/grid/jre/bin/api-ms-win-crt-conio-l1-1-0.dll
new file mode 100644
index 0000000..0480409
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-crt-conio-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-crt-convert-l1-1-0.dll b/grid/jre/bin/api-ms-win-crt-convert-l1-1-0.dll
new file mode 100644
index 0000000..591a019
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-crt-convert-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-crt-environment-l1-1-0.dll b/grid/jre/bin/api-ms-win-crt-environment-l1-1-0.dll
new file mode 100644
index 0000000..b88ac28
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-crt-environment-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-crt-filesystem-l1-1-0.dll b/grid/jre/bin/api-ms-win-crt-filesystem-l1-1-0.dll
new file mode 100644
index 0000000..c60772a
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-crt-filesystem-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-crt-heap-l1-1-0.dll b/grid/jre/bin/api-ms-win-crt-heap-l1-1-0.dll
new file mode 100644
index 0000000..d413aad
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-crt-heap-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-crt-locale-l1-1-0.dll b/grid/jre/bin/api-ms-win-crt-locale-l1-1-0.dll
new file mode 100644
index 0000000..e1bb543
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-crt-locale-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-crt-math-l1-1-0.dll b/grid/jre/bin/api-ms-win-crt-math-l1-1-0.dll
new file mode 100644
index 0000000..b90ddb5
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-crt-math-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-crt-multibyte-l1-1-0.dll b/grid/jre/bin/api-ms-win-crt-multibyte-l1-1-0.dll
new file mode 100644
index 0000000..1eecd42
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-crt-multibyte-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-crt-private-l1-1-0.dll b/grid/jre/bin/api-ms-win-crt-private-l1-1-0.dll
new file mode 100644
index 0000000..3051e75
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-crt-private-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-crt-process-l1-1-0.dll b/grid/jre/bin/api-ms-win-crt-process-l1-1-0.dll
new file mode 100644
index 0000000..ab8d632
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-crt-process-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-crt-runtime-l1-1-0.dll b/grid/jre/bin/api-ms-win-crt-runtime-l1-1-0.dll
new file mode 100644
index 0000000..ff1c19a
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-crt-runtime-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-crt-stdio-l1-1-0.dll b/grid/jre/bin/api-ms-win-crt-stdio-l1-1-0.dll
new file mode 100644
index 0000000..9e9e6e1
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-crt-stdio-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-crt-string-l1-1-0.dll b/grid/jre/bin/api-ms-win-crt-string-l1-1-0.dll
new file mode 100644
index 0000000..af71a1a
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-crt-string-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-crt-time-l1-1-0.dll b/grid/jre/bin/api-ms-win-crt-time-l1-1-0.dll
new file mode 100644
index 0000000..8ed94cd
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-crt-time-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/api-ms-win-crt-utility-l1-1-0.dll b/grid/jre/bin/api-ms-win-crt-utility-l1-1-0.dll
new file mode 100644
index 0000000..e836e8c
--- /dev/null
+++ b/grid/jre/bin/api-ms-win-crt-utility-l1-1-0.dll
Binary files differ
diff --git a/grid/jre/bin/attach.dll b/grid/jre/bin/attach.dll
new file mode 100644
index 0000000..e7ddd05
--- /dev/null
+++ b/grid/jre/bin/attach.dll
Binary files differ
diff --git a/grid/jre/bin/awt.dll b/grid/jre/bin/awt.dll
new file mode 100644
index 0000000..9df4f7f
--- /dev/null
+++ b/grid/jre/bin/awt.dll
Binary files differ
diff --git a/grid/jre/bin/bci.dll b/grid/jre/bin/bci.dll
new file mode 100644
index 0000000..70e01fc
--- /dev/null
+++ b/grid/jre/bin/bci.dll
Binary files differ
diff --git a/grid/jre/bin/concrt140.dll b/grid/jre/bin/concrt140.dll
new file mode 100644
index 0000000..1065145
--- /dev/null
+++ b/grid/jre/bin/concrt140.dll
Binary files differ
diff --git a/grid/jre/bin/dcpr.dll b/grid/jre/bin/dcpr.dll
new file mode 100644
index 0000000..fdfbe92
--- /dev/null
+++ b/grid/jre/bin/dcpr.dll
Binary files differ
diff --git a/grid/jre/bin/decora_sse.dll b/grid/jre/bin/decora_sse.dll
new file mode 100644
index 0000000..d3cb020
--- /dev/null
+++ b/grid/jre/bin/decora_sse.dll
Binary files differ
diff --git a/grid/jre/bin/deploy.dll b/grid/jre/bin/deploy.dll
new file mode 100644
index 0000000..a6e5fd5
--- /dev/null
+++ b/grid/jre/bin/deploy.dll
Binary files differ
diff --git a/grid/jre/bin/dt_shmem.dll b/grid/jre/bin/dt_shmem.dll
new file mode 100644
index 0000000..4840cf9
--- /dev/null
+++ b/grid/jre/bin/dt_shmem.dll
Binary files differ
diff --git a/grid/jre/bin/dt_socket.dll b/grid/jre/bin/dt_socket.dll
new file mode 100644
index 0000000..c85819c
--- /dev/null
+++ b/grid/jre/bin/dt_socket.dll
Binary files differ
diff --git a/grid/jre/bin/dtplugin/deployJava1.dll b/grid/jre/bin/dtplugin/deployJava1.dll
new file mode 100644
index 0000000..58f58f0
--- /dev/null
+++ b/grid/jre/bin/dtplugin/deployJava1.dll
Binary files differ
diff --git a/grid/jre/bin/dtplugin/npdeployJava1.dll b/grid/jre/bin/dtplugin/npdeployJava1.dll
new file mode 100644
index 0000000..20d29a5
--- /dev/null
+++ b/grid/jre/bin/dtplugin/npdeployJava1.dll
Binary files differ
diff --git a/grid/jre/bin/eula.dll b/grid/jre/bin/eula.dll
new file mode 100644
index 0000000..ebdaf4a
--- /dev/null
+++ b/grid/jre/bin/eula.dll
Binary files differ
diff --git a/grid/jre/bin/fontmanager.dll b/grid/jre/bin/fontmanager.dll
new file mode 100644
index 0000000..131fd9e
--- /dev/null
+++ b/grid/jre/bin/fontmanager.dll
Binary files differ
diff --git a/grid/jre/bin/fxplugins.dll b/grid/jre/bin/fxplugins.dll
new file mode 100644
index 0000000..3e1c61d
--- /dev/null
+++ b/grid/jre/bin/fxplugins.dll
Binary files differ
diff --git a/grid/jre/bin/glass.dll b/grid/jre/bin/glass.dll
new file mode 100644
index 0000000..7f19a8f
--- /dev/null
+++ b/grid/jre/bin/glass.dll
Binary files differ
diff --git a/grid/jre/bin/glib-lite.dll b/grid/jre/bin/glib-lite.dll
new file mode 100644
index 0000000..83d4d4a
--- /dev/null
+++ b/grid/jre/bin/glib-lite.dll
Binary files differ
diff --git a/grid/jre/bin/gstreamer-lite.dll b/grid/jre/bin/gstreamer-lite.dll
new file mode 100644
index 0000000..4b536dd
--- /dev/null
+++ b/grid/jre/bin/gstreamer-lite.dll
Binary files differ
diff --git a/grid/jre/bin/hprof.dll b/grid/jre/bin/hprof.dll
new file mode 100644
index 0000000..eff048d
--- /dev/null
+++ b/grid/jre/bin/hprof.dll
Binary files differ
diff --git a/grid/jre/bin/instrument.dll b/grid/jre/bin/instrument.dll
new file mode 100644
index 0000000..25daea0
--- /dev/null
+++ b/grid/jre/bin/instrument.dll
Binary files differ
diff --git a/grid/jre/bin/j2pcsc.dll b/grid/jre/bin/j2pcsc.dll
new file mode 100644
index 0000000..6496aca
--- /dev/null
+++ b/grid/jre/bin/j2pcsc.dll
Binary files differ
diff --git a/grid/jre/bin/j2pkcs11.dll b/grid/jre/bin/j2pkcs11.dll
new file mode 100644
index 0000000..27af6de
--- /dev/null
+++ b/grid/jre/bin/j2pkcs11.dll
Binary files differ
diff --git a/grid/jre/bin/jaas_nt.dll b/grid/jre/bin/jaas_nt.dll
new file mode 100644
index 0000000..0b53fe0
--- /dev/null
+++ b/grid/jre/bin/jaas_nt.dll
Binary files differ
diff --git a/grid/jre/bin/jabswitch.exe b/grid/jre/bin/jabswitch.exe
new file mode 100644
index 0000000..c992d32
--- /dev/null
+++ b/grid/jre/bin/jabswitch.exe
Binary files differ
diff --git a/grid/jre/bin/java-rmi.exe b/grid/jre/bin/java-rmi.exe
new file mode 100644
index 0000000..b1fc022
--- /dev/null
+++ b/grid/jre/bin/java-rmi.exe
Binary files differ
diff --git a/grid/jre/bin/java.dll b/grid/jre/bin/java.dll
new file mode 100644
index 0000000..ebb3d5a
--- /dev/null
+++ b/grid/jre/bin/java.dll
Binary files differ
diff --git a/grid/jre/bin/java.exe b/grid/jre/bin/java.exe
new file mode 100644
index 0000000..08a76ff
--- /dev/null
+++ b/grid/jre/bin/java.exe
Binary files differ
diff --git a/grid/jre/bin/java_crw_demo.dll b/grid/jre/bin/java_crw_demo.dll
new file mode 100644
index 0000000..3dc91e5
--- /dev/null
+++ b/grid/jre/bin/java_crw_demo.dll
Binary files differ
diff --git a/grid/jre/bin/javacpl.cpl b/grid/jre/bin/javacpl.cpl
new file mode 100644
index 0000000..4d4de23
--- /dev/null
+++ b/grid/jre/bin/javacpl.cpl
Binary files differ
diff --git a/grid/jre/bin/javacpl.exe b/grid/jre/bin/javacpl.exe
new file mode 100644
index 0000000..849d700
--- /dev/null
+++ b/grid/jre/bin/javacpl.exe
Binary files differ
diff --git a/grid/jre/bin/javafx_font.dll b/grid/jre/bin/javafx_font.dll
new file mode 100644
index 0000000..c8d2701
--- /dev/null
+++ b/grid/jre/bin/javafx_font.dll
Binary files differ
diff --git a/grid/jre/bin/javafx_iio.dll b/grid/jre/bin/javafx_iio.dll
new file mode 100644
index 0000000..0e85a0e
--- /dev/null
+++ b/grid/jre/bin/javafx_iio.dll
Binary files differ
diff --git a/grid/jre/bin/javaw.exe b/grid/jre/bin/javaw.exe
new file mode 100644
index 0000000..3d510d8
--- /dev/null
+++ b/grid/jre/bin/javaw.exe
Binary files differ
diff --git a/grid/jre/bin/javaws.exe b/grid/jre/bin/javaws.exe
new file mode 100644
index 0000000..5265421
--- /dev/null
+++ b/grid/jre/bin/javaws.exe
Binary files differ
diff --git a/grid/jre/bin/jawt.dll b/grid/jre/bin/jawt.dll
new file mode 100644
index 0000000..f6f709b
--- /dev/null
+++ b/grid/jre/bin/jawt.dll
Binary files differ
diff --git a/grid/jre/bin/jdwp.dll b/grid/jre/bin/jdwp.dll
new file mode 100644
index 0000000..3e177f0
--- /dev/null
+++ b/grid/jre/bin/jdwp.dll
Binary files differ
diff --git a/grid/jre/bin/jfr.dll b/grid/jre/bin/jfr.dll
new file mode 100644
index 0000000..4446a82
--- /dev/null
+++ b/grid/jre/bin/jfr.dll
Binary files differ
diff --git a/grid/jre/bin/jfxmedia.dll b/grid/jre/bin/jfxmedia.dll
new file mode 100644
index 0000000..c9e7cbb
--- /dev/null
+++ b/grid/jre/bin/jfxmedia.dll
Binary files differ
diff --git a/grid/jre/bin/jfxwebkit.dll b/grid/jre/bin/jfxwebkit.dll
new file mode 100644
index 0000000..f961fac
--- /dev/null
+++ b/grid/jre/bin/jfxwebkit.dll
Binary files differ
diff --git a/grid/jre/bin/jjs.exe b/grid/jre/bin/jjs.exe
new file mode 100644
index 0000000..0625dad
--- /dev/null
+++ b/grid/jre/bin/jjs.exe
Binary files differ
diff --git a/grid/jre/bin/jli.dll b/grid/jre/bin/jli.dll
new file mode 100644
index 0000000..e9a4da3
--- /dev/null
+++ b/grid/jre/bin/jli.dll
Binary files differ
diff --git a/grid/jre/bin/jp2iexp.dll b/grid/jre/bin/jp2iexp.dll
new file mode 100644
index 0000000..cb7b7d8
--- /dev/null
+++ b/grid/jre/bin/jp2iexp.dll
Binary files differ
diff --git a/grid/jre/bin/jp2launcher.exe b/grid/jre/bin/jp2launcher.exe
new file mode 100644
index 0000000..7878899
--- /dev/null
+++ b/grid/jre/bin/jp2launcher.exe
Binary files differ
diff --git a/grid/jre/bin/jp2native.dll b/grid/jre/bin/jp2native.dll
new file mode 100644
index 0000000..a64c6e5
--- /dev/null
+++ b/grid/jre/bin/jp2native.dll
Binary files differ
diff --git a/grid/jre/bin/jp2ssv.dll b/grid/jre/bin/jp2ssv.dll
new file mode 100644
index 0000000..241b537
--- /dev/null
+++ b/grid/jre/bin/jp2ssv.dll
Binary files differ
diff --git a/grid/jre/bin/jpeg.dll b/grid/jre/bin/jpeg.dll
new file mode 100644
index 0000000..7077a4a
--- /dev/null
+++ b/grid/jre/bin/jpeg.dll
Binary files differ
diff --git a/grid/jre/bin/jsdt.dll b/grid/jre/bin/jsdt.dll
new file mode 100644
index 0000000..5548a4b
--- /dev/null
+++ b/grid/jre/bin/jsdt.dll
Binary files differ
diff --git a/grid/jre/bin/jsound.dll b/grid/jre/bin/jsound.dll
new file mode 100644
index 0000000..794e1ec
--- /dev/null
+++ b/grid/jre/bin/jsound.dll
Binary files differ
diff --git a/grid/jre/bin/jsoundds.dll b/grid/jre/bin/jsoundds.dll
new file mode 100644
index 0000000..c63613b
--- /dev/null
+++ b/grid/jre/bin/jsoundds.dll
Binary files differ
diff --git a/grid/jre/bin/keytool.exe b/grid/jre/bin/keytool.exe
new file mode 100644
index 0000000..8971a02
--- /dev/null
+++ b/grid/jre/bin/keytool.exe
Binary files differ
diff --git a/grid/jre/bin/kinit.exe b/grid/jre/bin/kinit.exe
new file mode 100644
index 0000000..f33aed4
--- /dev/null
+++ b/grid/jre/bin/kinit.exe
Binary files differ
diff --git a/grid/jre/bin/klist.exe b/grid/jre/bin/klist.exe
new file mode 100644
index 0000000..ef872bc
--- /dev/null
+++ b/grid/jre/bin/klist.exe
Binary files differ
diff --git a/grid/jre/bin/ktab.exe b/grid/jre/bin/ktab.exe
new file mode 100644
index 0000000..7d22f01
--- /dev/null
+++ b/grid/jre/bin/ktab.exe
Binary files differ
diff --git a/grid/jre/bin/lcms.dll b/grid/jre/bin/lcms.dll
new file mode 100644
index 0000000..488d51f
--- /dev/null
+++ b/grid/jre/bin/lcms.dll
Binary files differ
diff --git a/grid/jre/bin/management.dll b/grid/jre/bin/management.dll
new file mode 100644
index 0000000..d5b79f5
--- /dev/null
+++ b/grid/jre/bin/management.dll
Binary files differ
diff --git a/grid/jre/bin/mlib_image.dll b/grid/jre/bin/mlib_image.dll
new file mode 100644
index 0000000..0f60496
--- /dev/null
+++ b/grid/jre/bin/mlib_image.dll
Binary files differ
diff --git a/grid/jre/bin/msvcp140.dll b/grid/jre/bin/msvcp140.dll
new file mode 100644
index 0000000..98313d4
--- /dev/null
+++ b/grid/jre/bin/msvcp140.dll
Binary files differ
diff --git a/grid/jre/bin/net.dll b/grid/jre/bin/net.dll
new file mode 100644
index 0000000..6c4aff5
--- /dev/null
+++ b/grid/jre/bin/net.dll
Binary files differ
diff --git a/grid/jre/bin/nio.dll b/grid/jre/bin/nio.dll
new file mode 100644
index 0000000..4ccee33
--- /dev/null
+++ b/grid/jre/bin/nio.dll
Binary files differ
diff --git a/grid/jre/bin/npt.dll b/grid/jre/bin/npt.dll
new file mode 100644
index 0000000..ea9b6cb
--- /dev/null
+++ b/grid/jre/bin/npt.dll
Binary files differ
diff --git a/grid/jre/bin/orbd.exe b/grid/jre/bin/orbd.exe
new file mode 100644
index 0000000..9c289dd
--- /dev/null
+++ b/grid/jre/bin/orbd.exe
Binary files differ
diff --git a/grid/jre/bin/pack200.exe b/grid/jre/bin/pack200.exe
new file mode 100644
index 0000000..0b44751
--- /dev/null
+++ b/grid/jre/bin/pack200.exe
Binary files differ
diff --git a/grid/jre/bin/plugin2/msvcp140.dll b/grid/jre/bin/plugin2/msvcp140.dll
new file mode 100644
index 0000000..98313d4
--- /dev/null
+++ b/grid/jre/bin/plugin2/msvcp140.dll
Binary files differ
diff --git a/grid/jre/bin/plugin2/npjp2.dll b/grid/jre/bin/plugin2/npjp2.dll
new file mode 100644
index 0000000..067f1c6
--- /dev/null
+++ b/grid/jre/bin/plugin2/npjp2.dll
Binary files differ
diff --git a/grid/jre/bin/plugin2/vcruntime140.dll b/grid/jre/bin/plugin2/vcruntime140.dll
new file mode 100644
index 0000000..34a0e72
--- /dev/null
+++ b/grid/jre/bin/plugin2/vcruntime140.dll
Binary files differ
diff --git a/grid/jre/bin/policytool.exe b/grid/jre/bin/policytool.exe
new file mode 100644
index 0000000..2c8f44d
--- /dev/null
+++ b/grid/jre/bin/policytool.exe
Binary files differ
diff --git a/grid/jre/bin/prism_common.dll b/grid/jre/bin/prism_common.dll
new file mode 100644
index 0000000..0e4ccc6
--- /dev/null
+++ b/grid/jre/bin/prism_common.dll
Binary files differ
diff --git a/grid/jre/bin/prism_d3d.dll b/grid/jre/bin/prism_d3d.dll
new file mode 100644
index 0000000..4cac1db
--- /dev/null
+++ b/grid/jre/bin/prism_d3d.dll
Binary files differ
diff --git a/grid/jre/bin/prism_sw.dll b/grid/jre/bin/prism_sw.dll
new file mode 100644
index 0000000..5e0f9f1
--- /dev/null
+++ b/grid/jre/bin/prism_sw.dll
Binary files differ
diff --git a/grid/jre/bin/resource.dll b/grid/jre/bin/resource.dll
new file mode 100644
index 0000000..8fc2313
--- /dev/null
+++ b/grid/jre/bin/resource.dll
Binary files differ
diff --git a/grid/jre/bin/rmid.exe b/grid/jre/bin/rmid.exe
new file mode 100644
index 0000000..04a364f
--- /dev/null
+++ b/grid/jre/bin/rmid.exe
Binary files differ
diff --git a/grid/jre/bin/rmiregistry.exe b/grid/jre/bin/rmiregistry.exe
new file mode 100644
index 0000000..90cb053
--- /dev/null
+++ b/grid/jre/bin/rmiregistry.exe
Binary files differ
diff --git a/grid/jre/bin/sawindbg.dll b/grid/jre/bin/sawindbg.dll
new file mode 100644
index 0000000..e9f8f01
--- /dev/null
+++ b/grid/jre/bin/sawindbg.dll
Binary files differ
diff --git a/grid/jre/bin/server/Xusage.txt b/grid/jre/bin/server/Xusage.txt
new file mode 100644
index 0000000..11302aa
--- /dev/null
+++ b/grid/jre/bin/server/Xusage.txt
@@ -0,0 +1,24 @@
+ -Xmixed mixed mode execution (default)
+ -Xint interpreted mode execution only
+ -Xbootclasspath:<directories and zip/jar files separated by ;>
+ set search path for bootstrap classes and resources
+ -Xbootclasspath/a:<directories and zip/jar files separated by ;>
+ append to end of bootstrap class path
+ -Xbootclasspath/p:<directories and zip/jar files separated by ;>
+ prepend in front of bootstrap class path
+ -Xnoclassgc disable class garbage collection
+ -Xincgc enable incremental garbage collection
+ -Xloggc:<file> log GC status to a file with time stamps
+ -Xbatch disable background compilation
+ -Xms<size> set initial Java heap size
+ -Xmx<size> set maximum Java heap size
+ -Xss<size> set java thread stack size
+ -Xprof output cpu profiling data
+ -Xfuture enable strictest checks, anticipating future default
+ -Xrs reduce use of OS signals by Java/VM (see documentation)
+ -Xcheck:jni perform additional checks for JNI functions
+ -Xshare:off do not attempt to use shared class data
+ -Xshare:auto use shared class data if possible (default)
+ -Xshare:on require using shared class data, otherwise fail.
+
+The -X options are non-standard and subject to change without notice.
diff --git a/grid/jre/bin/server/classes.jsa b/grid/jre/bin/server/classes.jsa
new file mode 100644
index 0000000..ab7accb
--- /dev/null
+++ b/grid/jre/bin/server/classes.jsa
Binary files differ
diff --git a/grid/jre/bin/server/jvm.dll b/grid/jre/bin/server/jvm.dll
new file mode 100644
index 0000000..b80f67b
--- /dev/null
+++ b/grid/jre/bin/server/jvm.dll
Binary files differ
diff --git a/grid/jre/bin/servertool.exe b/grid/jre/bin/servertool.exe
new file mode 100644
index 0000000..8a91081
--- /dev/null
+++ b/grid/jre/bin/servertool.exe
Binary files differ
diff --git a/grid/jre/bin/splashscreen.dll b/grid/jre/bin/splashscreen.dll
new file mode 100644
index 0000000..28bdb81
--- /dev/null
+++ b/grid/jre/bin/splashscreen.dll
Binary files differ
diff --git a/grid/jre/bin/ssv.dll b/grid/jre/bin/ssv.dll
new file mode 100644
index 0000000..6bd3abe
--- /dev/null
+++ b/grid/jre/bin/ssv.dll
Binary files differ
diff --git a/grid/jre/bin/ssvagent.exe b/grid/jre/bin/ssvagent.exe
new file mode 100644
index 0000000..aa284f1
--- /dev/null
+++ b/grid/jre/bin/ssvagent.exe
Binary files differ
diff --git a/grid/jre/bin/sunec.dll b/grid/jre/bin/sunec.dll
new file mode 100644
index 0000000..9504afb
--- /dev/null
+++ b/grid/jre/bin/sunec.dll
Binary files differ
diff --git a/grid/jre/bin/sunmscapi.dll b/grid/jre/bin/sunmscapi.dll
new file mode 100644
index 0000000..b99101b
--- /dev/null
+++ b/grid/jre/bin/sunmscapi.dll
Binary files differ
diff --git a/grid/jre/bin/t2k.dll b/grid/jre/bin/t2k.dll
new file mode 100644
index 0000000..1a79343
--- /dev/null
+++ b/grid/jre/bin/t2k.dll
Binary files differ
diff --git a/grid/jre/bin/tnameserv.exe b/grid/jre/bin/tnameserv.exe
new file mode 100644
index 0000000..34ff219
--- /dev/null
+++ b/grid/jre/bin/tnameserv.exe
Binary files differ
diff --git a/grid/jre/bin/ucrtbase.dll b/grid/jre/bin/ucrtbase.dll
new file mode 100644
index 0000000..e05d4de
--- /dev/null
+++ b/grid/jre/bin/ucrtbase.dll
Binary files differ
diff --git a/grid/jre/bin/unpack.dll b/grid/jre/bin/unpack.dll
new file mode 100644
index 0000000..535d25d
--- /dev/null
+++ b/grid/jre/bin/unpack.dll
Binary files differ
diff --git a/grid/jre/bin/unpack200.exe b/grid/jre/bin/unpack200.exe
new file mode 100644
index 0000000..afd259d
--- /dev/null
+++ b/grid/jre/bin/unpack200.exe
Binary files differ
diff --git a/grid/jre/bin/vcruntime140.dll b/grid/jre/bin/vcruntime140.dll
new file mode 100644
index 0000000..34a0e72
--- /dev/null
+++ b/grid/jre/bin/vcruntime140.dll
Binary files differ
diff --git a/grid/jre/bin/verify.dll b/grid/jre/bin/verify.dll
new file mode 100644
index 0000000..a256a10
--- /dev/null
+++ b/grid/jre/bin/verify.dll
Binary files differ
diff --git a/grid/jre/bin/w2k_lsa_auth.dll b/grid/jre/bin/w2k_lsa_auth.dll
new file mode 100644
index 0000000..09b006e
--- /dev/null
+++ b/grid/jre/bin/w2k_lsa_auth.dll
Binary files differ
diff --git a/grid/jre/bin/wsdetect.dll b/grid/jre/bin/wsdetect.dll
new file mode 100644
index 0000000..a29701b
--- /dev/null
+++ b/grid/jre/bin/wsdetect.dll
Binary files differ
diff --git a/grid/jre/bin/zip.dll b/grid/jre/bin/zip.dll
new file mode 100644
index 0000000..03a8750
--- /dev/null
+++ b/grid/jre/bin/zip.dll
Binary files differ
diff --git a/grid/jre/legal/javafx/directshow.md b/grid/jre/legal/javafx/directshow.md
new file mode 100644
index 0000000..bbe1e27
--- /dev/null
+++ b/grid/jre/legal/javafx/directshow.md
@@ -0,0 +1,26 @@
+## Microsoft DirectShow Samples v156905
+
+### MIT License (MIT)
+```
+
+Copyright (c) 1992-2004 Microsoft Corporation. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+```
diff --git a/grid/jre/legal/javafx/glib.md b/grid/jre/legal/javafx/glib.md
new file mode 100644
index 0000000..1ee603b
--- /dev/null
+++ b/grid/jre/legal/javafx/glib.md
@@ -0,0 +1,538 @@
+## GNU Glib v2.62.2
+
+### Glib Notice
+```
+
+You are receiving a copy of GNU Glib, Version: 2.62.2 in either source or
+object code in the JavaFX runtime or JavaFX SDK. The terms of the
+Oracle license do NOT apply to the GNU Glib, Version: 2.62.2; it is
+licensed under the following license, separately from the Oracle programs
+you receive. If you do not wish to install this library, you may delete
+this library:
+
+ - On 32-bit Linux systems: delete $(JAVA_HOME)/lib/i386/libglib-lite.so
+ - On 64-bit Linux systems: delete $(JAVA_HOME)/lib/amd64/libglib-lite.so
+ - On Mac OS X systems: delete $(JAVA_HOME)/lib/libglib-lite.dylib
+ - On Windows systems: delete $(JAVA_HOME)\bin\glib-lite.dll
+
+A copy of the Oracle modified GNU Glib library source code is located
+in the following OpenJDK git repository:
+
+ https://github.com/openjdk/jfx
+
+You can use git to clone the repository or you can browse the
+source using a web browser. The root directory of the GNU Glib source
+code is here:
+
+ rt/modules/javafx.media/src/main/native/gstreamer/3rd_party/glib/
+
+
+```
+
+### LGPL 2.1
+```
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+```
diff --git a/grid/jre/legal/javafx/gstreamer.md b/grid/jre/legal/javafx/gstreamer.md
new file mode 100644
index 0000000..450ce80
--- /dev/null
+++ b/grid/jre/legal/javafx/gstreamer.md
@@ -0,0 +1,536 @@
+## GStreamer v1.16.1
+
+### GStreamer Notice
+```
+
+You are receiving a copy of GStreamer, Version: 1.16.1 in either source or
+object code in the JavaFX runtime or JavaFX SDK. The terms of the
+Oracle license do NOT apply to the GStreamer, Version: 1.16.1; it is
+licensed under the following license, separately from the Oracle programs
+you receive. If you do not wish to install this library, you may delete
+this library:
+
+ - On 32-bit Linux systems: delete $(JAVA_HOME)/lib/i386/libgstreamer-lite.so
+ - On 64-bit Linux systems: delete $(JAVA_HOME)/lib/amd64/libgstreamer-lite.so
+ - On Mac OS X systems: delete $(JAVA_HOME)/lib/libgstreamer-lite.dylib
+ - On Windows systems: delete $(JAVA_HOME)\bin\gstreamer-lite.dll
+
+A copy of the Oracle modified GStreamer library source code is located
+in the following OpenJDK git repository:
+
+ https://github.com/openjdk/jfx
+
+You can use git to clone the repository or you can browse the
+source using a web browser. The root directory of the GStreamer source
+code is here:
+
+ rt/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/
+```
+
+### LGPL 2.1
+```
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+```
diff --git a/grid/jre/legal/javafx/icu_web.md b/grid/jre/legal/javafx/icu_web.md
new file mode 100644
index 0000000..bbdc8d4
--- /dev/null
+++ b/grid/jre/legal/javafx/icu_web.md
@@ -0,0 +1,421 @@
+## IBM International Components for Unicode (ICU4C) v64.2
+
+### ICU License
+```
+
+COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later)
+
+Copyright 漏 1991-2019 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation
+(the "Data Files") or Unicode software and any associated documentation
+(the "Software") to deal in the Data Files or Software
+without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files
+or Software are furnished to do so, provided that either
+(a) this copyright and permission notice appear with all copies
+of the Data Files or Software, or
+(b) this copyright and permission notice appear in associated
+Documentation.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in these Data Files or Software without prior
+written authorization of the copyright holder.
+
+---------------------
+
+Third-Party Software Licenses
+
+This section contains third-party software notices and/or additional
+terms for licensed third-party software components included within ICU
+libraries.
+
+1. ICU License - ICU 1.8.1 to ICU 57.1
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1995-2016 International Business Machines Corporation and others
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY
+SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+All trademarks and registered trademarks mentioned herein are the
+property of their respective owners.
+
+2. Chinese/Japanese Word Break Dictionary Data (cjdict.txt)
+
+ # The Google Chrome software developed by Google is licensed under
+ # the BSD license. Other software included in this distribution is
+ # provided under other licenses, as set forth below.
+ #
+ # The BSD License
+ # http://opensource.org/licenses/bsd-license.php
+ # Copyright (C) 2006-2008, Google Inc.
+ #
+ # All rights reserved.
+ #
+ # Redistribution and use in source and binary forms, with or without
+ # modification, are permitted provided that the following conditions are met:
+ #
+ # Redistributions of source code must retain the above copyright notice,
+ # this list of conditions and the following disclaimer.
+ # Redistributions in binary form must reproduce the above
+ # copyright notice, this list of conditions and the following
+ # disclaimer in the documentation and/or other materials provided with
+ # the distribution.
+ # Neither the name of Google Inc. nor the names of its
+ # contributors may be used to endorse or promote products derived from
+ # this software without specific prior written permission.
+ #
+ #
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ #
+ #
+ # The word list in cjdict.txt are generated by combining three word lists
+ # listed below with further processing for compound word breaking. The
+ # frequency is generated with an iterative training against Google web
+ # corpora.
+ #
+ # * Libtabe (Chinese)
+ # - https://sourceforge.net/project/?group_id=1519
+ # - Its license terms and conditions are shown below.
+ #
+ # * IPADIC (Japanese)
+ # - http://chasen.aist-nara.ac.jp/chasen/distribution.html
+ # - Its license terms and conditions are shown below.
+ #
+ # ---------COPYING.libtabe ---- BEGIN--------------------
+ #
+ # /*
+ # * Copyright (c) 1999 TaBE Project.
+ # * Copyright (c) 1999 Pai-Hsiang Hsiao.
+ # * All rights reserved.
+ # *
+ # * Redistribution and use in source and binary forms, with or without
+ # * modification, are permitted provided that the following conditions
+ # * are met:
+ # *
+ # * . Redistributions of source code must retain the above copyright
+ # * notice, this list of conditions and the following disclaimer.
+ # * . Redistributions in binary form must reproduce the above copyright
+ # * notice, this list of conditions and the following disclaimer in
+ # * the documentation and/or other materials provided with the
+ # * distribution.
+ # * . Neither the name of the TaBE Project nor the names of its
+ # * contributors may be used to endorse or promote products derived
+ # * from this software without specific prior written permission.
+ # *
+ # * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ # * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ # * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ # * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ # * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ # * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ # * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ # * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ # * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ # * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ # * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ # * OF THE POSSIBILITY OF SUCH DAMAGE.
+ # */
+ #
+ # /*
+ # * Copyright (c) 1999 Computer Systems and Communication Lab,
+ # * Institute of Information Science, Academia
+ # * Sinica. All rights reserved.
+ # *
+ # * Redistribution and use in source and binary forms, with or without
+ # * modification, are permitted provided that the following conditions
+ # * are met:
+ # *
+ # * . Redistributions of source code must retain the above copyright
+ # * notice, this list of conditions and the following disclaimer.
+ # * . Redistributions in binary form must reproduce the above copyright
+ # * notice, this list of conditions and the following disclaimer in
+ # * the documentation and/or other materials provided with the
+ # * distribution.
+ # * . Neither the name of the Computer Systems and Communication Lab
+ # * nor the names of its contributors may be used to endorse or
+ # * promote products derived from this software without specific
+ # * prior written permission.
+ # *
+ # * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ # * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ # * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ # * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ # * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ # * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ # * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ # * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ # * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ # * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ # * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ # * OF THE POSSIBILITY OF SUCH DAMAGE.
+ # */
+ #
+ # Copyright 1996 Chih-Hao Tsai @ Beckman Institute,
+ # University of Illinois
+ # c-tsai4@uiuc.edu http://casper.beckman.uiuc.edu/~c-tsai4
+ #
+ # ---------------COPYING.libtabe-----END--------------------------------
+ #
+ #
+ # ---------------COPYING.ipadic-----BEGIN-------------------------------
+ #
+ # Copyright 2000, 2001, 2002, 2003 Nara Institute of Science
+ # and Technology. All Rights Reserved.
+ #
+ # Use, reproduction, and distribution of this software is permitted.
+ # Any copy of this software, whether in its original form or modified,
+ # must include both the above copyright notice and the following
+ # paragraphs.
+ #
+ # Nara Institute of Science and Technology (NAIST),
+ # the copyright holders, disclaims all warranties with regard to this
+ # software, including all implied warranties of merchantability and
+ # fitness, in no event shall NAIST be liable for
+ # any special, indirect or consequential damages or any damages
+ # whatsoever resulting from loss of use, data or profits, whether in an
+ # action of contract, negligence or other tortuous action, arising out
+ # of or in connection with the use or performance of this software.
+ #
+ # A large portion of the dictionary entries
+ # originate from ICOT Free Software. The following conditions for ICOT
+ # Free Software applies to the current dictionary as well.
+ #
+ # Each User may also freely distribute the Program, whether in its
+ # original form or modified, to any third party or parties, PROVIDED
+ # that the provisions of Section 3 ("NO WARRANTY") will ALWAYS appear
+ # on, or be attached to, the Program, which is distributed substantially
+ # in the same form as set out herein and that such intended
+ # distribution, if actually made, will neither violate or otherwise
+ # contravene any of the laws and regulations of the countries having
+ # jurisdiction over the User or the intended distribution itself.
+ #
+ # NO WARRANTY
+ #
+ # The program was produced on an experimental basis in the course of the
+ # research and development conducted during the project and is provided
+ # to users as so produced on an experimental basis. Accordingly, the
+ # program is provided without any warranty whatsoever, whether express,
+ # implied, statutory or otherwise. The term "warranty" used herein
+ # includes, but is not limited to, any warranty of the quality,
+ # performance, merchantability and fitness for a particular purpose of
+ # the program and the nonexistence of any infringement or violation of
+ # any right of any third party.
+ #
+ # Each user of the program will agree and understand, and be deemed to
+ # have agreed and understood, that there is no warranty whatsoever for
+ # the program and, accordingly, the entire risk arising from or
+ # otherwise connected with the program is assumed by the user.
+ #
+ # Therefore, neither ICOT, the copyright holder, or any other
+ # organization that participated in or was otherwise related to the
+ # development of the program and their respective officials, directors,
+ # officers and other employees shall be held liable for any and all
+ # damages, including, without limitation, general, special, incidental
+ # and consequential damages, arising out of or otherwise in connection
+ # with the use or inability to use the program or any product, material
+ # or result produced or otherwise obtained by using the program,
+ # regardless of whether they have been advised of, or otherwise had
+ # knowledge of, the possibility of such damages at any time during the
+ # project or thereafter. Each user will be deemed to have agreed to the
+ # foregoing by his or her commencement of use of the program. The term
+ # "use" as used herein includes, but is not limited to, the use,
+ # modification, copying and distribution of the program and the
+ # production of secondary products from the program.
+ #
+ # In the case where the program, whether in its original form or
+ # modified, was distributed or delivered to or received by a user from
+ # any person, organization or entity other than ICOT, unless it makes or
+ # grants independently of ICOT any specific warranty to the user in
+ # writing, such person, organization or entity, will also be exempted
+ # from and not be held liable to the user for any such damages as noted
+ # above as far as the program is concerned.
+ #
+ # ---------------COPYING.ipadic-----END----------------------------------
+
+3. Lao Word Break Dictionary Data (laodict.txt)
+
+ # Copyright (c) 2013 International Business Machines Corporation
+ # and others. All Rights Reserved.
+ #
+ # Project: http://code.google.com/p/lao-dictionary/
+ # Dictionary: http://lao-dictionary.googlecode.com/git/Lao-Dictionary.txt
+ # License: http://lao-dictionary.googlecode.com/git/Lao-Dictionary-LICENSE.txt
+ # (copied below)
+ #
+ # This file is derived from the above dictionary, with slight
+ # modifications.
+ # ----------------------------------------------------------------------
+ # Copyright (C) 2013 Brian Eugene Wilson, Robert Martin Campbell.
+ # All rights reserved.
+ #
+ # Redistribution and use in source and binary forms, with or without
+ # modification,
+ # are permitted provided that the following conditions are met:
+ #
+ #
+ # Redistributions of source code must retain the above copyright notice, this
+ # list of conditions and the following disclaimer. Redistributions in
+ # binary form must reproduce the above copyright notice, this list of
+ # conditions and the following disclaimer in the documentation and/or
+ # other materials provided with the distribution.
+ #
+ #
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ # OF THE POSSIBILITY OF SUCH DAMAGE.
+ # --------------------------------------------------------------------------
+
+4. Burmese Word Break Dictionary Data (burmesedict.txt)
+
+ # Copyright (c) 2014 International Business Machines Corporation
+ # and others. All Rights Reserved.
+ #
+ # This list is part of a project hosted at:
+ # github.com/kanyawtech/myanmar-karen-word-lists
+ #
+ # --------------------------------------------------------------------------
+ # Copyright (c) 2013, LeRoy Benjamin Sharon
+ # All rights reserved.
+ #
+ # Redistribution and use in source and binary forms, with or without
+ # modification, are permitted provided that the following conditions
+ # are met: Redistributions of source code must retain the above
+ # copyright notice, this list of conditions and the following
+ # disclaimer. Redistributions in binary form must reproduce the
+ # above copyright notice, this list of conditions and the following
+ # disclaimer in the documentation and/or other materials provided
+ # with the distribution.
+ #
+ # Neither the name Myanmar Karen Word Lists, nor the names of its
+ # contributors may be used to endorse or promote products derived
+ # from this software without specific prior written permission.
+ #
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
+ # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ # TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ # SUCH DAMAGE.
+ # --------------------------------------------------------------------------
+
+5. Time Zone Database
+
+ ICU uses the public domain data and code derived from Time Zone
+Database for its time zone support. The ownership of the TZ database
+is explained in BCP 175: Procedure for Maintaining the Time Zone
+Database section 7.
+
+ # 7. Database Ownership
+ #
+ # The TZ database itself is not an IETF Contribution or an IETF
+ # document. Rather it is a pre-existing and regularly updated work
+ # that is in the public domain, and is intended to remain in the
+ # public domain. Therefore, BCPs 78 [RFC5378] and 79 [RFC3979] do
+ # not apply to the TZ Database or contributions that individuals make
+ # to it. Should any claims be made and substantiated against the TZ
+ # Database, the organization that is providing the IANA
+ # Considerations defined in this RFC, under the memorandum of
+ # understanding with the IETF, currently ICANN, may act in accordance
+ # with all competent court orders. No ownership claims will be made
+ # by ICANN or the IETF Trust on the database or the code. Any person
+ # making a contribution to the database or code waives all rights to
+ # future claims in that contribution or in the TZ Database.
+
+6. Google double-conversion
+
+Copyright 2006-2011, the V8 project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+```
diff --git a/grid/jre/legal/javafx/jpeg_fx.md b/grid/jre/legal/javafx/jpeg_fx.md
new file mode 100644
index 0000000..e4afe6e
--- /dev/null
+++ b/grid/jre/legal/javafx/jpeg_fx.md
@@ -0,0 +1,51 @@
+## Independent JPEG Group (IJG) JPEG v9d
+
+### IJG License
+```
+
+/*
+ * jcapimin.c
+ *
+ * Copyright (C) 1994-1998, Thomas G. Lane.
+ * Modified 2003-2010 by Guido Vollbeding.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ */
+
+[From the README file]
+The authors make NO WARRANTY or representation, either express or implied,
+with respect to this software, its quality, accuracy, merchantability, or
+fitness for a particular purpose. This software is provided "AS IS", and you,
+its user, assume the entire risk as to its quality and accuracy.
+
+This software is copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+software (or portions thereof) for any purpose, without fee, subject to these
+conditions:
+(1) If any part of the source code for this software is distributed, then this
+README file must be included, with this copyright and no-warranty notice
+unaltered; and any additions, deletions, or changes to the original files
+must be clearly indicated in accompanying documentation.
+(2) If only executable code is distributed, then the accompanying
+documentation must state that "this software is based in part on the work of
+the Independent JPEG Group".
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG code,
+not just to the unmodified library. If you use our work, you ought to
+acknowledge us.
+
+Permission is NOT granted for the use of any IJG author's name or company name
+in advertising or publicity relating to this software or products derived from
+it. This software may be referred to only as "the Independent JPEG Group's
+software".
+
+We specifically permit and encourage the use of this software as the basis of
+commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
+
+```
diff --git a/grid/jre/legal/javafx/libffi.md b/grid/jre/legal/javafx/libffi.md
new file mode 100644
index 0000000..6915bbc
--- /dev/null
+++ b/grid/jre/legal/javafx/libffi.md
@@ -0,0 +1,28 @@
+## LibFFI v3.2.1
+
+### LibFFI License
+```
+
+libffi - Copyright (c) 1996-2014 Anthony Green, Red Hat, Inc and others.
+See source files for details.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+``Software''), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+```
diff --git a/grid/jre/legal/javafx/libxml2.md b/grid/jre/legal/javafx/libxml2.md
new file mode 100644
index 0000000..c263490
--- /dev/null
+++ b/grid/jre/legal/javafx/libxml2.md
@@ -0,0 +1,30 @@
+## xmlsoft.org: libxml2 v2.9.10
+
+### libxml2 License
+```
+
+Except where otherwise noted in the source code (e.g. the files hash.c,
+list.c and the trio files, which are covered by a similar licence but
+with different Copyright notices) all the files are:
+
+Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+```
diff --git a/grid/jre/legal/javafx/libxslt.md b/grid/jre/legal/javafx/libxslt.md
new file mode 100644
index 0000000..c0e5bd6
--- /dev/null
+++ b/grid/jre/legal/javafx/libxslt.md
@@ -0,0 +1,60 @@
+## xmlsoft.org: libxslt v1.1.34
+
+### libxslt License
+```
+
+Licence for libxslt except libexslt
+----------------------------------------------------------------------
+ Copyright (C) 2001-2002 Daniel Veillard. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is fur-
+nished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
+NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
+NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Daniel Veillard shall not
+be used in advertising or otherwise to promote the sale, use or other deal-
+ings in this Software without prior written authorization from him.
+
+----------------------------------------------------------------------
+
+Licence for libexslt
+----------------------------------------------------------------------
+ Copyright (C) 2001-2002 Thomas Broyer, Charlie Bozeman and Daniel Veillard.
+ All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is fur-
+nished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
+NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
+NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the authors shall not
+be used in advertising or otherwise to promote the sale, use or other deal-
+ings in this Software without prior written authorization from him.
+----------------------------------------------------------------------
+
+```
diff --git a/grid/jre/legal/javafx/mesa3d.md b/grid/jre/legal/javafx/mesa3d.md
new file mode 100644
index 0000000..b3f32d8
--- /dev/null
+++ b/grid/jre/legal/javafx/mesa3d.md
@@ -0,0 +1,134 @@
+## Mesa 3-D Graphics Library v19.2.1
+
+### Mesa License
+
+```
+Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+Attention, Contributors
+
+When contributing to the Mesa project you must agree to the licensing terms
+of the component to which you're contributing.
+The following section lists the primary components of the Mesa distribution
+and their respective licenses.
+Mesa Component Licenses
+
+
+
+Component Location License
+------------------------------------------------------------------
+Main Mesa code src/mesa/ MIT
+Device drivers src/mesa/drivers/* MIT, generally
+
+Gallium code src/gallium/ MIT
+
+Ext headers GL/glext.h Khronos
+ GL/glxext.h Khronos
+ GL/wglext.h Khronos
+ KHR/khrplatform.h Khronos
+
+*****************************************************************************
+
+----
+include/GL/gl.h :
+
+
+ Mesa 3-D graphics library
+
+ Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
+ Copyright (C) 2009 VMware, Inc. All Rights Reserved.
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
+
+ *****************************************************************************
+
+----
+include/GL/glext.h
+include/GL/glxext.h
+include/GL/wglxext.h :
+
+
+ Copyright (c) 2013 - 2018 The Khronos Group Inc.
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and/or associated documentation files (the
+ "Materials"), to deal in the Materials without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Materials, and to
+ permit persons to whom the Materials are furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Materials.
+
+ THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+
+ *****************************************************************************
+
+----
+include/KHR/khrplatform.h :
+
+ Copyright (c) 2008 - 2018 The Khronos Group Inc.
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and/or associated documentation files (the
+ "Materials"), to deal in the Materials without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Materials, and to
+ permit persons to whom the Materials are furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Materials.
+
+ THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+
+ *****************************************************************************
+
+```
diff --git a/grid/jre/legal/javafx/webkit.md b/grid/jre/legal/javafx/webkit.md
new file mode 100644
index 0000000..a10b6bb
--- /dev/null
+++ b/grid/jre/legal/javafx/webkit.md
@@ -0,0 +1,536 @@
+## WebKit Open Source Project: WebKit v609.1
+
+### WebKit Notice
+```
+
+You are receiving a copy of WebKit in either source or
+object code in the JavaFX runtime or JavaFX SDK. The terms of the
+Oracle license do NOT apply to WebKit; it is
+licensed under the following license, separately from the Oracle programs
+you receive. If you do not wish to install this library, you may delete
+this library:
+
+ - On 32-bit Linux systems: delete $(JAVA_HOME)/lib/i386/libjfxwebkit.so
+ - On 64-bit Linux systems: delete $(JAVA_HOME)/lib/amd64/libjfxwebkit.so
+ - On Mac OS X systems: delete $(JAVA_HOME)/lib/libjfxwebkit.dylib
+ - On Windows systems: delete $(JAVA_HOME)\bin\jfxwebkit.dll
+
+A copy of the Oracle modified WebKit library source code is located
+in the following OpenJDK git repository:
+
+ https://github.com/openjdk/jfx
+
+You can use git to clone the repository or you can browse the
+source using a web browser. The root directory of the WebKit source
+code is here:
+
+ rt/modules/javafx.web/src/main/native/
+```
+
+### LGPL 2.1
+```
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+```
diff --git a/grid/jre/legal/jdk/asm.md b/grid/jre/legal/jdk/asm.md
new file mode 100644
index 0000000..bbaf73e
--- /dev/null
+++ b/grid/jre/legal/jdk/asm.md
@@ -0,0 +1,36 @@
+## ASM Bytecode Manipulation Framework v5.0.3
+
+### ASM License
+```
+
+Copyright (c) 2000-2011 France T茅l茅com
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+
+```
diff --git a/grid/jre/legal/jdk/bcel.md b/grid/jre/legal/jdk/bcel.md
new file mode 100644
index 0000000..a5f1249
--- /dev/null
+++ b/grid/jre/legal/jdk/bcel.md
@@ -0,0 +1,222 @@
+## Apache Commons Byte Code Engineering Library (BCEL) Version 6.3.1
+
+### Apache Commons BCEL Notice
+```
+
+ =========================================================================
+ == NOTICE file corresponding to the section 4 d of ==
+ == the Apache License, Version 2.0, ==
+ == in this case for the Apache Commons BCEL distribution. ==
+ =========================================================================
+
+ This product includes software developed by
+ The Apache Software Foundation (http://www.apache.org/).
+
+```
+
+### Apache 2.0 License
+```
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+```
diff --git a/grid/jre/legal/jdk/cldr.md b/grid/jre/legal/jdk/cldr.md
new file mode 100644
index 0000000..666bd69
--- /dev/null
+++ b/grid/jre/legal/jdk/cldr.md
@@ -0,0 +1,63 @@
+## Unicode Common Local Data Repository (CLDR) v21.0.1
+
+### CLDR License
+
+```
+
+UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
+
+Unicode Data Files include all data files under the directories
+http://www.unicode.org/Public/, http://www.unicode.org/reports/, and
+http://www.unicode.org/cldr/data/. Unicode Data Files do not include PDF
+online code charts under the directory http://www.unicode.org/Public/.
+Software includes any source code published in the Unicode Standard or under
+the directories http://www.unicode.org/Public/,
+http://www.unicode.org/reports/, and http://www.unicode.org/cldr/data/.
+
+NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING,
+INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA
+FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO
+BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT
+AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR
+SOFTWARE.
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright 漏 1991-2012 Unicode, Inc. All rights reserved. Distributed under the
+Terms of Use in http://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the Unicode data files and any associated documentation (the "Data Files")
+or Unicode software and any associated documentation (the "Software") to deal
+in the Data Files or Software without restriction, including without
+limitation the rights to use, copy, modify, merge, publish, distribute, and/or
+sell copies of the Data Files or Software, and to permit persons to whom the
+Data Files or Software are furnished to do so, provided that (a) the above
+copyright notice(s) and this permission notice appear with all copies of the
+Data Files or Software, (b) both the above copyright notice(s) and this
+permission notice appear in associated documentation, and (c) there is clear
+notice in each modified Data File or in the Software as well as in the
+documentation associated with the Data File(s) or Software that the data or
+software has been modified.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD
+PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
+THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE
+DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall not
+be used in advertising or otherwise to promote the sale, use or other dealings
+in these Data Files or Software without prior written authorization of the
+copyright holder.
+
+Unicode and the Unicode logo are trademarks of Unicode, Inc. in the United
+States and other countries. All third party trademarks referenced herein are
+the property of their respective owners.
+
+
+```
diff --git a/grid/jre/legal/jdk/colorimaging.md b/grid/jre/legal/jdk/colorimaging.md
new file mode 100644
index 0000000..1ff8517
--- /dev/null
+++ b/grid/jre/legal/jdk/colorimaging.md
@@ -0,0 +1,7 @@
+## Eastman Kodak Company: Portions of color management and imaging software
+
+### Eastman Kodak Notice
+```
+Portions Copyright Eastman Kodak Company 1991-2003
+```
+
diff --git a/grid/jre/legal/jdk/cryptix.md b/grid/jre/legal/jdk/cryptix.md
new file mode 100644
index 0000000..cd19206
--- /dev/null
+++ b/grid/jre/legal/jdk/cryptix.md
@@ -0,0 +1,35 @@
+## Cryptix AES v3.2.0
+
+### Cryptix General License
+```
+
+Copyright (c) 1995-2005 The Cryptix Foundation Limited.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ 1. Redistributions of source code must retain the copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE CRYPTIX FOUNDATION LIMITED AND
+CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE CRYPTIX FOUNDATION LIMITED OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+```
+
diff --git a/grid/jre/legal/jdk/dom.md b/grid/jre/legal/jdk/dom.md
new file mode 100644
index 0000000..fc8fd4b
--- /dev/null
+++ b/grid/jre/legal/jdk/dom.md
@@ -0,0 +1,62 @@
+## DOM Level 3 Core Specification v1.0
+
+### W3C License
+```
+
+W3C SOFTWARE NOTICE AND LICENSE
+
+http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
+
+This work (and included software, documentation such as READMEs, or other
+related items) is being provided by the copyright holders under the following
+license. By obtaining, using and/or copying this work, you (the licensee)
+agree that you have read, understood, and will comply with the following terms
+and conditions.
+
+Permission to copy, modify, and distribute this software and its
+documentation, with or without modification, for any purpose and without fee
+or royalty is hereby granted, provided that you include the following on ALL
+copies of the software and documentation or portions thereof, including
+modifications:
+
+ 1.The full text of this NOTICE in a location viewable to users of the
+ redistributed or derivative work.
+
+ 2.Any pre-existing intellectual property disclaimers, notices, or terms and
+ conditions. If none exist, the W3C Software Short Notice should be included
+ (hypertext is preferred, text is permitted) within the body of any
+ redistributed or derivative code.
+
+ 3.Notice of any changes or modifications to the files, including the date
+ changes were made. (We recommend you provide URIs to the location from
+ which the code is derived.)
+
+THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
+MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
+PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY
+THIRD PARTY PATENTS,COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL
+OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
+DOCUMENTATION. The name and trademarks of copyright holders may NOT be used
+in advertising or publicity pertaining to the software without specific,
+written prior permission. Title to copyright in this software and any
+associated documentation will at all times remain with copyright holders.
+
+____________________________________
+
+This formulation of W3C's notice and license became active on December 31
+2002. This version removes the copyright ownership notice such that this
+license can be used with materials other than those owned by the W3C, reflects
+that ERCIM is now a host of the W3C, includes references to this specific
+dated version of the license, and removes the ambiguous grant of "use".
+Otherwise, this version is the same as the previous version and is written so
+as to preserve the Free Software Foundation's assessment of GPL compatibility
+and OSI's certification under the Open Source Definition. Please see our
+Copyright FAQ for common questions about using materials from our site,
+including specific terms and conditions for packages like libwww, Amaya, and
+Jigsaw. Other questions about this notice can be directed to
+site-policy@w3.org.
+
+```
diff --git a/grid/jre/legal/jdk/dynalink.md b/grid/jre/legal/jdk/dynalink.md
new file mode 100644
index 0000000..cf08f12
--- /dev/null
+++ b/grid/jre/legal/jdk/dynalink.md
@@ -0,0 +1,32 @@
+## Dynalink v.5
+
+### Dynalink License
+```
+
+Copyright (c) 2009-2013, Attila Szegedi
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+* Neither the name of the copyright holder nor the names of
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+```
diff --git a/grid/jre/legal/jdk/ecc.md b/grid/jre/legal/jdk/ecc.md
new file mode 100644
index 0000000..80dc503
--- /dev/null
+++ b/grid/jre/legal/jdk/ecc.md
@@ -0,0 +1,581 @@
+## Mozilla Elliptic Curve Cryptography (ECC)
+
+### Mozilla ECC Notice
+
+```
+This notice is provided with respect to Elliptic Curve Cryptography,
+which is included with JRE, JDK, and OpenJDK.
+
+You are receiving a copy
+of the Elliptic Curve Cryptography library in source
+form with the JDK and OpenJDK source distributions, and as object code in
+the JRE & JDK runtimes.
+
+In the case of the JRE & JDK runtimes, the terms of the Oracle license do
+NOT apply to the Elliptic Curve Cryptography library; it is licensed under the
+following license, separately from Oracle's JDK & JRE. If you do not wish to
+install the Elliptic Curve Cryptography library, you may delete the
+Elliptic Curve Cryptography library:
+ - On Solaris and Linux systems: delete $(JAVA_HOME)/lib/libsunec.so
+ - On Windows systems: delete $(JAVA_HOME)\bin\sunec.dll
+ - On Mac OSX systems: delete
+ For JRE: /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/libsunec.dylib
+ For JDK: $(JAVA_HOME)/jre/lib/libsunec.dylib
+
+```
+
+### Written Offer for Source Code
+```
+
+For third party technology that you receive from Oracle in binary form
+which is licensed under an open source license that gives you the right
+to receive the source code for that binary, you can obtain a copy of
+the applicable source code from this page:
+http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/tip/src/share/native/sun/security/ec/impl
+
+If the source code for the technology was not provided to you with the
+binary, you can also receive a copy of the source code on physical
+media by submitting a written request to:
+
+ Oracle America, Inc.
+ Attn: Associate General Counsel,
+ Development and Engineering Legal
+ 500 Oracle Parkway, 10th Floor
+ Redwood Shores, CA 94065
+
+Or, you may send an email to Oracle using the form at:
+
+http://www.oracle.com/goto/opensourcecode/request
+
+Your request should include:
+
+ - The name of the component or binary file(s) for which you are requesting the source code
+
+ - The name and version number of the Oracle product containing the binary
+
+ - The date you received the Oracle product
+
+ - Your name
+
+ - Your company name (if applicable)
+
+ - Your return mailing address and email and
+
+ - A telephone number in the event we need to reach you.
+
+We may charge you a fee to cover the cost of physical media and processing.
+Your request must be sent (i) within three (3) years of the date you
+received the Oracle product that included the component or binary
+file(s) that are the subject of your request, or (ii) in the case of
+code licensed under the GPL v3, for as long as Oracle offers spare
+parts or customer support for that product model.
+
+```
+
+### LGPL 2.1
+```
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+```
diff --git a/grid/jre/legal/jdk/freebxml.md b/grid/jre/legal/jdk/freebxml.md
new file mode 100644
index 0000000..96623e1
--- /dev/null
+++ b/grid/jre/legal/jdk/freebxml.md
@@ -0,0 +1,73 @@
+## freebXML Registry v3.1
+
+### freebXML Notice
+```
+
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the freebxml Software Foundation. For more
+ * information on the freebxml Software Foundation, please see
+ * "http://www.freebxml.org/".
+ *
+ * This product includes software developed by the Apache Software
+ * Foundation (http://www.apache.org/).
+ *
+ * $Header: /cvsroot/ebxmlrr/omar/license.txt,v 1.3 2006/04/16 19:10:35 dougb62 Exp $
+ *
+
+```
+
+
+### The freebXML License, Version 1.1
+```
+
+ ====================================================================
+ *
+ * The freebxml License, Version 1.1
+ *
+ * Copyright (c) 2001 freebxml.org. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by
+ * freebxml.org (http://www.freebxml.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The freebXML Registry Project", "freebxml Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact ebxmlrr-team@lists.sourceforge.net.
+ *
+ * 5. Products derived from this software may not be called "freebxml",
+ * "freebXML Registry" nor may freebxml" appear in their names without prior
+ * written permission of the freebxml Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE freebxml SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+
+```
diff --git a/grid/jre/legal/jdk/giflib.md b/grid/jre/legal/jdk/giflib.md
new file mode 100644
index 0000000..3a9884d
--- /dev/null
+++ b/grid/jre/legal/jdk/giflib.md
@@ -0,0 +1,32 @@
+## GIFLIB v5.2.1
+
+### GIFLIB License
+```
+
+The GIFLIB distribution is Copyright (c) 1997 Eric S. Raymond
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
+https://sourceforge.net/p/giflib/code/ci/master/tree/openbsd-reallocarray.c
+
+Copyright (c) 2008 Otto Moerbeek <otto@drijf.net>
+SPDX-License-Identifier: MIT
+
+```
diff --git a/grid/jre/legal/jdk/icu.md b/grid/jre/legal/jdk/icu.md
new file mode 100644
index 0000000..9bf02a6
--- /dev/null
+++ b/grid/jre/legal/jdk/icu.md
@@ -0,0 +1,66 @@
+## International Components for Unicode (ICU4J) v60.2
+
+### ICU4J License
+
+```
+
+UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
+Unicode Data Files include all data files under the directories
+http://www.unicode.org/Public/, http://www.unicode.org/reports/,
+http://www.unicode.org/cldr/data/,
+http://source.icu-project.org/repos/icu/, and
+http://www.unicode.org/utility/trac/browser/.
+
+Unicode Data Files do not include PDF online code charts under the
+directory http://www.unicode.org/Public/.
+
+Software includes any source code published in the Unicode Standard
+or under the directories
+http://www.unicode.org/Public/, http://www.unicode.org/reports/,
+http://www.unicode.org/cldr/data/,
+http://source.icu-project.org/repos/icu/, and
+http://www.unicode.org/utility/trac/browser/.
+
+NOTICE TO USER: Carefully read the following legal agreement.
+BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S
+DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"),
+YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
+TERMS AND CONDITIONS OF THIS AGREEMENT.
+IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE
+THE DATA FILES OR SOFTWARE.
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright 漏 1991-2018 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in http://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation
+(the "Data Files") or Unicode software and any associated documentation
+(the "Software") to deal in the Data Files or Software
+without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files
+or Software are furnished to do so, provided that either
+(a) this copyright and permission notice appear with all copies
+of the Data Files or Software, or
+(b) this copyright and permission notice appear in associated
+Documentation.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in these Data Files or Software without prior
+written authorization of the copyright holder.
+
+```
diff --git a/grid/jre/legal/jdk/jcup.md b/grid/jre/legal/jdk/jcup.md
new file mode 100644
index 0000000..354d2f1
--- /dev/null
+++ b/grid/jre/legal/jdk/jcup.md
@@ -0,0 +1,24 @@
+## CUP Parser Generator for Java v 0.11b
+
+### CUP Parser Generator License
+```
+
+Copyright 1996-2015 by Scott Hudson, Frank Flannery, C. Scott Ananian, Michael Petter
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted, provided
+that the above copyright notice appear in all copies and that both
+the copyright notice and this permission notice and warranty disclaimer
+appear in supporting documentation, and that the names of the authors or
+their employers not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior permission.
+
+The authors and their employers disclaim all warranties with regard to
+this software, including all implied warranties of merchantability and
+fitness. In no event shall the authors or their employers be liable for
+any special, indirect or consequential damages or any damages whatsoever
+resulting from loss of use, data or profits, whether in an action of
+contract, negligence or other tortious action, arising out of or in
+connection with the use or performance of this software.
+
+```
diff --git a/grid/jre/legal/jdk/joni.md b/grid/jre/legal/jdk/joni.md
new file mode 100644
index 0000000..cfbe7de
--- /dev/null
+++ b/grid/jre/legal/jdk/joni.md
@@ -0,0 +1,27 @@
+## JRuby Joni v2.1.16
+
+### MIT License
+```
+
+Copyright (c) 2017 JRuby Team
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+```
+
diff --git a/grid/jre/legal/jdk/jopt-simple.md b/grid/jre/legal/jdk/jopt-simple.md
new file mode 100644
index 0000000..404a6c2
--- /dev/null
+++ b/grid/jre/legal/jdk/jopt-simple.md
@@ -0,0 +1,27 @@
+## jopt-simple v3.0
+
+### MIT License
+```
+
+Copyright (c) 2004-2009 Paul R. Holser, Jr.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+```
diff --git a/grid/jre/legal/jdk/jpeg.md b/grid/jre/legal/jdk/jpeg.md
new file mode 100644
index 0000000..be7b11f
--- /dev/null
+++ b/grid/jre/legal/jdk/jpeg.md
@@ -0,0 +1,83 @@
+## Independent JPEG Group: JPEG release 6b
+
+### JPEG License
+```
+
+Must reproduce following license in documentation and/or other materials
+provided with distribution:
+
+The authors make NO WARRANTY or representation, either express or implied,
+with respect to this software, its quality, accuracy, merchantability, or
+fitness for a particular purpose. This software is provided "AS IS",
+and you, its user, assume the entire risk as to its quality and accuracy.
+
+This software is copyright (C) 1991-1998, Thomas G. Lane.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute
+this software (or portions thereof) for any purpose, without fee,
+subject to these conditions:
+
+(1) If any part of the source code for this software is distributed,
+then this README file must be included, with this copyright and no-warranty
+notice unaltered; and any additions, deletions, or changes to the original
+files must be clearly indicated in accompanying documentation.
+
+(2) If only executable code is distributed, then the accompanying documentation
+must state that "this software is based in part on the work of the
+Independent JPEG Group".
+
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG code,
+not just to the unmodified library. If you use our work, you ought to
+acknowledge us.
+
+Permission is NOT granted for the use of any IJG author's name or company name
+in advertising or publicity relating to this software or products derived
+from it. This software may be referred to only as "the Independent JPEG
+Group's software".
+
+We specifically permit and encourage the use of this software as the basis
+of commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
+
+
+ansi2knr.c is included in this distribution by permission of L. Peter Deutsch,
+sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA.
+ansi2knr.c is NOT covered by the above copyright and conditions, but instead
+by the usual distribution terms of the Free Software Foundation; principally,
+that you must include source code if you redistribute it.
+(See the file ansi2knr.c for full details.) However, since ansi2knr.c is
+not needed as part of any program generated from the IJG code, this does not
+limit you more than the foregoing paragraphs do.
+
+The Unix configuration script "configure" was produced with GNU Autoconf.
+It is copyright by the Free Software Foundation but is freely distributable.
+The same holds for its supporting scripts (config.guess, config.sub,
+ltconfig, ltmain.sh). Another support script, install-sh, is copyright
+by M.I.T. but is also freely distributable.
+
+It appears that the arithmetic coding option of the JPEG spec is covered
+by patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding
+cannot legally be used without obtaining one or more licenses. For this
+reason, support for arithmetic coding has been removed from the free
+JPEG software. (Since arithmetic coding provides only a marginal gain
+over the unpatented Huffman mode, it is unlikely that very many
+implementations will support it.) So far as we are aware, there are
+no patent restrictions on the remaining code.
+
+The IJG distribution formerly included code to read and write GIF files.
+To avoid entanglement with the Unisys LZW patent, GIF reading support
+has been removed altogether, and the GIF writer has been simplified to
+produce "uncompressed GIFs". This technique does not use the LZW algorithm;
+the resulting GIF files are larger than usual, but are readable by all
+standard GIF decoders.
+
+We are required to state that "The Graphics Interchange Format(c) is
+the Copyright property of CompuServe Incorporated. GIF(sm) is a
+Service Mark property of CompuServe Incorporated."
+
+```
diff --git a/grid/jre/legal/jdk/lcms.md b/grid/jre/legal/jdk/lcms.md
new file mode 100644
index 0000000..a0a22b4
--- /dev/null
+++ b/grid/jre/legal/jdk/lcms.md
@@ -0,0 +1,27 @@
+## Little Color Management System (LCMS) v2.9
+
+### LCMS License
+```
+
+Little Color Management System
+Copyright (c) 1998-2011 Marti Maria Saguer
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+```
diff --git a/grid/jre/legal/jdk/libpng.md b/grid/jre/legal/jdk/libpng.md
new file mode 100644
index 0000000..6fdf467
--- /dev/null
+++ b/grid/jre/legal/jdk/libpng.md
@@ -0,0 +1,144 @@
+## libpng v1.6.37
+
+### libpng License
+```
+
+
+
+ COPYRIGHT NOTICE, DISCLAIMER, and LICENSE
+ =========================================
+
+ PNG Reference Library License version 2
+ ---------------------------------------
+
+ * Copyright (c) 1995-2019 The PNG Reference Library Authors.
+ * Copyright (c) 2018-2019 Cosmin Truta.
+ * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson.
+ * Copyright (c) 1996-1997 Andreas Dilger.
+ * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
+
+ The software is supplied "as is", without warranty of any kind,
+ express or implied, including, without limitation, the warranties
+ of merchantability, fitness for a particular purpose, title, and
+ non-infringement. In no event shall the Copyright owners, or
+ anyone distributing the software, be liable for any damages or
+ other liability, whether in contract, tort or otherwise, arising
+ from, out of, or in connection with the software, or the use or
+ other dealings in the software, even if advised of the possibility
+ of such damage.
+
+ Permission is hereby granted to use, copy, modify, and distribute
+ this software, or portions hereof, for any purpose, without fee,
+ subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you
+ must not claim that you wrote the original software. If you
+ use this software in a product, an acknowledgment in the product
+ documentation would be appreciated, but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 3. This Copyright notice may not be removed or altered from any
+ source or altered source distribution.
+
+
+ PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35)
+ -----------------------------------------------------------------------
+
+ libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are
+ Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are
+ derived from libpng-1.0.6, and are distributed according to the same
+ disclaimer and license as libpng-1.0.6 with the following individuals
+ added to the list of Contributing Authors:
+
+ Simon-Pierre Cadieux
+ Eric S. Raymond
+ Mans Rullgard
+ Cosmin Truta
+ Gilles Vollant
+ James Yu
+ Mandar Sahastrabuddhe
+ Google Inc.
+ Vadim Barkov
+
+ and with the following additions to the disclaimer:
+
+ There is no warranty against interference with your enjoyment of
+ the library or against infringement. There is no warranty that our
+ efforts or the library will fulfill any of your particular purposes
+ or needs. This library is provided with all faults, and the entire
+ risk of satisfactory quality, performance, accuracy, and effort is
+ with the user.
+
+ Some files in the "contrib" directory and some configure-generated
+ files that are distributed with libpng have other copyright owners, and
+ are released under other open source licenses.
+
+ libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
+ Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
+ libpng-0.96, and are distributed according to the same disclaimer and
+ license as libpng-0.96, with the following individuals added to the
+ list of Contributing Authors:
+
+ Tom Lane
+ Glenn Randers-Pehrson
+ Willem van Schaik
+
+ libpng versions 0.89, June 1996, through 0.96, May 1997, are
+ Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
+ and are distributed according to the same disclaimer and license as
+ libpng-0.88, with the following individuals added to the list of
+ Contributing Authors:
+
+ John Bowler
+ Kevin Bracey
+ Sam Bushell
+ Magnus Holmgren
+ Greg Roelofs
+ Tom Tanner
+
+ Some files in the "scripts" directory have other copyright owners,
+ but are released under this license.
+
+ libpng versions 0.5, May 1995, through 0.88, January 1996, are
+ Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
+
+ For the purposes of this copyright and license, "Contributing Authors"
+ is defined as the following set of individuals:
+
+ Andreas Dilger
+ Dave Martindale
+ Guy Eric Schalnat
+ Paul Schmidt
+ Tim Wegner
+
+ The PNG Reference Library is supplied "AS IS". The Contributing
+ Authors and Group 42, Inc. disclaim all warranties, expressed or
+ implied, including, without limitation, the warranties of
+ merchantability and of fitness for any purpose. The Contributing
+ Authors and Group 42, Inc. assume no liability for direct, indirect,
+ incidental, special, exemplary, or consequential damages, which may
+ result from the use of the PNG Reference Library, even if advised of
+ the possibility of such damage.
+
+ Permission is hereby granted to use, copy, modify, and distribute this
+ source code, or portions hereof, for any purpose, without fee, subject
+ to the following restrictions:
+
+ 1. The origin of this source code must not be misrepresented.
+
+ 2. Altered versions must be plainly marked as such and must not
+ be misrepresented as being the original source.
+
+ 3. This Copyright notice may not be removed or altered from any
+ source or altered source distribution.
+
+ The Contributing Authors and Group 42, Inc. specifically permit,
+ without fee, and encourage the use of this source code as a component
+ to supporting the PNG file format in commercial products. If you use
+ this source code in a product, acknowledgment is not required but would
+ be appreciated.
+
+```
+
diff --git a/grid/jre/legal/jdk/mesa3d.md b/grid/jre/legal/jdk/mesa3d.md
new file mode 100644
index 0000000..4a8b4f7
--- /dev/null
+++ b/grid/jre/legal/jdk/mesa3d.md
@@ -0,0 +1,134 @@
+## Mesa 3-D Graphics Library v19.2.1
+
+### Mesa License
+```
+
+Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+Attention, Contributors
+
+When contributing to the Mesa project you must agree to the licensing terms
+of the component to which you're contributing.
+The following section lists the primary components of the Mesa distribution
+and their respective licenses.
+Mesa Component Licenses
+
+
+
+Component Location License
+------------------------------------------------------------------
+Main Mesa code src/mesa/ MIT
+Device drivers src/mesa/drivers/* MIT, generally
+
+Gallium code src/gallium/ MIT
+
+Ext headers GL/glext.h Khronos
+ GL/glxext.h Khronos
+ GL/wglext.h Khronos
+ KHR/khrplatform.h Khronos
+
+*****************************************************************************
+
+----
+include/GL/gl.h :
+
+
+ Mesa 3-D graphics library
+
+ Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
+ Copyright (C) 2009 VMware, Inc. All Rights Reserved.
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
+
+ *****************************************************************************
+
+----
+include/GL/glext.h
+include/GL/glxext.h
+include/GL/wglxext.h :
+
+
+ Copyright (c) 2013 - 2018 The Khronos Group Inc.
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and/or associated documentation files (the
+ "Materials"), to deal in the Materials without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Materials, and to
+ permit persons to whom the Materials are furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Materials.
+
+ THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+
+ *****************************************************************************
+
+----
+include/KHR/khrplatform.h :
+
+ Copyright (c) 2008 - 2018 The Khronos Group Inc.
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and/or associated documentation files (the
+ "Materials"), to deal in the Materials without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Materials, and to
+ permit persons to whom the Materials are furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Materials.
+
+ THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+
+ *****************************************************************************
+
+```
diff --git a/grid/jre/legal/jdk/pkcs11cryptotoken.md b/grid/jre/legal/jdk/pkcs11cryptotoken.md
new file mode 100644
index 0000000..8d2efca
--- /dev/null
+++ b/grid/jre/legal/jdk/pkcs11cryptotoken.md
@@ -0,0 +1,33 @@
+## OASIS PKCS #11 Cryptographic Token Interface v2.40
+
+### OASIS PKCS #11 Cryptographic Token Interface License
+```
+
+Copyright (c) OASIS Open 2016. All Rights Reserved.
+
+All capitalized terms in the following text have the meanings assigned to them in the OASIS
+Intellectual Property Rights Policy (the "OASIS IPR Policy"). The full Policy may be found at the
+OASIS website: [http://www.oasis-open.org/policies-guidelines/ipr]
+
+This document and translations of it may be copied and furnished to others, and derivative works
+that comment on or otherwise explain it or assist in its implementation may be prepared, copied,
+published, and distributed, in whole or in part, without restriction of any kind, provided that
+the above copyright notice and this section are included on all such copies and derivative works.
+However, this document itself may not be modified in any way, including by removing the copyright
+notice or references to OASIS, except as needed for the purpose of developing any document or
+deliverable produced by an OASIS Technical Committee (in which case the rules applicable to
+copyrights, as set forth in the OASIS IPR Policy, must be followed) or as required to translate it
+into languages other than English.
+
+The limited permissions granted above are perpetual and will not be revoked by OASIS or its
+successors or assigns.
+
+This document and the information contained herein is provided on an "AS IS" basis and OASIS
+DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE
+USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. OASIS AND ITS MEMBERS WILL NOT BE LIABLE FOR
+ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THIS DOCUMENT OR
+ANY PART THEREOF.
+
+```
+
diff --git a/grid/jre/legal/jdk/pkcs11wrapper.md b/grid/jre/legal/jdk/pkcs11wrapper.md
new file mode 100644
index 0000000..793d6a2
--- /dev/null
+++ b/grid/jre/legal/jdk/pkcs11wrapper.md
@@ -0,0 +1,46 @@
+## IAIK (Institute for Applied Information Processing and Communication) PKCS#11 wrapper files v1
+
+### IAIK License
+```
+
+Copyright (c) 2002 Graz University of Technology. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. The end-user documentation included with the redistribution, if any, must
+ include the following acknowledgment:
+
+ "This product includes software developed by IAIK of Graz University of
+ Technology."
+
+ Alternately, this acknowledgment may appear in the software itself, if and
+ wherever such third-party acknowledgments normally appear.
+
+4. The names "Graz University of Technology" and "IAIK of Graz University of
+ Technology" must not be used to endorse or promote products derived from this
+ software without prior written permission.
+
+5. Products derived from this software may not be called "IAIK PKCS Wrapper",
+ nor may "IAIK" appear in their name, without prior written permission of
+ Graz University of Technology.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+LICENSOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+```
diff --git a/grid/jre/legal/jdk/relaxngcc.md b/grid/jre/legal/jdk/relaxngcc.md
new file mode 100644
index 0000000..672600e
--- /dev/null
+++ b/grid/jre/legal/jdk/relaxngcc.md
@@ -0,0 +1,48 @@
+## RelaxNGCC v 1.12
+
+### RelaxNGCC License
+
+```
+
+Copyright (c) 2000-2003 Daisuke Okajima and Kohsuke Kawaguchi.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. The end-user documentation included with the redistribution, if any, must
+ include the following acknowledgment:
+
+ "This product includes software developed by Daisuke Okajima
+ and Kohsuke Kawaguchi (http://relaxngcc.sf.net/)."
+
+Alternately, this acknowledgment may appear in the software itself, if and
+wherever such third-party acknowledgments normally appear.
+
+4. The names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission. For
+ written permission, please contact the copyright holders.
+
+5. Products derived from this software may not be called "RELAXNGCC", nor may
+ "RELAXNGCC" appear in their name, without prior written permission of the
+ copyright holders.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE APACHE
+SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+```
diff --git a/grid/jre/legal/jdk/relaxngdatatype.md b/grid/jre/legal/jdk/relaxngdatatype.md
new file mode 100644
index 0000000..cc15d01
--- /dev/null
+++ b/grid/jre/legal/jdk/relaxngdatatype.md
@@ -0,0 +1,37 @@
+## RelaxNG Datatype v1.0
+
+### RelaxNG Datatype License
+```
+
+Copyright (c) 2005, 2010 Thai Open Source Software Center Ltd
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ Neither the names of the copyright holders nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+```
diff --git a/grid/jre/legal/jdk/relaxngom.md b/grid/jre/legal/jdk/relaxngom.md
new file mode 100644
index 0000000..922604b
--- /dev/null
+++ b/grid/jre/legal/jdk/relaxngom.md
@@ -0,0 +1,24 @@
+## RelaxNG Object Model/Parser (RNGOM.jar) v20050510
+
+### RelaxNG Object Model/Parser License
+```
+Copyright (c) Kohsuke Kawaguchi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions: The above copyright
+notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+```
diff --git a/grid/jre/legal/jdk/santuario.md b/grid/jre/legal/jdk/santuario.md
new file mode 100644
index 0000000..007301c
--- /dev/null
+++ b/grid/jre/legal/jdk/santuario.md
@@ -0,0 +1,238 @@
+## Apache Santuario XML Security for Java v2.1.3
+
+### Apache Santuario Notice
+```
+
+Apache Santuario - XML Security for Java
+Copyright 1999-2019 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+It was originally based on software copyright (c) 2001, Institute for
+Data Communications Systems, <http://www.nue.et-inf.uni-siegen.de/>.
+
+The development of this software was partly funded by the European
+Commission in the <WebSig> project in the ISIS Programme.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
+```
+
+### Apache 2.0 License
+```
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+```
diff --git a/grid/jre/legal/jdk/thaidict.md b/grid/jre/legal/jdk/thaidict.md
new file mode 100644
index 0000000..21edd2c
--- /dev/null
+++ b/grid/jre/legal/jdk/thaidict.md
@@ -0,0 +1,31 @@
+## Thai Dictionary
+
+### Thai Dictionary License
+```
+
+Copyright (C) 1982 The Royal Institute, Thai Royal Government.
+
+Copyright (C) 1998 National Electronics and Computer Technology Center,
+National Science and Technology Development Agency,
+Ministry of Science Technology and Environment,
+Thai Royal Government.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+```
diff --git a/grid/jre/legal/jdk/unicode.md b/grid/jre/legal/jdk/unicode.md
new file mode 100644
index 0000000..fc9dc4f
--- /dev/null
+++ b/grid/jre/legal/jdk/unicode.md
@@ -0,0 +1,53 @@
+## Unicode Character Database v6.2
+
+### Unicode Character Database
+
+```
+ UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
+
+ See Terms of Use for definitions of Unicode Inc.'s
+ Data Files and Software.
+
+ NOTICE TO USER: Carefully read the following legal agreement.
+ BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S
+ DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"),
+ YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
+ TERMS AND CONDITIONS OF THIS AGREEMENT.
+ IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE
+ THE DATA FILES OR SOFTWARE.
+
+ COPYRIGHT AND PERMISSION NOTICE
+ Copyright 漏 1991-2019 Unicode, Inc. All rights reserved.
+ Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of the Unicode data files and any associated documentation
+ (the "Data Files") or Unicode software and any associated documentation
+ (the "Software") to deal in the Data Files or Software
+ without restriction, including without limitation the rights to use,
+ copy, modify, merge, publish, distribute, and/or sell copies of
+ the Data Files or Software, and to permit persons to whom the Data Files
+ or Software are furnished to do so, provided that either
+ (a) this copyright and permission notice appear with all copies
+ of the Data Files or Software, or
+ (b) this copyright and permission notice appear in associated
+ Documentation.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+ NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+ DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale,
+ use or other dealings in these Data Files or Software without prior
+ written authorization of the copyright holder.
+
+```
+
diff --git a/grid/jre/legal/jdk/xalan.md b/grid/jre/legal/jdk/xalan.md
new file mode 100644
index 0000000..c2da5d2
--- /dev/null
+++ b/grid/jre/legal/jdk/xalan.md
@@ -0,0 +1,234 @@
+## Apache Xalan v2.7.2
+
+### Apache Xalan Notice
+```
+
+ ======================================================================================
+ == NOTICE file corresponding to the section 4d of the Apache License, Version 2.0, ==
+ == in this case for the Apache Xalan distribution. ==
+ ======================================================================================
+
+ This product includes software developed by
+ The Apache Software Foundation (http://www.apache.org/).
+
+ Specifically, we only include the XSLTC portion of the source from the Xalan distribution.
+ The Xalan project has two processors: an interpretive one (Xalan Interpretive) and a
+ compiled one (The XSLT Compiler (XSLTC)). We *only* use the XSLTC part of Xalan; We use
+ the source from the packages that are part of the XSLTC sources.
+
+ Portions of this software was originally based on the following:
+
+ - software copyright (c) 1999-2002, Lotus Development Corporation., http://www.lotus.com.
+ - software copyright (c) 2001-2002, Sun Microsystems., http://www.sun.com.
+ - software copyright (c) 2003, IBM Corporation., http://www.ibm.com.
+ - voluntary contributions made by Ovidiu Predescu (ovidiu@cup.hp.com) on behalf of the
+ Apache Software Foundation and was originally developed at Hewlett Packard Company.
+
+```
+
+### Apache 2.0 License
+```
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+```
diff --git a/grid/jre/legal/jdk/xerces.md b/grid/jre/legal/jdk/xerces.md
new file mode 100644
index 0000000..64a9ba5
--- /dev/null
+++ b/grid/jre/legal/jdk/xerces.md
@@ -0,0 +1,229 @@
+## Apache Xerces v2.12.1
+
+### Apache Xerces Notice
+```
+ =========================================================================
+ == NOTICE file corresponding to section 4(d) of the Apache License, ==
+ == Version 2.0, in this case for the Apache Xerces Java distribution. ==
+ =========================================================================
+
+ Apache Xerces Java
+ Copyright 1999-2020 The Apache Software Foundation
+
+ This product includes software developed at
+ The Apache Software Foundation (http://www.apache.org/).
+
+ Portions of this software were originally based on the following:
+ - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
+ - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
+ - voluntary contributions made by Paul Eng on behalf of the
+ Apache Software Foundation that were originally developed at iClick, Inc.,
+ software copyright (c) 1999.
+```
+
+### Apache 2.0 License
+```
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+```
diff --git a/grid/jre/legal/jdk/xmlresolver.md b/grid/jre/legal/jdk/xmlresolver.md
new file mode 100644
index 0000000..0ee77ab
--- /dev/null
+++ b/grid/jre/legal/jdk/xmlresolver.md
@@ -0,0 +1,233 @@
+## Apache XML Commons Resolver v1.2
+
+### Apache XML Commons Resolver Notice
+
+```
+
+This product includes software developed by The Apache Software
+Foundation (http://www.apache.org/).
+
+Copyright 2001-2004 The Apache Software Foundation or its licensor,
+as applicable.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+```
+
+### Apache 2.0 License
+```
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+```
+
diff --git a/grid/jre/legal/jdk/zlib.md b/grid/jre/legal/jdk/zlib.md
new file mode 100644
index 0000000..172baca
--- /dev/null
+++ b/grid/jre/legal/jdk/zlib.md
@@ -0,0 +1,27 @@
+## zlib v1.2.11
+
+### zlib License
+```
+
+Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Jean-loup Gailly Mark Adler
+jloup@gzip.org madler@alumni.caltech.edu
+
+```
diff --git a/grid/jre/lib/accessibility.properties b/grid/jre/lib/accessibility.properties
new file mode 100644
index 0000000..d9f12e3
--- /dev/null
+++ b/grid/jre/lib/accessibility.properties
@@ -0,0 +1,6 @@
+#
+# Load the Java Access Bridge class into the JVM
+#
+#assistive_technologies=com.sun.java.accessibility.AccessBridge
+#screen_magnifier_present=true
+
diff --git a/grid/jre/lib/amd64/jvm.cfg b/grid/jre/lib/amd64/jvm.cfg
new file mode 100644
index 0000000..4a2d964
--- /dev/null
+++ b/grid/jre/lib/amd64/jvm.cfg
@@ -0,0 +1,38 @@
+#
+#
+#
+# Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+# List of JVMs that can be used as an option to java, javac, etc.
+# Order is important -- first in this list is the default JVM.
+# NOTE that this both this file and its format are UNSUPPORTED and
+# WILL GO AWAY in a future release.
+#
+# You may also select a JVM in an arbitrary location with the
+# "-XXaltjvm=<jvm_dir>" option, but that too is unsupported
+# and may not be available in a future release.
+#
+-server KNOWN
+-client IGNORE
diff --git a/grid/jre/lib/calendars.properties b/grid/jre/lib/calendars.properties
new file mode 100644
index 0000000..6bf523f
--- /dev/null
+++ b/grid/jre/lib/calendars.properties
@@ -0,0 +1,62 @@
+# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+
+#
+# Japanese imperial calendar
+#
+# Meiji since 1868-01-01 00:00:00 local time (Gregorian)
+# Taisho since 1912-07-30 00:00:00 local time (Gregorian)
+# Showa since 1926-12-25 00:00:00 local time (Gregorian)
+# Heisei since 1989-01-08 00:00:00 local time (Gregorian)
+# Reiwa since 2019-05-01 00:00:00 local time (Gregorian)
+calendar.japanese.type: LocalGregorianCalendar
+calendar.japanese.eras: \
+ name=Meiji,abbr=M,since=-3218832000000; \
+ name=Taisho,abbr=T,since=-1812153600000; \
+ name=Showa,abbr=S,since=-1357603200000; \
+ name=Heisei,abbr=H,since=600220800000; \
+ name=Reiwa,abbr=R,since=1556668800000
+
+#
+# Taiwanese calendar
+# Minguo since 1911-01-01 00:00:00 local time (Gregorian)
+calendar.taiwanese.type: LocalGregorianCalendar
+calendar.taiwanese.eras: \
+ name=MinGuo,since=-1830384000000
+
+#
+# Thai Buddhist calendar
+# Buddhist Era since -542-01-01 00:00:00 local time (Gregorian)
+calendar.thai-buddhist.type: LocalGregorianCalendar
+calendar.thai-buddhist.eras: \
+ name=BuddhistEra,abbr=B.E.,since=-79302585600000
+calendar.thai-buddhist.year-boundary: \
+ day1=4-1,since=-79302585600000; \
+ day1=1-1,since=-915148800000
+
+#
+# Hijrah calendars
+#
+calendar.hijrah.Hijrah-umalqura: hijrah-config-umalqura.properties
+calendar.hijrah.Hijrah-umalqura.type: islamic-umalqura
diff --git a/grid/jre/lib/charsets.jar b/grid/jre/lib/charsets.jar
new file mode 100644
index 0000000..48dc15f
--- /dev/null
+++ b/grid/jre/lib/charsets.jar
Binary files differ
diff --git a/grid/jre/lib/classlist b/grid/jre/lib/classlist
new file mode 100644
index 0000000..36e8ca1
--- /dev/null
+++ b/grid/jre/lib/classlist
@@ -0,0 +1,2469 @@
+java/lang/Object
+java/lang/String
+java/io/Serializable
+java/lang/Comparable
+java/lang/CharSequence
+java/lang/Class
+java/lang/reflect/GenericDeclaration
+java/lang/reflect/AnnotatedElement
+java/lang/reflect/Type
+java/lang/Cloneable
+java/lang/ClassLoader
+java/lang/System
+java/lang/Throwable
+java/lang/Error
+java/lang/ThreadDeath
+java/lang/Exception
+java/lang/RuntimeException
+java/lang/SecurityManager
+java/security/ProtectionDomain
+java/security/AccessControlContext
+java/security/SecureClassLoader
+java/lang/ClassNotFoundException
+java/lang/ReflectiveOperationException
+java/lang/NoClassDefFoundError
+java/lang/LinkageError
+java/lang/ClassCastException
+java/lang/ArrayStoreException
+java/lang/VirtualMachineError
+java/lang/OutOfMemoryError
+java/lang/StackOverflowError
+java/lang/IllegalMonitorStateException
+java/lang/ref/Reference
+java/lang/ref/SoftReference
+java/lang/ref/WeakReference
+java/lang/ref/FinalReference
+java/lang/ref/PhantomReference
+sun/misc/Cleaner
+java/lang/ref/Finalizer
+java/lang/Thread
+java/lang/Runnable
+java/lang/ThreadGroup
+java/lang/Thread$UncaughtExceptionHandler
+java/util/Properties
+java/util/Hashtable
+java/util/Map
+java/util/Dictionary
+java/lang/reflect/AccessibleObject
+java/lang/reflect/Field
+java/lang/reflect/Member
+java/lang/reflect/Parameter
+java/lang/reflect/Method
+java/lang/reflect/Executable
+java/lang/reflect/Constructor
+sun/reflect/MagicAccessorImpl
+sun/reflect/MethodAccessorImpl
+sun/reflect/MethodAccessor
+sun/reflect/ConstructorAccessorImpl
+sun/reflect/ConstructorAccessor
+sun/reflect/DelegatingClassLoader
+sun/reflect/ConstantPool
+sun/reflect/UnsafeStaticFieldAccessorImpl
+sun/reflect/UnsafeFieldAccessorImpl
+sun/reflect/FieldAccessorImpl
+sun/reflect/FieldAccessor
+sun/reflect/CallerSensitive
+java/lang/annotation/Annotation
+java/lang/invoke/DirectMethodHandle
+java/lang/invoke/MethodHandle
+java/lang/invoke/MemberName
+java/lang/invoke/MethodHandleNatives
+java/lang/invoke/LambdaForm
+java/lang/invoke/MethodType
+java/lang/BootstrapMethodError
+java/lang/invoke/CallSite
+java/lang/invoke/ConstantCallSite
+java/lang/invoke/MutableCallSite
+java/lang/invoke/VolatileCallSite
+java/lang/StringBuffer
+java/lang/AbstractStringBuilder
+java/lang/Appendable
+java/lang/StringBuilder
+sun/misc/Unsafe
+java/io/ByteArrayInputStream
+java/io/InputStream
+java/io/Closeable
+java/lang/AutoCloseable
+java/io/File
+java/net/URLClassLoader
+java/net/URL
+java/util/jar/Manifest
+sun/misc/Launcher
+sun/misc/Launcher$AppClassLoader
+sun/misc/Launcher$ExtClassLoader
+java/security/CodeSource
+java/lang/StackTraceElement
+java/nio/Buffer
+java/lang/Boolean
+java/lang/Character
+java/lang/Float
+java/lang/Number
+java/lang/Double
+java/lang/Byte
+java/lang/Short
+java/lang/Integer
+java/lang/Long
+java/lang/NullPointerException
+java/lang/ArithmeticException
+java/io/ObjectStreamField
+java/lang/String$CaseInsensitiveComparator
+java/util/Comparator
+java/lang/RuntimePermission
+java/security/BasicPermission
+java/security/Permission
+java/security/Guard
+java/security/AccessController
+java/lang/reflect/ReflectPermission
+sun/reflect/ReflectionFactory$GetReflectionFactoryAction
+java/security/PrivilegedAction
+java/security/cert/Certificate
+java/util/Vector
+java/util/List
+java/util/Collection
+java/lang/Iterable
+java/util/RandomAccess
+java/util/AbstractList
+java/util/AbstractCollection
+java/util/Stack
+sun/reflect/ReflectionFactory
+java/lang/ref/Reference$Lock
+java/lang/ref/Reference$ReferenceHandler
+java/lang/ref/ReferenceQueue
+java/lang/ref/ReferenceQueue$Null
+java/lang/ref/ReferenceQueue$Lock
+java/lang/ref/Finalizer$FinalizerThread
+sun/misc/VM
+java/util/Hashtable$Entry
+java/util/Map$Entry
+java/lang/Math
+java/util/Hashtable$EntrySet
+java/util/AbstractSet
+java/util/Set
+java/util/Collections
+java/util/Collections$EmptySet
+java/util/Collections$EmptyList
+java/util/Collections$EmptyMap
+java/util/AbstractMap
+java/util/Collections$SynchronizedSet
+java/util/Collections$SynchronizedCollection
+java/util/Objects
+java/util/Hashtable$Enumerator
+java/util/Enumeration
+java/util/Iterator
+java/lang/Runtime
+sun/misc/Version
+java/io/FileInputStream
+java/io/FileDescriptor
+java/io/FileDescriptor$1
+sun/misc/JavaIOFileDescriptorAccess
+sun/misc/SharedSecrets
+java/lang/NoSuchMethodError
+java/lang/IncompatibleClassChangeError
+java/util/ArrayList
+java/util/Collections$UnmodifiableRandomAccessList
+java/util/Collections$UnmodifiableList
+java/util/Collections$UnmodifiableCollection
+sun/reflect/Reflection
+java/util/HashMap
+java/util/HashMap$Node
+java/io/FileOutputStream
+java/io/OutputStream
+java/io/Flushable
+java/io/BufferedInputStream
+java/io/FilterInputStream
+java/util/concurrent/atomic/AtomicReferenceFieldUpdater
+java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
+java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl$1
+java/security/PrivilegedExceptionAction
+java/lang/Class$3
+java/lang/Class$ReflectionData
+java/lang/Class$Atomic
+sun/reflect/generics/repository/ClassRepository
+sun/reflect/generics/repository/GenericDeclRepository
+sun/reflect/generics/repository/AbstractRepository
+java/lang/Class$AnnotationData
+sun/reflect/annotation/AnnotationType
+java/lang/ClassValue$ClassValueMap
+java/util/WeakHashMap
+java/lang/reflect/Modifier
+java/lang/reflect/ReflectAccess
+sun/reflect/LangReflectAccess
+sun/reflect/misc/ReflectUtil
+java/io/PrintStream
+java/io/FilterOutputStream
+java/io/BufferedOutputStream
+java/io/OutputStreamWriter
+java/io/Writer
+sun/nio/cs/StreamEncoder
+java/nio/charset/Charset
+sun/nio/cs/StandardCharsets
+sun/nio/cs/FastCharsetProvider
+java/nio/charset/spi/CharsetProvider
+sun/nio/cs/StandardCharsets$Aliases
+sun/util/PreHashedMap
+sun/nio/cs/StandardCharsets$Classes
+sun/nio/cs/StandardCharsets$Cache
+java/lang/ThreadLocal
+java/util/concurrent/atomic/AtomicInteger
+sun/security/action/GetPropertyAction
+java/util/Arrays
+sun/nio/cs/MS1252
+sun/nio/cs/HistoricallyNamedCharset
+sun/nio/cs/SingleByte
+java/lang/Class$1
+sun/reflect/ReflectionFactory$1
+sun/reflect/NativeConstructorAccessorImpl
+sun/reflect/DelegatingConstructorAccessorImpl
+sun/nio/cs/SingleByte$Encoder
+sun/nio/cs/ArrayEncoder
+java/nio/charset/CharsetEncoder
+java/nio/charset/CodingErrorAction
+java/nio/ByteBuffer
+java/nio/HeapByteBuffer
+java/nio/Bits
+java/nio/ByteOrder
+java/nio/Bits$1
+sun/misc/JavaNioAccess
+java/io/BufferedWriter
+java/io/DefaultFileSystem
+java/io/WinNTFileSystem
+java/io/FileSystem
+java/io/ExpiringCache
+java/io/ExpiringCache$1
+java/util/LinkedHashMap
+java/io/File$PathStatus
+java/lang/Enum
+java/nio/file/Path
+java/nio/file/Watchable
+java/lang/ClassLoader$3
+java/io/ExpiringCache$Entry
+java/util/LinkedHashMap$Entry
+java/lang/ClassLoader$NativeLibrary
+java/lang/Terminator
+java/lang/Terminator$1
+sun/misc/SignalHandler
+sun/misc/Signal
+sun/misc/NativeSignalHandler
+java/lang/Integer$IntegerCache
+sun/misc/OSEnvironment
+sun/io/Win32ErrorMode
+java/lang/System$2
+sun/misc/JavaLangAccess
+java/lang/IllegalArgumentException
+java/lang/Compiler
+java/lang/Compiler$1
+sun/misc/Launcher$Factory
+java/net/URLStreamHandlerFactory
+sun/security/util/Debug
+java/lang/ClassLoader$ParallelLoaders
+java/util/WeakHashMap$Entry
+java/util/Collections$SetFromMap
+java/util/WeakHashMap$KeySet
+java/net/URLClassLoader$7
+sun/misc/JavaNetAccess
+java/util/StringTokenizer
+sun/misc/Launcher$ExtClassLoader$1
+sun/misc/MetaIndex
+java/io/BufferedReader
+java/io/Reader
+java/lang/Readable
+java/io/FileReader
+java/io/InputStreamReader
+sun/nio/cs/StreamDecoder
+sun/nio/cs/SingleByte$Decoder
+sun/nio/cs/ArrayDecoder
+java/nio/charset/CharsetDecoder
+java/nio/CharBuffer
+java/nio/HeapCharBuffer
+java/nio/charset/CoderResult
+java/nio/charset/CoderResult$1
+java/nio/charset/CoderResult$Cache
+java/nio/charset/CoderResult$2
+java/lang/reflect/Array
+java/util/Locale
+java/util/Locale$Cache
+sun/util/locale/LocaleObjectCache
+java/util/concurrent/ConcurrentHashMap
+java/util/concurrent/ConcurrentMap
+java/util/concurrent/ConcurrentHashMap$Segment
+java/util/concurrent/locks/ReentrantLock
+java/util/concurrent/locks/Lock
+java/util/concurrent/ConcurrentHashMap$Node
+java/util/concurrent/ConcurrentHashMap$CounterCell
+java/util/concurrent/ConcurrentHashMap$KeySetView
+java/util/concurrent/ConcurrentHashMap$CollectionView
+java/util/concurrent/ConcurrentHashMap$ValuesView
+java/util/concurrent/ConcurrentHashMap$EntrySetView
+sun/util/locale/BaseLocale
+sun/util/locale/BaseLocale$Cache
+sun/util/locale/BaseLocale$Key
+sun/util/locale/LocaleObjectCache$CacheEntry
+java/util/Locale$LocaleKey
+sun/util/locale/LocaleUtils
+java/lang/CharacterData
+java/lang/CharacterDataLatin1
+java/util/HashMap$TreeNode
+java/io/FileInputStream$1
+sun/net/www/ParseUtil
+java/util/BitSet
+java/net/Parts
+sun/net/www/protocol/file/Handler
+java/net/URLStreamHandler
+java/security/ProtectionDomain$JavaSecurityAccessImpl
+sun/misc/JavaSecurityAccess
+java/security/ProtectionDomain$2
+sun/misc/JavaSecurityProtectionDomainAccess
+java/security/ProtectionDomain$Key
+java/security/Principal
+java/util/HashSet
+sun/misc/URLClassPath
+sun/net/www/protocol/jar/Handler
+sun/misc/Launcher$AppClassLoader$1
+java/lang/SystemClassLoaderAction
+java/lang/invoke/MethodHandleImpl
+java/lang/invoke/MethodHandleImpl$1
+java/lang/invoke/MethodHandleImpl$2
+java/util/function/Function
+java/lang/invoke/MethodHandleImpl$3
+java/lang/invoke/MethodHandleImpl$4
+java/lang/ClassValue
+java/lang/ClassValue$Entry
+java/lang/ClassValue$Identity
+java/lang/ClassValue$Version
+java/lang/invoke/MemberName$Factory
+java/lang/invoke/MethodHandleStatics
+java/lang/invoke/MethodHandleStatics$1
+sun/misc/PostVMInitHook
+sun/usagetracker/UsageTrackerClient
+java/util/concurrent/atomic/AtomicBoolean
+sun/usagetracker/UsageTrackerClient$1
+sun/usagetracker/UsageTrackerClient$4
+sun/usagetracker/UsageTrackerClient$2
+java/lang/ProcessEnvironment
+java/lang/ProcessEnvironment$NameComparator
+java/lang/ProcessEnvironment$EntryComparator
+java/util/Collections$UnmodifiableMap
+java/util/TreeMap
+java/util/NavigableMap
+java/util/SortedMap
+java/lang/ProcessEnvironment$CheckedEntrySet
+java/util/HashMap$EntrySet
+java/lang/ProcessEnvironment$CheckedEntrySet$1
+java/util/HashMap$EntryIterator
+java/util/HashMap$HashIterator
+java/lang/ProcessEnvironment$CheckedEntry
+java/util/TreeMap$Entry
+sun/usagetracker/UsageTrackerClient$3
+java/lang/StringCoding
+java/lang/ThreadLocal$ThreadLocalMap
+java/lang/ThreadLocal$ThreadLocalMap$Entry
+sun/nio/cs/UTF_8
+sun/nio/cs/Unicode
+java/lang/StringCoding$StringEncoder
+sun/nio/cs/UTF_8$Encoder
+java/io/FileOutputStream$1
+sun/launcher/LauncherHelper
+java/lang/StringCoding$StringDecoder
+java/net/URLClassLoader$1
+sun/net/util/URLUtil
+sun/misc/URLClassPath$3
+sun/misc/URLClassPath$JarLoader
+sun/misc/URLClassPath$Loader
+java/util/zip/ZipFile
+java/util/zip/ZipConstants
+java/util/zip/ZipFile$1
+sun/misc/JavaUtilZipFileAccess
+sun/misc/URLClassPath$JarLoader$1
+sun/misc/FileURLMapper
+java/util/jar/JarFile
+java/util/jar/JavaUtilJarAccessImpl
+sun/misc/JavaUtilJarAccess
+java/nio/charset/StandardCharsets
+sun/nio/cs/US_ASCII
+sun/nio/cs/ISO_8859_1
+sun/nio/cs/UTF_16BE
+sun/nio/cs/UTF_16LE
+sun/nio/cs/UTF_16
+java/util/ArrayDeque
+java/util/Deque
+java/util/Queue
+java/util/zip/ZipCoder
+sun/misc/PerfCounter
+sun/misc/Perf$GetPerfAction
+sun/misc/Perf
+sun/misc/PerfCounter$CoreCounters
+sun/nio/ch/DirectBuffer
+java/nio/DirectByteBuffer
+java/nio/MappedByteBuffer
+java/nio/DirectLongBufferU
+java/nio/LongBuffer
+sun/misc/JarIndex
+sun/misc/ExtensionDependency
+java/util/zip/ZipEntry
+java/util/jar/JarFile$JarFileEntry
+java/util/jar/JarEntry
+java/util/zip/ZipFile$ZipFileInputStream
+java/util/zip/Inflater
+java/util/zip/ZStreamRef
+java/util/zip/ZipFile$ZipFileInflaterInputStream
+java/util/zip/InflaterInputStream
+sun/misc/IOUtils
+sun/misc/URLClassPath$JarLoader$2
+sun/misc/Resource
+sun/nio/ByteBuffered
+java/security/Permissions
+java/security/PermissionCollection
+sun/net/www/protocol/file/FileURLConnection
+sun/net/www/URLConnection
+java/net/URLConnection
+sun/net/www/MessageHeader
+java/io/FilePermission
+java/io/FilePermission$1
+java/io/FilePermissionCollection
+java/security/AllPermission
+java/security/UnresolvedPermission
+java/security/BasicPermissionCollection
+javax/swing/JLabel
+javax/swing/SwingConstants
+javax/accessibility/Accessible
+javax/swing/JComponent
+javax/swing/TransferHandler$HasGetTransferHandler
+java/awt/Container
+java/awt/Component
+java/awt/image/ImageObserver
+java/awt/MenuContainer
+sun/launcher/LauncherHelper$FXHelper
+java/lang/Class$MethodArray
+java/lang/InterruptedException
+javax/swing/JFrame
+javax/swing/WindowConstants
+javax/swing/RootPaneContainer
+java/awt/Frame
+java/awt/Window
+java/util/concurrent/ConcurrentHashMap$ForwardingNode
+java/awt/Graphics
+java/lang/Void
+sun/util/logging/PlatformLogger
+sun/util/logging/PlatformLogger$Level
+sun/util/logging/PlatformLogger$1
+sun/util/logging/PlatformLogger$DefaultLoggerProxy
+sun/util/logging/PlatformLogger$LoggerProxy
+sun/util/logging/PlatformLogger$JavaLoggerProxy
+sun/util/logging/LoggingSupport
+sun/util/logging/LoggingSupport$1
+java/util/logging/LoggingProxyImpl
+sun/util/logging/LoggingProxy
+sun/reflect/UnsafeFieldAccessorFactory
+sun/reflect/UnsafeQualifiedStaticObjectFieldAccessorImpl
+sun/reflect/UnsafeQualifiedStaticFieldAccessorImpl
+sun/util/logging/LoggingSupport$2
+java/util/Date
+sun/util/calendar/CalendarSystem
+sun/util/calendar/Gregorian
+sun/util/calendar/BaseCalendar
+sun/util/calendar/AbstractCalendar
+java/awt/Component$AWTTreeLock
+java/awt/Toolkit
+java/awt/Toolkit$4
+sun/awt/AWTAccessor$ToolkitAccessor
+sun/awt/AWTAccessor
+java/awt/Toolkit$5
+sun/util/CoreResourceBundleControl
+java/util/ResourceBundle$Control
+java/util/Arrays$ArrayList
+java/util/ResourceBundle$Control$CandidateListCache
+java/util/ResourceBundle
+java/util/ResourceBundle$1
+java/util/spi/ResourceBundleControlProvider
+java/util/ServiceLoader
+java/util/ServiceLoader$LazyIterator
+java/util/ServiceLoader$1
+java/util/LinkedHashMap$LinkedEntrySet
+java/util/LinkedHashMap$LinkedEntryIterator
+java/util/LinkedHashMap$LinkedHashIterator
+sun/misc/Launcher$BootClassPathHolder
+sun/misc/Launcher$BootClassPathHolder$1
+sun/misc/URLClassPath$2
+java/lang/ClassLoader$2
+sun/misc/URLClassPath$1
+java/net/URLClassLoader$3
+sun/misc/CompoundEnumeration
+java/io/FileNotFoundException
+java/io/IOException
+java/security/PrivilegedActionException
+java/net/URLClassLoader$3$1
+java/util/ResourceBundle$RBClassLoader
+java/util/ResourceBundle$RBClassLoader$1
+java/util/ResourceBundle$CacheKey
+java/util/ResourceBundle$LoaderReference
+java/util/ResourceBundle$CacheKeyReference
+java/util/ResourceBundle$SingleFormatControl
+java/util/LinkedList
+java/util/AbstractSequentialList
+java/util/LinkedList$Node
+sun/awt/resources/awt
+java/util/ListResourceBundle
+java/awt/Toolkit$3
+java/awt/Toolkit$1
+java/util/Properties$LineReader
+java/awt/GraphicsEnvironment
+java/lang/invoke/LambdaMetafactory
+java/lang/invoke/MethodHandles$Lookup
+java/lang/invoke/MethodType$ConcurrentWeakInternSet
+java/lang/invoke/MethodTypeForm
+java/lang/invoke/Invokers
+java/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry
+java/lang/invoke/MethodHandles
+sun/invoke/util/Wrapper
+sun/invoke/util/Wrapper$Format
+java/lang/Byte$ByteCache
+java/lang/Short$ShortCache
+java/lang/Character$CharacterCache
+java/lang/Long$LongCache
+sun/invoke/util/VerifyAccess
+sun/invoke/util/ValueConversions
+java/lang/NoSuchMethodException
+java/lang/invoke/LambdaForm$BasicType
+java/lang/invoke/LambdaForm$Name
+java/lang/invoke/LambdaForm$NamedFunction
+java/lang/invoke/SimpleMethodHandle
+java/lang/invoke/BoundMethodHandle
+java/lang/invoke/BoundMethodHandle$SpeciesData
+java/lang/invoke/BoundMethodHandle$Factory
+java/lang/invoke/BoundMethodHandle$Species_L
+java/util/HashMap$Values
+java/util/HashMap$ValueIterator
+sun/invoke/util/BytecodeDescriptor
+java/lang/invoke/DirectMethodHandle$Lazy
+java/lang/InstantiationException
+java/util/Collections$UnmodifiableCollection$1
+java/util/AbstractList$Itr
+java/lang/invoke/InvokerBytecodeGenerator
+jdk/internal/org/objectweb/asm/ClassWriter
+jdk/internal/org/objectweb/asm/ClassVisitor
+jdk/internal/org/objectweb/asm/ByteVector
+jdk/internal/org/objectweb/asm/Item
+jdk/internal/org/objectweb/asm/MethodWriter
+jdk/internal/org/objectweb/asm/MethodVisitor
+jdk/internal/org/objectweb/asm/Type
+jdk/internal/org/objectweb/asm/Label
+jdk/internal/org/objectweb/asm/Frame
+jdk/internal/org/objectweb/asm/AnnotationWriter
+jdk/internal/org/objectweb/asm/AnnotationVisitor
+java/lang/invoke/MethodHandleImpl$Intrinsic
+java/lang/invoke/InvokerBytecodeGenerator$2
+sun/invoke/util/VerifyType
+sun/invoke/empty/Empty
+java/lang/NoSuchFieldException
+java/lang/invoke/InvokerBytecodeGenerator$CpPatch
+java/lang/invoke/DirectMethodHandle$Accessor
+java/util/ArrayList$Itr
+java/util/RandomAccessSubList
+java/util/SubList
+java/util/SubList$1
+java/util/ListIterator
+java/util/AbstractList$ListItr
+java/lang/invoke/MethodHandleImpl$AsVarargsCollector
+java/lang/invoke/DelegatingMethodHandle
+java/lang/invoke/WrongMethodTypeException
+java/lang/invoke/MethodHandleImpl$Lazy
+java/lang/invoke/MethodHandleImpl$IntrinsicMethodHandle
+java/lang/NoSuchFieldError
+java/lang/IllegalAccessException
+java/lang/invoke/LambdaFormEditor
+java/lang/invoke/LambdaFormEditor$Transform$Kind
+java/lang/invoke/LambdaFormEditor$Transform
+java/lang/invoke/LambdaFormBuffer
+jdk/internal/org/objectweb/asm/FieldWriter
+jdk/internal/org/objectweb/asm/FieldVisitor
+java/lang/invoke/InnerClassLambdaMetafactory
+java/lang/invoke/AbstractValidatingLambdaMetafactory
+java/util/PropertyPermission
+java/security/AccessController$1
+sun/security/util/SecurityConstants
+java/net/NetPermission
+java/security/SecurityPermission
+java/net/SocketPermission
+sun/security/action/GetBooleanAction
+java/security/AllPermissionCollection
+java/lang/invoke/InfoFromMemberName
+java/lang/invoke/MethodHandleInfo
+java/lang/invoke/InnerClassLambdaMetafactory$ForwardingMethodGenerator
+java/lang/invoke/TypeConvertingMethodAdapter
+java/lang/invoke/InnerClassLambdaMetafactory$1
+java/awt/Insets
+java/awt/event/InputEvent
+java/awt/event/ComponentEvent
+java/awt/AWTEvent
+java/util/EventObject
+java/awt/AWTEvent$1
+sun/awt/AWTAccessor$AWTEventAccessor
+java/awt/event/NativeLibLoader
+java/awt/event/NativeLibLoader$1
+java/awt/event/InputEvent$1
+sun/awt/AWTAccessor$InputEventAccessor
+sun/awt/windows/WComponentPeer
+java/awt/peer/ComponentPeer
+java/awt/dnd/peer/DropTargetPeer
+sun/awt/windows/WObjectPeer
+java/awt/Font
+java/awt/Font$FontAccessImpl
+sun/font/FontAccess
+java/awt/geom/AffineTransform
+sun/font/AttributeValues
+sun/font/EAttribute
+java/text/AttributedCharacterIterator$Attribute
+java/lang/Class$4
+sun/reflect/NativeMethodAccessorImpl
+sun/reflect/DelegatingMethodAccessorImpl
+java/awt/font/TextAttribute
+java/awt/Component$1
+sun/awt/AWTAccessor$ComponentAccessor
+java/awt/Component$DummyRequestFocusController
+sun/awt/RequestFocusController
+java/awt/LayoutManager
+java/awt/LightweightDispatcher
+java/awt/event/AWTEventListener
+java/util/EventListener
+java/awt/Dimension
+java/awt/geom/Dimension2D
+java/awt/Container$1
+sun/awt/AWTAccessor$ContainerAccessor
+javax/swing/JComponent$1
+java/awt/ComponentOrientation
+java/awt/Component$3
+sun/awt/AppContext
+java/util/IdentityHashMap
+java/util/Collections$SynchronizedMap
+sun/awt/AppContext$GetAppContextLock
+sun/awt/AppContext$6
+sun/misc/JavaAWTAccess
+sun/awt/AppContext$3
+sun/awt/AppContext$2
+sun/awt/SunToolkit
+sun/awt/WindowClosingSupport
+sun/awt/WindowClosingListener
+sun/awt/ComponentFactory
+sun/awt/InputMethodSupport
+sun/awt/KeyboardFocusManagerPeerProvider
+java/util/concurrent/locks/ReentrantLock$NonfairSync
+java/util/concurrent/locks/ReentrantLock$Sync
+java/util/concurrent/locks/AbstractQueuedSynchronizer
+java/util/concurrent/locks/AbstractOwnableSynchronizer
+java/util/concurrent/locks/AbstractQueuedSynchronizer$Node
+java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject
+java/util/concurrent/locks/Condition
+sun/misc/SoftCache
+sun/awt/AppContext$State
+sun/awt/AppContext$1
+java/awt/EventQueue
+java/awt/EventQueue$1
+java/awt/EventQueue$2
+sun/awt/AWTAccessor$EventQueueAccessor
+java/awt/Queue
+sun/awt/MostRecentKeyValue
+sun/awt/PostEventQueue
+javax/swing/event/EventListenerList
+javax/swing/SwingUtilities
+javax/swing/RepaintManager
+javax/swing/RepaintManager$DisplayChangedHandler
+sun/awt/DisplayChangedListener
+javax/swing/RepaintManager$1
+sun/swing/SwingAccessor$RepaintManagerAccessor
+sun/swing/SwingAccessor
+sun/awt/Win32GraphicsEnvironment
+sun/java2d/SunGraphicsEnvironment
+sun/awt/windows/WToolkit
+sun/awt/windows/WToolkit$1
+sun/java2d/SurfaceData
+java/awt/Transparency
+sun/java2d/DisposerTarget
+sun/java2d/StateTrackable
+sun/java2d/Surface
+sun/java2d/InvalidPipeException
+java/lang/IllegalStateException
+sun/java2d/NullSurfaceData
+sun/java2d/StateTrackable$State
+sun/java2d/loops/SurfaceType
+sun/awt/image/PixelConverter
+sun/awt/image/PixelConverter$Xrgb
+sun/awt/image/PixelConverter$Argb
+sun/awt/image/PixelConverter$ArgbPre
+sun/awt/image/PixelConverter$Xbgr
+sun/awt/image/PixelConverter$Rgba
+sun/awt/image/PixelConverter$RgbaPre
+sun/awt/image/PixelConverter$Ushort565Rgb
+sun/awt/image/PixelConverter$Ushort555Rgb
+sun/awt/image/PixelConverter$Ushort555Rgbx
+sun/awt/image/PixelConverter$Ushort4444Argb
+sun/awt/image/PixelConverter$ByteGray
+sun/awt/image/PixelConverter$UshortGray
+sun/awt/image/PixelConverter$Rgbx
+sun/awt/image/PixelConverter$Bgrx
+sun/awt/image/PixelConverter$ArgbBm
+java/awt/image/ColorModel
+java/awt/image/ColorModel$1
+java/awt/image/DirectColorModel
+java/awt/image/PackedColorModel
+java/awt/color/ColorSpace
+java/awt/color/ICC_Profile
+sun/java2d/cmm/ProfileDeferralInfo
+sun/java2d/cmm/ProfileDeferralMgr
+java/awt/color/ICC_ProfileRGB
+java/awt/color/ICC_Profile$1
+sun/java2d/cmm/ProfileActivator
+java/awt/color/ICC_ColorSpace
+sun/java2d/StateTrackableDelegate
+sun/java2d/StateTrackableDelegate$2
+sun/java2d/pipe/NullPipe
+sun/java2d/pipe/PixelDrawPipe
+sun/java2d/pipe/PixelFillPipe
+sun/java2d/pipe/ShapeDrawPipe
+sun/java2d/pipe/TextPipe
+sun/java2d/pipe/DrawImagePipe
+java/awt/image/IndexColorModel
+sun/java2d/pipe/LoopPipe
+sun/java2d/pipe/ParallelogramPipe
+sun/java2d/pipe/LoopBasedPipe
+sun/java2d/pipe/RenderingEngine
+sun/java2d/pipe/RenderingEngine$1
+sun/dc/DuctusRenderingEngine
+sun/java2d/pipe/OutlineTextRenderer
+sun/java2d/pipe/SolidTextRenderer
+sun/java2d/pipe/GlyphListLoopPipe
+sun/java2d/pipe/GlyphListPipe
+sun/java2d/pipe/AATextRenderer
+sun/java2d/pipe/LCDTextRenderer
+sun/java2d/pipe/AlphaColorPipe
+sun/java2d/pipe/CompositePipe
+sun/java2d/SurfaceData$PixelToShapeLoopConverter
+sun/java2d/pipe/PixelToShapeConverter
+sun/java2d/SurfaceData$PixelToPgramLoopConverter
+sun/java2d/pipe/PixelToParallelogramConverter
+sun/java2d/pipe/TextRenderer
+sun/java2d/pipe/SpanClipRenderer
+sun/java2d/pipe/Region
+sun/java2d/pipe/RegionIterator
+sun/java2d/pipe/Region$ImmutableRegion
+sun/java2d/pipe/AAShapePipe
+sun/java2d/pipe/AlphaPaintPipe
+sun/java2d/pipe/SpanShapeRenderer$Composite
+sun/java2d/pipe/SpanShapeRenderer
+sun/java2d/pipe/GeneralCompositePipe
+sun/java2d/pipe/DrawImage
+sun/java2d/loops/RenderCache
+sun/java2d/loops/RenderCache$Entry
+sun/awt/image/SunVolatileImage
+sun/java2d/DestSurfaceProvider
+java/awt/image/VolatileImage
+java/awt/Image
+java/awt/ImageCapabilities
+java/awt/Image$1
+sun/awt/image/SurfaceManager$ImageAccessor
+sun/awt/image/SurfaceManager
+sun/awt/image/VolatileSurfaceManager
+sun/awt/windows/WToolkit$2
+sun/java2d/windows/WindowsFlags
+sun/java2d/windows/WindowsFlags$1
+sun/java2d/WindowsSurfaceManagerFactory
+sun/java2d/SurfaceManagerFactory
+sun/awt/SunDisplayChanger
+sun/java2d/SunGraphicsEnvironment$1
+sun/misc/FloatingDecimal
+sun/misc/FloatingDecimal$ExceptionalBinaryToASCIIBuffer
+sun/misc/FloatingDecimal$BinaryToASCIIConverter
+sun/misc/FloatingDecimal$BinaryToASCIIBuffer
+sun/misc/FloatingDecimal$1
+sun/misc/FloatingDecimal$PreparedASCIIToBinaryBuffer
+sun/misc/FloatingDecimal$ASCIIToBinaryConverter
+sun/misc/FloatingDecimal$ASCIIToBinaryBuffer
+java/awt/Toolkit$2
+java/awt/Toolkit$DesktopPropertyChangeSupport
+java/beans/PropertyChangeSupport
+java/beans/PropertyChangeSupport$PropertyChangeListenerMap
+java/beans/ChangeListenerMap
+java/beans/PropertyChangeListener
+sun/awt/SunToolkit$ModalityListenerList
+sun/awt/ModalityListener
+sun/misc/PerformanceLogger
+sun/misc/PerformanceLogger$TimeData
+sun/awt/windows/WToolkit$ToolkitDisposer
+sun/java2d/DisposerRecord
+sun/java2d/Disposer
+sun/java2d/Disposer$1
+sun/misc/ThreadGroupUtils
+sun/awt/AWTAutoShutdown
+java/lang/invoke/DirectMethodHandle$Special
+java/lang/ApplicationShutdownHooks
+java/lang/ApplicationShutdownHooks$1
+java/lang/Shutdown
+java/lang/Shutdown$Lock
+java/awt/Rectangle
+java/awt/Shape
+java/awt/geom/Rectangle2D
+java/awt/geom/RectangularShape
+javax/swing/RepaintManager$ProcessingRunnable
+com/sun/java/swing/SwingUtilities3
+javax/swing/UIManager
+javax/swing/UIManager$LookAndFeelInfo
+sun/awt/OSInfo
+sun/awt/OSInfo$WindowsVersion
+sun/awt/OSInfo$1
+sun/awt/OSInfo$OSType
+sun/awt/HeadlessToolkit
+sun/awt/windows/WDesktopProperties
+sun/awt/windows/ThemeReader
+java/util/concurrent/locks/ReentrantReadWriteLock
+java/util/concurrent/locks/ReadWriteLock
+sun/nio/ch/Interruptible
+java/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync
+java/util/concurrent/locks/ReentrantReadWriteLock$Sync
+java/util/concurrent/locks/ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter
+java/util/concurrent/locks/ReentrantReadWriteLock$ReadLock
+java/util/concurrent/locks/ReentrantReadWriteLock$WriteLock
+java/awt/Color
+java/awt/Paint
+sun/awt/windows/WDesktopProperties$WinPlaySound
+java/awt/RenderingHints
+sun/awt/SunHints
+sun/awt/SunHints$Key
+java/awt/RenderingHints$Key
+sun/awt/SunHints$Value
+sun/awt/SunHints$LCDContrastKey
+java/util/HashMap$KeySet
+java/util/HashMap$KeyIterator
+java/util/Arrays$LegacyMergeSort
+java/util/ComparableTimSort
+java/beans/PropertyChangeEvent
+java/awt/Toolkit$DesktopPropertyChangeSupport$1
+java/util/IdentityHashMap$Values
+java/util/IdentityHashMap$ValueIterator
+java/util/IdentityHashMap$IdentityHashMapIterator
+sun/swing/SwingUtilities2
+java/awt/font/FontRenderContext
+sun/swing/StringUIClientPropertyKey
+sun/swing/UIClientPropertyKey
+sun/swing/SwingUtilities2$LSBCacheEntry
+javax/swing/UIManager$LAFState
+javax/swing/UIDefaults
+javax/swing/MultiUIDefaults
+javax/swing/UIManager$1
+javax/swing/plaf/metal/MetalLookAndFeel
+javax/swing/plaf/basic/BasicLookAndFeel
+javax/swing/LookAndFeel
+sun/swing/DefaultLookup
+javax/swing/plaf/metal/OceanTheme
+javax/swing/plaf/metal/DefaultMetalTheme
+javax/swing/plaf/metal/MetalTheme
+javax/swing/plaf/ColorUIResource
+javax/swing/plaf/UIResource
+sun/swing/PrintColorUIResource
+javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate
+javax/swing/plaf/FontUIResource
+sun/swing/SwingLazyValue
+javax/swing/UIDefaults$LazyValue
+javax/swing/UIDefaults$ActiveValue
+javax/swing/plaf/InsetsUIResource
+javax/swing/plaf/BorderUIResource$EmptyBorderUIResource
+javax/swing/border/EmptyBorder
+javax/swing/border/AbstractBorder
+javax/swing/border/Border
+sun/swing/SwingUtilities2$2
+javax/swing/plaf/basic/BasicLookAndFeel$2
+javax/swing/plaf/DimensionUIResource
+javax/swing/UIDefaults$LazyInputMap
+javax/swing/plaf/metal/MetalLookAndFeel$FontActiveValue
+sun/swing/SwingUtilities2$AATextInfo
+javax/swing/plaf/metal/MetalLookAndFeel$AATextListener
+java/beans/PropertyChangeListenerProxy
+java/util/EventListenerProxy
+javax/swing/plaf/metal/OceanTheme$1
+javax/swing/plaf/metal/OceanTheme$2
+javax/swing/plaf/metal/OceanTheme$3
+javax/swing/plaf/metal/OceanTheme$4
+javax/swing/plaf/metal/OceanTheme$5
+javax/swing/plaf/metal/OceanTheme$6
+javax/swing/SwingPaintEventDispatcher
+sun/awt/PaintEventDispatcher
+java/awt/KeyboardFocusManager
+java/awt/KeyEventDispatcher
+java/awt/KeyEventPostProcessor
+java/awt/KeyboardFocusManager$1
+sun/awt/AWTAccessor$KeyboardFocusManagerAccessor
+java/awt/AWTKeyStroke
+java/awt/AWTKeyStroke$1
+java/awt/DefaultKeyboardFocusManager
+java/awt/DefaultKeyboardFocusManager$1
+sun/awt/AWTAccessor$DefaultKeyboardFocusManagerAccessor
+java/awt/DefaultFocusTraversalPolicy
+java/awt/ContainerOrderFocusTraversalPolicy
+java/awt/FocusTraversalPolicy
+java/util/Collections$UnmodifiableSet
+sun/awt/windows/WKeyboardFocusManagerPeer
+sun/awt/KeyboardFocusManagerPeerImpl
+java/awt/peer/KeyboardFocusManagerPeer
+javax/swing/UIManager$2
+javax/swing/JRootPane
+javax/swing/UIDefaults$TextAndMnemonicHashMap
+com/sun/swing/internal/plaf/metal/resources/metal
+sun/util/ResourceBundleEnumeration
+com/sun/swing/internal/plaf/basic/resources/basic
+javax/swing/plaf/metal/MetalLabelUI
+javax/swing/plaf/basic/BasicLabelUI
+javax/swing/plaf/LabelUI
+javax/swing/plaf/ComponentUI
+sun/reflect/misc/MethodUtil
+sun/reflect/misc/MethodUtil$1
+sun/net/www/protocol/jar/JarURLConnection
+java/net/JarURLConnection
+sun/net/www/protocol/jar/JarFileFactory
+sun/net/www/protocol/jar/URLJarFile$URLJarFileCloseController
+java/net/HttpURLConnection
+sun/net/www/protocol/jar/URLJarFile
+sun/net/www/protocol/jar/URLJarFile$URLJarFileEntry
+sun/net/www/protocol/jar/JarURLConnection$JarURLInputStream
+java/lang/UnsupportedOperationException
+java/lang/reflect/InvocationTargetException
+javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate$1
+javax/swing/plaf/basic/BasicHTML
+sun/awt/util/IdentityArrayList
+java/awt/Window$Type
+java/awt/Window$1
+sun/awt/AWTAccessor$WindowAccessor
+java/awt/Frame$1
+sun/awt/AWTAccessor$FrameAccessor
+java/awt/Cursor
+java/awt/Point
+java/awt/geom/Point2D
+java/awt/Cursor$1
+sun/awt/AWTAccessor$CursorAccessor
+java/awt/GraphicsDevice
+sun/java2d/d3d/D3DGraphicsDevice
+sun/awt/Win32GraphicsDevice
+sun/misc/PerfCounter$WindowsClientCounters
+sun/java2d/d3d/D3DRenderQueue
+sun/java2d/pipe/RenderQueue
+sun/java2d/pipe/RenderBuffer
+sun/java2d/d3d/D3DRenderQueue$1
+sun/java2d/d3d/D3DGraphicsDevice$1Result
+sun/java2d/d3d/D3DGraphicsDevice$1
+sun/java2d/d3d/D3DContext$D3DContextCaps
+sun/java2d/pipe/hw/ContextCapabilities
+sun/awt/Win32GraphicsConfig
+sun/awt/image/SurfaceManager$ProxiedGraphicsConfig
+java/awt/GraphicsConfiguration
+java/awt/BorderLayout
+java/awt/LayoutManager2
+java/awt/Dialog$ModalExclusionType
+java/awt/Window$WindowDisposerRecord
+javax/swing/JPanel
+java/awt/FlowLayout
+javax/swing/plaf/basic/BasicPanelUI
+javax/swing/plaf/PanelUI
+java/awt/Component$BaselineResizeBehavior
+sun/swing/SwingLazyValue$1
+javax/swing/JLayeredPane
+javax/swing/JRootPane$1
+javax/swing/ArrayTable
+javax/swing/JRootPane$RootLayout
+javax/swing/BufferStrategyPaintManager
+javax/swing/RepaintManager$PaintManager
+javax/swing/FocusManager
+javax/swing/LayoutFocusTraversalPolicy
+javax/swing/SortingFocusTraversalPolicy
+javax/swing/InternalFrameFocusTraversalPolicy
+javax/swing/SwingContainerOrderFocusTraversalPolicy
+javax/swing/SortingFocusTraversalPolicy$1
+java/util/Spliterator$OfLong
+java/util/Spliterator$OfPrimitive
+java/util/Spliterator
+java/util/Spliterator$OfInt
+java/util/Spliterator$OfDouble
+java/util/stream/IntStream
+java/util/stream/BaseStream
+java/util/stream/Stream
+java/util/stream/DoubleStream
+java/util/stream/LongStream
+java/util/function/BinaryOperator
+java/util/function/BiFunction
+java/util/function/DoubleBinaryOperator
+java/util/function/IntBinaryOperator
+java/util/function/LongBinaryOperator
+java/util/function/IntToLongFunction
+java/util/function/IntFunction
+java/util/function/IntToDoubleFunction
+java/util/function/IntUnaryOperator
+javax/swing/SwingDefaultFocusTraversalPolicy
+javax/swing/LayoutComparator
+javax/swing/plaf/metal/MetalRootPaneUI
+javax/swing/plaf/basic/BasicRootPaneUI
+javax/swing/plaf/RootPaneUI
+javax/swing/plaf/basic/BasicRootPaneUI$RootPaneInputMap
+javax/swing/plaf/ComponentInputMapUIResource
+javax/swing/ComponentInputMap
+javax/swing/InputMap
+javax/swing/plaf/InputMapUIResource
+javax/swing/KeyStroke
+java/awt/VKCollection
+java/awt/event/KeyEvent
+java/awt/event/KeyEvent$1
+sun/awt/AWTAccessor$KeyEventAccessor
+sun/reflect/UnsafeQualifiedStaticIntegerFieldAccessorImpl
+javax/swing/plaf/basic/LazyActionMap
+javax/swing/plaf/ActionMapUIResource
+javax/swing/ActionMap
+sun/awt/windows/WFramePeer
+java/awt/peer/FramePeer
+java/awt/peer/WindowPeer
+java/awt/peer/ContainerPeer
+sun/awt/windows/WWindowPeer
+sun/awt/windows/WPanelPeer
+java/awt/peer/PanelPeer
+sun/awt/windows/WCanvasPeer
+java/awt/peer/CanvasPeer
+sun/awt/windows/WWindowPeer$ActiveWindowListener
+sun/awt/windows/WWindowPeer$GuiDisposedListener
+sun/awt/RepaintArea
+sun/awt/ExtendedKeyCodes
+sun/awt/EmbeddedFrame
+sun/awt/LightweightFrame
+sun/awt/im/InputMethodWindow
+sun/awt/windows/WComponentPeer$2
+javax/swing/RepaintManager$2
+java/awt/event/InvocationEvent
+java/awt/ActiveEvent
+java/awt/event/InvocationEvent$1
+sun/awt/AWTAccessor$InvocationEventAccessor
+java/awt/EventQueue$5
+java/awt/EventDispatchThread
+sun/awt/PeerEvent
+java/awt/EventDispatchThread$1
+sun/awt/EventQueueItem
+java/awt/Conditional
+java/awt/EventDispatchThread$HierarchyEventFilter
+java/awt/EventFilter
+java/awt/event/WindowEvent
+java/awt/ModalEventFilter
+sun/awt/EventQueueDelegate
+java/awt/event/PaintEvent
+sun/java2d/ScreenUpdateManager
+java/awt/event/MouseEvent
+sun/java2d/d3d/D3DScreenUpdateManager
+java/awt/EventFilter$FilterAction
+sun/awt/dnd/SunDragSourceContextPeer
+java/awt/dnd/peer/DragSourceContextPeer
+java/awt/EventQueue$3
+java/awt/MenuComponent
+java/awt/TrayIcon
+java/awt/event/InputMethodEvent
+sun/java2d/d3d/D3DGraphicsConfig
+java/awt/event/ActionEvent
+sun/java2d/pipe/hw/AccelGraphicsConfig
+sun/java2d/pipe/hw/BufferedContextProvider
+java/util/LinkedList$ListItr
+sun/java2d/windows/GDIWindowSurfaceData
+javax/swing/RepaintManager$2$1
+sun/java2d/loops/XORComposite
+java/awt/Composite
+sun/java2d/windows/GDIBlitLoops
+sun/java2d/loops/Blit
+sun/java2d/loops/GraphicsPrimitive
+sun/java2d/loops/GraphicsPrimitiveMgr
+sun/java2d/loops/CompositeType
+sun/java2d/SunGraphics2D
+sun/awt/ConstrainableGraphics
+java/awt/Graphics2D
+java/awt/AlphaComposite
+java/awt/geom/Path2D
+java/awt/geom/Path2D$Float
+sun/java2d/loops/BlitBg
+sun/java2d/loops/ScaledBlit
+sun/java2d/loops/FillRect
+sun/java2d/loops/FillSpans
+sun/java2d/loops/FillParallelogram
+sun/java2d/loops/DrawParallelogram
+sun/java2d/loops/DrawLine
+sun/java2d/loops/DrawRect
+sun/java2d/loops/DrawPolygons
+sun/java2d/loops/DrawPath
+sun/java2d/loops/FillPath
+sun/java2d/loops/MaskBlit
+sun/java2d/loops/MaskFill
+sun/java2d/loops/DrawGlyphList
+sun/java2d/loops/DrawGlyphListAA
+sun/java2d/loops/DrawGlyphListLCD
+sun/java2d/loops/TransformHelper
+java/awt/BasicStroke
+java/awt/Stroke
+sun/java2d/pipe/ValidatePipe
+sun/java2d/loops/CustomComponent
+sun/java2d/loops/GraphicsPrimitiveProxy
+sun/java2d/loops/GeneralRenderer
+sun/java2d/loops/GraphicsPrimitiveMgr$1
+sun/java2d/loops/GraphicsPrimitiveMgr$2
+sun/java2d/windows/GDIRenderer
+sun/java2d/loops/RenderLoops
+sun/java2d/loops/GraphicsPrimitiveMgr$PrimitiveSpec
+java/util/TimSort
+sun/java2d/DefaultDisposerRecord
+sun/java2d/SurfaceDataProxy
+sun/awt/image/SurfaceManager$FlushableCacheData
+sun/java2d/SurfaceDataProxy$1
+sun/java2d/StateTracker
+sun/java2d/StateTracker$1
+sun/java2d/StateTracker$2
+sun/awt/windows/WColor
+sun/awt/windows/WFontPeer
+sun/awt/PlatformFont
+java/awt/peer/FontPeer
+sun/awt/NativeLibLoader
+sun/awt/NativeLibLoader$1
+sun/font/SunFontManager
+sun/java2d/FontSupport
+sun/font/FontManagerForSGE
+sun/font/FontManager
+sun/font/SunFontManager$TTFilter
+java/io/FilenameFilter
+sun/font/SunFontManager$T1Filter
+sun/font/SunFontManager$1
+sun/font/FontManagerNativeLibrary
+sun/font/FontManagerNativeLibrary$1
+sun/font/FontUtilities
+sun/font/FontUtilities$1
+sun/font/TrueTypeFont
+sun/font/FileFont
+sun/font/PhysicalFont
+sun/font/Font2D
+sun/font/Type1Font
+java/awt/geom/Point2D$Float
+sun/font/StrikeMetrics
+java/awt/geom/Rectangle2D$Float
+java/awt/geom/GeneralPath
+sun/font/CharToGlyphMapper
+sun/font/PhysicalStrike
+sun/font/FontStrike
+sun/font/StrikeCache
+sun/font/StrikeCache$1
+sun/font/GlyphList
+sun/font/FontManagerFactory
+sun/font/FontManagerFactory$1
+sun/awt/Win32FontManager
+sun/awt/Win32FontManager$1
+sun/font/CompositeFont
+sun/font/SunFontManager$2
+sun/font/SunFontManager$FontRegistrationInfo
+sun/awt/windows/WFontConfiguration
+sun/awt/FontConfiguration
+sun/awt/FontDescriptor
+java/io/DataInputStream
+java/io/DataInput
+sun/font/CompositeFontDescriptor
+sun/font/Font2DHandle
+sun/font/FontFamily
+sun/font/SunFontManager$3
+sun/awt/Win32FontManager$2
+sun/awt/FontConfiguration$2
+sun/awt/windows/WingDings
+sun/awt/windows/WingDings$Encoder
+sun/awt/Symbol
+sun/awt/Symbol$Encoder
+sun/awt/im/InputMethodManager
+sun/awt/im/ExecutableInputMethodManager
+sun/awt/windows/WInputMethodDescriptor
+java/awt/im/spi/InputMethodDescriptor
+sun/awt/im/InputMethodLocator
+sun/awt/im/ExecutableInputMethodManager$3
+java/awt/peer/LightweightPeer
+sun/awt/NullComponentPeer
+java/awt/EventQueue$4
+java/awt/SplashScreen
+sun/awt/dnd/SunDropTargetEvent
+java/awt/Dialog
+java/awt/event/FocusEvent
+java/util/concurrent/locks/LockSupport
+java/awt/Dialog$ModalityType
+sun/awt/TimedWindowEvent
+java/awt/SequencedEvent
+java/awt/SequencedEvent$1
+sun/awt/AWTAccessor$SequencedEventAccessor
+java/awt/DefaultKeyboardFocusManager$DefaultKeyboardFocusManagerSentEvent
+java/awt/SentEvent
+sun/awt/windows/WGlobalCursorManager
+sun/awt/event/IgnorePaintEvent
+sun/awt/GlobalCursorManager
+sun/awt/GlobalCursorManager$NativeUpdater
+java/util/ArrayList$ListItr
+sun/awt/CausedFocusEvent$Cause
+java/awt/KeyboardFocusManager$HeavyweightFocusRequest
+java/awt/DefaultKeyboardFocusManager$TypeAheadMarker
+java/awt/KeyboardFocusManager$LightweightFocusRequest
+sun/awt/CausedFocusEvent
+java/util/IdentityHashMap$KeySet
+java/util/IdentityHashMap$KeyIterator
+javax/swing/RepaintManager$4
+sun/java2d/d3d/D3DSurfaceData$D3DWindowSurfaceData
+sun/java2d/d3d/D3DSurfaceData
+sun/java2d/pipe/hw/AccelSurface
+java/awt/GraphicsCallback$PaintCallback
+java/awt/GraphicsCallback
+sun/awt/SunGraphicsCallback
+javax/swing/BufferStrategyPaintManager$BufferInfo
+java/awt/event/WindowListener
+java/awt/event/ComponentAdapter
+java/awt/event/ComponentListener
+java/awt/AWTEventMulticaster
+java/awt/event/ContainerListener
+java/awt/event/FocusListener
+java/awt/event/KeyListener
+java/awt/event/MouseListener
+java/awt/event/MouseMotionListener
+java/awt/event/WindowFocusListener
+java/awt/event/WindowStateListener
+java/awt/event/ActionListener
+java/awt/event/ItemListener
+java/awt/event/AdjustmentListener
+java/awt/event/TextListener
+java/awt/event/InputMethodListener
+java/awt/event/HierarchyListener
+java/awt/event/HierarchyBoundsListener
+java/awt/event/MouseWheelListener
+java/awt/BufferCapabilities
+java/awt/Component$BltSubRegionBufferStrategy
+sun/awt/SubRegionShowable
+java/awt/Component$BltBufferStrategy
+java/awt/image/BufferStrategy
+sun/awt/image/BufferedImageGraphicsConfig
+sun/print/PrinterGraphicsConfig
+sun/java2d/opengl/WGLGraphicsConfig
+sun/java2d/opengl/OGLGraphicsConfig
+sun/awt/image/BufImgVolatileSurfaceManager
+java/awt/image/Raster
+java/awt/image/DataBufferInt
+java/awt/image/DataBuffer
+java/awt/image/DataBuffer$1
+sun/awt/image/SunWritableRaster$DataStealer
+sun/awt/image/SunWritableRaster
+java/awt/image/WritableRaster
+java/awt/image/SinglePixelPackedSampleModel
+java/awt/image/SampleModel
+sun/awt/image/IntegerInterleavedRaster
+sun/awt/image/IntegerComponentRaster
+sun/awt/image/NativeLibLoader
+sun/awt/image/NativeLibLoader$1
+java/awt/image/BufferedImage
+java/awt/image/WritableRenderedImage
+java/awt/image/RenderedImage
+java/awt/image/BufferedImage$1
+sun/awt/image/BufImgSurfaceData
+sun/awt/image/BufImgSurfaceData$ICMColorData
+sun/font/FontDesignMetrics
+java/awt/FontMetrics
+sun/font/FontDesignMetrics$MetricsKey
+sun/font/FontStrikeDesc
+sun/font/CompositeStrike
+sun/font/FontStrikeDisposer
+sun/java2d/Disposer$PollDisposable
+sun/font/StrikeCache$SoftDisposerRef
+sun/font/StrikeCache$DisposableStrike
+sun/font/TrueTypeFont$TTDisposerRecord
+sun/font/TrueTypeFont$1
+java/io/RandomAccessFile
+java/io/DataOutput
+sun/nio/ch/FileChannelImpl
+java/nio/channels/FileChannel
+java/nio/channels/SeekableByteChannel
+java/nio/channels/ByteChannel
+java/nio/channels/ReadableByteChannel
+java/nio/channels/Channel
+java/nio/channels/WritableByteChannel
+java/nio/channels/GatheringByteChannel
+java/nio/channels/ScatteringByteChannel
+java/nio/channels/spi/AbstractInterruptibleChannel
+java/nio/channels/InterruptibleChannel
+java/nio/file/attribute/FileAttribute
+sun/nio/ch/IOUtil
+sun/nio/ch/IOUtil$1
+sun/nio/ch/NativeThreadSet
+sun/nio/ch/FileDispatcherImpl
+sun/nio/ch/FileDispatcher
+sun/nio/ch/NativeDispatcher
+sun/nio/ch/FileDispatcherImpl$1
+java/nio/channels/spi/AbstractInterruptibleChannel$1
+sun/nio/ch/NativeThread
+sun/nio/ch/IOStatus
+sun/nio/ch/Util
+sun/nio/ch/Util$1
+sun/nio/ch/Util$BufferCache
+java/nio/DirectByteBuffer$Deallocator
+java/nio/ByteBufferAsIntBufferB
+java/nio/IntBuffer
+sun/font/TrueTypeFont$DirectoryEntry
+java/nio/ByteBufferAsShortBufferB
+java/nio/ShortBuffer
+sun/nio/cs/UTF_16$Decoder
+sun/nio/cs/UnicodeDecoder
+sun/font/FileFontStrike
+sun/font/FontScaler
+sun/font/T2KFontScaler
+sun/font/T2KFontScaler$1
+sun/font/TrueTypeGlyphMapper
+sun/font/CMap
+sun/font/CMap$NullCMapClass
+sun/font/CMap$CMapFormat4
+java/nio/ByteBufferAsCharBufferB
+sun/font/FontDesignMetrics$KeyReference
+sun/font/CompositeGlyphMapper
+java/awt/print/PrinterGraphics
+java/awt/PrintGraphics
+sun/java2d/loops/FontInfo
+java/util/jar/Attributes
+java/util/jar/Manifest$FastInputStream
+sun/nio/cs/UTF_8$Decoder
+java/util/jar/Attributes$Name
+sun/misc/ASCIICaseInsensitiveComparator
+java/util/jar/JarVerifier
+java/security/CodeSigner
+java/util/jar/JarVerifier$3
+java/io/ByteArrayOutputStream
+java/lang/Package
+sun/security/util/SignatureFileVerifier
+sun/security/util/ManifestEntryVerifier
+java/util/MissingResourceException
+java/io/StringWriter
+javax/swing/JDialog
+javax/swing/text/JTextComponent
+javax/swing/Scrollable
+javax/swing/JTextArea
+javax/swing/JScrollPane
+javax/swing/ScrollPaneConstants
+javax/swing/AbstractButton
+java/awt/ItemSelectable
+javax/swing/JButton
+java/lang/SecurityException
+javax/swing/JWindow
+java/lang/NumberFormatException
+java/io/UnsupportedEncodingException
+sun/misc/URLClassPath$FileLoader
+java/lang/IndexOutOfBoundsException
+java/lang/CloneNotSupportedException
+java/lang/InternalError
+java/net/UnknownHostException
+java/net/Socket
+java/net/SocketAddress
+java/nio/channels/SocketChannel
+java/nio/channels/NetworkChannel
+java/nio/channels/spi/AbstractSelectableChannel
+java/nio/channels/SelectableChannel
+java/net/InetAddress
+java/net/SocketException
+java/net/SocketImplFactory
+java/net/InetSocketAddress
+java/net/InetSocketAddress$InetSocketAddressHolder
+java/net/Proxy
+java/net/SocketImpl
+java/net/SocketOptions
+java/net/SocksSocketImpl
+java/net/SocksConsts
+java/net/PlainSocketImpl
+java/net/AbstractPlainSocketImpl
+java/net/AbstractPlainSocketImpl$1
+java/net/PlainSocketImpl$1
+java/net/DualStackPlainSocketImpl
+java/net/InetAddress$1
+java/net/InetAddress$InetAddressHolder
+java/net/InetAddress$Cache
+java/net/InetAddress$Cache$Type
+java/net/InetAddressImplFactory
+java/net/Inet6AddressImpl
+java/net/InetAddressImpl
+java/net/InetAddress$2
+sun/net/spi/nameservice/NameService
+sun/net/util/IPAddressUtil
+java/net/Inet4Address
+java/net/SocksSocketImpl$3
+java/net/ProxySelector
+sun/net/spi/DefaultProxySelector
+sun/net/spi/DefaultProxySelector$1
+sun/net/NetProperties
+sun/net/NetProperties$1
+java/net/Inet6Address
+java/net/URI
+java/net/URI$Parser
+sun/net/spi/DefaultProxySelector$NonProxyInfo
+sun/net/spi/DefaultProxySelector$3
+java/net/Proxy$Type
+sun/net/NetHooks
+java/net/Inet6Address$Inet6AddressHolder
+java/net/SocketTimeoutException
+java/io/InterruptedIOException
+javax/swing/UnsupportedLookAndFeelException
+java/net/MalformedURLException
+java/lang/UnsatisfiedLinkError
+sun/misc/FDBigInteger
+java/util/ResourceBundle$Control$1
+java/net/URLClassLoader$2
+java/util/PropertyResourceBundle
+java/util/ResourceBundle$BundleReference
+java/util/logging/Level
+java/util/logging/Level$KnownLevel
+java/util/logging/Logger
+java/util/logging/Handler
+java/util/logging/Logger$LoggerBundle
+java/util/concurrent/CopyOnWriteArrayList
+java/util/logging/LogManager
+java/util/logging/LogManager$1
+java/util/logging/LogManager$SystemLoggerContext
+java/util/logging/LogManager$LoggerContext
+java/util/logging/LogManager$LogNode
+java/util/logging/LoggingPermission
+java/util/logging/LogManager$Cleaner
+java/util/logging/LogManager$2
+java/util/logging/LogManager$3
+java/util/logging/LogManager$LoggerWeakRef
+java/util/logging/LogManager$LoggerContext$1
+java/util/logging/LogManager$RootLogger
+java/util/logging/LogManager$5
+java/util/logging/Logger$1
+sun/util/logging/resources/logging
+javax/swing/Box
+javax/swing/Box$Filler
+javax/swing/Icon
+javax/swing/BoxLayout
+javax/swing/plaf/basic/BasicPopupMenuUI
+javax/swing/plaf/PopupMenuUI
+javax/swing/ImageIcon
+javax/swing/ImageIcon$1
+javax/swing/ImageIcon$2
+javax/swing/ImageIcon$2$1
+java/awt/dnd/DropTarget
+java/awt/dnd/DropTargetListener
+javax/accessibility/AccessibleContext
+sun/reflect/UnsafeObjectFieldAccessorImpl
+java/awt/MediaTracker
+sun/misc/SoftCache$ValueCell
+sun/awt/image/URLImageSource
+sun/awt/image/InputStreamImageSource
+java/awt/image/ImageProducer
+sun/awt/image/ImageFetchable
+sun/awt/image/ToolkitImage
+javax/swing/ImageIcon$3
+java/awt/ImageMediaEntry
+java/awt/MediaEntry
+sun/awt/image/MultiResolutionToolkitImage
+sun/awt/image/MultiResolutionImage
+sun/awt/image/ImageRepresentation
+java/awt/image/ImageConsumer
+sun/awt/image/ImageWatched
+sun/awt/image/ImageWatched$Link
+sun/awt/image/ImageWatched$WeakLink
+sun/awt/image/ImageConsumerQueue
+sun/awt/image/ImageFetcher
+sun/awt/image/FetcherInfo
+sun/awt/image/ImageFetcher$1
+sun/net/ProgressMonitor
+sun/net/DefaultProgressMeteringPolicy
+sun/net/ProgressMeteringPolicy
+sun/net/www/MimeTable
+java/net/FileNameMap
+sun/net/www/MimeTable$1
+sun/net/www/MimeTable$DefaultInstanceHolder
+sun/net/www/MimeTable$DefaultInstanceHolder$1
+sun/net/www/MimeEntry
+java/net/URLConnection$1
+java/text/SimpleDateFormat
+java/text/DateFormat
+java/text/Format
+java/text/DateFormat$Field
+java/text/Format$Field
+java/util/TimeZone
+sun/util/calendar/ZoneInfo
+sun/util/calendar/ZoneInfoFile
+sun/util/calendar/ZoneInfoFile$1
+sun/util/calendar/ZoneInfoFile$ZoneOffsetTransitionRule
+sun/util/calendar/ZoneInfoFile$Checksum
+java/util/zip/CRC32
+java/util/zip/Checksum
+java/util/TimeZone$1
+java/util/Calendar
+sun/util/spi/CalendarProvider
+java/util/spi/LocaleServiceProvider
+sun/util/locale/provider/LocaleProviderAdapter
+sun/util/locale/provider/JRELocaleProviderAdapter
+sun/util/locale/provider/ResourceBundleBasedAdapter
+sun/util/locale/provider/SPILocaleProviderAdapter
+sun/util/locale/provider/AuxLocaleProviderAdapter
+sun/util/locale/provider/AuxLocaleProviderAdapter$NullProvider
+sun/util/locale/provider/LocaleProviderAdapter$Type
+sun/util/locale/provider/LocaleProviderAdapter$1
+sun/util/locale/provider/CalendarProviderImpl
+sun/util/locale/provider/AvailableLanguageTags
+sun/util/locale/provider/LocaleDataMetaInfo
+sun/util/locale/provider/JRELocaleProviderAdapter$1
+java/util/Calendar$Builder
+java/util/GregorianCalendar
+sun/util/locale/provider/CalendarDataUtility
+java/util/spi/CalendarDataProvider
+sun/util/locale/provider/LocaleServiceProviderPool
+java/text/spi/BreakIteratorProvider
+java/text/spi/CollatorProvider
+java/text/spi/DateFormatProvider
+java/text/spi/DateFormatSymbolsProvider
+java/text/spi/DecimalFormatSymbolsProvider
+java/text/spi/NumberFormatProvider
+java/util/spi/CurrencyNameProvider
+java/util/spi/LocaleNameProvider
+java/util/spi/TimeZoneNameProvider
+sun/util/locale/provider/CalendarDataProviderImpl
+sun/util/locale/provider/SPILocaleProviderAdapter$1
+sun/util/locale/provider/CalendarDataUtility$CalendarWeekParameterGetter
+sun/util/locale/provider/LocaleServiceProviderPool$LocalizedObjectGetter
+sun/util/locale/provider/LocaleResources
+sun/util/resources/LocaleData
+sun/util/resources/LocaleData$1
+sun/util/resources/LocaleData$LocaleDataResourceBundleControl
+sun/util/locale/LanguageTag
+java/util/Collections$EmptyIterator
+sun/util/resources/CalendarData
+sun/util/resources/LocaleNamesBundle
+sun/util/resources/OpenListResourceBundle
+sun/util/resources/en/CalendarData_en
+sun/util/locale/provider/LocaleResources$ResourceReference
+sun/util/calendar/Gregorian$Date
+sun/util/calendar/BaseCalendar$Date
+sun/util/calendar/CalendarDate
+sun/util/calendar/CalendarUtils
+java/text/DateFormatSymbols
+sun/util/locale/provider/DateFormatSymbolsProviderImpl
+sun/text/resources/FormatData
+sun/util/resources/ParallelListResourceBundle
+java/util/concurrent/atomic/AtomicMarkableReference
+java/util/concurrent/atomic/AtomicMarkableReference$Pair
+sun/text/resources/en/FormatData_en
+sun/text/resources/en/FormatData_en_US
+sun/util/resources/ParallelListResourceBundle$KeySet
+java/text/NumberFormat
+sun/util/locale/provider/NumberFormatProviderImpl
+java/text/DecimalFormatSymbols
+sun/util/locale/provider/DecimalFormatSymbolsProviderImpl
+java/util/Currency
+java/util/Currency$1
+sun/util/locale/provider/CurrencyNameProviderImpl
+java/util/Currency$CurrencyNameGetter
+sun/util/resources/CurrencyNames
+sun/util/resources/en/CurrencyNames_en_US
+java/text/DecimalFormat
+java/text/FieldPosition
+java/text/DigitList
+java/math/RoundingMode
+java/text/DontCareFieldPosition
+java/text/DontCareFieldPosition$1
+java/text/Format$FieldDelegate
+sun/awt/image/GifImageDecoder
+sun/awt/image/ImageDecoder
+sun/awt/image/GifFrame
+java/awt/image/DataBufferByte
+java/awt/image/PixelInterleavedSampleModel
+java/awt/image/ComponentSampleModel
+sun/awt/image/ByteInterleavedRaster
+sun/awt/image/ByteComponentRaster
+sun/awt/image/BytePackedRaster
+javax/swing/plaf/BorderUIResource
+javax/swing/BorderFactory
+javax/swing/border/BevelBorder
+javax/swing/border/EtchedBorder
+javax/swing/plaf/metal/MetalIconFactory
+javax/swing/plaf/metal/MetalIconFactory$TreeFolderIcon
+javax/swing/plaf/metal/MetalIconFactory$FolderIcon16
+java/lang/ClassLoaderHelper
+java/util/zip/ZipInputStream
+java/io/PushbackInputStream
+java/util/zip/ZipUtils
+java/io/RandomAccessFile$1
+java/lang/Thread$State
+javax/swing/SwingUtilities$SharedOwnerFrame
+javax/swing/border/LineBorder
+javax/swing/Popup$HeavyWeightWindow
+sun/awt/ModalExclude
+javax/swing/SizeRequirements
+com/sun/java/swing/plaf/windows/WindowsPopupWindow
+java/applet/Applet
+java/awt/Panel
+javax/swing/JRadioButton
+javax/swing/JToggleButton
+java/lang/ClassFormatError
+sun/awt/image/BufImgSurfaceManager
+java/awt/geom/RectIterator
+java/awt/geom/PathIterator
+javax/swing/CellRendererPane
+javax/swing/RepaintManager$3
+java/io/ObjectInputStream
+java/io/ObjectInput
+java/io/ObjectStreamConstants
+javax/swing/JTabbedPane
+javax/swing/event/MenuListener
+javax/swing/event/ChangeListener
+javax/swing/DefaultSingleSelectionModel
+javax/swing/SingleSelectionModel
+javax/swing/JTabbedPane$ModelListener
+javax/swing/plaf/metal/MetalTabbedPaneUI
+javax/swing/plaf/basic/BasicTabbedPaneUI
+javax/swing/plaf/TabbedPaneUI
+javax/swing/plaf/metal/MetalTabbedPaneUI$TabbedPaneLayout
+javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneLayout
+javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneScrollLayout
+javax/swing/plaf/basic/BasicTabbedPaneUI$Handler
+sun/reflect/MethodAccessorGenerator
+sun/reflect/AccessorGenerator
+sun/reflect/ClassFileConstants
+sun/reflect/ByteVectorFactory
+sun/reflect/ByteVectorImpl
+sun/reflect/ByteVector
+sun/reflect/ClassFileAssembler
+sun/reflect/UTF8
+sun/reflect/Label
+sun/reflect/Label$PatchInfo
+sun/reflect/MethodAccessorGenerator$1
+sun/reflect/ClassDefiner
+sun/reflect/ClassDefiner$1
+sun/reflect/BootstrapConstructorAccessorImpl
+javax/swing/JTextField
+javax/swing/JViewport
+java/awt/CardLayout
+javax/swing/text/Document
+javax/swing/text/JTextComponent$1
+sun/swing/SwingAccessor$JTextComponentAccessor
+javax/swing/text/JTextComponent$4
+com/sun/beans/util/Cache
+com/sun/beans/util/Cache$Kind
+com/sun/beans/util/Cache$Kind$1
+com/sun/beans/util/Cache$Kind$2
+com/sun/beans/util/Cache$Kind$3
+com/sun/beans/util/Cache$CacheEntry
+javax/swing/Action
+javax/swing/JTextField$NotifyAction
+javax/swing/text/TextAction
+javax/swing/AbstractAction
+java/lang/ArrayIndexOutOfBoundsException
+javax/swing/DropMode
+javax/swing/text/JTextComponent$MutableCaretEvent
+javax/swing/event/CaretEvent
+javax/swing/plaf/metal/MetalTextFieldUI
+javax/swing/plaf/basic/BasicTextFieldUI
+javax/swing/plaf/basic/BasicTextUI
+javax/swing/text/ViewFactory
+javax/swing/plaf/TextUI
+javax/swing/plaf/basic/BasicTextUI$BasicCursor
+javax/swing/text/DefaultEditorKit
+javax/swing/text/EditorKit
+javax/swing/text/DefaultEditorKit$InsertContentAction
+javax/swing/text/DefaultEditorKit$DeletePrevCharAction
+javax/swing/text/DefaultEditorKit$DeleteNextCharAction
+javax/swing/text/DefaultEditorKit$ReadOnlyAction
+javax/swing/text/DefaultEditorKit$DeleteWordAction
+javax/swing/text/DefaultEditorKit$WritableAction
+javax/swing/text/DefaultEditorKit$CutAction
+javax/swing/text/DefaultEditorKit$CopyAction
+javax/swing/text/DefaultEditorKit$PasteAction
+javax/swing/text/DefaultEditorKit$VerticalPageAction
+javax/swing/text/DefaultEditorKit$PageAction
+javax/swing/text/DefaultEditorKit$InsertBreakAction
+javax/swing/text/DefaultEditorKit$BeepAction
+javax/swing/text/DefaultEditorKit$NextVisualPositionAction
+javax/swing/text/DefaultEditorKit$BeginWordAction
+javax/swing/text/DefaultEditorKit$EndWordAction
+javax/swing/text/DefaultEditorKit$PreviousWordAction
+javax/swing/text/DefaultEditorKit$NextWordAction
+javax/swing/text/DefaultEditorKit$BeginLineAction
+javax/swing/text/DefaultEditorKit$EndLineAction
+javax/swing/text/DefaultEditorKit$BeginParagraphAction
+javax/swing/text/DefaultEditorKit$EndParagraphAction
+javax/swing/text/DefaultEditorKit$BeginAction
+javax/swing/text/DefaultEditorKit$EndAction
+javax/swing/text/DefaultEditorKit$DefaultKeyTypedAction
+javax/swing/text/DefaultEditorKit$InsertTabAction
+javax/swing/text/DefaultEditorKit$SelectWordAction
+javax/swing/text/DefaultEditorKit$SelectLineAction
+javax/swing/text/DefaultEditorKit$SelectParagraphAction
+javax/swing/text/DefaultEditorKit$SelectAllAction
+javax/swing/text/DefaultEditorKit$UnselectAction
+javax/swing/text/DefaultEditorKit$ToggleComponentOrientationAction
+javax/swing/text/DefaultEditorKit$DumpModelAction
+javax/swing/plaf/basic/BasicTextUI$TextTransferHandler
+javax/swing/TransferHandler
+javax/swing/TransferHandler$TransferAction
+sun/swing/UIAction
+javax/swing/text/Position$Bias
+javax/swing/plaf/basic/BasicTextUI$RootView
+javax/swing/text/View
+javax/swing/plaf/basic/BasicTextUI$UpdateHandler
+javax/swing/event/DocumentListener
+javax/swing/plaf/basic/BasicTextUI$DragListener
+javax/swing/plaf/basic/DragRecognitionSupport$BeforeDrag
+javax/swing/event/MouseInputAdapter
+javax/swing/event/MouseInputListener
+java/awt/event/MouseAdapter
+javax/swing/plaf/metal/MetalBorders
+javax/swing/plaf/BorderUIResource$CompoundBorderUIResource
+javax/swing/border/CompoundBorder
+javax/swing/plaf/metal/MetalBorders$TextFieldBorder
+javax/swing/plaf/metal/MetalBorders$Flush3DBorder
+javax/swing/plaf/basic/BasicBorders$MarginBorder
+javax/swing/plaf/basic/BasicTextUI$BasicCaret
+javax/swing/text/DefaultCaret
+javax/swing/text/Caret
+javax/swing/text/DefaultCaret$Handler
+java/awt/datatransfer/ClipboardOwner
+javax/swing/Timer
+javax/swing/Timer$DoPostEvent
+javax/swing/plaf/basic/BasicTextUI$BasicHighlighter
+javax/swing/text/DefaultHighlighter
+javax/swing/text/LayeredHighlighter
+javax/swing/text/Highlighter
+javax/swing/text/Highlighter$Highlight
+javax/swing/text/DefaultHighlighter$DefaultHighlightPainter
+javax/swing/text/LayeredHighlighter$LayerPainter
+javax/swing/text/Highlighter$HighlightPainter
+javax/swing/text/DefaultHighlighter$SafeDamager
+javax/swing/ClientPropertyKey
+javax/swing/ClientPropertyKey$1
+sun/awt/AWTAccessor$ClientPropertyKeyAccessor
+javax/swing/TransferHandler$SwingDropTarget
+java/awt/dnd/DropTargetContext
+java/awt/datatransfer/SystemFlavorMap
+java/awt/datatransfer/FlavorMap
+java/awt/datatransfer/FlavorTable
+java/awt/datatransfer/SystemFlavorMap$SoftCache
+javax/swing/TransferHandler$DropHandler
+javax/swing/TransferHandler$TransferSupport
+javax/swing/text/PlainDocument
+javax/swing/text/AbstractDocument
+javax/swing/text/GapContent
+javax/swing/text/AbstractDocument$Content
+javax/swing/text/GapVector
+javax/swing/text/GapContent$MarkVector
+javax/swing/text/GapContent$MarkData
+javax/swing/text/StyleContext
+javax/swing/text/AbstractDocument$AttributeContext
+javax/swing/text/StyleConstants
+javax/swing/text/StyleConstants$CharacterConstants
+javax/swing/text/AttributeSet$CharacterAttribute
+javax/swing/text/StyleConstants$FontConstants
+javax/swing/text/AttributeSet$FontAttribute
+javax/swing/text/StyleConstants$ColorConstants
+javax/swing/text/AttributeSet$ColorAttribute
+javax/swing/text/StyleConstants$ParagraphConstants
+javax/swing/text/AttributeSet$ParagraphAttribute
+javax/swing/text/StyleContext$FontKey
+javax/swing/text/SimpleAttributeSet
+javax/swing/text/MutableAttributeSet
+javax/swing/text/AttributeSet
+javax/swing/text/SimpleAttributeSet$EmptyAttributeSet
+javax/swing/text/StyleContext$NamedStyle
+javax/swing/text/Style
+java/util/Collections$EmptyEnumeration
+javax/swing/text/StyleContext$SmallAttributeSet
+java/util/LinkedHashMap$LinkedKeySet
+java/util/Collections$3
+java/util/LinkedHashMap$LinkedKeyIterator
+javax/swing/text/AbstractDocument$BidiRootElement
+javax/swing/text/AbstractDocument$BranchElement
+javax/swing/text/AbstractDocument$AbstractElement
+javax/swing/text/Element
+javax/swing/tree/TreeNode
+javax/swing/text/AbstractDocument$1
+javax/swing/text/AbstractDocument$BidiElement
+javax/swing/text/AbstractDocument$LeafElement
+javax/swing/text/GapContent$StickyPosition
+javax/swing/text/Position
+javax/swing/text/StyleContext$KeyEnumeration
+javax/swing/text/FieldView
+javax/swing/text/PlainView
+javax/swing/text/TabExpander
+javax/swing/text/JTextComponent$DefaultKeymap
+javax/swing/text/Keymap
+javax/swing/text/JTextComponent$KeymapWrapper
+javax/swing/text/JTextComponent$KeymapActionMap
+javax/swing/plaf/basic/BasicTextUI$FocusAction
+javax/swing/plaf/basic/BasicTextUI$TextActionWrapper
+javax/swing/plaf/synth/SynthUI
+javax/swing/plaf/synth/SynthConstants
+javax/swing/JEditorPane
+javax/swing/DefaultBoundedRangeModel
+javax/swing/BoundedRangeModel
+javax/swing/JTextField$ScrollRepainter
+javax/swing/DefaultButtonModel
+javax/swing/ButtonModel
+javax/swing/AbstractButton$Handler
+javax/swing/plaf/basic/BasicButtonUI
+javax/swing/plaf/ButtonUI
+javax/swing/plaf/metal/MetalBorders$ButtonBorder
+javax/swing/plaf/basic/BasicButtonListener
+javax/swing/event/AncestorListener
+java/beans/VetoableChangeListener
+javax/swing/plaf/metal/MetalComboBoxButton
+javax/swing/plaf/basic/BasicArrowButton
+javax/swing/plaf/metal/MetalScrollButton
+sun/swing/ImageIconUIResource
+javax/swing/GrayFilter
+java/awt/image/RGBImageFilter
+java/awt/image/ImageFilter
+java/awt/image/FilteredImageSource
+javax/swing/plaf/basic/BasicGraphicsUtils
+javax/swing/ButtonGroup
+org/xml/sax/SAXException
+javax/xml/parsers/ParserConfigurationException
+org/xml/sax/EntityResolver
+org/w3c/dom/Node
+java/io/StringReader
+java/security/NoSuchAlgorithmException
+java/security/GeneralSecurityException
+java/util/zip/DeflaterOutputStream
+java/util/zip/GZIPInputStream
+org/xml/sax/InputSource
+javax/xml/parsers/DocumentBuilderFactory
+javax/xml/parsers/FactoryFinder
+javax/xml/parsers/SecuritySupport
+javax/xml/parsers/SecuritySupport$2
+javax/xml/parsers/SecuritySupport$5
+javax/xml/parsers/FactoryFinder$1
+javax/xml/parsers/DocumentBuilder
+org/w3c/dom/Document
+org/xml/sax/helpers/DefaultHandler
+org/xml/sax/DTDHandler
+org/xml/sax/ContentHandler
+org/xml/sax/ErrorHandler
+org/xml/sax/SAXNotSupportedException
+org/xml/sax/Locator
+org/xml/sax/SAXNotRecognizedException
+org/xml/sax/SAXParseException
+org/w3c/dom/NodeList
+org/w3c/dom/events/EventTarget
+org/w3c/dom/traversal/DocumentTraversal
+org/w3c/dom/events/DocumentEvent
+org/w3c/dom/ranges/DocumentRange
+org/w3c/dom/Entity
+org/w3c/dom/Element
+org/w3c/dom/CharacterData
+org/w3c/dom/CDATASection
+org/w3c/dom/Text
+org/xml/sax/AttributeList
+org/w3c/dom/DOMException
+org/w3c/dom/DocumentType
+org/w3c/dom/Notation
+org/w3c/dom/Attr
+org/w3c/dom/EntityReference
+org/w3c/dom/ProcessingInstruction
+org/w3c/dom/Comment
+org/w3c/dom/DocumentFragment
+org/w3c/dom/traversal/TreeWalker
+org/w3c/dom/ranges/Range
+org/w3c/dom/events/Event
+org/w3c/dom/events/MutationEvent
+org/w3c/dom/traversal/NodeIterator
+org/w3c/dom/events/EventException
+java/lang/StringIndexOutOfBoundsException
+org/w3c/dom/NamedNodeMap
+java/awt/GridLayout
+javax/swing/JToggleButton$ToggleButtonModel
+javax/swing/plaf/metal/MetalRadioButtonUI
+javax/swing/plaf/basic/BasicRadioButtonUI
+javax/swing/plaf/basic/BasicToggleButtonUI
+javax/swing/plaf/basic/BasicBorders
+javax/swing/plaf/basic/BasicBorders$RadioButtonBorder
+javax/swing/plaf/basic/BasicBorders$ButtonBorder
+javax/swing/plaf/metal/MetalIconFactory$RadioButtonIcon
+javax/swing/plaf/basic/BasicRadioButtonUI$KeyHandler
+javax/swing/plaf/basic/BasicRadioButtonUI$SelectPreviousBtn
+javax/swing/plaf/basic/BasicRadioButtonUI$SelectNextBtn
+javax/swing/event/ChangeEvent
+java/awt/event/ItemEvent
+javax/swing/ToolTipManager
+javax/swing/ToolTipManager$insideTimerAction
+javax/swing/ToolTipManager$outsideTimerAction
+javax/swing/ToolTipManager$stillInsideTimerAction
+javax/swing/ToolTipManager$MoveBeforeEnterListener
+java/awt/event/MouseMotionAdapter
+javax/swing/ToolTipManager$AccessibilityKeyListener
+java/awt/event/KeyAdapter
+java/awt/CardLayout$Card
+javax/swing/JComboBox
+javax/swing/event/ListDataListener
+javax/swing/JCheckBox
+javax/swing/JPopupMenu
+javax/swing/MenuElement
+javax/swing/DefaultComboBoxModel
+javax/swing/MutableComboBoxModel
+javax/swing/ComboBoxModel
+javax/swing/ListModel
+javax/swing/AbstractListModel
+javax/swing/JComboBox$1
+javax/swing/AncestorNotifier
+javax/swing/plaf/metal/MetalComboBoxUI
+javax/swing/plaf/basic/BasicComboBoxUI
+javax/swing/plaf/ComboBoxUI
+javax/swing/plaf/metal/MetalComboBoxUI$MetalComboBoxLayoutManager
+javax/swing/plaf/basic/BasicComboBoxUI$ComboBoxLayoutManager
+javax/swing/plaf/basic/BasicComboPopup
+javax/swing/plaf/basic/ComboPopup
+javax/swing/plaf/basic/BasicComboPopup$EmptyListModelClass
+javax/swing/plaf/basic/BasicLookAndFeel$AWTEventHelper
+java/awt/event/AWTEventListenerProxy
+java/awt/Toolkit$SelectiveAWTEventListener
+java/awt/Toolkit$ToolkitEventMulticaster
+javax/swing/plaf/basic/BasicLookAndFeel$1
+javax/swing/plaf/basic/DefaultMenuLayout
+javax/swing/plaf/metal/MetalBorders$PopupMenuBorder
+javax/swing/plaf/basic/BasicPopupMenuUI$BasicPopupMenuListener
+javax/swing/event/PopupMenuListener
+javax/swing/plaf/basic/BasicPopupMenuUI$BasicMenuKeyListener
+javax/swing/event/MenuKeyListener
+javax/swing/plaf/basic/BasicPopupMenuUI$MouseGrabber
+javax/swing/MenuSelectionManager
+javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper
+javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper$1
+java/awt/event/FocusAdapter
+javax/swing/plaf/basic/BasicComboPopup$1
+javax/swing/JList
+javax/swing/DefaultListSelectionModel
+javax/swing/ListSelectionModel
+javax/swing/plaf/basic/BasicListUI
+javax/swing/plaf/ListUI
+javax/swing/plaf/basic/BasicListUI$ListTransferHandler
+javax/swing/DefaultListCellRenderer$UIResource
+javax/swing/DefaultListCellRenderer
+javax/swing/ListCellRenderer
+javax/swing/plaf/basic/BasicListUI$Handler
+javax/swing/event/ListSelectionListener
+javax/swing/JMenu
+javax/swing/JMenuItem
+javax/swing/event/ListSelectionEvent
+javax/swing/plaf/basic/BasicComboPopup$Handler
+javax/swing/ScrollPaneLayout$UIResource
+javax/swing/ScrollPaneLayout
+javax/swing/ViewportLayout
+javax/swing/plaf/basic/BasicViewportUI
+javax/swing/plaf/ViewportUI
+javax/swing/JScrollPane$ScrollBar
+javax/swing/JScrollBar
+java/awt/Adjustable
+javax/swing/JScrollBar$ModelListener
+javax/swing/plaf/metal/MetalScrollBarUI
+javax/swing/plaf/basic/BasicScrollBarUI
+javax/swing/plaf/ScrollBarUI
+javax/swing/plaf/metal/MetalBumps
+javax/swing/plaf/basic/BasicScrollBarUI$TrackListener
+javax/swing/plaf/basic/BasicScrollBarUI$ArrowButtonListener
+javax/swing/plaf/basic/BasicScrollBarUI$ModelListener
+javax/swing/plaf/metal/MetalScrollBarUI$ScrollBarListener
+javax/swing/plaf/basic/BasicScrollBarUI$PropertyChangeHandler
+javax/swing/plaf/basic/BasicScrollBarUI$Handler
+javax/swing/plaf/basic/BasicScrollBarUI$ScrollListener
+javax/swing/JViewport$ViewListener
+javax/swing/plaf/metal/MetalScrollPaneUI
+javax/swing/plaf/basic/BasicScrollPaneUI
+javax/swing/plaf/ScrollPaneUI
+javax/swing/plaf/metal/MetalBorders$ScrollPaneBorder
+javax/swing/plaf/basic/BasicScrollPaneUI$Handler
+javax/swing/plaf/metal/MetalScrollPaneUI$1
+javax/swing/plaf/basic/BasicComboBoxRenderer$UIResource
+javax/swing/plaf/basic/BasicComboBoxRenderer
+javax/swing/plaf/metal/MetalComboBoxEditor$UIResource
+javax/swing/plaf/metal/MetalComboBoxEditor
+javax/swing/plaf/basic/BasicComboBoxEditor
+javax/swing/ComboBoxEditor
+javax/swing/plaf/basic/BasicComboBoxEditor$BorderlessTextField
+javax/swing/plaf/basic/BasicComboBoxEditor$UIResource
+javax/swing/text/Segment
+java/text/CharacterIterator
+javax/swing/plaf/metal/MetalComboBoxEditor$1
+javax/swing/plaf/metal/MetalComboBoxEditor$EditorBorder
+javax/swing/JToolBar
+javax/swing/plaf/metal/MetalComboBoxUI$MetalPropertyChangeListener
+javax/swing/plaf/basic/BasicComboBoxUI$PropertyChangeHandler
+javax/swing/plaf/basic/BasicComboBoxUI$Handler
+javax/swing/plaf/metal/MetalComboBoxIcon
+javax/swing/plaf/metal/MetalComboBoxButton$1
+javax/swing/plaf/basic/BasicComboBoxUI$DefaultKeySelectionManager
+javax/swing/JComboBox$KeySelectionManager
+javax/swing/plaf/metal/MetalCheckBoxUI
+javax/swing/plaf/metal/MetalIconFactory$CheckBoxIcon
+java/lang/ExceptionInInitializerError
+com/sun/java/swing/plaf/windows/WindowsTabbedPaneUI
+javax/swing/JProgressBar
+javax/swing/JProgressBar$ModelListener
+javax/swing/plaf/metal/MetalProgressBarUI
+javax/swing/plaf/basic/BasicProgressBarUI
+javax/swing/plaf/ProgressBarUI
+javax/swing/plaf/BorderUIResource$LineBorderUIResource
+javax/swing/plaf/basic/BasicProgressBarUI$Handler
+javax/swing/JTable
+javax/swing/event/TableModelListener
+javax/swing/event/TableColumnModelListener
+javax/swing/event/CellEditorListener
+javax/swing/event/RowSorterListener
+javax/swing/tree/TreeModel
+javax/swing/table/TableCellRenderer
+javax/swing/table/JTableHeader
+javax/swing/event/TreeExpansionListener
+javax/swing/table/AbstractTableModel
+javax/swing/table/TableModel
+javax/swing/table/DefaultTableCellRenderer
+javax/swing/JCheckBoxMenuItem
+javax/swing/JTree
+javax/swing/tree/TreeSelectionModel
+javax/swing/tree/DefaultTreeCellRenderer
+javax/swing/tree/TreeCellRenderer
+javax/swing/table/TableCellEditor
+javax/swing/CellEditor
+javax/swing/JToolTip
+javax/swing/table/TableColumn
+javax/swing/table/DefaultTableColumnModel
+javax/swing/table/TableColumnModel
+javax/swing/table/DefaultTableModel
+javax/swing/event/TableModelEvent
+sun/swing/table/DefaultTableCellHeaderRenderer
+sun/swing/table/DefaultTableCellHeaderRenderer$EmptyIcon
+javax/swing/plaf/basic/BasicTableHeaderUI
+javax/swing/plaf/TableHeaderUI
+javax/swing/plaf/basic/BasicTableHeaderUI$1
+javax/swing/plaf/basic/BasicTableHeaderUI$MouseInputHandler
+javax/swing/DefaultCellEditor
+javax/swing/tree/TreeCellEditor
+javax/swing/AbstractCellEditor
+javax/swing/plaf/basic/BasicTableUI
+javax/swing/plaf/TableUI
+javax/swing/plaf/basic/BasicTableUI$TableTransferHandler
+javax/swing/plaf/basic/BasicTableUI$Handler
+javax/swing/tree/DefaultTreeSelectionModel
+javax/swing/tree/TreePath
+javax/swing/plaf/metal/MetalTreeUI
+javax/swing/plaf/basic/BasicTreeUI
+javax/swing/plaf/TreeUI
+javax/swing/plaf/basic/BasicTreeUI$Actions
+javax/swing/plaf/basic/BasicTreeUI$TreeTransferHandler
+javax/swing/plaf/metal/MetalTreeUI$LineListener
+javax/swing/plaf/basic/BasicTreeUI$Handler
+javax/swing/event/TreeModelListener
+javax/swing/event/TreeSelectionListener
+javax/swing/event/SwingPropertyChangeSupport
+javax/swing/tree/VariableHeightLayoutCache
+javax/swing/tree/AbstractLayoutCache
+javax/swing/tree/RowMapper
+javax/swing/plaf/basic/BasicTreeUI$NodeDimensionsHandler
+javax/swing/tree/AbstractLayoutCache$NodeDimensions
+javax/swing/JTree$TreeModelHandler
+javax/swing/tree/VariableHeightLayoutCache$TreeStateNode
+javax/swing/tree/DefaultMutableTreeNode
+javax/swing/tree/MutableTreeNode
+javax/swing/tree/DefaultMutableTreeNode$PreorderEnumeration
+java/util/Vector$1
+javax/swing/event/TableColumnModelEvent
+javax/swing/JPopupMenu$Separator
+javax/swing/JSeparator
+java/text/ParseException
+java/text/NumberFormat$Field
+javax/swing/text/GapContent$InsertUndo
+javax/swing/undo/AbstractUndoableEdit
+javax/swing/undo/UndoableEdit
+javax/swing/text/AbstractDocument$DefaultDocumentEvent
+javax/swing/event/DocumentEvent
+javax/swing/undo/CompoundEdit
+javax/swing/event/DocumentEvent$EventType
+javax/swing/text/Utilities
+javax/swing/text/SegmentCache
+javax/swing/text/SegmentCache$CachedSegment
+javax/swing/event/DocumentEvent$ElementChange
+javax/swing/event/UndoableEditEvent
+javax/swing/event/UndoableEditListener
+java/awt/Canvas
+java/util/Locale$Category
+java/util/Locale$1
+javax/swing/filechooser/FileFilter
+java/io/FileWriter
+javax/swing/tree/DefaultTreeModel
+javax/swing/tree/DefaultTreeCellEditor
+javax/swing/tree/DefaultTreeCellEditor$1
+javax/swing/tree/DefaultTreeCellEditor$DefaultTextField
+javax/swing/DefaultCellEditor$1
+javax/swing/DefaultCellEditor$EditorDelegate
+javax/swing/tree/DefaultTreeCellEditor$EditorContainer
+javax/swing/JTree$TreeSelectionRedirector
+javax/swing/JMenuItem$MenuItemFocusListener
+javax/swing/plaf/basic/BasicMenuItemUI
+javax/swing/plaf/MenuItemUI
+javax/swing/plaf/metal/MetalBorders$MenuItemBorder
+javax/swing/plaf/metal/MetalIconFactory$MenuItemArrowIcon
+sun/swing/MenuItemLayoutHelper
+javax/swing/plaf/basic/BasicMenuItemUI$Handler
+javax/swing/event/MenuDragMouseListener
+javax/swing/event/TreeModelEvent
+javax/swing/JSplitPane
+javax/swing/plaf/metal/MetalSplitPaneUI
+javax/swing/plaf/basic/BasicSplitPaneUI
+javax/swing/plaf/SplitPaneUI
+javax/swing/plaf/basic/BasicSplitPaneDivider
+javax/swing/plaf/basic/BasicBorders$SplitPaneBorder
+javax/swing/plaf/metal/MetalSplitPaneDivider
+javax/swing/plaf/basic/BasicSplitPaneDivider$DividerLayout
+javax/swing/plaf/basic/BasicSplitPaneDivider$MouseHandler
+javax/swing/plaf/basic/BasicBorders$SplitPaneDividerBorder
+javax/swing/plaf/basic/BasicSplitPaneUI$BasicHorizontalLayoutManager
+javax/swing/plaf/basic/BasicSplitPaneUI$1
+javax/swing/plaf/basic/BasicSplitPaneUI$Handler
+javax/swing/plaf/metal/MetalSplitPaneDivider$1
+javax/swing/plaf/basic/BasicSplitPaneDivider$OneTouchActionHandler
+javax/swing/plaf/metal/MetalSplitPaneDivider$2
+javax/swing/border/TitledBorder
+javax/swing/plaf/basic/BasicTextAreaUI
+javax/swing/text/AbstractDocument$ElementEdit
+java/util/Random
+java/util/concurrent/atomic/AtomicLong
+java/net/NoRouteToHostException
+java/net/BindException
+javax/swing/tree/PathPlaceHolder
+javax/swing/event/TreeSelectionEvent
+javax/swing/JList$3
+javax/swing/JList$ListSelectionHandler
+javax/swing/JSlider
+javax/swing/JSlider$ModelListener
+javax/swing/plaf/metal/MetalSliderUI
+javax/swing/plaf/basic/BasicSliderUI
+javax/swing/plaf/SliderUI
+javax/swing/plaf/basic/BasicSliderUI$Actions
+javax/swing/plaf/metal/MetalIconFactory$HorizontalSliderThumbIcon
+javax/swing/plaf/metal/MetalIconFactory$VerticalSliderThumbIcon
+javax/swing/plaf/basic/BasicSliderUI$TrackListener
+javax/swing/plaf/basic/BasicSliderUI$Handler
+javax/swing/plaf/basic/BasicSliderUI$ScrollListener
+javax/swing/plaf/metal/MetalSliderUI$MetalPropertyListener
+javax/swing/plaf/basic/BasicSliderUI$PropertyChangeHandler
+sun/font/SunFontManager$FamilyDescription
+java/util/concurrent/ConcurrentHashMap$KeyIterator
+java/util/concurrent/ConcurrentHashMap$BaseIterator
+java/util/concurrent/ConcurrentHashMap$Traverser
+sun/font/SunFontManager$10
+sun/font/SunFontManager$11
+java/util/concurrent/ConcurrentHashMap$ValueIterator
+java/lang/CharacterData00
+javax/swing/DefaultListModel
+javax/swing/event/ListDataEvent
+javax/sound/sampled/DataLine
+javax/sound/sampled/Line
+javax/sound/sampled/Line$Info
+javax/sound/sampled/DataLine$Info
+javax/sound/sampled/Control$Type
+javax/sound/sampled/FloatControl$Type
+javax/sound/sampled/LineUnavailableException
+javax/sound/sampled/UnsupportedAudioFileException
+javax/swing/JMenuBar
+javax/swing/plaf/basic/BasicMenuBarUI
+javax/swing/plaf/MenuBarUI
+javax/swing/plaf/metal/MetalBorders$MenuBarBorder
+javax/swing/plaf/basic/BasicMenuBarUI$Handler
+javax/swing/KeyboardManager
+javax/swing/JRadioButtonMenuItem
+javax/swing/JMenu$MenuChangeListener
+javax/swing/plaf/basic/BasicMenuUI
+javax/swing/plaf/metal/MetalIconFactory$MenuArrowIcon
+javax/swing/plaf/basic/BasicMenuUI$Handler
+javax/swing/JMenuItem$AccessibleJMenuItem
+javax/swing/AbstractButton$AccessibleAbstractButton
+javax/accessibility/AccessibleAction
+javax/accessibility/AccessibleValue
+javax/accessibility/AccessibleText
+javax/accessibility/AccessibleExtendedComponent
+javax/accessibility/AccessibleComponent
+javax/swing/JComponent$AccessibleJComponent
+java/awt/Container$AccessibleAWTContainer
+java/awt/Component$AccessibleAWTComponent
+javax/accessibility/AccessibleContext$1
+sun/awt/AWTAccessor$AccessibleContextAccessor
+javax/accessibility/AccessibleRelationSet
+javax/swing/JMenu$WinListener
+java/awt/event/WindowAdapter
+javax/swing/plaf/metal/MetalPopupMenuSeparatorUI
+javax/swing/plaf/metal/MetalSeparatorUI
+javax/swing/plaf/basic/BasicSeparatorUI
+javax/swing/plaf/SeparatorUI
+javax/accessibility/AccessibleState
+javax/accessibility/AccessibleBundle
+javax/swing/plaf/basic/BasicCheckBoxMenuItemUI
+javax/swing/plaf/metal/MetalIconFactory$CheckBoxMenuItemIcon
+javax/swing/JCheckBoxMenuItem$AccessibleJCheckBoxMenuItem
+javax/swing/plaf/basic/BasicRadioButtonMenuItemUI
+javax/swing/plaf/metal/MetalIconFactory$RadioButtonMenuItemIcon
+java/awt/event/ContainerEvent
+sun/awt/image/ImageDecoder$1
+java/awt/im/InputContext
+sun/awt/im/InputMethodContext
+java/awt/im/spi/InputMethodContext
+java/awt/im/InputMethodRequests
+sun/awt/im/InputContext
+sun/awt/windows/WInputMethod
+sun/awt/im/InputMethodAdapter
+java/awt/im/spi/InputMethod
+sun/util/locale/ParseStatus
+sun/util/locale/StringTokenIterator
+sun/util/locale/InternalLocaleBuilder
+sun/util/locale/InternalLocaleBuilder$CaseInsensitiveChar
+javax/swing/JTabbedPane$Page
+java/net/DatagramSocket
+java/net/MulticastSocket
+java/net/DatagramPacket
+java/net/DatagramPacket$1
+java/net/Inet4AddressImpl
+sun/net/InetAddressCachePolicy
+sun/net/InetAddressCachePolicy$1
+java/security/Security
+java/security/Security$1
+sun/net/InetAddressCachePolicy$2
+java/net/InetAddress$CacheEntry
+java/text/Collator
+java/net/DefaultDatagramSocketImplFactory
+sun/util/locale/provider/CollatorProviderImpl
+java/net/DefaultDatagramSocketImplFactory$1
+java/net/DualStackPlainDatagramSocketImpl
+java/util/Collections$UnmodifiableList$1
+java/net/AbstractPlainDatagramSocketImpl
+java/net/DatagramSocketImpl
+sun/text/resources/CollationData
+java/net/AbstractPlainDatagramSocketImpl$1
+java/text/RuleBasedCollator
+java/net/TwoStacksPlainDatagramSocketImpl
+java/text/RBCollationTables
+java/net/DatagramSocket$1
+java/text/RBTableBuilder
+java/net/NetworkInterface
+java/text/RBCollationTables$BuildAPI
+sun/text/IntHashtable
+sun/net/ResourceManager
+sun/text/UCompactIntArray
+sun/text/normalizer/NormalizerImpl
+sun/text/normalizer/ICUData
+java/net/NetworkInterface$1
+java/net/InterfaceAddress
+java/net/DefaultInterface
+java/net/ServerSocket
+sun/text/normalizer/NormalizerDataReader
+sun/text/normalizer/ICUBinary$Authenticate
+sun/text/normalizer/ICUBinary
+sun/text/normalizer/NormalizerImpl$FCDTrieImpl
+sun/text/normalizer/Trie$DataManipulate
+sun/text/normalizer/NormalizerImpl$NormTrieImpl
+sun/text/normalizer/NormalizerImpl$AuxTrieImpl
+sun/text/normalizer/IntTrie
+sun/text/normalizer/Trie
+sun/text/normalizer/CharTrie
+sun/text/normalizer/CharTrie$FriendAgent
+sun/text/normalizer/UnicodeSet
+sun/text/normalizer/UnicodeMatcher
+sun/text/normalizer/NormalizerImpl$DecomposeArgs
+java/text/MergeCollation
+java/text/PatternEntry$Parser
+java/text/PatternEntry
+java/text/EntryPair
+sun/text/ComposedCharIter
+sun/text/normalizer/UTF16
+sun/net/www/protocol/http/Handler
+java/security/SignatureException
+java/security/InvalidKeyException
+java/security/KeyException
+java/security/Signature
+java/security/SignatureSpi
+java/io/ObjectInputStream$BlockDataInputStream
+java/io/ObjectInputStream$PeekInputStream
+java/io/ObjectInputStream$HandleTable
+java/io/ObjectInputStream$HandleTable$HandleList
+java/io/ObjectInputStream$ValidationList
+java/io/Bits
+java/io/ObjectStreamClass
+sun/security/provider/DSAPublicKey
+java/security/interfaces/DSAPublicKey
+java/security/interfaces/DSAKey
+java/security/PublicKey
+java/security/Key
+sun/security/x509/X509Key
+java/io/ObjectStreamClass$Caches
+java/io/ObjectStreamClass$WeakClassKey
+java/io/ObjectStreamClass$EntryFuture
+java/io/ObjectOutputStream
+java/io/ObjectOutput
+java/lang/reflect/Proxy
+java/lang/reflect/InvocationHandler
+java/lang/reflect/WeakCache
+java/lang/reflect/Proxy$KeyFactory
+java/lang/reflect/Proxy$ProxyClassFactory
+java/io/Externalizable
+java/io/ObjectStreamClass$2
+sun/security/x509/AlgorithmId
+sun/security/util/DerEncoder
+sun/security/util/BitArray
+sun/reflect/SerializationConstructorAccessorImpl
+sun/reflect/UnsafeQualifiedStaticLongFieldAccessorImpl
+java/io/ObjectStreamClass$FieldReflectorKey
+sun/security/util/DerOutputStream
+java/io/ObjectStreamClass$FieldReflector
+sun/security/util/DerValue
+java/io/ObjectStreamClass$1
+java/io/DataOutputStream
+java/io/ObjectStreamClass$MemberSignature
+java/math/BigInteger
+java/io/ObjectStreamClass$3
+java/io/ObjectStreamClass$4
+java/security/interfaces/DSAParams
+java/io/ObjectStreamClass$5
+java/io/ObjectStreamClass$ClassDataSlot
+java/io/SerialCallbackContext
+java/security/MessageDigest
+java/security/MessageDigestSpi
+sun/security/util/DerInputStream
+sun/security/jca/GetInstance
+sun/security/util/DerInputBuffer
+sun/security/jca/Providers
+java/lang/InheritableThreadLocal
+sun/security/util/ObjectIdentifier
+sun/security/jca/ProviderList
+sun/security/jca/ProviderConfig
+java/security/Provider
+sun/security/jca/ProviderList$3
+sun/security/jca/ProviderList$1
+java/security/Provider$ServiceKey
+java/security/Provider$EngineDescription
+java/security/AlgorithmParameters
+java/security/AlgorithmParametersSpi
+sun/security/jca/ProviderList$2
+sun/security/jca/ProviderConfig$2
+sun/security/provider/Sun
+sun/security/provider/SunEntries
+sun/security/provider/SunEntries$1
+sun/security/provider/NativePRNG
+sun/security/provider/NativePRNG$Blocking
+sun/security/provider/NativePRNG$NonBlocking
+java/security/Provider$Service
+java/security/Provider$UString
+sun/security/provider/SHA
+sun/security/provider/DSAParameters
+sun/security/provider/DigestBase
+sun/security/jca/GetInstance$Instance
+java/security/MessageDigest$Delegate
+sun/security/util/ByteArrayLexOrder
+sun/security/util/ByteArrayTagOrder
+sun/security/provider/ByteArrayAccess
+sun/security/util/DerIndefLenConverter
+java/io/ObjectOutputStream$BlockDataOutputStream
+java/io/ObjectOutputStream$HandleTable
+java/io/ObjectOutputStream$ReplaceTable
+java/io/ObjectStreamClass$ExceptionInfo
+java/io/ObjectInputStream$GetFieldImpl
+java/io/ObjectInputStream$GetField
+java/math/BigInteger$UnsafeHolder
+sun/security/jca/ServiceId
+sun/security/jca/ProviderList$ServiceList
+sun/security/jca/ProviderList$ServiceList$1
+java/security/Signature$Delegate
+java/util/ArrayList$SubList
+java/util/ArrayList$SubList$1
+java/security/interfaces/DSAPrivateKey
+java/security/PrivateKey
+javax/security/auth/Destroyable
+sun/security/provider/DSA$SHA1withDSA
+sun/security/provider/DSA$LegacyDSA
+sun/security/provider/DSA
+java/security/spec/DSAParameterSpec
+java/security/spec/AlgorithmParameterSpec
+java/math/MutableBigInteger
+java/math/SignedMutableBigInteger
+javax/swing/TimerQueue
+java/util/concurrent/DelayQueue
+java/util/concurrent/BlockingQueue
+java/util/AbstractQueue
+java/util/PriorityQueue
+javax/swing/TimerQueue$1
+javax/swing/TimerQueue$DelayedTimer
+java/util/concurrent/Delayed
+java/util/concurrent/TimeUnit
+java/util/concurrent/TimeUnit$1
+java/util/concurrent/TimeUnit$2
+java/util/concurrent/TimeUnit$3
+java/util/concurrent/TimeUnit$4
+java/util/concurrent/TimeUnit$5
+java/util/concurrent/TimeUnit$6
+java/util/concurrent/TimeUnit$7
+java/awt/Window$1DisposeAction
+java/awt/EventQueue$1AWTInvocationLock
+java/awt/LightweightDispatcher$2
+java/awt/Component$FlipBufferStrategy
+java/lang/StrictMath
+javax/swing/JLayer
+javax/swing/JInternalFrame
+javax/swing/KeyboardManager$ComponentKeyStrokePair
+sun/swing/MenuItemLayoutHelper$RectSize
+javax/swing/JTable$2
+javax/swing/JTable$Resizable3
+javax/swing/JTable$Resizable2
+javax/swing/JTable$5
+java/awt/Label
+sun/awt/windows/WLabelPeer
+java/awt/peer/LabelPeer
+java/awt/Event
+sun/awt/PlatformFont$PlatformFontCache
+sun/nio/cs/UTF_16LE$Encoder
+sun/nio/cs/UnicodeEncoder
+sun/nio/cs/UTF_16LE$Decoder
+sun/nio/cs/Surrogate$Parser
+sun/nio/cs/Surrogate
+java/awt/KeyboardFocusManager$3
+java/net/Authenticator
+sun/awt/AppContext$PostShutdownEventRunnable
+sun/awt/AWTAutoShutdown$1
+java/net/ConnectException
+java/lang/Throwable$WrappedPrintStream
+java/lang/Throwable$PrintStreamOrWriter
+sun/awt/image/PNGImageDecoder
+sun/awt/image/PNGFilterInputStream
+sun/awt/image/OffScreenImage
+sun/util/locale/provider/TimeZoneNameUtility
+sun/util/locale/provider/TimeZoneNameProviderImpl
+sun/util/locale/provider/TimeZoneNameUtility$TimeZoneNameGetter
+sun/util/resources/TimeZoneNames
+sun/util/resources/TimeZoneNamesBundle
+sun/util/resources/en/TimeZoneNames_en
+java/io/FilterReader
+java/io/EOFException
+javax/swing/filechooser/FileSystemView
+javax/swing/filechooser/WindowsFileSystemView
+javax/swing/filechooser/FileSystemView$1
+java/util/jar/JarFile$JarEntryIterator
+java/util/zip/ZipFile$ZipEntryIterator
+java/lang/IllegalAccessError
+java/text/MessageFormat
+java/text/MessageFormat$Field
+java/util/Hashtable$ValueCollection
+javax/swing/event/CaretListener
+javax/swing/plaf/metal/MetalButtonUI
+javax/swing/plaf/metal/MetalToggleButtonUI
+javax/swing/plaf/metal/MetalBorders$ToggleButtonBorder
+javax/swing/event/MenuEvent
+javax/swing/border/MatteBorder
+sun/font/StandardGlyphVector
+java/awt/font/GlyphVector
+sun/font/StandardGlyphVector$GlyphStrike
+sun/font/CoreMetrics
+sun/font/FontLineMetrics
+java/awt/font/LineMetrics
+javax/swing/JToolBar$DefaultToolBarLayout
+javax/swing/plaf/metal/MetalToolBarUI
+javax/swing/plaf/basic/BasicToolBarUI
+javax/swing/plaf/ToolBarUI
+javax/swing/plaf/metal/MetalBorders$ToolBarBorder
+javax/swing/plaf/metal/MetalBorders$RolloverButtonBorder
+javax/swing/plaf/metal/MetalBorders$RolloverMarginBorder
+javax/swing/plaf/basic/BasicBorders$RolloverMarginBorder
+javax/swing/plaf/metal/MetalToolBarUI$MetalDockingListener
+javax/swing/plaf/basic/BasicToolBarUI$DockingListener
+javax/swing/plaf/basic/BasicToolBarUI$Handler
+javax/swing/JToolBar$Separator
+javax/swing/plaf/basic/BasicToolBarSeparatorUI
+java/awt/event/AdjustmentEvent
+java/awt/MenuBar
+# 7b979133406b8b9a
diff --git a/grid/jre/lib/cmm/CIEXYZ.pf b/grid/jre/lib/cmm/CIEXYZ.pf
new file mode 100644
index 0000000..db3ba20
--- /dev/null
+++ b/grid/jre/lib/cmm/CIEXYZ.pf
Binary files differ
diff --git a/grid/jre/lib/cmm/GRAY.pf b/grid/jre/lib/cmm/GRAY.pf
new file mode 100644
index 0000000..e31a4a7
--- /dev/null
+++ b/grid/jre/lib/cmm/GRAY.pf
Binary files differ
diff --git a/grid/jre/lib/cmm/LINEAR_RGB.pf b/grid/jre/lib/cmm/LINEAR_RGB.pf
new file mode 100644
index 0000000..eadae04
--- /dev/null
+++ b/grid/jre/lib/cmm/LINEAR_RGB.pf
Binary files differ
diff --git a/grid/jre/lib/cmm/PYCC.pf b/grid/jre/lib/cmm/PYCC.pf
new file mode 100644
index 0000000..1c49e0b
--- /dev/null
+++ b/grid/jre/lib/cmm/PYCC.pf
Binary files differ
diff --git a/grid/jre/lib/cmm/sRGB.pf b/grid/jre/lib/cmm/sRGB.pf
new file mode 100644
index 0000000..7f9d18d
--- /dev/null
+++ b/grid/jre/lib/cmm/sRGB.pf
Binary files differ
diff --git a/grid/jre/lib/content-types.properties b/grid/jre/lib/content-types.properties
new file mode 100644
index 0000000..8949352
--- /dev/null
+++ b/grid/jre/lib/content-types.properties
@@ -0,0 +1,276 @@
+#sun.net.www MIME content-types table
+#
+# Property fields:
+#
+# <description> ::= 'description' '=' <descriptive string>
+# <extensions> ::= 'file_extensions' '=' <comma-delimited list, include '.'>
+# <image> ::= 'icon' '=' <filename of icon image>
+# <action> ::= 'browser' | 'application' | 'save' | 'unknown'
+# <application> ::= 'application' '=' <command line template>
+#
+
+#
+# The "we don't know anything about this data" type(s).
+# Used internally to mark unrecognized types.
+#
+content/unknown: description=Unknown Content
+unknown/unknown: description=Unknown Data Type
+
+#
+# The template we should use for temporary files when launching an application
+# to view a document of given type.
+#
+temp.file.template: c:\\temp\\%s
+
+#
+# The "real" types.
+#
+application/octet-stream: \
+ description=Generic Binary Stream;\
+ file_extensions=.saveme,.dump,.hqx,.arc,.obj,.lib,.bin,.exe,.zip,.gz
+
+application/oda: \
+ description=ODA Document;\
+ file_extensions=.oda
+
+application/pdf: \
+ description=Adobe PDF Format;\
+ file_extensions=.pdf
+
+application/postscript: \
+ description=Postscript File;\
+ file_extensions=.eps,.ai,.ps;\
+ icon=ps
+
+application/rtf: \
+ description=Wordpad Document;\
+ file_extensions=.rtf;\
+ action=application;\
+ application=wordpad.exe %s
+
+application/x-dvi: \
+ description=TeX DVI File;\
+ file_extensions=.dvi
+
+application/x-hdf: \
+ description=Hierarchical Data Format;\
+ file_extensions=.hdf;\
+ action=save
+
+application/x-latex: \
+ description=LaTeX Source;\
+ file_extensions=.latex
+
+application/x-netcdf: \
+ description=Unidata netCDF Data Format;\
+ file_extensions=.nc,.cdf;\
+ action=save
+
+application/x-tex: \
+ description=TeX Source;\
+ file_extensions=.tex
+
+application/x-texinfo: \
+ description=Gnu Texinfo;\
+ file_extensions=.texinfo,.texi
+
+application/x-troff: \
+ description=Troff Source;\
+ file_extensions=.t,.tr,.roff
+
+application/x-troff-man: \
+ description=Troff Manpage Source;\
+ file_extensions=.man
+
+application/x-troff-me: \
+ description=Troff ME Macros;\
+ file_extensions=.me
+
+application/x-troff-ms: \
+ description=Troff MS Macros;\
+ file_extensions=.ms
+
+application/x-wais-source: \
+ description=Wais Source;\
+ file_extensions=.src,.wsrc
+
+application/zip: \
+ description=Zip File;\
+ file_extensions=.zip;\
+ icon=zip;\
+ action=save
+
+application/x-bcpio: \
+ description=Old Binary CPIO Archive;\
+ file_extensions=.bcpio;\
+ action=save
+
+application/x-cpio: \
+ description=Unix CPIO Archive;\
+ file_extensions=.cpio;\
+ action=save
+
+application/x-gtar: \
+ description=Gnu Tar Archive;\
+ file_extensions=.gtar;\
+ icon=tar;\
+ action=save
+
+application/x-shar: \
+ description=Shell Archive;\
+ file_extensions=.sh,.shar;\
+ action=save
+
+application/x-sv4cpio: \
+ description=SVR4 CPIO Archive;\
+ file_extensions=.sv4cpio;\
+ action=save
+
+application/x-sv4crc: \
+ description=SVR4 CPIO with CRC;\
+ file_extensions=.sv4crc;\
+ action=save
+
+application/x-tar: \
+ description=Tar Archive;\
+ file_extensions=.tar;\
+ icon=tar;\
+ action=save
+
+application/x-ustar: \
+ description=US Tar Archive;\
+ file_extensions=.ustar;\
+ action=save
+
+audio/basic: \
+ description=Basic Audio;\
+ file_extensions=.snd,.au;\
+ icon=audio
+
+audio/x-aiff: \
+ description=Audio Interchange Format File;\
+ file_extensions=.aifc,.aif,.aiff;\
+ icon=aiff
+
+audio/x-wav: \
+ description=Wav Audio;\
+ file_extensions=.wav;\
+ icon=wav;\
+ action=application;\
+ application=mplayer.exe %s
+
+image/gif: \
+ description=GIF Image;\
+ file_extensions=.gif;\
+ icon=gif;\
+ action=browser
+
+image/ief: \
+ description=Image Exchange Format;\
+ file_extensions=.ief
+
+image/jpeg: \
+ description=JPEG Image;\
+ file_extensions=.jfif,.jfif-tbnl,.jpe,.jpg,.jpeg;\
+ icon=jpeg;\
+ action=browser
+
+image/tiff: \
+ description=TIFF Image;\
+ file_extensions=.tif,.tiff;\
+ icon=tiff
+
+image/vnd.fpx: \
+ description=FlashPix Image;\
+ file_extensions=.fpx,.fpix
+
+image/x-cmu-rast: \
+ description=CMU Raster Image;\
+ file_extensions=.ras
+
+image/x-portable-anymap: \
+ description=PBM Anymap Image;\
+ file_extensions=.pnm
+
+image/x-portable-bitmap: \
+ description=PBM Bitmap Image;\
+ file_extensions=.pbm
+
+image/x-portable-graymap: \
+ description=PBM Graymap Image;\
+ file_extensions=.pgm
+
+image/x-portable-pixmap: \
+ description=PBM Pixmap Image;\
+ file_extensions=.ppm
+
+image/x-rgb: \
+ description=RGB Image;\
+ file_extensions=.rgb
+
+image/x-xbitmap: \
+ description=X Bitmap Image;\
+ file_extensions=.xbm,.xpm
+
+image/x-xwindowdump: \
+ description=X Window Dump Image;\
+ file_extensions=.xwd
+
+image/png: \
+ description=PNG Image;\
+ file_extensions=.png;\
+ icon=png;\
+ action=browser
+
+image/bmp: \
+ description=Bitmap Image;\
+ file_extensions=.bmp;
+
+text/html: \
+ description=HTML Document;\
+ file_extensions=.htm,.html;\
+ icon=html
+
+text/plain: \
+ description=Plain Text;\
+ file_extensions=.text,.c,.cc,.c++,.h,.pl,.txt,.java,.el;\
+ icon=text;\
+ action=browser
+
+text/tab-separated-values: \
+ description=Tab Separated Values Text;\
+ file_extensions=.tsv
+
+text/x-setext: \
+ description=Structure Enhanced Text;\
+ file_extensions=.etx
+
+video/mpeg: \
+ description=MPEG Video Clip;\
+ file_extensions=.mpg,.mpe,.mpeg;\
+ icon=mpeg
+
+video/quicktime: \
+ description=QuickTime Video Clip;\
+ file_extensions=.mov,.qt
+
+application/x-troff-msvideo: \
+ description=AVI Video;\
+ file_extensions=.avi;\
+ icon=avi;\
+ action=application;\
+ application=mplayer.exe %s
+
+video/x-sgi-movie: \
+ description=SGI Movie;\
+ file_extensions=.movie,.mv
+
+message/rfc822: \
+ description=Internet Email Message;\
+ file_extensions=.mime
+
+application/xml: \
+ description=XML document;\
+ file_extensions=.xml
+
+
diff --git a/grid/jre/lib/currency.data b/grid/jre/lib/currency.data
new file mode 100644
index 0000000..7968b48
--- /dev/null
+++ b/grid/jre/lib/currency.data
Binary files differ
diff --git a/grid/jre/lib/deploy.jar b/grid/jre/lib/deploy.jar
new file mode 100644
index 0000000..248455c
--- /dev/null
+++ b/grid/jre/lib/deploy.jar
Binary files differ
diff --git a/grid/jre/lib/deploy/ffjcext.zip b/grid/jre/lib/deploy/ffjcext.zip
new file mode 100644
index 0000000..916b294
--- /dev/null
+++ b/grid/jre/lib/deploy/ffjcext.zip
Binary files differ
diff --git a/grid/jre/lib/deploy/messages.properties b/grid/jre/lib/deploy/messages.properties
new file mode 100644
index 0000000..408b2a8
--- /dev/null
+++ b/grid/jre/lib/deploy/messages.properties
@@ -0,0 +1,57 @@
+#
+# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+
+error.internal.badmsg=internal error, unknown message
+error.badinst.nojre=Bad installation. No JRE found in configuration file
+error.launch.execv=Error encountered while invoking Java Web Start (execv)
+error.launch.sysexec=Error encountered while invoking Java Web Start (SysExec)
+error.listener.failed=Splash: sysCreateListenerSocket failed
+error.accept.failed=Splash: accept failed
+error.recv.failed=Splash: recv failed
+error.invalid.port=Splash: didn't revive a valid port
+error.read=Read past end of buffer
+error.xmlparsing=XML Parsing error: wrong kind of token found
+error.splash.exit=Java Web Start splash screen process exiting .....\n
+# "Last WinSock Error" means the error message for the last operation that failed.
+error.winsock=\tLast WinSock Error:
+error.winsock.load=Couldn't load winsock.dll
+error.winsock.start=WSAStartup failed
+error.badinst.nohome=Bad installation: JAVAWS_HOME not set
+error.splash.noimage=Splash: couldn't load splash screen image
+error.splash.socket=Splash: server socket failed
+error.splash.cmnd=Splash: unrecognized command
+error.splash.port=Splash: port not specified
+error.splash.send=Splash: send failed
+error.splash.timer=Splash: couldn't create shutdown timer
+error.splash.x11.open=Splash: Can't open X11 display
+error.splash.x11.connect=Splash: X11 connection failed
+# Javaws usage: '\' is a joining of two sentence,which are connected including
+# the invisible character '\n'.
+message.javaws.usage=\n\
+Usage:\tjavaws [run-options] <jnlp-file> \n\
+ \tjavaws [control-options] \n\
+ \n\
+where run-options include: \n\
+ -verbose \tdisplay additional output \n\
+ -offline \trun the application in offline mode \n\
+ -system \trun the application from the system cache only\n\
+ -Xnosplash \trun without showing a splash screen \n\
+ -J<option> \tsupply option to the vm \n\
+ -wait \tstart java process and wait for its exit \n\
+ \n\
+control-options include: \n\
+ -viewer \tshow the cache viewer in the java control panel\n\
+ -clearcache \tremove all non-installed applications from the cache\n\
+ -uninstall \tremove all applications from the cache\n\
+ -uninstall <jnlp-file> \tremove the application from the cache \n\
+ -import [import-options] <jnlp-file>\timport the application to the cache \n\
+ \n\
+import-options include: \n\
+ -silent \timport silently (with no user interface) \n\
+ -system \timport application into the system cache \n\
+ -codebase <url>\tretrieve resources from the given codebase \n\
+ -shortcut \tinstall shortcuts as if user allowed prompt \n\
+ -association \tinstall associations as if user allowed prompt \n\
+\n
diff --git a/grid/jre/lib/deploy/messages_de.properties b/grid/jre/lib/deploy/messages_de.properties
new file mode 100644
index 0000000..083426b
--- /dev/null
+++ b/grid/jre/lib/deploy/messages_de.properties
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+
+error.internal.badmsg=interner Fehler, unbekannte Meldung
+error.badinst.nojre=Ung\u00FCltige Installation. Keine JRE in Konfigurationsdatei gefunden
+error.launch.execv=Fehler beim Aufrufen von Java Web Start (execv) aufgetreten
+error.launch.sysexec=Fehler beim Aufrufen von Java Web Start (SysExec) aufgetreten
+error.listener.failed=Startbildschirm: sysCreateListenerSocket nicht erfolgreich
+error.accept.failed=Startbildschirm: accept nicht erfolgreich
+error.recv.failed=Startbildschirm: recv nicht erfolgreich
+error.invalid.port=Startbildschirm: Reaktivierung eines g\u00FCltigen Ports nicht m\u00F6glich
+error.read=\u00DCber Pufferende hinaus gelesen
+error.xmlparsing=XML-Parsefehler: Falscher Tokentyp gefunden
+error.splash.exit=Prozess f\u00FCr Startbildschirm von Java Web Start wird beendet.....\n
+# "Last WinSock Error" means the error message for the last operation that failed.
+error.winsock=\tLetzter WinSock-Fehler:
+error.winsock.load=winsock.dll konnte nicht geladen werden
+error.winsock.start=WSAStartup nicht erfolgreich
+error.badinst.nohome=Ung\u00FCltige Installation: JAVAWS_HOME nicht festgelegt
+error.splash.noimage=Startbildschirm: Startbildschirmbild konnte nicht geladen werden
+error.splash.socket=Startbildschirm: Server-Socket nicht erfolgreich
+error.splash.cmnd=Startbildschirm: Unbekannter Befehl
+error.splash.port=Startbildschirm: Port nicht angegeben
+error.splash.send=Startbildschirm: send nicht erfolgreich
+error.splash.timer=Startbildschirm: Timer f\u00FCr das Herunterfahren konnte nicht erstellt werden
+error.splash.x11.open=Startbildschirm: X11-Anzeige kann nicht ge\u00F6ffnet werden
+error.splash.x11.connect=Startbildschirm: X11-Verbindung nicht erfolgreich
+# Javaws usage: '\' is a joining of two sentence,which are connected including
+# the invisible character '\n'.
+message.javaws.usage=\nVerwendung:\tjavaws [run-options] <jnlp-file>\t\n\tjavaws [control-options]\t\t\n\nwobei run-options Folgendes umfasst:\t\t\t\n-verbose \tZus\u00E4tzliche Ausgabe anzeigen\t\n-offline \tAnwendung im Offlinemodus ausf\u00FChren\t\n-system \tAnwendung nur aus Systemcache ausf\u00FChren\n-Xnosplash \tOhne Anzeige eines Startbildschirms ausf\u00FChren\t\n-J<option> \tOption f\u00FCr VM angeben\t\n-wait \tJava-Prozess starten und auf dessen Beendigung warten\t\n\ncontrol-options umfassen:\t\n-viewer \tCache-Viewer in Java-Systemsteuerung anzeigen\n-clearcache \tAlle nicht installierten Anwendungen aus dem Cache entfernen\n-uninstall \tAlle Anwendungen aus dem Cache entfernen\n-uninstall <jnlp-file> \tAnwendung aus dem Cache entfernen\t\n-import [import-options] <jnlp-file>\tAnwendung in Cache importieren\t\t\n\nimport-options umfassen:\t\t\t\t\t\t\n-silent \tVollautomatisch importieren (ohne Benutzeroberfl\u00E4che)\t\n-system \tAnwendung in Systemcache importieren\t\n-codebase <url>\tRessourcen aus angegebener Codebase abrufen\t\n-shortcut \tShortcuts so installieren, als w\u00FCrde der Benutzer einen Prompt zulassen\t\n-association \tVerkn\u00FCpfungen so installieren, als w\u00FCrde der Benutzer einen Prompt zulassen\n\n
diff --git a/grid/jre/lib/deploy/messages_es.properties b/grid/jre/lib/deploy/messages_es.properties
new file mode 100644
index 0000000..32eceab
--- /dev/null
+++ b/grid/jre/lib/deploy/messages_es.properties
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+
+error.internal.badmsg=Error interno, mensaje desconocido
+error.badinst.nojre=Instalaci\u00F3n incorrecta. No se ha encontrado JRE en el archivo de configuraci\u00F3n
+error.launch.execv=Se ha encontrado un error al llamar a Java Web Start (execv)
+error.launch.sysexec=Se ha encontrado un error al llamar a Java Web Start (SysExec)
+error.listener.failed=Pantalla de Presentaci\u00F3n: fallo de sysCreateListenerSocket
+error.accept.failed=Pantalla de Presentaci\u00F3n: fallo de accept
+error.recv.failed=Pantalla de Presentaci\u00F3n: fallo de recv
+error.invalid.port=Pantalla de Presentaci\u00F3n: no se ha activado un puerto v\u00E1lido
+error.read=Lectura m\u00E1s all\u00E1 del final del buffer
+error.xmlparsing=Error de an\u00E1lisis de XML: se ha encontrado un tipo de token no v\u00E1lido
+error.splash.exit=Saliendo del proceso de la pantalla de presentaci\u00F3n de Java Web Start...\n
+# "Last WinSock Error" means the error message for the last operation that failed.
+error.winsock=\t\u00DAltimo Error de WinSock:
+error.winsock.load=No se ha podido cargar winsock.dll
+error.winsock.start=Fallo de WSAStartup
+error.badinst.nohome=Instalaci\u00F3n incorrecta: JAVAWS_HOME no definido
+error.splash.noimage=Presentaci\u00F3n: no se ha podido cargar la imagen de la pantalla de presentaci\u00F3n
+error.splash.socket=Pantalla de Presentaci\u00F3n: fallo en el socket del servidor
+error.splash.cmnd=Pantalla de Presentaci\u00F3n: comando no reconocido
+error.splash.port=Pantalla de Presentaci\u00F3n: puerto no especificado
+error.splash.send=Pantalla de Presentaci\u00F3n: fallo de send
+error.splash.timer=Pantalla de Presentaci\u00F3n: no se ha podido crear el temporizador de apagado
+error.splash.x11.open=Pantalla de Presentaci\u00F3n: no se ha podido abrir la pantalla X11
+error.splash.x11.connect=Pantalla de Presentaci\u00F3n: fallo de conexi\u00F3n X11
+# Javaws usage: '\' is a joining of two sentence,which are connected including
+# the invisible character '\n'.
+message.javaws.usage=\nSintaxis:\tjavaws [run-options] <archivo-jnlp>\t\n\tjavaws [control-options]\t\t\n\ndonde run-options incluye:\t\t\t\n-verbose \tmostrar salida adicional\t\n-offline \tejecutar la aplicaci\u00F3n en el modo fuera de l\u00EDnea\t\n-system \tejecutar la aplicaci\u00F3n \u00FAnicamente desde la cach\u00E9 del sistema\n-Xnosplash \tejecutar sin mostrar ninguna pantalla de presentaci\u00F3n\t\n-J<opci\u00F3n> \tproporcione una opci\u00F3n a la VM\t\n-wait \tiniciar un proceso java y esperar a que se cierre\t\n\ncontrol-options incluye:\t\n-viewer \tmostrar el visor de la cach\u00E9 en el panel de control java\n-clearcache \teliminar todas las aplicaciones no instaladas desde la cach\u00E9\n-uninstall \teliminar todas las aplicaciones de la cach\u00E9\n-uninstall <archivo-jnlp> \teliminar la aplicaci\u00F3n de la cach\u00E9\t\n-import [import-options] <archivo-jnlp>\timportar la aplicaci\u00F3n a la cach\u00E9\t\t\n\nimport-options incluye:\t\t\t\t\t\t\n-silent \timportar de forma silenciosa (sin interfaz de usuario)\t\n-system \timportar la aplicaci\u00F3n a la cach\u00E9 del sistema\t\n-codebase <url>\trecuperar los recursos del codebase correspondiente\t\n-shortcut \tinstalar los accesos directos como si el usuario hubiera aceptado la petici\u00F3n\t\n-association \tinstalar las asociaciones como si el usuario hubiera aceptado la petici\u00F3n\t\n\n
diff --git a/grid/jre/lib/deploy/messages_fr.properties b/grid/jre/lib/deploy/messages_fr.properties
new file mode 100644
index 0000000..090eb76
--- /dev/null
+++ b/grid/jre/lib/deploy/messages_fr.properties
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+
+error.internal.badmsg=erreur interne, message inconnu
+error.badinst.nojre=Installation incorrecte. JRE introuvable dans le fichier de configuration
+error.launch.execv=Erreur lors de l'appel de Java Web Start (execv)
+error.launch.sysexec=Erreur lors de l'appel de Java Web Start (SysExec)
+error.listener.failed=Accueil : \u00E9chec de sysCreateListenerSocket
+error.accept.failed=Accueil : \u00E9chec d'accept
+error.recv.failed=Accueil : \u00E9chec de recv
+error.invalid.port=Accueil : impossible de r\u00E9activer un port valide
+error.read=Lecture apr\u00E8s la fin de tampon
+error.xmlparsing=Erreur d'analyse XML : type incorrect de jeton
+error.splash.exit=Le processus d'affichage de l'\u00E9cran d'accueil de Java Web Start est en cours de fermeture...\n
+# "Last WinSock Error" means the error message for the last operation that failed.
+error.winsock=\tDerni\u00E8re erreur WinSock :
+error.winsock.load=Impossible de charger winsock.dll
+error.winsock.start=Echec de WSAStartup
+error.badinst.nohome=Installation incorrecte : JAVAWS_HOME non d\u00E9fini
+error.splash.noimage=Accueil : impossible de charger l'image de l'\u00E9cran d'accueil
+error.splash.socket=Accueil : \u00E9chec du socket de serveur
+error.splash.cmnd=Accueil : commande inconnue
+error.splash.port=Accueil : port non sp\u00E9cifi\u00E9
+error.splash.send=Accueil : \u00E9chec de l'envoi
+error.splash.timer=Accueil : impossible de cr\u00E9er l'horloge d'arr\u00EAt
+error.splash.x11.open=Accueil : impossible d'ouvrir l'affichage X11
+error.splash.x11.connect=Accueil : \u00E9chec de la connexion X11
+# Javaws usage: '\' is a joining of two sentence,which are connected including
+# the invisible character '\n'.
+message.javaws.usage=\nSyntaxe :\tjavaws [run-options] <jnlp-file>\t\n\tjavaws [control-options]\t\t\n\no\u00F9 les options d'ex\u00E9cution sont :\t\t\t\n-verbose \taffichage de texte de sortie suppl\u00E9mentaire\t\n-offline \tex\u00E9cution de l'application en mode hors ligne\t\n-system \tex\u00E9cution de l'application \u00E0 partir du cache syst\u00E8me uniquement\n-Xnosplash \tex\u00E9cution sans affichage de l'\u00E9cran d'accueil\t\n-J<option> \tsp\u00E9cification d'une option \u00E0 la machine virtuelle\t\n-wait \tlancement du processus Java et attente de sa fermeture\t\n\nles options de contr\u00F4le sont :\t\n-viewer \taffichage du visionneur du cache dans le panneau de configuration Java\n-clearcache \tsuppression de toutes les applications non install\u00E9es du cache\n-uninstall \tsuppression de toutes les applications du cache\n-uninstall <jnlp-file> \td\u00E9sinstallation de l'application dans le cache\t\n-import [import-options] <jnlp-file>\timport de l'application dans le cache\t\t\n\nles options d'import sont :\t\t\t\t\t\t\n-silent \timport silencieux (sans interface utilisateur)\t\n-system \timport de l'application dans le cache syst\u00E8me\t\n-codebase <url>\textraction des ressources \u00E0 partir d'une base de code sp\u00E9cifique\t\n-shortcut \tinstallation des raccourcis comme si l'utilisateur avait autoris\u00E9 l'op\u00E9ration\t\n-association \tinstallation des associations comme si l'utilisateur avait autoris\u00E9 l'op\u00E9ration\t\n\n
diff --git a/grid/jre/lib/deploy/messages_it.properties b/grid/jre/lib/deploy/messages_it.properties
new file mode 100644
index 0000000..b717ec1
--- /dev/null
+++ b/grid/jre/lib/deploy/messages_it.properties
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+
+error.internal.badmsg=errore interno, messaggio sconosciuto
+error.badinst.nojre=Installazione errata. Impossibile trovare il JRE nel file di configurazione
+error.launch.execv=Errore durante la chiamata di Java Web Start (execv)
+error.launch.sysexec=Errore durante la chiamata di Java Web Start (SysExec)
+error.listener.failed=Apertura: sysCreateListenerSocket non riuscito
+error.accept.failed=Apertura: accept non riuscito
+error.recv.failed=Apertura: recv non riuscito
+error.invalid.port=Apertura: impossibile identificare una porta valida
+error.read=Tentativo di lettura dopo la fine del buffer
+error.xmlparsing=Errore durante l'analisi XML: trovato un tipo di token errato
+error.splash.exit=Uscita dal processo di schermata iniziale di Java Web Start in corso...\n
+# "Last WinSock Error" means the error message for the last operation that failed.
+error.winsock=\tErrore ultima operazione WinSock:
+error.winsock.load=Impossibile caricare winsock.dll
+error.winsock.start=WSAStartup non riuscito
+error.badinst.nohome=Installazione errata: JAVAWS_HOME non impostato
+error.splash.noimage=Apertura: impossibile caricare l'immagine della schermata iniziale
+error.splash.socket=Apertura: socket del server non riuscita
+error.splash.cmnd=Apertura: comando non riconosciuto
+error.splash.port=Apertura: porta non specificata
+error.splash.send=Apertura: send non riuscito
+error.splash.timer=Apertura: impossibile creare il timer per l'arresto
+error.splash.x11.open=Apertura: impossibile aprire il display X11
+error.splash.x11.connect=Apertura: connessione X11 non riuscita
+# Javaws usage: '\' is a joining of two sentence,which are connected including
+# the invisible character '\n'.
+message.javaws.usage=\nUso:\tjavaws [opzioni di esecuzione] <file jnlp>\t\n\tjavaws [opzioni di controllo]\t\t\n\ndove le opzioni di esecuzione sono:\t\t\t\n-verbose \tvisualizza output aggiuntivo\t\n-offline \tesegue l'applicazione in modalit\u00E0 non in linea\t\n-system \tesegue l'applicazione solo dalla cache del sistema\n-Xnosplash \tesegue l'applicazione senza visualizzare la schermata iniziale\t\n-J<opzione> \tfornisce l'opzione alla VM\t\n-wait \tavvia il processo Java e ne attende il completamento\t\n\nle opzioni di controllo sono:\t\n-viewer \tmostra il visualizzatore cache nel pannello di controllo Java\n-clearcache \trimuove tutte le applicazioni non installate dalla cache\n-uninstall \trimuove tutte le applicazioni dalla cache\n-uninstall <file jnlp> \trimuove l'applicazione dalla cache\t\n-import [opzioni di importazione] <file jnlp>\timporta l'applicazione nella cache\t\t\n\nle opzioni di importazione sono:\t\t\t\t\t\t\n-silent \tesegue l'installazione in background (senza un'interfaccia utente)\t\n-system \timporta l'applicazione nella cache del sistema\t\n-codebase <url>\trecupera le risorse dal codebase specificato\t\n-shortcut \tinstalla i collegamenti senza chiedere conferma all'utente\t\n-association \tinstalla le associazioni senza chiedere conferma all'utente\t\n\n
diff --git a/grid/jre/lib/deploy/messages_ja.properties b/grid/jre/lib/deploy/messages_ja.properties
new file mode 100644
index 0000000..5213836
--- /dev/null
+++ b/grid/jre/lib/deploy/messages_ja.properties
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+
+error.internal.badmsg=\u5185\u90E8\u30A8\u30E9\u30FC\u3001\u4E0D\u660E\u306A\u30E1\u30C3\u30BB\u30FC\u30B8
+error.badinst.nojre=\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u304C\u6B63\u3057\u304F\u3042\u308A\u307E\u305B\u3093\u3002\u69CB\u6210\u30D5\u30A1\u30A4\u30EB\u5185\u306BJRE\u304C\u3042\u308A\u307E\u305B\u3093
+error.launch.execv=Java Web Start\u306E\u547C\u51FA\u3057\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F(execv)
+error.launch.sysexec=Java Web Start\u306E\u547C\u51FA\u3057\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F(SysExec)
+error.listener.failed=\u30B9\u30D7\u30E9\u30C3\u30B7\u30E5: sysCreateListenerSocket\u306B\u5931\u6557\u3057\u307E\u3057\u305F
+error.accept.failed=\u30B9\u30D7\u30E9\u30C3\u30B7\u30E5: accept\u306B\u5931\u6557\u3057\u307E\u3057\u305F
+error.recv.failed=\u30B9\u30D7\u30E9\u30C3\u30B7\u30E5: recv\u306B\u5931\u6557\u3057\u307E\u3057\u305F
+error.invalid.port=\u30B9\u30D7\u30E9\u30C3\u30B7\u30E5: \u6709\u52B9\u306A\u30DD\u30FC\u30C8\u3092\u5FA9\u6D3B\u3055\u305B\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F
+error.read=\u524D\u306E\u30D0\u30C3\u30D5\u30A1\u306E\u7D42\u308F\u308A\u3092\u8AAD\u307F\u8FBC\u307F\u307E\u3057\u305F
+error.xmlparsing=XML\u89E3\u6790\u30A8\u30E9\u30FC: \u8AA4\u3063\u305F\u30C8\u30FC\u30AF\u30F3\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F
+error.splash.exit=Java Web Start\u30B9\u30D7\u30E9\u30C3\u30B7\u30E5\u753B\u9762\u51E6\u7406\u3092\u7D42\u4E86\u3057\u307E\u3059.....\n
+# "Last WinSock Error" means the error message for the last operation that failed.
+error.winsock=\t\u6700\u5F8C\u306EWinSock\u30A8\u30E9\u30FC:
+error.winsock.load=winsock.dll\u3092\u30ED\u30FC\u30C9\u3067\u304D\u307E\u305B\u3093
+error.winsock.start=WSAStartup\u306B\u5931\u6557\u3057\u307E\u3057\u305F
+error.badinst.nohome=\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u304C\u6B63\u3057\u304F\u3042\u308A\u307E\u305B\u3093: JAVAWS_HOME\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093
+error.splash.noimage=\u30B9\u30D7\u30E9\u30C3\u30B7\u30E5: \u30B9\u30D7\u30E9\u30C3\u30B7\u30E5\u753B\u9762\u306E\u753B\u50CF\u3092\u30ED\u30FC\u30C9\u3067\u304D\u307E\u305B\u3093
+error.splash.socket=\u30B9\u30D7\u30E9\u30C3\u30B7\u30E5: \u30B5\u30FC\u30D0\u30FC\u30FB\u30BD\u30B1\u30C3\u30C8\u306B\u969C\u5BB3\u304C\u767A\u751F\u3057\u307E\u3057\u305F
+error.splash.cmnd=\u30B9\u30D7\u30E9\u30C3\u30B7\u30E5: \u8A8D\u8B58\u3055\u308C\u306A\u3044\u30B3\u30DE\u30F3\u30C9
+error.splash.port=\u30B9\u30D7\u30E9\u30C3\u30B7\u30E5: \u30DD\u30FC\u30C8\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093
+error.splash.send=\u30B9\u30D7\u30E9\u30C3\u30B7\u30E5: \u9001\u4FE1\u306B\u5931\u6557\u3057\u307E\u3057\u305F
+error.splash.timer=\u30B9\u30D7\u30E9\u30C3\u30B7\u30E5: \u30B7\u30E3\u30C3\u30C8\u30C0\u30A6\u30F3\u30FB\u30BF\u30A4\u30DE\u30FC\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093
+error.splash.x11.open=\u30B9\u30D7\u30E9\u30C3\u30B7\u30E5: X11\u30C7\u30A3\u30B9\u30D7\u30EC\u30A4\u3092\u958B\u3051\u307E\u305B\u3093
+error.splash.x11.connect=\u30B9\u30D7\u30E9\u30C3\u30B7\u30E5: X11\u63A5\u7D9A\u306B\u5931\u6557\u3057\u307E\u3057\u305F
+# Javaws usage: '\' is a joining of two sentence,which are connected including
+# the invisible character '\n'.
+message.javaws.usage=\n\u4F7F\u7528\u65B9\u6CD5:\tjavaws [run-options] <jnlp-file>\t\n\tjavaws [control-options]\t\t\n\nrun-options\u306B\u306F\u6B21\u306E\u3082\u306E\u304C\u3042\u308A\u307E\u3059\u3002\t\t\t\n-verbose \t\u8FFD\u52A0\u306E\u51FA\u529B\u3092\u8868\u793A\t\n-offline \t\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u3092\u30AA\u30D5\u30E9\u30A4\u30F3\u30FB\u30E2\u30FC\u30C9\u3067\u5B9F\u884C\t\n-system \t\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u3092\u30B7\u30B9\u30C6\u30E0\u30FB\u30AD\u30E3\u30C3\u30B7\u30E5\u306E\u307F\u304B\u3089\u5B9F\u884C\n-Xnosplash \t\u30B9\u30D7\u30E9\u30C3\u30B7\u30E5\u753B\u9762\u3092\u8868\u793A\u305B\u305A\u306B\u5B9F\u884C\t\n-J<option> \t\u30AA\u30D7\u30B7\u30E7\u30F3\u3092VM\u306B\u4E0E\u3048\u308B\t\n-wait \tJava\u30D7\u30ED\u30BB\u30B9\u3092\u958B\u59CB\u3057\u3001\u305D\u306E\u7D42\u4E86\u3092\u5F85\u6A5F\t\n\ncontrol-options\u306B\u306F\u6B21\u306E\u3082\u306E\u304C\u3042\u308A\u307E\u3059\u3002\t\n-viewer \t\u30AD\u30E3\u30C3\u30B7\u30E5\u30FB\u30D3\u30E5\u30FC\u30A2\u3092Java\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u30FB\u30D1\u30CD\u30EB\u306B\u8868\u793A\n-clearcache \t\u672A\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u306E\u3059\u3079\u3066\u306E\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u3092\u30AD\u30E3\u30C3\u30B7\u30E5\u304B\u3089\u524A\u9664\n-uninstall \t\u3059\u3079\u3066\u306E\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u3092\u30AD\u30E3\u30C3\u30B7\u30E5\u304B\u3089\u524A\u9664\n-uninstall <jnlp-file> \t\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u3092\u30AD\u30E3\u30C3\u30B7\u30E5\u304B\u3089\u524A\u9664\t\n-import [import-options] <jnlp-file>\t\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u3092\u30AD\u30E3\u30C3\u30B7\u30E5\u306B\u30A4\u30F3\u30DD\u30FC\u30C8\t\t\n\nimport-options\u306B\u306F\u6B21\u306E\u3082\u306E\u304C\u3042\u308A\u307E\u3059\u3002\t\n-silent \t\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u8868\u793A\u305B\u305A\u306B\u30A4\u30F3\u30DD\u30FC\u30C8(\u30E6\u30FC\u30B6\u30FC\u30FB\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u306A\u3057)\t\n-system \t\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u3092\u30B7\u30B9\u30C6\u30E0\u30FB\u30AD\u30E3\u30C3\u30B7\u30E5\u306B\u30A4\u30F3\u30DD\u30FC\u30C8\t\n-codebase <url>\t\u6307\u5B9A\u3055\u308C\u305F\u30B3\u30FC\u30C9\u30FB\u30D9\u30FC\u30B9\u304B\u3089\u30EA\u30BD\u30FC\u30B9\u3092\u53D6\u5F97\t\n-shortcut \t\u30E6\u30FC\u30B6\u30FC\u304C\u30D7\u30ED\u30F3\u30D7\u30C8\u3092\u53D7\u3051\u5165\u308C\u305F\u3082\u306E\u3068\u3057\u3066\u30B7\u30E7\u30FC\u30C8\u30AB\u30C3\u30C8\u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\t\n-association \t\u30E6\u30FC\u30B6\u30FC\u304C\u30D7\u30ED\u30F3\u30D7\u30C8\u3092\u53D7\u3051\u5165\u308C\u305F\u3082\u306E\u3068\u3057\u3066\u30A2\u30BD\u30B7\u30A8\u30FC\u30B7\u30E7\u30F3\u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\t\n\n
diff --git a/grid/jre/lib/deploy/messages_ko.properties b/grid/jre/lib/deploy/messages_ko.properties
new file mode 100644
index 0000000..2e62488
--- /dev/null
+++ b/grid/jre/lib/deploy/messages_ko.properties
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+
+error.internal.badmsg=\uB0B4\uBD80 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC54C \uC218 \uC5C6\uB294 \uBA54\uC2DC\uC9C0\uC785\uB2C8\uB2E4.
+error.badinst.nojre=\uC124\uCE58\uAC00 \uC798\uBABB\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uAD6C\uC131 \uD30C\uC77C\uC5D0\uC11C JRE\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
+error.launch.execv=Java Web Start(execv)\uB97C \uD638\uCD9C\uD558\uB294 \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.
+error.launch.sysexec=Java Web Start(SysExec)\uB97C \uD638\uCD9C\uD558\uB294 \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.
+error.listener.failed=\uC2A4\uD50C\uB798\uC2DC: sysCreateListenerSocket\uC744 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.
+error.accept.failed=\uC2A4\uD50C\uB798\uC2DC: \uC2B9\uC778\uC744 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.
+error.recv.failed=\uC2A4\uD50C\uB798\uC2DC: recv\uB97C \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.
+error.invalid.port=\uC2A4\uD50C\uB798\uC2DC: \uC801\uD569\uD55C \uD3EC\uD2B8\uB97C \uBCF5\uC6D0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.
+error.read=\uBC84\uD37C \uB05D\uC744 \uC9C0\uB098\uC11C \uC77D\uC5C8\uC2B5\uB2C8\uB2E4.
+error.xmlparsing=XML \uAD6C\uBB38 \uBD84\uC11D \uC624\uB958: \uC798\uBABB\uB41C \uD1A0\uD070 \uC720\uD615\uC774 \uBC1C\uACAC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+error.splash.exit=Java Web Start \uC2A4\uD50C\uB798\uC2DC \uD654\uBA74 \uCC98\uB9AC\uB97C \uC885\uB8CC\uD558\uB294 \uC911...\n
+# "Last WinSock Error" means the error message for the last operation that failed.
+error.winsock=\t\uB9C8\uC9C0\uB9C9 WinSock \uC624\uB958:
+error.winsock.load=winsock.dll\uC744 \uB85C\uB4DC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
+error.winsock.start=WSAStartup\uC744 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.
+error.badinst.nohome=\uC798\uBABB\uB41C \uC124\uCE58: JAVAWS_HOME\uC774 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.
+error.splash.noimage=\uC2A4\uD50C\uB798\uC2DC: \uC2A4\uD50C\uB798\uC2DC \uD654\uBA74 \uC774\uBBF8\uC9C0\uB97C \uB85C\uB4DC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
+error.splash.socket=\uC2A4\uD50C\uB798\uC2DC: \uC11C\uBC84 \uC18C\uCF13\uC744 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.
+error.splash.cmnd=\uC2A4\uD50C\uB798\uC2DC: \uC54C \uC218 \uC5C6\uB294 \uBA85\uB839\uC785\uB2C8\uB2E4.
+error.splash.port=\uC2A4\uD50C\uB798\uC2DC: \uD3EC\uD2B8\uAC00 \uC9C0\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.
+error.splash.send=\uC2A4\uD50C\uB798\uC2DC: \uC804\uC1A1\uC744 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.
+error.splash.timer=\uC2A4\uD50C\uB798\uC2DC: \uC885\uB8CC \uD0C0\uC774\uBA38\uB97C \uC0DD\uC131\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
+error.splash.x11.open=\uC2A4\uD50C\uB798\uC2DC: X11 \uB514\uC2A4\uD50C\uB808\uC774\uB97C \uC5F4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
+error.splash.x11.connect=\uC2A4\uD50C\uB798\uC2DC: X11 \uC811\uC18D\uC744 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.
+# Javaws usage: '\' is a joining of two sentence,which are connected including
+# the invisible character '\n'.
+message.javaws.usage=\n\uC0AC\uC6A9\uBC95:\tjavaws [run-options] <jnlp-file>\t\n\tjavaws [control-options]\t\t\n\n\uC5EC\uAE30\uC11C run-options\uB294 \uB2E4\uC74C\uACFC \uAC19\uC2B5\uB2C8\uB2E4.\t\t\t\n-verbose \t\uCD94\uAC00 \uCD9C\uB825\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.\t\n-offline \t\uC624\uD504\uB77C\uC778 \uBAA8\uB4DC\uB85C \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uC2E4\uD589\uD569\uB2C8\uB2E4.\t\n-system \t\uC2DC\uC2A4\uD15C \uCE90\uC2DC\uC5D0\uC11C\uB9CC \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uC2E4\uD589\uD569\uB2C8\uB2E4.\n-Xnosplash \t\uC2A4\uD50C\uB798\uC2DC \uD654\uBA74\uC744 \uD45C\uC2DC\uD558\uC9C0 \uC54A\uACE0 \uC2E4\uD589\uD569\uB2C8\uB2E4.\t\n-J<option> \tvm\uC5D0 \uC635\uC158\uC744 \uC81C\uACF5\uD569\uB2C8\uB2E4.\t\n-wait \tJava \uD504\uB85C\uC138\uC2A4\uB97C \uC2DC\uC791\uD558\uACE0 \uC885\uB8CC\uB420 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9BD\uB2C8\uB2E4.\t\n\ncontrol-options\uB294 \uB2E4\uC74C\uACFC \uAC19\uC2B5\uB2C8\uB2E4.\t\n-viewer \tJava \uC81C\uC5B4\uD310\uC5D0\uC11C \uCE90\uC2DC \uBDF0\uC5B4\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.\n-clearcache \t\uCE90\uC2DC\uC5D0\uC11C \uC124\uCE58\uB418\uC9C0 \uC54A\uC740 \uBAA8\uB4E0 \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uC81C\uAC70\uD569\uB2C8\uB2E4.\n-uninstall \t\uCE90\uC2DC\uC5D0\uC11C \uBAA8\uB4E0 \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uC81C\uAC70\uD569\uB2C8\uB2E4.\n-uninstall <jnlp-file> \t\uCE90\uC2DC\uC5D0\uC11C \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uC81C\uAC70\uD569\uB2C8\uB2E4.\t\n-import [import-options] <jnlp-file>\t\uCE90\uC2DC\uB85C \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uC784\uD3EC\uD2B8\uD569\uB2C8\uB2E4.\t\t\n\nimport-options\uB294 \uB2E4\uC74C\uACFC \uAC19\uC2B5\uB2C8\uB2E4.\t\t\t\t\t\t\n-silent \t\uC0AC\uC6A9\uC790 \uC778\uD130\uD398\uC774\uC2A4 \uC5C6\uC774 \uC790\uB3D9\uC73C\uB85C \uC784\uD3EC\uD2B8\uD569\uB2C8\uB2E4.\t\n-system \t\uC2DC\uC2A4\uD15C \uCE90\uC2DC\uB85C \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uC784\uD3EC\uD2B8\uD569\uB2C8\uB2E4.\t\n-codebase <url>\t\uC81C\uACF5\uB41C \uCF54\uB4DC\uBCA0\uC774\uC2A4\uC5D0\uC11C \uB9AC\uC18C\uC2A4\uB97C \uAC80\uC0C9\uD569\uB2C8\uB2E4.\t\n-shortcut \t\uC0AC\uC6A9\uC790\uAC00 \uD504\uB86C\uD504\uD2B8\uB97C \uD5C8\uC6A9\uD55C \uAC83\uC73C\uB85C \uAC04\uC8FC\uD558\uC5EC \uB2E8\uCD95\uD0A4\uB97C \uC124\uCE58\uD569\uB2C8\uB2E4.\t\n-association \t\uC0AC\uC6A9\uC790\uAC00 \uD504\uB86C\uD504\uD2B8\uB97C \uD5C8\uC6A9\uD55C \uAC83\uC73C\uB85C \uAC04\uC8FC\uD558\uC5EC \uC5F0\uAD00\uC744 \uC124\uCE58\uD569\uB2C8\uB2E4.\t\n\n
diff --git a/grid/jre/lib/deploy/messages_pt_BR.properties b/grid/jre/lib/deploy/messages_pt_BR.properties
new file mode 100644
index 0000000..f571497
--- /dev/null
+++ b/grid/jre/lib/deploy/messages_pt_BR.properties
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+
+error.internal.badmsg=erro interno, mensagem desconhecida
+error.badinst.nojre=Instala\u00E7\u00E3o incorreta. Nenhum JRE encontrado no arquivo de configura\u00E7\u00E3o
+error.launch.execv=Erro encontrado ao chamar Java Web Start (execv)
+error.launch.sysexec=Erro encontrado ao chamar Java Web Start (SysExec)
+error.listener.failed=Tela Inicial: falha em sysCreateListenerSocket
+error.accept.failed=Tela Inicial: falha na fun\u00E7\u00E3o accept
+error.recv.failed=Tela Inicial: falha na fun\u00E7\u00E3o recv
+error.invalid.port=Tela Inicial: n\u00E3o reativou uma porta v\u00E1lida
+error.read=Ler ap\u00F3s o final do buffer
+error.xmlparsing=Erro durante o parsing de XML: tipo incorreto de token encontrado
+error.splash.exit=Saindo do processamento da tela inicial do Java Web .....\n
+# "Last WinSock Error" means the error message for the last operation that failed.
+error.winsock=\t\u00DAltimo Erro de WinSock:
+error.winsock.load=N\u00E3o foi poss\u00EDvel carregar winsock.dll
+error.winsock.start=Falha em WSAStartup
+error.badinst.nohome=Instala\u00E7\u00E3o incorreta: JAVAWS_HOME n\u00E3o definido
+error.splash.noimage=Tela Inicial: n\u00E3o foi poss\u00EDvel carregar a imagem da tela inicial
+error.splash.socket=Tela Inicial: falha no soquete do servidor
+error.splash.cmnd=Tela Inicial: comando n\u00E3o reconhecido
+error.splash.port=Tela Inicial: porta n\u00E3o especificada
+error.splash.send=Tela Inicial: falha na fun\u00E7\u00E3o send
+error.splash.timer=Tela Inicial: n\u00E3o foi poss\u00EDvel criar temporizador de shutdown
+error.splash.x11.open=Tela Inicial: N\u00E3o \u00E9 poss\u00EDvel abrir a exibi\u00E7\u00E3o X11
+error.splash.x11.connect=Tela Inicial: falha na conex\u00E3o X11
+# Javaws usage: '\' is a joining of two sentence,which are connected including
+# the invisible character '\n'.
+message.javaws.usage=\nUso:\tjavaws [run-options] <jnlp-file>\t\n\tjavaws [control-options]\t\t\n\nem que run-options inclui:\t\t\t\n-verbose \texibe a sa\u00EDda adicional\t\n-offline \texecuta o aplicativo no modo off-line\t\n-system \texecuta o aplicativo somente pelo cache do sistema\n-Xnosplash \texecuta sem mostrar uma tela de abertura\t\n-J<option> \tenvia a op\u00E7\u00E3o \u00E0 vm\t\n-wait \tinicia o processo java e aguarda sua sa\u00EDda\t\n\ncontrol-options inclui:\t\n-viewer \tmostra o visualizador do cache no painel de controle java\n-clearcache \tremove do cache todos os aplicativos n\u00E3o instalados\n-uninstall \tremove do cache todos os aplicativos\n-uninstall <jnlp-file> \tremove o aplicativo do cache\t\n-import [import-options] <jnlp-file>\timporta o aplicativo para o cache\t\t\n\nimport-options inclui:\t\t\t\t\t\t\n-silent \timporta silenciosamente (sem interface do usu\u00E1rio)\t\n-system \timporta o aplicativo para o cache do sistema\t\n-codebase <url>\trecupera recursos da base de c\u00F3digo especificada\t\n-shortcut \tinstala atalhos como se fosse um prompt permitido pelo usu\u00E1rio\t\n-association \tinstala associa\u00E7\u00F5es como se fosse um prompt permitido pelo usu\u00E1rio\t\n\n
diff --git a/grid/jre/lib/deploy/messages_sv.properties b/grid/jre/lib/deploy/messages_sv.properties
new file mode 100644
index 0000000..9f22f94
--- /dev/null
+++ b/grid/jre/lib/deploy/messages_sv.properties
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+
+error.internal.badmsg=internt fel, ok\u00E4nt meddelande
+error.badinst.nojre=Felaktig installation. Ingen JRE har hittats i konfigurationsfilen
+error.launch.execv=Ett fel intr\u00E4ffade under starten av Java Web Start (execv)
+error.launch.sysexec=Ett fel intr\u00E4ffade under starten av Java Web Start (SysExec)
+error.listener.failed=V\u00E4lkomstsk\u00E4rm: sysCreateListenerSocket utf\u00F6rdes inte
+error.accept.failed=V\u00E4lkomstsk\u00E4rm: kunde inte accepteras
+error.recv.failed=V\u00E4lkomstsk\u00E4rm: kunde inte mottaga
+error.invalid.port=V\u00E4lkomstsk\u00E4rm: \u00E5terskapade inte en giltig port
+error.read=L\u00E4ste f\u00F6rbi slutet av bufferten
+error.xmlparsing=XML-tolkningsfel: fel typ av token hittades
+error.splash.exit=Java Web Start - v\u00E4lkomstsk\u00E4rmen avslutas .....\n
+# "Last WinSock Error" means the error message for the last operation that failed.
+error.winsock=\tSenaste WinSock-fel:
+error.winsock.load=Kunde inte ladda winsock.dll
+error.winsock.start=WSAStartup utf\u00F6rdes inte
+error.badinst.nohome=Felaktig installation: JAVAWS_HOME har inte st\u00E4llts in
+error.splash.noimage=V\u00E4lkomstsk\u00E4rm: kunde inte ladda bilden f\u00F6r v\u00E4lkomstsk\u00E4rmen
+error.splash.socket=V\u00E4lkomstsk\u00E4rm: serversocket utf\u00F6rdes inte
+error.splash.cmnd=V\u00E4lkomstsk\u00E4rm: ok\u00E4nt kommando
+error.splash.port=V\u00E4lkomstsk\u00E4rm: porten angavs inte
+error.splash.send=V\u00E4lkomstsk\u00E4rm: kunde inte skicka
+error.splash.timer=V\u00E4lkomstsk\u00E4rm: kunde inte skapa tidtagare f\u00F6r avst\u00E4ngning
+error.splash.x11.open=V\u00E4lkomstsk\u00E4rm: kan inte \u00F6ppna X11-visningen
+error.splash.x11.connect=V\u00E4lkomstsk\u00E4rm: X11-anslutning uppr\u00E4ttades inte
+# Javaws usage: '\' is a joining of two sentence,which are connected including
+# the invisible character '\n'.
+message.javaws.usage=\nSyntax:\tjavaws [k\u00F6ralternativ] <jnlp-fil>\t\n\tjavaws [k\u00F6ralternativ]\t\t\n\nd\u00E4r k\u00F6ralternativen omfattar:\t\t\t\n-verbose \tvisa ytterligare utdata\t\n-offline \tk\u00F6r applikationen i offlinel\u00E4ge\t\n-system \tk\u00F6r applikationen endast fr\u00E5n systemcachen\n-Xnosplash \tk\u00F6r utan att visa v\u00E4lkomstsk\u00E4rmen\t\n-J<alternativ> \tange alternativ f\u00F6r VM\t\n-wait \tstarta javaprocessen och v\u00E4nta tills den har slutf\u00F6rts\t\n\nkontrollalternativen omfattar:\t\n-viewer \tvisa cachel\u00E4saren i kontrollpanelen f\u00F6r java\n-clearcache \tta bort alla icke installerade applikationer fr\u00E5n cachen\n-uninstall \tta bort alla applikationer fr\u00E5n cachen\n-uninstall <jnlp-fil> \tta bort applikationen fr\u00E5n cachen\t\n-import [importalternativ] <jnlp-fil>\timportera applikationen till cachen\t\t\n\nimportalternativen omfattar:\t\t\t\t\t\t\n-silent \timportera obevakat (utan anv\u00E4ndargr\u00E4nssnitt)\t\n-system \timportera applikationen till systemcachen\t\n-codebase <url>\th\u00E4mta resurserna fr\u00E5n den angivna kodbasen\t\n-shortcut \tinstallera genv\u00E4gar som om anv\u00E4ndaren till\u00E5tit det\t\n-association \tinstallera associationer som om anv\u00E4ndaren till\u00E5tit det\t\n\n
diff --git a/grid/jre/lib/deploy/messages_zh_CN.properties b/grid/jre/lib/deploy/messages_zh_CN.properties
new file mode 100644
index 0000000..2abea2e
--- /dev/null
+++ b/grid/jre/lib/deploy/messages_zh_CN.properties
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+
+error.internal.badmsg=\u5185\u90E8\u9519\u8BEF, \u672A\u77E5\u6D88\u606F
+error.badinst.nojre=\u9519\u8BEF\u5B89\u88C5\u3002\u914D\u7F6E\u6587\u4EF6\u4E2D\u627E\u4E0D\u5230 JRE
+error.launch.execv=\u8C03\u7528 Java Web Start (execv) \u65F6\u9047\u5230\u9519\u8BEF
+error.launch.sysexec=\u8C03\u7528 Java Web Start (SysExec) \u65F6\u9047\u5230\u9519\u8BEF
+error.listener.failed=\u542F\u52A8\u5C4F\u5E55: sysCreateListenerSocket \u5931\u8D25
+error.accept.failed=\u542F\u52A8\u5C4F\u5E55: \u63A5\u53D7\u5931\u8D25
+error.recv.failed=\u542F\u52A8\u5C4F\u5E55: recv \u5931\u8D25
+error.invalid.port=\u542F\u52A8\u5C4F\u5E55: \u672A\u6062\u590D\u6709\u6548\u7AEF\u53E3
+error.read=\u8BFB\u53D6\u8D85\u51FA\u7F13\u51B2\u533A\u7ED3\u5C3E
+error.xmlparsing=XML \u89E3\u6790\u9519\u8BEF: \u53D1\u73B0\u9519\u8BEF\u7684\u6807\u8BB0\u7C7B\u578B
+error.splash.exit=Java Web Start \u542F\u52A8\u5C4F\u5E55\u8FDB\u7A0B\u6B63\u5728\u9000\u51FA.....\n
+# "Last WinSock Error" means the error message for the last operation that failed.
+error.winsock=\t\u4E0A\u4E00\u4E2A WinSock \u9519\u8BEF:
+error.winsock.load=\u65E0\u6CD5\u52A0\u8F7D winsock.dll
+error.winsock.start=WSAStartup \u5931\u8D25
+error.badinst.nohome=\u9519\u8BEF\u5B89\u88C5: JAVAWS_HOME \u672A\u8BBE\u7F6E
+error.splash.noimage=\u542F\u52A8\u5C4F\u5E55: \u65E0\u6CD5\u52A0\u8F7D\u542F\u52A8\u5C4F\u5E55\u56FE\u50CF
+error.splash.socket=\u542F\u52A8\u5C4F\u5E55: \u670D\u52A1\u5668\u5957\u63A5\u5B57\u5931\u8D25
+error.splash.cmnd=\u542F\u52A8\u5C4F\u5E55: \u65E0\u6CD5\u8BC6\u522B\u7684\u547D\u4EE4
+error.splash.port=\u542F\u52A8\u5C4F\u5E55: \u672A\u6307\u5B9A\u7AEF\u53E3
+error.splash.send=\u542F\u52A8\u5C4F\u5E55: \u53D1\u9001\u5931\u8D25
+error.splash.timer=\u542F\u52A8\u5C4F\u5E55: \u65E0\u6CD5\u521B\u5EFA\u5173\u673A\u8BA1\u65F6\u5668
+error.splash.x11.open=\u542F\u52A8\u5C4F\u5E55: \u65E0\u6CD5\u6253\u5F00 X11 \u663E\u793A
+error.splash.x11.connect=\u542F\u52A8\u5C4F\u5E55: X11 \u8FDE\u63A5\u5931\u8D25
+# Javaws usage: '\' is a joining of two sentence,which are connected including
+# the invisible character '\n'.
+message.javaws.usage=\n\u7528\u6CD5:\tjavaws [\u8FD0\u884C\u9009\u9879] <jnlp-file>\t\n\tjavaws [\u63A7\u5236\u9009\u9879]\t\t\n\n\u5176\u4E2D\u8FD0\u884C\u9009\u9879\u5305\u62EC:\t\t\t\n-verbose \t\u663E\u793A\u5176\u4ED6\u8F93\u51FA\u5185\u5BB9\t\n-offline \t\u4EE5\u8131\u673A\u6A21\u5F0F\u8FD0\u884C\u5E94\u7528\u7A0B\u5E8F\t\n-system \t\u4EC5\u4ECE\u7CFB\u7EDF\u9AD8\u901F\u7F13\u5B58\u8FD0\u884C\u5E94\u7528\u7A0B\u5E8F\n-Xnosplash \t\u8FD0\u884C\u65F6\u4E0D\u663E\u793A\u542F\u52A8\u5C4F\u5E55\t\n-J<\u9009\u9879> \t\u4E3A vm \u63D0\u4F9B\u9009\u9879\t\n-wait \t\u542F\u52A8 Java \u8FDB\u7A0B\u5E76\u7B49\u5F85\u5176\u9000\u51FA\t\n\n\u63A7\u5236\u9009\u9879\u5305\u62EC:\t\n-viewer \t\u5728 Java \u63A7\u5236\u9762\u677F\u4E2D\u663E\u793A\u9AD8\u901F\u7F13\u5B58\u67E5\u770B\u5668\n-clearcache \t\u4ECE\u9AD8\u901F\u7F13\u5B58\u5220\u9664\u6240\u6709\u672A\u5B89\u88C5\u7684\u5E94\u7528\u7A0B\u5E8F\n-uninstall \t\u4ECE\u9AD8\u901F\u7F13\u5B58\u5220\u9664\u6240\u6709\u5E94\u7528\u7A0B\u5E8F\n-uninstall <jnlp-file> \t\u4ECE\u9AD8\u901F\u7F13\u5B58\u5220\u9664\u5E94\u7528\u7A0B\u5E8F\t\n-import [\u5BFC\u5165\u9009\u9879] <jnlp-file>\t\u5C06\u5E94\u7528\u7A0B\u5E8F\u5BFC\u5165\u9AD8\u901F\u7F13\u5B58\t\t\n\n\u5BFC\u5165\u9009\u9879\u5305\u62EC:\t\t\t\t\t\t\n-silent \t\u4EE5\u65E0\u63D0\u793A\u6A21\u5F0F (\u4E0D\u51FA\u73B0\u7528\u6237\u754C\u9762) \u5BFC\u5165\t\n-system \t\u5C06\u5E94\u7528\u7A0B\u5E8F\u5BFC\u5165\u7CFB\u7EDF\u9AD8\u901F\u7F13\u5B58\t\n-codebase <url>\t\u4ECE\u7ED9\u5B9A\u7684\u4EE3\u7801\u5E93\u68C0\u7D22\u8D44\u6E90\t\n-shortcut \t\u4EE5\u7528\u6237\u63A5\u53D7\u63D0\u793A\u7684\u65B9\u5F0F\u5B89\u88C5\u5FEB\u6377\u65B9\u5F0F\t\n-association \t\u4EE5\u7528\u6237\u63A5\u53D7\u63D0\u793A\u7684\u65B9\u5F0F\u5B89\u88C5\u5173\u8054\t\n\n
diff --git a/grid/jre/lib/deploy/messages_zh_HK.properties b/grid/jre/lib/deploy/messages_zh_HK.properties
new file mode 100644
index 0000000..80cc49b
--- /dev/null
+++ b/grid/jre/lib/deploy/messages_zh_HK.properties
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+
+error.internal.badmsg=\u5167\u90E8\u932F\u8AA4\uFF0C\u4E0D\u660E\u7684\u8A0A\u606F
+error.badinst.nojre=\u5B89\u88DD\u932F\u8AA4\u3002\u5728\u7D44\u614B\u6A94\u4E2D\u627E\u4E0D\u5230 JRE
+error.launch.execv=\u547C\u53EB Java Web Start (execv) \u6642\u9047\u5230\u932F\u8AA4
+error.launch.sysexec=\u547C\u53EB Java Web Start (SysExec) \u6642\u9047\u5230\u932F\u8AA4
+error.listener.failed=Splash: sysCreateListenerSocket \u5931\u6557
+error.accept.failed=Splash: \u63A5\u53D7\u5931\u6557
+error.recv.failed=Splash: recv \u5931\u6557
+error.invalid.port=Splash: \u6709\u6548\u7684\u9023\u63A5\u57E0\u5C1A\u672A\u56DE\u5FA9
+error.read=\u8B80\u53D6\u8D85\u51FA\u7DE9\u885D\u5340\u7D50\u5C3E
+error.xmlparsing=XML \u5256\u6790\u932F\u8AA4: \u627E\u5230\u932F\u8AA4\u7684\u8A18\u865F\u7A2E\u985E
+error.splash.exit=Java Web Start \u9583\u73FE\u87A2\u5E55\u8655\u7406\u7D50\u675F\u4E2D.....\n
+# "Last WinSock Error" means the error message for the last operation that failed.
+error.winsock=\t\u4E0A\u4E00\u6B21 WinSock \u932F\u8AA4:
+error.winsock.load=\u7121\u6CD5\u8F09\u5165 winsock.dll
+error.winsock.start=WSAStartup \u5931\u6557
+error.badinst.nohome=\u5B89\u88DD\u932F\u8AA4: \u672A\u8A2D\u5B9A JAVAWS_HOME
+error.splash.noimage=Splash: \u7121\u6CD5\u8F09\u5165\u9583\u73FE\u87A2\u5E55\u5F71\u50CF
+error.splash.socket=Splash: \u4F3A\u670D\u5668 socket \u5931\u6557
+error.splash.cmnd=Splash: \u7121\u6CD5\u8FA8\u8B58\u547D\u4EE4
+error.splash.port=Splash: \u672A\u6307\u5B9A\u9023\u63A5\u57E0
+error.splash.send=Splash: \u50B3\u9001\u5931\u6557
+error.splash.timer=Splash: \u7121\u6CD5\u5EFA\u7ACB\u95DC\u6A5F\u8A08\u6642\u5668
+error.splash.x11.open=Splash: \u7121\u6CD5\u958B\u555F X11 \u986F\u793A\u756B\u9762
+error.splash.x11.connect=Splash: X11 \u9023\u7DDA\u5931\u6557
+# Javaws usage: '\' is a joining of two sentence,which are connected including
+# the invisible character '\n'.
+message.javaws.usage=\n\u7528\u6CD5:\tjavaws [run-options] <jnlp-file>\t\n\tjavaws [control-options]\t\t\n\n\u5176\u4E2D\uFF0Crun-options \u5305\u62EC:\t\t\t\n-verbose \t\u986F\u793A\u66F4\u8A73\u7D30\u7684\u8F38\u51FA\t\n-offline \t\u5728\u96E2\u7DDA\u6A21\u5F0F\u4E0B\u57F7\u884C\u61C9\u7528\u7A0B\u5F0F\t\n-system \t\u50C5\u5F9E\u7CFB\u7D71\u5FEB\u53D6\u57F7\u884C\u61C9\u7528\u7A0B\u5F0F\n-Xnosplash \t\u57F7\u884C\u6642\u4E0D\u986F\u793A\u8EDF\u9AD4\u8CC7\u8A0A\u756B\u9762\t\n-J<option> \t\u70BA vm \u63D0\u4F9B\u9078\u9805\t\n-wait \t\u555F\u52D5 Java \u8655\u7406\u4E26\u7B49\u5F85\u5176\u7D50\u675F\t\n\ncontrol-options \u5305\u62EC:\t\n-viewer \t\u5728 Java \u63A7\u5236\u9762\u677F\u4E2D\u986F\u793A\u5FEB\u53D6\u6AA2\u8996\u5668\n-clearcache \t\u5F9E\u5FEB\u53D6\u4E2D\u79FB\u9664\u6240\u6709\u975E\u5B89\u88DD\u61C9\u7528\u7A0B\u5F0F\n-uninstall \t\u5F9E\u5FEB\u53D6\u4E2D\u79FB\u9664\u6240\u6709\u61C9\u7528\u7A0B\u5F0F\n-uninstall <jnlp-file> \t\u5F9E\u5FEB\u53D6\u4E2D\u79FB\u9664\u61C9\u7528\u7A0B\u5F0F\t\n-import [import-options] <jnlp-file>\t\u5C07\u61C9\u7528\u7A0B\u5F0F\u532F\u5165\u5FEB\u53D6\t\t\n\nimport-options \u5305\u62EC:\t\t\t\t\t\t\n-silent \t\u4EE5\u7121\u63D0\u793A\u6A21\u5F0F\u532F\u5165 (\u7121\u4F7F\u7528\u8005\u4ECB\u9762)\t\n-system \t\u5C07\u61C9\u7528\u7A0B\u5F0F\u532F\u5165\u7CFB\u7D71\u5FEB\u53D6\t\n-codebase <url>\t\u5F9E\u6307\u5B9A\u7684\u4EE3\u78BC\u5EAB\u64F7\u53D6\u8CC7\u6E90\t\n-shortcut \t\u5B89\u88DD\u6377\u5F91 (\u7336\u5982\u4F7F\u7528\u8005\u5DF2\u5141\u8A31\u63D0\u793A)\t\n-association \t\u5B89\u88DD\u95DC\u806F (\u7336\u5982\u4F7F\u7528\u8005\u5DF2\u5141\u8A31\u63D0\u793A)\t\n\n
diff --git a/grid/jre/lib/deploy/messages_zh_TW.properties b/grid/jre/lib/deploy/messages_zh_TW.properties
new file mode 100644
index 0000000..80cc49b
--- /dev/null
+++ b/grid/jre/lib/deploy/messages_zh_TW.properties
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+
+error.internal.badmsg=\u5167\u90E8\u932F\u8AA4\uFF0C\u4E0D\u660E\u7684\u8A0A\u606F
+error.badinst.nojre=\u5B89\u88DD\u932F\u8AA4\u3002\u5728\u7D44\u614B\u6A94\u4E2D\u627E\u4E0D\u5230 JRE
+error.launch.execv=\u547C\u53EB Java Web Start (execv) \u6642\u9047\u5230\u932F\u8AA4
+error.launch.sysexec=\u547C\u53EB Java Web Start (SysExec) \u6642\u9047\u5230\u932F\u8AA4
+error.listener.failed=Splash: sysCreateListenerSocket \u5931\u6557
+error.accept.failed=Splash: \u63A5\u53D7\u5931\u6557
+error.recv.failed=Splash: recv \u5931\u6557
+error.invalid.port=Splash: \u6709\u6548\u7684\u9023\u63A5\u57E0\u5C1A\u672A\u56DE\u5FA9
+error.read=\u8B80\u53D6\u8D85\u51FA\u7DE9\u885D\u5340\u7D50\u5C3E
+error.xmlparsing=XML \u5256\u6790\u932F\u8AA4: \u627E\u5230\u932F\u8AA4\u7684\u8A18\u865F\u7A2E\u985E
+error.splash.exit=Java Web Start \u9583\u73FE\u87A2\u5E55\u8655\u7406\u7D50\u675F\u4E2D.....\n
+# "Last WinSock Error" means the error message for the last operation that failed.
+error.winsock=\t\u4E0A\u4E00\u6B21 WinSock \u932F\u8AA4:
+error.winsock.load=\u7121\u6CD5\u8F09\u5165 winsock.dll
+error.winsock.start=WSAStartup \u5931\u6557
+error.badinst.nohome=\u5B89\u88DD\u932F\u8AA4: \u672A\u8A2D\u5B9A JAVAWS_HOME
+error.splash.noimage=Splash: \u7121\u6CD5\u8F09\u5165\u9583\u73FE\u87A2\u5E55\u5F71\u50CF
+error.splash.socket=Splash: \u4F3A\u670D\u5668 socket \u5931\u6557
+error.splash.cmnd=Splash: \u7121\u6CD5\u8FA8\u8B58\u547D\u4EE4
+error.splash.port=Splash: \u672A\u6307\u5B9A\u9023\u63A5\u57E0
+error.splash.send=Splash: \u50B3\u9001\u5931\u6557
+error.splash.timer=Splash: \u7121\u6CD5\u5EFA\u7ACB\u95DC\u6A5F\u8A08\u6642\u5668
+error.splash.x11.open=Splash: \u7121\u6CD5\u958B\u555F X11 \u986F\u793A\u756B\u9762
+error.splash.x11.connect=Splash: X11 \u9023\u7DDA\u5931\u6557
+# Javaws usage: '\' is a joining of two sentence,which are connected including
+# the invisible character '\n'.
+message.javaws.usage=\n\u7528\u6CD5:\tjavaws [run-options] <jnlp-file>\t\n\tjavaws [control-options]\t\t\n\n\u5176\u4E2D\uFF0Crun-options \u5305\u62EC:\t\t\t\n-verbose \t\u986F\u793A\u66F4\u8A73\u7D30\u7684\u8F38\u51FA\t\n-offline \t\u5728\u96E2\u7DDA\u6A21\u5F0F\u4E0B\u57F7\u884C\u61C9\u7528\u7A0B\u5F0F\t\n-system \t\u50C5\u5F9E\u7CFB\u7D71\u5FEB\u53D6\u57F7\u884C\u61C9\u7528\u7A0B\u5F0F\n-Xnosplash \t\u57F7\u884C\u6642\u4E0D\u986F\u793A\u8EDF\u9AD4\u8CC7\u8A0A\u756B\u9762\t\n-J<option> \t\u70BA vm \u63D0\u4F9B\u9078\u9805\t\n-wait \t\u555F\u52D5 Java \u8655\u7406\u4E26\u7B49\u5F85\u5176\u7D50\u675F\t\n\ncontrol-options \u5305\u62EC:\t\n-viewer \t\u5728 Java \u63A7\u5236\u9762\u677F\u4E2D\u986F\u793A\u5FEB\u53D6\u6AA2\u8996\u5668\n-clearcache \t\u5F9E\u5FEB\u53D6\u4E2D\u79FB\u9664\u6240\u6709\u975E\u5B89\u88DD\u61C9\u7528\u7A0B\u5F0F\n-uninstall \t\u5F9E\u5FEB\u53D6\u4E2D\u79FB\u9664\u6240\u6709\u61C9\u7528\u7A0B\u5F0F\n-uninstall <jnlp-file> \t\u5F9E\u5FEB\u53D6\u4E2D\u79FB\u9664\u61C9\u7528\u7A0B\u5F0F\t\n-import [import-options] <jnlp-file>\t\u5C07\u61C9\u7528\u7A0B\u5F0F\u532F\u5165\u5FEB\u53D6\t\t\n\nimport-options \u5305\u62EC:\t\t\t\t\t\t\n-silent \t\u4EE5\u7121\u63D0\u793A\u6A21\u5F0F\u532F\u5165 (\u7121\u4F7F\u7528\u8005\u4ECB\u9762)\t\n-system \t\u5C07\u61C9\u7528\u7A0B\u5F0F\u532F\u5165\u7CFB\u7D71\u5FEB\u53D6\t\n-codebase <url>\t\u5F9E\u6307\u5B9A\u7684\u4EE3\u78BC\u5EAB\u64F7\u53D6\u8CC7\u6E90\t\n-shortcut \t\u5B89\u88DD\u6377\u5F91 (\u7336\u5982\u4F7F\u7528\u8005\u5DF2\u5141\u8A31\u63D0\u793A)\t\n-association \t\u5B89\u88DD\u95DC\u806F (\u7336\u5982\u4F7F\u7528\u8005\u5DF2\u5141\u8A31\u63D0\u793A)\t\n\n
diff --git a/grid/jre/lib/deploy/splash.gif b/grid/jre/lib/deploy/splash.gif
new file mode 100644
index 0000000..e886d50
--- /dev/null
+++ b/grid/jre/lib/deploy/splash.gif
Binary files differ
diff --git a/grid/jre/lib/deploy/splash@2x.gif b/grid/jre/lib/deploy/splash@2x.gif
new file mode 100644
index 0000000..9c47678
--- /dev/null
+++ b/grid/jre/lib/deploy/splash@2x.gif
Binary files differ
diff --git a/grid/jre/lib/deploy/splash_11-lic.gif b/grid/jre/lib/deploy/splash_11-lic.gif
new file mode 100644
index 0000000..147db08
--- /dev/null
+++ b/grid/jre/lib/deploy/splash_11-lic.gif
Binary files differ
diff --git a/grid/jre/lib/deploy/splash_11@2x-lic.gif b/grid/jre/lib/deploy/splash_11@2x-lic.gif
new file mode 100644
index 0000000..88a6370
--- /dev/null
+++ b/grid/jre/lib/deploy/splash_11@2x-lic.gif
Binary files differ
diff --git a/grid/jre/lib/ext/access-bridge-64.jar b/grid/jre/lib/ext/access-bridge-64.jar
new file mode 100644
index 0000000..8710700
--- /dev/null
+++ b/grid/jre/lib/ext/access-bridge-64.jar
Binary files differ
diff --git a/grid/jre/lib/ext/cldrdata.jar b/grid/jre/lib/ext/cldrdata.jar
new file mode 100644
index 0000000..f14698a
--- /dev/null
+++ b/grid/jre/lib/ext/cldrdata.jar
Binary files differ
diff --git a/grid/jre/lib/ext/dnsns.jar b/grid/jre/lib/ext/dnsns.jar
new file mode 100644
index 0000000..c4fd9fa
--- /dev/null
+++ b/grid/jre/lib/ext/dnsns.jar
Binary files differ
diff --git a/grid/jre/lib/ext/jaccess.jar b/grid/jre/lib/ext/jaccess.jar
new file mode 100644
index 0000000..53d2da1
--- /dev/null
+++ b/grid/jre/lib/ext/jaccess.jar
Binary files differ
diff --git a/grid/jre/lib/ext/jfxrt.jar b/grid/jre/lib/ext/jfxrt.jar
new file mode 100644
index 0000000..39914b4
--- /dev/null
+++ b/grid/jre/lib/ext/jfxrt.jar
Binary files differ
diff --git a/grid/jre/lib/ext/localedata.jar b/grid/jre/lib/ext/localedata.jar
new file mode 100644
index 0000000..83ad7e2
--- /dev/null
+++ b/grid/jre/lib/ext/localedata.jar
Binary files differ
diff --git a/grid/jre/lib/ext/meta-index b/grid/jre/lib/ext/meta-index
new file mode 100644
index 0000000..9119b48
--- /dev/null
+++ b/grid/jre/lib/ext/meta-index
@@ -0,0 +1,69 @@
+% VERSION 2
+% WARNING: this file is auto-generated; do not edit
+% UNSUPPORTED: this file and its format may change and/or
+% may be removed in a future release
+! access-bridge-64.jar
+com/sun/java/accessibility/
+! cldrdata.jar
+sun/text
+sun/util
+# dnsns.jar
+META-INF/services/sun.net.spi.nameservice.NameServiceDescriptor
+sun/net
+! jaccess.jar
+com/sun/java/accessibility/
+# localedata.jar
+sun/text
+sun/util
+# nashorn.jar
+jdk/nashorn
+META-INF/services/javax.script.ScriptEngineFactory
+jdk/internal
+# sunec.jar
+sun/security
+META-INF/ORACLE_J.RSA
+META-INF/ORACLE_J.SF
+# sunjce_provider.jar
+com/sun/crypto/
+META-INF/ORACLE_J.RSA
+META-INF/ORACLE_J.SF
+# sunmscapi.jar
+sun/security
+META-INF/ORACLE_J.RSA
+META-INF/ORACLE_J.SF
+# sunpkcs11.jar
+sun/security
+META-INF/ORACLE_J.RSA
+META-INF/ORACLE_J.SF
+# zipfs.jar
+META-INF/services/java.nio.file.spi.FileSystemProvider
+com/sun/nio/
+# jfxrt.jar
+META-INF/INDEX.LIST
+com/sun/deploy/uitoolkit/impl/fx/
+com/sun/glass/events/
+com/sun/glass/ui/
+com/sun/glass/utils/
+com/sun/javafx/
+com/sun/media/jfxmedia/
+com/sun/media/jfxmediaimpl/
+com/sun/openpisces/
+com/sun/pisces/
+com/sun/prism/
+com/sun/scenario/
+com/sun/webkit/
+javafx/animation/
+javafx/application/
+javafx/beans/
+javafx/collections/
+javafx/concurrent/
+javafx/css/
+javafx/embed/swing/
+javafx/event/
+javafx/fxml/
+javafx/geometry/
+javafx/print/
+javafx/scene/
+javafx/stage/
+javafx/util/
+netscape/javascript/
diff --git a/grid/jre/lib/ext/nashorn.jar b/grid/jre/lib/ext/nashorn.jar
new file mode 100644
index 0000000..aa0e05f
--- /dev/null
+++ b/grid/jre/lib/ext/nashorn.jar
Binary files differ
diff --git a/grid/jre/lib/ext/sunec.jar b/grid/jre/lib/ext/sunec.jar
new file mode 100644
index 0000000..4957670
--- /dev/null
+++ b/grid/jre/lib/ext/sunec.jar
Binary files differ
diff --git a/grid/jre/lib/ext/sunjce_provider.jar b/grid/jre/lib/ext/sunjce_provider.jar
new file mode 100644
index 0000000..732babb
--- /dev/null
+++ b/grid/jre/lib/ext/sunjce_provider.jar
Binary files differ
diff --git a/grid/jre/lib/ext/sunmscapi.jar b/grid/jre/lib/ext/sunmscapi.jar
new file mode 100644
index 0000000..b2c3e34
--- /dev/null
+++ b/grid/jre/lib/ext/sunmscapi.jar
Binary files differ
diff --git a/grid/jre/lib/ext/sunpkcs11.jar b/grid/jre/lib/ext/sunpkcs11.jar
new file mode 100644
index 0000000..b20ae79
--- /dev/null
+++ b/grid/jre/lib/ext/sunpkcs11.jar
Binary files differ
diff --git a/grid/jre/lib/ext/zipfs.jar b/grid/jre/lib/ext/zipfs.jar
new file mode 100644
index 0000000..92ca552
--- /dev/null
+++ b/grid/jre/lib/ext/zipfs.jar
Binary files differ
diff --git a/grid/jre/lib/flavormap.properties b/grid/jre/lib/flavormap.properties
new file mode 100644
index 0000000..c80f1cf
--- /dev/null
+++ b/grid/jre/lib/flavormap.properties
@@ -0,0 +1,77 @@
+#
+# This properties file is used to initialize the default
+# java.awt.datatransfer.SystemFlavorMap. It contains the Win32 platform-
+# specific, default mappings between common Win32 Clipboard atoms and platform-
+# independent MIME type strings, which will be converted into
+# java.awt.datatransfer.DataFlavors.
+#
+# These default mappings may be augmented by specifying the
+#
+# AWT.DnD.flavorMapFileURL
+#
+# property in the appropriate awt.properties file. The specified properties URL
+# will be loaded into the SystemFlavorMap.
+#
+# The standard format is:
+#
+# <native>=<MIME type>
+#
+# <native> should be a string identifier that the native platform will
+# recognize as a valid data format. <MIME type> should specify both a MIME
+# primary type and a MIME subtype separated by a '/'. The MIME type may include
+# parameters, where each parameter is a key/value pair separated by '=', and
+# where each parameter to the MIME type is separated by a ';'.
+#
+# Because SystemFlavorMap implements FlavorTable, developers are free to
+# duplicate both native keys and DataFlavor values. If a mapping contains a
+# duplicate key or value, earlier mappings which included this key or value
+# will be preferred.
+#
+# Mappings whose values specify DataFlavors with primary MIME types of
+# "text", and which support the charset parameter, should specify the exact
+# format in which the native platform expects the data. The "charset"
+# parameter specifies the char to byte encoding, the "eoln" parameter
+# specifies the end-of-line marker, and the "terminators" parameter specifies
+# the number of terminating NUL bytes. Note that "eoln" and "terminators"
+# are not standardized MIME type parameters. They are specific to this file
+# format ONLY. They will not appear in any of the DataFlavors returned by the
+# SystemFlavorMap at the Java level.
+#
+# If the "charset" parameter is omitted, or has zero length, the platform
+# default encoding is assumed. If the "eoln" parameter is omitted, or has
+# zero length, "\n" is assumed. If the "terminators" parameter is omitted,
+# or has a value less than zero, zero is assumed.
+#
+# Upon initialization, the data transfer subsystem will record the specified
+# details of the native text format, but the default SystemFlavorMap will
+# present a large set of synthesized DataFlavors which map, in both
+# directions, to the native. After receiving data from the application in one
+# of the synthetic DataFlavors, the data transfer subsystem will transform
+# the data stream into the format specified in this file before passing the
+# transformed stream to the native system.
+#
+# Mappings whose values specify DataFlavors with primary MIME types of
+# "text", but which do not support the charset parameter, will be treated as
+# opaque, 8-bit data. They will not undergo any transformation process, and
+# any "charset", "eoln", or "terminators" parameters specified in this file
+# will be ignored.
+#
+# See java.awt.datatransfer.DataFlavor.selectBestTextFlavor for a list of
+# text flavors which support the charset parameter.
+
+UNICODE\ TEXT=text/plain;charset=utf-16le;eoln="\r\n";terminators=2
+TEXT=text/plain;eoln="\r\n";terminators=1
+HTML\ Format=text/html;charset=utf-8;eoln="\r\n";terminators=1
+Rich\ Text\ Format=text/rtf
+HDROP=application/x-java-file-list;class=java.util.List
+PNG=image/x-java-image;class=java.awt.Image
+JFIF=image/x-java-image;class=java.awt.Image
+DIB=image/x-java-image;class=java.awt.Image
+ENHMETAFILE=image/x-java-image;class=java.awt.Image
+METAFILEPICT=image/x-java-image;class=java.awt.Image
+LOCALE=application/x-java-text-encoding;class="[B"
+UniformResourceLocator=application/x-java-url;class=java.net.URL
+UniformResourceLocator=text/uri-list;eoln="\r\n";terminators=1
+UniformResourceLocator=text/plain;eoln="\r\n";terminators=1
+FileGroupDescriptorW=application/x-java-file-list;class=java.util.List
+FileGroupDescriptor=application/x-java-file-list;class=java.util.List
diff --git a/grid/jre/lib/fontconfig.bfc b/grid/jre/lib/fontconfig.bfc
new file mode 100644
index 0000000..f04d529
--- /dev/null
+++ b/grid/jre/lib/fontconfig.bfc
Binary files differ
diff --git a/grid/jre/lib/fontconfig.properties.src b/grid/jre/lib/fontconfig.properties.src
new file mode 100644
index 0000000..c84d0ef
--- /dev/null
+++ b/grid/jre/lib/fontconfig.properties.src
@@ -0,0 +1,302 @@
+#
+#
+# Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+
+# Version
+
+version=1
+
+# Component Font Mappings
+
+allfonts.chinese-ms936=SimSun
+allfonts.chinese-ms936-extb=SimSun-ExtB
+allfonts.chinese-gb18030=SimSun-18030
+allfonts.chinese-gb18030-extb=SimSun-ExtB
+allfonts.chinese-hkscs=MingLiU_HKSCS
+allfonts.chinese-ms950-extb=MingLiU-ExtB
+allfonts.devanagari=Mangal
+allfonts.dingbats=Wingdings
+allfonts.lucida=Lucida Sans Regular
+allfonts.symbol=Symbol
+allfonts.symbols=Segoe UI Symbol
+allfonts.thai=Lucida Sans Regular
+allfonts.georgian=Sylfaen
+
+serif.plain.alphabetic=Times New Roman
+serif.plain.chinese-ms950=MingLiU
+serif.plain.chinese-ms950-extb=MingLiU-ExtB
+serif.plain.hebrew=David
+serif.plain.japanese=MS Mincho
+serif.plain.korean=Batang
+
+serif.bold.alphabetic=Times New Roman Bold
+serif.bold.chinese-ms950=PMingLiU
+serif.bold.chinese-ms950-extb=PMingLiU-ExtB
+serif.bold.hebrew=David Bold
+serif.bold.japanese=MS Mincho
+serif.bold.korean=Batang
+
+serif.italic.alphabetic=Times New Roman Italic
+serif.italic.chinese-ms950=PMingLiU
+serif.italic.chinese-ms950-extb=PMingLiU-ExtB
+serif.italic.hebrew=David
+serif.italic.japanese=MS Mincho
+serif.italic.korean=Batang
+
+serif.bolditalic.alphabetic=Times New Roman Bold Italic
+serif.bolditalic.chinese-ms950=PMingLiU
+serif.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
+serif.bolditalic.hebrew=David Bold
+serif.bolditalic.japanese=MS Mincho
+serif.bolditalic.korean=Batang
+
+sansserif.plain.alphabetic=Arial
+sansserif.plain.chinese-ms950=MingLiU
+sansserif.plain.chinese-ms950-extb=MingLiU-ExtB
+sansserif.plain.hebrew=David
+sansserif.plain.japanese=MS Gothic
+sansserif.plain.korean=Gulim
+
+sansserif.bold.alphabetic=Arial Bold
+sansserif.bold.chinese-ms950=PMingLiU
+sansserif.bold.chinese-ms950-extb=PMingLiU-ExtB
+sansserif.bold.hebrew=David Bold
+sansserif.bold.japanese=MS Gothic
+sansserif.bold.korean=Gulim
+
+sansserif.italic.alphabetic=Arial Italic
+sansserif.italic.chinese-ms950=PMingLiU
+sansserif.italic.chinese-ms950-extb=PMingLiU-ExtB
+sansserif.italic.hebrew=David
+sansserif.italic.japanese=MS Gothic
+sansserif.italic.korean=Gulim
+
+sansserif.bolditalic.alphabetic=Arial Bold Italic
+sansserif.bolditalic.chinese-ms950=PMingLiU
+sansserif.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
+sansserif.bolditalic.hebrew=David Bold
+sansserif.bolditalic.japanese=MS Gothic
+sansserif.bolditalic.korean=Gulim
+
+monospaced.plain.alphabetic=Courier New
+monospaced.plain.chinese-ms950=MingLiU
+monospaced.plain.chinese-ms950-extb=MingLiU-ExtB
+monospaced.plain.hebrew=Courier New
+monospaced.plain.japanese=MS Gothic
+monospaced.plain.korean=GulimChe
+
+monospaced.bold.alphabetic=Courier New Bold
+monospaced.bold.chinese-ms950=PMingLiU
+monospaced.bold.chinese-ms950-extb=PMingLiU-ExtB
+monospaced.bold.hebrew=Courier New Bold
+monospaced.bold.japanese=MS Gothic
+monospaced.bold.korean=GulimChe
+
+monospaced.italic.alphabetic=Courier New Italic
+monospaced.italic.chinese-ms950=PMingLiU
+monospaced.italic.chinese-ms950-extb=PMingLiU-ExtB
+monospaced.italic.hebrew=Courier New
+monospaced.italic.japanese=MS Gothic
+monospaced.italic.korean=GulimChe
+
+monospaced.bolditalic.alphabetic=Courier New Bold Italic
+monospaced.bolditalic.chinese-ms950=PMingLiU
+monospaced.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
+monospaced.bolditalic.hebrew=Courier New Bold
+monospaced.bolditalic.japanese=MS Gothic
+monospaced.bolditalic.korean=GulimChe
+
+dialog.plain.alphabetic=Arial
+dialog.plain.chinese-ms950=MingLiU
+dialog.plain.chinese-ms950-extb=MingLiU-ExtB
+dialog.plain.hebrew=David
+dialog.plain.japanese=MS Gothic
+dialog.plain.korean=Gulim
+
+dialog.bold.alphabetic=Arial Bold
+dialog.bold.chinese-ms950=PMingLiU
+dialog.bold.chinese-ms950-extb=PMingLiU-ExtB
+dialog.bold.hebrew=David Bold
+dialog.bold.japanese=MS Gothic
+dialog.bold.korean=Gulim
+
+dialog.italic.alphabetic=Arial Italic
+dialog.italic.chinese-ms950=PMingLiU
+dialog.italic.chinese-ms950-extb=PMingLiU-ExtB
+dialog.italic.hebrew=David
+dialog.italic.japanese=MS Gothic
+dialog.italic.korean=Gulim
+
+dialog.bolditalic.alphabetic=Arial Bold Italic
+dialog.bolditalic.chinese-ms950=PMingLiU
+dialog.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
+dialog.bolditalic.hebrew=David Bold
+dialog.bolditalic.japanese=MS Gothic
+dialog.bolditalic.korean=Gulim
+
+dialoginput.plain.alphabetic=Courier New
+dialoginput.plain.chinese-ms950=MingLiU
+dialoginput.plain.chinese-ms950-extb=MingLiU-ExtB
+dialoginput.plain.hebrew=David
+dialoginput.plain.japanese=MS Gothic
+dialoginput.plain.korean=Gulim
+
+dialoginput.bold.alphabetic=Courier New Bold
+dialoginput.bold.chinese-ms950=PMingLiU
+dialoginput.bold.chinese-ms950-extb=PMingLiU-ExtB
+dialoginput.bold.hebrew=David Bold
+dialoginput.bold.japanese=MS Gothic
+dialoginput.bold.korean=Gulim
+
+dialoginput.italic.alphabetic=Courier New Italic
+dialoginput.italic.chinese-ms950=PMingLiU
+dialoginput.italic.chinese-ms950-extb=PMingLiU-ExtB
+dialoginput.italic.hebrew=David
+dialoginput.italic.japanese=MS Gothic
+dialoginput.italic.korean=Gulim
+
+dialoginput.bolditalic.alphabetic=Courier New Bold Italic
+dialoginput.bolditalic.chinese-ms950=PMingLiU
+dialoginput.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
+dialoginput.bolditalic.hebrew=David Bold
+dialoginput.bolditalic.japanese=MS Gothic
+dialoginput.bolditalic.korean=Gulim
+
+# Search Sequences
+
+sequence.allfonts=alphabetic/default,dingbats,symbol
+
+sequence.serif.GBK=alphabetic,chinese-ms936,dingbats,symbol,chinese-ms936-extb
+sequence.sansserif.GBK=alphabetic,chinese-ms936,dingbats,symbol,chinese-ms936-extb
+sequence.monospaced.GBK=chinese-ms936,alphabetic,dingbats,symbol,chinese-ms936-extb
+sequence.dialog.GBK=alphabetic,chinese-ms936,dingbats,symbol,chinese-ms936-extb
+sequence.dialoginput.GBK=alphabetic,chinese-ms936,dingbats,symbol,chinese-ms936-extb
+
+sequence.serif.GB18030=alphabetic,chinese-gb18030,dingbats,symbol,chinese-gb18030-extb
+sequence.sansserif.GB18030=alphabetic,chinese-gb18030,dingbats,symbol,chinese-gb18030-extb
+sequence.monospaced.GB18030=chinese-gb18030,alphabetic,dingbats,symbol,chinese-gb18030-extb
+sequence.dialog.GB18030=alphabetic,chinese-gb18030,dingbats,symbol,chinese-gb18030-extb
+sequence.dialoginput.GB18030=alphabetic,chinese-gb18030,dingbats,symbol,chinese-gb18030-extb
+
+sequence.serif.x-windows-950=alphabetic,chinese-ms950,dingbats,symbol,chinese-ms950-extb
+sequence.sansserif.x-windows-950=alphabetic,chinese-ms950,dingbats,symbol,chinese-ms950-extb
+sequence.monospaced.x-windows-950=chinese-ms950,alphabetic,dingbats,symbol,chinese-ms950-extb
+sequence.dialog.x-windows-950=alphabetic,chinese-ms950,dingbats,symbol,chinese-ms950-extb
+sequence.dialoginput.x-windows-950=alphabetic,chinese-ms950,dingbats,symbol,chinese-ms950-extb
+
+sequence.serif.x-MS950-HKSCS=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+sequence.sansserif.x-MS950-HKSCS=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+sequence.monospaced.x-MS950-HKSCS=chinese-ms950,alphabetic,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+sequence.dialog.x-MS950-HKSCS=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+sequence.dialoginput.x-MS950-HKSCS=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+
+sequence.serif.x-MS950-HKSCS-XP=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+sequence.sansserif.x-MS950-HKSCS-XP=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+sequence.monospaced.x-MS950-HKSCS-XP=chinese-ms950,alphabetic,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+sequence.dialog.x-MS950-HKSCS-XP=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+sequence.dialoginput.x-MS950-HKSCS-XP=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+
+sequence.allfonts.UTF-8.hi=alphabetic/1252,devanagari,dingbats,symbol
+sequence.allfonts.UTF-8.ja=alphabetic,japanese,devanagari,dingbats,symbol
+
+sequence.allfonts.windows-1255=hebrew,alphabetic/1252,dingbats,symbol
+
+sequence.serif.windows-31j=alphabetic,japanese,dingbats,symbol
+sequence.sansserif.windows-31j=alphabetic,japanese,dingbats,symbol
+sequence.monospaced.windows-31j=japanese,alphabetic,dingbats,symbol
+sequence.dialog.windows-31j=alphabetic,japanese,dingbats,symbol
+sequence.dialoginput.windows-31j=alphabetic,japanese,dingbats,symbol
+
+sequence.serif.x-windows-949=alphabetic,korean,dingbats,symbol
+sequence.sansserif.x-windows-949=alphabetic,korean,dingbats,symbol
+sequence.monospaced.x-windows-949=korean,alphabetic,dingbats,symbol
+sequence.dialog.x-windows-949=alphabetic,korean,dingbats,symbol
+sequence.dialoginput.x-windows-949=alphabetic,korean,dingbats,symbol
+
+sequence.allfonts.x-windows-874=alphabetic,thai,dingbats,symbol
+
+sequence.fallback=lucida,symbols,\
+ chinese-ms950,chinese-hkscs,chinese-ms936,chinese-gb18030,\
+ japanese,korean,chinese-ms950-extb,chinese-ms936-extb,georgian
+
+# Exclusion Ranges
+
+exclusion.alphabetic=0700-1cff,1d80-1e9f,1f00-2017,2020-20ab,20ad-f8ff
+exclusion.chinese-gb18030=0390-03d6,2200-22ef,2701-27be
+exclusion.hebrew=0041-005a,0060-007a,007f-00ff,20ac-20ac
+
+# Monospaced to Proportional width variant mapping
+# (Experimental private syntax)
+proportional.MS_Gothic=MS PGothic
+proportional.MS_Mincho=MS PMincho
+proportional.MingLiU=PMingLiU
+proportional.MingLiU-ExtB=PMingLiU-ExtB
+
+# Font File Names
+
+filename.Arial=ARIAL.TTF
+filename.Arial_Bold=ARIALBD.TTF
+filename.Arial_Italic=ARIALI.TTF
+filename.Arial_Bold_Italic=ARIALBI.TTF
+
+filename.Courier_New=COUR.TTF
+filename.Courier_New_Bold=COURBD.TTF
+filename.Courier_New_Italic=COURI.TTF
+filename.Courier_New_Bold_Italic=COURBI.TTF
+
+filename.Times_New_Roman=TIMES.TTF
+filename.Times_New_Roman_Bold=TIMESBD.TTF
+filename.Times_New_Roman_Italic=TIMESI.TTF
+filename.Times_New_Roman_Bold_Italic=TIMESBI.TTF
+
+filename.SimSun=SIMSUN.TTC
+filename.SimSun-18030=SIMSUN18030.TTC
+filename.SimSun-ExtB=SIMSUNB.TTF
+
+filename.MingLiU=MINGLIU.TTC
+filename.MingLiU-ExtB=MINGLIUB.TTC
+filename.PMingLiU=MINGLIU.TTC
+filename.PMingLiU-ExtB=MINGLIUB.TTC
+filename.MingLiU_HKSCS=hkscsm3u.ttf
+
+filename.David=DAVID.TTF
+filename.David_Bold=DAVIDBD.TTF
+
+filename.MS_Mincho=MSMINCHO.TTC
+filename.MS_PMincho=MSMINCHO.TTC
+filename.MS_Gothic=MSGOTHIC.TTC
+filename.MS_PGothic=MSGOTHIC.TTC
+
+filename.Gulim=gulim.TTC
+filename.Batang=batang.TTC
+filename.GulimChe=gulim.TTC
+
+filename.Lucida_Sans_Regular=LucidaSansRegular.ttf
+filename.Mangal=MANGAL.TTF
+filename.Symbol=SYMBOL.TTF
+filename.Wingdings=WINGDING.TTF
+
+filename.Sylfaen=sylfaen.ttf
+filename.Segoe_UI_Symbol=SEGUISYM.TTF
diff --git a/grid/jre/lib/fonts/LucidaBrightDemiBold.ttf b/grid/jre/lib/fonts/LucidaBrightDemiBold.ttf
new file mode 100644
index 0000000..8073c35
--- /dev/null
+++ b/grid/jre/lib/fonts/LucidaBrightDemiBold.ttf
Binary files differ
diff --git a/grid/jre/lib/fonts/LucidaBrightDemiItalic.ttf b/grid/jre/lib/fonts/LucidaBrightDemiItalic.ttf
new file mode 100644
index 0000000..bae8c67
--- /dev/null
+++ b/grid/jre/lib/fonts/LucidaBrightDemiItalic.ttf
Binary files differ
diff --git a/grid/jre/lib/fonts/LucidaBrightItalic.ttf b/grid/jre/lib/fonts/LucidaBrightItalic.ttf
new file mode 100644
index 0000000..c26afa3
--- /dev/null
+++ b/grid/jre/lib/fonts/LucidaBrightItalic.ttf
Binary files differ
diff --git a/grid/jre/lib/fonts/LucidaBrightRegular.ttf b/grid/jre/lib/fonts/LucidaBrightRegular.ttf
new file mode 100644
index 0000000..79738f1
--- /dev/null
+++ b/grid/jre/lib/fonts/LucidaBrightRegular.ttf
Binary files differ
diff --git a/grid/jre/lib/fonts/LucidaSansDemiBold.ttf b/grid/jre/lib/fonts/LucidaSansDemiBold.ttf
new file mode 100644
index 0000000..a15910e
--- /dev/null
+++ b/grid/jre/lib/fonts/LucidaSansDemiBold.ttf
Binary files differ
diff --git a/grid/jre/lib/fonts/LucidaSansRegular.ttf b/grid/jre/lib/fonts/LucidaSansRegular.ttf
new file mode 100644
index 0000000..4cabe6e
--- /dev/null
+++ b/grid/jre/lib/fonts/LucidaSansRegular.ttf
Binary files differ
diff --git a/grid/jre/lib/fonts/LucidaTypewriterBold.ttf b/grid/jre/lib/fonts/LucidaTypewriterBold.ttf
new file mode 100644
index 0000000..ac66d4f
--- /dev/null
+++ b/grid/jre/lib/fonts/LucidaTypewriterBold.ttf
Binary files differ
diff --git a/grid/jre/lib/fonts/LucidaTypewriterRegular.ttf b/grid/jre/lib/fonts/LucidaTypewriterRegular.ttf
new file mode 100644
index 0000000..0295184
--- /dev/null
+++ b/grid/jre/lib/fonts/LucidaTypewriterRegular.ttf
Binary files differ
diff --git a/grid/jre/lib/hijrah-config-umalqura.properties b/grid/jre/lib/hijrah-config-umalqura.properties
new file mode 100644
index 0000000..e45ac32
--- /dev/null
+++ b/grid/jre/lib/hijrah-config-umalqura.properties
@@ -0,0 +1,369 @@
+# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+# This properties file defines a Hijrah calendar variant.
+#
+# Fields:
+#
+# <version> ::= 'version' '=' <version string>
+# <id> ::= 'id' '=' <id string>
+# <type> ::= 'type' '=' <type string>
+# <iso-start> ::= 'iso-start' '=' <start date in the ISO calendar>
+# <year> ::= <yyyy> '=' <nn nn nn nn nn nn nn nn nn nn nn nn>
+#
+# version ... (Required)
+#
+# id ... (Required)
+# Identifies the Java Chronology
+#
+# type ... (Required)
+# Identifies the type of calendar in the standard calendar ID scheme
+# iso-start ... (Required)
+# Specifies the corresponding ISO date to the first Hijrah day
+# in the defined range of dates
+#
+# year ... (Required)
+# Number of days for each month of a Hijrah year
+# * Each line defines a year. The years must be in chronological
+# order and no gap is allowed.
+# * Each line is in the form indicated above. <yyyy> is a Hijrah year and
+# nn is the number of days for a month listed in the order of the months.
+# * Each year must have 12 months.
+# * Each month should be 29 or 30 days long.
+# * There must be one or more space characters between the months.
+#
+
+# Version of this definition
+version=1.8.0_1
+
+# Java chronology ID
+id=Hijrah-umalqura
+
+# Standard calendar type specification
+type=islamic-umalqura
+
+# defines the corresponding ISO date to the earliest Hijrah date
+iso-start=1882-11-12
+
+# 1 2 3 4 5 6 7 8 9 10 11 12
+1300=30 29 30 29 30 29 30 29 30 29 30 29
+1301=30 30 29 30 29 30 29 30 29 30 29 29
+1302=30 30 30 29 30 30 29 29 30 29 29 30
+1303=29 30 30 29 30 30 29 30 29 30 29 29
+1304=29 30 30 29 30 30 30 29 30 29 30 29
+1305=29 29 30 30 29 30 30 29 30 30 29 29
+1306=30 29 30 29 30 29 30 29 30 30 29 30
+1307=29 30 29 30 29 30 29 30 29 30 29 30
+1308=29 30 30 29 30 29 30 29 30 29 29 30
+1309=29 30 30 30 30 29 29 30 29 29 30 29
+1310=30 29 30 30 30 29 30 29 30 29 29 30
+1311=29 30 29 30 30 30 29 30 29 30 29 29
+1312=30 29 30 29 30 30 29 30 30 29 30 29
+1313=29 30 29 30 29 30 29 30 30 30 29 29
+1314=30 30 29 30 29 29 30 29 30 30 29 30
+1315=29 30 30 29 30 29 29 30 29 30 29 30
+1316=29 30 30 30 29 30 29 29 30 29 30 29
+1317=30 29 30 30 29 30 29 30 29 30 29 29
+1318=30 29 30 30 29 30 30 29 30 29 30 29
+1319=29 30 29 30 30 29 30 29 30 30 29 30
+1320=29 30 29 29 30 29 30 29 30 30 30 29
+1321=30 29 30 29 29 30 29 29 30 30 30 30
+1322=29 30 29 30 29 29 29 30 29 30 30 30
+1323=29 30 30 29 30 29 29 29 30 29 30 30
+1324=29 30 30 29 30 29 30 29 29 30 29 30
+1325=30 29 30 29 30 30 29 30 29 30 29 30
+1326=29 29 30 29 30 30 29 30 29 30 30 29
+1327=30 29 29 30 29 30 29 30 30 29 30 30
+1328=29 30 29 29 30 29 29 30 30 30 29 30
+1329=30 29 30 29 29 30 29 29 30 30 29 30
+1330=30 30 29 30 29 29 30 29 29 30 30 29
+1331=30 30 29 30 30 29 29 30 29 30 29 30
+1332=29 30 29 30 30 29 30 29 30 30 29 29
+1333=30 29 29 30 30 29 30 30 29 30 30 29
+1334=29 29 30 29 30 29 30 30 30 29 30 29
+1335=30 29 30 29 29 30 29 30 30 29 30 30
+1336=29 30 29 30 29 29 30 29 30 29 30 30
+1337=30 29 30 29 30 29 29 30 29 30 29 30
+1338=29 30 30 29 30 30 29 29 30 29 30 29
+1339=30 29 30 29 30 30 30 29 30 29 29 30
+1340=29 29 30 29 30 30 30 30 29 30 29 29
+1341=30 29 29 30 29 30 30 30 29 30 30 29
+1342=29 29 30 29 30 29 30 30 29 30 30 29
+1343=30 29 29 30 29 30 29 30 29 30 30 29
+1344=30 29 30 29 30 30 29 29 30 29 30 29
+1345=30 29 30 30 30 29 30 29 29 30 29 29
+1346=30 29 30 30 30 30 29 30 29 29 30 29
+1347=29 30 29 30 30 30 29 30 30 29 29 30
+1348=29 29 30 29 30 30 29 30 30 30 29 29
+1349=30 29 29 30 29 30 30 29 30 30 29 30
+1350=29 30 29 30 29 30 29 29 30 30 29 30
+1351=30 29 30 29 30 29 30 29 29 30 29 30
+1352=30 29 30 30 29 30 29 30 29 29 30 29
+1353=30 29 30 30 30 29 30 29 29 30 29 30
+1354=29 30 29 30 30 29 30 30 29 30 29 29
+1355=30 29 29 30 30 29 30 30 29 30 30 29
+1356=29 30 29 30 29 30 29 30 29 30 30 30
+1357=29 29 30 29 30 29 29 30 29 30 30 30
+1358=29 30 29 30 29 30 29 29 30 29 30 30
+1359=29 30 30 29 30 29 30 29 29 29 30 30
+1360=29 30 30 30 29 30 29 30 29 29 30 29
+1361=30 29 30 30 29 30 30 29 29 30 29 30
+1362=29 30 29 30 29 30 30 29 30 29 30 29
+1363=30 29 30 29 30 29 30 29 30 29 30 30
+1364=29 30 29 30 29 29 30 29 30 29 30 30
+1365=30 30 29 29 30 29 29 30 29 30 29 30
+1366=30 30 29 30 29 30 29 29 30 29 30 29
+1367=30 30 29 30 30 29 30 29 29 30 29 30
+1368=29 30 29 30 30 30 29 29 30 29 30 29
+1369=30 29 30 29 30 30 29 30 29 30 30 29
+1370=30 29 29 30 29 30 29 30 29 30 30 30
+1371=29 30 29 29 30 29 30 29 30 29 30 30
+1372=30 29 29 30 29 30 29 29 30 29 30 30
+1373=30 29 30 29 30 29 30 29 29 30 29 30
+1374=30 29 30 30 29 30 29 30 29 29 30 29
+1375=30 29 30 30 29 30 30 29 30 29 30 29
+1376=29 30 29 30 29 30 30 30 29 30 29 30
+1377=29 29 30 29 29 30 30 30 29 30 30 29
+1378=30 29 29 29 30 29 30 30 29 30 30 30
+1379=29 30 29 29 29 30 29 30 30 29 30 30
+1380=29 30 29 30 29 30 29 30 29 30 29 30
+1381=29 30 29 30 30 29 30 29 30 29 29 30
+1382=29 30 29 30 30 29 30 30 29 30 29 29
+1383=30 29 29 30 30 30 29 30 30 29 30 29
+1384=29 30 29 29 30 30 29 30 30 30 29 30
+1385=29 29 30 29 29 30 30 29 30 30 30 29
+1386=30 29 29 30 29 29 30 30 29 30 30 29
+1387=30 29 30 29 30 29 30 29 30 29 30 29
+1388=30 30 29 30 29 30 29 30 29 30 29 29
+1389=30 30 29 30 30 29 30 30 29 29 30 29
+1390=29 30 29 30 30 30 29 30 29 30 29 30
+1391=29 29 30 29 30 30 29 30 30 29 30 29
+1392=30 29 29 30 29 30 29 30 30 29 30 30
+1393=29 30 29 29 30 29 30 29 30 29 30 30
+1394=30 29 30 29 29 30 29 30 29 30 29 30
+1395=30 29 30 30 29 30 29 29 30 29 29 30
+1396=30 29 30 30 29 30 30 29 29 30 29 29
+1397=30 29 30 30 29 30 30 30 29 29 29 30
+1398=29 30 29 30 30 29 30 30 29 30 29 29
+1399=30 29 30 29 30 29 30 30 29 30 29 30
+1400=30 29 30 29 29 30 29 30 29 30 29 30
+1401=30 30 29 30 29 29 30 29 29 30 29 30
+1402=30 30 30 29 30 29 29 30 29 29 30 29
+1403=30 30 30 29 30 30 29 29 30 29 29 30
+1404=29 30 30 29 30 30 29 30 29 30 29 29
+1405=30 29 30 29 30 30 30 29 30 29 29 30
+1406=30 29 29 30 29 30 30 29 30 29 30 30
+1407=29 30 29 29 30 29 30 29 30 29 30 30
+1408=30 29 30 29 30 29 29 30 29 29 30 30
+1409=30 30 29 30 29 30 29 29 30 29 29 30
+1410=30 30 29 30 30 29 30 29 29 30 29 29
+1411=30 30 29 30 30 29 30 30 29 29 30 29
+1412=30 29 30 29 30 29 30 30 30 29 29 30
+1413=29 30 29 29 30 29 30 30 30 29 30 29
+1414=30 29 30 29 29 30 29 30 30 29 30 30
+1415=29 30 29 30 29 29 30 29 30 29 30 30
+1416=30 29 30 29 30 29 29 30 29 30 29 30
+1417=30 29 30 30 29 29 30 29 30 29 30 29
+1418=30 29 30 30 29 30 29 30 29 30 29 30
+1419=29 30 29 30 29 30 29 30 30 30 29 29
+1420=29 30 29 29 30 29 30 30 30 30 29 30
+1421=29 29 30 29 29 29 30 30 30 30 29 30
+1422=30 29 29 30 29 29 29 30 30 30 29 30
+1423=30 29 30 29 30 29 29 30 29 30 29 30
+1424=30 29 30 30 29 30 29 29 30 29 30 29
+1425=30 29 30 30 29 30 29 30 30 29 30 29
+1426=29 30 29 30 29 30 30 29 30 30 29 30
+1427=29 29 30 29 30 29 30 30 29 30 30 29
+1428=30 29 29 30 29 29 30 30 30 29 30 30
+1429=29 30 29 29 30 29 29 30 30 29 30 30
+1430=29 30 30 29 29 30 29 30 29 30 29 30
+1431=29 30 30 29 30 29 30 29 30 29 29 30
+1432=29 30 30 30 29 30 29 30 29 30 29 29
+1433=30 29 30 30 29 30 30 29 30 29 30 29
+1434=29 30 29 30 29 30 30 29 30 30 29 29
+1435=30 29 30 29 30 29 30 29 30 30 29 30
+1436=29 30 29 30 29 30 29 30 29 30 29 30
+1437=30 29 30 30 29 29 30 29 30 29 29 30
+1438=30 29 30 30 30 29 29 30 29 29 30 29
+1439=30 29 30 30 30 29 30 29 30 29 29 30
+1440=29 30 29 30 30 30 29 30 29 30 29 29
+1441=30 29 30 29 30 30 29 30 30 29 30 29
+1442=29 30 29 30 29 30 29 30 30 29 30 29
+1443=30 29 30 29 30 29 30 29 30 29 30 30
+1444=29 30 29 30 30 29 29 30 29 30 29 30
+1445=29 30 30 30 29 30 29 29 30 29 29 30
+1446=29 30 30 30 29 30 30 29 29 30 29 29
+1447=30 29 30 30 30 29 30 29 30 29 30 29
+1448=29 30 29 30 30 29 30 30 29 30 29 30
+1449=29 29 30 29 30 29 30 30 29 30 30 29
+1450=30 29 30 29 29 30 29 30 29 30 30 29
+1451=30 30 30 29 29 30 29 29 30 30 29 30
+1452=30 29 30 30 29 29 30 29 29 30 29 30
+1453=30 29 30 30 29 30 29 30 29 29 30 29
+1454=30 29 30 30 29 30 30 29 30 29 30 29
+1455=29 30 29 30 30 29 30 29 30 30 29 30
+1456=29 29 30 29 30 29 30 29 30 30 30 29
+1457=30 29 29 30 29 29 30 29 30 30 30 30
+1458=29 30 29 29 30 29 29 30 29 30 30 30
+1459=29 30 30 29 29 30 29 29 30 29 30 30
+1460=29 30 30 29 30 29 30 29 29 30 29 30
+1461=29 30 30 29 30 29 30 29 30 30 29 29
+1462=30 29 30 29 30 30 29 30 29 30 30 29
+1463=29 30 29 30 29 30 29 30 30 30 29 30
+1464=29 30 29 29 30 29 29 30 30 30 29 30
+1465=30 29 30 29 29 30 29 29 30 30 29 30
+1466=30 30 29 30 29 29 29 30 29 30 30 29
+1467=30 30 29 30 30 29 29 30 29 30 29 30
+1468=29 30 29 30 30 29 30 29 30 29 30 29
+1469=29 30 29 30 30 29 30 30 29 30 29 30
+1470=29 29 30 29 30 30 29 30 30 29 30 29
+1471=30 29 29 30 29 30 29 30 30 29 30 30
+1472=29 30 29 29 30 29 30 29 30 30 29 30
+1473=29 30 29 30 30 29 29 30 29 30 29 30
+1474=29 30 30 29 30 30 29 29 30 29 30 29
+1475=29 30 30 29 30 30 30 29 29 30 29 29
+1476=30 29 30 29 30 30 30 29 30 29 30 29
+1477=29 30 29 29 30 30 30 30 29 30 29 30
+1478=29 29 30 29 30 29 30 30 29 30 30 29
+1479=30 29 29 30 29 30 29 30 29 30 30 29
+1480=30 29 30 29 30 29 30 29 30 29 30 29
+1481=30 29 30 30 29 30 29 30 29 30 29 29
+1482=30 29 30 30 30 30 29 30 29 29 30 29
+1483=29 30 29 30 30 30 29 30 30 29 29 30
+1484=29 29 30 29 30 30 30 29 30 29 30 29
+1485=30 29 29 30 29 30 30 29 30 30 29 30
+1486=29 30 29 29 30 29 30 29 30 30 29 30
+1487=30 29 30 29 30 29 29 30 29 30 29 30
+1488=30 29 30 30 29 30 29 29 30 29 30 29
+1489=30 29 30 30 30 29 30 29 29 30 29 30
+1490=29 30 29 30 30 29 30 30 29 29 30 29
+1491=30 29 29 30 30 29 30 30 29 30 29 30
+1492=29 30 29 29 30 30 29 30 29 30 30 29
+1493=30 29 30 29 30 29 29 30 29 30 30 30
+1494=29 30 29 30 29 30 29 29 29 30 30 30
+1495=29 30 30 29 30 29 29 30 29 29 30 30
+1496=29 30 30 30 29 30 29 29 30 29 29 30
+1497=30 29 30 30 29 30 29 30 29 30 29 30
+1498=29 30 29 30 29 30 30 29 30 29 30 29
+1499=30 29 30 29 29 30 30 29 30 29 30 30
+1500=29 30 29 30 29 29 30 29 30 29 30 30
+1501=30 29 30 29 30 29 29 29 30 29 30 30
+1502=30 30 29 30 29 30 29 29 29 30 30 29
+1503=30 30 29 30 30 29 30 29 29 29 30 30
+1504=29 30 29 30 30 30 29 29 30 29 30 29
+1505=30 29 30 29 30 30 29 30 29 30 30 29
+1506=29 30 29 29 30 30 29 30 30 29 30 30
+1507=29 29 30 29 29 30 30 29 30 29 30 30
+1508=30 29 29 30 29 30 29 29 30 29 30 30
+1509=30 29 30 29 30 29 30 29 29 30 29 30
+1510=30 29 30 30 29 30 29 30 29 29 30 29
+1511=30 29 30 30 29 30 30 29 30 29 29 30
+1512=29 30 29 30 29 30 30 30 29 30 29 30
+1513=29 29 29 30 29 30 30 30 29 30 30 29
+1514=30 29 29 29 30 29 30 30 29 30 30 30
+1515=29 29 30 29 29 30 29 30 30 29 30 30
+1516=29 30 29 30 29 29 30 29 30 29 30 30
+1517=29 30 29 30 29 30 30 29 29 30 29 30
+1518=29 30 29 30 30 29 30 30 29 30 29 29
+1519=30 29 29 30 30 30 29 30 30 29 30 29
+1520=29 30 29 29 30 30 30 29 30 30 29 30
+1521=29 29 29 30 29 30 30 29 30 30 29 30
+1522=30 29 29 29 30 29 30 30 29 30 30 29
+1523=30 29 30 29 30 29 30 29 29 30 30 29
+1524=30 30 29 30 29 30 29 30 29 29 30 29
+1525=30 30 29 30 30 29 30 29 30 29 29 30
+1526=29 30 29 30 30 30 29 30 29 30 29 29
+1527=30 29 30 29 30 30 29 30 30 29 30 29
+1528=30 29 29 30 29 30 29 30 30 29 30 30
+1529=29 30 29 29 30 29 30 29 30 29 30 30
+1530=29 30 30 29 29 30 29 30 29 29 30 30
+1531=29 30 30 30 29 29 30 29 30 29 29 30
+1532=29 30 30 30 29 30 30 29 29 29 30 29
+1533=30 29 30 30 30 29 30 29 30 29 29 30
+1534=29 30 29 30 30 29 30 30 29 29 30 29
+1535=30 29 30 29 30 29 30 30 29 30 29 30
+1536=29 30 29 30 29 30 29 30 29 30 29 30
+1537=30 29 30 30 29 29 30 29 29 30 29 30
+1538=30 30 29 30 30 29 29 30 29 29 30 29
+1539=30 30 30 29 30 30 29 29 30 29 29 30
+1540=29 30 30 29 30 30 29 30 29 29 30 29
+1541=30 29 30 29 30 30 30 29 30 29 29 30
+1542=29 30 29 30 29 30 30 29 30 29 30 30
+1543=29 30 29 29 30 29 30 29 30 29 30 30
+1544=30 29 30 29 29 30 29 30 29 30 29 30
+1545=30 30 29 30 29 29 30 29 30 29 29 30
+1546=30 30 29 30 29 30 29 30 29 30 29 29
+1547=30 30 29 30 30 29 30 29 30 29 30 29
+1548=30 29 29 30 30 29 30 30 29 30 29 30
+1549=29 30 29 29 30 29 30 30 30 29 30 29
+1550=30 29 30 29 29 29 30 30 30 29 30 30
+1551=29 30 29 29 30 29 29 30 30 29 30 30
+1552=30 29 30 29 29 30 29 29 30 30 29 30
+1553=30 29 30 29 30 29 30 29 30 29 30 29
+1554=30 29 30 29 30 30 29 30 29 30 29 30
+1555=29 29 30 29 30 30 29 30 30 29 30 29
+1556=30 29 29 30 29 30 29 30 30 30 29 30
+1557=29 30 29 29 29 30 29 30 30 30 30 29
+1558=30 29 30 29 29 29 30 29 30 30 30 29
+1559=30 30 29 29 30 29 29 30 30 29 30 29
+1560=30 30 29 30 29 30 29 30 29 30 29 30
+1561=29 30 30 29 30 29 30 30 29 29 30 29
+1562=29 30 30 29 30 29 30 30 30 29 29 30
+1563=29 30 29 29 30 29 30 30 30 29 30 29
+1564=30 29 30 29 29 30 29 30 30 30 29 30
+1565=29 30 29 30 29 29 30 29 30 30 29 30
+1566=30 29 30 29 30 29 29 30 29 30 29 30
+1567=30 29 30 30 29 30 29 30 29 29 30 29
+1568=30 29 30 30 30 29 30 29 30 29 29 29
+1569=30 29 30 30 30 29 30 30 29 30 29 29
+1570=29 30 29 30 30 29 30 30 30 29 29 30
+1571=29 29 30 29 30 30 29 30 30 29 30 29
+1572=30 29 29 30 29 30 29 30 30 29 30 29
+1573=30 29 30 30 29 30 29 29 30 29 30 29
+1574=30 30 29 30 30 29 30 29 29 30 29 29
+1575=30 30 30 29 30 30 29 30 29 29 29 30
+1576=29 30 30 29 30 30 30 29 30 29 29 29
+1577=30 29 30 30 29 30 30 29 30 29 30 29
+1578=29 30 29 30 29 30 30 29 30 30 29 30
+1579=29 30 29 30 29 29 30 30 29 30 29 30
+1580=29 30 30 29 30 29 29 30 29 30 29 30
+1581=30 30 29 30 29 30 29 29 30 29 30 29
+1582=30 30 29 30 30 29 30 29 30 29 29 29
+1583=30 30 29 30 30 30 29 30 29 30 29 29
+1584=29 30 30 29 30 30 29 30 30 29 30 29
+1585=29 30 29 30 29 30 29 30 30 29 30 30
+1586=29 29 30 29 30 29 29 30 30 30 29 30
+1587=29 30 30 29 29 29 30 29 30 29 30 30
+1588=30 29 30 30 29 29 29 30 29 30 29 30
+1589=30 29 30 30 29 30 29 29 30 29 30 29
+1590=30 29 30 30 30 29 29 30 29 30 29 30
+1591=29 30 29 30 30 29 30 29 30 29 30 29
+1592=30 29 30 29 30 29 30 29 30 30 30 29
+1593=30 29 29 30 29 29 30 29 30 30 30 29
+1594=30 30 29 29 30 29 29 29 30 30 30 30
+1595=29 30 29 30 29 29 30 29 29 30 30 30
+1596=29 30 30 29 30 29 29 30 29 30 29 30
+1597=29 30 30 29 30 29 30 29 30 29 30 29
+1598=30 29 30 29 30 30 29 30 29 30 30 29
+1599=29 30 29 30 29 30 29 30 30 30 29 30
+1600=29 29 30 29 30 29 29 30 30 30 29 30
diff --git a/grid/jre/lib/images/cursors/cursors.properties b/grid/jre/lib/images/cursors/cursors.properties
new file mode 100644
index 0000000..77ce925
--- /dev/null
+++ b/grid/jre/lib/images/cursors/cursors.properties
@@ -0,0 +1,40 @@
+#
+#
+# Cursors Properties file
+#
+# Names GIF89 sources for Custom Cursors and their associated HotSpots
+#
+# Note: the syntax of the property name is significant and is parsed
+# by java.awt.Cursor
+#
+# The syntax is: Cursor.<name>.<geom>.File=win32_<filename>
+# Cursor.<name>.<geom>.HotSpot=<x>,<y>
+# Cursor.<name>.<geom>.Name=<localized name>
+#
+Cursor.CopyDrop.32x32.File=win32_CopyDrop32x32.gif
+Cursor.CopyDrop.32x32.HotSpot=0,0
+Cursor.CopyDrop.32x32.Name=CopyDrop32x32
+#
+Cursor.MoveDrop.32x32.File=win32_MoveDrop32x32.gif
+Cursor.MoveDrop.32x32.HotSpot=0,0
+Cursor.MoveDrop.32x32.Name=MoveDrop32x32
+#
+Cursor.LinkDrop.32x32.File=win32_LinkDrop32x32.gif
+Cursor.LinkDrop.32x32.HotSpot=0,0
+Cursor.LinkDrop.32x32.Name=LinkDrop32x32
+#
+Cursor.CopyNoDrop.32x32.File=win32_CopyNoDrop32x32.gif
+Cursor.CopyNoDrop.32x32.HotSpot=6,2
+Cursor.CopyNoDrop.32x32.Name=CopyNoDrop32x32
+#
+Cursor.MoveNoDrop.32x32.File=win32_MoveNoDrop32x32.gif
+Cursor.MoveNoDrop.32x32.HotSpot=6,2
+Cursor.MoveNoDrop.32x32.Name=MoveNoDrop32x32
+#
+Cursor.LinkNoDrop.32x32.File=win32_LinkNoDrop32x32.gif
+Cursor.LinkNoDrop.32x32.HotSpot=6,2
+Cursor.LinkNoDrop.32x32.Name=LinkNoDrop32x32
+#
+Cursor.Invalid.32x32.File=invalid32x32.gif
+Cursor.Invalid.32x32.HotSpot=6,2
+Cursor.Invalid.32x32.Name=Invalid32x32
diff --git a/grid/jre/lib/images/cursors/invalid32x32.gif b/grid/jre/lib/images/cursors/invalid32x32.gif
new file mode 100644
index 0000000..64c265d
--- /dev/null
+++ b/grid/jre/lib/images/cursors/invalid32x32.gif
Binary files differ
diff --git a/grid/jre/lib/images/cursors/win32_CopyDrop32x32.gif b/grid/jre/lib/images/cursors/win32_CopyDrop32x32.gif
new file mode 100644
index 0000000..8a47b47
--- /dev/null
+++ b/grid/jre/lib/images/cursors/win32_CopyDrop32x32.gif
Binary files differ
diff --git a/grid/jre/lib/images/cursors/win32_CopyNoDrop32x32.gif b/grid/jre/lib/images/cursors/win32_CopyNoDrop32x32.gif
new file mode 100644
index 0000000..64c265d
--- /dev/null
+++ b/grid/jre/lib/images/cursors/win32_CopyNoDrop32x32.gif
Binary files differ
diff --git a/grid/jre/lib/images/cursors/win32_LinkDrop32x32.gif b/grid/jre/lib/images/cursors/win32_LinkDrop32x32.gif
new file mode 100644
index 0000000..be3628f
--- /dev/null
+++ b/grid/jre/lib/images/cursors/win32_LinkDrop32x32.gif
Binary files differ
diff --git a/grid/jre/lib/images/cursors/win32_LinkNoDrop32x32.gif b/grid/jre/lib/images/cursors/win32_LinkNoDrop32x32.gif
new file mode 100644
index 0000000..64c265d
--- /dev/null
+++ b/grid/jre/lib/images/cursors/win32_LinkNoDrop32x32.gif
Binary files differ
diff --git a/grid/jre/lib/images/cursors/win32_MoveDrop32x32.gif b/grid/jre/lib/images/cursors/win32_MoveDrop32x32.gif
new file mode 100644
index 0000000..a2d986b
--- /dev/null
+++ b/grid/jre/lib/images/cursors/win32_MoveDrop32x32.gif
Binary files differ
diff --git a/grid/jre/lib/images/cursors/win32_MoveNoDrop32x32.gif b/grid/jre/lib/images/cursors/win32_MoveNoDrop32x32.gif
new file mode 100644
index 0000000..64c265d
--- /dev/null
+++ b/grid/jre/lib/images/cursors/win32_MoveNoDrop32x32.gif
Binary files differ
diff --git a/grid/jre/lib/javafx.properties b/grid/jre/lib/javafx.properties
new file mode 100644
index 0000000..f3edc39
--- /dev/null
+++ b/grid/jre/lib/javafx.properties
@@ -0,0 +1,2 @@
+javafx.runtime.version=8.0.261
+javafx.runtime.build=b12
diff --git a/grid/jre/lib/javaws.jar b/grid/jre/lib/javaws.jar
new file mode 100644
index 0000000..5828305
--- /dev/null
+++ b/grid/jre/lib/javaws.jar
Binary files differ
diff --git a/grid/jre/lib/jce.jar b/grid/jre/lib/jce.jar
new file mode 100644
index 0000000..dcbe6dd
--- /dev/null
+++ b/grid/jre/lib/jce.jar
Binary files differ
diff --git a/grid/jre/lib/jfr.jar b/grid/jre/lib/jfr.jar
new file mode 100644
index 0000000..ad6a34d
--- /dev/null
+++ b/grid/jre/lib/jfr.jar
Binary files differ
diff --git a/grid/jre/lib/jfr/default.jfc b/grid/jre/lib/jfr/default.jfc
new file mode 100644
index 0000000..3a0a19a
--- /dev/null
+++ b/grid/jre/lib/jfr/default.jfc
@@ -0,0 +1,586 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Recommended way to edit .jfc files is to use Java Mission Control,
+ see Window -> Flight Recorder Template Manager.
+-->
+
+<configuration version="1.0" name="Continuous" description="Low overhead configuration safe for continuous use in production environments, typically less than 1 % overhead." provider="Oracle">
+
+ <producer uri="http://www.oracle.com/hotspot/jvm/" label="Oracle JDK">
+
+ <control>
+
+ <!--
+ Contents of the control element is not read by the JVM, it's used
+ by Java Mission Control to change settings that carry the control attribute.
+ -->
+
+ <selection name="gc-level" default="detailed" label="Garbage Collector">
+ <option label="Off" name="off">off</option>
+ <option label="Normal" name="detailed">normal</option>
+ <option label="All" name="all">all</option>
+ </selection>
+
+ <condition name="gc-enabled-normal" true="true" false="false">
+ <or>
+ <test name="gc-level" operator="equal" value="normal"/>
+ <test name="gc-level" operator="equal" value="all"/>
+ </or>
+ </condition>
+
+ <condition name="gc-enabled-all" true="true" false="false">
+ <test name="gc-level" operator="equal" value="all"/>
+ </condition>
+
+ <selection name="compiler-level" default="normal" label="Compiler">
+ <option label="Off" name="off">off</option>
+ <option label="Normal" name="normal">normal</option>
+ <option label="Detailed" name="detailed">detailed</option>
+ <option label="All" name="all">all</option>
+ </selection>
+
+ <condition name="compiler-enabled" true="false" false="true">
+ <test name="compiler-level" operator="equal" value="off"/>
+ </condition>
+
+ <condition name="compiler-enabled-failure" true="true" false="false">
+ <or>
+ <test name="compiler-level" operator="equal" value="detailed"/>
+ <test name="compiler-level" operator="equal" value="all"/>
+ </or>
+ </condition>
+
+ <condition name="compiler-sweeper-threshold" true="0 ms" false="100 ms">
+ <test name="compiler-level" operator="equal" value="all"/>
+ </condition>
+
+ <condition name="compiler-compilation-threshold" true="1000 ms">
+ <test name="compiler-level" operator="equal" value="normal"/>
+ </condition>
+
+ <condition name="compiler-compilation-threshold" true="100 ms">
+ <test name="compiler-level" operator="equal" value="detailed"/>
+ </condition>
+
+ <condition name="compiler-compilation-threshold" true="0 ms">
+ <test name="compiler-level" operator="equal" value="all"/>
+ </condition>
+
+ <condition name="compiler-phase-threshold" true="60 s">
+ <test name="compiler-level" operator="equal" value="normal"/>
+ </condition>
+
+ <condition name="compiler-phase-threshold" true="10 s">
+ <test name="compiler-level" operator="equal" value="detailed"/>
+ </condition>
+
+ <condition name="compiler-phase-threshold" true="0 s">
+ <test name="compiler-level" operator="equal" value="all"/>
+ </condition>
+
+ <selection name="method-sampling-interval" default="normal" label="Method Sampling">
+ <option label="Off" name="off">999 d</option>
+ <option label="Normal" name="normal">20 ms</option>
+ <option label="Maximum" name="maximum">10 ms</option>
+ </selection>
+
+ <condition name="method-sampling-enabled" true="false" false="true">
+ <test name="method-sampling-interval" operator="equal" value="999 d"/>
+ </condition>
+
+ <selection name="thread-dump-interval" default="normal" label="Thread Dump">
+ <option label="Off" name="off">999 d</option>
+ <option label="At least Once" name="normal">everyChunk</option>
+ <option label="Every 60 s" name="everyMinute">60 s</option>
+ <option label="Every 10 s" name="everyTenSecond">10 s</option>
+ <option label="Every 1 s" name="everySecond">1 s</option>
+ </selection>
+
+ <condition name="thread-dump-enabled" true="false" false="true">
+ <test name="thread-dump-interval" operator="equal" value="999 d"/>
+ </condition>
+
+ <selection name="exception-level" default="errors" label="Exceptions">
+ <option label="Off" name="off">off</option>
+ <option label="Errors Only" name="errors">errors</option>
+ <option label="All Exceptions, including Errors" name="all">all</option>
+ </selection>
+
+ <condition name="enable-errors" true="true" false="false">
+ <or>
+ <test name="exception-level" operator="equal" value="errors"/>
+ <test name="exception-level" operator="equal" value="all"/>
+ </or>
+ </condition>
+
+ <condition name="enable-exceptions" true="true" false="false">
+ <test name="exception-level" operator="equal" value="all"/>
+ </condition>
+
+ <text name="synchronization-threshold" label="Synchronization Threshold" contentType="timespan" minimum="0 s">20 ms</text>
+
+ <text name="file-io-threshold" label="File I/O Threshold" contentType="timespan" minimum="0 s">20 ms</text>
+
+ <text name="socket-io-threshold" label="Socket I/O Threshold" contentType="timespan" minimum="0 s">20 ms</text>
+
+ <flag name="heap-statistics-enabled" label="Heap Statistics">false</flag>
+
+ <flag name="class-loading-enabled" label="Class Loading">false</flag>
+
+ <flag name="allocation-profiling-enabled" label="Allocation Profiling">false</flag>
+
+ </control>
+
+ <event path="java/statistics/thread_allocation">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="java/statistics/class_loading">
+ <setting name="enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="java/statistics/threads">
+ <setting name="enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="java/thread_start">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="java/thread_end">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="java/thread_sleep">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="synchronization-threshold">20 ms</setting>
+ </event>
+
+ <event path="java/thread_park">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="synchronization-threshold">20 ms</setting>
+ </event>
+
+ <event path="java/monitor_enter">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="synchronization-threshold">20 ms</setting>
+ </event>
+
+ <event path="java/monitor_wait">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="synchronization-threshold">20 ms</setting>
+ </event>
+
+ <event path="vm/class/load">
+ <setting name="enabled" control="class-loading-enabled">false</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/class/unload">
+ <setting name="enabled" control="class-loading-enabled">false</setting>
+ </event>
+
+ <event path="vm/info">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/initial_system_property">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/prof/execution_sample">
+ <setting name="enabled" control="method-sampling-enabled">true</setting>
+ <setting name="period" control="method-sampling-interval">20 ms</setting>
+ </event>
+
+ <event path="vm/prof/execution_sampling_info">
+ <setting name="enabled">false</setting>
+ <setting name="threshold">1 ms</setting>
+ </event>
+
+ <event path="vm/runtime/execute_vm_operation">
+ <setting name="enabled">true</setting>
+ <setting name="threshold">10 ms</setting>
+ </event>
+
+ <event path="vm/runtime/shutdown">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="vm/runtime/thread_dump">
+ <setting name="enabled" control="thread-dump-enabled">true</setting>
+ <setting name="period" control="thread-dump-interval">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/long">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/ulong">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/double">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/boolean">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/string">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/long_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/flag/ulong_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/flag/double_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/flag/boolean_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/flag/string_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/object_count">
+ <setting name="enabled" control="heap-statistics-enabled">false</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/gc">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/heap">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/young_generation">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/tlab">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/survivor">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/detailed/object_count_after_gc">
+ <setting name="enabled">false</setting>
+ </event>
+
+ <event path="vm/gc/heap/summary">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/heap/ps_summary">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/heap/metaspace_summary">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/metaspace/gc_threshold">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/metaspace/allocation_failure">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="vm/gc/metaspace/out_of_memory">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="vm/gc/metaspace/chunk_free_list_summary">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/collector/garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/collector/parold_garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/collector/young_garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/collector/old_garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/collector/g1_garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/phases/pause">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/phases/pause_level_1">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/phases/pause_level_2">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/phases/pause_level_3">
+ <setting name="enabled" control="gc-enabled-all">false</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/reference/statistics">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/promotion_failed">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/evacuation_failed">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/evacuation_info">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/concurrent_mode_failure">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/allocation_requiring_gc">
+ <setting name="enabled" control="gc-enabled-all">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="vm/compiler/config">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/compiler/stats">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="vm/compiler/compilation">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="threshold" control="compiler-compilation-threshold">1000 ms</setting>
+ </event>
+
+ <event path="vm/compiler/phase">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="threshold" control="compiler-phase-threshold">60 s</setting>
+ </event>
+
+ <event path="vm/compiler/failure">
+ <setting name="enabled" control="compiler-enabled-failure">false</setting>
+ </event>
+
+ <event path="vm/code_sweeper/config">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/code_sweeper/stats">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/code_sweeper/sweep">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="threshold" control="compiler-sweeper-threshold">100 ms</setting>
+ </event>
+
+ <event path="vm/code_cache/config">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/code_cache/stats">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/code_cache/full">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ </event>
+
+ <event path="os/information">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/processor/cpu_information">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/processor/context_switch_rate">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">10 s</setting>
+ </event>
+
+ <event path="os/processor/cpu_load">
+ <setting name="enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="os/processor/cpu_tsc">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/system_process">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/initial_environment_variable">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/memory/physical_memory">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="java/object_alloc_in_new_TLAB">
+ <setting name="enabled" control="allocation-profiling-enabled">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/object_alloc_outside_TLAB">
+ <setting name="enabled" control="allocation-profiling-enabled">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ </producer>
+
+ <producer uri="http://www.oracle.com/hotspot/jdk/" label="Oracle JDK">
+
+ <event path="java/file_read">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/file-io-threshold">20 ms</setting>
+ </event>
+
+ <event path="java/file_write">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/file-io-threshold">20 ms</setting>
+ </event>
+
+ <event path="java/socket_read">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/socket-io-threshold">20 ms</setting>
+ </event>
+
+ <event path="java/socket_write">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/socket-io-threshold">20 ms</setting>
+ </event>
+
+ <event path="java/exception_throw">
+ <setting name="enabled" control="http://www.oracle.com/hotspot/jvm/enable-exceptions">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/error_throw">
+ <setting name="enabled" control="http://www.oracle.com/hotspot/jvm/enable-errors">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/statistics/throwables">
+ <setting name="enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="java/security_property">
+ <setting name="enabled">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/tls_handshake">
+ <setting name="enabled">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/x509_certificate">
+ <setting name="enabled">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/x509_validation">
+ <setting name="enabled">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ </producer>
+
+ <producer uri="http://www.oracle.com/hotspot/jfr-info/" label="Oracle JDK">
+
+ <event path="recordings/recording">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="recordings/recording_setting">
+ <setting name="enabled">true</setting>
+ </event>
+
+ </producer>
+
+</configuration>
diff --git a/grid/jre/lib/jfr/profile.jfc b/grid/jre/lib/jfr/profile.jfc
new file mode 100644
index 0000000..bbb86e0
--- /dev/null
+++ b/grid/jre/lib/jfr/profile.jfc
@@ -0,0 +1,586 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Recommended way to edit .jfc files is to use Java Mission Control,
+ see Window -> Flight Recorder Template Manager.
+-->
+
+<configuration version="1.0" name="Profiling" description="Low overhead configuration for profiling, typically around 2 % overhead." provider="Oracle">
+
+ <producer uri="http://www.oracle.com/hotspot/jvm/" label="Oracle JDK">
+
+ <control>
+
+ <!--
+ Contents of the control element is not read by the JVM, it's used
+ by Java Mission Control to change settings that carry the control attribute.
+ -->
+
+ <selection name="gc-level" default="detailed" label="Garbage Collector">
+ <option label="Off" name="off">off</option>
+ <option label="Normal" name="detailed">normal</option>
+ <option label="All" name="all">all</option>
+ </selection>
+
+ <condition name="gc-enabled-normal" true="true" false="false">
+ <or>
+ <test name="gc-level" operator="equal" value="normal"/>
+ <test name="gc-level" operator="equal" value="all"/>
+ </or>
+ </condition>
+
+ <condition name="gc-enabled-all" true="true" false="false">
+ <test name="gc-level" operator="equal" value="all"/>
+ </condition>
+
+ <selection name="compiler-level" default="detailed" label="Compiler">
+ <option label="Off" name="off">off</option>
+ <option label="Normal" name="normal">normal</option>
+ <option label="Detailed" name="detailed">detailed</option>
+ <option label="All" name="all">all</option>
+ </selection>
+
+ <condition name="compiler-enabled" true="false" false="true">
+ <test name="compiler-level" operator="equal" value="off"/>
+ </condition>
+
+ <condition name="compiler-enabled-failure" true="true" false="false">
+ <or>
+ <test name="compiler-level" operator="equal" value="detailed"/>
+ <test name="compiler-level" operator="equal" value="all"/>
+ </or>
+ </condition>
+
+ <condition name="compiler-sweeper-threshold" true="0 ms" false="100 ms">
+ <test name="compiler-level" operator="equal" value="all"/>
+ </condition>
+
+ <condition name="compiler-compilation-threshold" true="1000 ms">
+ <test name="compiler-level" operator="equal" value="normal"/>
+ </condition>
+
+ <condition name="compiler-compilation-threshold" true="100 ms">
+ <test name="compiler-level" operator="equal" value="detailed"/>
+ </condition>
+
+ <condition name="compiler-compilation-threshold" true="0 ms">
+ <test name="compiler-level" operator="equal" value="all"/>
+ </condition>
+
+ <condition name="compiler-phase-threshold" true="60 s">
+ <test name="compiler-level" operator="equal" value="normal"/>
+ </condition>
+
+ <condition name="compiler-phase-threshold" true="10 s">
+ <test name="compiler-level" operator="equal" value="detailed"/>
+ </condition>
+
+ <condition name="compiler-phase-threshold" true="0 s">
+ <test name="compiler-level" operator="equal" value="all"/>
+ </condition>
+
+ <selection name="method-sampling-interval" default="maximum" label="Method Sampling">
+ <option label="Off" name="off">999 d</option>
+ <option label="Normal" name="normal">20 ms</option>
+ <option label="Maximum" name="maximum">10 ms</option>
+ </selection>
+
+ <condition name="method-sampling-enabled" true="false" false="true">
+ <test name="method-sampling-interval" operator="equal" value="999 d"/>
+ </condition>
+
+ <selection name="thread-dump-interval" default="everyMinute" label="Thread Dump">
+ <option label="Off" name="off">999 d</option>
+ <option label="At least Once" name="normal">everyChunk</option>
+ <option label="Every 60 s" name="everyMinute">60 s</option>
+ <option label="Every 10 s" name="everyTenSecond">10 s</option>
+ <option label="Every 1 s" name="everySecond">1 s</option>
+ </selection>
+
+ <condition name="thread-dump-enabled" true="false" false="true">
+ <test name="thread-dump-interval" operator="equal" value="999 d"/>
+ </condition>
+
+ <selection name="exception-level" default="errors" label="Exceptions">
+ <option label="Off" name="off">off</option>
+ <option label="Errors Only" name="errors">errors</option>
+ <option label="All Exceptions, including Errors" name="all">all</option>
+ </selection>
+
+ <condition name="enable-errors" true="true" false="false">
+ <or>
+ <test name="exception-level" operator="equal" value="errors"/>
+ <test name="exception-level" operator="equal" value="all"/>
+ </or>
+ </condition>
+
+ <condition name="enable-exceptions" true="true" false="false">
+ <test name="exception-level" operator="equal" value="all"/>
+ </condition>
+
+ <text name="synchronization-threshold" label="Synchronization Threshold" contentType="timespan" minimum="0 s">10 ms</text>
+
+ <text name="file-io-threshold" label="File I/O Threshold" contentType="timespan" minimum="0 s">10 ms</text>
+
+ <text name="socket-io-threshold" label="Socket I/O Threshold" contentType="timespan" minimum="0 s">10 ms</text>
+
+ <flag name="heap-statistics-enabled" label="Heap Statistics">false</flag>
+
+ <flag name="class-loading-enabled" label="Class Loading">false</flag>
+
+ <flag name="allocation-profiling-enabled" label="Allocation Profiling">true</flag>
+
+ </control>
+
+ <event path="java/statistics/thread_allocation">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="java/statistics/class_loading">
+ <setting name="enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="java/statistics/threads">
+ <setting name="enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="java/thread_start">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="java/thread_end">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="java/thread_sleep">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="synchronization-threshold">10 ms</setting>
+ </event>
+
+ <event path="java/thread_park">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="synchronization-threshold">10 ms</setting>
+ </event>
+
+ <event path="java/monitor_enter">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="synchronization-threshold">10 ms</setting>
+ </event>
+
+ <event path="java/monitor_wait">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="synchronization-threshold">10 ms</setting>
+ </event>
+
+ <event path="vm/class/load">
+ <setting name="enabled" control="class-loading-enabled">false</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/class/unload">
+ <setting name="enabled" control="class-loading-enabled">false</setting>
+ </event>
+
+ <event path="vm/info">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/initial_system_property">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/prof/execution_sample">
+ <setting name="enabled" control="method-sampling-enabled">true</setting>
+ <setting name="period" control="method-sampling-interval">10 ms</setting>
+ </event>
+
+ <event path="vm/prof/execution_sampling_info">
+ <setting name="enabled">false</setting>
+ <setting name="threshold">1 ms</setting>
+ </event>
+
+ <event path="vm/runtime/execute_vm_operation">
+ <setting name="enabled">true</setting>
+ <setting name="threshold">10 ms</setting>
+ </event>
+
+ <event path="vm/runtime/shutdown">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="vm/runtime/thread_dump">
+ <setting name="enabled" control="thread-dump-enabled">true</setting>
+ <setting name="period" control="thread-dump-interval">60 s</setting>
+ </event>
+
+ <event path="vm/flag/long">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/ulong">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/double">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/boolean">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/string">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/long_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/flag/ulong_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/flag/double_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/flag/boolean_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/flag/string_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/object_count">
+ <setting name="enabled" control="heap-statistics-enabled">false</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/gc">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/heap">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/young_generation">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/tlab">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/survivor">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/detailed/object_count_after_gc">
+ <setting name="enabled">false</setting>
+ </event>
+
+ <event path="vm/gc/heap/summary">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/heap/ps_summary">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/heap/metaspace_summary">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/metaspace/gc_threshold">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/metaspace/allocation_failure">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="vm/gc/metaspace/out_of_memory">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="vm/gc/metaspace/chunk_free_list_summary">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/collector/garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/collector/parold_garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/collector/young_garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/collector/old_garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/collector/g1_garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/phases/pause">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/phases/pause_level_1">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/phases/pause_level_2">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/phases/pause_level_3">
+ <setting name="enabled" control="gc-enabled-all">false</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/reference/statistics">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/promotion_failed">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/evacuation_failed">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/evacuation_info">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/concurrent_mode_failure">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/allocation_requiring_gc">
+ <setting name="enabled" control="gc-enabled-all">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="vm/compiler/config">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/compiler/stats">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="vm/compiler/compilation">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="threshold" control="compiler-compilation-threshold">100 ms</setting>
+ </event>
+
+ <event path="vm/compiler/phase">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="threshold" control="compiler-phase-threshold">10 s</setting>
+ </event>
+
+ <event path="vm/compiler/failure">
+ <setting name="enabled" control="compiler-enabled-failure">true</setting>
+ </event>
+
+ <event path="vm/code_sweeper/config">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/code_sweeper/stats">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/code_sweeper/sweep">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="threshold" control="compiler-sweeper-threshold">100 ms</setting>
+ </event>
+
+ <event path="vm/code_cache/config">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/code_cache/stats">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/code_cache/full">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ </event>
+
+ <event path="os/information">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/processor/cpu_information">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/processor/context_switch_rate">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">10 s</setting>
+ </event>
+
+ <event path="os/processor/cpu_load">
+ <setting name="enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="os/processor/cpu_tsc">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/system_process">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/initial_environment_variable">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/memory/physical_memory">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="java/object_alloc_in_new_TLAB">
+ <setting name="enabled" control="allocation-profiling-enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/object_alloc_outside_TLAB">
+ <setting name="enabled" control="allocation-profiling-enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ </producer>
+
+ <producer uri="http://www.oracle.com/hotspot/jdk/" label="Oracle JDK">
+
+ <event path="java/file_read">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/file-io-threshold">10 ms</setting>
+ </event>
+
+ <event path="java/file_write">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/file-io-threshold">10 ms</setting>
+ </event>
+
+ <event path="java/socket_read">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/socket-io-threshold">10 ms</setting>
+ </event>
+
+ <event path="java/socket_write">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/socket-io-threshold">10 ms</setting>
+ </event>
+
+ <event path="java/exception_throw">
+ <setting name="enabled" control="http://www.oracle.com/hotspot/jvm/enable-exceptions">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/error_throw">
+ <setting name="enabled" control="http://www.oracle.com/hotspot/jvm/enable-errors">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/statistics/throwables">
+ <setting name="enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="java/security_property">
+ <setting name="enabled">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/tls_handshake">
+ <setting name="enabled">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/x509_certificate">
+ <setting name="enabled">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/x509_validation">
+ <setting name="enabled">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ </producer>
+
+ <producer uri="http://www.oracle.com/hotspot/jfr-info/" label="Oracle JDK">
+
+ <event path="recordings/recording">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="recordings/recording_setting">
+ <setting name="enabled">true</setting>
+ </event>
+
+ </producer>
+
+</configuration>
diff --git a/grid/jre/lib/jfxswt.jar b/grid/jre/lib/jfxswt.jar
new file mode 100644
index 0000000..3f421ff
--- /dev/null
+++ b/grid/jre/lib/jfxswt.jar
Binary files differ
diff --git a/grid/jre/lib/jsse.jar b/grid/jre/lib/jsse.jar
new file mode 100644
index 0000000..4bf8c9f
--- /dev/null
+++ b/grid/jre/lib/jsse.jar
Binary files differ
diff --git a/grid/jre/lib/jvm.hprof.txt b/grid/jre/lib/jvm.hprof.txt
new file mode 100644
index 0000000..3c8e5fc
--- /dev/null
+++ b/grid/jre/lib/jvm.hprof.txt
@@ -0,0 +1,86 @@
+Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ - Neither the name of Oracle nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Header for -agentlib:hprof (or -Xrunhprof) ASCII Output (JDK 5.0 JVMTI based)
+
+WARNING! This file format is under development, and is subject to
+change without notice.
+
+This file contains the following types of records:
+
+THREAD START
+THREAD END mark the lifetime of Java threads
+
+TRACE represents a Java stack trace. Each trace consists
+ of a series of stack frames. Other records refer to
+ TRACEs to identify (1) where object allocations have
+ taken place, (2) the frames in which GC roots were
+ found, and (3) frequently executed methods.
+
+HEAP DUMP is a complete snapshot of all live objects in the Java
+ heap. Following distinctions are made:
+
+ ROOT root set as determined by GC
+ CLS classes
+ OBJ instances
+ ARR arrays
+
+SITES is a sorted list of allocation sites. This identifies
+ the most heavily allocated object types, and the TRACE
+ at which those allocations occurred.
+
+CPU SAMPLES is a statistical profile of program execution. The VM
+ periodically samples all running threads, and assigns
+ a quantum to active TRACEs in those threads. Entries
+ in this record are TRACEs ranked by the percentage of
+ total quanta they consumed; top-ranked TRACEs are
+ typically hot spots in the program.
+
+CPU TIME is a profile of program execution obtained by measuring
+ the time spent in individual methods (excluding the time
+ spent in callees), as well as by counting the number of
+ times each method is called. Entries in this record are
+ TRACEs ranked by the percentage of total CPU time. The
+ "count" field indicates the number of times each TRACE
+ is invoked.
+
+MONITOR TIME is a profile of monitor contention obtained by measuring
+ the time spent by a thread waiting to enter a monitor.
+ Entries in this record are TRACEs ranked by the percentage
+ of total monitor contention time and a brief description
+ of the monitor. The "count" field indicates the number of
+ times the monitor was contended at that TRACE.
+
+MONITOR DUMP is a complete snapshot of all the monitors and threads in
+ the System.
+
+HEAP DUMP, SITES, CPU SAMPLES|TIME and MONITOR DUMP|TIME records are generated
+at program exit. They can also be obtained during program execution by typing
+Ctrl-\ (on Solaris) or by typing Ctrl-Break (on Win32).
diff --git a/grid/jre/lib/logging.properties b/grid/jre/lib/logging.properties
new file mode 100644
index 0000000..65cf1b1
--- /dev/null
+++ b/grid/jre/lib/logging.properties
@@ -0,0 +1,59 @@
+############################################################
+# Default Logging Configuration File
+#
+# You can use a different file by specifying a filename
+# with the java.util.logging.config.file system property.
+# For example java -Djava.util.logging.config.file=myfile
+############################################################
+
+############################################################
+# Global properties
+############################################################
+
+# "handlers" specifies a comma separated list of log Handler
+# classes. These handlers will be installed during VM startup.
+# Note that these classes must be on the system classpath.
+# By default we only configure a ConsoleHandler, which will only
+# show messages at the INFO and above levels.
+handlers= java.util.logging.ConsoleHandler
+
+# To also add the FileHandler, use the following line instead.
+#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
+
+# Default global logging level.
+# This specifies which kinds of events are logged across
+# all loggers. For any given facility this global level
+# can be overriden by a facility specific level
+# Note that the ConsoleHandler also has a separate level
+# setting to limit messages printed to the console.
+.level= INFO
+
+############################################################
+# Handler specific properties.
+# Describes specific configuration info for Handlers.
+############################################################
+
+# default file output is in user's home directory.
+java.util.logging.FileHandler.pattern = %h/java%u.log
+java.util.logging.FileHandler.limit = 50000
+java.util.logging.FileHandler.count = 1
+java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
+
+# Limit the message that are printed on the console to INFO and above.
+java.util.logging.ConsoleHandler.level = INFO
+java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
+
+# Example to customize the SimpleFormatter output format
+# to print one-line log message like this:
+# <level>: <log message> [<date/time>]
+#
+# java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n
+
+############################################################
+# Facility specific properties.
+# Provides extra control for each logger.
+############################################################
+
+# For example, set the com.xyz.foo logger to only log SEVERE
+# messages:
+com.xyz.foo.level = SEVERE
diff --git a/grid/jre/lib/management-agent.jar b/grid/jre/lib/management-agent.jar
new file mode 100644
index 0000000..8bf10d8
--- /dev/null
+++ b/grid/jre/lib/management-agent.jar
Binary files differ
diff --git a/grid/jre/lib/management/jmxremote.access b/grid/jre/lib/management/jmxremote.access
new file mode 100644
index 0000000..ce80b47
--- /dev/null
+++ b/grid/jre/lib/management/jmxremote.access
@@ -0,0 +1,79 @@
+######################################################################
+# Default Access Control File for Remote JMX(TM) Monitoring
+######################################################################
+#
+# Access control file for Remote JMX API access to monitoring.
+# This file defines the allowed access for different roles. The
+# password file (jmxremote.password by default) defines the roles and their
+# passwords. To be functional, a role must have an entry in
+# both the password and the access files.
+#
+# The default location of this file is $JRE/lib/management/jmxremote.access
+# You can specify an alternate location by specifying a property in
+# the management config file $JRE/lib/management/management.properties
+# (See that file for details)
+#
+# The file format for password and access files is syntactically the same
+# as the Properties file format. The syntax is described in the Javadoc
+# for java.util.Properties.load.
+# A typical access file has multiple lines, where each line is blank,
+# a comment (like this one), or an access control entry.
+#
+# An access control entry consists of a role name, and an
+# associated access level. The role name is any string that does not
+# itself contain spaces or tabs. It corresponds to an entry in the
+# password file (jmxremote.password). The access level is one of the
+# following:
+# "readonly" grants access to read attributes of MBeans.
+# For monitoring, this means that a remote client in this
+# role can read measurements but cannot perform any action
+# that changes the environment of the running program.
+# "readwrite" grants access to read and write attributes of MBeans,
+# to invoke operations on them, and optionally
+# to create or remove them. This access should be granted
+# only to trusted clients, since they can potentially
+# interfere with the smooth operation of a running program.
+#
+# The "readwrite" access level can optionally be followed by the "create" and/or
+# "unregister" keywords. The "unregister" keyword grants access to unregister
+# (delete) MBeans. The "create" keyword grants access to create MBeans of a
+# particular class or of any class matching a particular pattern. Access
+# should only be granted to create MBeans of known and trusted classes.
+#
+# For example, the following entry would grant readwrite access
+# to "controlRole", as well as access to create MBeans of the class
+# javax.management.monitor.CounterMonitor and to unregister any MBean:
+# controlRole readwrite \
+# create javax.management.monitor.CounterMonitorMBean \
+# unregister
+# or equivalently:
+# controlRole readwrite unregister create javax.management.monitor.CounterMBean
+#
+# The following entry would grant readwrite access as well as access to create
+# MBeans of any class in the packages javax.management.monitor and
+# javax.management.timer:
+# controlRole readwrite \
+# create javax.management.monitor.*,javax.management.timer.* \
+# unregister
+#
+# The \ character is defined in the Properties file syntax to allow continuation
+# lines as shown here. A * in a class pattern matches a sequence of characters
+# other than dot (.), so javax.management.monitor.* matches
+# javax.management.monitor.CounterMonitor but not
+# javax.management.monitor.foo.Bar.
+#
+# A given role should have at most one entry in this file. If a role
+# has no entry, it has no access.
+# If multiple entries are found for the same role name, then the last
+# access entry is used.
+#
+#
+# Default access control entries:
+# o The "monitorRole" role has readonly access.
+# o The "controlRole" role has readwrite access and can create the standard
+# Timer and Monitor MBeans defined by the JMX API.
+
+monitorRole readonly
+controlRole readwrite \
+ create javax.management.monitor.*,javax.management.timer.* \
+ unregister
diff --git a/grid/jre/lib/management/jmxremote.password.template b/grid/jre/lib/management/jmxremote.password.template
new file mode 100644
index 0000000..a7e7daa
--- /dev/null
+++ b/grid/jre/lib/management/jmxremote.password.template
@@ -0,0 +1,64 @@
+# ----------------------------------------------------------------------
+# Template for jmxremote.password
+#
+# o Copy this template to jmxremote.password
+# o Set the user/password entries in jmxremote.password
+# o Change the permission of jmxremote.password to read-only
+# by the owner.
+#
+# See below for the location of jmxremote.password file.
+# ----------------------------------------------------------------------
+
+##############################################################
+# Password File for Remote JMX Monitoring
+##############################################################
+#
+# Password file for Remote JMX API access to monitoring. This
+# file defines the different roles and their passwords. The access
+# control file (jmxremote.access by default) defines the allowed
+# access for each role. To be functional, a role must have an entry
+# in both the password and the access files.
+#
+# Default location of this file is $JRE/lib/management/jmxremote.password
+# You can specify an alternate location by specifying a property in
+# the management config file $JRE/lib/management/management.properties
+# or by specifying a system property (See that file for details).
+
+
+##############################################################
+# File permissions of the jmxremote.password file
+##############################################################
+# Since there are cleartext passwords stored in this file,
+# this file must be readable by ONLY the owner,
+# otherwise the program will exit with an error.
+#
+# The file format for password and access files is syntactically the same
+# as the Properties file format. The syntax is described in the Javadoc
+# for java.util.Properties.load.
+# Typical password file has multiple lines, where each line is blank,
+# a comment (like this one), or a password entry.
+#
+#
+# A password entry consists of a role name and an associated
+# password. The role name is any string that does not itself contain
+# spaces or tabs. The password is again any string that does not
+# contain spaces or tabs. Note that passwords appear in the clear in
+# this file, so it is a good idea not to use valuable passwords.
+#
+# A given role should have at most one entry in this file. If a role
+# has no entry, it has no access.
+# If multiple entries are found for the same role name, then the last one
+# is used.
+#
+# In a typical installation, this file can be read by anybody on the
+# local machine, and possibly by people on other machines.
+# For # security, you should either restrict the access to this file,
+# or specify another, less accessible file in the management config file
+# as described above.
+#
+# Following are two commented-out entries. The "measureRole" role has
+# password "QED". The "controlRole" role has password "R&D".
+#
+# monitorRole QED
+# controlRole R&D
+
diff --git a/grid/jre/lib/management/management.properties b/grid/jre/lib/management/management.properties
new file mode 100644
index 0000000..70efa2e
--- /dev/null
+++ b/grid/jre/lib/management/management.properties
@@ -0,0 +1,331 @@
+#####################################################################
+# Default Configuration File for Java Platform Management
+#####################################################################
+#
+# The Management Configuration file (in java.util.Properties format)
+# will be read if one of the following system properties is set:
+# -Dcom.sun.management.jmxremote.port=<port-number>
+# or -Dcom.sun.management.snmp.port=<port-number>
+# or -Dcom.sun.management.config.file=<this-file>
+#
+# The default Management Configuration file is:
+#
+# $JRE/lib/management/management.properties
+#
+# Another location for the Management Configuration File can be specified
+# by the following property on the Java command line:
+#
+# -Dcom.sun.management.config.file=<this-file>
+#
+# If -Dcom.sun.management.config.file=<this-file> is set, the port
+# number for the management agent can be specified in the config file
+# using the following lines:
+#
+# ################ Management Agent Port #########################
+#
+# For setting the JMX RMI agent port use the following line
+# com.sun.management.jmxremote.port=<port-number>
+#
+# For setting the SNMP agent port use the following line
+# com.sun.management.snmp.port=<port-number>
+
+#####################################################################
+# Optional Instrumentation
+#####################################################################
+#
+# By default only the basic instrumentation with low overhead is on.
+# The following properties allow to selectively turn on optional
+# instrumentation which are off by default and may have some
+# additional overhead.
+#
+# com.sun.management.enableThreadContentionMonitoring
+#
+# This option enables thread contention monitoring if the
+# Java virtual machine supports such instrumentation.
+# Refer to the specification for the java.lang.management.ThreadMBean
+# interface - see isThreadContentionMonitoringSupported() method.
+#
+
+# To enable thread contention monitoring, uncomment the following line
+# com.sun.management.enableThreadContentionMonitoring
+
+#####################################################################
+# SNMP Management Properties
+#####################################################################
+#
+# If the system property -Dcom.sun.management.snmp.port=<port-number>
+# is set then
+# - The SNMP agent (with the Java virtual machine MIB) is started
+# that listens on the specified port for incoming SNMP requests.
+# - the following properties for read for SNMP management.
+#
+# The configuration can be specified only at startup time.
+# Later changes to the above system property (e.g. via setProperty method), this
+# config file, or the ACL file has no effect to the running SNMP agent.
+#
+
+#
+# ##################### SNMP Trap Port #########################
+#
+# com.sun.management.snmp.trap=<trap-destination-port-number>
+# Specifies the remote port number at which managers are expected
+# to listen for trap. For each host defined in the ACL file,
+# the SNMP agent will send traps at <host>:<trap-destination-port-number>
+# Default for this property is 162.
+#
+
+# To set port for sending traps to a different port use the following line
+# com.sun.management.snmp.trap=<trap-destination-port-number>
+
+#
+# ################ SNMP listen interface #########################
+#
+# com.sun.management.snmp.interface=<InetAddress>
+# Specifies the local interface on which the SNMP agent will bind.
+# This is useful when running on machines which have several
+# interfaces defined. It makes it possible to listen to a specific
+# subnet accessible through that interface.
+# Default for this property is "localhost".
+#
+# The format of the value for that property is any string accepted
+# by java.net.InetAddress.getByName(String).
+#
+
+# For restricting the port on which SNMP agent listens use the following line
+# com.sun.management.snmp.interface=<InetAddress>
+
+#
+# #################### SNMP ACL file #########################
+#
+# com.sun.management.snmp.acl=true|false
+# Default for this property is true. (Case for true/false ignored)
+# If this property is specified as false then the ACL file
+# is not checked: all manager hosts are allowed all access.
+#
+
+# For SNMP without checking ACL file uncomment the following line
+# com.sun.management.snmp.acl=false
+
+#
+# com.sun.management.snmp.acl.file=filepath
+# Specifies location for ACL file
+# This is optional - default location is
+# $JRE/lib/management/snmp.acl
+#
+# If the property "com.sun.management.snmp.acl" is set to false,
+# then this property and the ACL file are ignored.
+# Otherwise the ACL file must exist and be in the valid format.
+# If the ACL file is empty or non existent then no access is allowed.
+#
+# The SNMP agent will read the ACL file at startup time.
+# Modification to the ACL file has no effect to any running SNMP
+# agents which read that ACL file at startup.
+#
+
+# For a non-default acl file location use the following line
+# com.sun.management.snmp.acl.file=filepath
+
+#####################################################################
+# RMI Management Properties
+#####################################################################
+#
+# If system property -Dcom.sun.management.jmxremote.port=<port-number>
+# is set then
+# - A MBean server is started
+# - JRE Platform MBeans are registered in the MBean server
+# - RMI connector is published in a private readonly registry at
+# specified port using a well known name, "jmxrmi"
+# - the following properties are read for JMX remote management.
+#
+# The configuration can be specified only at startup time.
+# Later changes to above system property (e.g. via setProperty method),
+# this config file, the password file, or the access file have no effect to the
+# running MBean server, the connector, or the registry.
+#
+
+#
+# ########## RMI connector settings for local management ##########
+#
+# com.sun.management.jmxremote.local.only=true|false
+# Default for this property is true. (Case for true/false ignored)
+# If this property is specified as true then the local JMX RMI connector
+# server will only accept connection requests from clients running on
+# the host where the out-of-the-box JMX management agent is running.
+# In order to ensure backwards compatibility this property could be
+# set to false. However, deploying the local management agent in this
+# way is discouraged because the local JMX RMI connector server will
+# accept connection requests from any client either local or remote.
+# For remote management the remote JMX RMI connector server should
+# be used instead with authentication and SSL/TLS encryption enabled.
+#
+
+# For allowing the local management agent accept local
+# and remote connection requests use the following line
+# com.sun.management.jmxremote.local.only=false
+
+#
+# ###################### RMI SSL #############################
+#
+# com.sun.management.jmxremote.ssl=true|false
+# Default for this property is true. (Case for true/false ignored)
+# If this property is specified as false then SSL is not used.
+#
+
+# For RMI monitoring without SSL use the following line
+# com.sun.management.jmxremote.ssl=false
+
+# com.sun.management.jmxremote.ssl.config.file=filepath
+# Specifies the location of the SSL configuration file. A properties
+# file can be used to supply the keystore and truststore location and
+# password settings thus avoiding to pass them as cleartext in the
+# command-line.
+#
+# The current implementation of the out-of-the-box management agent will
+# look up and use the properties specified below to configure the SSL
+# keystore and truststore, if present:
+# javax.net.ssl.keyStore=<keystore-location>
+# javax.net.ssl.keyStorePassword=<keystore-password>
+# javax.net.ssl.trustStore=<truststore-location>
+# javax.net.ssl.trustStorePassword=<truststore-password>
+# Any other properties in the file will be ignored. This will allow us
+# to extend the property set in the future if required by the default
+# SSL implementation.
+#
+# If the property "com.sun.management.jmxremote.ssl" is set to false,
+# then this property is ignored.
+#
+
+# For supplying the keystore settings in a file use the following line
+# com.sun.management.jmxremote.ssl.config.file=filepath
+
+# com.sun.management.jmxremote.ssl.enabled.cipher.suites=<cipher-suites>
+# The value of this property is a string that is a comma-separated list
+# of SSL/TLS cipher suites to enable. This property can be specified in
+# conjunction with the previous property "com.sun.management.jmxremote.ssl"
+# in order to control which particular SSL/TLS cipher suites are enabled
+# for use by accepted connections. If this property is not specified then
+# the SSL/TLS RMI Server Socket Factory uses the SSL/TLS cipher suites that
+# are enabled by default.
+#
+
+# com.sun.management.jmxremote.ssl.enabled.protocols=<protocol-versions>
+# The value of this property is a string that is a comma-separated list
+# of SSL/TLS protocol versions to enable. This property can be specified in
+# conjunction with the previous property "com.sun.management.jmxremote.ssl"
+# in order to control which particular SSL/TLS protocol versions are
+# enabled for use by accepted connections. If this property is not
+# specified then the SSL/TLS RMI Server Socket Factory uses the SSL/TLS
+# protocol versions that are enabled by default.
+#
+
+# com.sun.management.jmxremote.ssl.need.client.auth=true|false
+# Default for this property is false. (Case for true/false ignored)
+# If this property is specified as true in conjunction with the previous
+# property "com.sun.management.jmxremote.ssl" then the SSL/TLS RMI Server
+# Socket Factory will require client authentication.
+#
+
+# For RMI monitoring with SSL client authentication use the following line
+# com.sun.management.jmxremote.ssl.need.client.auth=true
+
+# com.sun.management.jmxremote.registry.ssl=true|false
+# Default for this property is false. (Case for true/false ignored)
+# If this property is specified as true then the RMI registry used
+# to bind the RMIServer remote object is protected with SSL/TLS
+# RMI Socket Factories that can be configured with the properties:
+# com.sun.management.jmxremote.ssl.config.file
+# com.sun.management.jmxremote.ssl.enabled.cipher.suites
+# com.sun.management.jmxremote.ssl.enabled.protocols
+# com.sun.management.jmxremote.ssl.need.client.auth
+# If the two properties below are true at the same time, i.e.
+# com.sun.management.jmxremote.ssl=true
+# com.sun.management.jmxremote.registry.ssl=true
+# then the RMIServer remote object and the RMI registry are
+# both exported with the same SSL/TLS RMI Socket Factories.
+#
+
+# For using an SSL/TLS protected RMI registry use the following line
+# com.sun.management.jmxremote.registry.ssl=true
+
+#
+# ################ RMI User authentication ################
+#
+# com.sun.management.jmxremote.authenticate=true|false
+# Default for this property is true. (Case for true/false ignored)
+# If this property is specified as false then no authentication is
+# performed and all users are allowed all access.
+#
+
+# For RMI monitoring without any checking use the following line
+# com.sun.management.jmxremote.authenticate=false
+
+#
+# ################ RMI Login configuration ###################
+#
+# com.sun.management.jmxremote.login.config=<config-name>
+# Specifies the name of a JAAS login configuration entry to use when
+# authenticating users of RMI monitoring.
+#
+# Setting this property is optional - the default login configuration
+# specifies a file-based authentication that uses the password file.
+#
+# When using this property to override the default login configuration
+# then the named configuration entry must be in a file that gets loaded
+# by JAAS. In addition, the login module(s) specified in the configuration
+# should use the name and/or password callbacks to acquire the user's
+# credentials. See the NameCallback and PasswordCallback classes in the
+# javax.security.auth.callback package for more details.
+#
+# If the property "com.sun.management.jmxremote.authenticate" is set to
+# false, then this property and the password & access files are ignored.
+#
+
+# For a non-default login configuration use the following line
+# com.sun.management.jmxremote.login.config=<config-name>
+
+#
+# ################ RMI Password file location ##################
+#
+# com.sun.management.jmxremote.password.file=filepath
+# Specifies location for password file
+# This is optional - default location is
+# $JRE/lib/management/jmxremote.password
+#
+# If the property "com.sun.management.jmxremote.authenticate" is set to
+# false, then this property and the password & access files are ignored.
+# Otherwise the password file must exist and be in the valid format.
+# If the password file is empty or non-existent then no access is allowed.
+#
+
+# For a non-default password file location use the following line
+# com.sun.management.jmxremote.password.file=filepath
+
+#
+# ################ RMI Access file location #####################
+#
+# com.sun.management.jmxremote.access.file=filepath
+# Specifies location for access file
+# This is optional - default location is
+# $JRE/lib/management/jmxremote.access
+#
+# If the property "com.sun.management.jmxremote.authenticate" is set to
+# false, then this property and the password & access files are ignored.
+# Otherwise, the access file must exist and be in the valid format.
+# If the access file is empty or non-existent then no access is allowed.
+#
+
+# For a non-default password file location use the following line
+# com.sun.management.jmxremote.access.file=filepath
+#
+
+# ################ Management agent listen interface #########################
+#
+# com.sun.management.jmxremote.host=<host-or-interface-name>
+# Specifies the local interface on which the JMX RMI agent will bind.
+# This is useful when running on machines which have several
+# interfaces defined. It makes it possible to listen to a specific
+# subnet accessible through that interface.
+#
+# The format of the value for that property is any string accepted
+# by java.net.InetAddress.getByName(String).
+#
diff --git a/grid/jre/lib/management/snmp.acl.template b/grid/jre/lib/management/snmp.acl.template
new file mode 100644
index 0000000..0e76676
--- /dev/null
+++ b/grid/jre/lib/management/snmp.acl.template
@@ -0,0 +1,110 @@
+# ----------------------------------------------------------------------
+# Template for SNMP Access Control List File
+#
+# o Copy this template to snmp.acl
+# o Set access control for SNMP support
+# o Change the permission of snmp.acl to be read-only
+# by the owner.
+#
+# See below for the location of snmp.acl file.
+# ----------------------------------------------------------------------
+
+############################################################
+# SNMP Access Control List File
+############################################################
+#
+# Default location of this file is $JRE/lib/management/snmp.acl.
+# You can specify an alternate location by specifying a property in
+# the management config file $JRE/lib/management/management.properties
+# or by specifying a system property (See that file for details).
+#
+
+
+##############################################################
+# File permissions of the snmp.acl file
+##############################################################
+#
+# Since there are cleartext community strings stored in this file,
+# this ACL file must be readable by ONLY the owner,
+# otherwise the program will exit with an error.
+#
+##############################################################
+# Format of the acl group
+##############################################################
+#
+# communities: a list of SNMP community strings to which the
+# access control applies separated by commas.
+#
+# access: either "read-only" or "read-write".
+#
+# managers: a list of hosts to be granted the access rights.
+# Each can be expressed as any one of the following:
+# - hostname: hubble
+# - ip v4 and v6 addresses: 123.456.789.12 , fe80::a00:20ff:fe9b:ea82
+# - ip v4 and v6 netmask prefix notation: 123.456.789.0/24,
+# fe80::a00:20ff:fe9b:ea82/64
+# see RFC 2373 (http://www.ietf.org/rfc/rfc2373.txt)
+#
+# An example of two community groups for multiple hosts:
+# acl = {
+# {
+# communities = public, private
+# access = read-only
+# managers = hubble, snowbell, nanak
+# }
+# {
+# communities = jerry
+# access = read-write
+# managers = hubble, telescope
+# }
+# }
+#
+##############################################################
+# Format of the trap group
+##############################################################
+#
+# trap-community: a single SNMP community string that will be included
+# in the traps sent to the hosts.
+#
+# hosts: a list of hosts to which the SNMP agent will send traps.
+#
+# An example of two trap community definitions for multiple hosts:
+# trap = {
+# {
+# trap-community = public
+# hosts = hubble, snowbell
+# }
+# {
+# trap-community = private
+# hosts = telescope
+# }
+# }
+#
+############################################################
+#
+# Update the community strings (public and private) below
+# before copying this template file
+#
+# Common SNMP ACL Example
+# ------------------------
+#
+# o Only localhost can connect, and access rights
+# are limited to read-only
+# o Traps are sent to localhost only
+#
+#
+# acl = {
+# {
+# communities = public, private
+# access = read-only
+# managers = localhost
+# }
+# }
+#
+#
+# trap = {
+# {
+# trap-community = public
+# hosts = localhost
+# }
+# }
diff --git a/grid/jre/lib/meta-index b/grid/jre/lib/meta-index
new file mode 100644
index 0000000..24a8e0a
--- /dev/null
+++ b/grid/jre/lib/meta-index
@@ -0,0 +1,92 @@
+% VERSION 2
+% WARNING: this file is auto-generated; do not edit
+% UNSUPPORTED: this file and its format may change and/or
+% may be removed in a future release
+# charsets.jar
+sun/nio
+sun/awt
+# jce.jar
+javax/crypto
+sun/security
+META-INF/ORACLE_J.RSA
+META-INF/ORACLE_J.SF
+# jfr.jar
+oracle/jrockit/
+jdk/jfr
+com/oracle/jrockit/
+! jsse.jar
+sun/security
+com/sun/net/
+! management-agent.jar
+@ resources.jar
+com/sun/java/util/jar/pack/
+META-INF/services/sun.util.spi.XmlPropertiesProvider
+META-INF/services/javax.print.PrintServiceLookup
+com/sun/corba/
+META-INF/services/javax.sound.midi.spi.SoundbankReader
+sun/print
+META-INF/services/javax.sound.midi.spi.MidiFileReader
+META-INF/services/sun.java2d.cmm.CMMServiceProvider
+javax/swing
+META-INF/services/javax.sound.sampled.spi.AudioFileReader
+META-INF/services/javax.sound.midi.spi.MidiDeviceProvider
+sun/net
+META-INF/services/javax.sound.sampled.spi.AudioFileWriter
+com/sun/imageio/
+META-INF/services/sun.java2d.pipe.RenderingEngine
+META-INF/mimetypes.default
+META-INF/services/javax.sound.midi.spi.MidiFileWriter
+sun/rmi
+javax/sql
+META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin
+com/sun/rowset/
+META-INF/services/javax.print.StreamPrintServiceFactory
+META-INF/mailcap.default
+java/lang
+sun/text
+javax/xml
+META-INF/services/javax.sound.sampled.spi.MixerProvider
+com/sun/xml/
+META-INF/services/com.sun.tools.internal.xjc.Plugin
+com/sun/java/swing/
+com/sun/jndi/
+com/sun/org/
+META-INF/services/javax.sound.sampled.spi.FormatConversionProvider
+! rt.jar
+com/sun/java/util/jar/pack/
+java/
+org/ietf/
+com/sun/beans/
+com/sun/tracing/
+com/sun/java/browser/
+com/sun/corba/
+com/sun/media/
+com/sun/awt/
+com/sun/management/
+sun/
+com/sun/jmx/
+com/sun/demo/
+com/sun/imageio/
+com/sun/net/
+com/sun/rmi/
+org/w3c/
+com/sun/swing/
+com/sun/activation/
+com/sun/nio/
+com/sun/rowset/
+org/jcp/
+com/sun/istack/
+jdk/
+com/sun/naming/
+org/xml/
+org/omg/
+com/sun/security/
+com/sun/image/
+com/sun/xml/
+com/sun/java/swing/
+com/oracle/
+com/sun/java_cup/
+com/sun/jndi/
+com/sun/accessibility/
+com/sun/org/
+javax/
diff --git a/grid/jre/lib/net.properties b/grid/jre/lib/net.properties
new file mode 100644
index 0000000..a541eef
--- /dev/null
+++ b/grid/jre/lib/net.properties
@@ -0,0 +1,121 @@
+############################################################
+# Default Networking Configuration File
+#
+# This file may contain default values for the networking system properties.
+# These values are only used when the system properties are not specified
+# on the command line or set programatically.
+# For now, only the various proxy settings can be configured here.
+############################################################
+
+# Whether or not the DefaultProxySelector will default to System Proxy
+# settings when they do exist.
+# Set it to 'true' to enable this feature and check for platform
+# specific proxy settings
+# Note that the system properties that do explicitely set proxies
+# (like http.proxyHost) do take precedence over the system settings
+# even if java.net.useSystemProxies is set to true.
+
+java.net.useSystemProxies=false
+
+#------------------------------------------------------------------------
+# Proxy configuration for the various protocol handlers.
+# DO NOT uncomment these lines if you have set java.net.useSystemProxies
+# to true as the protocol specific properties will take precedence over
+# system settings.
+#------------------------------------------------------------------------
+
+# HTTP Proxy settings. proxyHost is the name of the proxy server
+# (e.g. proxy.mydomain.com), proxyPort is the port number to use (default
+# value is 80) and nonProxyHosts is a '|' separated list of hostnames which
+# should be accessed directly, ignoring the proxy server (default value is
+# localhost & 127.0.0.1).
+#
+# http.proxyHost=
+# http.proxyPort=80
+http.nonProxyHosts=localhost|127.*|[::1]
+#
+# HTTPS Proxy Settings. proxyHost is the name of the proxy server
+# (e.g. proxy.mydomain.com), proxyPort is the port number to use (default
+# value is 443). The HTTPS protocol handlers uses the http nonProxyHosts list.
+#
+# https.proxyHost=
+# https.proxyPort=443
+#
+# FTP Proxy settings. proxyHost is the name of the proxy server
+# (e.g. proxy.mydomain.com), proxyPort is the port number to use (default
+# value is 80) and nonProxyHosts is a '|' separated list of hostnames which
+# should be accessed directly, ignoring the proxy server (default value is
+# localhost & 127.0.0.1).
+#
+# ftp.proxyHost=
+# ftp.proxyPort=80
+ftp.nonProxyHosts=localhost|127.*|[::1]
+#
+# Gopher Proxy settings. proxyHost is the name of the proxy server
+# (e.g. proxy.mydomain.com), proxyPort is the port number to use (default
+# value is 80)
+#
+# gopher.proxyHost=
+# gopher.proxyPort=80
+#
+# Socks proxy settings. socksProxyHost is the name of the proxy server
+# (e.g. socks.domain.com), socksProxyPort is the port number to use
+# (default value is 1080)
+#
+# socksProxyHost=
+# socksProxyPort=1080
+#
+# HTTP Keep Alive settings. remainingData is the maximum amount of data
+# in kilobytes that will be cleaned off the underlying socket so that it
+# can be reused (default value is 512K), queuedConnections is the maximum
+# number of Keep Alive connections to be on the queue for clean up (default
+# value is 10).
+# http.KeepAlive.remainingData=512
+# http.KeepAlive.queuedConnections=10
+
+# Authentication Scheme restrictions for HTTP and HTTPS.
+#
+# In some environments certain authentication schemes may be undesirable
+# when proxying HTTP or HTTPS. For example, "Basic" results in effectively the
+# cleartext transmission of the user's password over the physical network.
+# This section describes the mechanism for disabling authentication schemes
+# based on the scheme name. Disabled schemes will be treated as if they are not
+# supported by the implementation.
+#
+# The 'jdk.http.auth.tunneling.disabledSchemes' property lists the authentication
+# schemes that will be disabled when tunneling HTTPS over a proxy, HTTP CONNECT.
+# The 'jdk.http.auth.proxying.disabledSchemes' property lists the authentication
+# schemes that will be disabled when proxying HTTP.
+#
+# In both cases the property is a comma-separated list of, case-insensitive,
+# authentication scheme names, as defined by their relevant RFCs. An
+# implementation may, but is not required to, support common schemes whose names
+# include: 'Basic', 'Digest', 'NTLM', 'Kerberos', 'Negotiate'. A scheme that
+# is not known, or not supported, by the implementation is ignored.
+#
+# Note: This property is currently used by the JDK Reference implementation. It
+# is not guaranteed to be examined and used by other implementations.
+#
+#jdk.http.auth.proxying.disabledSchemes=
+jdk.http.auth.tunneling.disabledSchemes=Basic
+
+#
+# Transparent NTLM HTTP authentication mode on Windows. Transparent authentication
+# can be used for the NTLM scheme, where the security credentials based on the
+# currently logged in user's name and password can be obtained directly from the
+# operating system, without prompting the user. This property has three possible
+# values which regulate the behavior as shown below. Other unrecognized values
+# are handled the same as 'disabled'. Note, that NTLM is not considered to be a
+# strongly secure authentication scheme and care should be taken before enabling
+# this mechanism.
+#
+# Transparent authentication never used.
+#jdk.http.ntlm.transparentAuth=disabled
+#
+# Enabled for all hosts.
+#jdk.http.ntlm.transparentAuth=allHosts
+#
+# Enabled for hosts that are trusted in Windows Internet settings
+#jdk.http.ntlm.transparentAuth=trustedHosts
+#
+jdk.http.ntlm.transparentAuth=disabled
diff --git a/grid/jre/lib/plugin.jar b/grid/jre/lib/plugin.jar
new file mode 100644
index 0000000..f18e905
--- /dev/null
+++ b/grid/jre/lib/plugin.jar
Binary files differ
diff --git a/grid/jre/lib/psfont.properties.ja b/grid/jre/lib/psfont.properties.ja
new file mode 100644
index 0000000..98a895f
--- /dev/null
+++ b/grid/jre/lib/psfont.properties.ja
@@ -0,0 +1,119 @@
+#
+#
+# Copyright (c) 1996, 2000, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+
+#
+# Japanese PostScript printer property file
+#
+font.num=16
+#
+serif=serif
+timesroman=serif
+sansserif=sansserif
+helvetica=sansserif
+monospaced=monospaced
+courier=monospaced
+dialog=sansserif
+dialoginput=monospaced
+#
+serif.latin1.plain=Times-Roman
+serif.latin1.italic=Times-Italic
+serif.latin1.bolditalic=Times-BoldItalic
+serif.latin1.bold=Times-Bold
+#
+sansserif.latin1.plain=Helvetica
+sansserif.latin1.italic=Helvetica-Oblique
+sansserif.latin1.bolditalic=Helvetica-BoldOblique
+sansserif.latin1.bold=Helvetica-Bold
+#
+monospaced.latin1.plain=Courier
+monospaced.latin1.italic=Courier-Oblique
+monospaced.latin1.bolditalic=Courier-BoldOblique
+monospaced.latin1.bold=Courier-Bold
+#
+serif.x11jis0208.plain=Ryumin-Light-H
+serif.x11jis0208.italic=Ryumin-Light-H
+serif.x11jis0208.bolditalic=Ryumin-Light-H
+serif.x11jis0208.bold=Ryumin-Light-H
+#
+sansserif.x11jis0208.plain=GothicBBB-Medium-H
+sansserif.x11jis0208.italic=GothicBBB-Medium-H
+sansserif.x11jis0208.bolditalic=GothicBBB-Medium-H
+sansserif.x11jis0208.bold=GothicBBB-Medium-H
+#
+monospaced.x11jis0208.plain=GothicBBB-Medium-H
+monospaced.x11jis0208.italic=GothicBBB-Medium-H
+monospaced.x11jis0208.bolditalic=GothicBBB-Medium-H
+monospaced.x11jis0208.bold=GothicBBB-Medium-H
+#
+serif.x11jis0201.plain=Ryumin-Light.Hankaku
+serif.x11jis0201.italic=Ryumin-Light.Hankaku
+serif.x11jis0201.bolditalic=Ryumin-Light.Hankaku
+serif.x11jis0201.bold=Ryumin-Light.Hankaku
+#
+sansserif.x11jis0201.plain=GothicBBB-Medium.Hankaku
+sansserif.x11jis0201.italic=GothicBBB-Medium.Hankaku
+sansserif.x11jis0201.bolditalic=GothicBBB-Medium.Hankaku
+sansserif.x11jis0201.bold=GothicBBB-Medium.Hankaku
+#
+monospaced.x11jis0201.plain=GothicBBB-Medium.Hankaku
+monospaced.x11jis0201.italic=GothicBBB-Medium.Hankaku
+monospaced.x11jis0201.bolditalic=GothicBBB-Medium.Hankaku
+monospaced.x11jis0201.bold=GothicBBB-Medium.Hankaku
+#
+Helvetica=0
+Helvetica-Bold=1
+Helvetica-Oblique=2
+Helvetica-BoldOblique=3
+Times-Roman=4
+Times-Bold=5
+Times-Italic=6
+Times-BoldItalic=7
+Courier=8
+Courier-Bold=9
+Courier-Oblique=10
+Courier-BoldOblique=11
+GothicBBB-Medium-H=12
+Ryumin-Light-H=13
+GothicBBB-Medium.Hankaku=14
+Ryumin-Light.Hankaku=15
+#
+font.0=Helvetica ISOF
+font.1=Helvetica-Bold ISOF
+font.2=Helvetica-Oblique ISOF
+font.3=Helvetica-BoldOblique ISOF
+font.4=Times-Roman ISOF
+font.5=Times-Bold ISOF
+font.6=Times-Italic ISOF
+font.7=Times-BoldItalic ISOF
+font.8=Courier ISOF
+font.9=Courier-Bold ISOF
+font.10=Courier-Oblique ISOF
+font.11=Courier-BoldOblique ISOF
+font.12=GothicBBB-Medium-H findfont
+font.13=Ryumin-Light-H findfont
+font.14=GothicBBB-Medium.Hankaku findfont
+font.15=Ryumin-Light.Hankaku findfont
+#
diff --git a/grid/jre/lib/psfontj2d.properties b/grid/jre/lib/psfontj2d.properties
new file mode 100644
index 0000000..085f57b
--- /dev/null
+++ b/grid/jre/lib/psfontj2d.properties
@@ -0,0 +1,323 @@
+#
+#
+# Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+
+#
+# PostScript printer property file for Java 2D printing.
+#
+# WARNING: This is an internal implementation file, not a public file.
+# Any customisation or reliance on the existence of this file and its
+# contents or syntax is discouraged and unsupported.
+# It may be incompatibly changed or removed without any notice.
+#
+#
+font.num=35
+#
+# Legacy logical font family names and logical font aliases should all
+# map to the primary logical font names.
+#
+serif=serif
+times=serif
+timesroman=serif
+sansserif=sansserif
+helvetica=sansserif
+dialog=sansserif
+dialoginput=monospaced
+monospaced=monospaced
+courier=monospaced
+#
+# Next, physical fonts which can be safely mapped to standard postscript fonts
+# These keys generally map to a value which is the same as the key, so
+# the key/value is just a way to say the font has a mapping.
+# Sometimes however we map more than one screen font to the same PS font.
+#
+avantgarde=avantgarde_book
+avantgarde_book=avantgarde_book
+avantgarde_demi=avantgarde_demi
+avantgarde_book_oblique=avantgarde_book_oblique
+avantgarde_demi_oblique=avantgarde_demi_oblique
+#
+itcavantgarde=avantgarde_book
+itcavantgarde=avantgarde_book
+itcavantgarde_demi=avantgarde_demi
+itcavantgarde_oblique=avantgarde_book_oblique
+itcavantgarde_demi_oblique=avantgarde_demi_oblique
+#
+bookman=bookman_light
+bookman_light=bookman_light
+bookman_demi=bookman_demi
+bookman_light_italic=bookman_light_italic
+bookman_demi_italic=bookman_demi_italic
+#
+# Exclude "helvetica" on its own as that's a legacy name for a logical font
+helvetica_bold=helvetica_bold
+helvetica_oblique=helvetica_oblique
+helvetica_bold_oblique=helvetica_bold_oblique
+#
+itcbookman_light=bookman_light
+itcbookman_demi=bookman_demi
+itcbookman_light_italic=bookman_light_italic
+itcbookman_demi_italic=bookman_demi_italic
+#
+# Exclude "courier" on its own as that's a legacy name for a logical font
+courier_bold=courier_bold
+courier_oblique=courier_oblique
+courier_bold_oblique=courier_bold_oblique
+#
+courier_new=courier
+courier_new_bold=courier_bold
+#
+monotype_century_schoolbook=newcenturyschoolbook
+monotype_century_schoolbook_bold=newcenturyschoolbook_bold
+monotype_century_schoolbook_italic=newcenturyschoolbook_italic
+monotype_century_schoolbook_bold_italic=newcenturyschoolbook_bold_italic
+#
+newcenturyschoolbook=newcenturyschoolbook
+newcenturyschoolbook_bold=newcenturyschoolbook_bold
+newcenturyschoolbook_italic=newcenturyschoolbook_italic
+newcenturyschoolbook_bold_italic=newcenturyschoolbook_bold_italic
+#
+palatino=palatino
+palatino_bold=palatino_bold
+palatino_italic=palatino_italic
+palatino_bold_italic=palatino_bold_italic
+#
+# Exclude "times" on its own as that's a legacy name for a logical font
+times_bold=times_roman_bold
+times_italic=times_roman_italic
+times_bold_italic=times_roman_bold_italic
+#
+times_roman=times_roman
+times_roman_bold=times_roman_bold
+times_roman_italic=times_roman_italic
+times_roman_bold_italic=times_roman_bold_italic
+#
+times_new_roman=times_roman
+times_new_roman_bold=times_roman_bold
+times_new_roman_italic=times_roman_italic
+times_new_roman_bold_italic=times_roman_bold_italic
+#
+zapfchancery_italic=zapfchancery_italic
+itczapfchancery_italic=zapfchancery_italic
+#
+# Next the mapping of the font name + charset + style to Postscript font name
+# for the logical fonts.
+#
+serif.latin1.plain=Times-Roman
+serif.latin1.bold=Times-Bold
+serif.latin1.italic=Times-Italic
+serif.latin1.bolditalic=Times-BoldItalic
+serif.symbol.plain=Symbol
+serif.dingbats.plain=ZapfDingbats
+serif.symbol.bold=Symbol
+serif.dingbats.bold=ZapfDingbats
+serif.symbol.italic=Symbol
+serif.dingbats.italic=ZapfDingbats
+serif.symbol.bolditalic=Symbol
+serif.dingbats.bolditalic=ZapfDingbats
+#
+sansserif.latin1.plain=Helvetica
+sansserif.latin1.bold=Helvetica-Bold
+sansserif.latin1.italic=Helvetica-Oblique
+sansserif.latin1.bolditalic=Helvetica-BoldOblique
+sansserif.symbol.plain=Symbol
+sansserif.dingbats.plain=ZapfDingbats
+sansserif.symbol.bold=Symbol
+sansserif.dingbats.bold=ZapfDingbats
+sansserif.symbol.italic=Symbol
+sansserif.dingbats.italic=ZapfDingbats
+sansserif.symbol.bolditalic=Symbol
+sansserif.dingbats.bolditalic=ZapfDingbats
+#
+monospaced.latin1.plain=Courier
+monospaced.latin1.bold=Courier-Bold
+monospaced.latin1.italic=Courier-Oblique
+monospaced.latin1.bolditalic=Courier-BoldOblique
+monospaced.symbol.plain=Symbol
+monospaced.dingbats.plain=ZapfDingbats
+monospaced.symbol.bold=Symbol
+monospaced.dingbats.bold=ZapfDingbats
+monospaced.symbol.italic=Symbol
+monospaced.dingbats.italic=ZapfDingbats
+monospaced.symbol.bolditalic=Symbol
+monospaced.dingbats.bolditalic=ZapfDingbats
+#
+# Next the mapping of the font name + charset + style to Postscript font name
+# for the physical fonts. Since these always report style as plain, the
+# style key is always plain. So we map using the face name to the correct
+# style for the postscript font. This is possible since the face names can
+# be replied upon to be different for each style.
+# However an application may try to create a Font applying a style to an
+# physical name. We want to map to the correct Postscript font there too
+# if possible but we do not map cases where the application tries to
+# augment a style (eg ask for a bold version of a bold font)
+# Defer to the 2D package to attempt create an artificially styled version
+#
+avantgarde_book.latin1.plain=AvantGarde-Book
+avantgarde_demi.latin1.plain=AvantGarde-Demi
+avantgarde_book_oblique.latin1.plain=AvantGarde-BookOblique
+avantgarde_demi_oblique.latin1.plain=AvantGarde-DemiOblique
+#
+avantgarde_book.latin1.bold=AvantGarde-Demi
+avantgarde_book.latin1.italic=AvantGarde-BookOblique
+avantgarde_book.latin1.bolditalic=AvantGarde-DemiOblique
+avantgarde_demi.latin1.italic=AvantGarde-DemiOblique
+avantgarde_book_oblique.latin1.bold=AvantGarde-DemiOblique
+#
+bookman_light.latin1.plain=Bookman-Light
+bookman_demi.latin1.plain=Bookman-Demi
+bookman_light_italic.latin1.plain=Bookman-LightItalic
+bookman_demi_italic.latin1.plain=Bookman-DemiItalic
+#
+bookman_light.latin1.bold=Bookman-Demi
+bookman_light.latin1.italic=Bookman-LightItalic
+bookman_light.latin1.bolditalic=Bookman-DemiItalic
+bookman_light_bold.latin1.italic=Bookman-DemiItalic
+bookman_light_italic.latin1.bold=Bookman-DemiItalic
+#
+courier.latin1.plain=Courier
+courier_bold.latin1.plain=Courier-Bold
+courier_oblique.latin1.plain=Courier-Oblique
+courier_bold_oblique.latin1.plain=Courier-BoldOblique
+courier.latin1.bold=Courier-Bold
+courier.latin1.italic=Courier-Oblique
+courier.latin1.bolditalic=Courier-BoldOblique
+courier_bold.latin1.italic=Courier-BoldOblique
+courier_italic.latin1.bold=Courier-BoldOblique
+#
+helvetica_bold.latin1.plain=Helvetica-Bold
+helvetica_oblique.latin1.plain=Helvetica-Oblique
+helvetica_bold_oblique.latin1.plain=Helvetica-BoldOblique
+helvetica.latin1.bold=Helvetica-Bold
+helvetica.latin1.italic=Helvetica-Oblique
+helvetica.latin1.bolditalic=Helvetica-BoldOblique
+helvetica_bold.latin1.italic=Helvetica-BoldOblique
+helvetica_italic.latin1.bold=Helvetica-BoldOblique
+#
+newcenturyschoolbook.latin1.plain=NewCenturySchlbk-Roman
+newcenturyschoolbook_bold.latin1.plain=NewCenturySchlbk-Bold
+newcenturyschoolbook_italic.latin1.plain=NewCenturySchlbk-Italic
+newcenturyschoolbook_bold_italic.latin1.plain=NewCenturySchlbk-BoldItalic
+newcenturyschoolbook.latin1.bold=NewCenturySchlbk-Bold
+newcenturyschoolbook.latin1.italic=NewCenturySchlbk-Italic
+newcenturyschoolbook.latin1.bolditalic=NewCenturySchlbk-BoldItalic
+newcenturyschoolbook_bold.latin1.italic=NewCenturySchlbk-BoldItalic
+newcenturyschoolbook_italic.latin1.bold=NewCenturySchlbk-BoldItalic
+#
+palatino.latin1.plain=Palatino-Roman
+palatino_bold.latin1.plain=Palatino-Bold
+palatino_italic.latin1.plain=Palatino-Italic
+palatino_bold_italic.latin1.plain=Palatino-BoldItalic
+palatino.latin1.bold=Palatino-Bold
+palatino.latin1.italic=Palatino-Italic
+palatino.latin1.bolditalic=Palatino-BoldItalic
+palatino_bold.latin1.italic=Palatino-BoldItalic
+palatino_italic.latin1.bold=Palatino-BoldItalic
+#
+times_roman.latin1.plain=Times-Roman
+times_roman_bold.latin1.plain=Times-Bold
+times_roman_italic.latin1.plain=Times-Italic
+times_roman_bold_italic.latin1.plain=Times-BoldItalic
+times_roman.latin1.bold=Times-Bold
+times_roman.latin1.italic=Times-Italic
+times_roman.latin1.bolditalic=Times-BoldItalic
+times_roman_bold.latin1.italic=Times-BoldItalic
+times_roman_italic.latin1.bold=Times-BoldItalic
+#
+zapfchancery_italic.latin1.plain=ZapfChancery-MediumItalic
+#
+# Finally the mappings of PS font names to indexes.
+#
+AvantGarde-Book=0
+AvantGarde-BookOblique=1
+AvantGarde-Demi=2
+AvantGarde-DemiOblique=3
+Bookman-Demi=4
+Bookman-DemiItalic=5
+Bookman-Light=6
+Bookman-LightItalic=7
+Courier=8
+Courier-Bold=9
+Courier-BoldOblique=10
+Courier-Oblique=11
+Helvetica=12
+Helvetica-Bold=13
+Helvetica-BoldOblique=14
+Helvetica-Narrow=15
+Helvetica-Narrow-Bold=16
+Helvetica-Narrow-BoldOblique=17
+Helvetica-Narrow-Oblique=18
+Helvetica-Oblique=19
+NewCenturySchlbk-Bold=20
+NewCenturySchlbk-BoldItalic=21
+NewCenturySchlbk-Italic=22
+NewCenturySchlbk-Roman=23
+Palatino-Bold=24
+Palatino-BoldItalic=25
+Palatino-Italic=26
+Palatino-Roman=27
+Symbol=28
+Times-Bold=29
+Times-BoldItalic=30
+Times-Italic=31
+Times-Roman=32
+ZapfDingbats=33
+ZapfChancery-MediumItalic=34
+#
+font.0=AvantGarde-Book ISOF
+font.1=AvantGarde-BookOblique ISOF
+font.2=AvantGarde-Demi ISOF
+font.3=AvantGarde-DemiOblique ISOF
+font.4=Bookman-Demi ISOF
+font.5=Bookman-DemiItalic ISOF
+font.6=Bookman-Light ISOF
+font.7=Bookman-LightItalic ISOF
+font.8=Courier ISOF
+font.9=Courier-Bold ISOF
+font.10=Courier-BoldOblique ISOF
+font.11=Courier-Oblique ISOF
+font.12=Helvetica ISOF
+font.13=Helvetica-Bold ISOF
+font.14=Helvetica-BoldOblique ISOF
+font.15=Helvetica-Narrow ISOF
+font.16=Helvetica-Narrow-Bold ISOF
+font.17=Helvetica-Narrow-BoldOblique ISOF
+font.18=Helvetica-Narrow-Oblique ISOF
+font.19=Helvetica-Oblique ISOF
+font.20=NewCenturySchlbk-Bold ISOF
+font.21=NewCenturySchlbk-BoldItalic ISOF
+font.22=NewCenturySchlbk-Italic ISOF
+font.23=NewCenturySchlbk-Roman ISOF
+font.24=Palatino-Bold ISOF
+font.25=Palatino-BoldItalic ISOF
+font.26=Palatino-Italic ISOF
+font.27=Palatino-Roman ISOF
+font.28=Symbol findfont
+font.29=Times-Bold ISOF
+font.30=Times-BoldItalic ISOF
+font.31=Times-Italic ISOF
+font.32=Times-Roman ISOF
+font.33=ZapfDingbats findfont
+font.34=ZapfChancery-MediumItalic ISOF
+#
diff --git a/grid/jre/lib/resources.jar b/grid/jre/lib/resources.jar
new file mode 100644
index 0000000..fbf1096
--- /dev/null
+++ b/grid/jre/lib/resources.jar
Binary files differ
diff --git a/grid/jre/lib/rt.jar b/grid/jre/lib/rt.jar
new file mode 100644
index 0000000..4ab4d40
--- /dev/null
+++ b/grid/jre/lib/rt.jar
Binary files differ
diff --git a/grid/jre/lib/security/blacklist b/grid/jre/lib/security/blacklist
new file mode 100644
index 0000000..9dfe2f3
--- /dev/null
+++ b/grid/jre/lib/security/blacklist
@@ -0,0 +1,95 @@
+# JNLPAppletLauncher applet-launcher.jar
+SHA1-Digest-Manifest: 5Bo5/eg892hQ9mgbUW56iDmsp1k=
+
+# 7066583
+SHA1-Digest-Manifest: x17xGEFzBRXY2pLtXiIbp8J7U9M=
+SHA1-Digest-Manifest: ya6YNTzMCFYUO4lwhmz9OWhhIz8=
+SHA1-Digest-Manifest: YwuPyF/KMcxcQhgxilzNybFM2+8=
+
+# 7066809
+SHA1-Digest-Manifest: dBKbNW1PZSjJ0lGcCeewcCrYx5g=
+SHA1-Digest-Manifest: lTYCkD1wm5uDcp2G2PNPcADG/ds=
+SHA1-Digest-Manifest: GKwQJtblDEuSVf3LdC1ojpUJRGg=
+
+# 7186931
+SHA1-Digest-Manifest: 0CUppG7J6IL8xHqPCnA377Koahw=
+SHA1-Digest-Manifest: 3aJU1qSK6IYmt5MSh2IIIj5G1XE=
+SHA1-Digest-Manifest: 8F4F0TXA4ureZbfEXWIFm76QGg4=
+SHA1-Digest-Manifest: B1NaDg834Bgg+VE9Ca+tDZOd2BI=
+SHA1-Digest-Manifest: bOoQga+XxC3j0HiP552+fYCdswo=
+SHA1-Digest-Manifest: C4mtepHAyIKiAjjqOm6xYMo8TkM=
+SHA1-Digest-Manifest: cDXEH+bR01R8QVxL+KFKYqFgsR0=
+SHA1-Digest-Manifest: cO2ccW2cckTvpR0HVgQa362PyHI=
+SHA1-Digest-Manifest: D/TyRle6Sl+CDuBFmdOPy03ERaw=
+SHA1-Digest-Manifest: eJfWm86yHp2Oz5U8WrMKbpv6GGA=
+SHA1-Digest-Manifest: g3mA5HqcRBlKaUVQsapnKhOSEas=
+SHA1-Digest-Manifest: HSPXCvBNG/PaSXg8thDGqSeZlR8=
+SHA1-Digest-Manifest: iMHjGyv5gEnTi8uj68yzalml8XQ=
+SHA1-Digest-Manifest: jd5MvBoWh7aHiUa1v15lqXVQ9y4=
+SHA1-Digest-Manifest: L0l3WOuMNWujmXo5+O/GtmGyyYk=
+SHA1-Digest-Manifest: l4meuozuSFLkTZTS6xW3sixdlBI=
+SHA1-Digest-Manifest: l93uYyDZGyynzYTknp31yyuNivU=
+SHA1-Digest-Manifest: lbhLWSopUIqPQ08UVIA927Y7jZQ=
+SHA1-Digest-Manifest: nv5+0eBNHpRIsB9D6TmEbWoNCTs=
+SHA1-Digest-Manifest: obWCTaz3uOZwDBDZUsbrrTKoDig=
+SHA1-Digest-Manifest: odqJCMnKdgvQLOCAMSWEj1EPQTc=
+SHA1-Digest-Manifest: OfQZHjo8GK14bHD4z4dDIp4ZFjE=
+SHA1-Digest-Manifest: PVAkXuUCgiDQI19GPrw01Vz4rGQ=
+SHA1-Digest-Manifest: Q9HXbUcSCjhwkgpk5NNVG/sArVA=
+SHA1-Digest-Manifest: qMVUh9i3yJcTKpuZYSFZH9dspqE=
+SHA1-Digest-Manifest: TFYT30IirbYk89l/uKykM6g2cVQ=
+SHA1-Digest-Manifest: trhKo6XiSGxRrS//rCL9e3Ca6D4=
+SHA1-Digest-Manifest: uWffvhFaWVw3lrER/SJH7Hl4yFg=
+SHA1-Digest-Manifest: vSd+kv1p+3jrVK9FjDCBJcoy5us=
+SHA1-Digest-Manifest: WX77FlRyFyeUriu+xi/PE1uLALU=
+SHA1-Digest-Manifest: WyqHV02O4PYZkcbidH4HKlp/8hY=
+SHA1-Digest-Manifest: Y82nn7CFTu1XAOCDjemWwyPLssg=
+
+# 8002218
+SHA1-Digest-Manifest: saJIx2dYM4ac+paV09g7hyvF7rs=
+SHA1-Digest-Manifest: hYV/Hs2xEIHeidB+9ZVjAtTBr/g=
+
+# 8016260
+SHA1-Digest-Manifest: 0smdeWASG13zex3fGDxo83K7qYo=
+SHA1-Digest-Manifest: 4WnMPDBMLBjDfKvAj69W0KuSS8w=
+SHA1-Digest-Manifest: 8j/GuWpBhLDCVZBHU1MQNOiDsvM=
+SHA1-Digest-Manifest: AR4m0ypEY28WDWxcbuFu9kj5Zjc=
+SHA1-Digest-Manifest: GfE+OoJReiuOJ+pKLOZu+Vu0WEM=
+SHA1-Digest-Manifest: X3VMVm3b45zxF3/ADtQHa/uIKJU=
+SHA1-Digest-Manifest: arC0JJpAy9ZvSEXRYy49Ye2CibQ=
+SHA1-Digest-Manifest: pkjJdE2tSwj6et5Bi4mMWF5acSc=
+SHA1-Digest-Manifest: sn3aY301ITBSofNBRNcr7ThjaGI=
+
+# 8017544
+SHA1-Digest-Manifest: fkUYOYVHwIrvWEVwB1HAcovhNEc=
+
+# 8021173
+SHA1-Digest-Manifest: Dz2BT/+NVo3sql0U3m5sPFdH/VA=
+
+# 8037056
+SHA1-Digest-Manifest: MVlhreomxYWnvgDArNM90zet5W0=
+SHA1-Digest-Manifest: w5irJZDYfOvvHy+O/VIIz2cKw3w=
+SHA1-Digest-Manifest: KPRzEcU95ksGJcok+QoDFLuH1QQ=
+SHA1-Digest-Manifest: ez41Owng2PUbr2C5rioCQQsm/b0=
+SHA-256-Digest-Manifest: VLL/4H0q9NvvtmcFOJ4Xby/5A8CLvniP17VCOFDh7sU=
+SHA1-Digest-Manifest: pmEfDqcnm+9D5OfuJbCdyl/5KhQ=
+SHA1-Digest-Manifest: HG+pOMGiD4nq7aBST8PmLBRXYSo=
+SHA1-Digest-Manifest: 44zEyySUXrZjoYLatw4tftx8clM=
+SHA1-Digest-Manifest: fK87QwgSCJzZ/6qEPFG3AkrKvZg=
+SHA1-Digest-Manifest: jElS0V6NAE1eAGRcoipqAh4m3gE=
+SHA1-Digest-Manifest: XBjfIsdA7VHbWJhwq2jQtm82bL0=
+SHA1-Digest-Manifest: /pFoxkI0CBIj8WqLDYR5jpaQ3uU=
+SHA1-Digest-Manifest: LbWvEAjCRxp5eJGBM23aT+HIkD4=
+SHA1-Digest-Manifest: GIOU0xrFoKvwp/fe0MV5BeQG2dQ=
+SHA1-Digest-Manifest: Tb/mRuIKYF7NBYRSZycBgpHaj6s=
+SHA1-Digest-Manifest: wD5oyERifHf8PXCgztVoSicsEHc=
+SHA1-Digest-Manifest: rWsJWE9ROgb01ZMvLIboUaKFdYg=
+SHA1-Digest-Manifest: BYVBeMAT5dhNcv11cG8w00udM2I=
+SHA1-Digest-Manifest: 3+g4kzj8ObkUJBTmbbgrXInfziU=
+SHA-256-Digest-Manifest: Kx3zq14JuV5ByE35cwkegUnCsiAvBRa4Q6iNQ/JO7I0=
+SHA1-Digest-Manifest: L+0tzPoloVGMtoykhAuZASD3g0g=
+
+# 8067454
+SHA1-Digest-Manifest: mF8yk1Hxc1uH9UorvfG2GJ+ScqY=
+SHA1-Digest-Manifest: yUcLgsHB7H6rf04gLNe0ikKrmfI=
+SHA1-Digest-Manifest: UcdnWBajIuVvJjoGHAPA11Gkg7E=
diff --git a/grid/jre/lib/security/blacklisted.certs b/grid/jre/lib/security/blacklisted.certs
new file mode 100644
index 0000000..e192c1a
--- /dev/null
+++ b/grid/jre/lib/security/blacklisted.certs
@@ -0,0 +1,20 @@
+Algorithm=SHA-256
+14E6D2764A4B06701C6CBC376A253775F79C782FBCB6C0EE6F99DE4BA1024ADD
+31C8FD37DB9B56E708B03D1F01848B068C6DA66F36FB5D82C008C6040FA3E133
+3946901F46B0071E90D78279E82FABABCA177231A704BE72C5B0E8918566EA66
+450F1B421BB05C8609854884559C323319619E8B06B001EA2DCBB74A23AA3BE2
+4CBBF8256BC9888A8007B2F386940A2E394378B0D903CBB3863C5A6394B889CE
+4FEE0163686ECBD65DB968E7494F55D84B25486D438E9DE558D629D28CD4D176
+5E83124D68D24E8E177E306DF643D5EA99C5A94D6FC34B072F7544A1CABB7C7B
+76A45A496031E4DD2D7ED23E8F6FF97DBDEA980BAAC8B0BA94D7EDB551348645
+8A1BD21661C60015065212CC98B1ABB50DFD14C872A208E66BAE890F25C448AF
+9ED8F9B0E8E42A1656B8E1DD18F42BA42DC06FE52686173BA2FC70E756F207DC
+A686FEE577C88AB664D0787ECDFFF035F4806F3DE418DC9E4D516324FFF02083
+B8686723E415534BC0DBD16326F9486F85B0B0799BF6639334E61DAAE67F36CD
+D24566BF315F4E597D6E381C87119FB4198F5E9E2607F5F4AB362EF7E2E7672F
+D3A936E1A7775A45217C8296A1F22AC5631DCDEC45594099E78EEEBBEDCBA967
+DF21016B00FC54F9FE3BC8B039911BB216E9162FAD2FD14D990AB96E951B49BE
+EC30C9C3065A06BB07DC5B1C6B497F370C1CA65C0F30C08E042BA6BCECC78F2C
+F5B6F88F75D391A4B1EB336F9E201239FB6B1377DB8CFA7B84736216E5AFFFD7
+FC02FD48DB92D4DCE6F11679D38354CF750CFC7F584A520EB90BDE80E241F2BD
+FDEDB5BDFCB67411513A61AEE5CB5B5D7C52AF06028EFC996CC1B05B1D6CEA2B
diff --git a/grid/jre/lib/security/cacerts b/grid/jre/lib/security/cacerts
new file mode 100644
index 0000000..61f64ce
--- /dev/null
+++ b/grid/jre/lib/security/cacerts
Binary files differ
diff --git a/grid/jre/lib/security/java.policy b/grid/jre/lib/security/java.policy
new file mode 100644
index 0000000..120694d
--- /dev/null
+++ b/grid/jre/lib/security/java.policy
@@ -0,0 +1,49 @@
+
+// Standard extensions get all permissions by default
+
+grant codeBase "file:${{java.ext.dirs}}/*" {
+ permission java.security.AllPermission;
+};
+
+// default permissions granted to all domains
+
+grant {
+ // Allows any thread to stop itself using the java.lang.Thread.stop()
+ // method that takes no argument.
+ // Note that this permission is granted by default only to remain
+ // backwards compatible.
+ // It is strongly recommended that you either remove this permission
+ // from this policy file or further restrict it to code sources
+ // that you specify, because Thread.stop() is potentially unsafe.
+ // See the API specification of java.lang.Thread.stop() for more
+ // information.
+ permission java.lang.RuntimePermission "stopThread";
+
+ // allows anyone to listen on dynamic ports
+ permission java.net.SocketPermission "localhost:0", "listen";
+
+ // "standard" properies that can be read by anyone
+
+ permission java.util.PropertyPermission "java.version", "read";
+ permission java.util.PropertyPermission "java.vendor", "read";
+ permission java.util.PropertyPermission "java.vendor.url", "read";
+ permission java.util.PropertyPermission "java.class.version", "read";
+ permission java.util.PropertyPermission "os.name", "read";
+ permission java.util.PropertyPermission "os.version", "read";
+ permission java.util.PropertyPermission "os.arch", "read";
+ permission java.util.PropertyPermission "file.separator", "read";
+ permission java.util.PropertyPermission "path.separator", "read";
+ permission java.util.PropertyPermission "line.separator", "read";
+
+ permission java.util.PropertyPermission "java.specification.version", "read";
+ permission java.util.PropertyPermission "java.specification.vendor", "read";
+ permission java.util.PropertyPermission "java.specification.name", "read";
+
+ permission java.util.PropertyPermission "java.vm.specification.version", "read";
+ permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
+ permission java.util.PropertyPermission "java.vm.specification.name", "read";
+ permission java.util.PropertyPermission "java.vm.version", "read";
+ permission java.util.PropertyPermission "java.vm.vendor", "read";
+ permission java.util.PropertyPermission "java.vm.name", "read";
+};
+
diff --git a/grid/jre/lib/security/java.security b/grid/jre/lib/security/java.security
new file mode 100644
index 0000000..5497158
--- /dev/null
+++ b/grid/jre/lib/security/java.security
@@ -0,0 +1,1116 @@
+#
+# This is the "master security properties file".
+#
+# An alternate java.security properties file may be specified
+# from the command line via the system property
+#
+# -Djava.security.properties=<URL>
+#
+# This properties file appends to the master security properties file.
+# If both properties files specify values for the same key, the value
+# from the command-line properties file is selected, as it is the last
+# one loaded.
+#
+# Also, if you specify
+#
+# -Djava.security.properties==<URL> (2 equals),
+#
+# then that properties file completely overrides the master security
+# properties file.
+#
+# To disable the ability to specify an additional properties file from
+# the command line, set the key security.overridePropertiesFile
+# to false in the master security properties file. It is set to true
+# by default.
+
+# In this file, various security properties are set for use by
+# java.security classes. This is where users can statically register
+# Cryptography Package Providers ("providers" for short). The term
+# "provider" refers to a package or set of packages that supply a
+# concrete implementation of a subset of the cryptography aspects of
+# the Java Security API. A provider may, for example, implement one or
+# more digital signature algorithms or message digest algorithms.
+#
+# Each provider must implement a subclass of the Provider class.
+# To register a provider in this master security properties file,
+# specify the Provider subclass name and priority in the format
+#
+# security.provider.<n>=<className>
+#
+# This declares a provider, and specifies its preference
+# order n. The preference order is the order in which providers are
+# searched for requested algorithms (when no specific provider is
+# requested). The order is 1-based; 1 is the most preferred, followed
+# by 2, and so on.
+#
+# <className> must specify the subclass of the Provider class whose
+# constructor sets the values of various properties that are required
+# for the Java Security API to look up the algorithms or other
+# facilities implemented by the provider.
+#
+# There must be at least one provider specification in java.security.
+# There is a default provider that comes standard with the JDK. It
+# is called the "SUN" provider, and its Provider subclass
+# named Sun appears in the sun.security.provider package. Thus, the
+# "SUN" provider is registered via the following:
+#
+# security.provider.1=sun.security.provider.Sun
+#
+# (The number 1 is used for the default provider.)
+#
+# Note: Providers can be dynamically registered instead by calls to
+# either the addProvider or insertProviderAt method in the Security
+# class.
+
+#
+# List of providers and their preference orders (see above):
+#
+security.provider.1=sun.security.provider.Sun
+security.provider.2=sun.security.rsa.SunRsaSign
+security.provider.3=sun.security.ec.SunEC
+security.provider.4=com.sun.net.ssl.internal.ssl.Provider
+security.provider.5=com.sun.crypto.provider.SunJCE
+security.provider.6=sun.security.jgss.SunProvider
+security.provider.7=com.sun.security.sasl.Provider
+security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
+security.provider.9=sun.security.smartcardio.SunPCSC
+security.provider.10=sun.security.mscapi.SunMSCAPI
+
+#
+# Sun Provider SecureRandom seed source.
+#
+# Select the primary source of seed data for the "SHA1PRNG" and
+# "NativePRNG" SecureRandom implementations in the "Sun" provider.
+# (Other SecureRandom implementations might also use this property.)
+#
+# On Unix-like systems (for example, Solaris/Linux/MacOS), the
+# "NativePRNG" and "SHA1PRNG" implementations obtains seed data from
+# special device files such as file:/dev/random.
+#
+# On Windows systems, specifying the URLs "file:/dev/random" or
+# "file:/dev/urandom" will enable the native Microsoft CryptoAPI seeding
+# mechanism for SHA1PRNG.
+#
+# By default, an attempt is made to use the entropy gathering device
+# specified by the "securerandom.source" Security property. If an
+# exception occurs while accessing the specified URL:
+#
+# SHA1PRNG:
+# the traditional system/thread activity algorithm will be used.
+#
+# NativePRNG:
+# a default value of /dev/random will be used. If neither
+# are available, the implementation will be disabled.
+# "file" is the only currently supported protocol type.
+#
+# The entropy gathering device can also be specified with the System
+# property "java.security.egd". For example:
+#
+# % java -Djava.security.egd=file:/dev/random MainClass
+#
+# Specifying this System property will override the
+# "securerandom.source" Security property.
+#
+# In addition, if "file:/dev/random" or "file:/dev/urandom" is
+# specified, the "NativePRNG" implementation will be more preferred than
+# SHA1PRNG in the Sun provider.
+#
+securerandom.source=file:/dev/random
+
+#
+# A list of known strong SecureRandom implementations.
+#
+# To help guide applications in selecting a suitable strong
+# java.security.SecureRandom implementation, Java distributions should
+# indicate a list of known strong implementations using the property.
+#
+# This is a comma-separated list of algorithm and/or algorithm:provider
+# entries.
+#
+securerandom.strongAlgorithms=Windows-PRNG:SunMSCAPI,SHA1PRNG:SUN
+
+#
+# Class to instantiate as the javax.security.auth.login.Configuration
+# provider.
+#
+login.configuration.provider=sun.security.provider.ConfigFile
+
+#
+# Default login configuration file
+#
+#login.config.url.1=file:${user.home}/.java.login.config
+
+#
+# Class to instantiate as the system Policy. This is the name of the class
+# that will be used as the Policy object.
+#
+policy.provider=sun.security.provider.PolicyFile
+
+# The default is to have a single system-wide policy file,
+# and a policy file in the user's home directory.
+policy.url.1=file:${java.home}/lib/security/java.policy
+policy.url.2=file:${user.home}/.java.policy
+
+# whether or not we expand properties in the policy file
+# if this is set to false, properties (${...}) will not be expanded in policy
+# files.
+policy.expandProperties=true
+
+# whether or not we allow an extra policy to be passed on the command line
+# with -Djava.security.policy=somefile. Comment out this line to disable
+# this feature.
+policy.allowSystemProperty=true
+
+# whether or not we look into the IdentityScope for trusted Identities
+# when encountering a 1.1 signed JAR file. If the identity is found
+# and is trusted, we grant it AllPermission.
+policy.ignoreIdentityScope=false
+
+#
+# Default keystore type.
+#
+keystore.type=jks
+
+#
+# Controls compatibility mode for the JKS keystore type.
+#
+# When set to 'true', the JKS keystore type supports loading
+# keystore files in either JKS or PKCS12 format. When set to 'false'
+# it supports loading only JKS keystore files.
+#
+keystore.type.compat=true
+
+#
+# List of comma-separated packages that start with or equal this string
+# will cause a security exception to be thrown when
+# passed to checkPackageAccess unless the
+# corresponding RuntimePermission ("accessClassInPackage."+package) has
+# been granted.
+package.access=sun.,\
+ com.sun.xml.internal.,\
+ com.sun.imageio.,\
+ com.sun.istack.internal.,\
+ com.sun.jmx.,\
+ com.sun.media.sound.,\
+ com.sun.naming.internal.,\
+ com.sun.proxy.,\
+ com.sun.corba.se.,\
+ com.sun.org.apache.bcel.internal.,\
+ com.sun.org.apache.regexp.internal.,\
+ com.sun.org.apache.xerces.internal.,\
+ com.sun.org.apache.xpath.internal.,\
+ com.sun.org.apache.xalan.internal.extensions.,\
+ com.sun.org.apache.xalan.internal.lib.,\
+ com.sun.org.apache.xalan.internal.res.,\
+ com.sun.org.apache.xalan.internal.templates.,\
+ com.sun.org.apache.xalan.internal.utils.,\
+ com.sun.org.apache.xalan.internal.xslt.,\
+ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
+ com.sun.org.apache.xalan.internal.xsltc.compiler.,\
+ com.sun.org.apache.xalan.internal.xsltc.trax.,\
+ com.sun.org.apache.xalan.internal.xsltc.util.,\
+ com.sun.org.apache.xml.internal.res.,\
+ com.sun.org.apache.xml.internal.resolver.helpers.,\
+ com.sun.org.apache.xml.internal.resolver.readers.,\
+ com.sun.org.apache.xml.internal.security.,\
+ com.sun.org.apache.xml.internal.serializer.utils.,\
+ com.sun.org.apache.xml.internal.utils.,\
+ com.sun.org.glassfish.,\
+ com.oracle.xmlns.internal.,\
+ com.oracle.webservices.internal.,\
+ oracle.jrockit.jfr.,\
+ org.jcp.xml.dsig.internal.,\
+ jdk.internal.,\
+ jdk.nashorn.internal.,\
+ jdk.nashorn.tools.,\
+ jdk.xml.internal.,\
+ com.sun.activation.registries.,\
+ com.sun.java.accessibility.,\
+ com.sun.browser.,\
+ com.sun.glass.,\
+ com.sun.javafx.,\
+ com.sun.media.,\
+ com.sun.openpisces.,\
+ com.sun.prism.,\
+ com.sun.scenario.,\
+ com.sun.t2k.,\
+ com.sun.pisces.,\
+ com.sun.webkit.,\
+ jdk.management.resource.internal.
+
+#
+# List of comma-separated packages that start with or equal this string
+# will cause a security exception to be thrown when
+# passed to checkPackageDefinition unless the
+# corresponding RuntimePermission ("defineClassInPackage."+package) has
+# been granted.
+#
+# by default, none of the class loaders supplied with the JDK call
+# checkPackageDefinition.
+#
+package.definition=sun.,\
+ com.sun.xml.internal.,\
+ com.sun.imageio.,\
+ com.sun.istack.internal.,\
+ com.sun.jmx.,\
+ com.sun.media.sound.,\
+ com.sun.naming.internal.,\
+ com.sun.proxy.,\
+ com.sun.corba.se.,\
+ com.sun.org.apache.bcel.internal.,\
+ com.sun.org.apache.regexp.internal.,\
+ com.sun.org.apache.xerces.internal.,\
+ com.sun.org.apache.xpath.internal.,\
+ com.sun.org.apache.xalan.internal.extensions.,\
+ com.sun.org.apache.xalan.internal.lib.,\
+ com.sun.org.apache.xalan.internal.res.,\
+ com.sun.org.apache.xalan.internal.templates.,\
+ com.sun.org.apache.xalan.internal.utils.,\
+ com.sun.org.apache.xalan.internal.xslt.,\
+ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
+ com.sun.org.apache.xalan.internal.xsltc.compiler.,\
+ com.sun.org.apache.xalan.internal.xsltc.trax.,\
+ com.sun.org.apache.xalan.internal.xsltc.util.,\
+ com.sun.org.apache.xml.internal.res.,\
+ com.sun.org.apache.xml.internal.resolver.helpers.,\
+ com.sun.org.apache.xml.internal.resolver.readers.,\
+ com.sun.org.apache.xml.internal.security.,\
+ com.sun.org.apache.xml.internal.serializer.utils.,\
+ com.sun.org.apache.xml.internal.utils.,\
+ com.sun.org.glassfish.,\
+ com.oracle.xmlns.internal.,\
+ com.oracle.webservices.internal.,\
+ oracle.jrockit.jfr.,\
+ org.jcp.xml.dsig.internal.,\
+ jdk.internal.,\
+ jdk.nashorn.internal.,\
+ jdk.nashorn.tools.,\
+ jdk.xml.internal.,\
+ com.sun.activation.registries.,\
+ com.sun.java.accessibility.,\
+ com.sun.browser.,\
+ com.sun.glass.,\
+ com.sun.javafx.,\
+ com.sun.media.,\
+ com.sun.openpisces.,\
+ com.sun.prism.,\
+ com.sun.scenario.,\
+ com.sun.t2k.,\
+ com.sun.pisces.,\
+ com.sun.webkit.,\
+ jdk.management.resource.internal.
+
+#
+# Determines whether this properties file can be appended to
+# or overridden on the command line via -Djava.security.properties
+#
+security.overridePropertiesFile=true
+
+#
+# Determines the default key and trust manager factory algorithms for
+# the javax.net.ssl package.
+#
+ssl.KeyManagerFactory.algorithm=SunX509
+ssl.TrustManagerFactory.algorithm=PKIX
+
+#
+# The Java-level namelookup cache policy for successful lookups:
+#
+# any negative value: caching forever
+# any positive value: the number of seconds to cache an address for
+# zero: do not cache
+#
+# default value is forever (FOREVER). For security reasons, this
+# caching is made forever when a security manager is set. When a security
+# manager is not set, the default behavior in this implementation
+# is to cache for 30 seconds.
+#
+# NOTE: setting this to anything other than the default value can have
+# serious security implications. Do not set it unless
+# you are sure you are not exposed to DNS spoofing attack.
+#
+#networkaddress.cache.ttl=-1
+
+# The Java-level namelookup cache policy for failed lookups:
+#
+# any negative value: cache forever
+# any positive value: the number of seconds to cache negative lookup results
+# zero: do not cache
+#
+# In some Microsoft Windows networking environments that employ
+# the WINS name service in addition to DNS, name service lookups
+# that fail may take a noticeably long time to return (approx. 5 seconds).
+# For this reason the default caching policy is to maintain these
+# results for 10 seconds.
+#
+#
+networkaddress.cache.negative.ttl=10
+
+#
+# Properties to configure OCSP for certificate revocation checking
+#
+
+# Enable OCSP
+#
+# By default, OCSP is not used for certificate revocation checking.
+# This property enables the use of OCSP when set to the value "true".
+#
+# NOTE: SocketPermission is required to connect to an OCSP responder.
+#
+# Example,
+# ocsp.enable=true
+
+#
+# Location of the OCSP responder
+#
+# By default, the location of the OCSP responder is determined implicitly
+# from the certificate being validated. This property explicitly specifies
+# the location of the OCSP responder. The property is used when the
+# Authority Information Access extension (defined in RFC 3280) is absent
+# from the certificate or when it requires overriding.
+#
+# Example,
+# ocsp.responderURL=http://ocsp.example.net:80
+
+#
+# Subject name of the OCSP responder's certificate
+#
+# By default, the certificate of the OCSP responder is that of the issuer
+# of the certificate being validated. This property identifies the certificate
+# of the OCSP responder when the default does not apply. Its value is a string
+# distinguished name (defined in RFC 2253) which identifies a certificate in
+# the set of certificates supplied during cert path validation. In cases where
+# the subject name alone is not sufficient to uniquely identify the certificate
+# then both the "ocsp.responderCertIssuerName" and
+# "ocsp.responderCertSerialNumber" properties must be used instead. When this
+# property is set then those two properties are ignored.
+#
+# Example,
+# ocsp.responderCertSubjectName="CN=OCSP Responder, O=XYZ Corp"
+
+#
+# Issuer name of the OCSP responder's certificate
+#
+# By default, the certificate of the OCSP responder is that of the issuer
+# of the certificate being validated. This property identifies the certificate
+# of the OCSP responder when the default does not apply. Its value is a string
+# distinguished name (defined in RFC 2253) which identifies a certificate in
+# the set of certificates supplied during cert path validation. When this
+# property is set then the "ocsp.responderCertSerialNumber" property must also
+# be set. When the "ocsp.responderCertSubjectName" property is set then this
+# property is ignored.
+#
+# Example,
+# ocsp.responderCertIssuerName="CN=Enterprise CA, O=XYZ Corp"
+
+#
+# Serial number of the OCSP responder's certificate
+#
+# By default, the certificate of the OCSP responder is that of the issuer
+# of the certificate being validated. This property identifies the certificate
+# of the OCSP responder when the default does not apply. Its value is a string
+# of hexadecimal digits (colon or space separators may be present) which
+# identifies a certificate in the set of certificates supplied during cert path
+# validation. When this property is set then the "ocsp.responderCertIssuerName"
+# property must also be set. When the "ocsp.responderCertSubjectName" property
+# is set then this property is ignored.
+#
+# Example,
+# ocsp.responderCertSerialNumber=2A:FF:00
+
+#
+# Policy for failed Kerberos KDC lookups:
+#
+# When a KDC is unavailable (network error, service failure, etc), it is
+# put inside a blacklist and accessed less often for future requests. The
+# value (case-insensitive) for this policy can be:
+#
+# tryLast
+# KDCs in the blacklist are always tried after those not on the list.
+#
+# tryLess[:max_retries,timeout]
+# KDCs in the blacklist are still tried by their order in the configuration,
+# but with smaller max_retries and timeout values. max_retries and timeout
+# are optional numerical parameters (default 1 and 5000, which means once
+# and 5 seconds). Please notes that if any of the values defined here is
+# more than what is defined in krb5.conf, it will be ignored.
+#
+# Whenever a KDC is detected as available, it is removed from the blacklist.
+# The blacklist is reset when krb5.conf is reloaded. You can add
+# refreshKrb5Config=true to a JAAS configuration file so that krb5.conf is
+# reloaded whenever a JAAS authentication is attempted.
+#
+# Example,
+# krb5.kdc.bad.policy = tryLast
+# krb5.kdc.bad.policy = tryLess:2,2000
+krb5.kdc.bad.policy = tryLast
+
+# Algorithm restrictions for certification path (CertPath) processing
+#
+# In some environments, certain algorithms or key lengths may be undesirable
+# for certification path building and validation. For example, "MD2" is
+# generally no longer considered to be a secure hash algorithm. This section
+# describes the mechanism for disabling algorithms based on algorithm name
+# and/or key length. This includes algorithms used in certificates, as well
+# as revocation information such as CRLs and signed OCSP Responses.
+# The syntax of the disabled algorithm string is described as follows:
+# DisabledAlgorithms:
+# " DisabledAlgorithm { , DisabledAlgorithm } "
+#
+# DisabledAlgorithm:
+# AlgorithmName [Constraint] { '&' Constraint }
+#
+# AlgorithmName:
+# (see below)
+#
+# Constraint:
+# KeySizeConstraint | CAConstraint | DenyAfterConstraint |
+# UsageConstraint
+#
+# KeySizeConstraint:
+# keySize Operator KeyLength
+#
+# Operator:
+# <= | < | == | != | >= | >
+#
+# KeyLength:
+# Integer value of the algorithm's key length in bits
+#
+# CAConstraint:
+# jdkCA
+#
+# DenyAfterConstraint:
+# denyAfter YYYY-MM-DD
+#
+# UsageConstraint:
+# usage [TLSServer] [TLSClient] [SignedJAR]
+#
+# The "AlgorithmName" is the standard algorithm name of the disabled
+# algorithm. See "Java Cryptography Architecture Standard Algorithm Name
+# Documentation" for information about Standard Algorithm Names. Matching
+# is performed using a case-insensitive sub-element matching rule. (For
+# example, in "SHA1withECDSA" the sub-elements are "SHA1" for hashing and
+# "ECDSA" for signatures.) If the assertion "AlgorithmName" is a
+# sub-element of the certificate algorithm name, the algorithm will be
+# rejected during certification path building and validation. For example,
+# the assertion algorithm name "DSA" will disable all certificate algorithms
+# that rely on DSA, such as NONEwithDSA, SHA1withDSA. However, the assertion
+# will not disable algorithms related to "ECDSA".
+#
+# A "Constraint" defines restrictions on the keys and/or certificates for
+# a specified AlgorithmName:
+#
+# KeySizeConstraint:
+# keySize Operator KeyLength
+# The constraint requires a key of a valid size range if the
+# "AlgorithmName" is of a key algorithm. The "KeyLength" indicates
+# the key size specified in number of bits. For example,
+# "RSA keySize <= 1024" indicates that any RSA key with key size less
+# than or equal to 1024 bits should be disabled, and
+# "RSA keySize < 1024, RSA keySize > 2048" indicates that any RSA key
+# with key size less than 1024 or greater than 2048 should be disabled.
+# This constraint is only used on algorithms that have a key size.
+#
+# CAConstraint:
+# jdkCA
+# This constraint prohibits the specified algorithm only if the
+# algorithm is used in a certificate chain that terminates at a marked
+# trust anchor in the lib/security/cacerts keystore. If the jdkCA
+# constraint is not set, then all chains using the specified algorithm
+# are restricted. jdkCA may only be used once in a DisabledAlgorithm
+# expression.
+# Example: To apply this constraint to SHA-1 certificates, include
+# the following: "SHA1 jdkCA"
+#
+# DenyAfterConstraint:
+# denyAfter YYYY-MM-DD
+# This constraint prohibits a certificate with the specified algorithm
+# from being used after the date regardless of the certificate's
+# validity. JAR files that are signed and timestamped before the
+# constraint date with certificates containing the disabled algorithm
+# will not be restricted. The date is processed in the UTC timezone.
+# This constraint can only be used once in a DisabledAlgorithm
+# expression.
+# Example: To deny usage of RSA 2048 bit certificates after Feb 3 2020,
+# use the following: "RSA keySize == 2048 & denyAfter 2020-02-03"
+#
+# UsageConstraint:
+# usage [TLSServer] [TLSClient] [SignedJAR]
+# This constraint prohibits the specified algorithm for
+# a specified usage. This should be used when disabling an algorithm
+# for all usages is not practical. 'TLSServer' restricts the algorithm
+# in TLS server certificate chains when server authentication is
+# performed. 'TLSClient' restricts the algorithm in TLS client
+# certificate chains when client authentication is performed.
+# 'SignedJAR' constrains use of certificates in signed jar files.
+# The usage type follows the keyword and more than one usage type can
+# be specified with a whitespace delimiter.
+# Example: "SHA1 usage TLSServer TLSClient"
+#
+# When an algorithm must satisfy more than one constraint, it must be
+# delimited by an ampersand '&'. For example, to restrict certificates in a
+# chain that terminate at a distribution provided trust anchor and contain
+# RSA keys that are less than or equal to 1024 bits, add the following
+# constraint: "RSA keySize <= 1024 & jdkCA".
+#
+# All DisabledAlgorithms expressions are processed in the order defined in the
+# property. This requires lower keysize constraints to be specified
+# before larger keysize constraints of the same algorithm. For example:
+# "RSA keySize < 1024 & jdkCA, RSA keySize < 2048".
+#
+# Note: The algorithm restrictions do not apply to trust anchors or
+# self-signed certificates.
+#
+# Note: This property is currently used by Oracle's PKIX implementation. It
+# is not guaranteed to be examined and used by other implementations.
+#
+# Example:
+# jdk.certpath.disabledAlgorithms=MD2, DSA, RSA keySize < 2048
+#
+#
+jdk.certpath.disabledAlgorithms=MD2, MD5, SHA1 jdkCA & usage TLSServer, \
+ RSA keySize < 1024, DSA keySize < 1024, EC keySize < 224
+
+#
+# Algorithm restrictions for signed JAR files
+#
+# In some environments, certain algorithms or key lengths may be undesirable
+# for signed JAR validation. For example, "MD2" is generally no longer
+# considered to be a secure hash algorithm. This section describes the
+# mechanism for disabling algorithms based on algorithm name and/or key length.
+# JARs signed with any of the disabled algorithms or key sizes will be treated
+# as unsigned.
+#
+# The syntax of the disabled algorithm string is described as follows:
+# DisabledAlgorithms:
+# " DisabledAlgorithm { , DisabledAlgorithm } "
+#
+# DisabledAlgorithm:
+# AlgorithmName [Constraint] { '&' Constraint }
+#
+# AlgorithmName:
+# (see below)
+#
+# Constraint:
+# KeySizeConstraint | DenyAfterConstraint
+#
+# KeySizeConstraint:
+# keySize Operator KeyLength
+#
+# DenyAfterConstraint:
+# denyAfter YYYY-MM-DD
+#
+# Operator:
+# <= | < | == | != | >= | >
+#
+# KeyLength:
+# Integer value of the algorithm's key length in bits
+#
+# Note: This property is currently used by the JDK Reference
+# implementation. It is not guaranteed to be examined and used by other
+# implementations.
+#
+# See "jdk.certpath.disabledAlgorithms" for syntax descriptions.
+#
+jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, DSA keySize < 1024
+
+#
+# Algorithm restrictions for Secure Socket Layer/Transport Layer Security
+# (SSL/TLS) processing
+#
+# In some environments, certain algorithms or key lengths may be undesirable
+# when using SSL/TLS. This section describes the mechanism for disabling
+# algorithms during SSL/TLS security parameters negotiation, including
+# protocol version negotiation, cipher suites selection, peer authentication
+# and key exchange mechanisms.
+#
+# Disabled algorithms will not be negotiated for SSL/TLS connections, even
+# if they are enabled explicitly in an application.
+#
+# For PKI-based peer authentication and key exchange mechanisms, this list
+# of disabled algorithms will also be checked during certification path
+# building and validation, including algorithms used in certificates, as
+# well as revocation information such as CRLs and signed OCSP Responses.
+# This is in addition to the jdk.certpath.disabledAlgorithms property above.
+#
+# See the specification of "jdk.certpath.disabledAlgorithms" for the
+# syntax of the disabled algorithm string.
+#
+# Note: The algorithm restrictions do not apply to trust anchors or
+# self-signed certificates.
+#
+# Note: This property is currently used by the JDK Reference implementation.
+# It is not guaranteed to be examined and used by other implementations.
+#
+# Example:
+# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
+jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, \
+ EC keySize < 224, 3DES_EDE_CBC, anon, NULL
+
+# Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
+# processing in JSSE implementation.
+#
+# In some environments, a certain algorithm may be undesirable but it
+# cannot be disabled because of its use in legacy applications. Legacy
+# algorithms may still be supported, but applications should not use them
+# as the security strength of legacy algorithms are usually not strong enough
+# in practice.
+#
+# During SSL/TLS security parameters negotiation, legacy algorithms will
+# not be negotiated unless there are no other candidates.
+#
+# The syntax of the legacy algorithms string is described as this Java
+# BNF-style:
+# LegacyAlgorithms:
+# " LegacyAlgorithm { , LegacyAlgorithm } "
+#
+# LegacyAlgorithm:
+# AlgorithmName (standard JSSE algorithm name)
+#
+# See the specification of security property "jdk.certpath.disabledAlgorithms"
+# for the syntax and description of the "AlgorithmName" notation.
+#
+# Per SSL/TLS specifications, cipher suites have the form:
+# SSL_KeyExchangeAlg_WITH_CipherAlg_MacAlg
+# or
+# TLS_KeyExchangeAlg_WITH_CipherAlg_MacAlg
+#
+# For example, the cipher suite TLS_RSA_WITH_AES_128_CBC_SHA uses RSA as the
+# key exchange algorithm, AES_128_CBC (128 bits AES cipher algorithm in CBC
+# mode) as the cipher (encryption) algorithm, and SHA-1 as the message digest
+# algorithm for HMAC.
+#
+# The LegacyAlgorithm can be one of the following standard algorithm names:
+# 1. JSSE cipher suite name, e.g., TLS_RSA_WITH_AES_128_CBC_SHA
+# 2. JSSE key exchange algorithm name, e.g., RSA
+# 3. JSSE cipher (encryption) algorithm name, e.g., AES_128_CBC
+# 4. JSSE message digest algorithm name, e.g., SHA
+#
+# See SSL/TLS specifications and "Java Cryptography Architecture Standard
+# Algorithm Name Documentation" for information about the algorithm names.
+#
+# Note: This property is currently used by the JDK Reference implementation.
+# It is not guaranteed to be examined and used by other implementations.
+# There is no guarantee the property will continue to exist or be of the
+# same syntax in future releases.
+#
+# Example:
+# jdk.tls.legacyAlgorithms=DH_anon, DES_CBC, SSL_RSA_WITH_RC4_128_MD5
+#
+jdk.tls.legacyAlgorithms= \
+ K_NULL, C_NULL, M_NULL, \
+ DH_anon, ECDH_anon, \
+ RC4_128, RC4_40, DES_CBC, DES40_CBC, \
+ 3DES_EDE_CBC
+
+# The pre-defined default finite field Diffie-Hellman ephemeral (DHE)
+# parameters for Transport Layer Security (SSL/TLS/DTLS) processing.
+#
+# In traditional SSL/TLS/DTLS connections where finite field DHE parameters
+# negotiation mechanism is not used, the server offers the client group
+# parameters, base generator g and prime modulus p, for DHE key exchange.
+# It is recommended to use dynamic group parameters. This property defines
+# a mechanism that allows you to specify custom group parameters.
+#
+# The syntax of this property string is described as this Java BNF-style:
+# DefaultDHEParameters:
+# DefinedDHEParameters { , DefinedDHEParameters }
+#
+# DefinedDHEParameters:
+# "{" DHEPrimeModulus , DHEBaseGenerator "}"
+#
+# DHEPrimeModulus:
+# HexadecimalDigits
+#
+# DHEBaseGenerator:
+# HexadecimalDigits
+#
+# HexadecimalDigits:
+# HexadecimalDigit { HexadecimalDigit }
+#
+# HexadecimalDigit: one of
+# 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f
+#
+# Whitespace characters are ignored.
+#
+# The "DefinedDHEParameters" defines the custom group parameters, prime
+# modulus p and base generator g, for a particular size of prime modulus p.
+# The "DHEPrimeModulus" defines the hexadecimal prime modulus p, and the
+# "DHEBaseGenerator" defines the hexadecimal base generator g of a group
+# parameter. It is recommended to use safe primes for the custom group
+# parameters.
+#
+# If this property is not defined or the value is empty, the underlying JSSE
+# provider's default group parameter is used for each connection.
+#
+# If the property value does not follow the grammar, or a particular group
+# parameter is not valid, the connection will fall back and use the
+# underlying JSSE provider's default group parameter.
+#
+# Note: This property is currently used by OpenJDK's JSSE implementation. It
+# is not guaranteed to be examined and used by other implementations.
+#
+# Example:
+# jdk.tls.server.defaultDHEParameters=
+# { \
+# FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 \
+# 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD \
+# EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 \
+# E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED \
+# EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381 \
+# FFFFFFFF FFFFFFFF, 2}
+
+#
+# TLS key limits on symmetric cryptographic algorithms
+#
+# This security property sets limits on algorithms key usage in TLS 1.3.
+# When the amount of data encrypted exceeds the algorithm value listed below,
+# a KeyUpdate message will trigger a key change. This is for symmetric ciphers
+# with TLS 1.3 only.
+#
+# The syntax for the property is described below:
+# KeyLimits:
+# " KeyLimit { , KeyLimit } "
+#
+# WeakKeyLimit:
+# AlgorithmName Action Length
+#
+# AlgorithmName:
+# A full algorithm transformation.
+#
+# Action:
+# KeyUpdate
+#
+# Length:
+# The amount of encrypted data in a session before the Action occurs
+# This value may be an integer value in bytes, or as a power of two, 2^29.
+#
+# KeyUpdate:
+# The TLS 1.3 KeyUpdate handshake process begins when the Length amount
+# is fulfilled.
+#
+# Note: This property is currently used by OpenJDK's JSSE implementation. It
+# is not guaranteed to be examined and used by other implementations.
+#
+jdk.tls.keyLimits=AES/GCM/NoPadding KeyUpdate 2^37
+
+#
+# Cryptographic Jurisdiction Policy defaults
+#
+# Import and export control rules on cryptographic software vary from
+# country to country. By default, the JDK provides two different sets of
+# cryptographic policy files:
+#
+# unlimited: These policy files contain no restrictions on cryptographic
+# strengths or algorithms.
+#
+# limited: These policy files contain more restricted cryptographic
+# strengths, and are still available if your country or
+# usage requires the traditional restrictive policy.
+#
+# The JDK JCE framework uses the unlimited policy files by default.
+# However the user may explicitly choose a set either by defining the
+# "crypto.policy" Security property or by installing valid JCE policy
+# jar files into the traditional JDK installation location. To better
+# support older JDK Update releases, the "crypto.policy" property is not
+# defined by default. See below for more information.
+#
+# The following logic determines which policy files are used:
+#
+# <java-home> refers to the directory where the JRE was
+# installed and may be determined using the "java.home"
+# System property.
+#
+# 1. If the Security property "crypto.policy" has been defined,
+# then the following mechanism is used:
+#
+# The policy files are stored as jar files in subdirectories of
+# <java-home>/lib/security/policy. Each directory contains a complete
+# set of policy files.
+#
+# The "crypto.policy" Security property controls the directory
+# selection, and thus the effective cryptographic policy.
+#
+# The default set of directories is:
+#
+# limited | unlimited
+#
+# 2. If the "crypto.policy" property is not set and the traditional
+# US_export_policy.jar and local_policy.jar files
+# (e.g. limited/unlimited) are found in the legacy
+# <java-home>/lib/security directory, then the rules embedded within
+# those jar files will be used. This helps preserve compatibility
+# for users upgrading from an older installation.
+#
+# 3. If the jar files are not present in the legacy location
+# and the "crypto.policy" Security property is not defined,
+# then the JDK will use the unlimited settings (equivalent to
+# crypto.policy=unlimited)
+#
+# Please see the JCA documentation for additional information on these
+# files and formats.
+#
+# YOU ARE ADVISED TO CONSULT YOUR EXPORT/IMPORT CONTROL COUNSEL OR ATTORNEY
+# TO DETERMINE THE EXACT REQUIREMENTS.
+#
+# Please note that the JCE for Java SE, including the JCE framework,
+# cryptographic policy files, and standard JCE providers provided with
+# the Java SE, have been reviewed and approved for export as mass market
+# encryption item by the US Bureau of Industry and Security.
+#
+# Note: This property is currently used by the JDK Reference implementation.
+# It is not guaranteed to be examined and used by other implementations.
+#
+#crypto.policy=unlimited
+
+#
+# The policy for the XML Signature secure validation mode. The mode is
+# enabled by setting the property "org.jcp.xml.dsig.secureValidation" to
+# true with the javax.xml.crypto.XMLCryptoContext.setProperty() method,
+# or by running the code with a SecurityManager.
+#
+# Policy:
+# Constraint {"," Constraint }
+# Constraint:
+# AlgConstraint | MaxTransformsConstraint | MaxReferencesConstraint |
+# ReferenceUriSchemeConstraint | KeySizeConstraint | OtherConstraint
+# AlgConstraint
+# "disallowAlg" Uri
+# MaxTransformsConstraint:
+# "maxTransforms" Integer
+# MaxReferencesConstraint:
+# "maxReferences" Integer
+# ReferenceUriSchemeConstraint:
+# "disallowReferenceUriSchemes" String { String }
+# KeySizeConstraint:
+# "minKeySize" KeyAlg Integer
+# OtherConstraint:
+# "noDuplicateIds" | "noRetrievalMethodLoops"
+#
+# For AlgConstraint, Uri is the algorithm URI String that is not allowed.
+# See the XML Signature Recommendation for more information on algorithm
+# URI Identifiers. For KeySizeConstraint, KeyAlg is the standard algorithm
+# name of the key type (ex: "RSA"). If the MaxTransformsConstraint,
+# MaxReferencesConstraint or KeySizeConstraint (for the same key type) is
+# specified more than once, only the last entry is enforced.
+#
+# Note: This property is currently used by the JDK Reference implementation. It
+# is not guaranteed to be examined and used by other implementations.
+#
+jdk.xml.dsig.secureValidationPolicy=\
+ disallowAlg http://www.w3.org/TR/1999/REC-xslt-19991116,\
+ disallowAlg http://www.w3.org/2001/04/xmldsig-more#rsa-md5,\
+ disallowAlg http://www.w3.org/2001/04/xmldsig-more#hmac-md5,\
+ disallowAlg http://www.w3.org/2001/04/xmldsig-more#md5,\
+ maxTransforms 5,\
+ maxReferences 30,\
+ disallowReferenceUriSchemes file http https,\
+ minKeySize RSA 1024,\
+ minKeySize DSA 1024,\
+ minKeySize EC 224,\
+ noDuplicateIds,\
+ noRetrievalMethodLoops
+
+#
+# Serialization process-wide filter
+#
+# A filter, if configured, is used by java.io.ObjectInputStream during
+# deserialization to check the contents of the stream.
+# A filter is configured as a sequence of patterns, each pattern is either
+# matched against the name of a class in the stream or defines a limit.
+# Patterns are separated by ";" (semicolon).
+# Whitespace is significant and is considered part of the pattern.
+#
+# If the system property jdk.serialFilter is also specified on the command
+# line, it supersedes the security property value defined here.
+#
+# If a pattern includes a "=", it sets a limit.
+# If a limit appears more than once the last value is used.
+# Limits are checked before classes regardless of the order in the sequence of patterns.
+# If any of the limits are exceeded, the filter status is REJECTED.
+#
+# maxdepth=value - the maximum depth of a graph
+# maxrefs=value - the maximum number of internal references
+# maxbytes=value - the maximum number of bytes in the input stream
+# maxarray=value - the maximum array length allowed
+#
+# Other patterns, from left to right, match the class or package name as
+# returned from Class.getName.
+# If the class is an array type, the class or package to be matched is the element type.
+# Arrays of any number of dimensions are treated the same as the element type.
+# For example, a pattern of "!example.Foo", rejects creation of any instance or
+# array of example.Foo.
+#
+# If the pattern starts with "!", the status is REJECTED if the remaining pattern
+# is matched; otherwise the status is ALLOWED if the pattern matches.
+# If the pattern ends with ".**" it matches any class in the package and all subpackages.
+# If the pattern ends with ".*" it matches any class in the package.
+# If the pattern ends with "*", it matches any class with the pattern as a prefix.
+# If the pattern is equal to the class name, it matches.
+# Otherwise, the status is UNDECIDED.
+#
+#jdk.serialFilter=pattern;pattern
+
+#
+# RMI Registry Serial Filter
+#
+# The filter pattern uses the same format as jdk.serialFilter.
+# This filter can override the builtin filter if additional types need to be
+# allowed or rejected from the RMI Registry or to decrease limits but not
+# to increase limits.
+# If the limits (maxdepth, maxrefs, or maxbytes) are exceeded, the object is rejected.
+#
+# Each non-array type is allowed or rejected if it matches one of the patterns,
+# evaluated from left to right, and is otherwise allowed. Arrays of any
+# component type, including subarrays and arrays of primitives, are allowed.
+#
+# Array construction of any component type, including subarrays and arrays of
+# primitives, are allowed unless the length is greater than the maxarray limit.
+# The filter is applied to each array element.
+#
+# The built-in filter allows subclasses of allowed classes and
+# can approximately be represented as the pattern:
+#
+#sun.rmi.registry.registryFilter=\
+# maxarray=1000000;\
+# maxdepth=20;\
+# java.lang.String;\
+# java.lang.Number;\
+# java.lang.reflect.Proxy;\
+# java.rmi.Remote;\
+# sun.rmi.server.UnicastRef;\
+# sun.rmi.server.RMIClientSocketFactory;\
+# sun.rmi.server.RMIServerSocketFactory;\
+# java.rmi.activation.ActivationID;\
+# java.rmi.server.UID
+#
+# RMI Distributed Garbage Collector (DGC) Serial Filter
+#
+# The filter pattern uses the same format as jdk.serialFilter.
+# This filter can override the builtin filter if additional types need to be
+# allowed or rejected from the RMI DGC.
+#
+# The builtin DGC filter can approximately be represented as the filter pattern:
+#
+#sun.rmi.transport.dgcFilter=\
+# java.rmi.server.ObjID;\
+# java.rmi.server.UID;\
+# java.rmi.dgc.VMID;\
+# java.rmi.dgc.Lease;\
+# maxdepth=5;maxarray=10000
+
+# CORBA ORBIorTypeCheckRegistryFilter
+# Type check enhancement for ORB::string_to_object processing
+#
+# An IOR type check filter, if configured, is used by an ORB during
+# an ORB::string_to_object invocation to check the veracity of the type encoded
+# in the ior string.
+#
+# The filter pattern consists of a semi-colon separated list of class names.
+# The configured list contains the binary class names of the IDL interface types
+# corresponding to the IDL stub class to be instantiated.
+# As such, a filter specifies a list of IDL stub classes that will be
+# allowed by an ORB when an ORB::string_to_object is invoked.
+# It is used to specify a white list configuration of acceptable
+# IDL stub types which may be contained in a stringified IOR
+# parameter passed as input to an ORB::string_to_object method.
+#
+# Note: This property is currently used by the JDK Reference implementation.
+# It is not guaranteed to be examined and used by other implementations.
+#
+#com.sun.CORBA.ORBIorTypeCheckRegistryFilter=binary_class_name;binary_class_name
+
+#
+# JCEKS Encrypted Key Serial Filter
+#
+# This filter, if configured, is used by the JCEKS KeyStore during the
+# deserialization of the encrypted Key object stored inside a key entry.
+# If not configured or the filter result is UNDECIDED (i.e. none of the patterns
+# matches), the filter configured by jdk.serialFilter will be consulted.
+#
+# If the system property jceks.key.serialFilter is also specified, it supersedes
+# the security property value defined here.
+#
+# The filter pattern uses the same format as jdk.serialFilter. The default
+# pattern allows java.lang.Enum, java.security.KeyRep, java.security.KeyRep$Type,
+# and javax.crypto.spec.SecretKeySpec and rejects all the others.
+jceks.key.serialFilter = java.lang.Enum;java.security.KeyRep;\
+ java.security.KeyRep$Type;javax.crypto.spec.SecretKeySpec;!*
+
+#
+# Disabled mechanisms for the Simple Authentication and Security Layer (SASL)
+#
+# Disabled mechanisms will not be negotiated by both SASL clients and servers.
+# These mechanisms will be ignored if they are specified in the "mechanisms"
+# argument of "Sasl.createSaslClient" or the "mechanism" argument of
+# "Sasl.createSaslServer".
+#
+# The value of this property is a comma-separated list of SASL mechanisms.
+# The mechanisms are case-sensitive. Whitespaces around the commas are ignored.
+#
+# Note: This property is currently used by the JDK Reference implementation.
+# It is not guaranteed to be examined and used by other implementations.
+#
+# Example:
+# jdk.sasl.disabledMechanisms=PLAIN, CRAM-MD5, DIGEST-MD5
+jdk.sasl.disabledMechanisms=
+
+#
+# Policies for distrusting Certificate Authorities (CAs).
+#
+# This is a comma separated value of one or more case-sensitive strings, each
+# of which represents a policy for determining if a CA should be distrusted.
+# The supported values are:
+#
+# SYMANTEC_TLS : Distrust TLS Server certificates anchored by a Symantec
+# root CA and issued after April 16, 2019 unless issued by one of the
+# following subordinate CAs which have a later distrust date:
+# 1. Apple IST CA 2 - G1, SHA-256 fingerprint:
+# AC2B922ECFD5E01711772FEA8ED372DE9D1E2245FCE3F57A9CDBEC77296A424B
+# Distrust after December 31, 2019.
+# 2. Apple IST CA 8 - G1, SHA-256 fingerprint:
+# A4FE7C7F15155F3F0AEF7AAA83CF6E06DEB97CA3F909DF920AC1490882D488ED
+# Distrust after December 31, 2019.
+#
+# Leading and trailing whitespace surrounding each value are ignored.
+# Unknown values are ignored. If the property is commented out or set to the
+# empty String, no policies are enforced.
+#
+# Note: This property is currently used by the JDK Reference implementation.
+# It is not guaranteed to be supported by other SE implementations. Also, this
+# property does not override other security properties which can restrict
+# certificates such as jdk.tls.disabledAlgorithms or
+# jdk.certpath.disabledAlgorithms; those restrictions are still enforced even
+# if this property is not enabled.
+#
+jdk.security.caDistrustPolicies=SYMANTEC_TLS
+
+#
+# Policies for the proxy_impersonator Kerberos ccache configuration entry
+#
+# The proxy_impersonator ccache configuration entry indicates that the ccache
+# is a synthetic delegated credential for use with S4U2Proxy by an intermediate
+# server. The ccache file should also contain the TGT of this server and
+# an evidence ticket from the default principal of the ccache to this server.
+#
+# This security property determines how Java uses this configuration entry.
+# There are 3 possible values:
+#
+# no-impersonate - Ignore this configuration entry, and always act as
+# the owner of the TGT (if it exists).
+#
+# try-impersonate - Try impersonation when this configuration entry exists.
+# If no matching TGT or evidence ticket is found,
+# fallback to no-impersonate.
+#
+# always-impersonate - Always impersonate when this configuration entry exists.
+# If no matching TGT or evidence ticket is found,
+# no initial credential is read from the ccache.
+#
+# The default value is "always-impersonate".
+#
+# If a system property of the same name is also specified, it supersedes the
+# security property value defined here.
+#
+#jdk.security.krb5.default.initiate.credential=always-impersonate
+
diff --git a/grid/jre/lib/security/javaws.policy b/grid/jre/lib/security/javaws.policy
new file mode 100644
index 0000000..708d0c7
--- /dev/null
+++ b/grid/jre/lib/security/javaws.policy
@@ -0,0 +1,5 @@
+
+grant codeBase "file:${jnlpx.home}/javaws.jar" {
+ permission java.security.AllPermission;
+};
+
diff --git a/grid/jre/lib/security/policy/limited/US_export_policy.jar b/grid/jre/lib/security/policy/limited/US_export_policy.jar
new file mode 100644
index 0000000..3bd164f
--- /dev/null
+++ b/grid/jre/lib/security/policy/limited/US_export_policy.jar
Binary files differ
diff --git a/grid/jre/lib/security/policy/limited/local_policy.jar b/grid/jre/lib/security/policy/limited/local_policy.jar
new file mode 100644
index 0000000..88317b0
--- /dev/null
+++ b/grid/jre/lib/security/policy/limited/local_policy.jar
Binary files differ
diff --git a/grid/jre/lib/security/policy/unlimited/US_export_policy.jar b/grid/jre/lib/security/policy/unlimited/US_export_policy.jar
new file mode 100644
index 0000000..e4bfe0c
--- /dev/null
+++ b/grid/jre/lib/security/policy/unlimited/US_export_policy.jar
Binary files differ
diff --git a/grid/jre/lib/security/policy/unlimited/local_policy.jar b/grid/jre/lib/security/policy/unlimited/local_policy.jar
new file mode 100644
index 0000000..f5b2acb
--- /dev/null
+++ b/grid/jre/lib/security/policy/unlimited/local_policy.jar
Binary files differ
diff --git a/grid/jre/lib/security/trusted.libraries b/grid/jre/lib/security/trusted.libraries
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/grid/jre/lib/security/trusted.libraries
diff --git a/grid/jre/lib/sound.properties b/grid/jre/lib/sound.properties
new file mode 100644
index 0000000..68309d1
--- /dev/null
+++ b/grid/jre/lib/sound.properties
@@ -0,0 +1,39 @@
+############################################################
+# Sound Configuration File
+############################################################
+#
+# This properties file is used to specify default service
+# providers for javax.sound.midi.MidiSystem and
+# javax.sound.sampled.AudioSystem.
+#
+# The following keys are recognized by MidiSystem methods:
+#
+# javax.sound.midi.Receiver
+# javax.sound.midi.Sequencer
+# javax.sound.midi.Synthesizer
+# javax.sound.midi.Transmitter
+#
+# The following keys are recognized by AudioSystem methods:
+#
+# javax.sound.sampled.Clip
+# javax.sound.sampled.Port
+# javax.sound.sampled.SourceDataLine
+# javax.sound.sampled.TargetDataLine
+#
+# The values specify the full class name of the service
+# provider, or the device name.
+#
+# See the class descriptions for details.
+#
+# Example 1:
+# Use MyDeviceProvider as default for SourceDataLines:
+# javax.sound.sampled.SourceDataLine=com.xyz.MyDeviceProvider
+#
+# Example 2:
+# Specify the default Synthesizer by its name "InternalSynth".
+# javax.sound.midi.Synthesizer=#InternalSynth
+#
+# Example 3:
+# Specify the default Receiver by provider and name:
+# javax.sound.midi.Receiver=com.sun.media.sound.MidiProvider#SunMIDI1
+#
diff --git a/grid/jre/lib/tzdb.dat b/grid/jre/lib/tzdb.dat
new file mode 100644
index 0000000..0edcbcf
--- /dev/null
+++ b/grid/jre/lib/tzdb.dat
Binary files differ
diff --git a/grid/jre/lib/tzmappings b/grid/jre/lib/tzmappings
new file mode 100644
index 0000000..28917ae
--- /dev/null
+++ b/grid/jre/lib/tzmappings
@@ -0,0 +1,226 @@
+#
+# This file describes mapping information between Windows and Java
+# time zones.
+# Format: Each line should include a colon separated fields of Windows
+# time zone registry key, time zone mapID, locale (which is most
+# likely used in the time zone), and Java time zone ID. Blank lines
+# and lines that start with '#' are ignored. Data lines must be sorted
+# by mapID (ASCII order).
+#
+# NOTE
+# This table format is not a public interface of any Java
+# platforms. No applications should depend on this file in any form.
+#
+# This table has been generated by a program and should not be edited
+# manually.
+#
+Romance:-1,64::Europe/Paris:
+Romance Standard Time:-1,64::Europe/Paris:
+Warsaw:-1,65::Europe/Warsaw:
+Central Europe:-1,66::Europe/Prague:
+Central Europe Standard Time:-1,66::Europe/Prague:
+Prague Bratislava:-1,66::Europe/Prague:
+W. Central Africa Standard Time:-1,66:AO:Africa/Luanda:
+FLE:-1,67:FI:Europe/Helsinki:
+FLE Standard Time:-1,67:FI:Europe/Helsinki:
+GFT:-1,67::Europe/Athens:
+GFT Standard Time:-1,67::Europe/Athens:
+GTB:-1,67::Europe/Athens:
+GTB Standard Time:-1,67::Europe/Athens:
+Israel:-1,70::Asia/Jerusalem:
+Israel Standard Time:-1,70::Asia/Jerusalem:
+Arab:-1,71::Asia/Riyadh:
+Arab Standard Time:-1,71::Asia/Riyadh:
+Arabic Standard Time:-1,71:IQ:Asia/Baghdad:
+E. Africa:-1,71:KE:Africa/Nairobi:
+E. Africa Standard Time:-1,71:KE:Africa/Nairobi:
+Saudi Arabia:-1,71::Asia/Riyadh:
+Saudi Arabia Standard Time:-1,71::Asia/Riyadh:
+Iran:-1,72::Asia/Tehran:
+Iran Standard Time:-1,72::Asia/Tehran:
+Afghanistan:-1,73::Asia/Kabul:
+Afghanistan Standard Time:-1,73::Asia/Kabul:
+India:-1,74::Asia/Calcutta:
+India Standard Time:-1,74::Asia/Calcutta:
+Myanmar Standard Time:-1,74::Asia/Rangoon:
+Nepal Standard Time:-1,74::Asia/Katmandu:
+Sri Lanka:-1,74:LK:Asia/Colombo:
+Sri Lanka Standard Time:-1,74:LK:Asia/Colombo:
+Beijing:-1,75::Asia/Shanghai:
+China:-1,75::Asia/Shanghai:
+China Standard Time:-1,75::Asia/Shanghai:
+AUS Central:-1,76::Australia/Darwin:
+AUS Central Standard Time:-1,76::Australia/Darwin:
+Cen. Australia:-1,76::Australia/Adelaide:
+Cen. Australia Standard Time:-1,76::Australia/Adelaide:
+Vladivostok:-1,77::Asia/Vladivostok:
+Vladivostok Standard Time:-1,77::Asia/Vladivostok:
+West Pacific:-1,77:GU:Pacific/Guam:
+West Pacific Standard Time:-1,77:GU:Pacific/Guam:
+E. South America:-1,80::America/Sao_Paulo:
+E. South America Standard Time:-1,80::America/Sao_Paulo:
+Greenland Standard Time:-1,80:GL:America/Godthab:
+Newfoundland:-1,81::America/St_Johns:
+Newfoundland Standard Time:-1,81::America/St_Johns:
+Pacific SA:-1,82::America/Santiago:
+Pacific SA Standard Time:-1,82::America/Santiago:
+SA Western:-1,82:BO:America/La_Paz:
+SA Western Standard Time:-1,82:BO:America/La_Paz:
+SA Pacific:-1,83::America/Bogota:
+SA Pacific Standard Time:-1,83::America/Bogota:
+US Eastern:-1,84::America/Indianapolis:
+US Eastern Standard Time:-1,84::America/Indianapolis:
+Central America Standard Time:-1,85::America/Regina:
+Mexico:-1,85::America/Mexico_City:
+Mexico Standard Time:-1,85::America/Mexico_City:
+Canada Central:-1,86::America/Regina:
+Canada Central Standard Time:-1,86::America/Regina:
+US Mountain:-1,87::America/Phoenix:
+US Mountain Standard Time:-1,87::America/Phoenix:
+GMT:0,1::Europe/London:
+GMT Standard Time:0,1::Europe/London:
+Ekaterinburg:10,11::Asia/Yekaterinburg:
+Ekaterinburg Standard Time:10,11::Asia/Yekaterinburg:
+West Asia:10,11:UZ:Asia/Tashkent:
+West Asia Standard Time:10,11:UZ:Asia/Tashkent:
+Central Asia:12,13::Asia/Almaty:
+Central Asia Standard Time:12,13::Asia/Almaty:
+N. Central Asia Standard Time:12,13::Asia/Novosibirsk:
+Bangkok:14,15::Asia/Bangkok:
+Bangkok Standard Time:14,15::Asia/Bangkok:
+North Asia Standard Time:14,15::Asia/Krasnoyarsk:
+SE Asia:14,15::Asia/Bangkok:
+SE Asia Standard Time:14,15::Asia/Bangkok:
+North Asia East Standard Time:16,17:RU:Asia/Irkutsk:
+Singapore:16,17:SG:Asia/Singapore:
+Singapore Standard Time:16,17:SG:Asia/Singapore:
+Taipei:16,17::Asia/Taipei:
+Taipei Standard Time:16,17::Asia/Taipei:
+W. Australia:16,17:AU:Australia/Perth:
+W. Australia Standard Time:16,17:AU:Australia/Perth:
+Korea:18,19:KR:Asia/Seoul:
+Korea Standard Time:18,19:KR:Asia/Seoul:
+Tokyo:18,19::Asia/Tokyo:
+Tokyo Standard Time:18,19::Asia/Tokyo:
+Yakutsk:18,19:RU:Asia/Yakutsk:
+Yakutsk Standard Time:18,19:RU:Asia/Yakutsk:
+Central European:2,3:CS:Europe/Belgrade:
+Central European Standard Time:2,3:CS:Europe/Belgrade:
+W. Europe:2,3::Europe/Berlin:
+W. Europe Standard Time:2,3::Europe/Berlin:
+Tasmania:20,-1::Australia/Hobart:
+Tasmania Standard Time:20,-1::Australia/Hobart:
+AUS Eastern:20,21::Australia/Sydney:
+AUS Eastern Standard Time:20,21::Australia/Sydney:
+E. Australia:20,21::Australia/Brisbane:
+E. Australia Standard Time:20,21::Australia/Brisbane:
+Sydney Standard Time:20,21::Australia/Sydney:
+Tasmania Standard Time:20,65::Australia/Hobart:
+Central Pacific:22,23::Pacific/Guadalcanal:
+Central Pacific Standard Time:22,23::Pacific/Guadalcanal:
+Dateline:24,25::GMT-1200:
+Dateline Standard Time:24,25::GMT-1200:
+Fiji:24,25::Pacific/Fiji:
+Fiji Standard Time:24,25::Pacific/Fiji:
+Samoa:26,27::Pacific/Apia:
+Samoa Standard Time:26,27::Pacific/Apia:
+Hawaiian:28,29::Pacific/Honolulu:
+Hawaiian Standard Time:28,29::Pacific/Honolulu:
+Alaskan:30,31::America/Anchorage:
+Alaskan Standard Time:30,31::America/Anchorage:
+Pacific:32,33::America/Los_Angeles:
+Pacific Standard Time:32,33::America/Los_Angeles:
+Mexico Standard Time 2:34,35:MX:America/Chihuahua:
+Mountain:34,35::America/Denver:
+Mountain Standard Time:34,35::America/Denver:
+Central:36,37::America/Chicago:
+Central Standard Time:36,37::America/Chicago:
+Eastern:38,39::America/New_York:
+Eastern Standard Time:38,39::America/New_York:
+E. Europe:4,5::EET:
+E. Europe Standard Time:4,5::EET:
+Egypt:4,68::Africa/Cairo:
+Egypt Standard Time:4,68::Africa/Cairo:
+South Africa:4,69::Africa/Harare:
+South Africa Standard Time:4,69::Africa/Harare:
+Atlantic:40,41::America/Halifax:
+Atlantic Standard Time:40,41::America/Halifax:
+SA Eastern:42,43:GF:America/Cayenne:
+SA Eastern Standard Time:42,43:GF:America/Cayenne:
+Mid-Atlantic:44,45::Atlantic/South_Georgia:
+Mid-Atlantic Standard Time:44,45::Atlantic/South_Georgia:
+Azores:46,47::Atlantic/Azores:
+Azores Standard Time:46,47::Atlantic/Azores:
+Cape Verde Standard Time:46,47::Atlantic/Cape_Verde:
+Russian:6,7::Europe/Moscow:
+Russian Standard Time:6,7::Europe/Moscow:
+New Zealand:78,79::Pacific/Auckland:
+New Zealand Standard Time:78,79::Pacific/Auckland:
+Tonga Standard Time:78,79::Pacific/Tongatapu:
+Arabian:8,9::Asia/Muscat:
+Arabian Standard Time:8,9::Asia/Muscat:
+Caucasus:8,9:AM:Asia/Yerevan:
+Caucasus Standard Time:8,9:AM:Asia/Yerevan:
+GMT Standard Time:88,89::GMT:
+Greenwich:88,89::GMT:
+Greenwich Standard Time:88,89::GMT:
+Aleutian Standard Time:900,900:US:America/Adak:
+Altai Standard Time:901,901::Asia/Barnaul:
+Argentina Standard Time:902,902::America/Buenos_Aires:
+Armenian Standard Time:903,903:AM:Asia/Yerevan:
+Astrakhan Standard Time:904,904::Europe/Astrakhan:
+Aus Central W. Standard Time:905,905::Australia/Eucla:
+Azerbaijan Standard Time:906,906:AZ:Asia/Baku:
+Bahia Standard Time:907,907::America/Bahia:
+Bangladesh Standard Time:908,908::Asia/Dhaka:
+Belarus Standard Time:909,909:BY:Europe/Minsk:
+Bougainville Standard Time:910,910::Pacific/Bougainville:
+Central Brazilian Standard Time:911,911:BR:America/Cuiaba:
+Central Standard Time (Mexico):912,912::America/Mexico_City:
+Chatham Islands Standard Time:913,913::Pacific/Chatham:
+Cuba Standard Time:914,914:CU:America/Havana:
+Easter Island Standard Time:915,915:CL:Pacific/Easter:
+Eastern Standard Time (Mexico):916,916::America/Cancun:
+Georgian Standard Time:917,917:GE:Asia/Tbilisi:
+Haiti Standard Time:918,918:HT:America/Port-au-Prince:
+Jordan Standard Time:919,919:JO:Asia/Amman:
+Kaliningrad Standard Time:920,920:RU:Europe/Kaliningrad:
+Kamchatka Standard Time:921,921:RU:Asia/Kamchatka:
+Libya Standard Time:922,922:LY:Africa/Tripoli:
+Line Islands Standard Time:923,923::Pacific/Kiritimati:
+Lord Howe Standard Time:924,924::Australia/Lord_Howe:
+Magadan Standard Time:925,925::Asia/Magadan:
+Marquesas Standard Time:926,926::Pacific/Marquesas:
+Mauritius Standard Time:927,927:MU:Indian/Mauritius:
+Middle East Standard Time:928,928:LB:Asia/Beirut:
+Montevideo Standard Time:929,929:UY:America/Montevideo:
+Morocco Standard Time:930,930:MA:Africa/Casablanca:
+Mountain Standard Time (Mexico):931,931:MX:America/Chihuahua:
+Namibia Standard Time:932,932:NA:Africa/Windhoek:
+Norfolk Standard Time:933,933::Pacific/Norfolk:
+North Korea Standard Time:934,934:KP:Asia/Pyongyang:
+Pacific Standard Time (Mexico):935,935:MX:America/Tijuana:
+Pakistan Standard Time:936,936::Asia/Karachi:
+Paraguay Standard Time:937,937:PY:America/Asuncion:
+Russia Time Zone 10:938,938::Asia/Srednekolymsk:
+Russia Time Zone 11:939,939::Asia/Anadyr:
+Russia Time Zone 3:940,940::Europe/Samara:
+Saint Pierre Standard Time:941,941:PM:America/Miquelon:
+Sakhalin Standard Time:942,942::Asia/Sakhalin:
+Syria Standard Time:943,943:SY:Asia/Damascus:
+Tocantins Standard Time:944,944::America/Araguaina:
+Tomsk Standard Time:945,945::Asia/Tomsk:
+Transbaikal Standard Time:946,946::Asia/Chita:
+Turkey Standard Time:947,947::Asia/Istanbul:
+Turks And Caicos Standard Time:948,948:TC:America/Grand_Turk:
+UTC+12:949,949::GMT+1200:
+UTC-02:950,950::GMT-0200:
+UTC-08:951,951::GMT-0800:
+UTC-09:952,952::GMT-0900:
+UTC-11:953,953::GMT-1100:
+UTC:954,954::UTC:
+Ulaanbaatar Standard Time:955,955::Asia/Ulaanbaatar:
+Venezuela Standard Time:956,956::America/Caracas:
+W. Mongolia Standard Time:957,957::Asia/Hovd:
+West Bank Standard Time:958,958::Asia/Gaza:
+Western Brazilian Standard Time:959,959:BR:America/Rio_Branco:
diff --git a/grid/linuxnode.cfg b/grid/linuxnode.cfg
new file mode 100644
index 0000000..d8d8ed9
--- /dev/null
+++ b/grid/linuxnode.cfg
@@ -0,0 +1,21 @@
+#指定主注册节点的位置
+Ice.Default.Locator=VCI-PLT/Locator:tcp -h 172.16.0.24 -p 30000
+
+#指定节点的名称
+IceGrid.Node.Name=LinuxNode
+#设置节点相关数据的存储目录
+IceGrid.Node.Data=node
+#指定节点用于监听客户端连接的端口号
+IceGrid.Node.Endpoints=tcp -p 30100
+
+#
+# Trace properties.
+#
+IceGrid.Node.Trace.Activator=3
+IceGrid.Node.Trace.Adapter=1
+IceGrid.Node.Trace.Server=2
+
+Ice.LogFile=./logs/node.log
+Ice.StdErr=./logs/node.stderr.log
+#指定错误日志文件
+Ice.StdOut=./logs/node.stdout.log
diff --git a/grid/properties/ClientLog4j2.xml b/grid/properties/ClientLog4j2.xml
new file mode 100644
index 0000000..5e38dcb
--- /dev/null
+++ b/grid/properties/ClientLog4j2.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration status="WARN">
+ <Appenders>
+ <Console name="Console" target="SYSTEM_OUT">
+ <PatternLayout pattern="[%-5p] %d{YYYY-MM-dd HH:mm:ss} [%t] %C{1}:%L - %msg%n" />
+ </Console>
+
+ <RollingFile name="RollingFile" filename="./logs/client_log.log" filepattern="${logPath}/client_%d{YYYYMMddHHmmss}.log">
+ <PatternLayout pattern="[%-5p] %d{YYYY-MM-dd HH:mm:ss} [%t] %C{1}:%L - %msg%n" />
+ <Policies>
+ <SizeBasedTriggeringPolicy size="10 MB" />
+ </Policies>
+ <DefaultRolloverStrategy max="20" />
+ </RollingFile>
+
+ </Appenders>
+ <Loggers>
+ <Logger name="ClientLog" level="DEBUG" additivity="true">
+ <AppenderRef ref="RollingFile" />
+ </Logger>
+ <Root level="DEBUG">
+ <AppenderRef ref="Console" />
+ </Root>
+ </Loggers>
+</Configuration>
diff --git a/grid/properties/ServerLog4j2.xml b/grid/properties/ServerLog4j2.xml
new file mode 100644
index 0000000..523ab73
--- /dev/null
+++ b/grid/properties/ServerLog4j2.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration status="DEBUG">
+ <Appenders>
+ <Console name="Console" target="SYSTEM_OUT">
+ <PatternLayout pattern="[%-5p] %d{YYYY-MM-dd HH:mm:ss} [%t] %C{1}:%L - %msg%n" />
+ </Console>
+
+ <RollingFile name="RollingFile" filename="./logs/server.log" filepattern="${logPath}/server_%d{YYYYMMddHHmmss}.log">
+ <PatternLayout pattern="[%-5p] %d{YYYY-MM-dd HH:mm:ss} [%t] %C{1}:%L - %msg%n" />
+ <Policies>
+ <SizeBasedTriggeringPolicy size="10 MB" />
+ </Policies>
+ <DefaultRolloverStrategy max="20" />
+ </RollingFile>
+
+ </Appenders>
+ <Loggers>
+ <Logger name="ServerLog" level="INFO" additivity="true">
+ <AppenderRef ref="RollingFile" />
+ </Logger>
+ <Root level="INFO">
+ <AppenderRef ref="Console" />
+ </Root>
+ </Loggers>
+</Configuration>
diff --git a/grid/properties/Timer.properties b/grid/properties/Timer.properties
new file mode 100644
index 0000000..4f9f737
--- /dev/null
+++ b/grid/properties/Timer.properties
@@ -0,0 +1,10 @@
+#\u4E8B\u4EF6\u603B\u4E2A\u6570
+time_schedule_count=1
+#\u5B9A\u65F6\u5668\u7684\u7C7B\u578B, day or hour
+time_type_0=min
+#\u5B9A\u65F6\u5668\u542F\u52A8\u7C7B
+time_schedule_0=com.vci.timer.server.FirstTimer
+#\u5B9A\u65F6\u5668\u542F\u52A8\u4E8B\u4EF6
+start_time_0=2016/3/8 10\:00\:00
+#\u5B9A\u65F6\u5668\u95F4\u9694\u4E8B\u4EF6
+time_period_0=5
diff --git a/grid/properties/email.properties b/grid/properties/email.properties
new file mode 100644
index 0000000..5f29a9f
--- /dev/null
+++ b/grid/properties/email.properties
@@ -0,0 +1,7 @@
+smtp_host=smtp.263xmail.com
+pop3_host=pop.263xmail.com
+username=liucq
+password=1111
+send_user_email=liucq@vci=tech.com
+send_user_name=liucq
+max_size=100
\ No newline at end of file
diff --git a/grid/properties/eventConf.properties b/grid/properties/eventConf.properties
new file mode 100644
index 0000000..ef4acb3
--- /dev/null
+++ b/grid/properties/eventConf.properties
@@ -0,0 +1,19 @@
+
+workflow.event.type.start =
+#workflow.event.type.end = plt_TransitionForIntermitting,ReturnWorkingStatus
+workflow.event.type.end = ReturnEditingStatus,ReturnInitialStatus
+workflow.event.type.trainsition = TransferStatus
+
+workflow.event.type.TransferStatus = \u8dc3\u8fc1\u751f\u547d\u5468\u671f\u72b6\u6001
+workflow.event.type.TransferStatus.class = com.vci.server.workflow.event.TransferStatus
+workflow.event.type.TransferStatus.field = targetStatus,releaseStatus
+workflow.event.type.TransferStatus.field.type = string,string
+
+
+workflow.event.type.ReturnEditingStatus = \u6d41\u7a0b\u7ec8\u6b62\uff0c\u8fd4\u56de\u7f16\u5236\u72b6\u6001
+workflow.event.type.ReturnEditingStatus.class = com.vci.server.workflow.event.ReturnEditingStatus
+
+workflow.event.type.ReturnInitialStatus = \u6d41\u7a0b\u7ec8\u6b62\uff0c\u8fd4\u56de\u521D\u59CB\u72b6\u6001
+workflow.event.type.ReturnInitialStatus.class = com.vci.server.workflow.event.ReturnInitialStatus
+
+workflow.business.function.class=com.vci.client.portal.NewNewUI.buttonmng.TaskBusinessFunctionButtonDialog
diff --git a/grid/properties/hibernate.cfg.xml b/grid/properties/hibernate.cfg.xml
new file mode 100644
index 0000000..b8dbb9d
--- /dev/null
+++ b/grid/properties/hibernate.cfg.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+<hibernate-configuration>
+ <session-factory>
+ <property name="show_sql">true</property>
+ <property name="dialect">org.hibernate.dialect.OracleDialect</property>
+ <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
+
+ <!--<property name="connection.url">jdbc:oracle:thin:@172.16.0.243:1521:orcl</property>
+ <property name="connection.username">vcimes</property>
+ <property name="connection.password">vcimes</property>-->
+
+ <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
+ <property name="connection.username">plt2024</property>
+ <property name="connection.password">vcitest</property>
+ <!--<property name="connection.username">mpm112</property>
+ <property name="connection.password">vcitest</property>-->
+
+ <!--property name="hibernate.connection.release_mode">auto</property -->
+
+ <!-- 璁剧疆C3P0 -->
+ <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
+ <property name="hibernate.c3p0.acquireRetryAttempts">30</property>
+ <property name="hibernate.c3p0.acquireIncrement">2</property>
+ <property name="hibernate.c3p0.checkoutTimeout">30000</property>
+ <property name="hibernate.c3p0.idleConnectionTestPeriod">120</property>
+ <property name="hibernate.c3p0.maxIdleTime">180</property>
+ <property name="hibernate.c3p0.initialPoolSize">3</property>
+ <property name="hibernate.c3p0.maxPoolSize">100</property>
+ <property name="hibernate.c3p0.minPoolSize">1</property>
+ <property name="hibernate.c3p0.maxStatements">100</property>
+ <property name="maxStatementsPerConnection">100</property>
+ <property name="hibernate.current_session_context_class">com.vci.server.mw.SessionContext4JBPM</property>
+ <property name="hibernate.connection.isolation">2</property>
+
+ <!-- framework鏄犲皠鏂囦欢 -->
+ <mapping resource="com/vci/server/framework/hbm/AppConfigCategory.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/AppConfigDetail.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/Combination.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/CombinationValue.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/Department.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/Role.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/User.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/Function.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/Operate.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/RoleRight.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/PasswordStrategy.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/UserLogon.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/SystemCfg.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/SpecialChar.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/SpecialCharClfy.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/Log.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/MachSecurity.hbm.xml"/>
+ <mapping resource="com/vci/server/framework/hbm/Pvolume.hbm.xml"/>
+
+ <!-- QT鏄犲皠鏂囦欢 -->
+ <mapping resource="com/vci/server/omd/qt/hbm/QT.hbm.xml"/>
+
+ <!-- portal_START-->
+ <mapping resource="com/vci/server/portal/hbm/PLActionClsEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PLActionParamEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PLTypeActionEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PortalVIEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PLActionEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PLUILayoutEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PLTabPageEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PLTabButtonEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PLCommandParameterEntity.hbm.xml"/>
+ <mapping resource="com/vci/server/portal/hbm/PLPageDefinationEntity.hbm.xml"/>
+ <!-- portal_END-->
+
+ <!-- workflow鏄犲皠鏂囦欢 -->
+ <mapping resource="com/vci/server/workflow/server/hbm/ProcessCategory.hbm.xml"/>
+ <mapping resource="com/vci/server/workflow/server/hbm/Plflowapproveopinion.hbm.xml"/>
+ <mapping resource="com/vci/server/workflow/server/hbm/PLFlowObject.hbm.xml"/>
+ <mapping resource="com/vci/server/workflow/server/hbm/NodeHide.hbm.xml"/>
+ <mapping resource="com/vci/server/workflow/server/hbm/TaskDesc.hbm.xml"/>
+ <mapping resource="com/vci/server/workflow/server/hbm/TaskRevoke.hbm.xml"/>
+ <mapping resource="com/vci/server/workflow/server/hbm/TasksAssigned.hbm.xml"/>
+ <mapping resource="com/vci/server/workflow/server/hbm/FlowApproveContent.hbm.xml"/>
+ <mapping resource="jbpm.repository.hbm.xml"/>
+ <mapping resource="jbpm.execution.hbm.xml"/>
+ <mapping resource="jbpm.history.hbm.xml"/>
+ <mapping resource="jbpm.task.hbm.xml"/>
+ <mapping resource="jbpm.identity.hbm.xml"/>
+
+ <mapping resource="com/vci/server/workflow/server/hbm/Plwfinstancetemplate.hbm.xml"/>
+ <mapping resource="com/vci/server/workflow/server/hbm/Plwfpersonset.hbm.xml"/>
+
+ <!-- 鏆傛椂绂佺敤Hibernate鐨勪簨浠剁洃鍚�
+ <listener type="post-insert"
+ class="com.vci.base.server.persistence.history.HistoryListener" />
+ <listener type="post-update"
+ class="com.vci.base.server.persistence.history.HistoryListener" />
+ <listener type="post-delete"
+ class="com.vci.base.server.persistence.history.HistoryListener" />
+ -->
+ </session-factory>
+</hibernate-configuration>
\ No newline at end of file
diff --git a/grid/properties/iceClient.properties b/grid/properties/iceClient.properties
new file mode 100644
index 0000000..fc354fe
--- /dev/null
+++ b/grid/properties/iceClient.properties
@@ -0,0 +1,2 @@
+锘�#NameService=PLT
+Endpoints=default -h localhost -p 4601
\ No newline at end of file
diff --git a/grid/properties/lifeCycleEvents.properties b/grid/properties/lifeCycleEvents.properties
new file mode 100644
index 0000000..e04214d
--- /dev/null
+++ b/grid/properties/lifeCycleEvents.properties
@@ -0,0 +1,9 @@
+\u521D\u59CB\u5316\u4E8B\u4EF6=plm.bs.omd.lifecycle.client.pubimpl.transitionEventModel.LifeCycleInitialEvent;
+\u5F00\u59CB\u4E8B\u4EF6=plm.bs.omd.lifecycle.client.pubimpl.transitionEventModel.LifeCycleStartedEvent;
+\u7ED3\u675F\u4E8B\u4EF6=plm.bs.omd.lifecycle.client.pubimpl.transitionEventModel.LifeCycleFinishedEvent;
+TransationEventA=com.vci.server.omd.lifecycle.pubimpl.TransationEventa
+TransationEventB=com.vci.server.omd.lifecycle.pubimpl.TransationEventb
+TransationEventC=com.vci.server.omd.lifecycle.pubimpl.TransationEventc
+TransationEventD=com.vci.server.omd.lifecycle.pubimpl.TransationEventd
+TransationEventE=com.vci.server.omd.lifecycle.pubimpl.TransationEvente
+TransationEventF=com.vci.server.omd.lifecycle.pubimpl.TransationEventf
\ No newline at end of file
diff --git a/grid/properties/mail.properties b/grid/properties/mail.properties
new file mode 100644
index 0000000..61ee443
--- /dev/null
+++ b/grid/properties/mail.properties
@@ -0,0 +1,8 @@
+#Fri Feb 21 16:18:08 CST 2014
+send_user_name=liucq8
+password=1111
+smtp_host=smtp.263xmail.com
+max_size=1000
+send_user_email=liucq@vci-tech.com
+pop3_host=pop.263xmail.com
+username=liucq
diff --git a/grid/properties/redis.properties b/grid/properties/redis.properties
new file mode 100644
index 0000000..3a3beb2
--- /dev/null
+++ b/grid/properties/redis.properties
@@ -0,0 +1,22 @@
+# \u64cd\u4f5c\u8d85\u65f6\u65f6\u95f4,\u9ed8\u8ba42\u79d2
+redis.timeout=3000
+
+# redis url\u63a5\u53e3\u4ee5";"\u5206\u5272\u591a\u4e2a\u5730\u5740
+redis.jedisPoolConfig.urls=127.0.0.1:6379
+
+# jedis\u6c60\u6700\u5927\u8fde\u63a5\u6570\u603b\u6570\uff0c\u9ed8\u8ba48
+redis.jedisPoolConfig.maxTotal=8
+
+# jedis\u6c60\u6700\u5927\u7a7a\u95f2\u8fde\u63a5\u6570\uff0c\u9ed8\u8ba48
+redis.jedisPoolConfig.maxIdle=8
+
+#jedis\u6c60\u6700\u5c11\u7a7a\u95f2\u8fde\u63a5\u6570
+redis.jedisPoolConfig.minIdle=3
+
+# jedis\u6c60\u6ca1\u6709\u5bf9\u8c61\u8fd4\u56de\u65f6\uff0c\u6700\u5927\u7b49\u5f85\u65f6\u95f4\u5355\u4f4d\u4e3a\u6beb\u79d2
+redis.jedisPoolConfig.maxWaitTime=60000
+
+# \u5728borrow\u4e00\u4e2ajedis\u5b9e\u4f8b\u65f6\uff0c\u662f\u5426\u63d0\u524d\u8fdb\u884cvalidate\u64cd\u4f5c
+redis.jedisPoolConfig.testOnBorrow=true
+
+
diff --git a/grid/properties/service.xml b/grid/properties/service.xml
new file mode 100644
index 0000000..552d9fb
--- /dev/null
+++ b/grid/properties/service.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Services>
+ <!-- <ServiceTempl name="CacheService" entry="com.vci.server.cache.CacheServerImpl" description="缂撳瓨鏈嶅姟" /> -->
+ <ServiceTempl name="FrameService" entry="com.vci.server.framework.FrameworkServiceImpl" description="绯荤粺妗嗘灦鏈嶅姟" />
+ <ServiceTempl name="OMDService" entry="com.vci.server.omd.OMDServiceImpl" description="瀵硅薄妯″瀷瀹氫箟鏈嶅姟" />
+ <ServiceTempl name="BOFServer" entry="com.vci.server.bof.BOFactoryServiceImpl" description="瀵硅薄宸ュ巶鏈嶅姟" />
+ <!-- <ServiceTempl name="QTDServer" entry="com.vci.server.qt.QTDefineServiceImpl" description="鏌ヨ妯℃澘瀹氫箟鏈嶅姟" />-->
+ <ServiceTempl name="OQServer" entry="com.vci.server.query.ObjectQueryServiceImpl" description="瀵硅薄鏌ヨ鏈嶅姟" />
+ <ServiceTempl name="UIServer" entry="com.vci.server.portal.PortalServiceImpl" description="UI鏈嶅姟" />
+ <!-- <ServiceTempl name="Auth2Server" entry="com.vci.server.auth2.Auth2ServiceImpl" description="鎺堟潈閴存潈鏈嶅姟" />-->
+ <ServiceTempl name="WFServer" entry="com.vci.server.workflow.WorkflowServiceImpl" description="宸ヤ綔娴佹湇鍔�" />
+ <!-- <ServiceTempl name="VolumeManager" entry="com.vci.server.volume.VolumeManagerImpl" description="鍗风鐞嗘湇鍔�" />-->
+ <ServiceTempl name="VolumeService" entry="com.vci.server.volume.VolumeServiceImpl" description="鍗锋湇鍔�" />
+</Services>
\ No newline at end of file
diff --git a/grid/properties/volume.properties b/grid/properties/volume.properties
new file mode 100644
index 0000000..115d8c5
--- /dev/null
+++ b/grid/properties/volume.properties
@@ -0,0 +1,11 @@
+锘�#鍗锋湇鍔�
+volume.service.name=DefaultVolumeService
+
+historyCopyCount=3
+#isReadOnly=false
+
+#鏂囦欢浼犺緭鍧楀ぇ灏忥紝1024鐨勫�嶆暟
+blockLength=32
+
+#鏂囦欢鏄惁鍔犲瘑
+#isFileEncry=true
diff --git a/grid/registry.cfg b/grid/registry.cfg
new file mode 100644
index 0000000..796a8d3
--- /dev/null
+++ b/grid/registry.cfg
@@ -0,0 +1,30 @@
+#registry config for icegrid
+
+IceGrid.InstanceName=VCI-PLT
+
+IceGrid.Registry.Client.Endpoints=tcp -h localhost -p 4061
+IceGrid.Registry.Server.Endpoints=tcp -h localhost
+IceGrid.Registry.Internal.Endpoints=tcp -h localhost
+
+#
+# Enable the admin session manager for use with Glacier2.
+#
+IceGrid.Registry.AdminSessionManager.Endpoints=default -h localhost
+
+IceGrid.Registry.PermissionsVerifier=VCI-PLT/NullPermissionsVerifier
+IceGrid.Registry.AdminPermissionsVerifier=VCI-PLT/NullPermissionsVerifier
+IceGrid.Registry.DynamicRegistration=1
+IceGrid.Registry.LMDB.Path=registry
+
+IceGrid.Registry.DefaultTemplates=application.xml
+
+#
+# Trace properties.
+#
+IceGrid.Registry.Trace.Node=1
+IceGrid.Registry.Trace.Replica=1
+
+Ice.LogFile=./logs/grid.log
+Ice.StdErr=./logs/grid.err.log
+#鎸囧畾閿欒鏃ュ織鏂囦欢
+Ice.StdOut=./logs/grid.out.log
diff --git a/grid/start-grid-admin.bat b/grid/start-grid-admin.bat
new file mode 100644
index 0000000..029af43
--- /dev/null
+++ b/grid/start-grid-admin.bat
@@ -0,0 +1,2 @@
+start ./jre/bin/java -jar D:\ZeroC\Ice-3.7.9\bin\icegridgui.jar
+
diff --git a/grid/start-grid-lnode.sh b/grid/start-grid-lnode.sh
new file mode 100644
index 0000000..0d7f406
--- /dev/null
+++ b/grid/start-grid-lnode.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+#
+echo 'start icegrid linux node ...'
+nohup icegridnode --Ice.Config=linuxnode.cfg
+
diff --git a/grid/start-grid-reg.bat b/grid/start-grid-reg.bat
new file mode 100644
index 0000000..4c8d228
--- /dev/null
+++ b/grid/start-grid-reg.bat
@@ -0,0 +1,3 @@
+start D:\ZeroC\Ice-3.7.9\bin\icegridregistry --Ice.Config=registry.cfg
+
+
diff --git a/grid/start-grid-wnode.bat b/grid/start-grid-wnode.bat
new file mode 100644
index 0000000..91d4977
--- /dev/null
+++ b/grid/start-grid-wnode.bat
@@ -0,0 +1,2 @@
+start .\Ice-3.7.10\bin\icegridnode --Ice.Config=winnode.cfg
+
diff --git a/grid/start-grid.bat b/grid/start-grid.bat
new file mode 100644
index 0000000..7b9db4c
--- /dev/null
+++ b/grid/start-grid.bat
@@ -0,0 +1,4 @@
+start D:\ZeroC\Ice-3.7.9\bin\icegridregistry --Ice.Config=registry.cfg
+start D:\ZeroC\Ice-3.7.9\bin\icegridnode --Ice.Config=node1.cfg
+start D:\ZeroC\Ice-3.7.9\bin\icegridadmin -u test -p test --Ice.Default.Locator="VCI-PLT/Locator:tcp -h localhost -p 4061"
+
diff --git a/grid/start-grid.sh b/grid/start-grid.sh
new file mode 100644
index 0000000..9eec7b9
--- /dev/null
+++ b/grid/start-grid.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+#
+echo 'start icegrid registry ...'
+nohup icegridregistry --Ice.Config=registry.cfg
+
diff --git a/grid/winnode.cfg b/grid/winnode.cfg
new file mode 100644
index 0000000..b4809fa
--- /dev/null
+++ b/grid/winnode.cfg
@@ -0,0 +1,21 @@
+#指定主注册节点的位置
+Ice.Default.Locator=VCI-PLT/Locator:tcp -h 172.16.0.24 -p 30000
+
+#指定节点的名称
+IceGrid.Node.Name=WinNode
+#设置节点相关数据的存储目录
+IceGrid.Node.Data=node
+#指定节点用于监听客户端连接的端口号
+IceGrid.Node.Endpoints=tcp -p 30100
+
+#
+# Trace properties.
+#
+IceGrid.Node.Trace.Activator=3
+IceGrid.Node.Trace.Adapter=1
+IceGrid.Node.Trace.Server=2
+
+Ice.LogFile=./logs/node.log
+Ice.StdErr=./logs/node.stderr.log
+#指定错误日志文件
+Ice.StdOut=./logs/node.stdout.log
diff --git a/web/tomcat/BUILDING.txt b/web/tomcat/BUILDING.txt
new file mode 100644
index 0000000..dbd76e9
--- /dev/null
+++ b/web/tomcat/BUILDING.txt
@@ -0,0 +1,567 @@
+================================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+================================================================================
+
+ ====================================================
+ Building The Apache Tomcat 8.5 Servlet/JSP Container
+ ====================================================
+
+This subproject contains the source code for Tomcat 8.5, a container that
+implements the Servlet 3.1, JSP 2.3, EL 3.0, WebSocket 1.1 and JASPIC 1.1
+specifications from the Java Community Process <https://www.jcp.org/>.
+
+Note: If you just need to run Apache Tomcat, it is not necessary to build
+it. You may simply download a binary distribution. It is cross-platform.
+Read RUNNING.txt for the instruction on how to run it.
+
+In order to build a binary distribution version of Apache Tomcat from a
+source distribution, do the following:
+
+
+(1) Download and Install a Java Development Kit
+
+ 1. If the JDK is already installed, skip to (2).
+
+ 2. Download a version 7 of Java Development Kit (JDK) release (use the
+ latest update available for your chosen version) from one of:
+
+ http://www.oracle.com/technetwork/java/javase/downloads/index.html
+ http://openjdk.java.net/install/index.html
+ or another JDK vendor.
+
+ Note regarding later versions of Java:
+
+ As documented elsewhere, one of components in Apache Tomcat includes
+ a private copy of the Apache Commons DBCP 2 library.
+
+ The JDBC interfaces implemented by DBCP frequently change in non-backwards
+ compatible ways between versions of the Java SE specification. Therefore,
+ it is likely that DBCP 2 will only compile with the specific version of Java
+ listed above and that compilation will fail if a later version of Java is
+ used.
+
+ See Apache Commons DBCP 2 project web site for more details on
+ available versions of the library and its requirements,
+
+ https://commons.apache.org/dbcp/
+
+ 3. Install the JDK according to the instructions included with the release.
+
+ 4. Set an environment variable JAVA_HOME to the pathname of the directory
+ into which you installed the JDK release.
+
+
+(2) Install Apache Ant version 1.9.10 or later on your computer.
+
+ 1. If Apache Ant version 1.9.10 or later is already installed on your
+ computer, skip to (3).
+
+ 2. Download a binary distribution of Ant from:
+
+ https://ant.apache.org/bindownload.cgi
+
+ 3. Unpack the binary distribution into a convenient location so that the
+ Ant release resides in its own directory (conventionally named
+ "apache-ant-[version]").
+
+ For the purposes of the remainder of this document, the symbolic name
+ "${ant.home}" is used to refer to the full pathname of the release
+ directory.
+
+ 4. Create an ANT_HOME environment variable to point the directory
+ ${ant.home}.
+
+ 5. Modify the PATH environment variable to include the directory
+ ${ant.home}/bin in its list. This makes the "ant" command line script
+ available, which will be used to actually perform the build.
+
+
+(3) Building Tomcat 8.5
+
+(3.1) Checkout or obtain the source code for Tomcat 8.5
+
+Clone the source using git, then checkout a specific major branch or
+master for the latest code development, or download and unpack a source
+package.
+
+ * Tomcat GitHub repository URL:
+
+ https://github.com/apache/tomcat
+
+ * Source packages can be downloaded from:
+
+ https://tomcat.apache.org/download-80.cgi
+
+The location where the source has been placed will be further referred as
+${tomcat.source}.
+
+The Tomcat local build process does not modify line-endings. The svn repository
+is configured so that all files will be checked out with the line-ending
+appropriate for the current platform. When using a source package you should
+ensure that you use the source package that has the appropriate line-ending
+for your platform:
+
+ zip -> CRLF
+ tar.gz -> LF
+
+Note that the release build process does modify line-endings to ensure that
+each release package has the appropriate line-endings.
+
+(3.2) Building
+
+ 1. The build is controlled by creating a ${tomcat.source}/build.properties
+ file.
+
+ It is recommended to always create the file, because of unfortunate
+ default value of base.path property. You may start with the following
+ content for the file:
+
+ # ----- Default Base Path for Dependent Packages -----
+ # Replace this path with the directory path where dependencies binaries
+ # should be downloaded
+ base.path=/home/me/some-place-to-download-to
+
+ 2. Configure base.path property by adding it to the
+ ${tomcat.source}/build.properties file.
+
+ The base.path property specifies the place where Tomcat dependencies
+ required by the build are downloaded. It is recommended to place this
+ directory outside of the source tree, so that you do not waste your
+ time re-downloading the libraries.
+
+* NOTE: The default value of the base.path property configures the build script
+ to download the libraries required to build Tomcat to the
+ ${user.home}/tomcat-build-libs directory.
+
+* NOTE: Users accessing the Internet through a proxy must use the properties
+ file to indicate to Ant the proxy configuration.
+
+ The following properties should be added to the ${tomcat.source}/build.properties
+ file.
+
+ proxy.use=true
+ proxy.host=proxy.domain
+ proxy.port=8080
+ proxy.user=username
+ proxy.password=password
+
+ See Apache Ant documentation for the <setproxy> task for details.
+
+ 3. Go to the sources directory and run Ant:
+
+ cd ${tomcat.source}
+ ant
+
+ This will execute the "deploy" target in build.xml.
+
+ Once the build has completed successfully, a usable Tomcat installation
+ will have been produced in the ${tomcat.source}/output/build directory,
+ and can be started and stopped with the usual scripts.
+
+ Note that the build includes Tomcat documentation, which can be found
+ in the output/build/webapps/docs directory.
+
+ The path of the output directory can be controlled by specifying the
+ "tomcat.output" property in the build.properties file.
+
+* NOTE: Do not run the build as the root user. Building and running Tomcat
+ does not require root privileges.
+
+
+(4) Updating sources and rebuilding
+
+It is recommended that you regularly update the downloaded Tomcat 8.5
+sources using your git client.
+
+For a quick rebuild of only modified code you can use:
+
+ cd ${tomcat.source}
+ ant
+
+
+(5) Special builds
+
+There are several targets in Tomcat build files that are useful to be
+called separately. They build components that you may want to build
+quickly, or ones that are included in the full release and are not built
+during the default "deploy" build.
+
+(5.1) Building documentation
+
+The documentation web application is built during the default "deploy"
+build.
+
+It can be built quickly by using the following commands:
+
+ cd ${tomcat.source}
+ ant build-docs
+
+The output of this command will be found in the following directory:
+
+ output/build/webapps/docs
+
+
+The API documentation (Javadoc) is built during a "release" build. It is
+easy to build it separately by using the following commands:
+
+ cd ${tomcat.source}
+ ant javadoc
+
+The output of this command will be found in the following directories:
+
+ output/dist/webapps/docs/api
+ output/dist/webapps/docs/elapi
+ output/dist/webapps/docs/jspapi
+ output/dist/webapps/docs/servletapi
+
+
+(5.2) Building the extras (commons-logging, webservices etc.)
+
+These components are documented on the "Additional Components"
+(extras.html) page of documentation. They are built during a "release"
+build.
+
+You can build them by using the following commands:
+
+ cd ${tomcat.source}
+ ant extras
+
+(5.3) Building the embedded packages
+
+These are built during a "release" build.
+
+You can build them by using the following commands:
+
+ cd ${tomcat.source}
+ ant embed
+
+
+(6) Building a full release (as provided via the ASF download pages)
+
+ A full release includes the Windows installer which requires a Windows
+ environment to be available to create it. If not building in a Windows
+ environment, the build scripts assume that Wine is available. If this is not
+ the case, the skip.installer property may be set to skip the creation of the
+ Windows installer.
+
+ Provided that Wine is available on non-Windows platforms, a full release
+ build may be made on Windows, Linux or MacOS.
+
+ 1. Configure GPG, if needed
+
+ If the released artifacts have to be cryptographically signed with a
+ PGP signature, like the official ASF releases are, the following
+ property can be added to the build.properties file:
+
+ # Location of GPG executable (used only for releases)
+ gpg.exec=/path/to/gpg
+
+ You do not need it if you do not plan to sign the release.
+
+ If "gpg.exec" property does not point to an existing file, it will be
+ ignored and this feature will be disabled.
+
+ You will be prompted for the GPG passphrase when the release build
+ starts, unless "gpg.passphrase" property is set.
+
+ 2. If building the Windows installer
+
+ If running the build in a UAC enabled environment, building the Windows
+ installer requires elevated privileges. The simplest way to do this is to
+ open the command prompt used for the build with the "Run as administrator"
+ option.
+
+ 3. Configure the code signing service
+
+ ASF committers performing official releases will need to configure the code
+ signing service so that the Windows installer is signed during the build
+ process. The following properties need to be added to the build.properties
+ file:
+
+ # Location of GPG executable (used only for releases)
+ gpg.exec=/path/to/gpg
+ # Code signing of Windows installer
+ do.codesigning=true
+ codesigning.storepass=request-via-pmc
+
+ Release managers will be provided with the necessary credentials by the PMC.
+ It will also be necessary to enable TLS 1.2 and the correct cipher suite to
+ for the build process to communicate with the code signing service. The
+ simplest way is by setting the ANT_OPTS environment variable.
+ E.g. (for Windows):
+
+ set ANT_OPTS=-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2 -Dhttps.cipherSuites=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
+
+ You will also need to download and install the Java 7 unlimited strength
+ jurisdiction policy files in order to use the above cipher suite.
+
+ 4. Build the release:
+
+ cd ${tomcat.source}
+ ant release
+
+
+(7) Tests
+
+(7.1) Running Tomcat tests
+
+Tomcat includes a number of junit tests. The tests are not run when a
+release is built. There is separate command to run them.
+
+To run the testsuite use the following command:
+
+ cd ${tomcat.source}
+ ant test
+
+It is advisable to redirect output of the above command to a file for later
+inspection.
+
+The JUnit reports generated by the tests will be written to the following
+directory:
+
+ output/build/logs
+
+By default the testsuite is run three times to test 3 different
+implementations of Tomcat connectors: NIO, NIO2 and APR. (If you are not
+familiar with Tomcat connectors, see config/http.html in documentation for
+details).
+
+The 3 runs are enabled and disabled individually by the following
+properties, which all are "true" by default:
+
+ execute.test.nio=true
+ execute.test.nio2=true
+ execute.test.apr=true
+
+The APR connector can be tested only if Tomcat-Native library binaries are
+found by the testsuite. The "test.apr.loc" property specifies the directory
+where the library binaries are located.
+
+By default the "test.apr.loc" property specifies the following location:
+
+ output/build/bin/native/
+
+If you are on Windows and want to test the APR connector you can put the
+tcnative-1.dll file into ${tomcat.source}/bin/native/ and it will be copied
+into the above directory when the build runs.
+
+The unit tests include tests of the clustering functionality which require
+multicast to be enabled. There is a simple application provided in the Tomcat
+test source (org.apache.catalina.tribes.TesterMulticast) that can be used to
+check if a machine supports multicast. Notes on enabling multicast for different
+operating systems are provided in the Javadoc for that class.
+
+
+(7.2) Running a single test
+
+It is possible to run a single JUnit test class by adding the "test.entry"
+property to the build.properties file. The property specifies the name of
+the test class.
+
+For example:
+
+ test.entry=org.apache.catalina.util.TestServerInfo
+
+It is possible to further limit such run to a number of selected test
+methods by adding "test.entry.methods" property. The property specifies a
+comma-separated list of test case methods.
+
+For example:
+
+ test.entry=org.apache.el.lang.TestELArithmetic
+ test.entry.methods=testMultiply01,testMultiply02
+
+
+(7.3) Running a set of tests
+
+It is possible to run a set of JUnit test classes by adding the "test.name"
+property to the build.properties file. The property specifies an Ant
+includes pattern for the fileset of test class files to run.
+
+The default value is "**/Test*.java", so all test classes are being
+executed (with few exceptions - see build.xml for several exclude patterns).
+
+You can include multiple patterns by concatenating them with a comma (",")
+as the separator.
+
+For example:
+
+ test.name=**/TestSsl.java,**/TestWebSocketFrameClientSSL.java
+
+You can exclude specific JUnit test classes by adding the "test.exclude"
+property to the build.properties file. The property specifies an Ant
+excludes pattern for the fileset of test class files to exclude form the run.
+The default value is empty, so no classes are excluded. The syntax is the same
+as for the property "test.name".
+
+
+(7.4) Other configuration options
+
+ 1. It is possible to configure the directory where JUnit reports are
+ written to. It is configured by "test.reports" property. The default
+ value is
+
+ output/build/logs
+
+ 2. It is possible to enable generation of access log file when the tests
+ are run. This is off by default and can be enabled by the following
+ property:
+
+ test.accesslog=true
+
+ The "access_log.<date>" file will be written to the same directory as
+ JUnit reports,
+
+ output/build/logs
+
+ 3. The testsuite respects logging configuration as configured by
+ ${tomcat.source}/conf/logging.properties
+
+ The log files will be written to the temporary directory used by the
+ tests,
+
+ output/test-tmp/logs
+
+ 4. It is possible to configure formatter used by JUnit reports.
+ Configuration properties are "junit.formatter.type",
+ "junit.formatter.extension" and "junit.formatter.usefile".
+
+ For example the following property disables generation of separate report
+ files:
+
+ junit.formatter.usefile=false
+
+ 5. It is possible to speed up testing by letting JUnit to run several
+ tests in parallel.
+
+ This is configured by setting "test.threads" property. The recommended
+ value is one thread per core.
+
+ 6. Optional support is provided for the Cobertura code coverage tool.
+
+NOTE: Cobertura is licensed under GPL v2 with parts of it being under
+ Apache License v1.1. See https://cobertura.github.io/cobertura/ for details.
+ Using it during Tomcat build is optional and is off by default.
+
+ Cobertura can be enabled using the following properties:
+
+ test.cobertura=true
+ test.threads=1
+
+ Using Cobertura currently requires setting test.threads configuration
+ property to the value of 1. Setting that property to a different value
+ will disable code coverage.
+
+ The report files by default are written to
+
+ output/coverage
+
+ 7. The performance tests are written to run reasonably powerful machines (such
+ as a developer may use day to day) assuming no other resource hungry
+ processes are running.
+
+ These assumptions are not always true (e.g. on CI systems running in a
+ virtual machine) so the performance tests may be disabled by using the
+ following property:
+
+ test.excludePerformance=true
+
+ 8. Some tests include checks that the access log valve entries are as expected.
+ These checks include timings. On slower / loaded systems these checks will
+ often fail. The checks may be relaxed by using the following property:
+
+ test.relaxTiming=true
+
+ 9. It is known that some platforms (e.g. OSX El Capitan) require IPv4 to
+ be the default for the multicast tests to work. This is configured by
+ the following property:
+
+ java.net.preferIPv4Stack=true
+
+ 10. By default the output of unit tests is sent to the console and can be
+ quite verbose. The output can be disabled by setting the property:
+
+ test.verbose=false
+
+(8) Source code checks
+
+(8.1) Checkstyle
+
+NOTE: Checkstyle is licensed under LGPL. Using Checkstyle during Tomcat
+ build is optional and is off by default.
+
+ See http://checkstyle.sourceforge.net/ for more information.
+
+Tomcat comes with a Checkstyle configuration that tests its source code
+for certain conventions, like presence of the license header.
+
+To enable Checkstyle, add the following property to build.properties file:
+
+ execute.validate=true
+
+Once Checkstyle is enabled, the check will be performed automatically
+during the build. The check is run before compilation of the source code.
+
+To speed-up repeated runs of this check, a cache is configured. The cache
+is located in the following directory:
+
+ output/res/checkstyle
+
+It is possible to run the check separately by calling the "validate"
+target. The command is:
+
+ cd ${tomcat.source}
+ ant -Dexecute.validate=true validate
+
+
+(8.2) FindBugs
+
+NOTE: FindBugs is licensed under LGPL. Using Findbugs during Tomcat build is
+ optional and is off by default.
+
+ See https://spotbugs.github.io/ for more information.
+
+To enable FindBugs, add the following property to build.properties file:
+
+ execute.findbugs=true
+
+To compile Tomcat classes and generate a FindBugs report, call the
+"findbugs" target. For example:
+
+ cd ${tomcat.source}
+ ant -Dexecute.findbugs=true findbugs
+
+The report file by default is written to
+
+ output/findbugs
+
+
+(8.3) End-of-line conventions check
+
+You usually would not need to run this check. You can skip this section.
+
+Apache Tomcat project has convention that all of its textual source files,
+stored in the Git repository, use Unix style LF line endings.
+
+This test is used by developers to check that the source code adheres to
+this convention. It verifies that the ends of lines in textual files are
+appropriate. The idea is to run this check regularly and notify developers
+when an inconsistency is detected.
+
+The command to run this test is:
+
+ cd ${tomcat.source}
+ ant validate-eoln
diff --git a/web/tomcat/CONTRIBUTING.md b/web/tomcat/CONTRIBUTING.md
new file mode 100644
index 0000000..0ffe20f
--- /dev/null
+++ b/web/tomcat/CONTRIBUTING.md
@@ -0,0 +1,165 @@
+# Contributing to Apache Tomcat
+
+Firstly, thanks for your interest in contributing! I hope that this will be a
+pleasant experience for you, and that you will return to continue
+contributing.
+
+Please visit our [Get Involved page](https://tomcat.apache.org/getinvolved.html)
+for more information on how to contribute.
+
+## Code of Conduct
+
+This project and everyone participating in it are governed by the Apache
+software Foundation's
+[Code of Conduct](https://www.apache.org/foundation/policies/conduct.html). By
+participating, you are expected to adhere to this code. If you are aware of
+unacceptable behavior, please visit the
+[Reporting Guidelines page](https://www.apache.org/foundation/policies/conduct.html#reporting-guidelines)
+and follow the instructions there.
+
+## How Can I Contribute?
+
+Most of the contributions that we receive are code contributions, but you can
+also contribute to the documentation, wiki, etc., or simply report solid bugs
+for us to fix.
+
+### Reporting Bugs
+
+Please review our [guide](https://tomcat.apache.org/bugreport.html) on how to
+submit a bug report. This page also has links to other resources to assist
+you.
+
+### Reporting Translation improvements
+
+Apache Tomcat project uses POEditor for managing the localization files.
+Please see more at https://cwiki.apache.org/confluence/x/vIPzBQ
+
+### Your First Code Contribution
+
+### Trouble Deciding How to Contribute?
+
+Unsure where to begin contributing to Tomcat? You can start by taking a look at
+the issues marked 'Beginner', link below. Please note that the Beginner keyword
+is pretty new to the project, so if there aren't any issues in the filter feel
+free to ask on the [dev list](https://tomcat.apache.org/lists.html#tomcat-dev).
+
+* [Beginner issues](https://bz.apache.org/bugzilla/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO&keywords=Beginner&keywords_type=allwords&list_id=160824&product=Tomcat%207&product=Tomcat%208.5&product=Tomcat%209&query_format=advanced) -
+issues which should only require a few lines of code, and a test or two to
+resolve.
+
+The list above shows all bugs that are marked 'Beginner' and are open in the
+currently supported Tomcat versions (7, 8.5, and 9).
+
+If you prefer C over Java, you may also take a look at the tomcat-native and
+Tomcat Connectors products in Bugzilla.
+
+### How to Provide Your First Patch
+
+Excited yet? This section will guide you through providing a patch to the
+committers of the project for review and acceptance.
+
+##### Choose Your Method of Submission
+
+You can provide a patch in one of the following ways (in order of preference):
+
+* GitHub Pull Request
+* Patch attachment to the Bugzilla issue
+* Email the patch to the developer list. This is not preferred, but if no bug
+is associated with the patch, or you would like a developer review, an email
+may be appropriate.
+
+##### Get the Sources
+
+Now that you've chosen how you want to submit a patch, you need to get the
+source code.
+
+###### Download The Source Distribution
+
+This method works if you want to submit a patch via email, but
+the difference in using the sources distribution and a VCS is that you have to
+manually generate the patch file by using diff. If this is what you want, you
+can download the sources from the "Source Code Distributions" section of the
+Download Page. There is one such page for every major Tomcat version:
+
+- [Tomcat 10](https://tomcat.apache.org/download-10.cgi)
+- [Tomcat 9](https://tomcat.apache.org/download-90.cgi)
+- [Tomcat 8](https://tomcat.apache.org/download-80.cgi)
+- [Tomcat 7](https://tomcat.apache.org/download-70.cgi)
+
+##### Manual Patch Generation
+
+If you have chosen to attach a patch to the Bugzilla issue (or email
+one), then you'll need to download the sources as noted above, make your
+desired changes and then manually generate your patch using diff (or any
+other tool).
+
+##### GitHub
+
+To submit a GitHub Pull Request you'll need to fork the
+[repository](https://github.com/apache/tomcat), clone your fork to do the work:
+
+```
+$ git clone https://github.com/$USERNAME/tomcat.git
+```
+
+and then push your changes, and submit a Pull Request via the GitHub UI.
+
+#### Submitting Your Patch!
+
+After you've chosen your method of submission, retrieved the sources, and
+fixed the issue it's time to submit your work. At this point, just follow
+the method of submission you chose earlier.
+
+* GitHub PR - after resolving the issue in your local fork and pushing to your
+copy of the repository, open a GitHub PR for review.
+* Bugzilla attachment - attach the patch to the Bugzilla issue
+* Email - again, not preferred, but you may send an email to the developer list
+with a patch attached for review.
+
+#### Waiting For Feedback
+
+It may take a while for committers to review. Please be patient during this
+time as all committers are volunteers on the project. If a significant amount
+of time has lapsed since your submission, such as a couple of months, feel free
+to either update your BZ, PR, or email the dev list with a message to bump your
+issue. Sometimes things get lost in all the work and we need a reminder :smile:
+
+## IDE Support
+
+Special IDE support for
+[Eclipse](https://www.eclipse.org/ide/),
+[IntelliJ IDEA](https://www.jetbrains.com/idea/) and
+[NetBeans](https://netbeans.org/)
+is provided through special ant targets:
+
+```bash
+ant ide-eclipse
+```
+```bash
+ant ide-intellij
+```
+```bash
+ant ide-netbeans
+```
+
+Just execute the ant target for your IDE after checking out the sources
+to set up the appropriate configuration files.
+Also make sure to re-execute the target after switching branches or
+after pulling upstream changes in order to keep your IDE configurations in sync.
+
+## Style Guide
+
+Apache Tomcat has very loosely defined coding conventions, but the following
+guidelines will be useful:
+
+* Use spaces for indenting, not tabs
+* 100 char line width for Java source, 80 char line width for documentation
+source (.txt, .xml)
+* Java source: { at end of line, 4 space indents
+* XML source: 2 space indents
+
+## Did we miss something?
+
+Have you reviewed this guide and found it lacking? Or are you confused about
+some particular step? If so, please let us know! Or better yet, submit a PR to
+address the issue :wink:
diff --git a/web/tomcat/LICENSE b/web/tomcat/LICENSE
new file mode 100644
index 0000000..112c0b4
--- /dev/null
+++ b/web/tomcat/LICENSE
@@ -0,0 +1,1057 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+
+APACHE TOMCAT SUBCOMPONENTS:
+
+Apache Tomcat includes a number of subcomponents with separate copyright notices
+and license terms. Your use of these subcomponents is subject to the terms and
+conditions of the following licenses.
+
+
+For the Eclipse JDT Core Batch Compiler (ecj-x.x.x.jar) component:
+
+Eclipse Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
+LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
+CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and
+
+b) in the case of each subsequent Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+where such changes and/or additions to the Program originate from and are
+distributed by that particular Contributor. A Contribution 'originates' from a
+Contributor if it was added to the Program by such Contributor itself or anyone
+acting on such Contributor's behalf. Contributions do not include additions to
+the Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii) are not
+derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which are
+necessarily infringed by the use or sale of its Contribution alone or when
+combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+2. GRANT OF RIGHTS
+
+a) Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide, royalty-free copyright license to
+reproduce, prepare derivative works of, publicly display, publicly perform,
+distribute and sublicense the Contribution of such Contributor, if any, and such
+derivative works, in source code and object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed
+Patents to make, use, sell, offer to sell, import and otherwise transfer the
+Contribution of such Contributor, if any, in source code and object code form.
+This patent license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor, such
+addition of the Contribution causes such combination to be covered by the
+Licensed Patents. The patent license shall not apply to any other combinations
+which include the Contribution. No hardware per se is licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the licenses to
+its Contributions set forth herein, no assurances are provided by any
+Contributor that the Program does not infringe the patent or other intellectual
+property rights of any other entity. Each Contributor disclaims any liability to
+Recipient for claims brought by any other entity based on infringement of
+intellectual property rights or otherwise. As a condition to exercising the
+rights and licenses granted hereunder, each Recipient hereby assumes sole
+responsibility to secure any other intellectual property rights needed, if any.
+For example, if a third party patent license is required to allow Recipient to
+distribute the Program, it is Recipient's responsibility to acquire that license
+before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its
+own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+i) effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title and
+non-infringement, and implied warranties or conditions of merchantability and
+fitness for a particular purpose;
+
+ii) effectively excludes on behalf of all Contributors all liability for
+damages, including direct, indirect, special, incidental and consequential
+damages, such as lost profits;
+
+iii) states that any provisions which differ from this Agreement are offered by
+that Contributor alone and not by any other party; and
+
+iv) states that source code for the Program is available from such Contributor,
+and informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the
+Program.
+
+Each Contributor must identify itself as the originator of its Contribution, if
+any, in a manner that reasonably allows subsequent Recipients to identify the
+originator of the Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with
+respect to end users, business partners and the like. While this license is
+intended to facilitate the commercial use of the Program, the Contributor who
+includes the Program in a commercial product offering should do so in a manner
+which does not create potential liability for other Contributors. Therefore, if
+a Contributor includes the Program in a commercial product offering, such
+Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
+every other Contributor ("Indemnified Contributor") against any losses, damages
+and costs (collectively "Losses") arising from claims, lawsuits and other legal
+actions brought by a third party against the Indemnified Contributor to the
+extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may
+participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial product
+offering, Product X. That Contributor is then a Commercial Contributor. If that
+Commercial Contributor then makes performance claims, or offers warranties
+related to Product X, those performance claims and warranties are such
+Commercial Contributor's responsibility alone. Under this section, the
+Commercial Contributor would have to defend claims against the other
+Contributors related to those performance claims and warranties, and if a court
+requires any other Contributor to pay any damages as a result, the Commercial
+Contributor must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
+IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
+Recipient is solely responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its exercise of
+rights under this Agreement , including but not limited to the risks and costs
+of program errors, compliance with applicable laws, damage to or loss of data,
+programs or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
+CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
+PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS
+GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable
+law, it shall not affect the validity or enforceability of the remainder of the
+terms of this Agreement, and without further action by the parties hereto, such
+provision shall be reformed to the minimum extent necessary to make such
+provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Program itself
+(excluding combinations of the Program with other software or hardware)
+infringes such Recipient's patent(s), then such Recipient's rights granted under
+Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails to
+comply with any of the material terms or conditions of this Agreement and does
+not cure such failure in a reasonable period of time after becoming aware of
+such noncompliance. If all Recipient's rights under this Agreement terminate,
+Recipient agrees to cease use and distribution of the Program as soon as
+reasonably practicable. However, Recipient's obligations under this Agreement
+and any licenses granted by Recipient relating to the Program shall continue and
+survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in
+order to avoid inconsistency the Agreement is copyrighted and may only be
+modified in the following manner. The Agreement Steward reserves the right to
+publish new versions (including revisions) of this Agreement from time to time.
+No one other than the Agreement Steward has the right to modify this Agreement.
+The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation
+may assign the responsibility to serve as the Agreement Steward to a suitable
+separate entity. Each new version of the Agreement will be given a
+distinguishing version number. The Program (including Contributions) may always
+be distributed subject to the version of the Agreement under which it was
+received. In addition, after a new version of the Agreement is published,
+Contributor may elect to distribute the Program (including its Contributions)
+under the new version. Except as expressly stated in Sections 2(a) and 2(b)
+above, Recipient receives no rights or licenses to the intellectual property of
+any Contributor under this Agreement, whether expressly, by implication,
+estoppel or otherwise. All rights in the Program not expressly granted under
+this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to this
+Agreement will bring a legal action under this Agreement more than one year
+after the cause of action arose. Each party waives its rights to a jury trial in
+any resulting litigation.
+
+
+For the Windows Installer component:
+
+ * All NSIS source code, plug-ins, documentation, examples, header files and
+ graphics, with the exception of the compression modules and where
+ otherwise noted, are licensed under the zlib/libpng license.
+ * The zlib compression module for NSIS is licensed under the zlib/libpng
+ license.
+ * The bzip2 compression module for NSIS is licensed under the bzip2 license.
+ * The lzma compression module for NSIS is licensed under the Common Public
+ License version 1.0.
+
+zlib/libpng license
+
+This software is provided 'as-is', without any express or implied warranty. In
+no event will the authors be held liable for any damages arising from the use of
+this software.
+
+Permission is granted to anyone to use this software for any purpose, including
+commercial applications, and to alter it and redistribute it freely, subject to
+the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not claim
+ that you wrote the original software. If you use this software in a
+ product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+bzip2 license
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. The origin of this software must not be misrepresented; you must not claim
+ that you wrote the original software. If you use this software in a
+ product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 3. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 4. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+
+Julian Seward, Cambridge, UK.
+
+jseward@acm.org
+Common Public License version 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC
+LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
+CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and b) in the case of each subsequent
+Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+where such changes and/or additions to the Program originate from and are
+distributed by that particular Contributor. A Contribution 'originates' from a
+Contributor if it was added to the Program by such Contributor itself or anyone
+acting on such Contributor's behalf. Contributions do not include additions to
+the Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii) are not
+derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are
+necessarily infringed by the use or sale of its Contribution alone or when
+combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+2. GRANT OF RIGHTS
+
+a) Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide, royalty-free copyright license to
+reproduce, prepare derivative works of, publicly display, publicly perform,
+distribute and sublicense the Contribution of such Contributor, if any, and such
+derivative works, in source code and object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed
+Patents to make, use, sell, offer to sell, import and otherwise transfer the
+Contribution of such Contributor, if any, in source code and object code form.
+This patent license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor, such
+addition of the Contribution causes such combination to be covered by the
+Licensed Patents. The patent license shall not apply to any other combinations
+which include the Contribution. No hardware per se is licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the licenses to
+its Contributions set forth herein, no assurances are provided by any
+Contributor that the Program does not infringe the patent or other intellectual
+property rights of any other entity. Each Contributor disclaims any liability to
+Recipient for claims brought by any other entity based on infringement of
+intellectual property rights or otherwise. As a condition to exercising the
+rights and licenses granted hereunder, each Recipient hereby assumes sole
+responsibility to secure any other intellectual property rights needed, if any.
+For example, if a third party patent license is required to allow Recipient to
+distribute the Program, it is Recipient's responsibility to acquire that license
+before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its
+own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+i) effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title and
+non-infringement, and implied warranties or conditions of merchantability and
+fitness for a particular purpose;
+
+ii) effectively excludes on behalf of all Contributors all liability for
+damages, including direct, indirect, special, incidental and consequential
+damages, such as lost profits;
+
+iii) states that any provisions which differ from this Agreement are offered by
+that Contributor alone and not by any other party; and
+
+iv) states that source code for the Program is available from such Contributor,
+and informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the
+Program.
+
+Each Contributor must identify itself as the originator of its Contribution, if
+any, in a manner that reasonably allows subsequent Recipients to identify the
+originator of the Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with
+respect to end users, business partners and the like. While this license is
+intended to facilitate the commercial use of the Program, the Contributor who
+includes the Program in a commercial product offering should do so in a manner
+which does not create potential liability for other Contributors. Therefore, if
+a Contributor includes the Program in a commercial product offering, such
+Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
+every other Contributor ("Indemnified Contributor") against any losses, damages
+and costs (collectively "Losses") arising from claims, lawsuits and other legal
+actions brought by a third party against the Indemnified Contributor to the
+extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor to
+control, and cooperate with the Commercial Contributor in, the defense and any
+related settlement negotiations. The Indemnified Contributor may participate in
+any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial product
+offering, Product X. That Contributor is then a Commercial Contributor. If that
+Commercial Contributor then makes performance claims, or offers warranties
+related to Product X, those performance claims and warranties are such
+Commercial Contributor's responsibility alone. Under this section, the
+Commercial Contributor would have to defend claims against the other
+Contributors related to those performance claims and warranties, and if a court
+requires any other Contributor to pay any damages as a result, the Commercial
+Contributor must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
+IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
+Recipient is solely responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its exercise of
+rights under this Agreement, including but not limited to the risks and costs of
+program errors, compliance with applicable laws, damage to or loss of data,
+programs or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
+CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
+PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS
+GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable
+law, it shall not affect the validity or enforceability of the remainder of the
+terms of this Agreement, and without further action by the parties hereto, such
+provision shall be reformed to the minimum extent necessary to make such
+provision valid and enforceable.
+
+If Recipient institutes patent litigation against a Contributor with respect to
+a patent applicable to software (including a cross-claim or counterclaim in a
+lawsuit), then any patent licenses granted by that Contributor to such Recipient
+under this Agreement shall terminate as of the date such litigation is filed. In
+addition, if Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the Program
+itself (excluding combinations of the Program with other software or hardware)
+infringes such Recipient's patent(s), then such Recipient's rights granted under
+Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails to
+comply with any of the material terms or conditions of this Agreement and does
+not cure such failure in a reasonable period of time after becoming aware of
+such noncompliance. If all Recipient's rights under this Agreement terminate,
+Recipient agrees to cease use and distribution of the Program as soon as
+reasonably practicable. However, Recipient's obligations under this Agreement
+and any licenses granted by Recipient relating to the Program shall continue and
+survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in
+order to avoid inconsistency the Agreement is copyrighted and may only be
+modified in the following manner. The Agreement Steward reserves the right to
+publish new versions (including revisions) of this Agreement from time to time.
+No one other than the Agreement Steward has the right to modify this Agreement.
+IBM is the initial Agreement Steward. IBM may assign the responsibility to serve
+as the Agreement Steward to a suitable separate entity. Each new version of the
+Agreement will be given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the Agreement
+under which it was received. In addition, after a new version of the Agreement
+is published, Contributor may elect to distribute the Program (including its
+Contributions) under the new version. Except as expressly stated in Sections
+2(a) and 2(b) above, Recipient receives no rights or licenses to the
+intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to this
+Agreement will bring a legal action under this Agreement more than one year
+after the cause of action arose. Each party waives its rights to a jury trial in
+any resulting litigation.
+
+Special exception for LZMA compression module
+
+Igor Pavlov and Amir Szekely, the authors of the LZMA compression module for
+NSIS, expressly permit you to statically or dynamically link your code (or bind
+by name) to the files from the LZMA compression module for NSIS without
+subjecting your linked code to the terms of the Common Public license version
+1.0. Any modifications or additions to files from the LZMA compression module
+for NSIS, however, are subject to the terms of the Common Public License version
+1.0.
+
+
+For the following XML Schemas for Java EE Deployment Descriptors:
+ - javaee_5.xsd
+ - javaee_web_services_1_2.xsd
+ - javaee_web_services_client_1_2.xsd
+ - javaee_6.xsd
+ - javaee_web_services_1_3.xsd
+ - javaee_web_services_client_1_3.xsd
+ - jsp_2_2.xsd
+ - web-app_3_0.xsd
+ - web-common_3_0.xsd
+ - web-fragment_3_0.xsd
+ - javaee_7.xsd
+ - javaee_web_services_1_4.xsd
+ - javaee_web_services_client_1_4.xsd
+ - jsp_2_3.xsd
+ - web-app_3_1.xsd
+ - web-common_3_1.xsd
+ - web-fragment_3_1.xsd
+
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
+
+1. Definitions.
+
+ 1.1. Contributor. means each individual or entity that creates or contributes
+ to the creation of Modifications.
+
+ 1.2. Contributor Version. means the combination of the Original Software,
+ prior Modifications used by a Contributor (if any), and the
+ Modifications made by that particular Contributor.
+
+ 1.3. Covered Software. means (a) the Original Software, or (b) Modifications,
+ or (c) the combination of files containing Original Software with files
+ containing Modifications, in each case including portions thereof.
+
+ 1.4. Executable. means the Covered Software in any form other than Source
+ Code.
+
+ 1.5. Initial Developer. means the individual or entity that first makes
+ Original Software available under this License.
+
+ 1.6. Larger Work. means a work which combines Covered Software or portions
+ thereof with code not governed by the terms of this License.
+
+ 1.7. License. means this document.
+
+ 1.8. Licensable. means having the right to grant, to the maximum extent
+ possible, whether at the time of the initial grant or subsequently
+ acquired, any and all of the rights conveyed herein.
+
+ 1.9. Modifications. means the Source Code and Executable form of any of the
+ following:
+
+ A. Any file that results from an addition to, deletion from or
+ modification of the contents of a file containing Original Software
+ or previous Modifications;
+
+ B. Any new file that contains any part of the Original Software or
+ previous Modification; or
+
+ C. Any new file that is contributed or otherwise made available under
+ the terms of this License.
+
+ 1.10. Original Software. means the Source Code and Executable form of
+ computer software code that is originally released under this License.
+
+ 1.11. Patent Claims. means any patent claim(s), now owned or hereafter
+ acquired, including without limitation, method, process, and apparatus
+ claims, in any patent Licensable by grantor.
+
+ 1.12. Source Code. means (a) the common form of computer software code in
+ which modifications are made and (b) associated documentation included
+ in or with such code.
+
+ 1.13. You. (or .Your.) means an individual or a legal entity exercising
+ rights under, and complying with all of the terms of, this License. For
+ legal entities, .You. includes any entity which controls, is controlled
+ by, or is under common control with You. For purposes of this
+ definition, .control. means (a) the power, direct or indirect, to cause
+ the direction or management of such entity, whether by contract or
+ otherwise, or (b) ownership of more than fifty percent (50%) of the
+ outstanding shares or beneficial ownership of such entity.
+
+2. License Grants.
+
+ 2.1. The Initial Developer Grant.
+
+ Conditioned upon Your compliance with Section 3.1 below and subject to
+ third party intellectual property claims, the Initial Developer hereby
+ grants You a world-wide, royalty-free, non-exclusive license:
+
+ (a) under intellectual property rights (other than patent or trademark)
+ Licensable by Initial Developer, to use, reproduce, modify, display,
+ perform, sublicense and distribute the Original Software (or
+ portions thereof), with or without Modifications, and/or as part of
+ a Larger Work; and
+
+ (b) under Patent Claims infringed by the making, using or selling of
+ Original Software, to make, have made, use, practice, sell, and
+ offer for sale, and/or otherwise dispose of the Original Software
+ (or portions thereof).
+
+ (c) The licenses granted in Sections 2.1(a) and (b) are effective on the
+ date Initial Developer first distributes or otherwise makes the
+ Original Software available to a third party under the terms of this
+ License.
+
+ (d) Notwithstanding Section 2.1(b) above, no patent license is granted:
+ (1) for code that You delete from the Original Software, or (2) for
+ infringements caused by: (i) the modification of the Original
+ Software, or (ii) the combination of the Original Software with
+ other software or devices.
+
+ 2.2. Contributor Grant.
+
+ Conditioned upon Your compliance with Section 3.1 below and subject to third
+ party intellectual property claims, each Contributor hereby grants You a
+ world-wide, royalty-free, non-exclusive license:
+
+ (a) under intellectual property rights (other than patent or trademark)
+ Licensable by Contributor to use, reproduce, modify, display,
+ perform, sublicense and distribute the Modifications created by such
+ Contributor (or portions thereof), either on an unmodified basis,
+ with other Modifications, as Covered Software and/or as part of a
+ Larger Work; and
+
+ (b) under Patent Claims infringed by the making, using, or selling of
+ Modifications made by that Contributor either alone and/or in
+ combination with its Contributor Version (or portions of such
+ combination), to make, use, sell, offer for sale, have made, and/or
+ otherwise dispose of: (1) Modifications made by that Contributor (or
+ portions thereof); and (2) the combination of Modifications made by
+ that Contributor with its Contributor Version (or portions of such
+ combination).
+
+ (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on
+ the date Contributor first distributes or otherwise makes the
+ Modifications available to a third party.
+
+ (d) Notwithstanding Section 2.2(b) above, no patent license is granted:
+ (1) for any code that Contributor has deleted from the Contributor
+ Version; (2) for infringements caused by: (i) third party
+ modifications of Contributor Version, or (ii) the combination of
+ Modifications made by that Contributor with other software (except
+ as part of the Contributor Version) or other devices; or (3) under
+ Patent Claims infringed by Covered Software in the absence of
+ Modifications made by that Contributor.
+
+3. Distribution Obligations.
+
+ 3.1. Availability of Source Code.
+ Any Covered Software that You distribute or otherwise make available in
+ Executable form must also be made available in Source Code form and that
+ Source Code form must be distributed only under the terms of this License.
+ You must include a copy of this License with every copy of the Source Code
+ form of the Covered Software You distribute or otherwise make available.
+ You must inform recipients of any such Covered Software in Executable form
+ as to how they can obtain such Covered Software in Source Code form in a
+ reasonable manner on or through a medium customarily used for software
+ exchange.
+
+ 3.2. Modifications.
+ The Modifications that You create or to which You contribute are governed
+ by the terms of this License. You represent that You believe Your
+ Modifications are Your original creation(s) and/or You have sufficient
+ rights to grant the rights conveyed by this License.
+
+ 3.3. Required Notices.
+ You must include a notice in each of Your Modifications that identifies
+ You as the Contributor of the Modification. You may not remove or alter
+ any copyright, patent or trademark notices contained within the Covered
+ Software, or any notices of licensing or any descriptive text giving
+ attribution to any Contributor or the Initial Developer.
+
+ 3.4. Application of Additional Terms.
+ You may not offer or impose any terms on any Covered Software in Source
+ Code form that alters or restricts the applicable version of this License
+ or the recipients. rights hereunder. You may choose to offer, and to
+ charge a fee for, warranty, support, indemnity or liability obligations to
+ one or more recipients of Covered Software. However, you may do so only on
+ Your own behalf, and not on behalf of the Initial Developer or any
+ Contributor. You must make it absolutely clear that any such warranty,
+ support, indemnity or liability obligation is offered by You alone, and
+ You hereby agree to indemnify the Initial Developer and every Contributor
+ for any liability incurred by the Initial Developer or such Contributor as
+ a result of warranty, support, indemnity or liability terms You offer.
+
+ 3.5. Distribution of Executable Versions.
+ You may distribute the Executable form of the Covered Software under the
+ terms of this License or under the terms of a license of Your choice,
+ which may contain terms different from this License, provided that You are
+ in compliance with the terms of this License and that the license for the
+ Executable form does not attempt to limit or alter the recipient.s rights
+ in the Source Code form from the rights set forth in this License. If You
+ distribute the Covered Software in Executable form under a different
+ license, You must make it absolutely clear that any terms which differ
+ from this License are offered by You alone, not by the Initial Developer
+ or Contributor. You hereby agree to indemnify the Initial Developer and
+ every Contributor for any liability incurred by the Initial Developer or
+ such Contributor as a result of any such terms You offer.
+
+ 3.6. Larger Works.
+ You may create a Larger Work by combining Covered Software with other code
+ not governed by the terms of this License and distribute the Larger Work
+ as a single product. In such a case, You must make sure the requirements
+ of this License are fulfilled for the Covered Software.
+
+4. Versions of the License.
+
+ 4.1. New Versions.
+ Sun Microsystems, Inc. is the initial license steward and may publish
+ revised and/or new versions of this License from time to time. Each
+ version will be given a distinguishing version number. Except as provided
+ in Section 4.3, no one other than the license steward has the right to
+ modify this License.
+
+ 4.2. Effect of New Versions.
+ You may always continue to use, distribute or otherwise make the Covered
+ Software available under the terms of the version of the License under
+ which You originally received the Covered Software. If the Initial
+ Developer includes a notice in the Original Software prohibiting it from
+ being distributed or otherwise made available under any subsequent version
+ of the License, You must distribute and make the Covered Software
+ available under the terms of the version of the License under which You
+ originally received the Covered Software. Otherwise, You may also choose
+ to use, distribute or otherwise make the Covered Software available under
+ the terms of any subsequent version of the License published by the
+ license steward.
+
+ 4.3. Modified Versions.
+ When You are an Initial Developer and You want to create a new license for
+ Your Original Software, You may create and use a modified version of this
+ License if You: (a) rename the license and remove any references to the
+ name of the license steward (except to note that the license differs from
+ this License); and (b) otherwise make it clear that the license contains
+ terms which differ from this License.
+
+5. DISCLAIMER OF WARRANTY.
+
+ COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN .AS IS. BASIS, WITHOUT
+ WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT
+ LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS,
+ MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK
+ AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD
+ ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL
+ DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
+ SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN
+ ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED
+ HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+6. TERMINATION.
+
+ 6.1. This License and the rights granted hereunder will terminate
+ automatically if You fail to comply with terms herein and fail to
+ cure such breach within 30 days of becoming aware of the breach.
+ Provisions which, by their nature, must remain in effect beyond the
+ termination of this License shall survive.
+
+ 6.2. If You assert a patent infringement claim (excluding declaratory
+ judgment actions) against Initial Developer or a Contributor (the
+ Initial Developer or Contributor against whom You assert such claim
+ is referred to as .Participant.) alleging that the Participant
+ Software (meaning the Contributor Version where the Participant is a
+ Contributor or the Original Software where the Participant is the
+ Initial Developer) directly or indirectly infringes any patent, then
+ any and all rights granted directly or indirectly to You by such
+ Participant, the Initial Developer (if the Initial Developer is not
+ the Participant) and all Contributors under Sections 2.1 and/or 2.2
+ of this License shall, upon 60 days notice from Participant terminate
+ prospectively and automatically at the expiration of such 60 day
+ notice period, unless if within such 60 day period You withdraw Your
+ claim with respect to the Participant Software against such
+ Participant either unilaterally or pursuant to a written agreement
+ with Participant.
+
+ 6.3. In the event of termination under Sections 6.1 or 6.2 above, all end
+ user licenses that have been validly granted by You or any
+ distributor hereunder prior to termination (excluding licenses
+ granted to You by any distributor) shall survive termination.
+
+7. LIMITATION OF LIABILITY.
+
+ UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING
+ NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY
+ OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF
+ ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL,
+ INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT
+ LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE,
+ COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR
+ LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
+ SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR
+ DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY.S NEGLIGENCE TO THE EXTENT
+ APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+ EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS
+ EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+8. U.S. GOVERNMENT END USERS.
+
+ The Covered Software is a .commercial item,. as that term is defined in 48
+ C.F.R. 2.101 (Oct. 1995), consisting of .commercial computer software. (as
+ that term is defined at 48 C.F.R. ? 252.227-7014(a)(1)) and commercial
+ computer software documentation. as such terms are used in 48 C.F.R. 12.212
+ (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1
+ through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered
+ Software with only those rights set forth herein. This U.S. Government Rights
+ clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or
+ provision that addresses Government rights in computer software under this
+ License.
+
+9. MISCELLANEOUS.
+
+ This License represents the complete agreement concerning subject matter
+ hereof. If any provision of this License is held to be unenforceable, such
+ provision shall be reformed only to the extent necessary to make it
+ enforceable. This License shall be governed by the law of the jurisdiction
+ specified in a notice contained within the Original Software (except to the
+ extent applicable law, if any, provides otherwise), excluding such
+ jurisdiction's conflict-of-law provisions. Any litigation relating to this
+ License shall be subject to the jurisdiction of the courts located in the
+ jurisdiction and venue specified in a notice contained within the Original
+ Software, with the losing party responsible for costs, including, without
+ limitation, court costs and reasonable attorneys. fees and expenses. The
+ application of the United Nations Convention on Contracts for the
+ International Sale of Goods is expressly excluded. Any law or regulation
+ which provides that the language of a contract shall be construed against
+ the drafter shall not apply to this License. You agree that You alone are
+ responsible for compliance with the United States export administration
+ regulations (and the export control laws and regulation of any other
+ countries) when You use, distribute or otherwise make available any Covered
+ Software.
+
+10. RESPONSIBILITY FOR CLAIMS.
+
+ As between Initial Developer and the Contributors, each party is responsible
+ for claims and damages arising, directly or indirectly, out of its
+ utilization of rights under this License and You agree to work with Initial
+ Developer and Contributors to distribute such responsibility on an equitable
+ basis. Nothing herein is intended or shall be deemed to constitute any
+ admission of liability.
+
+ NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION
+ LICENSE (CDDL)
+
+ The code released under the CDDL shall be governed by the laws of the State
+ of California (excluding conflict-of-law provisions). Any litigation relating
+ to this License shall be subject to the jurisdiction of the Federal Courts of
+ the Northern District of California and the state courts of the State of
+ California, with venue lying in Santa Clara County, California.
+
diff --git a/web/tomcat/NOTICE b/web/tomcat/NOTICE
new file mode 100644
index 0000000..3b3937a
--- /dev/null
+++ b/web/tomcat/NOTICE
@@ -0,0 +1,51 @@
+Apache Tomcat
+Copyright 1999-2021 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (https://www.apache.org/).
+
+This software contains code derived from netty-native
+developed by the Netty project
+(https://netty.io, https://github.com/netty/netty-tcnative/)
+and from finagle-native developed at Twitter
+(https://github.com/twitter/finagle).
+
+The Windows Installer is built with the Nullsoft
+Scriptable Install System (NSIS), which is
+open source software. The original software and
+related information is available at
+http://nsis.sourceforge.net.
+
+Java compilation software for JSP pages is provided by the Eclipse
+JDT Core Batch Compiler component, which is open source software.
+The original software and related information is available at
+https://www.eclipse.org/jdt/core/.
+
+For portions of the Tomcat JNI OpenSSL API and the OpenSSL JSSE integration
+The org.apache.tomcat.jni and the org.apache.tomcat.net.openssl packages
+are derivative work originating from the Netty project and the finagle-native
+project developed at Twitter
+* Copyright 2014 The Netty Project
+* Copyright 2014 Twitter
+
+The original XML Schemas for Java EE Deployment Descriptors:
+ - javaee_5.xsd
+ - javaee_web_services_1_2.xsd
+ - javaee_web_services_client_1_2.xsd
+ - javaee_6.xsd
+ - javaee_web_services_1_3.xsd
+ - javaee_web_services_client_1_3.xsd
+ - jsp_2_2.xsd
+ - web-app_3_0.xsd
+ - web-common_3_0.xsd
+ - web-fragment_3_0.xsd
+ - javaee_7.xsd
+ - javaee_web_services_1_4.xsd
+ - javaee_web_services_client_1_4.xsd
+ - jsp_2_3.xsd
+ - web-app_3_1.xsd
+ - web-common_3_1.xsd
+ - web-fragment_3_1.xsd
+
+may be obtained from:
+http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/index.html
diff --git a/web/tomcat/README.md b/web/tomcat/README.md
new file mode 100644
index 0000000..ec1353d
--- /dev/null
+++ b/web/tomcat/README.md
@@ -0,0 +1,81 @@
+## Welcome to Apache Tomcat!
+
+### What Is It?
+
+The Apache Tomcat庐 software is an open source implementation of the Java
+Servlet, JavaServer Pages, Java Expression Language and Java WebSocket
+technologies. The Java Servlet, JavaServer Pages, Java Expression Language and
+Java WebSocket specifications are developed under the
+[Java Community Process](https://jcp.org/en/introduction/overview).
+
+The Apache Tomcat software is developed in an open and participatory
+environment and released under the
+[Apache License version 2](https://www.apache.org/licenses/). The Apache Tomcat
+project is intended to be a collaboration of the best-of-breed developers from
+around the world. We invite you to participate in this open development
+project. To learn more about getting involved,
+[click here](https://tomcat.apache.org/getinvolved.html) or keep reading.
+
+Apache Tomcat software powers numerous large-scale, mission-critical web
+applications across a diverse range of industries and organizations. Some of
+these users and their stories are listed on the
+[PoweredBy wiki page](https://wiki.apache.org/tomcat/PoweredBy).
+
+Apache Tomcat, Tomcat, Apache, the Apache feather, and the Apache Tomcat
+project logo are trademarks of the Apache Software Foundation.
+
+### Get It
+
+For every major Tomcat version there is one download page containing
+links to the latest binary and source code downloads, but also
+links for browsing the download directories and archives:
+- [Tomcat 10](https://tomcat.apache.org/download-10.cgi)
+- [Tomcat 9](https://tomcat.apache.org/download-90.cgi)
+- [Tomcat 8](https://tomcat.apache.org/download-80.cgi)
+- [Tomcat 7](https://tomcat.apache.org/download-70.cgi)
+
+To facilitate choosing the right major Tomcat version one, we have provided a
+[version overview page](https://tomcat.apache.org/whichversion.html).
+
+### Documentation
+
+The documentation available as of the date of this release is
+included in the docs webapp which ships with tomcat. You can access that webapp
+by starting tomcat and visiting <http://localhost:8080/docs/> in your browser.
+The most up-to-date documentation for each version can be found at:
+- [Tomcat 10](https://tomcat.apache.org/tomcat-10.0-doc/)
+- [Tomcat 9](https://tomcat.apache.org/tomcat-9.0-doc/)
+- [Tomcat 8](https://tomcat.apache.org/tomcat-8.5-doc/)
+- [Tomcat 7](https://tomcat.apache.org/tomcat-7.0-doc/)
+
+### Installation
+
+Please see [RUNNING.txt](RUNNING.txt) for more info.
+
+### Licensing
+
+Please see [LICENSE](LICENSE) for more info.
+
+### Support and Mailing List Information
+
+* Free community support is available through the
+[tomcat-users](https://tomcat.apache.org/lists.html#tomcat-users) email list and
+a dedicated [IRC channel](https://tomcat.apache.org/irc.html) (#tomcat on
+Freenode).
+
+* If you want freely available support for running Apache Tomcat, please see the
+resources page [here](https://tomcat.apache.org/findhelp.html).
+
+* If you want to be informed about new code releases, bug fixes,
+security fixes, general news and information about Apache Tomcat, please
+subscribe to the
+[tomcat-announce](https://tomcat.apache.org/lists.html#tomcat-announce) email
+list.
+
+* If you have a concrete bug report for Apache Tomcat, please see the
+instructions for reporting a bug
+[here](https://tomcat.apache.org/bugreport.html).
+
+### Contributing
+
+Please see [CONTRIBUTING](CONTRIBUTING.md) for more info.
diff --git a/web/tomcat/RELEASE-NOTES b/web/tomcat/RELEASE-NOTES
new file mode 100644
index 0000000..0dd3a67
--- /dev/null
+++ b/web/tomcat/RELEASE-NOTES
@@ -0,0 +1,178 @@
+================================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+================================================================================
+
+
+ Apache Tomcat Version 8.5.73
+ Release Notes
+
+
+=========
+CONTENTS:
+=========
+
+* Dependency Changes
+* API Stability
+* Bundled APIs
+* Web application reloading and static fields in shared libraries
+* Security manager URLs
+* Symlinking static resources
+* Viewing the Tomcat Change Log
+* Cryptographic software notice
+* When all else fails
+
+
+===================
+Dependency Changes:
+===================
+Tomcat 8.5 is designed to run on Java 7 and later.
+
+
+==============
+API Stability:
+==============
+
+The public interfaces for the following classes are fixed and will not be
+changed at all during the remaining lifetime of the 8.x series:
+- All classes in the javax namespace
+
+The public interfaces for the following classes may be added to in order to
+resolve bugs and/or add new features. No existing interface method will be
+removed or changed although it may be deprecated.
+- org.apache.catalina.* (excluding sub-packages)
+
+Note: As Tomcat 8 matures, the above list will be added to. The list is not
+ considered complete at this time.
+
+Note: A large number of deprecated methods, fields and configuration options
+ were removed in the transition from 8.0.x to 8.5.x. If any of those
+ removals triggers significant problems for the user community that the
+ deletion may be reverted in a later point release.
+
+The remaining classes are considered part of the Tomcat internals and may change
+without notice between point releases.
+
+
+=============
+Bundled APIs:
+=============
+A standard installation of Tomcat 8.5 makes all of the following APIs available
+for use by web applications (by placing them in "lib"):
+* annotations-api.jar (Annotations package)
+* catalina.jar (Tomcat Catalina implementation)
+* catalina-ant.jar (Tomcat Catalina Ant tasks)
+* catalina-ha.jar (High availability package)
+* catalina-storeconfig.jar (Generation of XML configuration from current state)
+* catalina-tribes.jar (Group communication)
+* ecj-4.6.3.jar (Eclipse JDT Java compiler)
+* el-api.jar (EL 3.0 API)
+* jasper.jar (Jasper 2 Compiler and Runtime)
+* jasper-el.jar (Jasper 2 EL implementation)
+* jsp-api.jar (JSP 2.3 API)
+* servlet-api.jar (Servlet 3.1 API)
+* tomcat-api.jar (Interfaces shared by Catalina and Jasper)
+* tomcat-coyote.jar (Tomcat connectors and utility classes)
+* tomcat-dbcp.jar (package renamed database connection pool based on Commons DBCP 2)
+* tomcat-jdbc.jar (Tomcat's database connection pooling solution)
+* tomcat-jni.jar (Interface to the native component of the APR/native connector)
+* tomcat-util.jar (Various utilities)
+* tomcat-websocket.jar (WebSocket 1.1 implementation)
+* websocket-api.jar (WebSocket 1.1 API)
+
+You can make additional APIs available to all of your web applications by
+putting unpacked classes into a "classes" directory (not created by default),
+or by placing them in JAR files in the "lib" directory.
+
+To override the XML parser implementation or interfaces, use the appropriate
+feature for your JVM. For Java <= 8 use the endorsed standards override
+feature. The default configuration defines JARs located in "endorsed" as endorsed.
+For Java 9+ use the upgradeable modules feature.
+
+
+================================================================
+Web application reloading and static fields in shared libraries:
+================================================================
+Some shared libraries (many are part of the JDK) keep references to objects
+instantiated by the web application. To avoid class loading related problems
+(ClassCastExceptions, messages indicating that the classloader
+is stopped, etc.), the shared libraries state should be reinitialized.
+
+Something which might help is to avoid putting classes which would be
+referenced by a shared static field in the web application classloader,
+and putting them in the shared classloader instead (JARs should be put in the
+"lib" folder, and classes should be put in the "classes" folder).
+
+
+======================
+Security manager URLs:
+======================
+In order to grant security permissions to JARs located inside the
+web application repository, use URLs of the following format
+in your policy file:
+
+file:${catalina.base}/webapps/examples/WEB-INF/lib/driver.jar
+
+
+============================
+Symlinking static resources:
+============================
+By default, Unix symlinks will not work when used in a web application to link
+resources located outside the web application root directory.
+
+This behavior is optional, and the "allowLinking" flag may be used to disable
+the check.
+
+
+==============================
+Viewing the Tomcat Change Log:
+==============================
+The full change log is available from https://tomcat.apache.org and is also
+included in the documentation web application.
+
+
+=============================
+Cryptographic software notice
+=============================
+This distribution includes cryptographic software. The country in
+which you currently reside may have restrictions on the import,
+possession, use, and/or re-export to another country, of
+encryption software. BEFORE using any encryption software, please
+check your country's laws, regulations and policies concerning the
+import, possession, or use, and re-export of encryption software, to
+see if this is permitted. See <http://www.wassenaar.org/> for more
+information.
+
+The U.S. Government Department of Commerce, Bureau of Industry and
+Security (BIS), has classified this software as Export Commodity
+Control Number (ECCN) 5D002.C.1, which includes information security
+software using or performing cryptographic functions with asymmetric
+algorithms. The form and manner of this Apache Software Foundation
+distribution makes it eligible for export under the License Exception
+ENC Technology Software Unrestricted (TSU) exception (see the BIS
+Export Administration Regulations, Section 740.13) for both object
+code and source code.
+
+The following provides more details on the included cryptographic
+software:
+ - Tomcat includes code designed to work with JSSE
+ - Tomcat includes code designed to work with OpenSSL
+
+
+====================
+When all else fails:
+====================
+See the FAQ
+https://tomcat.apache.org/faq/
diff --git a/web/tomcat/RUNNING.txt b/web/tomcat/RUNNING.txt
new file mode 100644
index 0000000..59ce0a8
--- /dev/null
+++ b/web/tomcat/RUNNING.txt
@@ -0,0 +1,477 @@
+================================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+================================================================================
+
+ ===================================================
+ Running The Apache Tomcat 8.5 Servlet/JSP Container
+ ===================================================
+
+Apache Tomcat 8.5 requires a Java Standard Edition Runtime
+Environment (JRE) version 7 or later.
+
+=============================
+Running With JRE 7 Or Later
+=============================
+
+(1) Download and Install a Java SE Runtime Environment (JRE)
+
+(1.1) Download a Java SE Runtime Environment (JRE),
+ release version 7 or later, from
+ http://www.oracle.com/technetwork/java/javase/downloads/index.html
+
+(1.2) Install the JRE according to the instructions included with the
+ release.
+
+ You may also use a full Java Development Kit (JDK) rather than just
+ a JRE.
+
+
+(2) Download and Install Apache Tomcat
+
+(2.1) Download a binary distribution of Tomcat from:
+
+ https://tomcat.apache.org/
+
+(2.2) Unpack the binary distribution so that it resides in its own
+ directory (conventionally named "apache-tomcat-[version]").
+
+ For the purposes of the remainder of this document, the name
+ "CATALINA_HOME" is used to refer to the full pathname of that
+ directory.
+
+NOTE: As an alternative to downloading a binary distribution, you can
+create your own from the Tomcat source code, as described in
+"BUILDING.txt". You can either
+
+ a) Do the full "release" build and find the created distribution in the
+ "output/release" directory and then proceed with unpacking as above, or
+
+ b) Do a simple build and use the "output/build" directory as
+ "CATALINA_HOME". Be warned that there are some differences between the
+ contents of the "output/build" directory and a full "release"
+ distribution.
+
+
+(3) Configure Environment Variables
+
+Tomcat is a Java application and does not use environment variables directly.
+Environment variables are used by the Tomcat startup scripts. The scripts use
+the environment variables to prepare the command that starts Tomcat.
+
+(3.1) Set CATALINA_HOME (required) and CATALINA_BASE (optional)
+
+The CATALINA_HOME environment variable should be set to the location of the
+root directory of the "binary" distribution of Tomcat.
+
+The Tomcat startup scripts have some logic to set this variable
+automatically if it is absent, based on the location of the startup script
+in *nix and on the current directory in Windows. That logic might not work
+in all circumstances, so setting the variable explicitly is recommended.
+
+The CATALINA_BASE environment variable specifies location of the root
+directory of the "active configuration" of Tomcat. It is optional. It
+defaults to be equal to CATALINA_HOME.
+
+Using distinct values for the CATALINA_HOME and CATALINA_BASE variables is
+recommended to simplify further upgrades and maintenance. It is documented
+in the "Multiple Tomcat Instances" section below.
+
+
+(3.2) Set JRE_HOME or JAVA_HOME (required)
+
+These variables are used to specify location of a Java Runtime
+Environment or of a Java Development Kit that is used to start Tomcat.
+
+The JRE_HOME variable is used to specify location of a JRE. The JAVA_HOME
+variable is used to specify location of a JDK.
+
+Using JAVA_HOME provides access to certain additional startup options that
+are not allowed when JRE_HOME is used.
+
+If both JRE_HOME and JAVA_HOME are specified, JRE_HOME is used.
+
+The recommended place to specify these variables is a "setenv" script. See
+below.
+
+
+(3.3) Other variables (optional)
+
+Other environment variables exist, besides the four described above.
+See the comments at the top of catalina.bat or catalina.sh scripts for
+the list and a description of each of them.
+
+One frequently used variable is CATALINA_OPTS. It allows specification of
+additional options for the java command that starts Tomcat.
+
+See the Java documentation for the options that affect the Java Runtime
+Environment.
+
+See the "System Properties" page in the Tomcat Configuration Reference for
+the system properties that are specific to Tomcat.
+
+A similar variable is JAVA_OPTS. It is used less frequently. It allows
+specification of options that are used both to start and to stop Tomcat as well
+as for other commands.
+
+Note: Do not use JAVA_OPTS to specify memory limits. You do not need much
+memory for a small process that is used to stop Tomcat. Those settings
+belong to CATALINA_OPTS.
+
+Another frequently used variable is CATALINA_PID (on *nix only). It
+specifies the location of the file where process id of the forked Tomcat
+java process will be written. This setting is optional. It will enable the
+following features:
+
+ * better protection against duplicate start attempts and
+ * allows forceful termination of Tomcat process when it does not react to
+ the standard shutdown command.
+
+
+(3.4) Using the "setenv" script (optional, recommended)
+
+Apart from CATALINA_HOME and CATALINA_BASE, all environment variables can
+be specified in the "setenv" script. The script is placed either into
+CATALINA_BASE/bin or into CATALINA_HOME/bin directory and is named
+setenv.bat (on Windows) or setenv.sh (on *nix). The file has to be
+readable.
+
+By default the setenv script file is absent. If the script file is present
+both in CATALINA_BASE and in CATALINA_HOME, the one in CATALINA_BASE is
+preferred.
+
+For example, to configure the JRE_HOME and CATALINA_PID variables you can
+create the following script file:
+
+On Windows, %CATALINA_BASE%\bin\setenv.bat:
+
+ set "JRE_HOME=%ProgramFiles%\Java\jre7"
+ exit /b 0
+
+On *nix, $CATALINA_BASE/bin/setenv.sh:
+
+ JRE_HOME=/usr/java/latest
+ CATALINA_PID="$CATALINA_BASE/tomcat.pid"
+
+
+The CATALINA_HOME and CATALINA_BASE variables cannot be configured in the
+setenv script, because they are used to locate that file.
+
+All the environment variables described here and the "setenv" script are
+used only if you use the standard scripts to launch Tomcat. For example, if
+you have installed Tomcat as a service on Windows, the service wrapper
+launches Java directly and does not use the script files.
+
+
+(4) Start Up Tomcat
+
+(4.1) Tomcat can be started by executing one of the following commands:
+
+ On Windows:
+
+ %CATALINA_HOME%\bin\startup.bat
+
+ or
+
+ %CATALINA_HOME%\bin\catalina.bat start
+
+ On *nix:
+
+ $CATALINA_HOME/bin/startup.sh
+
+ or
+
+ $CATALINA_HOME/bin/catalina.sh start
+
+(4.2) After startup, the default web applications included with Tomcat will be
+ available by visiting:
+
+ http://localhost:8080/
+
+(4.3) Further information about configuring and running Tomcat can be found in
+ the documentation included here, as well as on the Tomcat web site:
+
+ https://tomcat.apache.org/
+
+
+(5) Shut Down Tomcat
+
+(5.1) Tomcat can be shut down by executing one of the following commands:
+
+ On Windows:
+
+ %CATALINA_HOME%\bin\shutdown.bat
+
+ or
+
+ %CATALINA_HOME%\bin\catalina.bat stop
+
+ On *nix:
+
+ $CATALINA_HOME/bin/shutdown.sh
+
+ or
+
+ $CATALINA_HOME/bin/catalina.sh stop
+
+==================================================
+Advanced Configuration - Multiple Tomcat Instances
+==================================================
+
+In many circumstances, it is desirable to have a single copy of a Tomcat
+binary distribution shared among multiple users on the same server. To make
+this possible, you can set the CATALINA_BASE environment variable to the
+directory that contains the files for your 'personal' Tomcat instance.
+
+When running with a separate CATALINA_HOME and CATALINA_BASE, the files
+and directories are split as following:
+
+In CATALINA_BASE:
+
+ * bin - Only the following files:
+
+ * setenv.sh (*nix) or setenv.bat (Windows),
+ * tomcat-juli.jar
+
+ The setenv scripts were described above. The tomcat-juli library
+ is documented in the Logging chapter in the User Guide.
+
+ * conf - Server configuration files (including server.xml)
+
+ * lib - Libraries and classes, as explained below
+
+ * logs - Log and output files
+
+ * webapps - Automatically loaded web applications
+
+ * work - Temporary working directories for web applications
+
+ * temp - Directory used by the JVM for temporary files (java.io.tmpdir)
+
+
+In CATALINA_HOME:
+
+ * bin - Startup and shutdown scripts
+
+ The following files will be used only if they are absent in
+ CATALINA_BASE/bin:
+
+ setenv.sh (*nix), setenv.bat (Windows), tomcat-juli.jar
+
+ * lib - Libraries and classes, as explained below
+
+ * endorsed - Libraries that override standard "Endorsed Standards"
+ libraries provided by JRE. See Classloading documentation
+ in the User Guide for details.
+ This is only supported for Java <= 8.
+ By default this "endorsed" directory is absent.
+
+In the default configuration the JAR libraries and classes both in
+CATALINA_BASE/lib and in CATALINA_HOME/lib will be added to the common
+classpath, but the ones in CATALINA_BASE will be added first and thus will
+be searched first.
+
+The idea is that you may leave the standard Tomcat libraries in
+CATALINA_HOME/lib and add other ones such as database drivers into
+CATALINA_BASE/lib.
+
+In general it is advised to never share libraries between web applications,
+but put them into WEB-INF/lib directories inside the applications. See
+Classloading documentation in the User Guide for details.
+
+
+It might be useful to note that the values of CATALINA_HOME and
+CATALINA_BASE can be referenced in the XML configuration files processed
+by Tomcat as ${catalina.home} and ${catalina.base} respectively.
+
+For example, the standard manager web application can be kept in
+CATALINA_HOME/webapps/manager and loaded into CATALINA_BASE by copying
+its deployment descriptor into the desired virtual host:
+
+ * Copy the CATALINA_HOME/webapps/manager/META-INF/context.xml
+ file as CATALINA_BASE/conf/Catalina/localhost/manager.xml
+
+ * Add docBase attribute as shown below.
+
+The file will look like the following:
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <Context docBase="${catalina.home}/webapps/manager"
+ antiResourceLocking="false" privileged="true" >
+ <Valve className="org.apache.catalina.valves.RemoteAddrValve"
+ allow="127\.0\.0\.1" />
+ <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
+ </Context>
+
+See Deployer chapter in User Guide and Context and Host chapters in the
+Configuration Reference for more information on contexts and web
+application deployment.
+
+
+================
+Troubleshooting
+================
+
+There are only really 2 things likely to go wrong during the stand-alone
+Tomcat install:
+
+(1) The most common hiccup is when another web server (or any process for that
+ matter) has laid claim to port 8080. This is the default HTTP port that
+ Tomcat attempts to bind to at startup. To change this, open the file:
+
+ $CATALINA_HOME/conf/server.xml
+
+ and search for '8080'. Change it to a port that isn't in use, and is
+ greater than 1024, as ports less than or equal to 1024 require superuser
+ access to bind under UNIX.
+
+ Restart Tomcat and you're in business. Be sure that you replace the "8080"
+ in the URL you're using to access Tomcat. For example, if you change the
+ port to 1977, you would request the URL http://localhost:1977/ in your
+ browser.
+
+(2) The 'localhost' machine isn't found. This could happen if you're behind a
+ proxy. If that's the case, make sure the proxy configuration for your
+ browser knows that you shouldn't be going through the proxy to access the
+ "localhost".
+
+ In Firefox, this is under Tools/Preferences -> Advanced/Network ->
+ Connection -> Settings..., and in Internet Explorer it is Tools ->
+ Internet Options -> Connections -> LAN Settings.
+
+
+====================
+Optional Components
+====================
+
+The following optional components may be included with the Apache Tomcat binary
+distribution. If they are not included, you can install them separately.
+
+ 1. Apache Tomcat Native library
+
+ 2. Apache Commons Daemon service launcher
+
+Both of them are implemented in C language and as such have to be compiled
+into binary code. The binary code will be specific for a platform and CPU
+architecture and it must match the Java Runtime Environment executables
+that will be used to launch Tomcat.
+
+The Windows-specific binary distributions of Apache Tomcat include binary
+files for these components. On other platforms you would have to look for
+binary versions elsewhere or compile them yourself.
+
+If you are new to Tomcat, do not bother with these components to start with.
+If you do use them, do not forget to read their documentation.
+
+
+Apache Tomcat Native library
+-----------------------------
+
+It is a library that allows to use the "Apr" variant of HTTP and AJP
+protocol connectors in Apache Tomcat. It is built around OpenSSL and Apache
+Portable Runtime (APR) libraries. Those are the same libraries as used by
+Apache HTTPD Server project.
+
+This feature was especially important in the old days when Java performance
+was poor. It is less important nowadays, but it is still used and respected
+by many. See Tomcat documentation for more details.
+
+For further reading:
+
+ - Apache Tomcat documentation
+
+ * Documentation for APR/Native library in the Tomcat User's Guide
+
+ https://tomcat.apache.org/tomcat-8.5-doc/apr.html
+
+ * Documentation for the HTTP and AJP protocol connectors in the Tomcat
+ Configuration Reference
+
+ https://tomcat.apache.org/tomcat-8.5-doc/config/http.html
+
+ https://tomcat.apache.org/tomcat-8.5-doc/config/ajp.html
+
+ - Apache Tomcat Native project home
+
+ https://tomcat.apache.org/native-doc/
+
+ - Other projects
+
+ * OpenSSL
+
+ https://www.openssl.org/
+
+ * Apache Portable Runtime
+
+ https://apr.apache.org/
+
+ * Apache HTTP Server
+
+ https://httpd.apache.org/
+
+To disable Apache Tomcat Native library:
+
+ - To disable Apache Tomcat Native library when it is installed, or
+ - To remove the warning that is logged during Tomcat startup when the
+ library is not installed:
+
+ Edit the "conf/server.xml" file and remove "AprLifecycleListener" from
+ it.
+
+The binary file of Apache Tomcat Native library is usually named
+
+ - "tcnative-1.dll" on Windows
+ - "libtcnative-1.so" on *nix systems
+
+
+Apache Commons Daemon
+----------------------
+
+Apache Commons Daemon project provides wrappers that can be used to
+install Apache Tomcat as a service on Windows or as a daemon on *nix
+systems.
+
+The Windows-specific implementation of Apache Commons Daemon is called
+"procrun". The *nix-specific one is called "jsvc".
+
+For further reading:
+
+ - Apache Commons Daemon project
+
+ https://commons.apache.org/daemon/
+
+ - Apache Tomcat documentation
+
+ * Installing Apache Tomcat
+
+ https://tomcat.apache.org/tomcat-8.5-doc/setup.html
+
+ * Windows Service How-To
+
+ https://tomcat.apache.org/tomcat-8.5-doc/windows-service-howto.html
+
+The binary files of Apache Commons Daemon in Apache Tomcat distributions
+for Windows are named:
+
+ - "tomcat8.exe"
+ - "tomcat8w.exe"
+
+These files are renamed copies of "prunsrv.exe" and "prunmgr.exe" from
+Apache Commons Daemon distribution. The file names have a meaning: they are
+used as the service name to register the service in Windows, as well as the
+key name to store distinct configuration for this installation of
+"procrun". If you would like to install several instances of Tomcat 8.5
+in parallel, you have to further rename those files, using the same naming
+scheme.
diff --git a/web/tomcat/bin/bootstrap.jar b/web/tomcat/bin/bootstrap.jar
new file mode 100644
index 0000000..46a4ced
--- /dev/null
+++ b/web/tomcat/bin/bootstrap.jar
Binary files differ
diff --git a/web/tomcat/bin/catalina-tasks.xml b/web/tomcat/bin/catalina-tasks.xml
new file mode 100644
index 0000000..c7c9c28
--- /dev/null
+++ b/web/tomcat/bin/catalina-tasks.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!--
+ XML file for importing Catalina ant tasks.
+ <import file="${catalina.home}/bin/catalina-tasks.xml"/>
+-->
+
+<project name="catalina-tasks">
+ <description>Catalina Ant Manager, JMX and JSPC Tasks</description>
+ <!-- set catalina.home if it's not already set -->
+ <dirname property="catalina.home.bin.dir" file="${ant.file.catalina-tasks}"/>
+ <property name="catalina.home" value="${catalina.home.bin.dir}/.."/>
+ <typedef resource="org/apache/catalina/ant/catalina.tasks">
+ <classpath>
+ <fileset file="${catalina.home}/bin/tomcat-juli.jar"/>
+ <fileset dir="${catalina.home}/lib" includes="*.jar"/>
+ </classpath>
+ </typedef>
+ <typedef resource="org/apache/catalina/ant/jmx/jmxaccessor.tasks">
+ <classpath>
+ <fileset file="${catalina.home}/lib/catalina-ant.jar"/>
+ </classpath>
+ </typedef>
+</project>
diff --git a/web/tomcat/bin/catalina.bat b/web/tomcat/bin/catalina.bat
new file mode 100644
index 0000000..8710635
--- /dev/null
+++ b/web/tomcat/bin/catalina.bat
@@ -0,0 +1,389 @@
+@echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements. See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License. You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Start/Stop Script for the CATALINA Server
+rem
+rem For supported commands call "catalina.bat help" or see the usage section
+rem towards the end of this file.
+rem
+rem Environment Variable Prerequisites
+rem
+rem Do not set the variables in this script. Instead put them into a script
+rem setenv.bat in CATALINA_BASE/bin to keep your customizations separate.
+rem
+rem WHEN RUNNING TOMCAT AS A WINDOWS SERVICE:
+rem Note that the environment variables that affect the behavior of this
+rem script will have no effect at all on Windows Services. As such, any
+rem local customizations made in a CATALINA_BASE/bin/setenv.bat script
+rem will also have no effect on Tomcat when launched as a Windows Service.
+rem The configuration that controls Windows Services is stored in the Windows
+rem Registry, and is most conveniently maintained using the "tomcat8w.exe"
+rem maintenance utility.
+rem
+rem CATALINA_HOME May point at your Catalina "build" directory.
+rem
+rem CATALINA_BASE (Optional) Base directory for resolving dynamic portions
+rem of a Catalina installation. If not present, resolves to
+rem the same directory that CATALINA_HOME points to.
+rem
+rem CATALINA_OPTS (Optional) Java runtime options used when the "start",
+rem "run" or "debug" command is executed.
+rem Include here and not in JAVA_OPTS all options, that should
+rem only be used by Tomcat itself, not by the stop process,
+rem the version command etc.
+rem Examples are heap size, GC logging, JMX ports etc.
+rem
+rem CATALINA_TMPDIR (Optional) Directory path location of temporary directory
+rem the JVM should use (java.io.tmpdir). Defaults to
+rem %CATALINA_BASE%\temp.
+rem
+rem JAVA_HOME Must point at your Java Development Kit installation.
+rem Required to run the with the "debug" argument.
+rem
+rem JRE_HOME Must point at your Java Runtime installation.
+rem Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME
+rem are both set, JRE_HOME is used.
+rem
+rem JAVA_OPTS (Optional) Java runtime options used when any command
+rem is executed.
+rem Include here and not in CATALINA_OPTS all options, that
+rem should be used by Tomcat and also by the stop process,
+rem the version command etc.
+rem Most options should go into CATALINA_OPTS.
+rem
+rem JAVA_ENDORSED_DIRS (Optional) Lists of of semi-colon separated directories
+rem containing some jars in order to allow replacement of APIs
+rem created outside of the JCP (i.e. DOM and SAX from W3C).
+rem It can also be used to update the XML parser implementation.
+rem This is only supported for Java <= 8.
+rem Defaults to $CATALINA_HOME/endorsed.
+rem
+rem JPDA_TRANSPORT (Optional) JPDA transport used when the "jpda start"
+rem command is executed. The default is "dt_socket".
+rem
+rem JPDA_ADDRESS (Optional) Java runtime options used when the "jpda start"
+rem command is executed. The default is localhost:8000.
+rem
+rem JPDA_SUSPEND (Optional) Java runtime options used when the "jpda start"
+rem command is executed. Specifies whether JVM should suspend
+rem execution immediately after startup. Default is "n".
+rem
+rem JPDA_OPTS (Optional) Java runtime options used when the "jpda start"
+rem command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS,
+rem and JPDA_SUSPEND are ignored. Thus, all required jpda
+rem options MUST be specified. The default is:
+rem
+rem -agentlib:jdwp=transport=%JPDA_TRANSPORT%,
+rem address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%
+rem
+rem JSSE_OPTS (Optional) Java runtime options used to control the TLS
+rem implementation when JSSE is used. Default is:
+rem "-Djdk.tls.ephemeralDHKeySize=2048"
+rem
+rem CATALINA_LOGGING_CONFIG (Optional) Override Tomcat's logging config file
+rem Example (all one line)
+rem set CATALINA_LOGGING_CONFIG="-Djava.util.logging.config.file=%CATALINA_BASE%\conf\logging.properties"
+rem
+rem LOGGING_CONFIG Deprecated
+rem Use CATALINA_LOGGING_CONFIG
+rem This is only used if CATALINA_LOGGING_CONFIG is not set
+rem and LOGGING_CONFIG starts with "-D..."
+rem
+rem LOGGING_MANAGER (Optional) Override Tomcat's logging manager
+rem Example (all one line)
+rem set LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
+rem
+rem TITLE (Optional) Specify the title of Tomcat window. The default
+rem TITLE is Tomcat if it's not specified.
+rem Example (all one line)
+rem set TITLE=Tomcat.Cluster#1.Server#1 [%DATE% %TIME%]
+rem ---------------------------------------------------------------------------
+
+setlocal
+
+rem Suppress Terminate batch job on CTRL+C
+if not ""%1"" == ""run"" goto mainEntry
+if "%TEMP%" == "" goto mainEntry
+if exist "%TEMP%\%~nx0.run" goto mainEntry
+echo Y>"%TEMP%\%~nx0.run"
+if not exist "%TEMP%\%~nx0.run" goto mainEntry
+echo Y>"%TEMP%\%~nx0.Y"
+call "%~f0" %* <"%TEMP%\%~nx0.Y"
+rem Use provided errorlevel
+set RETVAL=%ERRORLEVEL%
+del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1
+exit /B %RETVAL%
+:mainEntry
+del /Q "%TEMP%\%~nx0.run" >NUL 2>&1
+
+rem Guess CATALINA_HOME if not defined
+set "CURRENT_DIR=%cd%"
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%CURRENT_DIR%"
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+cd ..
+set "CATALINA_HOME=%cd%"
+cd "%CURRENT_DIR%"
+:gotHome
+
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+echo The CATALINA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+:okHome
+
+rem Copy CATALINA_BASE from CATALINA_HOME if not defined
+if not "%CATALINA_BASE%" == "" goto gotBase
+set "CATALINA_BASE=%CATALINA_HOME%"
+:gotBase
+
+rem Ensure that neither CATALINA_HOME nor CATALINA_BASE contains a semi-colon
+rem as this is used as the separator in the classpath and Java provides no
+rem mechanism for escaping if the same character appears in the path. Check this
+rem by replacing all occurrences of ';' with '' and checking that neither
+rem CATALINA_HOME nor CATALINA_BASE have changed
+if "%CATALINA_HOME%" == "%CATALINA_HOME:;=%" goto homeNoSemicolon
+echo Using CATALINA_HOME: "%CATALINA_HOME%"
+echo Unable to start as CATALINA_HOME contains a semicolon (;) character
+goto end
+:homeNoSemicolon
+
+if "%CATALINA_BASE%" == "%CATALINA_BASE:;=%" goto baseNoSemicolon
+echo Using CATALINA_BASE: "%CATALINA_BASE%"
+echo Unable to start as CATALINA_BASE contains a semicolon (;) character
+goto end
+:baseNoSemicolon
+
+rem Ensure that any user defined CLASSPATH variables are not used on startup,
+rem but allow them to be specified in setenv.bat, in rare case when it is needed.
+set CLASSPATH=
+
+rem Get standard environment variables
+if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome
+call "%CATALINA_BASE%\bin\setenv.bat"
+goto setenvDone
+:checkSetenvHome
+if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"
+:setenvDone
+
+rem Get standard Java environment variables
+if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath
+echo Cannot find "%CATALINA_HOME%\bin\setclasspath.bat"
+echo This file is needed to run this program
+goto end
+:okSetclasspath
+call "%CATALINA_HOME%\bin\setclasspath.bat" %1
+if errorlevel 1 goto end
+
+rem Add on extra jar file to CLASSPATH
+rem Note that there are no quotes as we do not want to introduce random
+rem quotes into the CLASSPATH
+if "%CLASSPATH%" == "" goto emptyClasspath
+set "CLASSPATH=%CLASSPATH%;"
+:emptyClasspath
+set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"
+
+if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir
+set "CATALINA_TMPDIR=%CATALINA_BASE%\temp"
+:gotTmpdir
+
+rem Add tomcat-juli.jar to classpath
+rem tomcat-juli.jar can be over-ridden per instance
+if not exist "%CATALINA_BASE%\bin\tomcat-juli.jar" goto juliClasspathHome
+set "CLASSPATH=%CLASSPATH%;%CATALINA_BASE%\bin\tomcat-juli.jar"
+goto juliClasspathDone
+:juliClasspathHome
+set "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\tomcat-juli.jar"
+:juliClasspathDone
+
+if not "%JSSE_OPTS%" == "" goto gotJsseOpts
+set "JSSE_OPTS=-Djdk.tls.ephemeralDHKeySize=2048"
+:gotJsseOpts
+set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"
+
+rem Register custom URL handlers
+rem Do this here so custom URL handles (specifically 'war:...') can be used in the security policy
+set "JAVA_OPTS=%JAVA_OPTS% -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"
+
+rem Check for the deprecated LOGGING_CONFIG
+rem Only use it if CATALINA_LOGGING_CONFIG is not set and LOGGING_CONFIG starts with "-D..."
+if not "%LOGGING_CONFIG:~0,2%"=="-D" goto noLoggingDeprecation
+if not "%CATALINA_LOGGING_CONFIG%" == "" goto noLoggingDeprecation
+set "CATALINA_LOGGING_CONFIG=%LOGGING_CONFIG%"
+:noLoggingDeprecation
+
+if not "%CATALINA_LOGGING_CONFIG%" == "" goto noJuliConfig
+set CATALINA_LOGGING_CONFIG=-Dnop
+if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfig
+set CATALINA_LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"
+:noJuliConfig
+
+if not "%LOGGING_MANAGER%" == "" goto noJuliManager
+set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
+:noJuliManager
+
+rem Configure JAVA 9 specific start-up parameters
+set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.base/java.lang=ALL-UNNAMED"
+set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.base/java.io=ALL-UNNAMED"
+set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.base/java.util=ALL-UNNAMED"
+set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.base/java.util.concurrent=ALL-UNNAMED"
+set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED"
+
+rem Java 9 no longer supports the java.endorsed.dirs
+rem system property. Only try to use it if
+rem JAVA_ENDORSED_DIRS was explicitly set
+rem or CATALINA_HOME/endorsed exists.
+set ENDORSED_PROP=ignore.endorsed.dirs
+if "%JAVA_ENDORSED_DIRS%" == "" goto noEndorsedVar
+set ENDORSED_PROP=java.endorsed.dirs
+goto doneEndorsed
+:noEndorsedVar
+if not exist "%CATALINA_HOME%\endorsed" goto doneEndorsed
+set ENDORSED_PROP=java.endorsed.dirs
+:doneEndorsed
+
+rem ----- Execute The Requested Command ---------------------------------------
+
+echo Using CATALINA_BASE: "%CATALINA_BASE%"
+echo Using CATALINA_HOME: "%CATALINA_HOME%"
+echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"
+if ""%1"" == ""debug"" goto use_jdk
+echo Using JRE_HOME: "%JRE_HOME%"
+goto java_dir_displayed
+:use_jdk
+echo Using JAVA_HOME: "%JAVA_HOME%"
+:java_dir_displayed
+echo Using CLASSPATH: "%CLASSPATH%"
+echo Using CATALINA_OPTS: "%CATALINA_OPTS%"
+
+set _EXECJAVA=%_RUNJAVA%
+set MAINCLASS=org.apache.catalina.startup.Bootstrap
+set ACTION=start
+set SECURITY_POLICY_FILE=
+set DEBUG_OPTS=
+set JPDA=
+
+if not ""%1"" == ""jpda"" goto noJpda
+set JPDA=jpda
+if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport
+set JPDA_TRANSPORT=dt_socket
+:gotJpdaTransport
+if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress
+set JPDA_ADDRESS=localhost:8000
+:gotJpdaAddress
+if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend
+set JPDA_SUSPEND=n
+:gotJpdaSuspend
+if not "%JPDA_OPTS%" == "" goto gotJpdaOpts
+set JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%
+:gotJpdaOpts
+shift
+:noJpda
+
+if ""%1"" == ""debug"" goto doDebug
+if ""%1"" == ""run"" goto doRun
+if ""%1"" == ""start"" goto doStart
+if ""%1"" == ""stop"" goto doStop
+if ""%1"" == ""configtest"" goto doConfigTest
+if ""%1"" == ""version"" goto doVersion
+
+echo Usage: catalina ( commands ... )
+echo commands:
+echo debug Start Catalina in a debugger
+echo debug -security Debug Catalina with a security manager
+echo jpda start Start Catalina under JPDA debugger
+echo run Start Catalina in the current window
+echo run -security Start in the current window with security manager
+echo start Start Catalina in a separate window
+echo start -security Start in a separate window with security manager
+echo stop Stop Catalina
+echo configtest Run a basic syntax check on server.xml
+echo version What version of tomcat are you running?
+goto end
+
+:doDebug
+shift
+set _EXECJAVA=%_RUNJDB%
+set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%\..\..\java"
+if not ""%1"" == ""-security"" goto execCmd
+shift
+echo Using Security Manager
+set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
+goto execCmd
+
+:doRun
+shift
+if not ""%1"" == ""-security"" goto execCmd
+shift
+echo Using Security Manager
+set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
+goto execCmd
+
+:doStart
+shift
+if "%TITLE%" == "" set TITLE=Tomcat
+set _EXECJAVA=start "%TITLE%" %_RUNJAVA%
+if not ""%1"" == ""-security"" goto execCmd
+shift
+echo Using Security Manager
+set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
+goto execCmd
+
+:doStop
+shift
+set ACTION=stop
+set CATALINA_OPTS=
+goto execCmd
+
+:doConfigTest
+shift
+set ACTION=configtest
+set CATALINA_OPTS=
+goto execCmd
+
+:doVersion
+%_EXECJAVA% -classpath "%CATALINA_HOME%\lib\catalina.jar" org.apache.catalina.util.ServerInfo
+goto end
+
+
+:execCmd
+rem Get remaining unshifted command line arguments and save them in the
+set CMD_LINE_ARGS=
+:setArgs
+if ""%1""=="""" goto doneSetArgs
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto setArgs
+:doneSetArgs
+
+rem Execute Java with the applicable properties
+if not "%JPDA%" == "" goto doJpda
+if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
+%_EXECJAVA% %CATALINA_LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
+goto end
+:doSecurity
+%_EXECJAVA% %CATALINA_LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
+goto end
+:doJpda
+if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda
+%_EXECJAVA% %CATALINA_LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
+goto end
+:doSecurityJpda
+%_EXECJAVA% %CATALINA_LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
+goto end
+
+:end
diff --git a/web/tomcat/bin/catalina.sh b/web/tomcat/bin/catalina.sh
new file mode 100644
index 0000000..d738853
--- /dev/null
+++ b/web/tomcat/bin/catalina.sh
@@ -0,0 +1,688 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Control Script for the CATALINA Server
+#
+# For supported commands call "catalina.sh help" or see the usage section at
+# the end of this file.
+#
+# Environment Variable Prerequisites
+#
+# Do not set the variables in this script. Instead put them into a script
+# setenv.sh in CATALINA_BASE/bin to keep your customizations separate.
+#
+# CATALINA_HOME May point at your Catalina "build" directory.
+#
+# CATALINA_BASE (Optional) Base directory for resolving dynamic portions
+# of a Catalina installation. If not present, resolves to
+# the same directory that CATALINA_HOME points to.
+#
+# CATALINA_OUT (Optional) Full path to a file where stdout and stderr
+# will be redirected.
+# Default is $CATALINA_BASE/logs/catalina.out
+#
+# CATALINA_OUT_CMD (Optional) Command which will be executed and receive
+# as its stdin the stdout and stderr from the Tomcat java
+# process. If CATALINA_OUT_CMD is set, the value of
+# CATALINA_OUT will be used as a named pipe.
+# No default.
+# Example (all one line)
+# CATALINA_OUT_CMD="/usr/bin/rotatelogs -f $CATALINA_BASE/logs/catalina.out.%Y-%m-%d.log 86400"
+#
+# CATALINA_OPTS (Optional) Java runtime options used when the "start",
+# "run" or "debug" command is executed.
+# Include here and not in JAVA_OPTS all options, that should
+# only be used by Tomcat itself, not by the stop process,
+# the version command etc.
+# Examples are heap size, GC logging, JMX ports etc.
+#
+# CATALINA_TMPDIR (Optional) Directory path location of temporary directory
+# the JVM should use (java.io.tmpdir). Defaults to
+# $CATALINA_BASE/temp.
+#
+# JAVA_HOME Must point at your Java Development Kit installation.
+# Required to run the with the "debug" argument.
+#
+# JRE_HOME Must point at your Java Runtime installation.
+# Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME
+# are both set, JRE_HOME is used.
+#
+# JAVA_OPTS (Optional) Java runtime options used when any command
+# is executed.
+# Include here and not in CATALINA_OPTS all options, that
+# should be used by Tomcat and also by the stop process,
+# the version command etc.
+# Most options should go into CATALINA_OPTS.
+#
+# JAVA_ENDORSED_DIRS (Optional) Lists of of colon separated directories
+# containing some jars in order to allow replacement of APIs
+# created outside of the JCP (i.e. DOM and SAX from W3C).
+# It can also be used to update the XML parser implementation.
+# This is only supported for Java <= 8.
+# Defaults to $CATALINA_HOME/endorsed.
+#
+# JPDA_TRANSPORT (Optional) JPDA transport used when the "jpda start"
+# command is executed. The default is "dt_socket".
+#
+# JPDA_ADDRESS (Optional) Java runtime options used when the "jpda start"
+# command is executed. The default is localhost:8000.
+#
+# JPDA_SUSPEND (Optional) Java runtime options used when the "jpda start"
+# command is executed. Specifies whether JVM should suspend
+# execution immediately after startup. Default is "n".
+#
+# JPDA_OPTS (Optional) Java runtime options used when the "jpda start"
+# command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS,
+# and JPDA_SUSPEND are ignored. Thus, all required jpda
+# options MUST be specified. The default is:
+#
+# -agentlib:jdwp=transport=$JPDA_TRANSPORT,
+# address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND
+#
+# JSSE_OPTS (Optional) Java runtime options used to control the TLS
+# implementation when JSSE is used. Default is:
+# "-Djdk.tls.ephemeralDHKeySize=2048"
+#
+# CATALINA_PID (Optional) Path of the file which should contains the pid
+# of the catalina startup java process, when start (fork) is
+# used
+#
+# CATALINA_LOGGING_CONFIG (Optional) Override Tomcat's logging config file
+# Example (all one line)
+# CATALINA_LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
+#
+# LOGGING_CONFIG Deprecated
+# Use CATALINA_LOGGING_CONFIG
+# This is only used if CATALINA_LOGGING_CONFIG is not set
+# and LOGGING_CONFIG starts with "-D..."
+#
+# LOGGING_MANAGER (Optional) Override Tomcat's logging manager
+# Example (all one line)
+# LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
+#
+# UMASK (Optional) Override Tomcat's default UMASK of 0027
+#
+# USE_NOHUP (Optional) If set to the string true the start command will
+# use nohup so that the Tomcat process will ignore any hangup
+# signals. Default is "false" unless running on HP-UX in which
+# case the default is "true"
+# -----------------------------------------------------------------------------
+
+# OS specific support. $var _must_ be set to either true or false.
+cygwin=false
+darwin=false
+os400=false
+hpux=false
+case "`uname`" in
+CYGWIN*) cygwin=true;;
+Darwin*) darwin=true;;
+OS400*) os400=true;;
+HP-UX*) hpux=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ]; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`/"$link"
+ fi
+done
+
+# Get standard environment variables
+PRGDIR=`dirname "$PRG"`
+
+# Only set CATALINA_HOME if not already set
+[ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd`
+
+# Copy CATALINA_BASE from CATALINA_HOME if not already set
+[ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME"
+
+# Ensure that any user defined CLASSPATH variables are not used on startup,
+# but allow them to be specified in setenv.sh, in rare case when it is needed.
+CLASSPATH=
+
+if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
+ . "$CATALINA_BASE/bin/setenv.sh"
+elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
+ . "$CATALINA_HOME/bin/setenv.sh"
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+ [ -n "$JRE_HOME" ] && JRE_HOME=`cygpath --unix "$JRE_HOME"`
+ [ -n "$CATALINA_HOME" ] && CATALINA_HOME=`cygpath --unix "$CATALINA_HOME"`
+ [ -n "$CATALINA_BASE" ] && CATALINA_BASE=`cygpath --unix "$CATALINA_BASE"`
+ [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# Ensure that neither CATALINA_HOME nor CATALINA_BASE contains a colon
+# as this is used as the separator in the classpath and Java provides no
+# mechanism for escaping if the same character appears in the path.
+case $CATALINA_HOME in
+ *:*) echo "Using CATALINA_HOME: $CATALINA_HOME";
+ echo "Unable to start as CATALINA_HOME contains a colon (:) character";
+ exit 1;
+esac
+case $CATALINA_BASE in
+ *:*) echo "Using CATALINA_BASE: $CATALINA_BASE";
+ echo "Unable to start as CATALINA_BASE contains a colon (:) character";
+ exit 1;
+esac
+
+# For OS400
+if $os400; then
+ # Set job priority to standard for interactive (interactive - 6) by using
+ # the interactive priority - 6, the helper threads that respond to requests
+ # will be running at the same priority as interactive jobs.
+ COMMAND='chgjob job('$JOBNAME') runpty(6)'
+ system $COMMAND
+
+ # Enable multi threading
+ export QIBM_MULTI_THREADED=Y
+fi
+
+# Get standard Java environment variables
+if $os400; then
+ # -r will Only work on the os400 if the files are:
+ # 1. owned by the user
+ # 2. owned by the PRIMARY group of the user
+ # this will not work if the user belongs in secondary groups
+ . "$CATALINA_HOME"/bin/setclasspath.sh
+else
+ if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then
+ . "$CATALINA_HOME"/bin/setclasspath.sh
+ else
+ echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh"
+ echo "This file is needed to run this program"
+ exit 1
+ fi
+fi
+
+# Add on extra jar files to CLASSPATH
+if [ ! -z "$CLASSPATH" ] ; then
+ CLASSPATH="$CLASSPATH":
+fi
+CLASSPATH="$CLASSPATH""$CATALINA_HOME"/bin/bootstrap.jar
+
+if [ -z "$CATALINA_OUT" ] ; then
+ CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
+fi
+
+if [ -z "$CATALINA_TMPDIR" ] ; then
+ # Define the java.io.tmpdir to use for Catalina
+ CATALINA_TMPDIR="$CATALINA_BASE"/temp
+fi
+
+# Add tomcat-juli.jar to classpath
+# tomcat-juli.jar can be over-ridden per instance
+if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then
+ CLASSPATH=$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar
+else
+ CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar
+fi
+
+# Bugzilla 37848: When no TTY is available, don't output to console
+have_tty=0
+if [ -t 0 ]; then
+ have_tty=1
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+ JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"`
+ JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"`
+ CATALINA_HOME=`cygpath --absolute --windows "$CATALINA_HOME"`
+ CATALINA_BASE=`cygpath --absolute --windows "$CATALINA_BASE"`
+ CATALINA_TMPDIR=`cygpath --absolute --windows "$CATALINA_TMPDIR"`
+ CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+ [ -n "$JAVA_ENDORSED_DIRS" ] && JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"`
+fi
+
+if [ -z "$JSSE_OPTS" ] ; then
+ JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
+fi
+JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS"
+
+# Register custom URL handlers
+# Do this here so custom URL handles (specifically 'war:...') can be used in the security policy
+JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"
+
+# Check for the deprecated LOGGING_CONFIG
+# Only use it if CATALINA_LOGGING_CONFIG is not set and LOGGING_CONFIG starts with "-D..."
+if [ -z "$CATALINA_LOGGING_CONFIG" ]; then
+ case $LOGGING_CONFIG in
+ -D*) CATALINA_LOGGING_CONFIG="$LOGGING_CONFIG"
+ esac
+fi
+
+# Set juli LogManager config file if it is present and an override has not been issued
+if [ -z "$CATALINA_LOGGING_CONFIG" ]; then
+ if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then
+ CATALINA_LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
+ else
+ # Bugzilla 45585
+ CATALINA_LOGGING_CONFIG="-Dnop"
+ fi
+fi
+
+if [ -z "$LOGGING_MANAGER" ]; then
+ LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
+fi
+
+# Set UMASK unless it has been overridden
+if [ -z "$UMASK" ]; then
+ UMASK="0027"
+fi
+umask $UMASK
+
+# Java 9 no longer supports the java.endorsed.dirs
+# system property. Only try to use it if
+# JAVA_ENDORSED_DIRS was explicitly set
+# or CATALINA_HOME/endorsed exists.
+ENDORSED_PROP=ignore.endorsed.dirs
+if [ -n "$JAVA_ENDORSED_DIRS" ]; then
+ ENDORSED_PROP=java.endorsed.dirs
+fi
+if [ -d "$CATALINA_HOME/endorsed" ]; then
+ ENDORSED_PROP=java.endorsed.dirs
+fi
+
+# Make the umask available when using the org.apache.catalina.security.SecurityListener
+JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"
+
+if [ -z "$USE_NOHUP" ]; then
+ if $hpux; then
+ USE_NOHUP="true"
+ else
+ USE_NOHUP="false"
+ fi
+fi
+unset _NOHUP
+if [ "$USE_NOHUP" = "true" ]; then
+ _NOHUP="nohup"
+fi
+
+# Add the JAVA 9 specific start-up parameters required by Tomcat
+JDK_JAVA_OPTIONS="$JDK_JAVA_OPTIONS --add-opens=java.base/java.lang=ALL-UNNAMED"
+JDK_JAVA_OPTIONS="$JDK_JAVA_OPTIONS --add-opens=java.base/java.io=ALL-UNNAMED"
+JDK_JAVA_OPTIONS="$JDK_JAVA_OPTIONS --add-opens=java.base/java.util=ALL-UNNAMED"
+JDK_JAVA_OPTIONS="$JDK_JAVA_OPTIONS --add-opens=java.base/java.util.concurrent=ALL-UNNAMED"
+JDK_JAVA_OPTIONS="$JDK_JAVA_OPTIONS --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED"
+export JDK_JAVA_OPTIONS
+
+# ----- Execute The Requested Command -----------------------------------------
+
+# Bugzilla 37848: only output this if we have a TTY
+if [ $have_tty -eq 1 ]; then
+ echo "Using CATALINA_BASE: $CATALINA_BASE"
+ echo "Using CATALINA_HOME: $CATALINA_HOME"
+ echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR"
+ if [ "$1" = "debug" ] ; then
+ echo "Using JAVA_HOME: $JAVA_HOME"
+ else
+ echo "Using JRE_HOME: $JRE_HOME"
+ fi
+ echo "Using CLASSPATH: $CLASSPATH"
+ echo "Using CATALINA_OPTS: $CATALINA_OPTS"
+ if [ ! -z "$CATALINA_PID" ]; then
+ echo "Using CATALINA_PID: $CATALINA_PID"
+ fi
+fi
+
+if [ "$1" = "jpda" ] ; then
+ if [ -z "$JPDA_TRANSPORT" ]; then
+ JPDA_TRANSPORT="dt_socket"
+ fi
+ if [ -z "$JPDA_ADDRESS" ]; then
+ JPDA_ADDRESS="localhost:8000"
+ fi
+ if [ -z "$JPDA_SUSPEND" ]; then
+ JPDA_SUSPEND="n"
+ fi
+ if [ -z "$JPDA_OPTS" ]; then
+ JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
+ fi
+ CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS"
+ shift
+fi
+
+if [ "$1" = "debug" ] ; then
+ if $os400; then
+ echo "Debug command not available on OS400"
+ exit 1
+ else
+ shift
+ if [ "$1" = "-security" ] ; then
+ if [ $have_tty -eq 1 ]; then
+ echo "Using Security Manager"
+ fi
+ shift
+ eval exec "\"$_RUNJDB\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
+ -D$ENDORSED_PROP="$JAVA_ENDORSED_DIRS" \
+ -classpath "$CLASSPATH" \
+ -sourcepath "$CATALINA_HOME"/../../java \
+ -Djava.security.manager \
+ -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
+ -Dcatalina.base="$CATALINA_BASE" \
+ -Dcatalina.home="$CATALINA_HOME" \
+ -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+ org.apache.catalina.startup.Bootstrap "$@" start
+ else
+ eval exec "\"$_RUNJDB\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
+ -D$ENDORSED_PROP="$JAVA_ENDORSED_DIRS" \
+ -classpath "$CLASSPATH" \
+ -sourcepath "$CATALINA_HOME"/../../java \
+ -Dcatalina.base="$CATALINA_BASE" \
+ -Dcatalina.home="$CATALINA_HOME" \
+ -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+ org.apache.catalina.startup.Bootstrap "$@" start
+ fi
+ fi
+
+elif [ "$1" = "run" ]; then
+
+ shift
+ if [ "$1" = "-security" ] ; then
+ if [ $have_tty -eq 1 ]; then
+ echo "Using Security Manager"
+ fi
+ shift
+ eval exec "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
+ -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
+ -classpath "\"$CLASSPATH\"" \
+ -Djava.security.manager \
+ -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
+ -Dcatalina.base="\"$CATALINA_BASE\"" \
+ -Dcatalina.home="\"$CATALINA_HOME\"" \
+ -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
+ org.apache.catalina.startup.Bootstrap "$@" start
+ else
+ eval exec "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
+ -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
+ -classpath "\"$CLASSPATH\"" \
+ -Dcatalina.base="\"$CATALINA_BASE\"" \
+ -Dcatalina.home="\"$CATALINA_HOME\"" \
+ -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
+ org.apache.catalina.startup.Bootstrap "$@" start
+ fi
+
+elif [ "$1" = "start" ] ; then
+
+ if [ ! -z "$CATALINA_PID" ]; then
+ if [ -f "$CATALINA_PID" ]; then
+ if [ -s "$CATALINA_PID" ]; then
+ echo "Existing PID file found during start."
+ if [ -r "$CATALINA_PID" ]; then
+ PID=`cat "$CATALINA_PID"`
+ ps -p $PID >/dev/null 2>&1
+ if [ $? -eq 0 ] ; then
+ echo "Tomcat appears to still be running with PID $PID. Start aborted."
+ echo "If the following process is not a Tomcat process, remove the PID file and try again:"
+ ps -f -p $PID
+ exit 1
+ else
+ echo "Removing/clearing stale PID file."
+ rm -f "$CATALINA_PID" >/dev/null 2>&1
+ if [ $? != 0 ]; then
+ if [ -w "$CATALINA_PID" ]; then
+ cat /dev/null > "$CATALINA_PID"
+ else
+ echo "Unable to remove or clear stale PID file. Start aborted."
+ exit 1
+ fi
+ fi
+ fi
+ else
+ echo "Unable to read PID file. Start aborted."
+ exit 1
+ fi
+ else
+ rm -f "$CATALINA_PID" >/dev/null 2>&1
+ if [ $? != 0 ]; then
+ if [ ! -w "$CATALINA_PID" ]; then
+ echo "Unable to remove or write to empty PID file. Start aborted."
+ exit 1
+ fi
+ fi
+ fi
+ fi
+ fi
+
+ shift
+ if [ -z "$CATALINA_OUT_CMD" ] ; then
+ touch "$CATALINA_OUT"
+ else
+ if [ ! -e "$CATALINA_OUT" ]; then
+ if ! mkfifo "$CATALINA_OUT"; then
+ echo "cannot create named pipe $CATALINA_OUT. Start aborted."
+ exit 1
+ fi
+ elif [ ! -p "$CATALINA_OUT" ]; then
+ echo "$CATALINA_OUT exists and is not a named pipe. Start aborted."
+ exit 1
+ fi
+ $CATALINA_OUT_CMD <"$CATALINA_OUT" &
+ fi
+ if [ "$1" = "-security" ] ; then
+ if [ $have_tty -eq 1 ]; then
+ echo "Using Security Manager"
+ fi
+ shift
+ eval $_NOHUP "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
+ -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
+ -classpath "\"$CLASSPATH\"" \
+ -Djava.security.manager \
+ -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
+ -Dcatalina.base="\"$CATALINA_BASE\"" \
+ -Dcatalina.home="\"$CATALINA_HOME\"" \
+ -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
+ org.apache.catalina.startup.Bootstrap "$@" start \
+ >> "$CATALINA_OUT" 2>&1 "&"
+
+ else
+ eval $_NOHUP "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
+ -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
+ -classpath "\"$CLASSPATH\"" \
+ -Dcatalina.base="\"$CATALINA_BASE\"" \
+ -Dcatalina.home="\"$CATALINA_HOME\"" \
+ -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
+ org.apache.catalina.startup.Bootstrap "$@" start \
+ >> "$CATALINA_OUT" 2>&1 "&"
+
+ fi
+
+ if [ ! -z "$CATALINA_PID" ]; then
+ echo $! > "$CATALINA_PID"
+ fi
+
+ echo "Tomcat started."
+
+elif [ "$1" = "stop" ] ; then
+
+ shift
+
+ SLEEP=5
+ if [ ! -z "$1" ]; then
+ echo $1 | grep "[^0-9]" >/dev/null 2>&1
+ if [ $? -gt 0 ]; then
+ SLEEP=$1
+ shift
+ fi
+ fi
+
+ FORCE=0
+ if [ "$1" = "-force" ]; then
+ shift
+ FORCE=1
+ fi
+
+ if [ ! -z "$CATALINA_PID" ]; then
+ if [ -f "$CATALINA_PID" ]; then
+ if [ -s "$CATALINA_PID" ]; then
+ kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1
+ if [ $? -gt 0 ]; then
+ echo "PID file found but either no matching process was found or the current user does not have permission to stop the process. Stop aborted."
+ exit 1
+ fi
+ else
+ echo "PID file is empty and has been ignored."
+ fi
+ else
+ echo "\$CATALINA_PID was set but the specified file does not exist. Is Tomcat running? Stop aborted."
+ exit 1
+ fi
+ fi
+
+ eval "\"$_RUNJAVA\"" $LOGGING_MANAGER "$JAVA_OPTS" \
+ -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
+ -classpath "\"$CLASSPATH\"" \
+ -Dcatalina.base="\"$CATALINA_BASE\"" \
+ -Dcatalina.home="\"$CATALINA_HOME\"" \
+ -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
+ org.apache.catalina.startup.Bootstrap "$@" stop
+
+ # stop failed. Shutdown port disabled? Try a normal kill.
+ if [ $? != 0 ]; then
+ if [ ! -z "$CATALINA_PID" ]; then
+ echo "The stop command failed. Attempting to signal the process to stop through OS signal."
+ kill -15 `cat "$CATALINA_PID"` >/dev/null 2>&1
+ fi
+ fi
+
+ if [ ! -z "$CATALINA_PID" ]; then
+ if [ -f "$CATALINA_PID" ]; then
+ while [ $SLEEP -ge 0 ]; do
+ kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1
+ if [ $? -gt 0 ]; then
+ rm -f "$CATALINA_PID" >/dev/null 2>&1
+ if [ $? != 0 ]; then
+ if [ -w "$CATALINA_PID" ]; then
+ cat /dev/null > "$CATALINA_PID"
+ # If Tomcat has stopped don't try and force a stop with an empty PID file
+ FORCE=0
+ else
+ echo "The PID file could not be removed or cleared."
+ fi
+ fi
+ echo "Tomcat stopped."
+ break
+ fi
+ if [ $SLEEP -gt 0 ]; then
+ sleep 1
+ fi
+ if [ $SLEEP -eq 0 ]; then
+ echo "Tomcat did not stop in time."
+ if [ $FORCE -eq 0 ]; then
+ echo "PID file was not removed."
+ fi
+ echo "To aid diagnostics a thread dump has been written to standard out."
+ kill -3 `cat "$CATALINA_PID"`
+ fi
+ SLEEP=`expr $SLEEP - 1 `
+ done
+ fi
+ fi
+
+ KILL_SLEEP_INTERVAL=5
+ if [ $FORCE -eq 1 ]; then
+ if [ -z "$CATALINA_PID" ]; then
+ echo "Kill failed: \$CATALINA_PID not set"
+ else
+ if [ -f "$CATALINA_PID" ]; then
+ PID=`cat "$CATALINA_PID"`
+ echo "Killing Tomcat with the PID: $PID"
+ kill -9 $PID
+ while [ $KILL_SLEEP_INTERVAL -ge 0 ]; do
+ kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1
+ if [ $? -gt 0 ]; then
+ rm -f "$CATALINA_PID" >/dev/null 2>&1
+ if [ $? != 0 ]; then
+ if [ -w "$CATALINA_PID" ]; then
+ cat /dev/null > "$CATALINA_PID"
+ else
+ echo "The PID file could not be removed."
+ fi
+ fi
+ echo "The Tomcat process has been killed."
+ break
+ fi
+ if [ $KILL_SLEEP_INTERVAL -gt 0 ]; then
+ sleep 1
+ fi
+ KILL_SLEEP_INTERVAL=`expr $KILL_SLEEP_INTERVAL - 1 `
+ done
+ if [ $KILL_SLEEP_INTERVAL -lt 0 ]; then
+ echo "Tomcat has not been killed completely yet. The process might be waiting on some system call or might be UNINTERRUPTIBLE."
+ fi
+ fi
+ fi
+ fi
+
+elif [ "$1" = "configtest" ] ; then
+
+ eval "\"$_RUNJAVA\"" $LOGGING_MANAGER "$JAVA_OPTS" \
+ -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
+ -classpath "\"$CLASSPATH\"" \
+ -Dcatalina.base="\"$CATALINA_BASE\"" \
+ -Dcatalina.home="\"$CATALINA_HOME\"" \
+ -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
+ org.apache.catalina.startup.Bootstrap configtest
+ result=$?
+ if [ $result -ne 0 ]; then
+ echo "Configuration error detected!"
+ fi
+ exit $result
+
+elif [ "$1" = "version" ] ; then
+
+ "$_RUNJAVA" \
+ -classpath "$CATALINA_HOME/lib/catalina.jar" \
+ org.apache.catalina.util.ServerInfo
+
+else
+
+ echo "Usage: catalina.sh ( commands ... )"
+ echo "commands:"
+ if $os400; then
+ echo " debug Start Catalina in a debugger (not available on OS400)"
+ echo " debug -security Debug Catalina with a security manager (not available on OS400)"
+ else
+ echo " debug Start Catalina in a debugger"
+ echo " debug -security Debug Catalina with a security manager"
+ fi
+ echo " jpda start Start Catalina under JPDA debugger"
+ echo " run Start Catalina in the current window"
+ echo " run -security Start in the current window with security manager"
+ echo " start Start Catalina in a separate window"
+ echo " start -security Start in a separate window with security manager"
+ echo " stop Stop Catalina, waiting up to 5 seconds for the process to end"
+ echo " stop n Stop Catalina, waiting up to n seconds for the process to end"
+ echo " stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running"
+ echo " stop n -force Stop Catalina, wait up to n seconds and then use kill -KILL if still running"
+ echo " configtest Run a basic syntax check on server.xml - check exit code for result"
+ echo " version What version of tomcat are you running?"
+ echo "Note: Waiting for the process to end and use of the -force option require that \$CATALINA_PID is defined"
+ exit 1
+
+fi
diff --git a/web/tomcat/bin/ciphers.bat b/web/tomcat/bin/ciphers.bat
new file mode 100644
index 0000000..914181b
--- /dev/null
+++ b/web/tomcat/bin/ciphers.bat
@@ -0,0 +1,58 @@
+@echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements. See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License. You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Script to digest password using the algorithm specified
+rem ---------------------------------------------------------------------------
+
+setlocal
+
+rem Guess CATALINA_HOME if not defined
+set "CURRENT_DIR=%cd%"
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%CURRENT_DIR%"
+if exist "%CATALINA_HOME%\bin\tool-wrapper.bat" goto okHome
+cd ..
+set "CATALINA_HOME=%cd%"
+cd "%CURRENT_DIR%"
+:gotHome
+if exist "%CATALINA_HOME%\bin\tool-wrapper.bat" goto okHome
+echo The CATALINA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+:okHome
+
+set "EXECUTABLE=%CATALINA_HOME%\bin\tool-wrapper.bat"
+
+rem Check that target executable exists
+if exist "%EXECUTABLE%" goto okExec
+echo Cannot find "%EXECUTABLE%"
+echo This file is needed to run this program
+goto end
+:okExec
+
+rem Get remaining unshifted command line arguments and save them in the
+set CMD_LINE_ARGS=
+:setArgs
+if ""%1""=="""" goto doneSetArgs
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto setArgs
+:doneSetArgs
+
+call "%EXECUTABLE%" org.apache.tomcat.util.net.openssl.ciphers.OpenSSLCipherConfigurationParser %CMD_LINE_ARGS%
+
+:end
diff --git a/web/tomcat/bin/ciphers.sh b/web/tomcat/bin/ciphers.sh
new file mode 100644
index 0000000..d4a87b5
--- /dev/null
+++ b/web/tomcat/bin/ciphers.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Script to digest password using the algorithm specified
+# -----------------------------------------------------------------------------
+
+# Better OS/400 detection: see Bugzilla 31132
+os400=false
+case "`uname`" in
+OS400*) os400=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`/"$link"
+ fi
+done
+
+PRGDIR=`dirname "$PRG"`
+EXECUTABLE=tool-wrapper.sh
+
+# Check that target executable exists
+if $os400; then
+ # -x will Only work on the os400 if the files are:
+ # 1. owned by the user
+ # 2. owned by the PRIMARY group of the user
+ # this will not work if the user belongs in secondary groups
+ eval
+else
+ if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
+ echo "Cannot find $PRGDIR/$EXECUTABLE"
+ echo "The file is absent or does not have execute permission"
+ echo "This file is needed to run this program"
+ exit 1
+ fi
+fi
+
+exec "$PRGDIR"/"$EXECUTABLE" org.apache.tomcat.util.net.openssl.ciphers.OpenSSLCipherConfigurationParser "$@"
diff --git a/web/tomcat/bin/commons-daemon.jar b/web/tomcat/bin/commons-daemon.jar
new file mode 100644
index 0000000..8a4bbcf
--- /dev/null
+++ b/web/tomcat/bin/commons-daemon.jar
Binary files differ
diff --git a/web/tomcat/bin/configtest.bat b/web/tomcat/bin/configtest.bat
new file mode 100644
index 0000000..c26b65d
--- /dev/null
+++ b/web/tomcat/bin/configtest.bat
@@ -0,0 +1,58 @@
+@echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements. See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License. You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Configuration test script for the CATALINA Server
+rem ---------------------------------------------------------------------------
+
+setlocal
+
+rem Guess CATALINA_HOME if not defined
+set "CURRENT_DIR=%cd%"
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%CURRENT_DIR%"
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+cd ..
+set "CATALINA_HOME=%cd%"
+cd "%CURRENT_DIR%"
+:gotHome
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+echo The CATALINA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+:okHome
+
+set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
+
+rem Check that target executable exists
+if exist "%EXECUTABLE%" goto okExec
+echo Cannot find "%EXECUTABLE%"
+echo This file is needed to run this program
+goto end
+:okExec
+
+rem Get remaining unshifted command line arguments and save them in the
+set CMD_LINE_ARGS=
+:setArgs
+if ""%1""=="""" goto doneSetArgs
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto setArgs
+:doneSetArgs
+
+call "%EXECUTABLE%" configtest %CMD_LINE_ARGS%
+
+:end
diff --git a/web/tomcat/bin/configtest.sh b/web/tomcat/bin/configtest.sh
new file mode 100644
index 0000000..9a8ebff
--- /dev/null
+++ b/web/tomcat/bin/configtest.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Configuration Test Script for the CATALINA Server
+# -----------------------------------------------------------------------------
+
+# Better OS/400 detection: see Bugzilla 31132
+os400=false
+case "`uname`" in
+OS400*) os400=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`/"$link"
+ fi
+done
+
+PRGDIR=`dirname "$PRG"`
+EXECUTABLE=catalina.sh
+
+# Check that target executable exists
+if $os400; then
+ # -x will Only work on the os400 if the files are:
+ # 1. owned by the user
+ # 2. owned by the PRIMARY group of the user
+ # this will not work if the user belongs in secondary groups
+ eval
+else
+ if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
+ echo "Cannot find $PRGDIR/$EXECUTABLE"
+ echo "The file is absent or does not have execute permission"
+ echo "This file is needed to run this program"
+ exit 1
+ fi
+fi
+
+exec "$PRGDIR"/"$EXECUTABLE" configtest "$@"
diff --git a/web/tomcat/bin/daemon.sh b/web/tomcat/bin/daemon.sh
new file mode 100644
index 0000000..014a350
--- /dev/null
+++ b/web/tomcat/bin/daemon.sh
@@ -0,0 +1,293 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# -----------------------------------------------------------------------------
+# Commons Daemon wrapper script.
+# -----------------------------------------------------------------------------
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ]; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`/"$link"
+ fi
+done
+
+DIRNAME="`dirname "$PRG"`"
+PROGRAM="`basename "$PRG"`"
+while [ ".$1" != . ]
+do
+ case "$1" in
+ --java-home )
+ JAVA_HOME="$2"
+ shift; shift;
+ continue
+ ;;
+ --catalina-home )
+ CATALINA_HOME="$2"
+ shift; shift;
+ continue
+ ;;
+ --catalina-base )
+ CATALINA_BASE="$2"
+ shift; shift;
+ continue
+ ;;
+ --catalina-pid )
+ CATALINA_PID="$2"
+ shift; shift;
+ continue
+ ;;
+ --tomcat-user )
+ TOMCAT_USER="$2"
+ shift; shift;
+ continue
+ ;;
+ --service-start-wait-time )
+ SERVICE_START_WAIT_TIME="$2"
+ shift; shift;
+ continue
+ ;;
+ * )
+ break
+ ;;
+ esac
+done
+# OS specific support (must be 'true' or 'false').
+cygwin=false;
+darwin=false;
+case "`uname`" in
+ CYGWIN*)
+ cygwin=true
+ ;;
+ Darwin*)
+ darwin=true
+ ;;
+esac
+
+# Use the maximum available, or set MAX_FD != -1 to use that
+test ".$MAX_FD" = . && MAX_FD="maximum"
+# Setup parameters for running the jsvc
+#
+test ".$TOMCAT_USER" = . && TOMCAT_USER=tomcat
+# Set JAVA_HOME to working JDK or JRE
+# If not set we'll try to guess the JAVA_HOME
+# from java binary if on the PATH
+#
+if [ -z "$JAVA_HOME" ]; then
+ JAVA_BIN="`which java 2>/dev/null || type java 2>&1`"
+ while [ -h "$JAVA_BIN" ]; do
+ ls=`ls -ld "$JAVA_BIN"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ JAVA_BIN="$link"
+ else
+ JAVA_BIN="`dirname "$JAVA_BIN"`/$link"
+ fi
+ done
+ test -x "$JAVA_BIN" && JAVA_HOME="`dirname "$JAVA_BIN"`"
+ test ".$JAVA_HOME" != . && JAVA_HOME=`cd "$JAVA_HOME/.." >/dev/null; pwd`
+else
+ JAVA_BIN="$JAVA_HOME/bin/java"
+fi
+
+# Only set CATALINA_HOME if not already set
+test ".$CATALINA_HOME" = . && CATALINA_HOME=`cd "$DIRNAME/.." >/dev/null; pwd`
+test ".$CATALINA_BASE" = . && CATALINA_BASE="$CATALINA_HOME"
+test ".$CATALINA_MAIN" = . && CATALINA_MAIN=org.apache.catalina.startup.Bootstrap
+# If not explicitly set, look for jsvc in CATALINA_BASE first then CATALINA_HOME
+if [ -z "$JSVC" ]; then
+ JSVC="$CATALINA_BASE/bin/jsvc"
+ if [ ! -x "$JSVC" ]; then
+ JSVC="$CATALINA_HOME/bin/jsvc"
+ fi
+fi
+# Set the default service-start wait time if necessary
+test ".$SERVICE_START_WAIT_TIME" = . && SERVICE_START_WAIT_TIME=10
+
+# Ensure that any user defined CLASSPATH variables are not used on startup,
+# but allow them to be specified in setenv.sh, in rare case when it is needed.
+CLASSPATH=
+JAVA_OPTS=
+if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
+ . "$CATALINA_BASE/bin/setenv.sh"
+elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
+ . "$CATALINA_HOME/bin/setenv.sh"
+fi
+
+# Add on extra jar files to CLASSPATH
+test ".$CLASSPATH" != . && CLASSPATH="$CLASSPATH:"
+CLASSPATH="$CLASSPATH$CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/commons-daemon.jar"
+
+test ".$CATALINA_OUT" = . && CATALINA_OUT="$CATALINA_BASE/logs/catalina-daemon.out"
+test ".$CATALINA_TMP" = . && CATALINA_TMP="$CATALINA_BASE/temp"
+
+# Add tomcat-juli.jar to classpath
+# tomcat-juli.jar can be over-ridden per instance
+if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then
+ CLASSPATH="$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar"
+else
+ CLASSPATH="$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar"
+fi
+
+# Check for the deprecated LOGGING_CONFIG
+# Only use it if CATALINA_LOGGING_CONFIG is not set and LOGGING_CONFIG starts with "-D..."
+if [ -z "$CATALINA_LOGGING_CONFIG" ]; then
+ case $LOGGING_CONFIG in
+ -D*) CATALINA_LOGGING_CONFIG="$LOGGING_CONFIG"
+ esac
+fi
+
+# Set juli LogManager config file if it is present and an override has not been issued
+if [ -z "$CATALINA_LOGGING_CONFIG" ]; then
+ if [ -r "$CATALINA_BASE/conf/logging.properties" ]; then
+ CATALINA_LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
+ else
+ # Bugzilla 45585
+ CATALINA_LOGGING_CONFIG="-Dnop"
+ fi
+fi
+
+test ".$LOGGING_MANAGER" = . && LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
+JAVA_OPTS="$JAVA_OPTS $LOGGING_MANAGER"
+
+# Set -pidfile
+test ".$CATALINA_PID" = . && CATALINA_PID="$CATALINA_BASE/logs/catalina-daemon.pid"
+
+# Increase the maximum file descriptors if we can
+if [ "$cygwin" = "false" ]; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ "$?" -eq 0 ]; then
+ # Darwin does not allow RLIMIT_INFINITY on file soft limit
+ if [ "$darwin" = "true" ] && [ "$MAX_FD_LIMIT" = "unlimited" ]; then
+ MAX_FD_LIMIT=`/usr/sbin/sysctl -n kern.maxfilesperproc`
+ fi
+ test ".$MAX_FD" = ".maximum" && MAX_FD="$MAX_FD_LIMIT"
+ ulimit -n $MAX_FD
+ if [ "$?" -ne 0 ]; then
+ echo "$PROGRAM: Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ echo "$PROGRAM: Could not query system maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# Set UMASK unless it has been overridden
+if [ -z "$UMASK" ]; then
+ UMASK="0027"
+fi
+umask $UMASK
+
+# Java 9 no longer supports the java.endorsed.dirs
+# system property. Only try to use it if
+# JAVA_ENDORSED_DIRS was explicitly set
+# or CATALINA_HOME/endorsed exists.
+ENDORSED_PROP=ignore.endorsed.dirs
+if [ -n "$JAVA_ENDORSED_DIRS" ]; then
+ ENDORSED_PROP=java.endorsed.dirs
+fi
+if [ -d "$CATALINA_HOME/endorsed" ]; then
+ ENDORSED_PROP=java.endorsed.dirs
+fi
+
+# ----- Execute The Requested Command -----------------------------------------
+case "$1" in
+ run )
+ shift
+ eval exec "\"$JSVC\"" $* \
+ "$JSVC_OPTS" \
+ -java-home "\"$JAVA_HOME\"" \
+ -pidfile "\"$CATALINA_PID\"" \
+ -wait $SERVICE_START_WAIT_TIME \
+ -umask $UMASK \
+ -nodetach \
+ -outfile "\"&1\"" \
+ -errfile "\"&2\"" \
+ -classpath "\"$CLASSPATH\"" \
+ "\"$CATALINA_LOGGING_CONFIG\"" "$JAVA_OPTS" "$CATALINA_OPTS" \
+ -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
+ -Dcatalina.base="\"$CATALINA_BASE\"" \
+ -Dcatalina.home="\"$CATALINA_HOME\"" \
+ -Djava.io.tmpdir="\"$CATALINA_TMP\"" \
+ $CATALINA_MAIN
+ exit $?
+ ;;
+ start )
+ eval "\"$JSVC\"" \
+ "$JSVC_OPTS" \
+ -java-home "\"$JAVA_HOME\"" \
+ -user $TOMCAT_USER \
+ -pidfile "\"$CATALINA_PID\"" \
+ -wait $SERVICE_START_WAIT_TIME \
+ -umask $UMASK \
+ -outfile "\"$CATALINA_OUT\"" \
+ -errfile "\"&1\"" \
+ -classpath "\"$CLASSPATH\"" \
+ "\"$CATALINA_LOGGING_CONFIG\"" "$JAVA_OPTS" "$CATALINA_OPTS" \
+ -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
+ -Dcatalina.base="\"$CATALINA_BASE\"" \
+ -Dcatalina.home="\"$CATALINA_HOME\"" \
+ -Djava.io.tmpdir="\"$CATALINA_TMP\"" \
+ $CATALINA_MAIN
+ exit $?
+ ;;
+ stop )
+ eval "\"$JSVC\"" \
+ "$JSVC_OPTS" \
+ -stop \
+ -pidfile "\"$CATALINA_PID\"" \
+ -classpath "\"$CLASSPATH\"" \
+ -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
+ -Dcatalina.base="\"$CATALINA_BASE\"" \
+ -Dcatalina.home="\"$CATALINA_HOME\"" \
+ -Djava.io.tmpdir="\"$CATALINA_TMP\"" \
+ $CATALINA_MAIN
+ exit $?
+ ;;
+ version )
+ "$JSVC" \
+ -java-home "$JAVA_HOME" \
+ -pidfile "$CATALINA_PID" \
+ -classpath "$CLASSPATH" \
+ -errfile "&2" \
+ -version \
+ -check \
+ $CATALINA_MAIN
+ if [ "$?" = 0 ]; then
+ "$JAVA_BIN" \
+ -classpath "$CATALINA_HOME/lib/catalina.jar" \
+ org.apache.catalina.util.ServerInfo
+ fi
+ exit $?
+ ;;
+ * )
+ echo "Unknown command: '$1'"
+ echo "Usage: $PROGRAM ( commands ... )"
+ echo "commands:"
+ echo " run Start Tomcat without detaching from console"
+ echo " start Start Tomcat"
+ echo " stop Stop Tomcat"
+ echo " version What version of commons daemon and Tomcat"
+ echo " are you running?"
+ exit 1
+ ;;
+esac
diff --git a/web/tomcat/bin/digest.bat b/web/tomcat/bin/digest.bat
new file mode 100644
index 0000000..2c1ffae
--- /dev/null
+++ b/web/tomcat/bin/digest.bat
@@ -0,0 +1,58 @@
+@echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements. See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License. You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Script to digest password using the algorithm specified
+rem ---------------------------------------------------------------------------
+
+setlocal
+
+rem Guess CATALINA_HOME if not defined
+set "CURRENT_DIR=%cd%"
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%CURRENT_DIR%"
+if exist "%CATALINA_HOME%\bin\tool-wrapper.bat" goto okHome
+cd ..
+set "CATALINA_HOME=%cd%"
+cd "%CURRENT_DIR%"
+:gotHome
+if exist "%CATALINA_HOME%\bin\tool-wrapper.bat" goto okHome
+echo The CATALINA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+:okHome
+
+set "EXECUTABLE=%CATALINA_HOME%\bin\tool-wrapper.bat"
+
+rem Check that target executable exists
+if exist "%EXECUTABLE%" goto okExec
+echo Cannot find "%EXECUTABLE%"
+echo This file is needed to run this program
+goto end
+:okExec
+
+rem Get remaining unshifted command line arguments and save them in the
+set CMD_LINE_ARGS=
+:setArgs
+if ""%1""=="""" goto doneSetArgs
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto setArgs
+:doneSetArgs
+
+call "%EXECUTABLE%" -server org.apache.catalina.realm.RealmBase %CMD_LINE_ARGS%
+
+:end
diff --git a/web/tomcat/bin/digest.sh b/web/tomcat/bin/digest.sh
new file mode 100644
index 0000000..62ed5d0
--- /dev/null
+++ b/web/tomcat/bin/digest.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Script to digest password using the algorithm specified
+# -----------------------------------------------------------------------------
+
+# Better OS/400 detection: see Bugzilla 31132
+os400=false
+case "`uname`" in
+OS400*) os400=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`/"$link"
+ fi
+done
+
+PRGDIR=`dirname "$PRG"`
+EXECUTABLE=tool-wrapper.sh
+
+# Check that target executable exists
+if $os400; then
+ # -x will Only work on the os400 if the files are:
+ # 1. owned by the user
+ # 2. owned by the PRIMARY group of the user
+ # this will not work if the user belongs in secondary groups
+ eval
+else
+ if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
+ echo "Cannot find $PRGDIR/$EXECUTABLE"
+ echo "The file is absent or does not have execute permission"
+ echo "This file is needed to run this program"
+ exit 1
+ fi
+fi
+
+exec "$PRGDIR"/"$EXECUTABLE" -server org.apache.catalina.realm.RealmBase "$@"
diff --git a/web/tomcat/bin/service.bat b/web/tomcat/bin/service.bat
new file mode 100644
index 0000000..31f6e37
--- /dev/null
+++ b/web/tomcat/bin/service.bat
@@ -0,0 +1,238 @@
+@echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements. See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License. You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem NT Service Install/Uninstall script
+rem
+rem Usage: service.bat install/remove [service_name [--rename]] [--user username]
+rem
+rem Options
+rem install Install the service using default settings.
+rem remove Remove the service from the system.
+rem
+rem service_name (optional) The name to use for the service. If not specified,
+rem Tomcat8 is used as the service name.
+rem
+rem --rename (optional) Rename tomcat8.exe and tomcat8w.exe to match
+rem the non-default service name.
+rem
+rem username (optional) The name of the OS user to use to install/remove
+rem the service (not the name of the OS user the
+rem service will run as). If not specified, the current
+rem user is used.
+rem ---------------------------------------------------------------------------
+
+setlocal
+
+set "SELF=%~dp0%service.bat"
+
+set DEFAULT_SERVICE_NAME=Tomcat8
+set SERVICE_NAME=%DEFAULT_SERVICE_NAME%
+
+set "CURRENT_DIR=%cd%"
+
+rem Parse the arguments
+if "x%1x" == "xx" goto displayUsage
+set SERVICE_CMD=%1
+shift
+if "x%1x" == "xx" goto checkEnv
+:checkUser
+if "x%1x" == "x/userx" goto runAsUser
+if "x%1x" == "x--userx" goto runAsUser
+set SERVICE_NAME=%1
+shift
+if "x%1x" == "xx" goto checkEnv
+if "x%1x" == "x--renamex" (
+ set RENAME=%1
+ shift
+)
+if "x%1x" == "xx" goto checkEnv
+goto checkUser
+:runAsUser
+shift
+if "x%1x" == "xx" goto displayUsage
+set SERVICE_USER=%1
+shift
+runas /env /savecred /user:%SERVICE_USER% "%COMSPEC% /K \"%SELF%\" %SERVICE_CMD% %SERVICE_NAME%"
+exit /b 0
+
+rem Check the environment
+:checkEnv
+
+rem Guess CATALINA_HOME if not defined
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%cd%"
+if exist "%CATALINA_HOME%\bin\%DEFAULT_SERVICE_NAME%.exe" goto gotHome
+if exist "%CATALINA_HOME%\bin\%SERVICE_NAME%.exe" goto gotHome
+rem CD to the upper dir
+cd ..
+set "CATALINA_HOME=%cd%"
+:gotHome
+if exist "%CATALINA_HOME%\bin\%DEFAULT_SERVICE_NAME%.exe" (
+ set "EXECUTABLE=%CATALINA_HOME%\bin\%DEFAULT_SERVICE_NAME%.exe"
+ goto okHome
+)
+if exist "%CATALINA_HOME%\bin\%SERVICE_NAME%.exe" (
+ set "EXECUTABLE=%CATALINA_HOME%\bin\%SERVICE_NAME%.exe"
+ goto okHome
+)
+if "%DEFAULT_SERVICE_NAME%"== "%SERVICE_NAME%" (
+ echo The file %DEFAULT_SERVICE_NAME%.exe was not found...
+) else (
+ echo Neither the %DEFAULT_SERVICE_NAME%.exe file nor the %SERVICE_NAME%.exe file was found...
+)
+echo Either the CATALINA_HOME environment variable is not defined correctly or
+echo the incorrect service name has been used.
+echo Both the CATALINA_HOME environment variable and the correct service name
+echo are required to run this program.
+exit /b 1
+:okHome
+cd "%CURRENT_DIR%"
+
+rem Make sure prerequisite environment variables are set
+if not "%JAVA_HOME%" == "" goto gotJdkHome
+if not "%JRE_HOME%" == "" goto gotJreHome
+echo Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
+echo Service will try to guess them from the registry.
+goto okJavaHome
+:gotJreHome
+if not exist "%JRE_HOME%\bin\java.exe" goto noJavaHome
+goto okJavaHome
+:gotJdkHome
+if not exist "%JAVA_HOME%\bin\javac.exe" goto noJavaHome
+rem Java 9 has a different directory structure
+if exist "%JAVA_HOME%\jre\bin\java.exe" goto preJava9Layout
+if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome
+if not "%JRE_HOME%" == "" goto okJavaHome
+set "JRE_HOME=%JAVA_HOME%"
+goto okJavaHome
+:preJava9Layout
+if not "%JRE_HOME%" == "" goto okJavaHome
+set "JRE_HOME=%JAVA_HOME%\jre"
+goto okJavaHome
+:noJavaHome
+echo The JAVA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+echo NB: JAVA_HOME should point to a JDK not a JRE
+exit /b 1
+:okJavaHome
+if not "%CATALINA_BASE%" == "" goto gotBase
+set "CATALINA_BASE=%CATALINA_HOME%"
+:gotBase
+
+rem Java 9 no longer supports the java.endorsed.dirs
+rem system property. Only try to use it if
+rem JAVA_ENDORSED_DIRS was explicitly set
+rem or CATALINA_HOME/endorsed exists.
+set ENDORSED_PROP=ignore.endorsed.dirs
+if "%JAVA_ENDORSED_DIRS%" == "" goto noEndorsedVar
+set ENDORSED_PROP=java.endorsed.dirs
+goto doneEndorsed
+:noEndorsedVar
+if not exist "%CATALINA_HOME%\endorsed" goto doneEndorsed
+set ENDORSED_PROP=java.endorsed.dirs
+:doneEndorsed
+
+rem Process the requested command
+if /i %SERVICE_CMD% == install goto doInstall
+if /i %SERVICE_CMD% == remove goto doRemove
+if /i %SERVICE_CMD% == uninstall goto doRemove
+echo Unknown parameter "%SERVICE_CMD%"
+:displayUsage
+echo.
+echo Usage: service.bat install/remove [service_name [--rename]] [--user username]
+exit /b 1
+
+:doRemove
+rem Remove the service
+echo Removing the service '%SERVICE_NAME%' ...
+echo Using CATALINA_BASE: "%CATALINA_BASE%"
+
+"%EXECUTABLE%" //DS//%SERVICE_NAME% ^
+ --LogPath "%CATALINA_BASE%\logs"
+if not errorlevel 1 goto removed
+echo Failed removing '%SERVICE_NAME%' service
+exit /b 1
+:removed
+echo The service '%SERVICE_NAME%' has been removed
+if exist "%CATALINA_HOME%\bin\%SERVICE_NAME%.exe" (
+ rename "%SERVICE_NAME%.exe" "%DEFAULT_SERVICE_NAME%.exe"
+ rename "%SERVICE_NAME%w.exe" "%DEFAULT_SERVICE_NAME%w.exe"
+)
+exit /b 0
+
+:doInstall
+rem Install the service
+echo Installing the service '%SERVICE_NAME%' ...
+echo Using CATALINA_HOME: "%CATALINA_HOME%"
+echo Using CATALINA_BASE: "%CATALINA_BASE%"
+echo Using JAVA_HOME: "%JAVA_HOME%"
+echo Using JRE_HOME: "%JRE_HOME%"
+
+rem Try to use the server jvm
+set "JVM=%JRE_HOME%\bin\server\jvm.dll"
+if exist "%JVM%" goto foundJvm
+rem Try to use the client jvm
+set "JVM=%JRE_HOME%\bin\client\jvm.dll"
+if exist "%JVM%" goto foundJvm
+echo Warning: Neither 'server' nor 'client' jvm.dll was found at JRE_HOME.
+set JVM=auto
+:foundJvm
+echo Using JVM: "%JVM%"
+
+set "CLASSPATH=%CATALINA_HOME%\bin\bootstrap.jar;%CATALINA_BASE%\bin\tomcat-juli.jar"
+if not "%CATALINA_HOME%" == "%CATALINA_BASE%" set "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\tomcat-juli.jar"
+
+if "%SERVICE_STARTUP_MODE%" == "" set SERVICE_STARTUP_MODE=manual
+if "%JvmMs%" == "" set JvmMs=128
+if "%JvmMx%" == "" set JvmMx=256
+
+if exist "%CATALINA_HOME%\bin\%DEFAULT_SERVICE_NAME%.exe" (
+ if "x%RENAME%x" == "x--renamex" (
+ rename "%DEFAULT_SERVICE_NAME%.exe" "%SERVICE_NAME%.exe"
+ rename "%DEFAULT_SERVICE_NAME%w.exe" "%SERVICE_NAME%w.exe"
+ set "EXECUTABLE=%CATALINA_HOME%\bin\%SERVICE_NAME%.exe"
+ )
+)
+
+"%EXECUTABLE%" //IS//%SERVICE_NAME% ^
+ --Description "Apache Tomcat 8.5.73 Server - https://tomcat.apache.org/" ^
+ --DisplayName "Apache Tomcat 8.5 %SERVICE_NAME%" ^
+ --Install "%EXECUTABLE%" ^
+ --LogPath "%CATALINA_BASE%\logs" ^
+ --StdOutput auto ^
+ --StdError auto ^
+ --Classpath "%CLASSPATH%" ^
+ --Jvm "%JVM%" ^
+ --StartMode jvm ^
+ --StopMode jvm ^
+ --StartPath "%CATALINA_HOME%" ^
+ --StopPath "%CATALINA_HOME%" ^
+ --StartClass org.apache.catalina.startup.Bootstrap ^
+ --StopClass org.apache.catalina.startup.Bootstrap ^
+ --StartParams start ^
+ --StopParams stop ^
+ --JvmOptions "-Dcatalina.home=%CATALINA_HOME%;-Dcatalina.base=%CATALINA_BASE%;-D%ENDORSED_PROP%=%CATALINA_HOME%\endorsed;-Djava.io.tmpdir=%CATALINA_BASE%\temp;-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager;-Djava.util.logging.config.file=%CATALINA_BASE%\conf\logging.properties;%JvmArgs%" ^
+ --JvmOptions9 "--add-opens=java.base/java.lang=ALL-UNNAMED#--add-opens=java.base/java.io=ALL-UNNAMED#--add-opens=java.base/java.util=ALL-UNNAMED#--add-opens=java.base/java.util.concurrent=ALL-UNNAMED#--add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED" ^
+ --Startup "%SERVICE_STARTUP_MODE%" ^
+ --JvmMs "%JvmMs%" ^
+ --JvmMx "%JvmMx%"
+if not errorlevel 1 goto installed
+echo Failed installing '%SERVICE_NAME%' service
+exit /b 1
+:installed
+echo The service '%SERVICE_NAME%' has been installed.
+exit /b 0
\ No newline at end of file
diff --git a/web/tomcat/bin/setclasspath.bat b/web/tomcat/bin/setclasspath.bat
new file mode 100644
index 0000000..12da138
--- /dev/null
+++ b/web/tomcat/bin/setclasspath.bat
@@ -0,0 +1,94 @@
+@echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements. See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License. You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Set JAVA_HOME or JRE_HOME if not already set, ensure any provided settings
+rem are valid and consistent with the selected start-up options and set up the
+rem endorsed directory.
+rem ---------------------------------------------------------------------------
+
+rem Make sure prerequisite environment variables are set
+
+rem In debug mode we need a real JDK (JAVA_HOME)
+if ""%1"" == ""debug"" goto needJavaHome
+
+rem Otherwise either JRE or JDK are fine
+if not "%JRE_HOME%" == "" goto gotJreHome
+if not "%JAVA_HOME%" == "" goto gotJavaHome
+echo Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
+echo At least one of these environment variable is needed to run this program
+goto exit
+
+:needJavaHome
+rem Check if we have a usable JDK
+if "%JAVA_HOME%" == "" goto noJavaHome
+if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome
+if not exist "%JAVA_HOME%\bin\jdb.exe" goto noJavaHome
+if not exist "%JAVA_HOME%\bin\javac.exe" goto noJavaHome
+set "JRE_HOME=%JAVA_HOME%"
+goto okJava
+
+:noJavaHome
+echo The JAVA_HOME environment variable is not defined correctly.
+echo It is needed to run this program in debug mode.
+echo NB: JAVA_HOME should point to a JDK not a JRE.
+goto exit
+
+:gotJavaHome
+rem No JRE given, use JAVA_HOME as JRE_HOME
+set "JRE_HOME=%JAVA_HOME%"
+
+:gotJreHome
+rem Check if we have a usable JRE
+if not exist "%JRE_HOME%\bin\java.exe" goto noJreHome
+goto okJava
+
+:noJreHome
+rem Needed at least a JRE
+echo The JRE_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto exit
+
+:okJava
+rem Don't override the endorsed dir if the user has set it previously
+if not "%JAVA_ENDORSED_DIRS%" == "" goto gotEndorseddir
+rem Java 9 no longer supports the java.endorsed.dirs
+rem system property. Only try to use it if
+rem CATALINA_HOME/endorsed exists.
+if not exist "%CATALINA_HOME%\endorsed" goto gotEndorseddir
+set "JAVA_ENDORSED_DIRS=%CATALINA_HOME%\endorsed"
+:gotEndorseddir
+
+rem Don't override _RUNJAVA if the user has set it previously
+if not "%_RUNJAVA%" == "" goto gotRunJava
+rem Set standard command for invoking Java.
+rem Also note the quoting as JRE_HOME may contain spaces.
+set _RUNJAVA="%JRE_HOME%\bin\java.exe"
+:gotRunJava
+
+rem Don't override _RUNJDB if the user has set it previously
+rem Also note the quoting as JAVA_HOME may contain spaces.
+if not "%_RUNJDB%" == "" goto gotRunJdb
+set _RUNJDB="%JAVA_HOME%\bin\jdb.exe"
+:gotRunJdb
+
+goto end
+
+:exit
+exit /b 1
+
+:end
+exit /b 0
diff --git a/web/tomcat/bin/setclasspath.sh b/web/tomcat/bin/setclasspath.sh
new file mode 100644
index 0000000..4ae4b6a
--- /dev/null
+++ b/web/tomcat/bin/setclasspath.sh
@@ -0,0 +1,98 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Set JAVA_HOME or JRE_HOME if not already set, ensure any provided settings
+# are valid and consistent with the selected start-up options and set up the
+# endorsed directory.
+# -----------------------------------------------------------------------------
+
+# Make sure prerequisite environment variables are set
+if [ -z "$JAVA_HOME" ] && [ -z "$JRE_HOME" ]; then
+ if $darwin; then
+ # Bugzilla 54390
+ if [ -x '/usr/libexec/java_home' ] ; then
+ export JAVA_HOME=`/usr/libexec/java_home`
+ # Bugzilla 37284 (reviewed).
+ elif [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home" ]; then
+ export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home"
+ fi
+ else
+ JAVA_PATH=`which java 2>/dev/null`
+ if [ "x$JAVA_PATH" != "x" ]; then
+ JAVA_PATH=`dirname "$JAVA_PATH" 2>/dev/null`
+ JRE_HOME=`dirname "$JAVA_PATH" 2>/dev/null`
+ fi
+ if [ "x$JRE_HOME" = "x" ]; then
+ # XXX: Should we try other locations?
+ if [ -x /usr/bin/java ]; then
+ JRE_HOME=/usr
+ fi
+ fi
+ fi
+ if [ -z "$JAVA_HOME" ] && [ -z "$JRE_HOME" ]; then
+ echo "Neither the JAVA_HOME nor the JRE_HOME environment variable is defined"
+ echo "At least one of these environment variable is needed to run this program"
+ exit 1
+ fi
+fi
+if [ -z "$JAVA_HOME" ] && [ "$1" = "debug" ]; then
+ echo "JAVA_HOME should point to a JDK in order to run in debug mode."
+ exit 1
+fi
+if [ -z "$JRE_HOME" ]; then
+ JRE_HOME="$JAVA_HOME"
+fi
+
+# If we're running under jdb, we need a full jdk.
+if [ "$1" = "debug" ] ; then
+ if [ "$os400" = "true" ]; then
+ if [ ! -x "$JAVA_HOME"/bin/java ] || [ ! -x "$JAVA_HOME"/bin/javac ]; then
+ echo "The JAVA_HOME environment variable is not defined correctly"
+ echo "This environment variable is needed to run this program"
+ echo "NB: JAVA_HOME should point to a JDK not a JRE"
+ exit 1
+ fi
+ else
+ if [ ! -x "$JAVA_HOME"/bin/java ] || [ ! -x "$JAVA_HOME"/bin/jdb ] || [ ! -x "$JAVA_HOME"/bin/javac ]; then
+ echo "The JAVA_HOME environment variable is not defined correctly"
+ echo "This environment variable is needed to run this program"
+ echo "NB: JAVA_HOME should point to a JDK not a JRE"
+ exit 1
+ fi
+ fi
+fi
+
+# Don't override the endorsed dir if the user has set it previously
+if [ -z "$JAVA_ENDORSED_DIRS" ]; then
+ # Java 9 no longer supports the java.endorsed.dirs
+ # system property. Only try to use it if
+ # CATALINA_HOME/endorsed exists.
+ if [ -d "$CATALINA_HOME"/endorsed ]; then
+ JAVA_ENDORSED_DIRS="$CATALINA_HOME"/endorsed
+ fi
+fi
+
+# Set standard commands for invoking Java, if not already set.
+if [ -z "$_RUNJAVA" ]; then
+ _RUNJAVA="$JRE_HOME"/bin/java
+fi
+if [ "$os400" != "true" ]; then
+ if [ -z "$_RUNJDB" ]; then
+ _RUNJDB="$JAVA_HOME"/bin/jdb
+ fi
+fi
diff --git a/web/tomcat/bin/shutdown.bat b/web/tomcat/bin/shutdown.bat
new file mode 100644
index 0000000..d7040e3
--- /dev/null
+++ b/web/tomcat/bin/shutdown.bat
@@ -0,0 +1,58 @@
+@echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements. See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License. You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Stop script for the CATALINA Server
+rem ---------------------------------------------------------------------------
+
+setlocal
+
+rem Guess CATALINA_HOME if not defined
+set "CURRENT_DIR=%cd%"
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%CURRENT_DIR%"
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+cd ..
+set "CATALINA_HOME=%cd%"
+cd "%CURRENT_DIR%"
+:gotHome
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+echo The CATALINA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+:okHome
+
+set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
+
+rem Check that target executable exists
+if exist "%EXECUTABLE%" goto okExec
+echo Cannot find "%EXECUTABLE%"
+echo This file is needed to run this program
+goto end
+:okExec
+
+rem Get remaining unshifted command line arguments and save them in the
+set CMD_LINE_ARGS=
+:setArgs
+if ""%1""=="""" goto doneSetArgs
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto setArgs
+:doneSetArgs
+
+call "%EXECUTABLE%" stop %CMD_LINE_ARGS%
+
+:end
diff --git a/web/tomcat/bin/shutdown.sh b/web/tomcat/bin/shutdown.sh
new file mode 100644
index 0000000..cd0c97d
--- /dev/null
+++ b/web/tomcat/bin/shutdown.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Stop script for the CATALINA Server
+# -----------------------------------------------------------------------------
+
+# Better OS/400 detection: see Bugzilla 31132
+os400=false
+case "`uname`" in
+OS400*) os400=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`/"$link"
+ fi
+done
+
+PRGDIR=`dirname "$PRG"`
+EXECUTABLE=catalina.sh
+
+# Check that target executable exists
+if $os400; then
+ # -x will Only work on the os400 if the files are:
+ # 1. owned by the user
+ # 2. owned by the PRIMARY group of the user
+ # this will not work if the user belongs in secondary groups
+ eval
+else
+ if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
+ echo "Cannot find $PRGDIR/$EXECUTABLE"
+ echo "The file is absent or does not have execute permission"
+ echo "This file is needed to run this program"
+ exit 1
+ fi
+fi
+
+exec "$PRGDIR"/"$EXECUTABLE" stop "$@"
diff --git a/web/tomcat/bin/startup.bat b/web/tomcat/bin/startup.bat
new file mode 100644
index 0000000..8c8f663
--- /dev/null
+++ b/web/tomcat/bin/startup.bat
@@ -0,0 +1,58 @@
+@echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements. See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License. You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Start script for the CATALINA Server
+rem ---------------------------------------------------------------------------
+
+setlocal
+
+rem Guess CATALINA_HOME if not defined
+set "CURRENT_DIR=%cd%"
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%CURRENT_DIR%"
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+cd ..
+set "CATALINA_HOME=%cd%"
+cd "%CURRENT_DIR%"
+:gotHome
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+echo The CATALINA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+:okHome
+
+set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
+
+rem Check that target executable exists
+if exist "%EXECUTABLE%" goto okExec
+echo Cannot find "%EXECUTABLE%"
+echo This file is needed to run this program
+goto end
+:okExec
+
+rem Get remaining unshifted command line arguments and save them in the
+set CMD_LINE_ARGS=
+:setArgs
+if ""%1""=="""" goto doneSetArgs
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto setArgs
+:doneSetArgs
+
+call "%EXECUTABLE%" start %CMD_LINE_ARGS%
+
+:end
diff --git a/web/tomcat/bin/startup.sh b/web/tomcat/bin/startup.sh
new file mode 100644
index 0000000..7b10287
--- /dev/null
+++ b/web/tomcat/bin/startup.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Start Script for the CATALINA Server
+# -----------------------------------------------------------------------------
+
+# Better OS/400 detection: see Bugzilla 31132
+os400=false
+case "`uname`" in
+OS400*) os400=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`/"$link"
+ fi
+done
+
+PRGDIR=`dirname "$PRG"`
+EXECUTABLE=catalina.sh
+
+# Check that target executable exists
+if $os400; then
+ # -x will Only work on the os400 if the files are:
+ # 1. owned by the user
+ # 2. owned by the PRIMARY group of the user
+ # this will not work if the user belongs in secondary groups
+ eval
+else
+ if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
+ echo "Cannot find $PRGDIR/$EXECUTABLE"
+ echo "The file is absent or does not have execute permission"
+ echo "This file is needed to run this program"
+ exit 1
+ fi
+fi
+
+exec "$PRGDIR"/"$EXECUTABLE" start "$@"
diff --git a/web/tomcat/bin/tcnative-1.dll b/web/tomcat/bin/tcnative-1.dll
new file mode 100644
index 0000000..1814fdf
--- /dev/null
+++ b/web/tomcat/bin/tcnative-1.dll
Binary files differ
diff --git a/web/tomcat/bin/tomcat-juli.jar b/web/tomcat/bin/tomcat-juli.jar
new file mode 100644
index 0000000..d3ab6c2
--- /dev/null
+++ b/web/tomcat/bin/tomcat-juli.jar
Binary files differ
diff --git a/web/tomcat/bin/tomcat8.exe b/web/tomcat/bin/tomcat8.exe
new file mode 100644
index 0000000..c56d78e
--- /dev/null
+++ b/web/tomcat/bin/tomcat8.exe
Binary files differ
diff --git a/web/tomcat/bin/tomcat8w.exe b/web/tomcat/bin/tomcat8w.exe
new file mode 100644
index 0000000..602a0df
--- /dev/null
+++ b/web/tomcat/bin/tomcat8w.exe
Binary files differ
diff --git a/web/tomcat/bin/tool-wrapper.bat b/web/tomcat/bin/tool-wrapper.bat
new file mode 100644
index 0000000..94de4fe
--- /dev/null
+++ b/web/tomcat/bin/tool-wrapper.bat
@@ -0,0 +1,110 @@
+@echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements. See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License. You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Wrapper script for command line tools
+rem
+rem Environment Variable Prerequisites
+rem
+rem CATALINA_HOME May point at your Catalina "build" directory.
+rem
+rem TOOL_OPTS (Optional) Java runtime options.
+rem
+rem JAVA_HOME Must point at your Java Development Kit installation.
+rem Using JRE_HOME instead works as well.
+rem
+rem JRE_HOME Must point at your Java Runtime installation.
+rem Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME
+rem are both set, JRE_HOME is used.
+rem
+rem JAVA_OPTS (Optional) Java runtime options.
+rem
+rem JAVA_ENDORSED_DIRS (Optional) Lists of of semi-colon separated directories
+rem containing some jars in order to allow replacement of APIs
+rem created outside of the JCP (i.e. DOM and SAX from W3C).
+rem It can also be used to update the XML parser implementation.
+rem This is only supported for Java <= 8.
+rem Defaults to $CATALINA_HOME/endorsed.
+rem ---------------------------------------------------------------------------
+
+setlocal
+
+rem Guess CATALINA_HOME if not defined
+set "CURRENT_DIR=%cd%"
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%CURRENT_DIR%"
+if exist "%CATALINA_HOME%\bin\tool-wrapper.bat" goto okHome
+cd ..
+set "CATALINA_HOME=%cd%"
+cd "%CURRENT_DIR%"
+:gotHome
+if exist "%CATALINA_HOME%\bin\tool-wrapper.bat" goto okHome
+echo The CATALINA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+:okHome
+
+rem Ensure that any user defined CLASSPATH variables are not used on startup,
+rem but allow them to be specified in setenv.bat, in rare case when it is needed.
+set CLASSPATH=
+
+rem Get standard environment variables
+if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"
+
+rem Get standard Java environment variables
+if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath
+echo Cannot find "%CATALINA_HOME%\bin\setclasspath.bat"
+echo This file is needed to run this program
+goto end
+:okSetclasspath
+call "%CATALINA_HOME%\bin\setclasspath.bat" %1
+if errorlevel 1 goto end
+
+rem Add on extra jar files to CLASSPATH
+rem Note that there are no quotes as we do not want to introduce random
+rem quotes into the CLASSPATH
+if "%CLASSPATH%" == "" goto emptyClasspath
+set "CLASSPATH=%CLASSPATH%;"
+:emptyClasspath
+set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar;%CATALINA_HOME%\bin\tomcat-juli.jar;%CATALINA_HOME%\lib\servlet-api.jar;%CATALINA_HOME%\lib\tomcat-util.jar"
+
+set JAVA_OPTS=%JAVA_OPTS% -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
+
+rem Java 9 no longer supports the java.endorsed.dirs
+rem system property. Only try to use it if
+rem JAVA_ENDORSED_DIRS was explicitly set
+rem or CATALINA_HOME/endorsed exists.
+set ENDORSED_PROP=ignore.endorsed.dirs
+if "%JAVA_ENDORSED_DIRS%" == "" goto noEndorsedVar
+set ENDORSED_PROP=java.endorsed.dirs
+goto doneEndorsed
+:noEndorsedVar
+if not exist "%CATALINA_HOME%\endorsed" goto doneEndorsed
+set ENDORSED_PROP=java.endorsed.dirs
+:doneEndorsed
+
+rem Get remaining unshifted command line arguments and save them in the
+set CMD_LINE_ARGS=
+:setArgs
+if ""%1""=="""" goto doneSetArgs
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto setArgs
+:doneSetArgs
+
+%_RUNJAVA% %JAVA_OPTS% %TOOL_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.home="%CATALINA_HOME%" org.apache.catalina.startup.Tool %CMD_LINE_ARGS%
+
+:end
diff --git a/web/tomcat/bin/tool-wrapper.sh b/web/tomcat/bin/tool-wrapper.sh
new file mode 100644
index 0000000..863ca49
--- /dev/null
+++ b/web/tomcat/bin/tool-wrapper.sh
@@ -0,0 +1,153 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Wrapper script for command line tools
+#
+# Environment Variable Prerequisites
+#
+# CATALINA_HOME May point at your Catalina "build" directory.
+#
+# TOOL_OPTS (Optional) Java runtime options.
+#
+# JAVA_HOME Must point at your Java Development Kit installation.
+# Using JRE_HOME instead works as well.
+#
+# JRE_HOME Must point at your Java Runtime installation.
+# Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME
+# are both set, JRE_HOME is used.
+#
+# JAVA_OPTS (Optional) Java runtime options.
+#
+# JAVA_ENDORSED_DIRS (Optional) Lists of of colon separated directories
+# containing some jars in order to allow replacement of APIs
+# created outside of the JCP (i.e. DOM and SAX from W3C).
+# It can also be used to update the XML parser implementation.
+# This is only supported for Java <= 8.
+# Defaults to $CATALINA_HOME/endorsed.
+# -----------------------------------------------------------------------------
+
+# OS specific support. $var _must_ be set to either true or false.
+cygwin=false
+darwin=false
+os400=false
+case "`uname`" in
+CYGWIN*) cygwin=true;;
+Darwin*) darwin=true;;
+OS400*) os400=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ]; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`/"$link"
+ fi
+done
+
+# Get standard environment variables
+PRGDIR=`dirname "$PRG"`
+
+# Only set CATALINA_HOME if not already set
+[ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd`
+
+# Ensure that any user defined CLASSPATH variables are not used on startup,
+# but allow them to be specified in setenv.sh, in rare case when it is needed.
+CLASSPATH=
+
+if [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
+ . "$CATALINA_HOME/bin/setenv.sh"
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+ [ -n "$JRE_HOME" ] && JRE_HOME=`cygpath --unix "$JRE_HOME"`
+ [ -n "$CATALINA_HOME" ] && CATALINA_HOME=`cygpath --unix "$CATALINA_HOME"`
+ [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For OS400
+if $os400; then
+ # Set job priority to standard for interactive (interactive - 6) by using
+ # the interactive priority - 6, the helper threads that respond to requests
+ # will be running at the same priority as interactive jobs.
+ COMMAND='chgjob job('$JOBNAME') runpty(6)'
+ system $COMMAND
+
+ # Enable multi threading
+ export QIBM_MULTI_THREADED=Y
+fi
+
+# Get standard Java environment variables
+if $os400; then
+ # -r will Only work on the os400 if the files are:
+ # 1. owned by the user
+ # 2. owned by the PRIMARY group of the user
+ # this will not work if the user belongs in secondary groups
+ . "$CATALINA_HOME"/bin/setclasspath.sh
+else
+ if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then
+ . "$CATALINA_HOME"/bin/setclasspath.sh
+ else
+ echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh"
+ echo "This file is needed to run this program"
+ exit 1
+ fi
+fi
+
+# Add on extra jar files to CLASSPATH
+if [ ! -z "$CLASSPATH" ] ; then
+ CLASSPATH="$CLASSPATH":
+fi
+CLASSPATH="$CLASSPATH""$CATALINA_HOME"/bin/bootstrap.jar:"$CATALINA_HOME"/bin/tomcat-juli.jar:"$CATALINA_HOME"/lib/servlet-api.jar:"$CATALINA_HOME"/lib/tomcat-util.jar
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+ JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"`
+ JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"`
+ CATALINA_HOME=`cygpath --absolute --windows "$CATALINA_HOME"`
+ CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+ [ -n "$JAVA_ENDORSED_DIRS" ] && JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"`
+fi
+
+# Java 9 no longer supports the java.endorsed.dirs
+# system property. Only try to use it if
+# JAVA_ENDORSED_DIRS was explicitly set
+# or CATALINA_HOME/endorsed exists.
+ENDORSED_PROP=ignore.endorsed.dirs
+if [ -n "$JAVA_ENDORSED_DIRS" ]; then
+ ENDORSED_PROP=java.endorsed.dirs
+fi
+if [ -d "$CATALINA_HOME/endorsed" ]; then
+ ENDORSED_PROP=java.endorsed.dirs
+fi
+
+JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
+
+# ----- Execute The Requested Command -----------------------------------------
+
+eval exec "\"$_RUNJAVA\"" "$JAVA_OPTS" "$TOOL_OPTS" \
+ -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
+ -classpath "\"$CLASSPATH\"" \
+ -Dcatalina.home="\"$CATALINA_HOME\"" \
+ org.apache.catalina.startup.Tool "$@"
diff --git a/web/tomcat/bin/version.bat b/web/tomcat/bin/version.bat
new file mode 100644
index 0000000..6c807bb
--- /dev/null
+++ b/web/tomcat/bin/version.bat
@@ -0,0 +1,58 @@
+@echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements. See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License. You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Version script for the CATALINA Server
+rem ---------------------------------------------------------------------------
+
+setlocal
+
+rem Guess CATALINA_HOME if not defined
+set "CURRENT_DIR=%cd%"
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%CURRENT_DIR%"
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+cd ..
+set "CATALINA_HOME=%cd%"
+cd "%CURRENT_DIR%"
+:gotHome
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+echo The CATALINA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+:okHome
+
+set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
+
+rem Check that target executable exists
+if exist "%EXECUTABLE%" goto okExec
+echo Cannot find "%EXECUTABLE%"
+echo This file is needed to run this program
+goto end
+:okExec
+
+rem Get remaining unshifted command line arguments and save them in the
+set CMD_LINE_ARGS=
+:setArgs
+if ""%1""=="""" goto doneSetArgs
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto setArgs
+:doneSetArgs
+
+call "%EXECUTABLE%" version %CMD_LINE_ARGS%
+
+:end
diff --git a/web/tomcat/bin/version.sh b/web/tomcat/bin/version.sh
new file mode 100644
index 0000000..1cb19bd
--- /dev/null
+++ b/web/tomcat/bin/version.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Version Script for the CATALINA Server
+# -----------------------------------------------------------------------------
+
+# Better OS/400 detection: see Bugzilla 31132
+os400=false
+case "`uname`" in
+OS400*) os400=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`/"$link"
+ fi
+done
+
+PRGDIR=`dirname "$PRG"`
+EXECUTABLE=catalina.sh
+
+# Check that target executable exists
+if $os400; then
+ # -x will Only work on the os400 if the files are:
+ # 1. owned by the user
+ # 2. owned by the PRIMARY group of the user
+ # this will not work if the user belongs in secondary groups
+ eval
+else
+ if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
+ echo "Cannot find $PRGDIR/$EXECUTABLE"
+ echo "The file is absent or does not have execute permission"
+ echo "This file is needed to run this program"
+ exit 1
+ fi
+fi
+
+exec "$PRGDIR"/"$EXECUTABLE" version "$@"
diff --git a/web/tomcat/conf/catalina.policy b/web/tomcat/conf/catalina.policy
new file mode 100644
index 0000000..5cfab09
--- /dev/null
+++ b/web/tomcat/conf/catalina.policy
@@ -0,0 +1,265 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// ============================================================================
+// catalina.policy - Security Policy Permissions for Tomcat
+//
+// This file contains a default set of security policies to be enforced (by the
+// JVM) when Catalina is executed with the "-security" option. In addition
+// to the permissions granted here, the following additional permissions are
+// granted to each web application:
+//
+// * Read access to the web application's document root directory
+// * Read, write and delete access to the web application's working directory
+// ============================================================================
+
+
+// ========== SYSTEM CODE PERMISSIONS =========================================
+
+
+// These permissions apply to javac
+grant codeBase "file:${java.home}/lib/-" {
+ permission java.security.AllPermission;
+};
+
+// These permissions apply to all shared system extensions
+grant codeBase "file:${java.home}/jre/lib/ext/-" {
+ permission java.security.AllPermission;
+};
+
+// These permissions apply to javac when ${java.home} points at $JAVA_HOME/jre
+grant codeBase "file:${java.home}/../lib/-" {
+ permission java.security.AllPermission;
+};
+
+// These permissions apply to all shared system extensions when
+// ${java.home} points at $JAVA_HOME/jre
+grant codeBase "file:${java.home}/lib/ext/-" {
+ permission java.security.AllPermission;
+};
+
+// This permission is required when using javac to compile JSPs on Java 9
+// onwards
+//grant codeBase "jrt:/jdk.compiler" {
+// permission java.security.AllPermission;
+//};
+
+
+// ========== CATALINA CODE PERMISSIONS =======================================
+
+// These permissions apply to the daemon code
+grant codeBase "file:${catalina.home}/bin/commons-daemon.jar" {
+ permission java.security.AllPermission;
+};
+
+// These permissions apply to the logging API
+// Note: If tomcat-juli.jar is in ${catalina.base} and not in ${catalina.home},
+// update this section accordingly.
+// grant codeBase "file:${catalina.base}/bin/tomcat-juli.jar" {..}
+grant codeBase "file:${catalina.home}/bin/tomcat-juli.jar" {
+ permission java.io.FilePermission
+ "${java.home}${file.separator}lib${file.separator}logging.properties", "read";
+
+ permission java.io.FilePermission
+ "${catalina.base}${file.separator}conf${file.separator}logging.properties", "read";
+ permission java.io.FilePermission
+ "${catalina.base}${file.separator}logs", "read, write";
+ permission java.io.FilePermission
+ "${catalina.base}${file.separator}logs${file.separator}*", "read, write, delete";
+
+ permission java.lang.RuntimePermission "shutdownHooks";
+ permission java.lang.RuntimePermission "getClassLoader";
+ permission java.lang.RuntimePermission "setContextClassLoader";
+
+ permission java.lang.management.ManagementPermission "monitor";
+
+ permission java.util.logging.LoggingPermission "control";
+
+ permission java.util.PropertyPermission "java.util.logging.config.class", "read";
+ permission java.util.PropertyPermission "java.util.logging.config.file", "read";
+ permission java.util.PropertyPermission "org.apache.juli.AsyncLoggerPollInterval", "read";
+ permission java.util.PropertyPermission "org.apache.juli.AsyncMaxRecordCount", "read";
+ permission java.util.PropertyPermission "org.apache.juli.AsyncOverflowDropType", "read";
+ permission java.util.PropertyPermission "org.apache.juli.ClassLoaderLogManager.debug", "read";
+ permission java.util.PropertyPermission "catalina.base", "read";
+
+ // Note: To enable per context logging configuration, permit read access to
+ // the appropriate file. Be sure that the logging configuration is
+ // secure before enabling such access.
+ // E.g. for the examples web application (uncomment and unwrap
+ // the following to be on a single line):
+ // permission java.io.FilePermission "${catalina.base}${file.separator}
+ // webapps${file.separator}examples${file.separator}WEB-INF
+ // ${file.separator}classes${file.separator}logging.properties", "read";
+};
+
+// These permissions apply to the server startup code
+grant codeBase "file:${catalina.home}/bin/bootstrap.jar" {
+ permission java.security.AllPermission;
+};
+
+// These permissions apply to the servlet API classes
+// and those that are shared across all class loaders
+// located in the "lib" directory
+grant codeBase "file:${catalina.home}/lib/-" {
+ permission java.security.AllPermission;
+};
+
+
+// If using a per instance lib directory, i.e. ${catalina.base}/lib,
+// then the following permission will need to be uncommented
+// grant codeBase "file:${catalina.base}/lib/-" {
+// permission java.security.AllPermission;
+// };
+
+
+// ========== WEB APPLICATION PERMISSIONS =====================================
+
+
+// These permissions are granted by default to all web applications
+// In addition, a web application will be given a read FilePermission
+// for all files and directories in its document root.
+grant {
+ // Required for JNDI lookup of named JDBC DataSource's and
+ // javamail named MimePart DataSource used to send mail
+ permission java.util.PropertyPermission "java.home", "read";
+ permission java.util.PropertyPermission "java.naming.*", "read";
+ permission java.util.PropertyPermission "javax.sql.*", "read";
+
+ // OS Specific properties to allow read access
+ permission java.util.PropertyPermission "os.name", "read";
+ permission java.util.PropertyPermission "os.version", "read";
+ permission java.util.PropertyPermission "os.arch", "read";
+ permission java.util.PropertyPermission "file.separator", "read";
+ permission java.util.PropertyPermission "path.separator", "read";
+ permission java.util.PropertyPermission "line.separator", "read";
+
+ // JVM properties to allow read access
+ permission java.util.PropertyPermission "java.version", "read";
+ permission java.util.PropertyPermission "java.vendor", "read";
+ permission java.util.PropertyPermission "java.vendor.url", "read";
+ permission java.util.PropertyPermission "java.class.version", "read";
+ permission java.util.PropertyPermission "java.specification.version", "read";
+ permission java.util.PropertyPermission "java.specification.vendor", "read";
+ permission java.util.PropertyPermission "java.specification.name", "read";
+
+ permission java.util.PropertyPermission "java.vm.specification.version", "read";
+ permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
+ permission java.util.PropertyPermission "java.vm.specification.name", "read";
+ permission java.util.PropertyPermission "java.vm.version", "read";
+ permission java.util.PropertyPermission "java.vm.vendor", "read";
+ permission java.util.PropertyPermission "java.vm.name", "read";
+
+ // Required for OpenJMX
+ permission java.lang.RuntimePermission "getAttribute";
+
+ // Allow read of JAXP compliant XML parser debug
+ permission java.util.PropertyPermission "jaxp.debug", "read";
+
+ // All JSPs need to be able to read this package
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat";
+
+ // Precompiled JSPs need access to these packages.
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.el";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.runtime";
+ permission java.lang.RuntimePermission
+ "accessClassInPackage.org.apache.jasper.runtime.*";
+
+ // Applications using WebSocket need to be able to access these packages
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.websocket";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.websocket.server";
+};
+
+
+// The Manager application needs access to the following packages to support the
+// session display functionality. It also requires the custom Tomcat
+// DeployXmlPermission to enable the use of META-INF/context.xml
+// These settings support the following configurations:
+// - default CATALINA_HOME == CATALINA_BASE
+// - CATALINA_HOME != CATALINA_BASE, per instance Manager in CATALINA_BASE
+// - CATALINA_HOME != CATALINA_BASE, shared Manager in CATALINA_HOME
+grant codeBase "file:${catalina.base}/webapps/manager/-" {
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.ha.session";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager.util";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.util";
+ permission org.apache.catalina.security.DeployXmlPermission "manager";
+};
+grant codeBase "file:${catalina.home}/webapps/manager/-" {
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.ha.session";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager.util";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.util";
+ permission org.apache.catalina.security.DeployXmlPermission "manager";
+};
+
+// The Host Manager application needs the custom Tomcat DeployXmlPermission to
+// enable the use of META-INF/context.xml
+// These settings support the following configurations:
+// - default CATALINA_HOME == CATALINA_BASE
+// - CATALINA_HOME != CATALINA_BASE, per instance Host Manager in CATALINA_BASE
+// - CATALINA_HOME != CATALINA_BASE, shared Host Manager in CATALINA_HOME
+grant codeBase "file:${catalina.base}/webapps/host-manager/-" {
+ permission org.apache.catalina.security.DeployXmlPermission "host-manager";
+};
+grant codeBase "file:${catalina.home}/webapps/host-manager/-" {
+ permission org.apache.catalina.security.DeployXmlPermission "host-manager";
+};
+
+
+// You can assign additional permissions to particular web applications by
+// adding additional "grant" entries here, based on the code base for that
+// application, /WEB-INF/classes/, or /WEB-INF/lib/ jar files.
+//
+// Different permissions can be granted to JSP pages, classes loaded from
+// the /WEB-INF/classes/ directory, all jar files in the /WEB-INF/lib/
+// directory, or even to individual jar files in the /WEB-INF/lib/ directory.
+//
+// For instance, assume that the standard "examples" application
+// included a JDBC driver that needed to establish a network connection to the
+// corresponding database and used the scrape taglib to get the weather from
+// the NOAA web server. You might create a "grant" entries like this:
+//
+// The permissions granted to the context root directory apply to JSP pages.
+// grant codeBase "file:${catalina.base}/webapps/examples/-" {
+// permission java.net.SocketPermission "dbhost.mycompany.com:5432", "connect";
+// permission java.net.SocketPermission "*.noaa.gov:80", "connect";
+// };
+//
+// The permissions granted to the context WEB-INF/classes directory
+// grant codeBase "file:${catalina.base}/webapps/examples/WEB-INF/classes/-" {
+// };
+//
+// The permission granted to your JDBC driver
+// grant codeBase "jar:file:${catalina.base}/webapps/examples/WEB-INF/lib/driver.jar!/-" {
+// permission java.net.SocketPermission "dbhost.mycompany.com:5432", "connect";
+// };
+// The permission granted to the scrape taglib
+// grant codeBase "jar:file:${catalina.base}/webapps/examples/WEB-INF/lib/scrape.jar!/-" {
+// permission java.net.SocketPermission "*.noaa.gov:80", "connect";
+// };
+
+// To grant permissions for web applications using packed WAR files, use the
+// Tomcat specific WAR url scheme.
+//
+// The permissions granted to the entire web application
+// grant codeBase "war:file:${catalina.base}/webapps/examples.war*/-" {
+// };
+//
+// The permissions granted to a specific JAR
+// grant codeBase "war:file:${catalina.base}/webapps/examples.war*/WEB-INF/lib/foo.jar" {
+// };
diff --git a/web/tomcat/conf/catalina.properties b/web/tomcat/conf/catalina.properties
new file mode 100644
index 0000000..a3f7349
--- /dev/null
+++ b/web/tomcat/conf/catalina.properties
@@ -0,0 +1,215 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# List of comma-separated packages that start with or equal this string
+# will cause a security exception to be thrown when
+# passed to checkPackageAccess unless the
+# corresponding RuntimePermission ("accessClassInPackage."+package) has
+# been granted.
+package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.jasper.,org.apache.tomcat.
+#
+# List of comma-separated packages that start with or equal this string
+# will cause a security exception to be thrown when
+# passed to checkPackageDefinition unless the
+# corresponding RuntimePermission ("defineClassInPackage."+package) has
+# been granted.
+#
+# by default, no packages are restricted for definition, and none of
+# the class loaders supplied with the JDK call checkPackageDefinition.
+#
+package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote.,\
+org.apache.jasper.,org.apache.naming.,org.apache.tomcat.
+
+#
+#
+# List of comma-separated paths defining the contents of the "common"
+# classloader. Prefixes should be used to define what is the repository type.
+# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute.
+# If left as blank,the JVM system loader will be used as Catalina's "common"
+# loader.
+# Examples:
+# "foo": Add this folder as a class repository
+# "foo/*.jar": Add all the JARs of the specified folder as class
+# repositories
+# "foo/bar.jar": Add bar.jar as a class repository
+#
+# Note: Values are enclosed in double quotes ("...") in case either the
+# ${catalina.base} path or the ${catalina.home} path contains a comma.
+# Because double quotes are used for quoting, the double quote character
+# may not appear in a path.
+common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar"
+
+#
+# List of comma-separated paths defining the contents of the "server"
+# classloader. Prefixes should be used to define what is the repository type.
+# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute.
+# If left as blank, the "common" loader will be used as Catalina's "server"
+# loader.
+# Examples:
+# "foo": Add this folder as a class repository
+# "foo/*.jar": Add all the JARs of the specified folder as class
+# repositories
+# "foo/bar.jar": Add bar.jar as a class repository
+#
+# Note: Values may be enclosed in double quotes ("...") in case either the
+# ${catalina.base} path or the ${catalina.home} path contains a comma.
+# Because double quotes are used for quoting, the double quote character
+# may not appear in a path.
+server.loader=
+
+#
+# List of comma-separated paths defining the contents of the "shared"
+# classloader. Prefixes should be used to define what is the repository type.
+# Path may be relative to the CATALINA_BASE path or absolute. If left as blank,
+# the "common" loader will be used as Catalina's "shared" loader.
+# Examples:
+# "foo": Add this folder as a class repository
+# "foo/*.jar": Add all the JARs of the specified folder as class
+# repositories
+# "foo/bar.jar": Add bar.jar as a class repository
+# Please note that for single jars, e.g. bar.jar, you need the URL form
+# starting with file:.
+#
+# Note: Values may be enclosed in double quotes ("...") in case either the
+# ${catalina.base} path or the ${catalina.home} path contains a comma.
+# Because double quotes are used for quoting, the double quote character
+# may not appear in a path.
+shared.loader=
+
+# Default list of JAR files that should not be scanned using the JarScanner
+# functionality. This is typically used to scan JARs for configuration
+# information. JARs that do not contain such information may be excluded from
+# the scan to speed up the scanning process. This is the default list. JARs on
+# this list are excluded from all scans. The list must be a comma separated list
+# of JAR file names.
+# The list of JARs to skip may be over-ridden at a Context level for individual
+# scan types by configuring a JarScanner with a nested JarScanFilter.
+# The JARs listed below include:
+# - Tomcat Bootstrap JARs
+# - Tomcat API JARs
+# - Catalina JARs
+# - Jasper JARs
+# - Tomcat JARs
+# - Common non-Tomcat JARs
+# - Test JARs (JUnit, Cobertura and dependencies)
+tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\
+annotations-api.jar,\
+ant-junit*.jar,\
+ant-launcher.jar,\
+ant.jar,\
+asm-*.jar,\
+aspectj*.jar,\
+bootstrap.jar,\
+catalina-ant.jar,\
+catalina-ha.jar,\
+catalina-jmx-remote.jar,\
+catalina-storeconfig.jar,\
+catalina-tribes.jar,\
+catalina-ws.jar,\
+catalina.jar,\
+cglib-*.jar,\
+cobertura-*.jar,\
+commons-beanutils*.jar,\
+commons-codec*.jar,\
+commons-collections*.jar,\
+commons-daemon.jar,\
+commons-dbcp*.jar,\
+commons-digester*.jar,\
+commons-fileupload*.jar,\
+commons-httpclient*.jar,\
+commons-io*.jar,\
+commons-lang*.jar,\
+commons-logging*.jar,\
+commons-math*.jar,\
+commons-pool*.jar,\
+derby-*.jar,\
+dom4j-*.jar,\
+easymock-*.jar,\
+ecj-*.jar,\
+el-api.jar,\
+geronimo-spec-jaxrpc*.jar,\
+h2*.jar,\
+hamcrest-*.jar,\
+hibernate*.jar,\
+httpclient*.jar,\
+icu4j-*.jar,\
+jasper-el.jar,\
+jasper.jar,\
+jaspic-api.jar,\
+jaxb-*.jar,\
+jaxen-*.jar,\
+jdom-*.jar,\
+jetty-*.jar,\
+jmx-tools.jar,\
+jmx.jar,\
+jsp-api.jar,\
+jstl.jar,\
+jta*.jar,\
+junit-*.jar,\
+junit.jar,\
+log4j*.jar,\
+mail*.jar,\
+objenesis-*.jar,\
+oraclepki.jar,\
+oro-*.jar,\
+servlet-api-*.jar,\
+servlet-api.jar,\
+slf4j*.jar,\
+taglibs-standard-spec-*.jar,\
+tagsoup-*.jar,\
+tomcat-api.jar,\
+tomcat-coyote.jar,\
+tomcat-dbcp.jar,\
+tomcat-i18n-*.jar,\
+tomcat-jdbc.jar,\
+tomcat-jni.jar,\
+tomcat-juli-adapters.jar,\
+tomcat-juli.jar,\
+tomcat-util-scan.jar,\
+tomcat-util.jar,\
+tomcat-websocket.jar,\
+tools.jar,\
+websocket-api.jar,\
+wsdl4j*.jar,\
+xercesImpl.jar,\
+xml-apis.jar,\
+xmlParserAPIs-*.jar,\
+xmlParserAPIs.jar,\
+xom-*.jar
+
+# Default list of JAR files that should be scanned that overrides the default
+# jarsToSkip list above. This is typically used to include a specific JAR that
+# has been excluded by a broad file name pattern in the jarsToSkip list.
+# The list of JARs to scan may be over-ridden at a Context level for individual
+# scan types by configuring a JarScanner with a nested JarScanFilter.
+tomcat.util.scan.StandardJarScanFilter.jarsToScan=\
+log4j-taglib*.jar,\
+log4j-web*.jar,\
+log4javascript*.jar,\
+slf4j-taglib*.jar
+
+# String cache configuration.
+tomcat.util.buf.StringCache.byte.enabled=true
+#tomcat.util.buf.StringCache.char.enabled=true
+#tomcat.util.buf.StringCache.trainThreshold=500000
+#tomcat.util.buf.StringCache.cacheSize=5000
+
+# This system property is deprecated. Use the relaxedPathChars relaxedQueryChars
+# attributes of the Connector instead. These attributes permit a wider range of
+# characters to be configured as valid.
+# Allow for changes to HTTP request validation
+# WARNING: Using this option may expose the server to CVE-2016-6816
+#tomcat.util.http.parser.HttpParser.requestTargetAllow=|
diff --git a/web/tomcat/conf/context.xml b/web/tomcat/conf/context.xml
new file mode 100644
index 0000000..64de61f
--- /dev/null
+++ b/web/tomcat/conf/context.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- The contents of this file will be loaded for each web application -->
+<Context>
+
+ <!-- Default set of monitored resources. If one of these changes, the -->
+ <!-- web application will be reloaded. -->
+ <WatchedResource>WEB-INF/web.xml</WatchedResource>
+ <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
+
+ <!-- Uncomment this to disable session persistence across Tomcat restarts -->
+ <!--
+ <Manager pathname="" />
+ -->
+</Context>
diff --git a/web/tomcat/conf/jaspic-providers.xml b/web/tomcat/conf/jaspic-providers.xml
new file mode 100644
index 0000000..cdebf87
--- /dev/null
+++ b/web/tomcat/conf/jaspic-providers.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<jaspic-providers xmlns="http://tomcat.apache.org/xml"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://tomcat.apache.org/xml jaspic-providers.xsd"
+ version="1.0">
+ <!-- No JASPIC providers configured by default -->
+</jaspic-providers>
diff --git a/web/tomcat/conf/jaspic-providers.xsd b/web/tomcat/conf/jaspic-providers.xsd
new file mode 100644
index 0000000..1004a11
--- /dev/null
+++ b/web/tomcat/conf/jaspic-providers.xsd
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<xs:schema xmlns="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://tomcat.apache.org/xml"
+ xmlns:jaspic="http://tomcat.apache.org/xml"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ version="1.0">
+ <xs:element name="jaspic-providers">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="provider" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="property" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="name" use="required" type="jaspic:propertyname" />
+ <xs:attribute name="value" use="required" type="xs:string" />
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="className" type="xs:string" />
+ <xs:attribute name="layer" type="xs:string" />
+ <xs:attribute name="appContext" type="xs:string" />
+ <xs:attribute name="description" type="xs:string" />
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="version" type="xs:string" />
+ </xs:complexType>
+ </xs:element>
+ <xs:simpleType name="propertyname">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ </xs:restriction>
+ </xs:simpleType>
+</xs:schema>
\ No newline at end of file
diff --git a/web/tomcat/conf/logging.properties b/web/tomcat/conf/logging.properties
new file mode 100644
index 0000000..738bb31
--- /dev/null
+++ b/web/tomcat/conf/logging.properties
@@ -0,0 +1,76 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
+
+.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
+
+############################################################
+# Handler specific properties.
+# Describes specific configuration info for Handlers.
+############################################################
+
+1catalina.org.apache.juli.AsyncFileHandler.level = FINE
+1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
+1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
+1catalina.org.apache.juli.AsyncFileHandler.encoding = UTF-8
+
+2localhost.org.apache.juli.AsyncFileHandler.level = FINE
+2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
+2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.
+2localhost.org.apache.juli.AsyncFileHandler.encoding = UTF-8
+
+3manager.org.apache.juli.AsyncFileHandler.level = FINE
+3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
+3manager.org.apache.juli.AsyncFileHandler.prefix = manager.
+3manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8
+
+4host-manager.org.apache.juli.AsyncFileHandler.level = FINE
+4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
+4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager.
+4host-manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8
+
+java.util.logging.ConsoleHandler.level = FINE
+java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
+#java.util.logging.ConsoleHandler.encoding = UTF-8
+java.util.logging.ConsoleHandler.encoding = GBK
+
+
+############################################################
+# Facility specific properties.
+# Provides extra control for each logger.
+############################################################
+
+org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
+org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.AsyncFileHandler
+
+org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
+org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.AsyncFileHandler
+
+org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO
+org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.AsyncFileHandler
+
+# For example, set the org.apache.catalina.util.LifecycleBase logger to log
+# each component that extends LifecycleBase changing state:
+#org.apache.catalina.util.LifecycleBase.level = FINE
+
+# To see debug messages in TldLocationsCache, uncomment the following line:
+#org.apache.jasper.compiler.TldLocationsCache.level = FINE
+
+# To see debug messages for HTTP/2 handling, uncomment the following line:
+#org.apache.coyote.http2.level = FINE
+
+# To see debug messages for WebSocket handling, uncomment the following line:
+#org.apache.tomcat.websocket.level = FINE
diff --git a/web/tomcat/conf/server.xml b/web/tomcat/conf/server.xml
new file mode 100644
index 0000000..5915407
--- /dev/null
+++ b/web/tomcat/conf/server.xml
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Note: A "Server" is not itself a "Container", so you may not
+ define subcomponents such as "Valves" at this level.
+ Documentation at /docs/config/server.html
+ -->
+<Server port="8005" shutdown="SHUTDOWN">
+ <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
+ <!-- Security listener. Documentation at /docs/config/listeners.html
+ <Listener className="org.apache.catalina.security.SecurityListener" />
+ -->
+ <!-- APR library loader. Documentation at /docs/apr.html -->
+ <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
+ <!-- Prevent memory leaks due to use of particular java/javax APIs-->
+ <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
+ <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
+ <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
+
+ <!-- Global JNDI resources
+ Documentation at /docs/jndi-resources-howto.html
+ -->
+ <GlobalNamingResources>
+ <!-- Editable user database that can also be used by
+ UserDatabaseRealm to authenticate users
+ -->
+ <Resource name="UserDatabase" auth="Container"
+ type="org.apache.catalina.UserDatabase"
+ description="User database that can be updated and saved"
+ factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
+ pathname="conf/tomcat-users.xml" />
+ </GlobalNamingResources>
+
+ <!-- A "Service" is a collection of one or more "Connectors" that share
+ a single "Container" Note: A "Service" is not itself a "Container",
+ so you may not define subcomponents such as "Valves" at this level.
+ Documentation at /docs/config/service.html
+ -->
+ <Service name="Catalina">
+
+ <!--The connectors can use a shared executor, you can define one or more named thread pools-->
+ <!--
+ <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
+ maxThreads="150" minSpareThreads="4"/>
+ -->
+
+
+ <!-- A "Connector" represents an endpoint by which requests are received
+ and responses are returned. Documentation at :
+ Java HTTP Connector: /docs/config/http.html
+ Java AJP Connector: /docs/config/ajp.html
+ APR (HTTP/AJP) Connector: /docs/apr.html
+ Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
+ -->
+ <Connector port="8080" protocol="HTTP/1.1"
+ connectionTimeout="20000"
+ redirectPort="8443" />
+ <!-- A "Connector" using the shared thread pool-->
+ <!--
+ <Connector executor="tomcatThreadPool"
+ port="8080" protocol="HTTP/1.1"
+ connectionTimeout="20000"
+ redirectPort="8443" />
+ -->
+ <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443
+ This connector uses the NIO implementation. The default
+ SSLImplementation will depend on the presence of the APR/native
+ library and the useOpenSSL attribute of the
+ AprLifecycleListener.
+ Either JSSE or OpenSSL style configuration may be used regardless of
+ the SSLImplementation selected. JSSE style configuration is used below.
+ -->
+ <!--
+ <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
+ maxThreads="150" SSLEnabled="true">
+ <SSLHostConfig>
+ <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
+ type="RSA" />
+ </SSLHostConfig>
+ </Connector>
+ -->
+ <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
+ This connector uses the APR/native implementation which always uses
+ OpenSSL for TLS.
+ Either JSSE or OpenSSL style configuration may be used. OpenSSL style
+ configuration is used below.
+ -->
+ <!--
+ <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
+ maxThreads="150" SSLEnabled="true" >
+ <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
+ <SSLHostConfig>
+ <Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
+ certificateFile="conf/localhost-rsa-cert.pem"
+ certificateChainFile="conf/localhost-rsa-chain.pem"
+ type="RSA" />
+ </SSLHostConfig>
+ </Connector>
+ -->
+
+ <!-- Define an AJP 1.3 Connector on port 8009 -->
+ <!--
+ <Connector protocol="AJP/1.3"
+ address="::1"
+ port="8009"
+ redirectPort="8443" />
+ -->
+
+ <!-- An Engine represents the entry point (within Catalina) that processes
+ every request. The Engine implementation for Tomcat stand alone
+ analyzes the HTTP headers included with the request, and passes them
+ on to the appropriate Host (virtual host).
+ Documentation at /docs/config/engine.html -->
+
+ <!-- You should set jvmRoute to support load-balancing via AJP ie :
+ <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
+ -->
+ <Engine name="Catalina" defaultHost="localhost">
+
+ <!--For clustering, please take a look at documentation at:
+ /docs/cluster-howto.html (simple how to)
+ /docs/config/cluster.html (reference documentation) -->
+ <!--
+ <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
+ -->
+
+ <!-- Use the LockOutRealm to prevent attempts to guess user passwords
+ via a brute-force attack -->
+ <Realm className="org.apache.catalina.realm.LockOutRealm">
+ <!-- This Realm uses the UserDatabase configured in the global JNDI
+ resources under the key "UserDatabase". Any edits
+ that are performed against this UserDatabase are immediately
+ available for use by the Realm. -->
+ <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
+ resourceName="UserDatabase"/>
+ </Realm>
+
+ <Host name="localhost" appBase="webapps"
+ unpackWARs="true" autoDeploy="true">
+
+ <!-- SingleSignOn valve, share authentication between web applications
+ Documentation at: /docs/config/valve.html -->
+ <!--
+ <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
+ -->
+
+ <!-- Access log processes all example.
+ Documentation at: /docs/config/valve.html
+ Note: The pattern used is equivalent to using pattern="common" -->
+ <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
+ prefix="localhost_access_log" suffix=".txt"
+ pattern="%h %l %u %t "%r" %s %b" />
+
+ </Host>
+ </Engine>
+ </Service>
+</Server>
diff --git a/web/tomcat/conf/tomcat-users.xml b/web/tomcat/conf/tomcat-users.xml
new file mode 100644
index 0000000..86b2a4a
--- /dev/null
+++ b/web/tomcat/conf/tomcat-users.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<tomcat-users xmlns="http://tomcat.apache.org/xml"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
+ version="1.0">
+<!--
+ By default, no user is included in the "manager-gui" role required
+ to operate the "/manager/html" web application. If you wish to use this app,
+ you must define such a user - the username and password are arbitrary.
+
+ Built-in Tomcat manager roles:
+ - manager-gui - allows access to the HTML GUI and the status pages
+ - manager-script - allows access to the HTTP API and the status pages
+ - manager-jmx - allows access to the JMX proxy and the status pages
+ - manager-status - allows access to the status pages only
+
+ The users below are wrapped in a comment and are therefore ignored. If you
+ wish to configure one or more of these users for use with the manager web
+ application, do not forget to remove the <!.. ..> that surrounds them. You
+ will also need to set the passwords to something appropriate.
+-->
+<!--
+ <user username="admin" password="<must-be-changed>" roles="manager-gui"/>
+ <user username="robot" password="<must-be-changed>" roles="manager-script"/>
+-->
+<!--
+ The sample user and role entries below are intended for use with the
+ examples web application. They are wrapped in a comment and thus are ignored
+ when reading this file. If you wish to configure these users for use with the
+ examples web application, do not forget to remove the <!.. ..> that surrounds
+ them. You will also need to set the passwords to something appropriate.
+-->
+<!--
+ <role rolename="tomcat"/>
+ <role rolename="role1"/>
+ <user username="tomcat" password="<must-be-changed>" roles="tomcat"/>
+ <user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
+ <user username="role1" password="<must-be-changed>" roles="role1"/>
+-->
+</tomcat-users>
diff --git a/web/tomcat/conf/tomcat-users.xsd b/web/tomcat/conf/tomcat-users.xsd
new file mode 100644
index 0000000..6a3446c
--- /dev/null
+++ b/web/tomcat/conf/tomcat-users.xsd
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<xs:schema xmlns="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://tomcat.apache.org/xml"
+ xmlns:users="http://tomcat.apache.org/xml"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ version="1.0">
+ <xs:element name="tomcat-users">
+ <xs:complexType>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="role">
+ <xs:complexType>
+ <xs:attribute name="rolename" use="required" type="users:entityname" />
+ <xs:attribute name="description" type="xs:string" />
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="group">
+ <xs:complexType>
+ <xs:attribute name="groupname" use="required" type="users:entityname" />
+ <xs:attribute name="description" type="xs:string" />
+ <xs:attribute name="roles" type="xs:string" />
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="user">
+ <xs:complexType>
+ <xs:attribute name="username" use="required" type="users:entityname" />
+ <xs:attribute name="fullname" type="xs:string" />
+ <xs:attribute name="password" type="xs:string" />
+ <xs:attribute name="roles" type="xs:string" />
+ <xs:attribute name="groups" type="xs:string" />
+ </xs:complexType>
+ </xs:element>
+ </xs:choice>
+ <xs:attribute name="version" type="xs:string" />
+ </xs:complexType>
+ </xs:element>
+ <xs:simpleType name="entityname">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ </xs:restriction>
+ </xs:simpleType>
+</xs:schema>
diff --git a/web/tomcat/conf/web.xml b/web/tomcat/conf/web.xml
new file mode 100644
index 0000000..4392dcd
--- /dev/null
+++ b/web/tomcat/conf/web.xml
@@ -0,0 +1,4731 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
+ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+ version="3.1">
+
+ <!-- ======================== Introduction ============================== -->
+ <!-- This document defines default values for *all* web applications -->
+ <!-- loaded into this instance of Tomcat. As each application is -->
+ <!-- deployed, this file is processed, followed by the -->
+ <!-- "/WEB-INF/web.xml" deployment descriptor from your own -->
+ <!-- applications. -->
+ <!-- -->
+ <!-- WARNING: Do not configure application-specific resources here! -->
+ <!-- They should go in the "/WEB-INF/web.xml" file in your application. -->
+
+
+ <!-- ================== Built In Servlet Definitions ==================== -->
+
+
+ <!-- The default servlet for all web applications, that serves static -->
+ <!-- resources. It processes all requests that are not mapped to other -->
+ <!-- servlets with servlet mappings (defined either here or in your own -->
+ <!-- web.xml file). This servlet supports the following initialization -->
+ <!-- parameters (default values are in square brackets): -->
+ <!-- -->
+ <!-- debug Debugging detail level for messages logged -->
+ <!-- by this servlet. Useful values are 0, 1, and -->
+ <!-- 11 where higher values mean more detail. [0] -->
+ <!-- -->
+ <!-- fileEncoding Encoding to be used to read static resources -->
+ <!-- [platform default] -->
+ <!-- -->
+ <!-- useBomIfPresent If a static file contains a byte order mark -->
+ <!-- (BOM), should this be used to determine the -->
+ <!-- file encoding in preference to fileEncoding. -->
+ <!-- [true] -->
+ <!-- -->
+ <!-- input Input buffer size (in bytes) when reading -->
+ <!-- resources to be served. [2048] -->
+ <!-- -->
+ <!-- listings Should directory listings be produced if there -->
+ <!-- is no welcome file in this directory? [false] -->
+ <!-- WARNING: Listings for directories with many -->
+ <!-- entries can be slow and may consume -->
+ <!-- significant proportions of server resources. -->
+ <!-- -->
+ <!-- output Output buffer size (in bytes) when writing -->
+ <!-- resources to be served. [2048] -->
+ <!-- -->
+ <!-- readonly Is this context "read only", so HTTP -->
+ <!-- commands like PUT and DELETE are -->
+ <!-- rejected? [true] -->
+ <!-- -->
+ <!-- readmeFile File to display together with the directory -->
+ <!-- contents. [null] -->
+ <!-- -->
+ <!-- sendfileSize If the connector used supports sendfile, this -->
+ <!-- represents the minimal file size in KB for -->
+ <!-- which sendfile will be used. Use a negative -->
+ <!-- value to always disable sendfile. [48] -->
+ <!-- -->
+ <!-- useAcceptRanges Should the Accept-Ranges header be included -->
+ <!-- in responses where appropriate? [true] -->
+ <!-- -->
+ <!-- For directory listing customization. Checks localXsltFile, then -->
+ <!-- globalXsltFile, then defaults to original behavior. -->
+ <!-- -->
+ <!-- localXsltFile Make directory listings an XML doc and -->
+ <!-- pass the result to this style sheet residing -->
+ <!-- in that directory. This overrides -->
+ <!-- contextXsltFile and globalXsltFile[null] -->
+ <!-- -->
+ <!-- contextXsltFile Make directory listings an XML doc and -->
+ <!-- pass the result to this style sheet which is -->
+ <!-- relative to the context root. This overrides -->
+ <!-- globalXsltFile[null] -->
+ <!-- -->
+ <!-- globalXsltFile Site wide configuration version of -->
+ <!-- localXsltFile. This argument must either be an -->
+ <!-- absolute or relative (to either -->
+ <!-- $CATALINA_BASE/conf or $CATALINA_HOME/conf) -->
+ <!-- path that points to a location below either -->
+ <!-- $CATALINA_BASE/conf (checked first) or -->
+ <!-- $CATALINA_HOME/conf (checked second).[null] -->
+ <!-- -->
+ <!-- showServerInfo Should server information be presented in the -->
+ <!-- response sent to clients when directory -->
+ <!-- listings is enabled? [true] -->
+ <!-- -->
+ <!-- allowPartialPut Should the server treat an HTTP PUT request -->
+ <!-- with a Range header as a partial PUT? Note -->
+ <!-- that RFC 7233 clarified that Range headers are -->
+ <!-- only valid for GET requests. [true] -->
+
+ <servlet>
+ <servlet-name>default</servlet-name>
+ <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
+ <init-param>
+ <param-name>debug</param-name>
+ <param-value>0</param-value>
+ </init-param>
+ <init-param>
+ <param-name>listings</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+
+ <!-- The JSP page compiler and execution servlet, which is the mechanism -->
+ <!-- used by Tomcat to support JSP pages. Traditionally, this servlet -->
+ <!-- is mapped to the URL pattern "*.jsp". This servlet supports the -->
+ <!-- following initialization parameters (default values are in square -->
+ <!-- brackets): -->
+ <!-- -->
+ <!-- checkInterval If development is false and checkInterval is -->
+ <!-- greater than zero, background compilations are -->
+ <!-- enabled. checkInterval is the time in seconds -->
+ <!-- between checks to see if a JSP page (and its -->
+ <!-- dependent files) needs to be recompiled. [0] -->
+ <!-- -->
+ <!-- classdebuginfo Should the class file be compiled with -->
+ <!-- debugging information? [true] -->
+ <!-- -->
+ <!-- classpath What class path should I use while compiling -->
+ <!-- generated servlets? [Created dynamically -->
+ <!-- based on the current web application] -->
+ <!-- -->
+ <!-- compiler Which compiler Ant should use to compile JSP -->
+ <!-- pages. See the jasper documentation for more -->
+ <!-- information. -->
+ <!-- -->
+ <!-- compilerSourceVM Compiler source VM. [1.7] -->
+ <!-- -->
+ <!-- compilerTargetVM Compiler target VM. [1.7] -->
+ <!-- -->
+ <!-- development Is Jasper used in development mode? If true, -->
+ <!-- the frequency at which JSPs are checked for -->
+ <!-- modification may be specified via the -->
+ <!-- modificationTestInterval parameter. [true] -->
+ <!-- -->
+ <!-- displaySourceFragment -->
+ <!-- Should a source fragment be included in -->
+ <!-- exception messages? [true] -->
+ <!-- -->
+ <!-- dumpSmap Should the SMAP info for JSR45 debugging be -->
+ <!-- dumped to a file? [false] -->
+ <!-- False if suppressSmap is true -->
+ <!-- -->
+ <!-- enablePooling Determines whether tag handler pooling is -->
+ <!-- enabled. This is a compilation option. It will -->
+ <!-- not alter the behaviour of JSPs that have -->
+ <!-- already been compiled. [true] -->
+ <!-- -->
+ <!-- engineOptionsClass Allows specifying the Options class used to -->
+ <!-- configure Jasper. If not present, the default -->
+ <!-- EmbeddedServletOptions will be used. -->
+ <!-- This option is ignored when running under a -->
+ <!-- SecurityManager. -->
+ <!-- -->
+ <!-- errorOnUseBeanInvalidClassAttribute -->
+ <!-- Should Jasper issue an error when the value of -->
+ <!-- the class attribute in an useBean action is -->
+ <!-- not a valid bean class? [true] -->
+ <!-- -->
+ <!-- fork Tell Ant to fork compiles of JSP pages so that -->
+ <!-- a separate JVM is used for JSP page compiles -->
+ <!-- from the one Tomcat is running in. [true] -->
+ <!-- -->
+ <!-- genStringAsCharArray -->
+ <!-- Should text strings be generated as char -->
+ <!-- arrays, to improve performance in some cases? -->
+ <!-- [false] -->
+ <!-- -->
+ <!-- ieClassId The class-id value to be sent to Internet -->
+ <!-- Explorer when using <jsp:plugin> tags. -->
+ <!-- [clsid:8AD9C840-044E-11D1-B3E9-00805F499D93] -->
+ <!-- -->
+ <!-- javaEncoding Java file encoding to use for generating java -->
+ <!-- source files. [UTF8] -->
+ <!-- -->
+ <!-- keepgenerated Should we keep the generated Java source code -->
+ <!-- for each page instead of deleting it? [true] -->
+ <!-- -->
+ <!-- mappedfile Should we generate static content with one -->
+ <!-- print statement per input line, to ease -->
+ <!-- debugging? [true] -->
+ <!-- -->
+ <!-- maxLoadedJsps The maximum number of JSPs that will be loaded -->
+ <!-- for a web application. If more than this -->
+ <!-- number of JSPs are loaded, the least recently -->
+ <!-- used JSPs will be unloaded so that the number -->
+ <!-- of JSPs loaded at any one time does not exceed -->
+ <!-- this limit. A value of zero or less indicates -->
+ <!-- no limit. [-1] -->
+ <!-- -->
+ <!-- jspIdleTimeout The amount of time in seconds a JSP can be -->
+ <!-- idle before it is unloaded. A value of zero -->
+ <!-- or less indicates never unload. [-1] -->
+ <!-- -->
+ <!-- modificationTestInterval -->
+ <!-- Causes a JSP (and its dependent files) to not -->
+ <!-- be checked for modification during the -->
+ <!-- specified time interval (in seconds) from the -->
+ <!-- last time the JSP was checked for -->
+ <!-- modification. A value of 0 will cause the JSP -->
+ <!-- to be checked on every access. -->
+ <!-- Used in development mode only. [4] -->
+ <!-- -->
+ <!-- recompileOnFail If a JSP compilation fails should the -->
+ <!-- modificationTestInterval be ignored and the -->
+ <!-- next access trigger a re-compilation attempt? -->
+ <!-- Used in development mode only and is disabled -->
+ <!-- by default as compilation may be expensive and -->
+ <!-- could lead to excessive resource usage. -->
+ <!-- [false] -->
+ <!-- -->
+ <!-- scratchdir What scratch directory should we use when -->
+ <!-- compiling JSP pages? [default work directory -->
+ <!-- for the current web application] -->
+ <!-- This option is ignored when running under a -->
+ <!-- SecurityManager. -->
+ <!-- -->
+ <!-- suppressSmap Should the generation of SMAP info for JSR45 -->
+ <!-- debugging be suppressed? [false] -->
+ <!-- -->
+ <!-- trimSpaces Should template text that consists entirely of -->
+ <!-- whitespace be removed from the output? [false] -->
+ <!-- -->
+ <!-- xpoweredBy Determines whether X-Powered-By response -->
+ <!-- header is added by generated servlet. [false] -->
+ <!-- -->
+ <!-- strictQuoteEscaping When scriptlet expressions are used for -->
+ <!-- attribute values, should the rules in JSP.1.6 -->
+ <!-- for the escaping of quote characters be -->
+ <!-- strictly applied? [true] -->
+ <!-- -->
+ <!-- quoteAttributeEL When EL is used in an attribute value on a -->
+ <!-- JSP page should the rules for quoting of -->
+ <!-- attributes described in JSP.1.6 be applied to -->
+ <!-- the expression? [true] -->
+
+ <servlet>
+ <servlet-name>jsp</servlet-name>
+ <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
+ <init-param>
+ <param-name>fork</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ <init-param>
+ <param-name>xpoweredBy</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ <load-on-startup>3</load-on-startup>
+ </servlet>
+
+
+ <!-- NOTE: An SSI Filter is also available as an alternative SSI -->
+ <!-- implementation. Use either the Servlet or the Filter but NOT both. -->
+ <!-- -->
+ <!-- Server Side Includes processing servlet, which processes SSI -->
+ <!-- directives in HTML pages consistent with similar support in web -->
+ <!-- servers like Apache. Traditionally, this servlet is mapped to the -->
+ <!-- URL pattern "*.shtml". This servlet supports the following -->
+ <!-- initialization parameters (default values are in square brackets): -->
+ <!-- -->
+ <!-- buffered Should output from this servlet be buffered? -->
+ <!-- (0=false, 1=true) [0] -->
+ <!-- -->
+ <!-- debug Debugging detail level for messages logged -->
+ <!-- by this servlet. [0] -->
+ <!-- -->
+ <!-- expires The number of seconds before a page with SSI -->
+ <!-- directives will expire. [No default] -->
+ <!-- -->
+ <!-- isVirtualWebappRelative -->
+ <!-- Should "virtual" paths be interpreted as -->
+ <!-- relative to the context root, instead of -->
+ <!-- the server root? [false] -->
+ <!-- -->
+ <!-- inputEncoding The encoding to assume for SSI resources if -->
+ <!-- one is not available from the resource. -->
+ <!-- [Platform default] -->
+ <!-- -->
+ <!-- outputEncoding The encoding to use for the page that results -->
+ <!-- from the SSI processing. [UTF-8] -->
+ <!-- -->
+ <!-- allowExec Is use of the exec command enabled? [false] -->
+
+<!--
+ <servlet>
+ <servlet-name>ssi</servlet-name>
+ <servlet-class>
+ org.apache.catalina.ssi.SSIServlet
+ </servlet-class>
+ <init-param>
+ <param-name>buffered</param-name>
+ <param-value>1</param-value>
+ </init-param>
+ <init-param>
+ <param-name>debug</param-name>
+ <param-value>0</param-value>
+ </init-param>
+ <init-param>
+ <param-name>expires</param-name>
+ <param-value>666</param-value>
+ </init-param>
+ <init-param>
+ <param-name>isVirtualWebappRelative</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ <load-on-startup>4</load-on-startup>
+ </servlet>
+-->
+
+
+ <!-- Common Gateway Includes (CGI) processing servlet, which supports -->
+ <!-- execution of external applications that conform to the CGI spec -->
+ <!-- requirements. Typically, this servlet is mapped to the URL pattern -->
+ <!-- "/cgi-bin/*", which means that any CGI applications that are -->
+ <!-- executed must be present within the web application. This servlet -->
+ <!-- supports the following initialization parameters (default values -->
+ <!-- are in square brackets): -->
+ <!-- -->
+ <!-- cgiPathPrefix The CGI search path will start at -->
+ <!-- webAppRootDir + File.separator + this prefix. -->
+ <!-- If not set, then webAppRootDir is used. -->
+ <!-- Recommended value: WEB-INF/cgi -->
+ <!-- -->
+ <!-- cmdLineArgumentsDecoded -->
+ <!-- Only used when enableCmdLineArguments is -->
+ <!-- true. The pattern that individual decoded -->
+ <!-- command line arguments must match else the -->
+ <!-- request will be rejected. This is to -->
+ <!-- work-around various issues when Java passes -->
+ <!-- the arguments to the OS. See the CGI How-To -->
+ <!-- for more details. The default varies by -->
+ <!-- platform. -->
+ <!-- Windows: [[a-zA-Z0-9\Q-_.\\/:\E]+] -->
+ <!-- Others: [.*] -->
+ <!-- Note that internally the CGI Servlet treats -->
+ <!-- [.*] as a special case to improve performance -->
+ <!-- -->
+ <!-- cmdLineArgumentsEncoded -->
+ <!-- Only used when enableCmdLineArguments is -->
+ <!-- true. The pattern that individual encoded -->
+ <!-- command line arguments must match else the -->
+ <!-- request will be rejected. The default matches -->
+ <!-- the allowed values defined by RFC3875. -->
+ <!-- [[a-zA-Z0-9\Q%;/?:@&,$-_.!~*'()\E]+] -->
+ <!-- -->
+ <!-- enableCmdLineArguments -->
+ <!-- Are command line parameters generated from -->
+ <!-- the query string as per section 4.4 of 3875 -->
+ <!-- RFC? [false] -->
+ <!-- -->
+ <!-- executable Name of the executable used to run the -->
+ <!-- script. [perl] -->
+ <!-- -->
+ <!-- envHttpHeaders A regular expression used to select the HTTP -->
+ <!-- headers passed to the CGI process as -->
+ <!-- environment variables. Note that headers are -->
+ <!-- converted to upper case before matching and -->
+ <!-- that the entire header name must match the -->
+ <!-- pattern. -->
+ <!-- [ACCEPT[-0-9A-Z]*|CACHE-CONTROL|COOKIE|HOST| -->
+ <!-- IF-[-0-9A-Z]*|REFERER|USER-AGENT] -->
+ <!-- -->
+ <!-- environment-variable- An environment to be set for the execution -->
+ <!-- environment of the CGI script. The name of -->
+ <!-- variable is taken from the parameter name. -->
+ <!-- To configure an environment variable named -->
+ <!-- FOO, configure a parameter named -->
+ <!-- environment-variable-FOO. The parameter value -->
+ <!-- is used as the environment variable value. -->
+ <!-- The default is no environment variables. -->
+ <!-- -->
+ <!-- parameterEncoding Name of parameter encoding to be used with -->
+ <!-- CGI servlet. -->
+ <!-- [System.getProperty("file.encoding","UTF-8")] -->
+ <!-- -->
+ <!-- passShellEnvironment Should the shell environment variables (if -->
+ <!-- any) be passed to the CGI script? [false] -->
+ <!-- -->
+ <!-- stderrTimeout The time (in milliseconds) to wait for the -->
+ <!-- reading of stderr to complete before -->
+ <!-- terminating the CGI process. [2000] -->
+
+<!--
+ <servlet>
+ <servlet-name>cgi</servlet-name>
+ <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
+ <init-param>
+ <param-name>cgiPathPrefix</param-name>
+ <param-value>WEB-INF/cgi</param-value>
+ </init-param>
+ <load-on-startup>5</load-on-startup>
+ </servlet>
+-->
+
+
+ <!-- ================ Built In Servlet Mappings ========================= -->
+
+
+ <!-- The servlet mappings for the built in servlets defined above. Note -->
+ <!-- that, by default, the CGI and SSI servlets are *not* mapped. You -->
+ <!-- must uncomment these mappings (or add them to your application's own -->
+ <!-- web.xml deployment descriptor) to enable these services -->
+
+ <!-- The mapping for the default servlet -->
+ <servlet-mapping>
+ <servlet-name>default</servlet-name>
+ <url-pattern>/</url-pattern>
+ </servlet-mapping>
+
+ <!-- The mappings for the JSP servlet -->
+ <servlet-mapping>
+ <servlet-name>jsp</servlet-name>
+ <url-pattern>*.jsp</url-pattern>
+ <url-pattern>*.jspx</url-pattern>
+ </servlet-mapping>
+
+ <!-- The mapping for the SSI servlet -->
+<!--
+ <servlet-mapping>
+ <servlet-name>ssi</servlet-name>
+ <url-pattern>*.shtml</url-pattern>
+ </servlet-mapping>
+-->
+
+ <!-- The mapping for the CGI Gateway servlet -->
+
+<!--
+ <servlet-mapping>
+ <servlet-name>cgi</servlet-name>
+ <url-pattern>/cgi-bin/*</url-pattern>
+ </servlet-mapping>
+-->
+
+
+ <!-- ================== Built In Filter Definitions ===================== -->
+
+ <!-- A filter that sets various security related HTTP Response headers. -->
+ <!-- This filter supports the following initialization parameters -->
+ <!-- (default values are in square brackets): -->
+ <!-- -->
+ <!-- hstsEnabled Should the HTTP Strict Transport Security -->
+ <!-- (HSTS) header be added to the response? See -->
+ <!-- RFC 6797 for more information on HSTS. [true] -->
+ <!-- -->
+ <!-- hstsMaxAgeSeconds The max age value that should be used in the -->
+ <!-- HSTS header. Negative values will be treated -->
+ <!-- as zero. [0] -->
+ <!-- -->
+ <!-- hstsIncludeSubDomains -->
+ <!-- Should the includeSubDomains parameter be -->
+ <!-- included in the HSTS header. -->
+ <!-- -->
+ <!-- antiClickJackingEnabled -->
+ <!-- Should the anti click-jacking header -->
+ <!-- X-Frame-Options be added to every response? -->
+ <!-- [true] -->
+ <!-- -->
+ <!-- antiClickJackingOption -->
+ <!-- What value should be used for the header. Must -->
+ <!-- be one of DENY, SAMEORIGIN, ALLOW-FROM -->
+ <!-- (case-insensitive). [DENY] -->
+ <!-- -->
+ <!-- antiClickJackingUri IF ALLOW-FROM is used, what URI should be -->
+ <!-- allowed? [] -->
+ <!-- -->
+ <!-- blockContentTypeSniffingEnabled -->
+ <!-- Should the header that blocks content type -->
+ <!-- sniffing be added to every response? [true] -->
+<!--
+ <filter>
+ <filter-name>httpHeaderSecurity</filter-name>
+ <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
+ <async-supported>true</async-supported>
+ </filter>
+-->
+
+ <!-- A filter that sets character encoding that is used to decode -->
+ <!-- parameters in a POST request -->
+<!--
+ <filter>
+ <filter-name>setCharacterEncodingFilter</filter-name>
+ <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
+ <init-param>
+ <param-name>encoding</param-name>
+ <param-value>UTF-8</param-value>
+ </init-param>
+ <async-supported>true</async-supported>
+ </filter>
+-->
+
+ <!-- A filter that triggers request parameters parsing and rejects the -->
+ <!-- request if some parameters were skipped because of parsing errors or -->
+ <!-- request size limitations. -->
+<!--
+ <filter>
+ <filter-name>failedRequestFilter</filter-name>
+ <filter-class>
+ org.apache.catalina.filters.FailedRequestFilter
+ </filter-class>
+ <async-supported>true</async-supported>
+ </filter>
+-->
+
+
+ <!-- NOTE: An SSI Servlet is also available as an alternative SSI -->
+ <!-- implementation. Use either the Servlet or the Filter but NOT both. -->
+ <!-- -->
+ <!-- Server Side Includes processing filter, which processes SSI -->
+ <!-- directives in HTML pages consistent with similar support in web -->
+ <!-- servers like Apache. Traditionally, this filter is mapped to the -->
+ <!-- URL pattern "*.shtml", though it can be mapped to "*" as it will -->
+ <!-- selectively enable/disable SSI processing based on mime types. For -->
+ <!-- this to work you will need to uncomment the .shtml mime type -->
+ <!-- definition towards the bottom of this file. -->
+ <!-- The contentType init param allows you to apply SSI processing to JSP -->
+ <!-- pages, JavaScript, or any other content you wish. This filter -->
+ <!-- supports the following initialization parameters (default values are -->
+ <!-- in square brackets): -->
+ <!-- -->
+ <!-- contentType A regex pattern that must be matched before -->
+ <!-- SSI processing is applied. -->
+ <!-- [text/x-server-parsed-html(;.*)?] -->
+ <!-- -->
+ <!-- debug Debugging detail level for messages logged -->
+ <!-- by this servlet. [0] -->
+ <!-- -->
+ <!-- expires The number of seconds before a page with SSI -->
+ <!-- directives will expire. [No default] -->
+ <!-- -->
+ <!-- isVirtualWebappRelative -->
+ <!-- Should "virtual" paths be interpreted as -->
+ <!-- relative to the context root, instead of -->
+ <!-- the server root? [false] -->
+ <!-- -->
+ <!-- allowExec Is use of the exec command enabled? [false] -->
+
+<!--
+ <filter>
+ <filter-name>ssi</filter-name>
+ <filter-class>
+ org.apache.catalina.ssi.SSIFilter
+ </filter-class>
+ <init-param>
+ <param-name>contentType</param-name>
+ <param-value>text/x-server-parsed-html(;.*)?</param-value>
+ </init-param>
+ <init-param>
+ <param-name>debug</param-name>
+ <param-value>0</param-value>
+ </init-param>
+ <init-param>
+ <param-name>expires</param-name>
+ <param-value>666</param-value>
+ </init-param>
+ <init-param>
+ <param-name>isVirtualWebappRelative</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ </filter>
+-->
+
+
+ <!-- ==================== Built In Filter Mappings ====================== -->
+
+ <!-- The mapping for the HTTP header security Filter -->
+<!--
+ <filter-mapping>
+ <filter-name>httpHeaderSecurity</filter-name>
+ <url-pattern>/*</url-pattern>
+ <dispatcher>REQUEST</dispatcher>
+ </filter-mapping>
+-->
+
+ <!-- The mapping for the Set Character Encoding Filter -->
+<!--
+ <filter-mapping>
+ <filter-name>setCharacterEncodingFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+-->
+
+ <!-- The mapping for the Failed Request Filter -->
+<!--
+ <filter-mapping>
+ <filter-name>failedRequestFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+-->
+
+ <!-- The mapping for the SSI Filter -->
+<!--
+ <filter-mapping>
+ <filter-name>ssi</filter-name>
+ <url-pattern>*.shtml</url-pattern>
+ </filter-mapping>
+-->
+
+
+ <!-- ==================== Default Session Configuration ================= -->
+ <!-- You can set the default session timeout (in minutes) for all newly -->
+ <!-- created sessions by modifying the value below. -->
+
+ <session-config>
+ <session-timeout>30</session-timeout>
+ </session-config>
+
+
+ <!-- ===================== Default MIME Type Mappings =================== -->
+ <!-- When serving static resources, Tomcat will automatically generate -->
+ <!-- a "Content-Type" header based on the resource's filename extension, -->
+ <!-- based on these mappings. Additional mappings can be added here (to -->
+ <!-- apply to all web applications), or in your own application's web.xml -->
+ <!-- deployment descriptor. -->
+ <!-- Note: Extensions are always matched in a case-insensitive manner. -->
+
+ <mime-mapping>
+ <extension>123</extension>
+ <mime-type>application/vnd.lotus-1-2-3</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>3dml</extension>
+ <mime-type>text/vnd.in3d.3dml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>3ds</extension>
+ <mime-type>image/x-3ds</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>3g2</extension>
+ <mime-type>video/3gpp2</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>3gp</extension>
+ <mime-type>video/3gpp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>7z</extension>
+ <mime-type>application/x-7z-compressed</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>aab</extension>
+ <mime-type>application/x-authorware-bin</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>aac</extension>
+ <mime-type>audio/x-aac</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>aam</extension>
+ <mime-type>application/x-authorware-map</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>aas</extension>
+ <mime-type>application/x-authorware-seg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>abs</extension>
+ <mime-type>audio/x-mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>abw</extension>
+ <mime-type>application/x-abiword</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ac</extension>
+ <mime-type>application/pkix-attr-cert</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>acc</extension>
+ <mime-type>application/vnd.americandynamics.acc</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ace</extension>
+ <mime-type>application/x-ace-compressed</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>acu</extension>
+ <mime-type>application/vnd.acucobol</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>acutc</extension>
+ <mime-type>application/vnd.acucorp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>adp</extension>
+ <mime-type>audio/adpcm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>aep</extension>
+ <mime-type>application/vnd.audiograph</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>afm</extension>
+ <mime-type>application/x-font-type1</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>afp</extension>
+ <mime-type>application/vnd.ibm.modcap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ahead</extension>
+ <mime-type>application/vnd.ahead.space</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ai</extension>
+ <mime-type>application/postscript</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>aif</extension>
+ <mime-type>audio/x-aiff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>aifc</extension>
+ <mime-type>audio/x-aiff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>aiff</extension>
+ <mime-type>audio/x-aiff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>aim</extension>
+ <mime-type>application/x-aim</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>air</extension>
+ <mime-type>application/vnd.adobe.air-application-installer-package+zip</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ait</extension>
+ <mime-type>application/vnd.dvb.ait</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ami</extension>
+ <mime-type>application/vnd.amiga.ami</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>anx</extension>
+ <mime-type>application/annodex</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>apk</extension>
+ <mime-type>application/vnd.android.package-archive</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>appcache</extension>
+ <mime-type>text/cache-manifest</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>application</extension>
+ <mime-type>application/x-ms-application</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>apr</extension>
+ <mime-type>application/vnd.lotus-approach</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>arc</extension>
+ <mime-type>application/x-freearc</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>art</extension>
+ <mime-type>image/x-jg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>asc</extension>
+ <mime-type>application/pgp-signature</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>asf</extension>
+ <mime-type>video/x-ms-asf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>asm</extension>
+ <mime-type>text/x-asm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>aso</extension>
+ <mime-type>application/vnd.accpac.simply.aso</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>asx</extension>
+ <mime-type>video/x-ms-asf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>atc</extension>
+ <mime-type>application/vnd.acucorp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>atom</extension>
+ <mime-type>application/atom+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>atomcat</extension>
+ <mime-type>application/atomcat+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>atomsvc</extension>
+ <mime-type>application/atomsvc+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>atx</extension>
+ <mime-type>application/vnd.antix.game-component</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>au</extension>
+ <mime-type>audio/basic</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>avi</extension>
+ <mime-type>video/x-msvideo</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>avx</extension>
+ <mime-type>video/x-rad-screenplay</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>aw</extension>
+ <mime-type>application/applixware</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>axa</extension>
+ <mime-type>audio/annodex</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>axv</extension>
+ <mime-type>video/annodex</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>azf</extension>
+ <mime-type>application/vnd.airzip.filesecure.azf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>azs</extension>
+ <mime-type>application/vnd.airzip.filesecure.azs</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>azw</extension>
+ <mime-type>application/vnd.amazon.ebook</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>bat</extension>
+ <mime-type>application/x-msdownload</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>bcpio</extension>
+ <mime-type>application/x-bcpio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>bdf</extension>
+ <mime-type>application/x-font-bdf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>bdm</extension>
+ <mime-type>application/vnd.syncml.dm+wbxml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>bed</extension>
+ <mime-type>application/vnd.realvnc.bed</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>bh2</extension>
+ <mime-type>application/vnd.fujitsu.oasysprs</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>bin</extension>
+ <mime-type>application/octet-stream</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>blb</extension>
+ <mime-type>application/x-blorb</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>blorb</extension>
+ <mime-type>application/x-blorb</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>bmi</extension>
+ <mime-type>application/vnd.bmi</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>bmp</extension>
+ <mime-type>image/bmp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>body</extension>
+ <mime-type>text/html</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>book</extension>
+ <mime-type>application/vnd.framemaker</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>box</extension>
+ <mime-type>application/vnd.previewsystems.box</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>boz</extension>
+ <mime-type>application/x-bzip2</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>bpk</extension>
+ <mime-type>application/octet-stream</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>btif</extension>
+ <mime-type>image/prs.btif</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>bz</extension>
+ <mime-type>application/x-bzip</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>bz2</extension>
+ <mime-type>application/x-bzip2</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>c</extension>
+ <mime-type>text/x-c</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>c11amc</extension>
+ <mime-type>application/vnd.cluetrust.cartomobile-config</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>c11amz</extension>
+ <mime-type>application/vnd.cluetrust.cartomobile-config-pkg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>c4d</extension>
+ <mime-type>application/vnd.clonk.c4group</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>c4f</extension>
+ <mime-type>application/vnd.clonk.c4group</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>c4g</extension>
+ <mime-type>application/vnd.clonk.c4group</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>c4p</extension>
+ <mime-type>application/vnd.clonk.c4group</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>c4u</extension>
+ <mime-type>application/vnd.clonk.c4group</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cab</extension>
+ <mime-type>application/vnd.ms-cab-compressed</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>caf</extension>
+ <mime-type>audio/x-caf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cap</extension>
+ <mime-type>application/vnd.tcpdump.pcap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>car</extension>
+ <mime-type>application/vnd.curl.car</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cat</extension>
+ <mime-type>application/vnd.ms-pki.seccat</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cb7</extension>
+ <mime-type>application/x-cbr</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cba</extension>
+ <mime-type>application/x-cbr</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cbr</extension>
+ <mime-type>application/x-cbr</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cbt</extension>
+ <mime-type>application/x-cbr</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cbz</extension>
+ <mime-type>application/x-cbr</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cc</extension>
+ <mime-type>text/x-c</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cct</extension>
+ <mime-type>application/x-director</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ccxml</extension>
+ <mime-type>application/ccxml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cdbcmsg</extension>
+ <mime-type>application/vnd.contact.cmsg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cdf</extension>
+ <mime-type>application/x-cdf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cdkey</extension>
+ <mime-type>application/vnd.mediastation.cdkey</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cdmia</extension>
+ <mime-type>application/cdmi-capability</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cdmic</extension>
+ <mime-type>application/cdmi-container</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cdmid</extension>
+ <mime-type>application/cdmi-domain</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cdmio</extension>
+ <mime-type>application/cdmi-object</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cdmiq</extension>
+ <mime-type>application/cdmi-queue</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cdx</extension>
+ <mime-type>chemical/x-cdx</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cdxml</extension>
+ <mime-type>application/vnd.chemdraw+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cdy</extension>
+ <mime-type>application/vnd.cinderella</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cer</extension>
+ <mime-type>application/pkix-cert</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cfs</extension>
+ <mime-type>application/x-cfs-compressed</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cgm</extension>
+ <mime-type>image/cgm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>chat</extension>
+ <mime-type>application/x-chat</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>chm</extension>
+ <mime-type>application/vnd.ms-htmlhelp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>chrt</extension>
+ <mime-type>application/vnd.kde.kchart</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cif</extension>
+ <mime-type>chemical/x-cif</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cii</extension>
+ <mime-type>application/vnd.anser-web-certificate-issue-initiation</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cil</extension>
+ <mime-type>application/vnd.ms-artgalry</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cla</extension>
+ <mime-type>application/vnd.claymore</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>class</extension>
+ <mime-type>application/java</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>clkk</extension>
+ <mime-type>application/vnd.crick.clicker.keyboard</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>clkp</extension>
+ <mime-type>application/vnd.crick.clicker.palette</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>clkt</extension>
+ <mime-type>application/vnd.crick.clicker.template</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>clkw</extension>
+ <mime-type>application/vnd.crick.clicker.wordbank</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>clkx</extension>
+ <mime-type>application/vnd.crick.clicker</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>clp</extension>
+ <mime-type>application/x-msclip</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cmc</extension>
+ <mime-type>application/vnd.cosmocaller</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cmdf</extension>
+ <mime-type>chemical/x-cmdf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cml</extension>
+ <mime-type>chemical/x-cml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cmp</extension>
+ <mime-type>application/vnd.yellowriver-custom-menu</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cmx</extension>
+ <mime-type>image/x-cmx</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cod</extension>
+ <mime-type>application/vnd.rim.cod</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>com</extension>
+ <mime-type>application/x-msdownload</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>conf</extension>
+ <mime-type>text/plain</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cpio</extension>
+ <mime-type>application/x-cpio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cpp</extension>
+ <mime-type>text/x-c</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cpt</extension>
+ <mime-type>application/mac-compactpro</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>crd</extension>
+ <mime-type>application/x-mscardfile</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>crl</extension>
+ <mime-type>application/pkix-crl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>crt</extension>
+ <mime-type>application/x-x509-ca-cert</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cryptonote</extension>
+ <mime-type>application/vnd.rig.cryptonote</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>csh</extension>
+ <mime-type>application/x-csh</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>csml</extension>
+ <mime-type>chemical/x-csml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>csp</extension>
+ <mime-type>application/vnd.commonspace</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>css</extension>
+ <mime-type>text/css</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cst</extension>
+ <mime-type>application/x-director</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>csv</extension>
+ <mime-type>text/csv</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cu</extension>
+ <mime-type>application/cu-seeme</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>curl</extension>
+ <mime-type>text/vnd.curl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cww</extension>
+ <mime-type>application/prs.cww</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cxt</extension>
+ <mime-type>application/x-director</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cxx</extension>
+ <mime-type>text/x-c</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dae</extension>
+ <mime-type>model/vnd.collada+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>daf</extension>
+ <mime-type>application/vnd.mobius.daf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dart</extension>
+ <mime-type>application/vnd.dart</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dataless</extension>
+ <mime-type>application/vnd.fdsn.seed</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>davmount</extension>
+ <mime-type>application/davmount+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dbk</extension>
+ <mime-type>application/docbook+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dcr</extension>
+ <mime-type>application/x-director</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dcurl</extension>
+ <mime-type>text/vnd.curl.dcurl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dd2</extension>
+ <mime-type>application/vnd.oma.dd2+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ddd</extension>
+ <mime-type>application/vnd.fujixerox.ddd</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>deb</extension>
+ <mime-type>application/x-debian-package</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>def</extension>
+ <mime-type>text/plain</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>deploy</extension>
+ <mime-type>application/octet-stream</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>der</extension>
+ <mime-type>application/x-x509-ca-cert</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dfac</extension>
+ <mime-type>application/vnd.dreamfactory</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dgc</extension>
+ <mime-type>application/x-dgc-compressed</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dib</extension>
+ <mime-type>image/bmp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dic</extension>
+ <mime-type>text/x-c</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dir</extension>
+ <mime-type>application/x-director</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dis</extension>
+ <mime-type>application/vnd.mobius.dis</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dist</extension>
+ <mime-type>application/octet-stream</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>distz</extension>
+ <mime-type>application/octet-stream</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>djv</extension>
+ <mime-type>image/vnd.djvu</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>djvu</extension>
+ <mime-type>image/vnd.djvu</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dll</extension>
+ <mime-type>application/x-msdownload</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dmg</extension>
+ <mime-type>application/x-apple-diskimage</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dmp</extension>
+ <mime-type>application/vnd.tcpdump.pcap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dms</extension>
+ <mime-type>application/octet-stream</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dna</extension>
+ <mime-type>application/vnd.dna</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>doc</extension>
+ <mime-type>application/msword</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>docm</extension>
+ <mime-type>application/vnd.ms-word.document.macroenabled.12</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>docx</extension>
+ <mime-type>application/vnd.openxmlformats-officedocument.wordprocessingml.document</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dot</extension>
+ <mime-type>application/msword</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dotm</extension>
+ <mime-type>application/vnd.ms-word.template.macroenabled.12</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dotx</extension>
+ <mime-type>application/vnd.openxmlformats-officedocument.wordprocessingml.template</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dp</extension>
+ <mime-type>application/vnd.osgi.dp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dpg</extension>
+ <mime-type>application/vnd.dpgraph</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dra</extension>
+ <mime-type>audio/vnd.dra</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dsc</extension>
+ <mime-type>text/prs.lines.tag</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dssc</extension>
+ <mime-type>application/dssc+der</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dtb</extension>
+ <mime-type>application/x-dtbook+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dtd</extension>
+ <mime-type>application/xml-dtd</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dts</extension>
+ <mime-type>audio/vnd.dts</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dtshd</extension>
+ <mime-type>audio/vnd.dts.hd</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dump</extension>
+ <mime-type>application/octet-stream</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dv</extension>
+ <mime-type>video/x-dv</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dvb</extension>
+ <mime-type>video/vnd.dvb.file</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dvi</extension>
+ <mime-type>application/x-dvi</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dwf</extension>
+ <mime-type>model/vnd.dwf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dwg</extension>
+ <mime-type>image/vnd.dwg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dxf</extension>
+ <mime-type>image/vnd.dxf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dxp</extension>
+ <mime-type>application/vnd.spotfire.dxp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dxr</extension>
+ <mime-type>application/x-director</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ecelp4800</extension>
+ <mime-type>audio/vnd.nuera.ecelp4800</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ecelp7470</extension>
+ <mime-type>audio/vnd.nuera.ecelp7470</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ecelp9600</extension>
+ <mime-type>audio/vnd.nuera.ecelp9600</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ecma</extension>
+ <mime-type>application/ecmascript</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>edm</extension>
+ <mime-type>application/vnd.novadigm.edm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>edx</extension>
+ <mime-type>application/vnd.novadigm.edx</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>efif</extension>
+ <mime-type>application/vnd.picsel</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ei6</extension>
+ <mime-type>application/vnd.pg.osasli</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>elc</extension>
+ <mime-type>application/octet-stream</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>emf</extension>
+ <mime-type>application/x-msmetafile</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>eml</extension>
+ <mime-type>message/rfc822</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>emma</extension>
+ <mime-type>application/emma+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>emz</extension>
+ <mime-type>application/x-msmetafile</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>eol</extension>
+ <mime-type>audio/vnd.digital-winds</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>eot</extension>
+ <mime-type>application/vnd.ms-fontobject</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>eps</extension>
+ <mime-type>application/postscript</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>epub</extension>
+ <mime-type>application/epub+zip</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>es3</extension>
+ <mime-type>application/vnd.eszigno3+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>esa</extension>
+ <mime-type>application/vnd.osgi.subsystem</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>esf</extension>
+ <mime-type>application/vnd.epson.esf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>et3</extension>
+ <mime-type>application/vnd.eszigno3+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>etx</extension>
+ <mime-type>text/x-setext</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>eva</extension>
+ <mime-type>application/x-eva</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>evy</extension>
+ <mime-type>application/x-envoy</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>exe</extension>
+ <mime-type>application/octet-stream</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>exi</extension>
+ <mime-type>application/exi</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ext</extension>
+ <mime-type>application/vnd.novadigm.ext</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ez</extension>
+ <mime-type>application/andrew-inset</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ez2</extension>
+ <mime-type>application/vnd.ezpix-album</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ez3</extension>
+ <mime-type>application/vnd.ezpix-package</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>f</extension>
+ <mime-type>text/x-fortran</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>f4v</extension>
+ <mime-type>video/x-f4v</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>f77</extension>
+ <mime-type>text/x-fortran</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>f90</extension>
+ <mime-type>text/x-fortran</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fbs</extension>
+ <mime-type>image/vnd.fastbidsheet</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fcdt</extension>
+ <mime-type>application/vnd.adobe.formscentral.fcdt</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fcs</extension>
+ <mime-type>application/vnd.isac.fcs</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fdf</extension>
+ <mime-type>application/vnd.fdf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fe_launch</extension>
+ <mime-type>application/vnd.denovo.fcselayout-link</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fg5</extension>
+ <mime-type>application/vnd.fujitsu.oasysgp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fgd</extension>
+ <mime-type>application/x-director</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fh</extension>
+ <mime-type>image/x-freehand</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fh4</extension>
+ <mime-type>image/x-freehand</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fh5</extension>
+ <mime-type>image/x-freehand</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fh7</extension>
+ <mime-type>image/x-freehand</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fhc</extension>
+ <mime-type>image/x-freehand</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fig</extension>
+ <mime-type>application/x-xfig</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>flac</extension>
+ <mime-type>audio/flac</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fli</extension>
+ <mime-type>video/x-fli</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>flo</extension>
+ <mime-type>application/vnd.micrografx.flo</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>flv</extension>
+ <mime-type>video/x-flv</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>flw</extension>
+ <mime-type>application/vnd.kde.kivio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>flx</extension>
+ <mime-type>text/vnd.fmi.flexstor</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fly</extension>
+ <mime-type>text/vnd.fly</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fm</extension>
+ <mime-type>application/vnd.framemaker</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fnc</extension>
+ <mime-type>application/vnd.frogans.fnc</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>for</extension>
+ <mime-type>text/x-fortran</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fpx</extension>
+ <mime-type>image/vnd.fpx</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>frame</extension>
+ <mime-type>application/vnd.framemaker</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fsc</extension>
+ <mime-type>application/vnd.fsc.weblaunch</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fst</extension>
+ <mime-type>image/vnd.fst</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ftc</extension>
+ <mime-type>application/vnd.fluxtime.clip</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fti</extension>
+ <mime-type>application/vnd.anser-web-funds-transfer-initiation</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fvt</extension>
+ <mime-type>video/vnd.fvt</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fxp</extension>
+ <mime-type>application/vnd.adobe.fxp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fxpl</extension>
+ <mime-type>application/vnd.adobe.fxp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>fzs</extension>
+ <mime-type>application/vnd.fuzzysheet</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>g2w</extension>
+ <mime-type>application/vnd.geoplan</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>g3</extension>
+ <mime-type>image/g3fax</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>g3w</extension>
+ <mime-type>application/vnd.geospace</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gac</extension>
+ <mime-type>application/vnd.groove-account</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gam</extension>
+ <mime-type>application/x-tads</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gbr</extension>
+ <mime-type>application/rpki-ghostbusters</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gca</extension>
+ <mime-type>application/x-gca-compressed</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gdl</extension>
+ <mime-type>model/vnd.gdl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>geo</extension>
+ <mime-type>application/vnd.dynageo</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gex</extension>
+ <mime-type>application/vnd.geometry-explorer</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ggb</extension>
+ <mime-type>application/vnd.geogebra.file</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ggt</extension>
+ <mime-type>application/vnd.geogebra.tool</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ghf</extension>
+ <mime-type>application/vnd.groove-help</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gif</extension>
+ <mime-type>image/gif</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gim</extension>
+ <mime-type>application/vnd.groove-identity-message</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gml</extension>
+ <mime-type>application/gml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gmx</extension>
+ <mime-type>application/vnd.gmx</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gnumeric</extension>
+ <mime-type>application/x-gnumeric</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gph</extension>
+ <mime-type>application/vnd.flographit</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gpx</extension>
+ <mime-type>application/gpx+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gqf</extension>
+ <mime-type>application/vnd.grafeq</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gqs</extension>
+ <mime-type>application/vnd.grafeq</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gram</extension>
+ <mime-type>application/srgs</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gramps</extension>
+ <mime-type>application/x-gramps-xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gre</extension>
+ <mime-type>application/vnd.geometry-explorer</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>grv</extension>
+ <mime-type>application/vnd.groove-injector</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>grxml</extension>
+ <mime-type>application/srgs+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gsf</extension>
+ <mime-type>application/x-font-ghostscript</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gtar</extension>
+ <mime-type>application/x-gtar</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gtm</extension>
+ <mime-type>application/vnd.groove-tool-message</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gtw</extension>
+ <mime-type>model/vnd.gtw</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gv</extension>
+ <mime-type>text/vnd.graphviz</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gxf</extension>
+ <mime-type>application/gxf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gxt</extension>
+ <mime-type>application/vnd.geonext</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gz</extension>
+ <mime-type>application/x-gzip</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>h</extension>
+ <mime-type>text/x-c</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>h261</extension>
+ <mime-type>video/h261</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>h263</extension>
+ <mime-type>video/h263</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>h264</extension>
+ <mime-type>video/h264</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>hal</extension>
+ <mime-type>application/vnd.hal+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>hbci</extension>
+ <mime-type>application/vnd.hbci</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>hdf</extension>
+ <mime-type>application/x-hdf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>hh</extension>
+ <mime-type>text/x-c</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>hlp</extension>
+ <mime-type>application/winhlp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>hpgl</extension>
+ <mime-type>application/vnd.hp-hpgl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>hpid</extension>
+ <mime-type>application/vnd.hp-hpid</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>hps</extension>
+ <mime-type>application/vnd.hp-hps</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>hqx</extension>
+ <mime-type>application/mac-binhex40</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>htc</extension>
+ <mime-type>text/x-component</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>htke</extension>
+ <mime-type>application/vnd.kenameaapp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>htm</extension>
+ <mime-type>text/html</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>html</extension>
+ <mime-type>text/html</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>hvd</extension>
+ <mime-type>application/vnd.yamaha.hv-dic</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>hvp</extension>
+ <mime-type>application/vnd.yamaha.hv-voice</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>hvs</extension>
+ <mime-type>application/vnd.yamaha.hv-script</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>i2g</extension>
+ <mime-type>application/vnd.intergeo</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>icc</extension>
+ <mime-type>application/vnd.iccprofile</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ice</extension>
+ <mime-type>x-conference/x-cooltalk</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>icm</extension>
+ <mime-type>application/vnd.iccprofile</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ico</extension>
+ <mime-type>image/x-icon</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ics</extension>
+ <mime-type>text/calendar</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ief</extension>
+ <mime-type>image/ief</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ifb</extension>
+ <mime-type>text/calendar</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ifm</extension>
+ <mime-type>application/vnd.shana.informed.formdata</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>iges</extension>
+ <mime-type>model/iges</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>igl</extension>
+ <mime-type>application/vnd.igloader</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>igm</extension>
+ <mime-type>application/vnd.insors.igm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>igs</extension>
+ <mime-type>model/iges</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>igx</extension>
+ <mime-type>application/vnd.micrografx.igx</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>iif</extension>
+ <mime-type>application/vnd.shana.informed.interchange</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>imp</extension>
+ <mime-type>application/vnd.accpac.simply.imp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ims</extension>
+ <mime-type>application/vnd.ms-ims</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>in</extension>
+ <mime-type>text/plain</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ink</extension>
+ <mime-type>application/inkml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>inkml</extension>
+ <mime-type>application/inkml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>install</extension>
+ <mime-type>application/x-install-instructions</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>iota</extension>
+ <mime-type>application/vnd.astraea-software.iota</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ipfix</extension>
+ <mime-type>application/ipfix</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ipk</extension>
+ <mime-type>application/vnd.shana.informed.package</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>irm</extension>
+ <mime-type>application/vnd.ibm.rights-management</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>irp</extension>
+ <mime-type>application/vnd.irepository.package+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>iso</extension>
+ <mime-type>application/x-iso9660-image</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>itp</extension>
+ <mime-type>application/vnd.shana.informed.formtemplate</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ivp</extension>
+ <mime-type>application/vnd.immervision-ivp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ivu</extension>
+ <mime-type>application/vnd.immervision-ivu</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jad</extension>
+ <mime-type>text/vnd.sun.j2me.app-descriptor</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jam</extension>
+ <mime-type>application/vnd.jam</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jar</extension>
+ <mime-type>application/java-archive</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>java</extension>
+ <mime-type>text/x-java-source</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jisp</extension>
+ <mime-type>application/vnd.jisp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jlt</extension>
+ <mime-type>application/vnd.hp-jlyt</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jnlp</extension>
+ <mime-type>application/x-java-jnlp-file</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>joda</extension>
+ <mime-type>application/vnd.joost.joda-archive</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jpe</extension>
+ <mime-type>image/jpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jpeg</extension>
+ <mime-type>image/jpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jpg</extension>
+ <mime-type>image/jpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jpgm</extension>
+ <mime-type>video/jpm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jpgv</extension>
+ <mime-type>video/jpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jpm</extension>
+ <mime-type>video/jpm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>js</extension>
+ <mime-type>application/javascript</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jsf</extension>
+ <mime-type>text/plain</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>json</extension>
+ <mime-type>application/json</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jsonml</extension>
+ <mime-type>application/jsonml+json</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jspf</extension>
+ <mime-type>text/plain</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>kar</extension>
+ <mime-type>audio/midi</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>karbon</extension>
+ <mime-type>application/vnd.kde.karbon</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>kfo</extension>
+ <mime-type>application/vnd.kde.kformula</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>kia</extension>
+ <mime-type>application/vnd.kidspiration</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>kml</extension>
+ <mime-type>application/vnd.google-earth.kml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>kmz</extension>
+ <mime-type>application/vnd.google-earth.kmz</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>kne</extension>
+ <mime-type>application/vnd.kinar</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>knp</extension>
+ <mime-type>application/vnd.kinar</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>kon</extension>
+ <mime-type>application/vnd.kde.kontour</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>kpr</extension>
+ <mime-type>application/vnd.kde.kpresenter</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>kpt</extension>
+ <mime-type>application/vnd.kde.kpresenter</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>kpxx</extension>
+ <mime-type>application/vnd.ds-keypoint</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ksp</extension>
+ <mime-type>application/vnd.kde.kspread</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ktr</extension>
+ <mime-type>application/vnd.kahootz</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ktx</extension>
+ <mime-type>image/ktx</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ktz</extension>
+ <mime-type>application/vnd.kahootz</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>kwd</extension>
+ <mime-type>application/vnd.kde.kword</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>kwt</extension>
+ <mime-type>application/vnd.kde.kword</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>lasxml</extension>
+ <mime-type>application/vnd.las.las+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>latex</extension>
+ <mime-type>application/x-latex</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>lbd</extension>
+ <mime-type>application/vnd.llamagraphics.life-balance.desktop</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>lbe</extension>
+ <mime-type>application/vnd.llamagraphics.life-balance.exchange+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>les</extension>
+ <mime-type>application/vnd.hhe.lesson-player</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>lha</extension>
+ <mime-type>application/x-lzh-compressed</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>link66</extension>
+ <mime-type>application/vnd.route66.link66+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>list</extension>
+ <mime-type>text/plain</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>list3820</extension>
+ <mime-type>application/vnd.ibm.modcap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>listafp</extension>
+ <mime-type>application/vnd.ibm.modcap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>lnk</extension>
+ <mime-type>application/x-ms-shortcut</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>log</extension>
+ <mime-type>text/plain</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>lostxml</extension>
+ <mime-type>application/lost+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>lrf</extension>
+ <mime-type>application/octet-stream</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>lrm</extension>
+ <mime-type>application/vnd.ms-lrm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ltf</extension>
+ <mime-type>application/vnd.frogans.ltf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>lvp</extension>
+ <mime-type>audio/vnd.lucent.voice</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>lwp</extension>
+ <mime-type>application/vnd.lotus-wordpro</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>lzh</extension>
+ <mime-type>application/x-lzh-compressed</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>m13</extension>
+ <mime-type>application/x-msmediaview</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>m14</extension>
+ <mime-type>application/x-msmediaview</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>m1v</extension>
+ <mime-type>video/mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>m21</extension>
+ <mime-type>application/mp21</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>m2a</extension>
+ <mime-type>audio/mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>m2v</extension>
+ <mime-type>video/mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>m3a</extension>
+ <mime-type>audio/mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>m3u</extension>
+ <mime-type>audio/x-mpegurl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>m3u8</extension>
+ <mime-type>application/vnd.apple.mpegurl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>m4a</extension>
+ <mime-type>audio/mp4</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>m4b</extension>
+ <mime-type>audio/mp4</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>m4r</extension>
+ <mime-type>audio/mp4</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>m4u</extension>
+ <mime-type>video/vnd.mpegurl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>m4v</extension>
+ <mime-type>video/mp4</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ma</extension>
+ <mime-type>application/mathematica</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mac</extension>
+ <mime-type>image/x-macpaint</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mads</extension>
+ <mime-type>application/mads+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mag</extension>
+ <mime-type>application/vnd.ecowin.chart</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>maker</extension>
+ <mime-type>application/vnd.framemaker</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>man</extension>
+ <mime-type>text/troff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mar</extension>
+ <mime-type>application/octet-stream</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mathml</extension>
+ <mime-type>application/mathml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mb</extension>
+ <mime-type>application/mathematica</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mbk</extension>
+ <mime-type>application/vnd.mobius.mbk</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mbox</extension>
+ <mime-type>application/mbox</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mc1</extension>
+ <mime-type>application/vnd.medcalcdata</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mcd</extension>
+ <mime-type>application/vnd.mcd</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mcurl</extension>
+ <mime-type>text/vnd.curl.mcurl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mdb</extension>
+ <mime-type>application/x-msaccess</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mdi</extension>
+ <mime-type>image/vnd.ms-modi</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>me</extension>
+ <mime-type>text/troff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mesh</extension>
+ <mime-type>model/mesh</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>meta4</extension>
+ <mime-type>application/metalink4+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>metalink</extension>
+ <mime-type>application/metalink+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mets</extension>
+ <mime-type>application/mets+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mfm</extension>
+ <mime-type>application/vnd.mfmp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mft</extension>
+ <mime-type>application/rpki-manifest</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mgp</extension>
+ <mime-type>application/vnd.osgeo.mapguide.package</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mgz</extension>
+ <mime-type>application/vnd.proteus.magazine</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mid</extension>
+ <mime-type>audio/midi</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>midi</extension>
+ <mime-type>audio/midi</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mie</extension>
+ <mime-type>application/x-mie</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mif</extension>
+ <mime-type>application/x-mif</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mime</extension>
+ <mime-type>message/rfc822</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mj2</extension>
+ <mime-type>video/mj2</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mjp2</extension>
+ <mime-type>video/mj2</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mk3d</extension>
+ <mime-type>video/x-matroska</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mka</extension>
+ <mime-type>audio/x-matroska</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mks</extension>
+ <mime-type>video/x-matroska</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mkv</extension>
+ <mime-type>video/x-matroska</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mlp</extension>
+ <mime-type>application/vnd.dolby.mlp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mmd</extension>
+ <mime-type>application/vnd.chipnuts.karaoke-mmd</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mmf</extension>
+ <mime-type>application/vnd.smaf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mmr</extension>
+ <mime-type>image/vnd.fujixerox.edmics-mmr</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mng</extension>
+ <mime-type>video/x-mng</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mny</extension>
+ <mime-type>application/x-msmoney</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mobi</extension>
+ <mime-type>application/x-mobipocket-ebook</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mods</extension>
+ <mime-type>application/mods+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mov</extension>
+ <mime-type>video/quicktime</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>movie</extension>
+ <mime-type>video/x-sgi-movie</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mp1</extension>
+ <mime-type>audio/mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mp2</extension>
+ <mime-type>audio/mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mp21</extension>
+ <mime-type>application/mp21</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mp2a</extension>
+ <mime-type>audio/mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mp3</extension>
+ <mime-type>audio/mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mp4</extension>
+ <mime-type>video/mp4</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mp4a</extension>
+ <mime-type>audio/mp4</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mp4s</extension>
+ <mime-type>application/mp4</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mp4v</extension>
+ <mime-type>video/mp4</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpa</extension>
+ <mime-type>audio/mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpc</extension>
+ <mime-type>application/vnd.mophun.certificate</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpe</extension>
+ <mime-type>video/mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpeg</extension>
+ <mime-type>video/mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpega</extension>
+ <mime-type>audio/x-mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpg</extension>
+ <mime-type>video/mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpg4</extension>
+ <mime-type>video/mp4</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpga</extension>
+ <mime-type>audio/mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpkg</extension>
+ <mime-type>application/vnd.apple.installer+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpm</extension>
+ <mime-type>application/vnd.blueice.multipass</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpn</extension>
+ <mime-type>application/vnd.mophun.application</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpp</extension>
+ <mime-type>application/vnd.ms-project</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpt</extension>
+ <mime-type>application/vnd.ms-project</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpv2</extension>
+ <mime-type>video/mpeg2</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpy</extension>
+ <mime-type>application/vnd.ibm.minipay</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mqy</extension>
+ <mime-type>application/vnd.mobius.mqy</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mrc</extension>
+ <mime-type>application/marc</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mrcx</extension>
+ <mime-type>application/marcxml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ms</extension>
+ <mime-type>text/troff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mscml</extension>
+ <mime-type>application/mediaservercontrol+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mseed</extension>
+ <mime-type>application/vnd.fdsn.mseed</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mseq</extension>
+ <mime-type>application/vnd.mseq</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>msf</extension>
+ <mime-type>application/vnd.epson.msf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>msh</extension>
+ <mime-type>model/mesh</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>msi</extension>
+ <mime-type>application/x-msdownload</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>msl</extension>
+ <mime-type>application/vnd.mobius.msl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>msty</extension>
+ <mime-type>application/vnd.muvee.style</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mts</extension>
+ <mime-type>model/vnd.mts</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mus</extension>
+ <mime-type>application/vnd.musician</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>musicxml</extension>
+ <mime-type>application/vnd.recordare.musicxml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mvb</extension>
+ <mime-type>application/x-msmediaview</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mwf</extension>
+ <mime-type>application/vnd.mfer</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mxf</extension>
+ <mime-type>application/mxf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mxl</extension>
+ <mime-type>application/vnd.recordare.musicxml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mxml</extension>
+ <mime-type>application/xv+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mxs</extension>
+ <mime-type>application/vnd.triscape.mxs</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mxu</extension>
+ <mime-type>video/vnd.mpegurl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>n-gage</extension>
+ <mime-type>application/vnd.nokia.n-gage.symbian.install</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>n3</extension>
+ <mime-type>text/n3</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>nb</extension>
+ <mime-type>application/mathematica</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>nbp</extension>
+ <mime-type>application/vnd.wolfram.player</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>nc</extension>
+ <mime-type>application/x-netcdf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ncx</extension>
+ <mime-type>application/x-dtbncx+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>nfo</extension>
+ <mime-type>text/x-nfo</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ngdat</extension>
+ <mime-type>application/vnd.nokia.n-gage.data</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>nitf</extension>
+ <mime-type>application/vnd.nitf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>nlu</extension>
+ <mime-type>application/vnd.neurolanguage.nlu</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>nml</extension>
+ <mime-type>application/vnd.enliven</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>nnd</extension>
+ <mime-type>application/vnd.noblenet-directory</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>nns</extension>
+ <mime-type>application/vnd.noblenet-sealer</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>nnw</extension>
+ <mime-type>application/vnd.noblenet-web</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>npx</extension>
+ <mime-type>image/vnd.net-fpx</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>nsc</extension>
+ <mime-type>application/x-conference</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>nsf</extension>
+ <mime-type>application/vnd.lotus-notes</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ntf</extension>
+ <mime-type>application/vnd.nitf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>nzb</extension>
+ <mime-type>application/x-nzb</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>oa2</extension>
+ <mime-type>application/vnd.fujitsu.oasys2</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>oa3</extension>
+ <mime-type>application/vnd.fujitsu.oasys3</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>oas</extension>
+ <mime-type>application/vnd.fujitsu.oasys</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>obd</extension>
+ <mime-type>application/x-msbinder</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>obj</extension>
+ <mime-type>application/x-tgif</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>oda</extension>
+ <mime-type>application/oda</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- OpenDocument Database -->
+ <extension>odb</extension>
+ <mime-type>application/vnd.oasis.opendocument.database</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- OpenDocument Chart -->
+ <extension>odc</extension>
+ <mime-type>application/vnd.oasis.opendocument.chart</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- OpenDocument Formula -->
+ <extension>odf</extension>
+ <mime-type>application/vnd.oasis.opendocument.formula</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>odft</extension>
+ <mime-type>application/vnd.oasis.opendocument.formula-template</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- OpenDocument Drawing -->
+ <extension>odg</extension>
+ <mime-type>application/vnd.oasis.opendocument.graphics</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- OpenDocument Image -->
+ <extension>odi</extension>
+ <mime-type>application/vnd.oasis.opendocument.image</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- OpenDocument Master Document -->
+ <extension>odm</extension>
+ <mime-type>application/vnd.oasis.opendocument.text-master</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- OpenDocument Presentation -->
+ <extension>odp</extension>
+ <mime-type>application/vnd.oasis.opendocument.presentation</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- OpenDocument Spreadsheet -->
+ <extension>ods</extension>
+ <mime-type>application/vnd.oasis.opendocument.spreadsheet</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- OpenDocument Text -->
+ <extension>odt</extension>
+ <mime-type>application/vnd.oasis.opendocument.text</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>oga</extension>
+ <mime-type>audio/ogg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ogg</extension>
+ <mime-type>audio/ogg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ogv</extension>
+ <mime-type>video/ogg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- xiph mime types -->
+ <extension>ogx</extension>
+ <mime-type>application/ogg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>omdoc</extension>
+ <mime-type>application/omdoc+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>onepkg</extension>
+ <mime-type>application/onenote</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>onetmp</extension>
+ <mime-type>application/onenote</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>onetoc</extension>
+ <mime-type>application/onenote</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>onetoc2</extension>
+ <mime-type>application/onenote</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>opf</extension>
+ <mime-type>application/oebps-package+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>opml</extension>
+ <mime-type>text/x-opml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>oprc</extension>
+ <mime-type>application/vnd.palm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>org</extension>
+ <mime-type>application/vnd.lotus-organizer</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>osf</extension>
+ <mime-type>application/vnd.yamaha.openscoreformat</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>osfpvg</extension>
+ <mime-type>application/vnd.yamaha.openscoreformat.osfpvg+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>otc</extension>
+ <mime-type>application/vnd.oasis.opendocument.chart-template</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>otf</extension>
+ <mime-type>font/otf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- OpenDocument Drawing Template -->
+ <extension>otg</extension>
+ <mime-type>application/vnd.oasis.opendocument.graphics-template</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- HTML Document Template -->
+ <extension>oth</extension>
+ <mime-type>application/vnd.oasis.opendocument.text-web</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>oti</extension>
+ <mime-type>application/vnd.oasis.opendocument.image-template</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- OpenDocument Presentation Template -->
+ <extension>otp</extension>
+ <mime-type>application/vnd.oasis.opendocument.presentation-template</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- OpenDocument Spreadsheet Template -->
+ <extension>ots</extension>
+ <mime-type>application/vnd.oasis.opendocument.spreadsheet-template</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- OpenDocument Text Template -->
+ <extension>ott</extension>
+ <mime-type>application/vnd.oasis.opendocument.text-template</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>oxps</extension>
+ <mime-type>application/oxps</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>oxt</extension>
+ <mime-type>application/vnd.openofficeorg.extension</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>p</extension>
+ <mime-type>text/x-pascal</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>p10</extension>
+ <mime-type>application/pkcs10</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>p12</extension>
+ <mime-type>application/x-pkcs12</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>p7b</extension>
+ <mime-type>application/x-pkcs7-certificates</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>p7c</extension>
+ <mime-type>application/pkcs7-mime</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>p7m</extension>
+ <mime-type>application/pkcs7-mime</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>p7r</extension>
+ <mime-type>application/x-pkcs7-certreqresp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>p7s</extension>
+ <mime-type>application/pkcs7-signature</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>p8</extension>
+ <mime-type>application/pkcs8</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pas</extension>
+ <mime-type>text/x-pascal</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>paw</extension>
+ <mime-type>application/vnd.pawaafile</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pbd</extension>
+ <mime-type>application/vnd.powerbuilder6</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pbm</extension>
+ <mime-type>image/x-portable-bitmap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pcap</extension>
+ <mime-type>application/vnd.tcpdump.pcap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pcf</extension>
+ <mime-type>application/x-font-pcf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pcl</extension>
+ <mime-type>application/vnd.hp-pcl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pclxl</extension>
+ <mime-type>application/vnd.hp-pclxl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pct</extension>
+ <mime-type>image/pict</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pcurl</extension>
+ <mime-type>application/vnd.curl.pcurl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pcx</extension>
+ <mime-type>image/x-pcx</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pdb</extension>
+ <mime-type>application/vnd.palm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pdf</extension>
+ <mime-type>application/pdf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pfa</extension>
+ <mime-type>application/x-font-type1</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pfb</extension>
+ <mime-type>application/x-font-type1</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pfm</extension>
+ <mime-type>application/x-font-type1</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pfr</extension>
+ <mime-type>application/font-tdpfr</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pfx</extension>
+ <mime-type>application/x-pkcs12</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pgm</extension>
+ <mime-type>image/x-portable-graymap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pgn</extension>
+ <mime-type>application/x-chess-pgn</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pgp</extension>
+ <mime-type>application/pgp-encrypted</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pic</extension>
+ <mime-type>image/pict</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pict</extension>
+ <mime-type>image/pict</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pkg</extension>
+ <mime-type>application/octet-stream</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pki</extension>
+ <mime-type>application/pkixcmp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pkipath</extension>
+ <mime-type>application/pkix-pkipath</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>plb</extension>
+ <mime-type>application/vnd.3gpp.pic-bw-large</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>plc</extension>
+ <mime-type>application/vnd.mobius.plc</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>plf</extension>
+ <mime-type>application/vnd.pocketlearn</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pls</extension>
+ <mime-type>audio/x-scpls</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pml</extension>
+ <mime-type>application/vnd.ctc-posml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>png</extension>
+ <mime-type>image/png</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pnm</extension>
+ <mime-type>image/x-portable-anymap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pnt</extension>
+ <mime-type>image/x-macpaint</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>portpkg</extension>
+ <mime-type>application/vnd.macports.portpkg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pot</extension>
+ <mime-type>application/vnd.ms-powerpoint</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>potm</extension>
+ <mime-type>application/vnd.ms-powerpoint.template.macroenabled.12</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>potx</extension>
+ <mime-type>application/vnd.openxmlformats-officedocument.presentationml.template</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ppam</extension>
+ <mime-type>application/vnd.ms-powerpoint.addin.macroenabled.12</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ppd</extension>
+ <mime-type>application/vnd.cups-ppd</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ppm</extension>
+ <mime-type>image/x-portable-pixmap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pps</extension>
+ <mime-type>application/vnd.ms-powerpoint</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ppsm</extension>
+ <mime-type>application/vnd.ms-powerpoint.slideshow.macroenabled.12</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ppsx</extension>
+ <mime-type>application/vnd.openxmlformats-officedocument.presentationml.slideshow</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ppt</extension>
+ <mime-type>application/vnd.ms-powerpoint</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pptm</extension>
+ <mime-type>application/vnd.ms-powerpoint.presentation.macroenabled.12</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pptx</extension>
+ <mime-type>application/vnd.openxmlformats-officedocument.presentationml.presentation</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pqa</extension>
+ <mime-type>application/vnd.palm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>prc</extension>
+ <mime-type>application/x-mobipocket-ebook</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pre</extension>
+ <mime-type>application/vnd.lotus-freelance</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>prf</extension>
+ <mime-type>application/pics-rules</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ps</extension>
+ <mime-type>application/postscript</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>psb</extension>
+ <mime-type>application/vnd.3gpp.pic-bw-small</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>psd</extension>
+ <mime-type>image/vnd.adobe.photoshop</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>psf</extension>
+ <mime-type>application/x-font-linux-psf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pskcxml</extension>
+ <mime-type>application/pskc+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ptid</extension>
+ <mime-type>application/vnd.pvi.ptid1</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pub</extension>
+ <mime-type>application/x-mspublisher</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pvb</extension>
+ <mime-type>application/vnd.3gpp.pic-bw-var</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pwn</extension>
+ <mime-type>application/vnd.3m.post-it-notes</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pya</extension>
+ <mime-type>audio/vnd.ms-playready.media.pya</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pyv</extension>
+ <mime-type>video/vnd.ms-playready.media.pyv</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>qam</extension>
+ <mime-type>application/vnd.epson.quickanime</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>qbo</extension>
+ <mime-type>application/vnd.intu.qbo</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>qfx</extension>
+ <mime-type>application/vnd.intu.qfx</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>qps</extension>
+ <mime-type>application/vnd.publishare-delta-tree</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>qt</extension>
+ <mime-type>video/quicktime</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>qti</extension>
+ <mime-type>image/x-quicktime</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>qtif</extension>
+ <mime-type>image/x-quicktime</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>qwd</extension>
+ <mime-type>application/vnd.quark.quarkxpress</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>qwt</extension>
+ <mime-type>application/vnd.quark.quarkxpress</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>qxb</extension>
+ <mime-type>application/vnd.quark.quarkxpress</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>qxd</extension>
+ <mime-type>application/vnd.quark.quarkxpress</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>qxl</extension>
+ <mime-type>application/vnd.quark.quarkxpress</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>qxt</extension>
+ <mime-type>application/vnd.quark.quarkxpress</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ra</extension>
+ <mime-type>audio/x-pn-realaudio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ram</extension>
+ <mime-type>audio/x-pn-realaudio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rar</extension>
+ <mime-type>application/x-rar-compressed</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ras</extension>
+ <mime-type>image/x-cmu-raster</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rcprofile</extension>
+ <mime-type>application/vnd.ipunplugged.rcprofile</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rdf</extension>
+ <mime-type>application/rdf+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rdz</extension>
+ <mime-type>application/vnd.data-vision.rdz</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rep</extension>
+ <mime-type>application/vnd.businessobjects</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>res</extension>
+ <mime-type>application/x-dtbresource+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rgb</extension>
+ <mime-type>image/x-rgb</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rif</extension>
+ <mime-type>application/reginfo+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rip</extension>
+ <mime-type>audio/vnd.rip</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ris</extension>
+ <mime-type>application/x-research-info-systems</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rl</extension>
+ <mime-type>application/resource-lists+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rlc</extension>
+ <mime-type>image/vnd.fujixerox.edmics-rlc</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rld</extension>
+ <mime-type>application/resource-lists-diff+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rm</extension>
+ <mime-type>application/vnd.rn-realmedia</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rmi</extension>
+ <mime-type>audio/midi</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rmp</extension>
+ <mime-type>audio/x-pn-realaudio-plugin</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rms</extension>
+ <mime-type>application/vnd.jcp.javame.midlet-rms</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rmvb</extension>
+ <mime-type>application/vnd.rn-realmedia-vbr</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rnc</extension>
+ <mime-type>application/relax-ng-compact-syntax</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>roa</extension>
+ <mime-type>application/rpki-roa</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>roff</extension>
+ <mime-type>text/troff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rp9</extension>
+ <mime-type>application/vnd.cloanto.rp9</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rpss</extension>
+ <mime-type>application/vnd.nokia.radio-presets</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rpst</extension>
+ <mime-type>application/vnd.nokia.radio-preset</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rq</extension>
+ <mime-type>application/sparql-query</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rs</extension>
+ <mime-type>application/rls-services+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rsd</extension>
+ <mime-type>application/rsd+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rss</extension>
+ <mime-type>application/rss+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rtf</extension>
+ <mime-type>application/rtf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rtx</extension>
+ <mime-type>text/richtext</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>s</extension>
+ <mime-type>text/x-asm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>s3m</extension>
+ <mime-type>audio/s3m</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>saf</extension>
+ <mime-type>application/vnd.yamaha.smaf-audio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sbml</extension>
+ <mime-type>application/sbml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sc</extension>
+ <mime-type>application/vnd.ibm.secure-container</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>scd</extension>
+ <mime-type>application/x-msschedule</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>scm</extension>
+ <mime-type>application/vnd.lotus-screencam</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>scq</extension>
+ <mime-type>application/scvp-cv-request</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>scs</extension>
+ <mime-type>application/scvp-cv-response</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>scurl</extension>
+ <mime-type>text/vnd.curl.scurl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sda</extension>
+ <mime-type>application/vnd.stardivision.draw</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sdc</extension>
+ <mime-type>application/vnd.stardivision.calc</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sdd</extension>
+ <mime-type>application/vnd.stardivision.impress</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sdkd</extension>
+ <mime-type>application/vnd.solent.sdkm+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sdkm</extension>
+ <mime-type>application/vnd.solent.sdkm+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sdp</extension>
+ <mime-type>application/sdp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sdw</extension>
+ <mime-type>application/vnd.stardivision.writer</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>see</extension>
+ <mime-type>application/vnd.seemail</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>seed</extension>
+ <mime-type>application/vnd.fdsn.seed</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sema</extension>
+ <mime-type>application/vnd.sema</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>semd</extension>
+ <mime-type>application/vnd.semd</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>semf</extension>
+ <mime-type>application/vnd.semf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ser</extension>
+ <mime-type>application/java-serialized-object</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>setpay</extension>
+ <mime-type>application/set-payment-initiation</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>setreg</extension>
+ <mime-type>application/set-registration-initiation</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sfd-hdstx</extension>
+ <mime-type>application/vnd.hydrostatix.sof-data</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sfs</extension>
+ <mime-type>application/vnd.spotfire.sfs</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sfv</extension>
+ <mime-type>text/x-sfv</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sgi</extension>
+ <mime-type>image/sgi</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sgl</extension>
+ <mime-type>application/vnd.stardivision.writer-global</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sgm</extension>
+ <mime-type>text/sgml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sgml</extension>
+ <mime-type>text/sgml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sh</extension>
+ <mime-type>application/x-sh</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>shar</extension>
+ <mime-type>application/x-shar</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>shf</extension>
+ <mime-type>application/shf+xml</mime-type>
+ </mime-mapping>
+ <!--
+ <mime-mapping>
+ <extension>shtml</extension>
+ <mime-type>text/x-server-parsed-html</mime-type>
+ </mime-mapping>
+ -->
+ <mime-mapping>
+ <extension>sid</extension>
+ <mime-type>image/x-mrsid-image</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sig</extension>
+ <mime-type>application/pgp-signature</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sil</extension>
+ <mime-type>audio/silk</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>silo</extension>
+ <mime-type>model/mesh</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sis</extension>
+ <mime-type>application/vnd.symbian.install</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sisx</extension>
+ <mime-type>application/vnd.symbian.install</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sit</extension>
+ <mime-type>application/x-stuffit</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sitx</extension>
+ <mime-type>application/x-stuffitx</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>skd</extension>
+ <mime-type>application/vnd.koan</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>skm</extension>
+ <mime-type>application/vnd.koan</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>skp</extension>
+ <mime-type>application/vnd.koan</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>skt</extension>
+ <mime-type>application/vnd.koan</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sldm</extension>
+ <mime-type>application/vnd.ms-powerpoint.slide.macroenabled.12</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sldx</extension>
+ <mime-type>application/vnd.openxmlformats-officedocument.presentationml.slide</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>slt</extension>
+ <mime-type>application/vnd.epson.salt</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sm</extension>
+ <mime-type>application/vnd.stepmania.stepchart</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>smf</extension>
+ <mime-type>application/vnd.stardivision.math</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>smi</extension>
+ <mime-type>application/smil+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>smil</extension>
+ <mime-type>application/smil+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>smv</extension>
+ <mime-type>video/x-smv</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>smzip</extension>
+ <mime-type>application/vnd.stepmania.package</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>snd</extension>
+ <mime-type>audio/basic</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>snf</extension>
+ <mime-type>application/x-font-snf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>so</extension>
+ <mime-type>application/octet-stream</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>spc</extension>
+ <mime-type>application/x-pkcs7-certificates</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>spf</extension>
+ <mime-type>application/vnd.yamaha.smaf-phrase</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>spl</extension>
+ <mime-type>application/x-futuresplash</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>spot</extension>
+ <mime-type>text/vnd.in3d.spot</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>spp</extension>
+ <mime-type>application/scvp-vp-response</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>spq</extension>
+ <mime-type>application/scvp-vp-request</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>spx</extension>
+ <mime-type>audio/ogg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sql</extension>
+ <mime-type>application/x-sql</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>src</extension>
+ <mime-type>application/x-wais-source</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>srt</extension>
+ <mime-type>application/x-subrip</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sru</extension>
+ <mime-type>application/sru+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>srx</extension>
+ <mime-type>application/sparql-results+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ssdl</extension>
+ <mime-type>application/ssdl+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sse</extension>
+ <mime-type>application/vnd.kodak-descriptor</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ssf</extension>
+ <mime-type>application/vnd.epson.ssf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ssml</extension>
+ <mime-type>application/ssml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>st</extension>
+ <mime-type>application/vnd.sailingtracker.track</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>stc</extension>
+ <mime-type>application/vnd.sun.xml.calc.template</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>std</extension>
+ <mime-type>application/vnd.sun.xml.draw.template</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>stf</extension>
+ <mime-type>application/vnd.wt.stf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sti</extension>
+ <mime-type>application/vnd.sun.xml.impress.template</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>stk</extension>
+ <mime-type>application/hyperstudio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>stl</extension>
+ <mime-type>application/vnd.ms-pki.stl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>str</extension>
+ <mime-type>application/vnd.pg.format</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>stw</extension>
+ <mime-type>application/vnd.sun.xml.writer.template</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sub</extension>
+ <mime-type>text/vnd.dvb.subtitle</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sus</extension>
+ <mime-type>application/vnd.sus-calendar</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>susp</extension>
+ <mime-type>application/vnd.sus-calendar</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sv4cpio</extension>
+ <mime-type>application/x-sv4cpio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sv4crc</extension>
+ <mime-type>application/x-sv4crc</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>svc</extension>
+ <mime-type>application/vnd.dvb.service</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>svd</extension>
+ <mime-type>application/vnd.svd</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>svg</extension>
+ <mime-type>image/svg+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>svgz</extension>
+ <mime-type>image/svg+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>swa</extension>
+ <mime-type>application/x-director</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>swf</extension>
+ <mime-type>application/x-shockwave-flash</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>swi</extension>
+ <mime-type>application/vnd.aristanetworks.swi</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sxc</extension>
+ <mime-type>application/vnd.sun.xml.calc</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sxd</extension>
+ <mime-type>application/vnd.sun.xml.draw</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sxg</extension>
+ <mime-type>application/vnd.sun.xml.writer.global</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sxi</extension>
+ <mime-type>application/vnd.sun.xml.impress</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sxm</extension>
+ <mime-type>application/vnd.sun.xml.math</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sxw</extension>
+ <mime-type>application/vnd.sun.xml.writer</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>t</extension>
+ <mime-type>text/troff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>t3</extension>
+ <mime-type>application/x-t3vm-image</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>taglet</extension>
+ <mime-type>application/vnd.mynfc</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tao</extension>
+ <mime-type>application/vnd.tao.intent-module-archive</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tar</extension>
+ <mime-type>application/x-tar</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tcap</extension>
+ <mime-type>application/vnd.3gpp2.tcap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tcl</extension>
+ <mime-type>application/x-tcl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>teacher</extension>
+ <mime-type>application/vnd.smart.teacher</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tei</extension>
+ <mime-type>application/tei+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>teicorpus</extension>
+ <mime-type>application/tei+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tex</extension>
+ <mime-type>application/x-tex</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>texi</extension>
+ <mime-type>application/x-texinfo</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>texinfo</extension>
+ <mime-type>application/x-texinfo</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>text</extension>
+ <mime-type>text/plain</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tfi</extension>
+ <mime-type>application/thraud+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tfm</extension>
+ <mime-type>application/x-tex-tfm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tga</extension>
+ <mime-type>image/x-tga</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>thmx</extension>
+ <mime-type>application/vnd.ms-officetheme</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tif</extension>
+ <mime-type>image/tiff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tiff</extension>
+ <mime-type>image/tiff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tmo</extension>
+ <mime-type>application/vnd.tmobile-livetv</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>torrent</extension>
+ <mime-type>application/x-bittorrent</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tpl</extension>
+ <mime-type>application/vnd.groove-tool-template</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tpt</extension>
+ <mime-type>application/vnd.trid.tpt</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tr</extension>
+ <mime-type>text/troff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tra</extension>
+ <mime-type>application/vnd.trueapp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>trm</extension>
+ <mime-type>application/x-msterminal</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tsd</extension>
+ <mime-type>application/timestamped-data</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tsv</extension>
+ <mime-type>text/tab-separated-values</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ttc</extension>
+ <mime-type>font/collection</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ttf</extension>
+ <mime-type>font/ttf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ttl</extension>
+ <mime-type>text/turtle</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>twd</extension>
+ <mime-type>application/vnd.simtech-mindmapper</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>twds</extension>
+ <mime-type>application/vnd.simtech-mindmapper</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>txd</extension>
+ <mime-type>application/vnd.genomatix.tuxedo</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>txf</extension>
+ <mime-type>application/vnd.mobius.txf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>txt</extension>
+ <mime-type>text/plain</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>u32</extension>
+ <mime-type>application/x-authorware-bin</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>udeb</extension>
+ <mime-type>application/x-debian-package</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ufd</extension>
+ <mime-type>application/vnd.ufdl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ufdl</extension>
+ <mime-type>application/vnd.ufdl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ulw</extension>
+ <mime-type>audio/basic</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ulx</extension>
+ <mime-type>application/x-glulx</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>umj</extension>
+ <mime-type>application/vnd.umajin</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>unityweb</extension>
+ <mime-type>application/vnd.unity</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uoml</extension>
+ <mime-type>application/vnd.uoml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uri</extension>
+ <mime-type>text/uri-list</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uris</extension>
+ <mime-type>text/uri-list</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>urls</extension>
+ <mime-type>text/uri-list</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ustar</extension>
+ <mime-type>application/x-ustar</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>utz</extension>
+ <mime-type>application/vnd.uiq.theme</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uu</extension>
+ <mime-type>text/x-uuencode</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uva</extension>
+ <mime-type>audio/vnd.dece.audio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvd</extension>
+ <mime-type>application/vnd.dece.data</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvf</extension>
+ <mime-type>application/vnd.dece.data</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvg</extension>
+ <mime-type>image/vnd.dece.graphic</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvh</extension>
+ <mime-type>video/vnd.dece.hd</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvi</extension>
+ <mime-type>image/vnd.dece.graphic</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvm</extension>
+ <mime-type>video/vnd.dece.mobile</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvp</extension>
+ <mime-type>video/vnd.dece.pd</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvs</extension>
+ <mime-type>video/vnd.dece.sd</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvt</extension>
+ <mime-type>application/vnd.dece.ttml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvu</extension>
+ <mime-type>video/vnd.uvvu.mp4</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvv</extension>
+ <mime-type>video/vnd.dece.video</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvva</extension>
+ <mime-type>audio/vnd.dece.audio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvvd</extension>
+ <mime-type>application/vnd.dece.data</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvvf</extension>
+ <mime-type>application/vnd.dece.data</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvvg</extension>
+ <mime-type>image/vnd.dece.graphic</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvvh</extension>
+ <mime-type>video/vnd.dece.hd</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvvi</extension>
+ <mime-type>image/vnd.dece.graphic</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvvm</extension>
+ <mime-type>video/vnd.dece.mobile</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvvp</extension>
+ <mime-type>video/vnd.dece.pd</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvvs</extension>
+ <mime-type>video/vnd.dece.sd</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvvt</extension>
+ <mime-type>application/vnd.dece.ttml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvvu</extension>
+ <mime-type>video/vnd.uvvu.mp4</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvvv</extension>
+ <mime-type>video/vnd.dece.video</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvvx</extension>
+ <mime-type>application/vnd.dece.unspecified</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvvz</extension>
+ <mime-type>application/vnd.dece.zip</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvx</extension>
+ <mime-type>application/vnd.dece.unspecified</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>uvz</extension>
+ <mime-type>application/vnd.dece.zip</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vcard</extension>
+ <mime-type>text/vcard</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vcd</extension>
+ <mime-type>application/x-cdlink</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vcf</extension>
+ <mime-type>text/x-vcard</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vcg</extension>
+ <mime-type>application/vnd.groove-vcard</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vcs</extension>
+ <mime-type>text/x-vcalendar</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vcx</extension>
+ <mime-type>application/vnd.vcx</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vis</extension>
+ <mime-type>application/vnd.visionary</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>viv</extension>
+ <mime-type>video/vnd.vivo</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vob</extension>
+ <mime-type>video/x-ms-vob</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vor</extension>
+ <mime-type>application/vnd.stardivision.writer</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vox</extension>
+ <mime-type>application/x-authorware-bin</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vrml</extension>
+ <mime-type>model/vrml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vsd</extension>
+ <mime-type>application/vnd.visio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vsf</extension>
+ <mime-type>application/vnd.vsf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vss</extension>
+ <mime-type>application/vnd.visio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vst</extension>
+ <mime-type>application/vnd.visio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vsw</extension>
+ <mime-type>application/vnd.visio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vtu</extension>
+ <mime-type>model/vnd.vtu</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vxml</extension>
+ <mime-type>application/voicexml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>w3d</extension>
+ <mime-type>application/x-director</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wad</extension>
+ <mime-type>application/x-doom</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wasm</extension>
+ <mime-type>application/wasm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wav</extension>
+ <mime-type>audio/x-wav</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wax</extension>
+ <mime-type>audio/x-ms-wax</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- Wireless Bitmap -->
+ <extension>wbmp</extension>
+ <mime-type>image/vnd.wap.wbmp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wbs</extension>
+ <mime-type>application/vnd.criticaltools.wbs+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wbxml</extension>
+ <mime-type>application/vnd.wap.wbxml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wcm</extension>
+ <mime-type>application/vnd.ms-works</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wdb</extension>
+ <mime-type>application/vnd.ms-works</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wdp</extension>
+ <mime-type>image/vnd.ms-photo</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>weba</extension>
+ <mime-type>audio/webm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>webm</extension>
+ <mime-type>video/webm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>webp</extension>
+ <mime-type>image/webp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wg</extension>
+ <mime-type>application/vnd.pmi.widget</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wgt</extension>
+ <mime-type>application/widget</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wks</extension>
+ <mime-type>application/vnd.ms-works</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wm</extension>
+ <mime-type>video/x-ms-wm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wma</extension>
+ <mime-type>audio/x-ms-wma</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wmd</extension>
+ <mime-type>application/x-ms-wmd</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wmf</extension>
+ <mime-type>application/x-msmetafile</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- WML Source -->
+ <extension>wml</extension>
+ <mime-type>text/vnd.wap.wml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- Compiled WML -->
+ <extension>wmlc</extension>
+ <mime-type>application/vnd.wap.wmlc</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- WML Script Source -->
+ <extension>wmls</extension>
+ <mime-type>text/vnd.wap.wmlscript</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- Compiled WML Script -->
+ <extension>wmlsc</extension>
+ <mime-type>application/vnd.wap.wmlscriptc</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wmv</extension>
+ <mime-type>video/x-ms-wmv</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wmx</extension>
+ <mime-type>video/x-ms-wmx</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wmz</extension>
+ <mime-type>application/x-msmetafile</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>woff</extension>
+ <mime-type>font/woff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>woff2</extension>
+ <mime-type>font/woff2</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wpd</extension>
+ <mime-type>application/vnd.wordperfect</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wpl</extension>
+ <mime-type>application/vnd.ms-wpl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wps</extension>
+ <mime-type>application/vnd.ms-works</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wqd</extension>
+ <mime-type>application/vnd.wqd</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wri</extension>
+ <mime-type>application/x-mswrite</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wrl</extension>
+ <mime-type>model/vrml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wsdl</extension>
+ <mime-type>application/wsdl+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wspolicy</extension>
+ <mime-type>application/wspolicy+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wtb</extension>
+ <mime-type>application/vnd.webturbo</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wvx</extension>
+ <mime-type>video/x-ms-wvx</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>x32</extension>
+ <mime-type>application/x-authorware-bin</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>x3d</extension>
+ <mime-type>model/x3d+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>x3db</extension>
+ <mime-type>model/x3d+binary</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>x3dbz</extension>
+ <mime-type>model/x3d+binary</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>x3dv</extension>
+ <mime-type>model/x3d+vrml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>x3dvz</extension>
+ <mime-type>model/x3d+vrml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>x3dz</extension>
+ <mime-type>model/x3d+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xaml</extension>
+ <mime-type>application/xaml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xap</extension>
+ <mime-type>application/x-silverlight-app</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xar</extension>
+ <mime-type>application/vnd.xara</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xbap</extension>
+ <mime-type>application/x-ms-xbap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xbd</extension>
+ <mime-type>application/vnd.fujixerox.docuworks.binder</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xbm</extension>
+ <mime-type>image/x-xbitmap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xdf</extension>
+ <mime-type>application/xcap-diff+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xdm</extension>
+ <mime-type>application/vnd.syncml.dm+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xdp</extension>
+ <mime-type>application/vnd.adobe.xdp+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xdssc</extension>
+ <mime-type>application/dssc+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xdw</extension>
+ <mime-type>application/vnd.fujixerox.docuworks</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xenc</extension>
+ <mime-type>application/xenc+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xer</extension>
+ <mime-type>application/patch-ops-error+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xfdf</extension>
+ <mime-type>application/vnd.adobe.xfdf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xfdl</extension>
+ <mime-type>application/vnd.xfdl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xht</extension>
+ <mime-type>application/xhtml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xhtml</extension>
+ <mime-type>application/xhtml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xhvml</extension>
+ <mime-type>application/xv+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xif</extension>
+ <mime-type>image/vnd.xiff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xla</extension>
+ <mime-type>application/vnd.ms-excel</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xlam</extension>
+ <mime-type>application/vnd.ms-excel.addin.macroenabled.12</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xlc</extension>
+ <mime-type>application/vnd.ms-excel</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xlf</extension>
+ <mime-type>application/x-xliff+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xlm</extension>
+ <mime-type>application/vnd.ms-excel</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xls</extension>
+ <mime-type>application/vnd.ms-excel</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xlsb</extension>
+ <mime-type>application/vnd.ms-excel.sheet.binary.macroenabled.12</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xlsm</extension>
+ <mime-type>application/vnd.ms-excel.sheet.macroenabled.12</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xlsx</extension>
+ <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xlt</extension>
+ <mime-type>application/vnd.ms-excel</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xltm</extension>
+ <mime-type>application/vnd.ms-excel.template.macroenabled.12</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xltx</extension>
+ <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.template</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xlw</extension>
+ <mime-type>application/vnd.ms-excel</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xm</extension>
+ <mime-type>audio/xm</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xml</extension>
+ <mime-type>application/xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xo</extension>
+ <mime-type>application/vnd.olpc-sugar</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xop</extension>
+ <mime-type>application/xop+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xpi</extension>
+ <mime-type>application/x-xpinstall</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xpl</extension>
+ <mime-type>application/xproc+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xpm</extension>
+ <mime-type>image/x-xpixmap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xpr</extension>
+ <mime-type>application/vnd.is-xpr</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xps</extension>
+ <mime-type>application/vnd.ms-xpsdocument</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xpw</extension>
+ <mime-type>application/vnd.intercon.formnet</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xpx</extension>
+ <mime-type>application/vnd.intercon.formnet</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xsl</extension>
+ <mime-type>application/xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xslt</extension>
+ <mime-type>application/xslt+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xsm</extension>
+ <mime-type>application/vnd.syncml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xspf</extension>
+ <mime-type>application/xspf+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xul</extension>
+ <mime-type>application/vnd.mozilla.xul+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xvm</extension>
+ <mime-type>application/xv+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xvml</extension>
+ <mime-type>application/xv+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xwd</extension>
+ <mime-type>image/x-xwindowdump</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xyz</extension>
+ <mime-type>chemical/x-xyz</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xz</extension>
+ <mime-type>application/x-xz</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>yang</extension>
+ <mime-type>application/yang</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>yin</extension>
+ <mime-type>application/yin+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>z</extension>
+ <mime-type>application/x-compress</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>z1</extension>
+ <mime-type>application/x-zmachine</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>z2</extension>
+ <mime-type>application/x-zmachine</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>z3</extension>
+ <mime-type>application/x-zmachine</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>z4</extension>
+ <mime-type>application/x-zmachine</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>z5</extension>
+ <mime-type>application/x-zmachine</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>z6</extension>
+ <mime-type>application/x-zmachine</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>z7</extension>
+ <mime-type>application/x-zmachine</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>z8</extension>
+ <mime-type>application/x-zmachine</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>zaz</extension>
+ <mime-type>application/vnd.zzazz.deck+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>zip</extension>
+ <mime-type>application/zip</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>zir</extension>
+ <mime-type>application/vnd.zul</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>zirz</extension>
+ <mime-type>application/vnd.zul</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>zmm</extension>
+ <mime-type>application/vnd.handheld-entertainment+xml</mime-type>
+ </mime-mapping>
+
+ <!-- ==================== Default Welcome File List ===================== -->
+ <!-- When a request URI refers to a directory, the default servlet looks -->
+ <!-- for a "welcome file" within that directory and, if present, to the -->
+ <!-- corresponding resource URI for display. -->
+ <!-- If no welcome files are present, the default servlet either serves a -->
+ <!-- directory listing (see default servlet configuration on how to -->
+ <!-- customize) or returns a 404 status, depending on the value of the -->
+ <!-- listings setting. -->
+ <!-- -->
+ <!-- If you define welcome files in your own application's web.xml -->
+ <!-- deployment descriptor, that list *replaces* the list configured -->
+ <!-- here, so be sure to include any of the default values that you wish -->
+ <!-- to use within your application. -->
+
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ <welcome-file>index.htm</welcome-file>
+ <welcome-file>index.jsp</welcome-file>
+ </welcome-file-list>
+
+</web-app>
diff --git a/web/tomcat/lib/annotations-api.jar b/web/tomcat/lib/annotations-api.jar
new file mode 100644
index 0000000..cbd6b76
--- /dev/null
+++ b/web/tomcat/lib/annotations-api.jar
Binary files differ
diff --git a/web/tomcat/lib/catalina-ant.jar b/web/tomcat/lib/catalina-ant.jar
new file mode 100644
index 0000000..1ef3725
--- /dev/null
+++ b/web/tomcat/lib/catalina-ant.jar
Binary files differ
diff --git a/web/tomcat/lib/catalina-ha.jar b/web/tomcat/lib/catalina-ha.jar
new file mode 100644
index 0000000..1ce68c2
--- /dev/null
+++ b/web/tomcat/lib/catalina-ha.jar
Binary files differ
diff --git a/web/tomcat/lib/catalina-storeconfig.jar b/web/tomcat/lib/catalina-storeconfig.jar
new file mode 100644
index 0000000..26d3528
--- /dev/null
+++ b/web/tomcat/lib/catalina-storeconfig.jar
Binary files differ
diff --git a/web/tomcat/lib/catalina-tribes.jar b/web/tomcat/lib/catalina-tribes.jar
new file mode 100644
index 0000000..9ad8841
--- /dev/null
+++ b/web/tomcat/lib/catalina-tribes.jar
Binary files differ
diff --git a/web/tomcat/lib/catalina.jar b/web/tomcat/lib/catalina.jar
new file mode 100644
index 0000000..c0af961
--- /dev/null
+++ b/web/tomcat/lib/catalina.jar
Binary files differ
diff --git a/web/tomcat/lib/ecj-4.6.3.jar b/web/tomcat/lib/ecj-4.6.3.jar
new file mode 100644
index 0000000..04652f3
--- /dev/null
+++ b/web/tomcat/lib/ecj-4.6.3.jar
Binary files differ
diff --git a/web/tomcat/lib/el-api.jar b/web/tomcat/lib/el-api.jar
new file mode 100644
index 0000000..b6948e6
--- /dev/null
+++ b/web/tomcat/lib/el-api.jar
Binary files differ
diff --git a/web/tomcat/lib/jasper-el.jar b/web/tomcat/lib/jasper-el.jar
new file mode 100644
index 0000000..092c155
--- /dev/null
+++ b/web/tomcat/lib/jasper-el.jar
Binary files differ
diff --git a/web/tomcat/lib/jasper.jar b/web/tomcat/lib/jasper.jar
new file mode 100644
index 0000000..345bca3
--- /dev/null
+++ b/web/tomcat/lib/jasper.jar
Binary files differ
diff --git a/web/tomcat/lib/jaspic-api.jar b/web/tomcat/lib/jaspic-api.jar
new file mode 100644
index 0000000..6a8a8ad
--- /dev/null
+++ b/web/tomcat/lib/jaspic-api.jar
Binary files differ
diff --git a/web/tomcat/lib/jsp-api.jar b/web/tomcat/lib/jsp-api.jar
new file mode 100644
index 0000000..36a8cf3
--- /dev/null
+++ b/web/tomcat/lib/jsp-api.jar
Binary files differ
diff --git a/web/tomcat/lib/servlet-api.jar b/web/tomcat/lib/servlet-api.jar
new file mode 100644
index 0000000..0e45541
--- /dev/null
+++ b/web/tomcat/lib/servlet-api.jar
Binary files differ
diff --git a/web/tomcat/lib/tomcat-api.jar b/web/tomcat/lib/tomcat-api.jar
new file mode 100644
index 0000000..e0d935b
--- /dev/null
+++ b/web/tomcat/lib/tomcat-api.jar
Binary files differ
diff --git a/web/tomcat/lib/tomcat-coyote.jar b/web/tomcat/lib/tomcat-coyote.jar
new file mode 100644
index 0000000..c153944
--- /dev/null
+++ b/web/tomcat/lib/tomcat-coyote.jar
Binary files differ
diff --git a/web/tomcat/lib/tomcat-dbcp.jar b/web/tomcat/lib/tomcat-dbcp.jar
new file mode 100644
index 0000000..667b3d0
--- /dev/null
+++ b/web/tomcat/lib/tomcat-dbcp.jar
Binary files differ
diff --git a/web/tomcat/lib/tomcat-i18n-de.jar b/web/tomcat/lib/tomcat-i18n-de.jar
new file mode 100644
index 0000000..623375f
--- /dev/null
+++ b/web/tomcat/lib/tomcat-i18n-de.jar
Binary files differ
diff --git a/web/tomcat/lib/tomcat-i18n-es.jar b/web/tomcat/lib/tomcat-i18n-es.jar
new file mode 100644
index 0000000..40ed079
--- /dev/null
+++ b/web/tomcat/lib/tomcat-i18n-es.jar
Binary files differ
diff --git a/web/tomcat/lib/tomcat-i18n-fr.jar b/web/tomcat/lib/tomcat-i18n-fr.jar
new file mode 100644
index 0000000..ec9dbf0
--- /dev/null
+++ b/web/tomcat/lib/tomcat-i18n-fr.jar
Binary files differ
diff --git a/web/tomcat/lib/tomcat-i18n-ja.jar b/web/tomcat/lib/tomcat-i18n-ja.jar
new file mode 100644
index 0000000..8383fce
--- /dev/null
+++ b/web/tomcat/lib/tomcat-i18n-ja.jar
Binary files differ
diff --git a/web/tomcat/lib/tomcat-i18n-ko.jar b/web/tomcat/lib/tomcat-i18n-ko.jar
new file mode 100644
index 0000000..2971c8e
--- /dev/null
+++ b/web/tomcat/lib/tomcat-i18n-ko.jar
Binary files differ
diff --git a/web/tomcat/lib/tomcat-i18n-ru.jar b/web/tomcat/lib/tomcat-i18n-ru.jar
new file mode 100644
index 0000000..3d0bcfb
--- /dev/null
+++ b/web/tomcat/lib/tomcat-i18n-ru.jar
Binary files differ
diff --git a/web/tomcat/lib/tomcat-i18n-zh-CN.jar b/web/tomcat/lib/tomcat-i18n-zh-CN.jar
new file mode 100644
index 0000000..6b2ff67
--- /dev/null
+++ b/web/tomcat/lib/tomcat-i18n-zh-CN.jar
Binary files differ
diff --git a/web/tomcat/lib/tomcat-jdbc.jar b/web/tomcat/lib/tomcat-jdbc.jar
new file mode 100644
index 0000000..58f91e4
--- /dev/null
+++ b/web/tomcat/lib/tomcat-jdbc.jar
Binary files differ
diff --git a/web/tomcat/lib/tomcat-jni.jar b/web/tomcat/lib/tomcat-jni.jar
new file mode 100644
index 0000000..6b5a7d6
--- /dev/null
+++ b/web/tomcat/lib/tomcat-jni.jar
Binary files differ
diff --git a/web/tomcat/lib/tomcat-util-scan.jar b/web/tomcat/lib/tomcat-util-scan.jar
new file mode 100644
index 0000000..a27e8ff
--- /dev/null
+++ b/web/tomcat/lib/tomcat-util-scan.jar
Binary files differ
diff --git a/web/tomcat/lib/tomcat-util.jar b/web/tomcat/lib/tomcat-util.jar
new file mode 100644
index 0000000..f5778b3
--- /dev/null
+++ b/web/tomcat/lib/tomcat-util.jar
Binary files differ
diff --git a/web/tomcat/lib/tomcat-websocket.jar b/web/tomcat/lib/tomcat-websocket.jar
new file mode 100644
index 0000000..9aea8bf
--- /dev/null
+++ b/web/tomcat/lib/tomcat-websocket.jar
Binary files differ
diff --git a/web/tomcat/lib/websocket-api.jar b/web/tomcat/lib/websocket-api.jar
new file mode 100644
index 0000000..5827fc8
--- /dev/null
+++ b/web/tomcat/lib/websocket-api.jar
Binary files differ
diff --git a/web/tomcat/temp/safeToDelete.tmp b/web/tomcat/temp/safeToDelete.tmp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/web/tomcat/temp/safeToDelete.tmp
diff --git a/web/tomcat/webapps/ROOT/RELEASE-NOTES.txt b/web/tomcat/webapps/ROOT/RELEASE-NOTES.txt
new file mode 100644
index 0000000..0dd3a67
--- /dev/null
+++ b/web/tomcat/webapps/ROOT/RELEASE-NOTES.txt
@@ -0,0 +1,178 @@
+================================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+================================================================================
+
+
+ Apache Tomcat Version 8.5.73
+ Release Notes
+
+
+=========
+CONTENTS:
+=========
+
+* Dependency Changes
+* API Stability
+* Bundled APIs
+* Web application reloading and static fields in shared libraries
+* Security manager URLs
+* Symlinking static resources
+* Viewing the Tomcat Change Log
+* Cryptographic software notice
+* When all else fails
+
+
+===================
+Dependency Changes:
+===================
+Tomcat 8.5 is designed to run on Java 7 and later.
+
+
+==============
+API Stability:
+==============
+
+The public interfaces for the following classes are fixed and will not be
+changed at all during the remaining lifetime of the 8.x series:
+- All classes in the javax namespace
+
+The public interfaces for the following classes may be added to in order to
+resolve bugs and/or add new features. No existing interface method will be
+removed or changed although it may be deprecated.
+- org.apache.catalina.* (excluding sub-packages)
+
+Note: As Tomcat 8 matures, the above list will be added to. The list is not
+ considered complete at this time.
+
+Note: A large number of deprecated methods, fields and configuration options
+ were removed in the transition from 8.0.x to 8.5.x. If any of those
+ removals triggers significant problems for the user community that the
+ deletion may be reverted in a later point release.
+
+The remaining classes are considered part of the Tomcat internals and may change
+without notice between point releases.
+
+
+=============
+Bundled APIs:
+=============
+A standard installation of Tomcat 8.5 makes all of the following APIs available
+for use by web applications (by placing them in "lib"):
+* annotations-api.jar (Annotations package)
+* catalina.jar (Tomcat Catalina implementation)
+* catalina-ant.jar (Tomcat Catalina Ant tasks)
+* catalina-ha.jar (High availability package)
+* catalina-storeconfig.jar (Generation of XML configuration from current state)
+* catalina-tribes.jar (Group communication)
+* ecj-4.6.3.jar (Eclipse JDT Java compiler)
+* el-api.jar (EL 3.0 API)
+* jasper.jar (Jasper 2 Compiler and Runtime)
+* jasper-el.jar (Jasper 2 EL implementation)
+* jsp-api.jar (JSP 2.3 API)
+* servlet-api.jar (Servlet 3.1 API)
+* tomcat-api.jar (Interfaces shared by Catalina and Jasper)
+* tomcat-coyote.jar (Tomcat connectors and utility classes)
+* tomcat-dbcp.jar (package renamed database connection pool based on Commons DBCP 2)
+* tomcat-jdbc.jar (Tomcat's database connection pooling solution)
+* tomcat-jni.jar (Interface to the native component of the APR/native connector)
+* tomcat-util.jar (Various utilities)
+* tomcat-websocket.jar (WebSocket 1.1 implementation)
+* websocket-api.jar (WebSocket 1.1 API)
+
+You can make additional APIs available to all of your web applications by
+putting unpacked classes into a "classes" directory (not created by default),
+or by placing them in JAR files in the "lib" directory.
+
+To override the XML parser implementation or interfaces, use the appropriate
+feature for your JVM. For Java <= 8 use the endorsed standards override
+feature. The default configuration defines JARs located in "endorsed" as endorsed.
+For Java 9+ use the upgradeable modules feature.
+
+
+================================================================
+Web application reloading and static fields in shared libraries:
+================================================================
+Some shared libraries (many are part of the JDK) keep references to objects
+instantiated by the web application. To avoid class loading related problems
+(ClassCastExceptions, messages indicating that the classloader
+is stopped, etc.), the shared libraries state should be reinitialized.
+
+Something which might help is to avoid putting classes which would be
+referenced by a shared static field in the web application classloader,
+and putting them in the shared classloader instead (JARs should be put in the
+"lib" folder, and classes should be put in the "classes" folder).
+
+
+======================
+Security manager URLs:
+======================
+In order to grant security permissions to JARs located inside the
+web application repository, use URLs of the following format
+in your policy file:
+
+file:${catalina.base}/webapps/examples/WEB-INF/lib/driver.jar
+
+
+============================
+Symlinking static resources:
+============================
+By default, Unix symlinks will not work when used in a web application to link
+resources located outside the web application root directory.
+
+This behavior is optional, and the "allowLinking" flag may be used to disable
+the check.
+
+
+==============================
+Viewing the Tomcat Change Log:
+==============================
+The full change log is available from https://tomcat.apache.org and is also
+included in the documentation web application.
+
+
+=============================
+Cryptographic software notice
+=============================
+This distribution includes cryptographic software. The country in
+which you currently reside may have restrictions on the import,
+possession, use, and/or re-export to another country, of
+encryption software. BEFORE using any encryption software, please
+check your country's laws, regulations and policies concerning the
+import, possession, or use, and re-export of encryption software, to
+see if this is permitted. See <http://www.wassenaar.org/> for more
+information.
+
+The U.S. Government Department of Commerce, Bureau of Industry and
+Security (BIS), has classified this software as Export Commodity
+Control Number (ECCN) 5D002.C.1, which includes information security
+software using or performing cryptographic functions with asymmetric
+algorithms. The form and manner of this Apache Software Foundation
+distribution makes it eligible for export under the License Exception
+ENC Technology Software Unrestricted (TSU) exception (see the BIS
+Export Administration Regulations, Section 740.13) for both object
+code and source code.
+
+The following provides more details on the included cryptographic
+software:
+ - Tomcat includes code designed to work with JSSE
+ - Tomcat includes code designed to work with OpenSSL
+
+
+====================
+When all else fails:
+====================
+See the FAQ
+https://tomcat.apache.org/faq/
diff --git a/web/tomcat/webapps/ROOT/WEB-INF/web.xml b/web/tomcat/webapps/ROOT/WEB-INF/web.xml
new file mode 100644
index 0000000..adb10ff
--- /dev/null
+++ b/web/tomcat/webapps/ROOT/WEB-INF/web.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
+ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+ version="3.1"
+ metadata-complete="true">
+
+ <display-name>Welcome to Tomcat</display-name>
+ <description>
+ Welcome to Tomcat
+ </description>
+
+</web-app>
diff --git a/web/tomcat/webapps/ROOT/asf-logo-wide.svg b/web/tomcat/webapps/ROOT/asf-logo-wide.svg
new file mode 100644
index 0000000..5743c42
--- /dev/null
+++ b/web/tomcat/webapps/ROOT/asf-logo-wide.svg
@@ -0,0 +1,295 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Apache_Logo_Horizontal" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ x="0px" y="0px" viewBox="0 0 9835 1713.9" enable-background="new 0 0 9835 1713.9" xml:space="preserve">
+<path fill="#6D6E71" d="M1069.6,296.4v92.2h-11.8v-92.2h-33.7V285h79.4v11.4H1069.6z"/>
+<path fill="#6D6E71" d="M1234.8,388.5V343h-62.4v45.6h-11.8V285h11.8v46.8h62.4V285h11.8v103.6H1234.8z"/>
+<path fill="#6D6E71" d="M1329.2,296.4v34h52.2v11.4h-52.2v35.5h60.4v11.3h-72.2V285h70.3v11.4H1329.2z"/>
+<path fill="#D22128" d="M933.7,1098.5l247.5-591.6h47.5l247.5,591.6h-62.5l-76.7-185h-265.8l-75.8,185H933.7z M1205.4,575.2
+ l-121.7,292.5h240L1205.4,575.2z"/>
+<path fill="#D22128" d="M1540.1,1098.5V506.9h245c101.7,0,175,94.2,175,185.8c0,96.7-68.3,187.5-170,187.5h-192.5v218.3H1540.1z
+ M1597.6,828.5h189.1c70,0,115-64.2,115-135.8c0-74.2-55-134.2-120-134.2h-184.1V828.5z"/>
+<path fill="#D22128" d="M1927.7,1098.5l247.5-591.6h47.5l247.5,591.6h-62.5l-76.7-185h-265.8l-75.8,185H1927.7z M2199.3,575.2
+ l-121.7,292.5h240L2199.3,575.2z"/>
+<path fill="#D22128" d="M2750.1,503.6c105,0,181.6,53.3,218.3,129.2l-46.7,28.3c-37.5-78.3-110.8-105-175-105
+ c-141.7,0-219.1,126.7-219.1,245.8c0,130.8,95.8,249.1,221.6,249.1c66.7,0,145-33.3,182.5-110l48.3,25
+ c-38.3,88.3-143.3,137.5-234.1,137.5c-162.5,0-276.6-155-276.6-305C2469.3,656,2571.7,503.6,2750.1,503.6z"/>
+<path fill="#D22128" d="M3528,506.9v591.6h-58.3V821.9h-350.8v276.6h-57.5V506.9h57.5v263.3h350.8V506.9H3528z"/>
+<path fill="#D22128" d="M4059.1,1046.8v51.7h-397.5V506.9h390v51.7h-332.5v213.3h290V821h-290v225.8H4059.1z"/>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-4229.6655" y1="-4143.6401" x2="-3987.5886" y2="-3860.573" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
+ <stop offset="0" style="stop-color:#F69923"/>
+ <stop offset="0.3123" style="stop-color:#F79A23"/>
+ <stop offset="0.8383" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_1_)" d="M729.5,8.1C702.6,24,657.9,68.9,604.6,134l49,92.5c34.4-49.2,69.3-93.4,104.5-131.2
+ c2.7-3,4.1-4.4,4.1-4.4c-1.4,1.5-2.7,3-4.1,4.4c-11.4,12.6-46,52.9-98.2,133.1c50.2-2.5,127.5-12.8,190.4-23.5
+ c18.7-105-18.4-153-18.4-153S784.8-24.6,729.5,8.1z"/>
+<path fill="none" d="M646.5,535.5c0.4-0.1,0.7-0.1,1.1-0.2l-7.1,0.8c-0.4,0.2-0.8,0.4-1.2,0.6C641.7,536.3,644.1,535.9,646.5,535.5z
+ "/>
+<path fill="none" d="M596.5,701.1c-4,0.9-8.1,1.6-12.3,2.2C588.4,702.7,592.5,702,596.5,701.1z"/>
+<path fill="none" d="M256.7,1072.7c0.5-1.4,1-2.8,1.6-4.1c10.8-28.5,21.5-56.1,32-83.1c11.9-30.2,23.6-59.5,35.2-87.9
+ c12.2-29.9,24.3-58.8,36.1-86.8c12.5-29.3,24.7-57.5,36.8-84.7c9.8-22.1,19.5-43.5,29-64.2c3.2-6.9,6.3-13.7,9.5-20.5
+ c6.2-13.4,12.4-26.6,18.5-39.4c5.6-11.9,11.2-23.5,16.8-34.9c1.8-3.8,3.7-7.6,5.5-11.3c0.3-0.6,0.6-1.2,0.9-1.8l-6,0.7l-4.8-9.4
+ c-0.5,0.9-0.9,1.8-1.4,2.7c-8.6,17.1-17.1,34.3-25.6,51.7c-4.9,10-9.7,20.1-14.6,30.3c-13.4,28.1-26.5,56.5-39.5,85
+ c-13.1,28.8-25.9,57.8-38.5,86.9c-12.4,28.5-24.5,57.1-36.3,85.5c-11.8,28.4-23.4,56.8-34.7,84.9c-11.8,29.4-23.3,58.5-34.4,87.3
+ c-2.5,6.5-5,13-7.5,19.4c-8.9,23.2-17.6,46.2-26.1,68.8l7.5,14.9l6.7-0.7c0.2-0.7,0.5-1.4,0.7-2
+ C235.2,1129.9,246,1100.9,256.7,1072.7z"/>
+<path fill="none" d="M581.2,703.8L581.2,703.8C581.2,703.8,581.2,703.8,581.2,703.8C581.2,703.8,581.2,703.8,581.2,703.8z"/>
+<path fill="#BE202E" d="M564.9,784.6c-6.3,1.1-12.7,2.2-19.3,3.4c0,0-0.1,0-0.1,0.1c3.3-0.5,6.6-1,9.9-1.6
+ C558.6,785.9,561.8,785.3,564.9,784.6z"/>
+<path opacity="0.35" fill="#BE202E" d="M564.9,784.6c-6.3,1.1-12.7,2.2-19.3,3.4c0,0-0.1,0-0.1,0.1c3.3-0.5,6.6-1,9.9-1.6
+ C558.6,785.9,561.8,785.3,564.9,784.6z"/>
+<path fill="#BE202E" d="M581.3,703.7C581.3,703.8,581.3,703.8,581.3,703.7c-0.1,0-0.1,0.1-0.1,0.1c1-0.1,2.1-0.3,3.1-0.5
+ c4.2-0.6,8.3-1.3,12.3-2.2C591.6,702,586.5,702.9,581.3,703.7L581.3,703.7L581.3,703.7z"/>
+<path opacity="0.35" fill="#BE202E" d="M581.3,703.7C581.3,703.8,581.3,703.8,581.3,703.7c-0.1,0-0.1,0.1-0.1,0.1
+ c1-0.1,2.1-0.3,3.1-0.5c4.2-0.6,8.3-1.3,12.3-2.2C591.6,702,586.5,702.9,581.3,703.7L581.3,703.7L581.3,703.7z"/>
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-6021.2769" y1="-4174.8843" x2="-4294.1865" y2="-4174.8843" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_2_)" d="M509.2,465.4c14.9-27.8,30-55,45.2-81.5c15.8-27.5,31.8-54.2,48-79.9c1-1.5,1.9-3.1,2.9-4.6
+ c16-25.3,32.1-49.6,48.4-72.9l-49-92.5c-3.7,4.5-7.4,9.1-11.1,13.7c-14.1,17.6-28.8,36.5-43.8,56.6c-17,22.6-34.4,46.8-52.1,72.2
+ c-16.3,23.4-32.9,48-49.5,73.4c-14.1,21.6-28.3,43.9-42.4,66.7c-0.5,0.8-1,1.7-1.6,2.6l63.7,125.9
+ C481.4,518.1,495.2,491.5,509.2,465.4z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-5812.7939" y1="-4001.6594" x2="-4783.6157" y2="-4001.6594" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
+ <stop offset="0" style="stop-color:#282662"/>
+ <stop offset="9.548390e-02" style="stop-color:#662E8D"/>
+ <stop offset="0.7882" style="stop-color:#9F2064"/>
+ <stop offset="0.9487" style="stop-color:#CD2032"/>
+</linearGradient>
+<path fill="url(#SVGID_3_)" d="M218.8,1174.8c-8.4,23.2-16.9,46.8-25.4,70.9c-0.1,0.4-0.2,0.7-0.4,1.1c-1.2,3.4-2.4,6.8-3.6,10.2
+ c-5.7,16.3-10.7,30.9-22.1,64.2c18.8,8.6,33.9,31.1,48.1,56.7c-1.5-26.5-12.5-51.4-33.3-70.7c92.6,4.2,172.4-19.2,213.6-86.9
+ c3.7-6,7.1-12.4,10.1-19.1c-18.8,23.8-42,33.8-85.7,31.4c-0.1,0-0.2,0.1-0.3,0.1c0.1,0,0.2-0.1,0.3-0.1
+ c64.4-28.8,96.7-56.5,125.3-102.3c6.8-10.9,13.3-22.7,20.1-35.9c-56.3,57.8-121.6,74.3-190.3,61.8l-51.6,5.7
+ C222,1166.1,220.4,1170.4,218.8,1174.8z"/>
+<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-5924.2744" y1="-4190.9775" x2="-4197.1841" y2="-4190.9775" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_4_)" d="M242.9,1059.3c11.1-28.8,22.6-57.9,34.4-87.3c11.3-28.1,22.9-56.5,34.7-84.9
+ c11.8-28.5,24-57,36.3-85.5c12.6-29,25.4-58,38.5-86.9c12.9-28.5,26.1-56.9,39.5-85c4.8-10.1,9.7-20.2,14.6-30.3
+ c8.4-17.4,17-34.6,25.6-51.7c0.5-0.9,0.9-1.8,1.4-2.7l-63.7-125.9c-1,1.7-2.1,3.4-3.1,5.1c-14.9,24.3-29.6,49.1-44.1,74.4
+ c-14.7,25.6-29.1,51.7-43.1,78.1c-11.9,22.3-23.5,44.8-34.7,67.5c-2.3,4.6-4.5,9.2-6.7,13.7c-13.9,28.6-26.4,56.2-37.8,82.8
+ c-12.9,30.1-24.2,58.8-34.1,86.1c-6.5,17.9-12.5,35.2-17.9,51.9c-4.5,14.2-8.7,28.4-12.7,42.6c-9.5,33.4-17.7,66.7-24.5,99.8
+ l64,126.4c8.5-22.6,17.1-45.6,26.1-68.8C237.9,1072.3,240.4,1065.8,242.9,1059.3z"/>
+<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-5798.3159" y1="-4167.6108" x2="-4890.6782" y2="-4167.6108" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
+ <stop offset="0" style="stop-color:#282662"/>
+ <stop offset="9.548390e-02" style="stop-color:#662E8D"/>
+ <stop offset="0.7882" style="stop-color:#9F2064"/>
+ <stop offset="0.9487" style="stop-color:#CD2032"/>
+</linearGradient>
+<path fill="url(#SVGID_5_)" d="M144.4,1025.6c-8,40.5-13.8,80.8-16.6,120.8c-0.1,1.4-0.2,2.8-0.3,4.2c-20-32-73.5-63.3-73.4-63
+ c38.3,55.5,67.4,110.7,71.7,164.8c-20.5,4.2-48.6-1.9-81.1-13.8c33.9,31.1,59.3,39.7,69.2,42c-31.1,1.9-63.5,23.3-96.1,47.9
+ c47.7-19.5,86.3-27.2,113.9-20.9c-43.8,124-87.7,260.9-131.6,406.2c13.5-4,21.5-13,26-25.3c7.8-26.3,59.8-199,141.2-425.9
+ c2.3-6.5,4.6-12.9,7-19.5c0.7-1.8,1.3-3.6,2-5.4c8.6-23.8,17.5-48.1,26.7-72.9c2.1-5.6,4.2-11.3,6.3-17c0-0.1,0.1-0.2,0.1-0.3
+ l-64-126.4C145,1022.6,144.7,1024.1,144.4,1025.6z"/>
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-5924.2744" y1="-4012.23" x2="-4197.1841" y2="-4012.23" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_6_)" d="M477.7,555.7c-1.8,3.7-3.7,7.5-5.5,11.3c-5.5,11.4-11.1,23-16.8,34.9c-6.1,12.8-12.3,26-18.5,39.4
+ c-3.1,6.8-6.3,13.6-9.5,20.5c-9.5,20.7-19.2,42.1-29,64.2c-12.1,27.2-24.3,55.4-36.8,84.7c-11.9,27.9-23.9,56.8-36.1,86.8
+ c-11.6,28.4-23.3,57.7-35.2,87.9c-10.6,27-21.3,54.6-32,83.1c-0.5,1.4-1,2.8-1.6,4.1c-10.7,28.3-21.5,57.3-32.4,87
+ c-0.2,0.7-0.5,1.4-0.7,2l51.6-5.7c-1-0.2-2-0.3-3.1-0.5c61.6-7.7,143.6-53.7,196.5-110.6c24.4-26.2,46.5-57.1,67-93.3
+ c15.2-26.9,29.6-56.8,43.2-89.8c11.9-28.9,23.3-60.1,34.4-94c-14.2,7.5-30.4,12.9-48.3,16.7c-3.1,0.7-6.3,1.3-9.6,1.9
+ c-3.2,0.6-6.5,1.1-9.9,1.6l0,0l0,0c0,0,0.1,0,0.1-0.1c57.5-22.1,93.7-64.8,120.1-117.1c-15.1,10.3-39.7,23.8-69.2,30.3
+ c-4,0.9-8.1,1.6-12.3,2.2c-1,0.1-2.1,0.3-3.1,0.5l0,0l0,0c0,0,0.1,0,0.1,0c0,0,0,0,0.1,0l0,0c19.9-8.3,36.8-17.7,51.4-28.7
+ c3.1-2.4,6.2-4.8,9.1-7.3c4.5-3.8,8.7-7.9,12.7-12.2c2.6-2.7,5.1-5.5,7.5-8.4c5.7-6.8,11.1-14.2,16.1-22.1c1.5-2.4,3-4.9,4.5-7.5
+ c1.9-3.7,3.7-7.3,5.5-10.8c8-16.1,14.5-30.5,19.6-43.2c2.6-6.3,4.8-12.2,6.7-17.6c0.8-2.2,1.5-4.3,2.2-6.3c2-6.1,3.7-11.5,5-16.2
+ c2-7.1,3.1-12.7,3.8-16.8l0,0l0,0c-1.9,1.5-4.2,3.1-6.7,4.6c-17.3,10.4-47.1,19.8-71.1,24.2l47.3-5.2l-47.3,5.2
+ c-0.4,0.1-0.7,0.1-1.1,0.2c-2.4,0.4-4.8,0.8-7.2,1.2c0.4-0.2,0.8-0.4,1.2-0.6l-161.9,17.7C478.3,554.5,478,555.1,477.7,555.7z"/>
+<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-6031.4116" y1="-4021.106" x2="-4304.3213" y2="-4021.106" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_7_)" d="M660,228.4c-14.4,22.1-30.1,47.2-47.1,75.6c-0.9,1.5-1.8,3-2.7,4.5c-14.6,24.6-30.1,51.6-46.4,81.2
+ c-14.1,25.5-28.8,52.9-44,82.4c-13.3,25.7-27,52.9-41.1,81.7l161.9-17.7c47.2-21.7,68.3-41.3,88.7-69.7c5.4-7.8,10.9-16,16.3-24.5
+ c16.6-26,32.9-54.6,47.5-83c14.1-27.4,26.5-54.7,36-79.2c6.1-15.6,10.9-30.1,14.3-42.8c2.9-11.2,5.3-21.9,7.1-32.1
+ C787.5,215.6,710.2,225.9,660,228.4z"/>
+<path fill="#BE202E" d="M555.4,786.4c-3.2,0.6-6.5,1.1-9.9,1.6l0,0C548.8,787.5,552.1,787,555.4,786.4z"/>
+<path opacity="0.35" fill="#BE202E" d="M555.4,786.4c-3.2,0.6-6.5,1.1-9.9,1.6l0,0C548.8,787.5,552.1,787,555.4,786.4z"/>
+<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-5924.2744" y1="-3959.0669" x2="-4197.1841" y2="-3959.0669" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_8_)" d="M555.4,786.4c-3.2,0.6-6.5,1.1-9.9,1.6l0,0C548.8,787.5,552.1,787,555.4,786.4z"/>
+<path fill="#BE202E" d="M581.2,703.8c1-0.1,2.1-0.3,3.1-0.5C583.2,703.5,582.2,703.7,581.2,703.8L581.2,703.8z"/>
+<path opacity="0.35" fill="#BE202E" d="M581.2,703.8c1-0.1,2.1-0.3,3.1-0.5C583.2,703.5,582.2,703.7,581.2,703.8L581.2,703.8z"/>
+<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-5924.2744" y1="-3965.1499" x2="-4197.1841" y2="-3965.1499" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_9_)" d="M581.2,703.8c1-0.1,2.1-0.3,3.1-0.5C583.2,703.5,582.2,703.7,581.2,703.8L581.2,703.8z"/>
+<path fill="#BE202E" d="M581.3,703.8C581.3,703.8,581.3,703.8,581.3,703.8L581.3,703.8L581.3,703.8L581.3,703.8
+ C581.3,703.8,581.3,703.8,581.3,703.8z"/>
+<path opacity="0.35" fill="#BE202E" d="M581.3,703.8C581.3,703.8,581.3,703.8,581.3,703.8L581.3,703.8L581.3,703.8L581.3,703.8
+ C581.3,703.8,581.3,703.8,581.3,703.8z"/>
+<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-4954.02" y1="-3966.3701" x2="-4572.2764" y2="-3966.3701" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_10_)" d="M581.3,703.8C581.3,703.8,581.3,703.8,581.3,703.8L581.3,703.8L581.3,703.8L581.3,703.8
+ C581.3,703.8,581.3,703.8,581.3,703.8z"/>
+<path fill="#6D6E71" d="M4552.4,508.2c12,3.6,22.6,8.4,31.5,14.5l-10.5,23c-9.2-6.1-19-10.6-29.4-13.6c-10.4-3-20.3-4.5-29.7-4.5
+ c-13.8,0-24.9,2.5-33.2,7.5c-8.3,5-12.4,12-12.4,21.1c0,7.8,2.3,14.2,6.9,19.3c4.6,5.1,10.3,9,17.3,11.9c6.9,2.8,16.4,6.1,28.5,9.8
+ c14.6,4.7,26.4,9.1,35.3,13.1c8.9,4.1,16.5,10.1,22.9,18.1c6.3,8,9.5,18.5,9.5,31.5c0,11.9-3.2,22.2-9.6,31.1
+ c-6.4,8.9-15.5,15.7-27.3,20.6c-11.8,4.9-25.3,7.3-40.6,7.3c-15.3,0-30.2-3-44.7-8.9c-14.4-5.9-26.8-13.9-37.2-23.8l10.9-22
+ c9.8,9.6,21,17,33.8,22.3c12.8,5.3,25.3,7.9,37.4,7.9c15.5,0,27.8-3,36.8-9c9-6,13.4-14.1,13.4-24.3c0-8-2.3-14.5-7-19.7
+ c-4.7-5.2-10.5-9.2-17.4-12.1c-6.9-2.9-16.4-6.1-28.5-9.7c-14.4-4.3-26.2-8.4-35.2-12.4c-9-4-16.6-9.9-22.9-17.8
+ c-6.2-7.9-9.3-18.2-9.3-31.1c0-11.1,3.1-20.8,9.2-29.1c6.1-8.4,14.8-14.8,26.1-19.4c11.3-4.6,24.2-6.9,38.9-6.9
+ C4528.2,502.8,4540.3,504.6,4552.4,508.2z"/>
+<path fill="#6D6E71" d="M4870.3,517.6c17.1,9.6,30.7,22.6,40.7,39.1c10,16.4,15,34.5,15,54.2c0,19.8-5,38-15,54.5
+ c-10,16.5-23.6,29.6-40.7,39.3c-17.1,9.7-35.9,14.5-56.2,14.5c-20.6,0-39.5-4.8-56.6-14.5c-17.1-9.7-30.7-22.8-40.7-39.3
+ c-10-16.5-15-34.7-15-54.5c0-19.8,5-38,15-54.5c10-16.5,23.6-29.5,40.7-39c17.1-9.5,36-14.3,56.6-14.3
+ C4834.4,503.1,4853.2,507.9,4870.3,517.6z M4770.5,537.8c-13.4,7.6-24,17.8-32,30.6c-8,12.9-12,27-12,42.4c0,15.5,4,29.8,12,42.7
+ c8,13,18.6,23.2,32,30.7c13.3,7.5,27.9,11.3,43.6,11.3c15.7,0,30.2-3.8,43.4-11.3c13.2-7.5,23.7-17.8,31.6-30.7
+ c7.9-12.9,11.8-27.2,11.8-42.7s-3.9-29.7-11.8-42.5c-7.9-12.8-18.4-23-31.7-30.6c-13.3-7.6-27.7-11.4-43.3-11.4
+ C4798.4,526.4,4783.8,530.2,4770.5,537.8z"/>
+<path fill="#6D6E71" d="M5080.3,527.3v75.3h100.1v23.6h-100.1V718h-24.5V503.7h136.1v23.6H5080.3z"/>
+<path fill="#6D6E71" d="M5390.7,527.3V718h-24.5V527.3h-69.6v-23.6h164.2v23.6H5390.7z"/>
+<path fill="#6D6E71" d="M5777.5,718l-57.8-180.5L5661.1,718h-25l-71.7-214.3h26.3l58.9,185.9l58.1-185.6l24.5-0.3l58.7,185.9
+ l58.1-185.9h25.4L5802.6,718H5777.5z"/>
+<path fill="#6D6E71" d="M5996.7,663.9l-23.9,54.1h-26l96.1-214.3h25.4l95.8,214.3h-26.6l-23.9-54.1H5996.7z M6054.9,531.7
+ l-47.7,108.6h96.1L6054.9,531.7z"/>
+<path fill="#6D6E71" d="M6377,649.7c-6.1,0.4-10.9,0.6-14.3,0.6h-56.9V718h-24.5V503.7h81.4c26.7,0,47.4,6.3,62.2,18.8
+ c14.8,12.6,22.2,30.3,22.2,53.2c0,17.5-4.1,32.2-12.4,44c-8.3,11.8-20.1,20.3-35.6,25.5l50.1,72.8h-27.8L6377,649.7z M6407.7,614
+ c10.5-8.6,15.8-21.1,15.8-37.7c0-16.1-5.3-28.3-15.8-36.6c-10.5-8.3-25.5-12.4-45.1-12.4h-56.9v99.5h56.9
+ C6382.2,626.9,6397.2,622.6,6407.7,614z"/>
+<path fill="#6D6E71" d="M6608.2,527.3v70.4h108v23.6h-108v73.4h124.9V718h-149.4V503.7H6729v23.6H6608.2z"/>
+<path fill="#6D6E71" d="M7074.8,527.3v75.3h100.1v23.6h-100.1V718h-24.5V503.7h136.1v23.6H7074.8z"/>
+<path fill="#6D6E71" d="M7457.7,517.6c17.1,9.6,30.7,22.6,40.7,39.1c10,16.4,15,34.5,15,54.2c0,19.8-5,38-15,54.5
+ c-10,16.5-23.6,29.6-40.7,39.3c-17.1,9.7-35.9,14.5-56.2,14.5c-20.6,0-39.5-4.8-56.6-14.5c-17.1-9.7-30.7-22.8-40.7-39.3
+ c-10-16.5-15-34.7-15-54.5c0-19.8,5-38,15-54.5c10-16.5,23.6-29.5,40.7-39c17.1-9.5,36-14.3,56.6-14.3
+ C7421.8,503.1,7440.5,507.9,7457.7,517.6z M7357.9,537.8c-13.4,7.6-24,17.8-32,30.6c-8,12.9-12,27-12,42.4c0,15.5,4,29.8,12,42.7
+ c8,13,18.6,23.2,32,30.7c13.3,7.5,27.9,11.3,43.6,11.3c15.7,0,30.2-3.8,43.4-11.3c13.2-7.5,23.7-17.8,31.6-30.7
+ c7.9-12.9,11.8-27.2,11.8-42.7s-3.9-29.7-11.8-42.5c-7.9-12.8-18.4-23-31.7-30.6c-13.3-7.6-27.7-11.4-43.3-11.4
+ C7385.7,526.4,7371.2,530.2,7357.9,537.8z"/>
+<path fill="#6D6E71" d="M7794.8,695.5c-15.9,15.8-37.9,23.7-65.9,23.7c-28.2,0-50.3-7.9-66.3-23.7c-16-15.8-24-37.7-24-65.7V503.7
+ h24.5v126.1c0,20.6,5.9,36.7,17.6,48.3c11.8,11.6,27.8,17.4,48.1,17.4c20.4,0,36.4-5.7,48-17.3c11.6-11.5,17.3-27.7,17.3-48.5V503.7
+ h24.5v126.1C7818.7,657.8,7810.7,679.7,7794.8,695.5z"/>
+<path fill="#6D6E71" d="M8115.1,718l-128.5-172v172h-24.5V503.7h25.4L8116,676V503.7h24.2V718H8115.1z"/>
+<path fill="#6D6E71" d="M8429.3,517.9c16.7,9.4,29.9,22.3,39.6,38.6c9.7,16.3,14.6,34.4,14.6,54.5s-4.9,38.2-14.6,54.5
+ c-9.7,16.3-23,29.2-40,38.6c-16.9,9.4-35.8,14-56.5,14h-85.8V503.7h86.7C8394,503.7,8412.6,508.4,8429.3,517.9z M8311.2,694.7h62.5
+ c15.7,0,30.1-3.6,43-10.8c12.9-7.2,23.2-17.2,30.7-30c7.5-12.7,11.3-27,11.3-42.7c0-15.7-3.8-30-11.5-42.7
+ c-7.7-12.7-18-22.7-31.1-30.1c-13.1-7.4-27.5-11.1-43.3-11.1h-61.6V694.7z"/>
+<path fill="#6D6E71" d="M8622.8,663.9l-23.9,54.1h-26l96.1-214.3h25.4l95.8,214.3h-26.6l-23.9-54.1H8622.8z M8681,531.7l-47.7,108.6
+ h96.1L8681,531.7z"/>
+<path fill="#6D6E71" d="M8950.8,527.3V718h-24.5V527.3h-69.6v-23.6h164.2v23.6H8950.8z"/>
+<path fill="#6D6E71" d="M9138.9,718V503.7h24.5V718H9138.9z"/>
+<path fill="#6D6E71" d="M9462.2,517.6c17.1,9.6,30.7,22.6,40.7,39.1c10,16.4,15,34.5,15,54.2c0,19.8-5,38-15,54.5
+ c-10,16.5-23.6,29.6-40.7,39.3c-17.1,9.7-35.9,14.5-56.2,14.5c-20.6,0-39.5-4.8-56.6-14.5c-17.1-9.7-30.7-22.8-40.7-39.3
+ c-10-16.5-15-34.7-15-54.5c0-19.8,5-38,15-54.5c10-16.5,23.6-29.5,40.7-39c17.1-9.5,36-14.3,56.6-14.3
+ C9426.4,503.1,9445.1,507.9,9462.2,517.6z M9362.4,537.8c-13.4,7.6-24,17.8-32,30.6c-8,12.9-12,27-12,42.4c0,15.5,4,29.8,12,42.7
+ c8,13,18.6,23.2,32,30.7c13.3,7.5,27.9,11.3,43.6,11.3c15.7,0,30.2-3.8,43.4-11.3c13.2-7.5,23.7-17.8,31.6-30.7
+ c7.9-12.9,11.8-27.2,11.8-42.7s-3.9-29.7-11.8-42.5c-7.9-12.8-18.4-23-31.7-30.6c-13.3-7.6-27.7-11.4-43.3-11.4
+ C9390.3,526.4,9375.8,530.2,9362.4,537.8z"/>
+<path fill="#6D6E71" d="M9800.8,718l-128.5-172v172h-24.5V503.7h25.4L9801.7,676V503.7h24.2V718H9800.8z"/>
+<path fill="#6D6E71" d="M4204.9,500.9c9,9,13.5,19.9,13.5,32.6c0,12.7-4.5,23.6-13.5,32.7c-9,9.1-20,13.7-32.8,13.7
+ c-12.9,0-23.8-4.5-32.7-13.5c-8.9-9-13.4-19.9-13.4-32.6c0-12.7,4.5-23.6,13.5-32.7c9-9.1,19.9-13.7,32.7-13.7
+ C4185,487.4,4195.9,491.9,4204.9,500.9z M4201,562.4c7.9-8,11.8-17.6,11.8-28.8c0-11.2-3.9-20.7-11.7-28.6
+ c-7.8-7.9-17.4-11.9-28.7-11.9c-11.3,0-20.9,4-28.8,11.9c-7.8,8-11.8,17.6-11.8,28.8c0,11.2,3.9,20.8,11.6,28.7
+ c7.8,7.9,17.3,11.9,28.6,11.9S4193.1,570.4,4201,562.4z M4194.5,524.7c0,8.3-3.6,13.5-10.9,15.6l13.3,18h-10.7l-12-16.7h-11v16.7
+ h-8.7v-50h18.8c7.6,0,13,1.3,16.3,3.9C4192.9,514.8,4194.5,519,4194.5,524.7z M4183.4,531.7c1.7-1.4,2.6-3.8,2.6-7.1
+ c0-3.3-0.9-5.6-2.7-6.8c-1.8-1.3-4.9-1.9-9.5-1.9h-10.6v18h10.4C4178.4,533.9,4181.6,533.2,4183.4,531.7z"/>
+<path fill="#6D6E71" d="M4540.6,918.2c21.1,0,37.7,6.1,49.6,18.4c11.9,12.3,17.9,29.2,17.9,50.8V1097h-26.3V994.4
+ c0-15.7-4.4-28-13.3-36.8s-21.2-13.2-36.9-13.2c-18.7,0.2-33.3,6.3-44,18.2c-10.7,11.9-16,27.5-16,46.9v87.4h-26.3V846.6h26.3V959
+ C4483.1,932.2,4506.2,918.6,4540.6,918.2z"/>
+<path fill="#6D6E71" d="M4823.7,1063.6l7.4,21.3c-12.8,8.8-26.2,13.3-40.2,13.5c-13.7,0-24.7-4.2-32.9-12.7
+ c-8.2-8.4-12.3-21.1-12.3-38V946.2h-25.6v-21.3h25.6V878h26v46.9l56.3-0.3v21.6h-56.3v96.8c0,19.8,7.9,29.7,23.6,29.7
+ C4804.6,1072.7,4814,1069.6,4823.7,1063.6z"/>
+<path fill="#6D6E71" d="M5027.8,1063.6l7.4,21.3c-12.8,8.8-26.2,13.3-40.2,13.5c-13.7,0-24.7-4.2-32.9-12.7
+ c-8.2-8.4-12.3-21.1-12.3-38V946.2h-25.6v-21.3h25.6V878h26v46.9l56.3-0.3v21.6h-56.3v96.8c0,19.8,7.9,29.7,23.6,29.7
+ C5008.7,1072.7,5018.1,1069.6,5027.8,1063.6z"/>
+<path fill="#6D6E71" d="M5244.1,918.2c25.2,0,45.7,8.4,61.6,25.3c15.9,16.9,23.8,38.6,23.8,65.1c0,26.3-7.8,47.8-23.5,64.5
+ c-15.6,16.6-36,25-61.2,25c-32.2,0-55.2-13-69.2-39.1v103.6h-26.3V919.2h26.3v38.4C5189.5,931.3,5212.4,918.2,5244.1,918.2z
+ M5239.4,1074c18.4,0,33.6-6.2,45.5-18.6c11.9-12.3,17.9-28.2,17.9-47.6c0-19.1-6-34.9-17.9-47.4c-11.9-12.5-27.1-18.7-45.5-18.7
+ c-18.7,0-34,6.2-45.9,18.6c-11.9,12.4-17.9,28.2-17.9,47.6c0,19.3,6,35.2,17.9,47.6C5205.4,1067.8,5220.7,1074,5239.4,1074z"/>
+<path fill="#6D6E71" d="M5449.9,964.4c4.5,0,8.3,1.7,11.5,5.1c3.2,3.4,4.7,7.5,4.7,12.5s-1.6,9.1-4.7,12.5c-3.2,3.4-7,5.1-11.5,5.1
+ c-4.7,0-8.7-1.7-11.8-5.1c-3.2-3.4-4.7-7.5-4.7-12.5s1.6-9.1,4.7-12.5C5441.2,966.1,5445.2,964.4,5449.9,964.4z M5449.9,1064.6
+ c4.5,0,8.3,1.7,11.5,5c3.2,3.4,4.7,7.5,4.7,12.5c0,4.9-1.6,9.1-4.7,12.5c-3.2,3.4-7,5.1-11.5,5.1c-4.7,0-8.7-1.7-11.8-5.1
+ c-3.2-3.4-4.7-7.5-4.7-12.5c0-4.9,1.6-9.1,4.7-12.5C5441.2,1066.3,5445.2,1064.6,5449.9,1064.6z"/>
+<path fill="#6D6E71" d="M5574.1,1138.1h-22.9l105.3-317.8h23.3L5574.1,1138.1z"/>
+<path fill="#6D6E71" d="M5753.6,1138.1h-22.9l105.3-317.8h23.3L5753.6,1138.1z"/>
+<path fill="#6D6E71" d="M6140.5,1097h-27.3l-52.3-144.4l-52,144.4h-27.3l-66.5-177.8h27.7l52.6,150.5l51.6-150.5h27.7l52.3,150.5
+ l52-150.5h27.3L6140.5,1097z"/>
+<path fill="#6D6E71" d="M6504.6,1097h-27.3L6425,952.6l-52,144.4h-27.3l-66.5-177.8h27.7l52.6,150.5l51.6-150.5h27.7l52.3,150.5
+ l52-150.5h27.3L6504.6,1097z"/>
+<path fill="#6D6E71" d="M6868.6,1097h-27.3L6789,952.6l-52,144.4h-27.3l-66.5-177.8h27.7l52.6,150.5l51.6-150.5h27.7l52.3,150.5
+ l52-150.5h27.3L6868.6,1097z"/>
+<path fill="#6D6E71" d="M7034.6,1064.6c4.5,0,8.3,1.7,11.5,5c3.2,3.4,4.7,7.5,4.7,12.5c0,4.9-1.6,9.1-4.7,12.5
+ c-3.2,3.4-7,5.1-11.5,5.1c-4.7,0-8.7-1.7-11.8-5.1c-3.2-3.4-4.7-7.5-4.7-12.5c0-4.9,1.6-9.1,4.7-12.5
+ C7026,1066.3,7029.9,1064.6,7034.6,1064.6z"/>
+<path fill="#6D6E71" d="M7283,1097v-27.3c-14.2,19.1-35.9,28.7-65.1,28.7c-18,0-32.6-5.1-43.7-15.4c-11.1-10.2-16.7-23.2-16.7-39
+ c0-15.5,5.8-27.8,17.5-37c11.7-9.1,28-13.8,48.9-14h58.4v-10.5c0-13.3-4.1-23.5-12.1-30.7c-8.1-7.2-19.9-10.8-35.4-10.8
+ c-18,0-36.8,6.7-56.4,20.2l-11.1-19.2c12.6-8.3,24.2-14.4,34.9-18.2s23.2-5.7,37.6-5.7c21.8,0,38.6,5.4,50.4,16.2
+ c11.8,10.8,17.8,25.9,18.1,45.2l0.3,117.4H7283z M7222.9,1075.4c15.1,0,27.9-3.5,38.6-10.6c10.7-7.1,17.7-16.8,21.1-29.2v-21.3
+ h-55.3c-30.1,0-45.2,9.6-45.2,28.7c0,9.9,3.7,17.8,11.1,23.6C7200.6,1072.5,7210.5,1075.4,7222.9,1075.4z"/>
+<path fill="#6D6E71" d="M7536.3,918.2c25.2,0,45.7,8.4,61.6,25.3c15.9,16.9,23.8,38.6,23.8,65.1c0,26.3-7.8,47.8-23.5,64.5
+ c-15.6,16.6-36,25-61.2,25c-32.2,0-55.2-13-69.2-39.1v103.6h-26.3V919.2h26.3v38.4C7481.8,931.3,7504.6,918.2,7536.3,918.2z
+ M7531.6,1074c18.4,0,33.6-6.2,45.5-18.6c11.9-12.3,17.9-28.2,17.9-47.6c0-19.1-6-34.9-17.9-47.4c-11.9-12.5-27.1-18.7-45.5-18.7
+ c-18.7,0-34,6.2-45.9,18.6c-11.9,12.4-17.9,28.2-17.9,47.6c0,19.3,6,35.2,17.9,47.6C7497.6,1067.8,7512.9,1074,7531.6,1074z"/>
+<path fill="#6D6E71" d="M7850.8,1097v-27.3c-14.2,19.1-35.9,28.7-65.1,28.7c-18,0-32.6-5.1-43.7-15.4c-11.1-10.2-16.7-23.2-16.7-39
+ c0-15.5,5.8-27.8,17.5-37c11.7-9.1,28-13.8,48.9-14h58.4v-10.5c0-13.3-4.1-23.5-12.1-30.7c-8.1-7.2-19.9-10.8-35.4-10.8
+ c-18,0-36.8,6.7-56.4,20.2l-11.1-19.2c12.6-8.3,24.2-14.4,34.9-18.2c10.7-3.8,23.2-5.7,37.6-5.7c21.8,0,38.6,5.4,50.4,16.2
+ c11.8,10.8,17.8,25.9,18.1,45.2l0.3,117.4H7850.8z M7790.7,1075.4c15.1,0,27.9-3.5,38.6-10.6c10.7-7.1,17.7-16.8,21.1-29.2v-21.3
+ h-55.3c-30.2,0-45.2,9.6-45.2,28.7c0,9.9,3.7,17.8,11.1,23.6C7768.5,1072.5,7778.4,1075.4,7790.7,1075.4z"/>
+<path fill="#6D6E71" d="M8077.8,918.5c28.6-0.2,51.4,8.5,68.5,26.3l-14.5,18.6c-14.4-13.7-32.1-20.6-53-20.6
+ c-18.4,0-33.6,6.1-45.4,18.2c-11.8,12.1-17.7,27.9-17.7,47.2s5.9,35.2,17.7,47.4c11.8,12.3,26.9,18.4,45.4,18.4
+ c23.8,0,42.2-7.6,55-22.9l15.2,16.2c-16.9,20.5-40.6,30.7-71.2,30.7c-25.9,0-47-8.3-63.4-25c-16.4-16.6-24.6-38.2-24.6-64.8
+ c0-26.3,8.3-47.9,24.8-64.6C8031.1,926.9,8052.2,918.5,8077.8,918.5z"/>
+<path fill="#6D6E71" d="M8366.7,918.2c21.1,0,37.7,6.1,49.6,18.4c11.9,12.3,17.9,29.2,17.9,50.8V1097h-26.3V994.4
+ c0-15.7-4.4-28-13.3-36.8s-21.2-13.2-36.9-13.2c-18.7,0.2-33.3,6.3-44,18.2c-10.7,11.9-16,27.5-16,46.9v87.4h-26.3V846.6h26.3V959
+ C8309.2,932.2,8332.2,918.6,8366.7,918.2z"/>
+<path fill="#6D6E71" d="M8635.6,918.5c28.1-0.2,49.3,8.7,63.6,26.6c14.3,18,20.8,42.4,19.4,73.2h-145.1c2.2,17.3,9.2,31.1,20.9,41.3
+ c11.7,10.2,26.2,15.4,43.5,15.4c22.5,0,40.8-7.4,55-22.3l14.5,15.5c-17.8,19.8-41.6,29.7-71.5,29.7c-26.1,0-47.4-8.3-63.8-25
+ c-16.4-16.6-24.6-38.2-24.6-64.8s8.2-48.1,24.6-64.8C8588.5,926.8,8609.7,918.5,8635.6,918.5z M8573.5,996.8H8695
+ c-0.9-17.1-6.7-30.7-17.4-40.7c-10.7-10-24.7-15-42-15c-16.9,0-30.9,5.1-42.2,15.2C8582.1,966.4,8575.5,979.9,8573.5,996.8z"/>
+<path fill="#6D6E71" d="M8838,1064.6c4.5,0,8.3,1.7,11.5,5c3.1,3.4,4.7,7.5,4.7,12.5c0,4.9-1.6,9.1-4.7,12.5
+ c-3.2,3.4-7,5.1-11.5,5.1c-4.7,0-8.7-1.7-11.8-5.1c-3.2-3.4-4.7-7.5-4.7-12.5c0-4.9,1.6-9.1,4.7-12.5
+ C8829.3,1066.3,8833.3,1064.6,8838,1064.6z"/>
+<path fill="#6D6E71" d="M8983.4,943.5c16.9-16.6,38.5-25,64.8-25c26.3,0,47.9,8.3,64.8,25c16.9,16.6,25.3,38.1,25.3,64.5
+ c0,26.5-8.5,48.2-25.3,64.9c-16.9,16.8-38.5,25.1-64.8,25.1c-26.3,0-47.9-8.4-64.8-25.1c-16.9-16.8-25.3-38.4-25.3-64.9
+ C8958.1,981.6,8966.5,960.1,8983.4,943.5z M9094.1,960.8c-11.9-12.3-27.2-18.4-45.9-18.4c-18.7,0-34,6.1-45.9,18.4
+ c-11.9,12.3-17.9,28.1-17.9,47.4c0,19.6,6,35.5,17.9,47.7c11.9,12.3,27.2,18.4,45.9,18.4c18.7,0,34-6.1,45.9-18.4
+ c11.9-12.3,17.9-28.2,17.9-47.7C9111.9,988.9,9106,973.1,9094.1,960.8z"/>
+<path fill="#6D6E71" d="M9283.3,919.2v39.5c12.2-26.5,33.4-40,63.8-40.5v26.7c-18.4-0.2-33.3,4.9-44.5,15.3
+ c-11.3,10.5-17.6,24.6-19.2,42.3v94.5H9257V919.2H9283.3z"/>
+<path fill="#6D6E71" d="M9610,919.2v159.2c0,25.9-8.2,46.5-24.5,61.7c-16.3,15.3-38,22.9-64.9,22.9c-26.3-0.2-50.6-8.8-72.9-25.7
+ l12.1-20.2c17.8,14.8,37.7,22.4,59.7,22.6c19.4,0,34.9-5.5,46.6-16.5c11.7-11,17.5-25.7,17.5-44.2v-27c-13,24.7-34.9,37.1-65.4,37.1
+ c-23.9,0-43.3-8-58.4-24c-15.1-16-22.6-36.7-22.6-62.1c0-24.7,7.4-45,22.3-60.9c14.8-15.9,34.2-23.9,58-24.1
+ c30.6,0,52.6,12.4,66.1,37.1v-36.1H9610z M9479.2,1049.2c11.4,11.8,25.9,17.7,43.7,17.7s32.3-5.9,43.7-17.7c11.3-11.8,17-26.8,17-45
+ c0-18.4-5.7-33.6-17-45.4c-11.4-11.8-25.9-17.7-43.7-17.7s-32.3,5.9-43.7,17.7c-11.3,11.8-17.1,26.9-17.4,45.4
+ C9462.1,1022.4,9467.9,1037.4,9479.2,1049.2z"/>
+<path fill="#6D6E71" d="M9729.4,1138.1h-22.9l105.3-317.8h23.3L9729.4,1138.1z"/>
+</svg>
diff --git a/web/tomcat/webapps/ROOT/bg-button.png b/web/tomcat/webapps/ROOT/bg-button.png
new file mode 100644
index 0000000..b544bbf
--- /dev/null
+++ b/web/tomcat/webapps/ROOT/bg-button.png
Binary files differ
diff --git a/web/tomcat/webapps/ROOT/bg-middle.png b/web/tomcat/webapps/ROOT/bg-middle.png
new file mode 100644
index 0000000..0c95a82
--- /dev/null
+++ b/web/tomcat/webapps/ROOT/bg-middle.png
Binary files differ
diff --git a/web/tomcat/webapps/ROOT/bg-nav.png b/web/tomcat/webapps/ROOT/bg-nav.png
new file mode 100644
index 0000000..d44b094
--- /dev/null
+++ b/web/tomcat/webapps/ROOT/bg-nav.png
Binary files differ
diff --git a/web/tomcat/webapps/ROOT/bg-upper.png b/web/tomcat/webapps/ROOT/bg-upper.png
new file mode 100644
index 0000000..7d9ae7b
--- /dev/null
+++ b/web/tomcat/webapps/ROOT/bg-upper.png
Binary files differ
diff --git a/web/tomcat/webapps/ROOT/favicon.ico b/web/tomcat/webapps/ROOT/favicon.ico
new file mode 100644
index 0000000..6c5bd2c
--- /dev/null
+++ b/web/tomcat/webapps/ROOT/favicon.ico
Binary files differ
diff --git a/web/tomcat/webapps/ROOT/index.jsp b/web/tomcat/webapps/ROOT/index.jsp
new file mode 100644
index 0000000..da4024b
--- /dev/null
+++ b/web/tomcat/webapps/ROOT/index.jsp
@@ -0,0 +1,219 @@
+<%--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+--%>
+<%@ page session="false" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
+<%
+java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy");
+request.setAttribute("year", sdf.format(new java.util.Date()));
+request.setAttribute("tomcatUrl", "https://tomcat.apache.org/");
+request.setAttribute("tomcatDocUrl", "/docs/");
+request.setAttribute("tomcatExamplesUrl", "/examples/");
+%>
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <title><%=request.getServletContext().getServerInfo() %></title>
+ <link href="favicon.ico" rel="icon" type="image/x-icon" />
+ <link href="tomcat.css" rel="stylesheet" type="text/css" />
+ </head>
+
+ <body>
+ <div id="wrapper">
+ <div id="navigation" class="curved container">
+ <span id="nav-home"><a href="${tomcatUrl}">Home</a></span>
+ <span id="nav-hosts"><a href="${tomcatDocUrl}">Documentation</a></span>
+ <span id="nav-config"><a href="${tomcatDocUrl}config/">Configuration</a></span>
+ <span id="nav-examples"><a href="${tomcatExamplesUrl}">Examples</a></span>
+ <span id="nav-wiki"><a href="https://wiki.apache.org/tomcat/FrontPage">Wiki</a></span>
+ <span id="nav-lists"><a href="${tomcatUrl}lists.html">Mailing Lists</a></span>
+ <span id="nav-help"><a href="${tomcatUrl}findhelp.html">Find Help</a></span>
+ <br class="separator" />
+ </div>
+ <div id="asf-box">
+ <h1>${pageContext.servletContext.serverInfo}</h1>
+ </div>
+ <div id="upper" class="curved container">
+ <div id="congrats" class="curved container">
+ <h2>If you're seeing this, you've successfully installed Tomcat. Congratulations!</h2>
+ </div>
+ <div id="notice">
+ <img id="tomcat-logo" src="tomcat.svg" alt="[tomcat logo]" />
+ <div id="tasks">
+ <h3>Recommended Reading:</h3>
+ <h4><a href="${tomcatDocUrl}security-howto.html">Security Considerations How-To</a></h4>
+ <h4><a href="${tomcatDocUrl}manager-howto.html">Manager Application How-To</a></h4>
+ <h4><a href="${tomcatDocUrl}cluster-howto.html">Clustering/Session Replication How-To</a></h4>
+ </div>
+ </div>
+ <div id="actions">
+ <div class="button">
+ <a class="container shadow" href="/manager/status"><span>Server Status</span></a>
+ </div>
+ <div class="button">
+ <a class="container shadow" href="/manager/html"><span>Manager App</span></a>
+ </div>
+ <div class="button">
+ <a class="container shadow" href="/host-manager/html"><span>Host Manager</span></a>
+ </div>
+ </div>
+ <br class="separator" />
+ </div>
+ <div id="middle" class="curved container">
+ <h3>Developer Quick Start</h3>
+ <div class="col25">
+ <div class="container">
+ <p><a href="${tomcatDocUrl}setup.html">Tomcat Setup</a></p>
+ <p><a href="${tomcatDocUrl}appdev/">First Web Application</a></p>
+ </div>
+ </div>
+ <div class="col25">
+ <div class="container">
+ <p><a href="${tomcatDocUrl}realm-howto.html">Realms & AAA</a></p>
+ <p><a href="${tomcatDocUrl}jndi-datasource-examples-howto.html">JDBC DataSources</a></p>
+ </div>
+ </div>
+ <div class="col25">
+ <div class="container">
+ <p><a href="${tomcatExamplesUrl}">Examples</a></p>
+ </div>
+ </div>
+ <div class="col25">
+ <div class="container">
+ <p><a href="https://wiki.apache.org/tomcat/Specifications">Servlet Specifications</a></p>
+ <p><a href="https://wiki.apache.org/tomcat/TomcatVersions">Tomcat Versions</a></p>
+ </div>
+ </div>
+ <br class="separator" />
+ </div>
+ <div id="lower">
+ <div id="low-manage" class="">
+ <div class="curved container">
+ <h3>Managing Tomcat</h3>
+ <p>For security, access to the <a href="/manager/html">manager webapp</a> is restricted.
+ Users are defined in:</p>
+ <pre>$CATALINA_HOME/conf/tomcat-users.xml</pre>
+ <p>In Tomcat 8.5 access to the manager application is split between
+ different users. <a href="${tomcatDocUrl}manager-howto.html">Read more...</a></p>
+ <br />
+ <h4><a href="${tomcatDocUrl}RELEASE-NOTES.txt">Release Notes</a></h4>
+ <h4><a href="${tomcatDocUrl}changelog.html">Changelog</a></h4>
+ <h4><a href="${tomcatUrl}migration.html">Migration Guide</a></h4>
+ <h4><a href="${tomcatUrl}security.html">Security Notices</a></h4>
+ </div>
+ </div>
+ <div id="low-docs" class="">
+ <div class="curved container">
+ <h3>Documentation</h3>
+ <h4><a href="${tomcatDocUrl}">Tomcat 8.5 Documentation</a></h4>
+ <h4><a href="${tomcatDocUrl}config/">Tomcat 8.5 Configuration</a></h4>
+ <h4><a href="https://wiki.apache.org/tomcat/FrontPage">Tomcat Wiki</a></h4>
+ <p>Find additional important configuration information in:</p>
+ <pre>$CATALINA_HOME/RUNNING.txt</pre>
+ <p>Developers may be interested in:</p>
+ <ul>
+ <li><a href="https://tomcat.apache.org/bugreport.html">Tomcat 8.5 Bug Database</a></li>
+ <li><a href="${tomcatDocUrl}api/index.html">Tomcat 8.5 JavaDocs</a></li>
+ <li><a href="https://github.com/apache/tomcat/tree/8.5.x">Tomcat 8.5 Git Repository at GitHub</a></li>
+ </ul>
+ </div>
+ </div>
+ <div id="low-help" class="">
+ <div class="curved container">
+ <h3>Getting Help</h3>
+ <h4><a href="${tomcatUrl}faq/">FAQ</a> and <a href="${tomcatUrl}lists.html">Mailing Lists</a></h4>
+ <p>The following mailing lists are available:</p>
+ <ul>
+ <li id="list-announce"><strong><a href="${tomcatUrl}lists.html#tomcat-announce">tomcat-announce</a><br />
+ Important announcements, releases, security vulnerability notifications. (Low volume).</strong>
+ </li>
+ <li><a href="${tomcatUrl}lists.html#tomcat-users">tomcat-users</a><br />
+ User support and discussion
+ </li>
+ <li><a href="${tomcatUrl}lists.html#taglibs-user">taglibs-user</a><br />
+ User support and discussion for <a href="${tomcatUrl}taglibs/">Apache Taglibs</a>
+ </li>
+ <li><a href="${tomcatUrl}lists.html#tomcat-dev">tomcat-dev</a><br />
+ Development mailing list, including commit messages
+ </li>
+ </ul>
+ </div>
+ </div>
+ <br class="separator" />
+ </div>
+ <div id="footer" class="curved container">
+ <div class="col20">
+ <div class="container">
+ <h4>Other Downloads</h4>
+ <ul>
+ <li><a href="${tomcatUrl}download-connectors.cgi">Tomcat Connectors</a></li>
+ <li><a href="${tomcatUrl}download-native.cgi">Tomcat Native</a></li>
+ <li><a href="${tomcatUrl}taglibs/">Taglibs</a></li>
+ <li><a href="${tomcatDocUrl}deployer-howto.html">Deployer</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="col20">
+ <div class="container">
+ <h4>Other Documentation</h4>
+ <ul>
+ <li><a href="${tomcatUrl}connectors-doc/">Tomcat Connectors</a></li>
+ <li><a href="${tomcatUrl}connectors-doc/">mod_jk Documentation</a></li>
+ <li><a href="${tomcatUrl}native-doc/">Tomcat Native</a></li>
+ <li><a href="${tomcatDocUrl}deployer-howto.html">Deployer</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="col20">
+ <div class="container">
+ <h4>Get Involved</h4>
+ <ul>
+ <li><a href="${tomcatUrl}getinvolved.html">Overview</a></li>
+ <li><a href="${tomcatUrl}source.html">Source Repositories</a></li>
+ <li><a href="${tomcatUrl}lists.html">Mailing Lists</a></li>
+ <li><a href="https://wiki.apache.org/tomcat/FrontPage">Wiki</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="col20">
+ <div class="container">
+ <h4>Miscellaneous</h4>
+ <ul>
+ <li><a href="${tomcatUrl}contact.html">Contact</a></li>
+ <li><a href="${tomcatUrl}legal.html">Legal</a></li>
+ <li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
+ <li><a href="https://www.apache.org/foundation/thanks.html">Thanks</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="col20">
+ <div class="container">
+ <h4>Apache Software Foundation</h4>
+ <ul>
+ <li><a href="${tomcatUrl}whoweare.html">Who We Are</a></li>
+ <li><a href="${tomcatUrl}heritage.html">Heritage</a></li>
+ <li><a href="https://www.apache.org">Apache Home</a></li>
+ <li><a href="${tomcatUrl}resources.html">Resources</a></li>
+ </ul>
+ </div>
+ </div>
+ <br class="separator" />
+ </div>
+ <p class="copyright">Copyright ©1999-${year} Apache Software Foundation. All Rights Reserved</p>
+ </div>
+ </body>
+
+</html>
diff --git a/web/tomcat/webapps/ROOT/tomcat.css b/web/tomcat/webapps/ROOT/tomcat.css
new file mode 100644
index 0000000..87af4a9
--- /dev/null
+++ b/web/tomcat/webapps/ROOT/tomcat.css
@@ -0,0 +1,354 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+body {
+ margin: 10px 20px;
+ text-align: center;
+ font-family: Arial, sans-serif;
+}
+
+h1, h2, h3, h4, h5, h6, p, ul, ol {
+ margin: 0 0 0.5em;
+}
+h1 {
+ font-size: 18pt;
+ margin: 0.5em 0 0;
+}
+h2 {
+ font-size: 16pt;
+}
+h3 {
+ font-size: 13pt;
+}
+h4 {
+ font-size: 12pt;
+}
+h5 {
+ font-size: 11pt;
+}
+p {
+ font-size: 11pt
+}
+
+ul {
+ margin: 0;
+ padding: 0 0 0 0.25em;
+ text-indent: 0;
+ list-style: none;
+}
+li {
+ margin: 0;
+ padding: 0 0 0.25em;
+ text-indent: 0;
+ font-size: 80%;
+}
+
+pre {
+ text-indent: 0.25em;
+ width: 90%;
+ font-size: 90%;
+}
+
+br.separator {
+ margin: 0;
+ padding: 0;
+ clear: both;
+}
+
+a img {
+ border: 0 none;
+}
+
+.container {
+ padding: 10px;
+ margin: 0 0 10px;
+}
+
+.col20 {
+ float: left;
+ width: 20%;
+}
+
+.col25 {
+ float: left;
+ width: 25%;
+}
+
+#wrapper {
+ display: block;
+ margin: 0 auto;
+ text-align: left;
+ min-width: 720px;
+ max-width: 1000px;
+}
+
+.curved {
+ border-radius: 10px;
+}
+
+#tomcat-logo {
+ width: 150px;
+ height: 106px;
+}
+
+#navigation {
+ background: #eee url(bg-nav.png) repeat-x top left;
+ margin: 0 0 10px;
+ padding: 0;
+}
+#navigation span {
+ float: left;
+}
+#navigation span a {
+ display: block;
+ padding: 10px;
+ font-weight: bold;
+ text-shadow: 1px 1px 1px #fff;
+}
+#navigation span a:link,
+#navigation span a:visited,
+#navigation span a:hover,
+#navigation span a:active {
+ color: #666;
+ text-decoration: none;
+}
+#navigation span#nav-help {
+ float: right;
+ margin-right: 0;
+}
+
+#asf-box {
+ height: 40px;
+ background: #fff url(asf-logo-wide.svg) no-repeat top right;}
+#asf-box h1 {
+ padding: 0;
+ margin: 0;
+}
+
+#upper {
+ background: #fff url(bg-upper.png) repeat-x top left;
+}
+
+#congrats {
+ text-align: center;
+ padding: 10px;
+ margin: 0 40px 20px;
+ background-color: #9c9;
+}
+#congrats h2 {
+ font-size: 14pt;
+ padding: 0;
+ margin: 0;
+ color: #fff;
+}
+
+#notice {
+ float: left;
+ width: 560px;
+ color: #696;
+}
+#notice a:link,
+#notice a:visited,
+#notice a:hover,
+#notice a:active {
+ color: #090;
+ text-decoration: none;
+}
+#notice img,
+#notice #tasks {
+ float: left;
+}
+#tasks a:link,
+#tasks a:visited,
+#tasks a:hover,
+#tasks a:active {
+ text-decoration: underline;
+}
+#notice img {
+ margin-right: 20px;
+}
+
+#actions {
+ float: right;
+ width: 140px;
+}
+
+#actions .button {
+ display: block;
+ padding: 0;
+ height: 36px;
+ background: url(bg-button.png) no-repeat top left;
+}
+
+#actions .button a {
+ display: block;
+ padding: 0;
+}
+
+#actions .button a:link,
+#actions .button a:visited,
+#actions .button a:hover,
+#actions .button a:active {
+ color: #696;
+ text-decoration: none;
+}
+
+#actions .button a span {
+ display: block;
+ padding: 6px 10px;
+ color: #666;
+ text-shadow: 1px 1px 1px #fff;
+ font-size: 10pt;
+ font-weight: bold;
+}
+
+#middle {
+ background: #eef url(bg-middle.png) repeat-x top left;
+ margin: 20px 0;
+ padding: 1px 10px;
+}
+#middle h3 {
+ margin: 0 0 10px;
+ color: #033;
+}
+#middle p {
+ font-size: 10pt;
+}
+#middle a:link,
+#middle a:visited,
+#middle a:hover,
+#middle a:active {
+ color: #366;
+ font-weight: bold;
+}
+#middle .col25 .container {
+ padding: 0 0 1px;
+}
+
+#developers {
+ float: left;
+ width: 40%;
+}
+#security {
+ float: right;
+ width: 50%;
+}
+
+#lower {
+ padding: 0;
+}
+
+#lower a:link,
+#lower a:visited,
+#lower a:hover,
+#lower a:active {
+ color: #600;
+}
+
+#lower strong a:link,
+#lower strong a:visited,
+#lower strong a:hover,
+#lower strong a:active {
+ color: #c00;
+}
+
+#lower h3 {
+ color: #963;
+ font-size: 14pt;
+}
+#lower h4 {
+ font-size: 12pt;
+}
+#lower ul {
+ padding: 0;
+ margin: 0.5em 0;
+}
+#lower p,
+#lower li {
+ font-size: 9pt;
+ color: #753;
+ margin: 0 0 0.1em;
+}
+#lower li {
+ padding: 3px 5px;
+}
+#lower li strong {
+ color: #a53;
+}
+#lower li#list-announce {
+ border: 1px solid #f90;
+ background-color: #ffe8c8;
+}
+#lower p {
+ font-size: 10.5pt;
+}
+
+#low-manage,
+#low-docs,
+#low-help {
+ float: left;
+ width: 32%;
+}
+#low-docs {
+ margin: 0 0 0 2.2%;
+}
+#low-help {
+ float: right;
+}
+
+#low-manage div,
+#low-docs div,
+#low-help div {
+ min-height: 280px;
+ border: 3px solid #ffdc75;
+ background-color: #fff1c8;
+ padding: 10px;
+}
+
+#footer {
+ padding: 0;
+ margin: 20px 0;
+ color: #999;
+ background-color: #eee;
+}
+#footer h4 {
+ margin: 0 0 10px;
+ font-size: 10pt;
+}
+#footer p {
+ margin: 0 0 10px;
+ font-size: 10pt;
+}
+#footer ul {
+ margin: 6px 0 1px;
+ padding: 0;
+}
+#footer li {
+ margin: 0;
+ font-size: 9pt;
+}
+
+#footer a:link,
+#footer a:visited,
+#footer a:hover,
+#footer a:active {
+ color: #666;
+}
+
+.copyright {
+ font-size: 10pt;
+ color: #666;
+}
\ No newline at end of file
diff --git a/web/tomcat/webapps/ROOT/tomcat.svg b/web/tomcat/webapps/ROOT/tomcat.svg
new file mode 100644
index 0000000..8823f79
--- /dev/null
+++ b/web/tomcat/webapps/ROOT/tomcat.svg
@@ -0,0 +1,967 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Generator: Adobe Illustrator 11 Build 196, SVG Export Plug-In . SVG Version: 6.0.0 Build 78) -->
+<svg:svg
+ xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/"
+ xmlns:xap="http://ns.adobe.com/xap/1.0/"
+ xmlns:ns0="http://ns.adobe.com/SaveForWeb/1.0/"
+ xmlns:ns="http://ns.adobe.com/Variables/1.0/"
+ xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/"
+ xmlns:x="adobe:ns:meta/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ i:viewOrigin="176.7139 486.707"
+ i:rulerOrigin="-156 -296"
+ i:pageBounds="156 496 456 296"
+ width="260.162"
+ height="184.413"
+ viewBox="0 0 260.162 184.413"
+ overflow="visible"
+ enable-background="new 0 0 260.162 184.413"
+ xml:space="preserve"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="tomcat.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"><svg:defs
+ id="defs59"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 92.206497 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="260.16199 : 92.206497 : 1"
+ inkscape:persp3d-origin="130.08099 : 61.470998 : 1"
+ id="perspective63" /></svg:defs><sodipodi:namedview
+ inkscape:window-height="725"
+ inkscape:window-width="1051"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="2.1025362"
+ inkscape:cx="130.08099"
+ inkscape:cy="91.968689"
+ inkscape:window-x="35"
+ inkscape:window-y="192"
+ inkscape:current-layer="svg2" />
+ <svg:metadata
+ id="metadata4">
+ <ns:variableSets>
+ <ns:variableSet
+ varSetName="binding1"
+ locked="none">
+ <ns:variables />
+ <ns:sampleDataSets />
+ </ns:variableSet>
+ </ns:variableSets>
+ <ns0:sfw>
+ <ns0:slices />
+ <ns0:sliceSourceBounds
+ y="302.294"
+ x="176.714"
+ width="260.162"
+ height="184.413"
+ bottomLeftOrigin="true" />
+ </ns0:sfw>
+<xpacket /><x:xmpmeta
+ x:xmptk="XMP toolkit 3.0-29, framework 1.6">
+
+<svg:metadata
+ id="metadata61"><rdf:RDF>
+
+ <rdf:Description
+ rdf:about="">
+ </rdf:Description>
+
+ <rdf:Description
+ rdf:about="">
+ </rdf:Description>
+
+ <rdf:Description
+ rdf:about="">
+ <xap:CreateDate>2006-05-09T08:17:21Z</xap:CreateDate>
+ <xap:ModifyDate>2006-05-09T08:37:38Z</xap:ModifyDate>
+ <xap:CreatorTool>Illustrator</xap:CreatorTool>
+ <xap:Thumbnails>
+ <rdf:Alt>
+ <rdf:li
+ rdf:parseType="Resource">
+ <xapGImg:format>JPEG</xapGImg:format>
+ <xapGImg:width>256</xapGImg:width>
+ <xapGImg:height>184</xapGImg:height>
+ <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
+AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
+DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
+Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAuAEAAwER
+AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
+AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
+UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
+1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
+qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
+obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
+0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
+FXYq7FXYq7FXYq7FXYq7FXhH/OYHnWfQ/wAurfRLSUxXXmK49GQqaN9VtwJJqH3cxqfYnFXhP5Y/
+85O+f/JU0enaw769okbBJLS8ZvrUKg0IhnarDj/I9R2HHFX2F+Xn5neT/P8ApP6R8u3glKAfW7KS
+iXNuzdFljqaezCqnsTirK8VdirsVdirsVdirsVdirC/zM/Nvyd+XemC71255Xcqk2WmQUa5nI2+F
+CRxUd3ag+nbFXx1+Zf8Azkn+YvneaW1tLh9C0NgwXTrB2V3Sm/rzji8m3UDitP2cVfV//OOfmabz
+D+T3l+6uHMl1aRPYTsxqSbVzEhJ7kxKhxV6VirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd
+irsVfHn/ADlxdSa7+bvlvyvGx4RW0EVARtNfXJVqf7BY+uRlKgT3JAt5r/zkD5ZGgfmfqSRR+nZ6
+gsd9agdOMq0f/ksj5h9nZvEwgnmNi2Z4cMiw/wAqebPMHlTXLfW9BvHstQtjVZEPwstQWjkXo6NT
+4lOxzOan3v8Akl+cel/mX5a+tAJa69ZcU1fTlJojGvGWLluYpKbV6GqmtKlV6NirsVdirsVdirsV
+eWfnr+eGl/lroywwBLzzPfox02wJqqL0+sT03EanoOrnYdyFXwh5i8x655j1i41jW7yS+1K6blNc
+SmpPgABQKo6BVFB2xVnf5Q+SjrWh+d9Yli5w6XolylsadbqSNnTj8kiYf7IZg6zUeHKERzlIfL8U
+3YoWCe4Pff8AnCfVTN5D1zTCamz1P11HcLcQIAPlWE5nNL6KxV2KuxV2KuxV2KuxV2KuxV2KuxV2
+KuxV2KuxV2KuxV2KvjD8wm/Sv/OX8UTGsdrqGnCMNUU+rW0Mp6f5ammY2sNYZ/1T9zZi+oe9m/8A
+zkx+Xc/mPytFrunRepqehc3ljUVeS0cAyAU6mMqHA8OXfNB2PqhCfAeUvv8A2uZqcdix0fIedQ69
+m35OefrryN+YOla2kpjsjKttqqDo9nMwEoI78ftr/lKMVfaeqf8AOSH5KaaSs3meCZx0W1inuanf
+YNDG69vHFWM3v/OYn5QW5YQ/pK8ArQwWqitPD1pIuvviqVT/APObH5cKR6GjaxIP2i8dqhB9qTvi
+qmP+c2fIFd9C1Wnfa2/6q4qmFv8A85n/AJUSvxksdZtx/NJb25H/ACTuHOKp3bf85XfkpPBI7avN
+BIisywS2lwGcqCeIZUdKmm1WGKvijzz5x1bzl5q1HzFqjlrm+lLrHWqxRDaOFP8AJjSij7+uKpNb
+W1xdXMVtbRtNcTuscMKAszu54qqgbkkmgwE1uVfbHkL8uk8o/lTPoMiK+o3drPNqZHRrieIhlr4I
+tEB9q5yWo1fi6gS/hBFfN2UMfDAjqwT/AJwdvyt/5usC20sVlOq77em0yMR2/wB2Cudc619ZYq7F
+XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXxZKTJ/zmFc+oedNTmA5b/ZtG49fCgpmH2h/
+cS9zbh+sPqDrsc4t2r57/Nf/AJxkGo3c+teSTFb3ExMlxo0hEcTMdybd/spU/sN8PgQNs3+i7Xoc
+OX5/rcLLpusWIaF/zif56vFWTVr6y0pG6xgtczL81QLH90mZWTtnFH6bk1x0sjz2Z1pf/OIvlOIL
++lNbvrthSv1dYrZSe+zC4ND88wp9uTP0xA9+/wCptGkHUsms/wDnGf8AKS3AEunT3dOpmupxXam/
+pNFmPPtjOeRA+H67bBpoPDv+ch/yt03yXrdjeaFbG30HUouCQ8pJBFcQ0DqXkZ2+NSrCrfzeGbns
+vWHNAiX1BxdRi4TtySH8jfJdn5u/MOy07UIfrGl28ct3fw1IDRxrxUEqQaGV0By7X6g4sRkOfRhh
+hxSp9N3X/OO/5P3FSdBETGnxRXN0nT/JEvH8M50dq6gfxfYHOOnh3JDqP/OKn5a3NTazajYt+yIp
+0dfpEsbn/hsvj21lHMRP497A6SPmwzW/+cQr9A76H5himO/CG9haL5AyxGT/AIhmXj7cifqiR7t/
+1NUtIehZh+S3/OP8Xk+5GveYXivNfTkLSKIloLYGqlwzBecjL3p8P45i9odqeIOCH09fNtw6fh3P
+N7DfIz2VwijkzRuFA6klTmpxmpD3uRLk+bf+cJrrj+Yet2tT+90hpeP7J9O5hWp9/wB5tneunfZm
+KuxV2KuxV2KuxV2KuxVZLNFDG0srrHGu7O5CqB7k4qks3nzyNC5jm8xaZHIOqPeW6nf2L4qmFhrW
+j6iK6ff294KVrbypLt1r8BPjirAvzb/Pnyf+WrW9rqKS6hq90vqRaba8eaxVp6krMQEUkEL1JPbq
+cVYFof8Azmp5BupVj1fR9Q0wNsZo/SuY1/1qGN6fJDir2Xyf+Yfkrzjam48taxb6iqgGSKNisyA9
+PUhcLKn+yXFWRYq7FXYq7FXxRrBNj/zl/NVwC+rL8XtcWw+Hf/jJTMXXC8M/6pbMP1h9SZxLtnYq
+7FWG+afzg/LnyvdNZ6vrUSXqGj2sKvcSofB1hV+B/wBamZmHs/NkFxjt8mqWaMeZRPk78zvI/nF5
+ItA1RLm5hHKS1dXhmC1pyEcoRmXputRkdRosuLeQ2TDLGXJCfm/5JXzj5D1HSo05X8a/WtNPcXMI
+JUD/AFxVP9lk+z9R4WUE8jsWOaHFGnl3/OI/lpodN1zzFMlGuJUsLcsKELCPUlpXsWkQfNc2Xbmb
+eMPj+r9LRpI8y+hc0DmuxV2KuxV2Kvl//nClHP5oas4B4Lok6luwLXdqQPpoc9AdK+08VdirsVdi
+rsVdiqXeYPMOi+XtIudY1q7jsdNtF5z3EpooHQAd2ZjsqjcnYYq+VfPf/OV3nXzNqp0D8stPlto5
+mMcF0IfrGoT+8UIDrGD8mbvVcVSqz/5xn/Pjzs66h5t1RbUueX+5W7kurgA/yxx+sq/6pZaeGKsj
+h/5wanMYM3nNUk7qmml1/wCCN0n6sVQt7/zhDr8B56Z5stppEIMZntZLfcb1qkk9KHFXzr5mtdUs
+tfv9O1S5a7vtOuJbKaZndwWt3MZ4mSjcartUDFUsxVFabqeo6XfQ3+m3UtlfW7c4Lq3dopUbxV1I
+IxV9Sfkr/wA5aNcT2+gfmG6K8hWO18wqAi1OwF2q0Vf+Mi0H8w6tir6lVlZQykMrCqsNwQe4xVvF
+XYq+Kfzzro3/ADlLa6oxKJLdaReFiaApGsMLeG1ISMqzw4sco94LKBogvqPOEdw7FXkf55/mBrlj
+Jp3kbykX/wAVeYSFE0Zo8FuzFOSt+wzlW+P9lQx2NDm27N0sZXlyfRFxs+Qj0jmUd5B/IHyP5bsI
+31Oyh1zWnAa6vb1BMnqHciKKSqKAehI5e+Q1XamTIfSeGPlzTj08YjfcsJ/PDy5pXkHX/LH5geW7
+WPTGhvlt9Rt7RBFHKpBk+wgCjnGkiPQbg5m9m5jnhLFM3s1Z4iBEg+hOu4zn3NQOkaLpuj20ltp8
+IghlnnunRe8tzK0sh/4JzQdhtlmXLKZuXdXyYxiByR2VsnYqxjV/zO/L3SJWh1DzDYQzoaPD66PI
+p/ykQsw+kZlY9Dmnyifu+9qOWI6pvoOvaRr+kwato9yt3p1zz9C4UMob03MbbMFOzoR0ynLiljkY
+yFEM4yBFhV1WVYdLvJWJCxwSOxHWioTjhFzA8wsuRfPn/OEVoX83eZLzekOnxQnpSsswb/mVneOn
+fYOKuxV2KuxV2KqF9e2lhZT315KsFpaxtNcTuaKkcYLMzHwAFcVfFHnPzR50/wCchPzJi8veXlaH
+y7aO5sYnqsUUCkK97dU/bYdB2qFXcklV9U/lj+UnlH8u9IWz0a2WS+dQL7VpVBuLhh1q37KV+yg2
+Huakqs1xV2KuxV8v/nf/AM4patrnmG+80eSp4Xn1GR7m/wBIuW9ImdyWd4JSOH7xjUq9KGvxb0Cr
+5/1j8mPzX0iRkvfKepgL9qSC3e5jG9P7yASJ1PjiqRjyb5vMvpDQ9QMtePpi1m5culKca1xVPtG/
+JT82dYdUsvKepUf7MlxA1rGe395cekn44q+zf+cffKv5m+VvJ50bzvPbzRwFf0RFHK01xbxU+KCV
+6cCqmnDizU3FaUAVeo4q7FXx5/zmxpD2vnTy7rcdUN5YPbh12POzmL1qO4FyuKsl/Lz/AJyc8ra2
+sNj5mUaHqZAU3TGtnI3Qnn1ir1o/wj+bOY1XY8474/UO7r+1z8epB2Oz2iKWKaJJYnWSKQBkkQhl
+ZTuCCNiDmnIINFygVGXTNOmvYb6W1hkvbbkLe6eNWljDgq3ByOS1UkGhwjJIDhs0ei0LtE5FLxD/
+AJyycP5F0ezQcp59WjaNdt+NvMp/GQZuuxI/vJH+j+lxNWfSPe9rgiEMEcQNRGoQE9+IpmmlKyS5
+QCpgSsllihieWVxHFGpeR2NFVVFSST0AGEAk0EEvn2fVfOv5269e6foN9Jof5e6fIYbm9QMst2af
+ZIBUtyG4QkKqkFqmgzfiGLRQBkOLKfx+C4ZMspobRZzof/OOv5U6VCiyaUdSnUUa4vZZJGb5opSL
+7kzBydrZ5HY8PuDbHTQDP9G0XStE02HTNJtks9Pt+Xo20Qoi83LtQe7MTmBkyynLikbJboxAFBJv
+zO1Aaf8Al35lu60ZNNuljP8AlvEyJ/wzDL9FDizQH9IfYxymol59/wA4P6S0eg+adXI+G6ura0Vv
+e2jeRgP+kkZ2zqX01irsVdirsVdir50/5zJ/MGbSfK1j5PspOFxrrGa/KmhFpAwon/PWWn0KR3xV
+mf8Azjd+WEPkj8vrae5iA17XES91KQijorrWG333HpI24/mLYq9YxV2KuxV2KuxV2KuxV2KuxV2K
+obUdT03TbR7zUbuGytI/7y4uJFijX5u5VRir5U/5yz/MX8tfNfl7S7DQtZh1LW9NvS5W2V3iFvJG
+yyUnC+kfjVPsscVSv8i/yi/LTzn5Ij1XVLSafU4J5rW9C3EkaFlIdCFQrT926980XaOuy4cnDGqI
+vk5eDDGQsvdvKXkby35StXtdBgmtrZ6Vge6uZ4wf5ljmkkRCe5UCuaPPqp5Tc9/gHLhjEeSN8x3+
+o6foGoX2m2hv9QtoJJbWyFazSKpKxjjv8R22yOCEZTAkaBZTJAsPHv8AlcP53/8Altpv+BuP+ac3
+H8n6X/VPti4vjZP5rzz8wfPP5i+bfNvluw1Dyq1rqWjzG+g0ROZmuRVZDVGHPjxgbcDpXNhpdNiw
+wkYy9Mutj8dWnJOUiAQ9D/5XD+d//ltpv+BuP+ac1/8AJ+l/1T7Yt3jZP5rv+Vw/nf8A+W2m/wCB
+uP8AmnH+T9L/AKp9sV8bJ/NYp+ZX5v8A5qXnli40LVfKbaCutAWkdyxlWRwWXnHGrheRdfhI8DmV
+pNBgE+KMuLh9zXkzTIoirR/kbzf+bvlHy1Y+XtO/LedobYENM6zK0kjtyeRzxoOTH6BtkNTp9Plm
+ZyyfaEwnOIoRej+RPO35o6xr62fmPyf+hdNMTub71C1HWnFaV/azX6rS4IQuE+KXds348kyaIZ7q
+jaqthKdKSCS/pSBbp3jhr4uY1kbbwA38Rmux8PF6r4fJuldbPlv8+YvzstdPS483apafoO7nEEVh
+pcjJbl6NIA0bKkjgenWsnKhpnTdnHTH+7HqHfz+f6nAz8f8AFyfQ3/OLHl06N+TWkyOnCfVpJ9Rm
+Hj6r+nEfphiQ5t3GeuYq7FXYq7FXYq+MfzQhXzz/AM5YWmgz1lsLe7sbB4zvW3gRbi5TvSrNLir7
+OxV2KuxV2KuxV2KuxV2KuxV5j59/5yM/K7yb6kFxqQ1TU0qP0dpvG4cMO0kgIij36hn5e2KvAvMv
+/OWP5p+arl9P8laWukxtXiYIzfXvHpUuy+mg+UdR/NkJ5IwFyIA80xiSaDF/+VT/AJo+b7sah5w1
+h1kavx3sz3k617KgYoo9uYp4ZptR7QYIbRuZ8uXzP7XMx6GcuezJYf8AnH3yrBptwjXFxd6g8LrB
+NIwSNJSpCOEQA7NvRmOak+0eQzGwjCxfU11/FOT/ACfEDnZYH+S+sfmZZeajoHlC8htrq6ZnubC/
+K/VnMAPLkrAtyUdfT+Kg8BnSa7HhMOLINg6/CZA1F9k6KdbOmw/pxbZdTp/pH1IyNAW8U9UK9Pnn
+I5eDi9F8PnzdlG63R2VsmndUUu5CooJZiaAAdSTiBaHhP5N8/On5r+bPzEkBbT7dv0do7EGhWgUM
+tRswgjUsP+LM3vaH7nBDCOZ5/j3/AHOJh9UzJ7vmicx2KvEf+clQLS78i63cEjT9O1cC6O3H4mjl
+FR/qwPm77G3GSPUj9f63E1XQvbQQQCDUHoc0jlN4pSXzN5z8q+V7ZLjX9Tg0+OSvpLK37x+PXhGv
+J3pXfiMuw6bJlNQFsJ5BHmXzJ+dn5haf+Z/mby75e8qtLPbLN6EbyI0YluruRI0oh+KigChIHU50
+/ZmilhieL6i4GoyiZ2fbWh6Ra6Noun6PaClpp1tFaW4/4rgQRr+C5s3HR2KuxV2KuxV2KvjfymCP
++c0p/rdK/pTU+POlKfUp/S/4144q+yMVdirsVdirsVdirsVeQfmX/wA5Ofl55MaaxtZv0/rcdVNl
+ZMDEj+E1x8SL4ELyYdxir5W/Mf8A5yD/ADJ88GSC6vjpmjyVC6VYFoYmQ1FJXr6kte/I8fADFXme
+Kvpj8jdTtb3yJBFFGkdxYyyW9zwVU5MDzRzTqSjipPU1zhvaDHKOosk8Mht5d/6/i7rQSBh5h6Fm
+ic12Kvnvz6l35B/Nqz8z2CEQyzLqMSqeIY143UVf8upr7Pnedl5RqdLwS5gcJ/R9n2uj1MPDyWPe
++wdL1Ky1TTbXUrGQTWd5Ek9vKOjJIoZT9xznMkDCRieYc2JsWisgyYZ+b1p5vvfIGqWPlSFZ9Tu0
+9F1LiN/q77TelXYuV+EAkddt6A5vZ8sccoMzsPv6NOYSMdnzl+Wn5m/mVoKR+RtEtNLsrmGWSsOp
+q1vM87t8Su8ssS+p0UKaGgAGdDqtHhyfvJ2fd3fBwseWUfSHq36V/wCcqf8AqzaN/wAGn/ZRms4N
+B/OP2/qci83c79K/85U/9WbRv+DT/sox4NB/OP2/qW83c8o/Mj8z/wAy/MAm8i6zaaZfXU0sY9HT
+Ea4lSdGqqxvFLKvqbFSBXqQc2el0eHH+8jY2693xcfJllL0l9KflXb+bbXyJpVp5riWLV7aIQsqu
+JGMSbRGUio9ThQNQnx70znNccZyk4+R+9zsIkIi2W5iNqB1xdH/RF2+sxQy6XFE8t4tyiyRelGpZ
+i6uCpAAyzFxcQ4D6ixlVb8nzj/zjB5UtfNn5xal5tisltNE0Rpbu1tEUCOOa6ZktYgBt+7j5tt3U
+Z3UIkRAJt1BO77PySHYq7FXYq7FXYq+M/wAyX/wb/wA5b2WsP+7s7q90+7Zz8NILlEt7htqV3EmK
+vszFXYq7FXYq7FWGfmR+bnkn8vrD6xr16PrkilrXS4KPdTdacY6jitRTmxC++Kvjz80/+clPPvnk
+TWVq50Py45KfULRj6kqntcTjiz1H7K8V8QeuKsQ/KyLyvP5wtbTzFbC4trn91bc2IjW4JBj9QAjk
+G+zQ7VIrmB2mcowE4jUh93Vv0wiZgS5Po7zD5J8ta/pa6bf2UfoQrxtWiAjeDbb0io+Hp06eIzht
+N2jmwz4oyu+d7373dZNPCYoh8/effyj17yuZLu3B1DRgSRdRr8cS9f3yD7P+sPh+XTOz7P7Wxajb
+6Z936u90+fSyx78wnP8Azj5r4s/M11o8jUi1OHlED/v63qwA+cbP92YvtDp+PCJjnA/Ydv1NugyV
+Ou99C5xDuWDeefKvnzV9WiufL+v/AKKskt1jkt+Ui8pQ7sX+AEbqyj6M3XZ2t02LGRlhxyvnQO23
+e4eow5JSuJoe8sD81/lL+ZF9pj3Go65Hq7WKPLBbMZGc7VZY+S9WC9O+bnSdsaQTEYQ4OLyAHxou
+Jl0mWrJuvel/5Q/8rK80ySeXdA85S6P9Qh9W2spZ51RouXx+kEDD4CwqPfbvmz1pw4xxzhxX5Bxc
+XFLYGnv35Y+RfzR0DXri881+af03p0lq8MVp6s0nGZpI2WSkiqNkRh9OaLW6rBkgBjjwm+4D7nMx
+Y5g7m3p2axyGGfmF+U3k/wA82pGq23paii8bfVIAFuEpWgLU+NN/st9FDvmZpddkwnbePc1ZMMZ+
+95R/iv8AMz8lbm20/wAzMPMvk2Z/Ssr5XpcIBvxXmSwKr/ut6r2Vxm28HDrAZQ9OTr+P0uNxzxbH
+cNSeb/zJ/Om9uNM8pk+XPJ0Lelf6g7D13DD7L8DyJZf91oafzNTEYMOjAlP1ZOn7P1qZyymhsHrH
+5d/lN5R8i2gXS7f1tRdaXGqTgNcPXqAeiJ/kr9NTvmq1euyZjvtHucjHhEPezPMJuePedvy3/OXV
+fNF/qGg+c/0ZpM7KbWx9a4X0wI1VhxRSoqwJ2zc6fWaaMAJQuXuDizxZCbB2eNfm7F+Z3lQQaDr3
+nKXV21SJmm0+GedgIQwCmVXC7OwIUd6HNtopYcvrhDhrrQcbKJR2JeieSv8AnHD8+9H0SJtG83Q+
+XlvlS5udPinuonSR0Hwy+nHxLqPhO5zYtD2r8mvJH5m+V/0x/jjzN/iL659W/R/76eb0PS9X1f75
+Vpz5p08MVel4q7FXYq7FXYq+Xv8AnNjya81joXnG3Sv1Vm0y/YCp4SEy25PgquJB82GKva/yY87J
+5z/LXRNbaTneNALfUfEXVv8Au5SR25leY9mGKs2xV2KrZJI4o2kkYJGgLO7EBVUCpJJ6AYq+aPzm
+/wCctrTTWn0L8vmjvL1ax3GvOA9vEehFsh2lYH9tvg8A1cVeMfl95AvPzCvLrzP5l1SW6iNwUueT
+tJdTyqqsQ7tXgvFgPGmwp1zS9rdrflqjEXMj4OZpdL4m5Oz3O18seXrXSP0PDp0C6ZSjWhjVkb3c
+NXk3ud842etzSyeIZHi73bDDAR4a2eaeb/yBsLlmvPK9x9QuQeX1OYs0JPX4JN3j/EfLN9ovaIj0
+5hfmP0j9XycLNoBzh8noHku+1y50OKLXrV7XWLT9xeB6FZGUCkyOvwsHG549DUds03aOLHHJxYiD
+jluPLy8v1OXp5SMakPUE9IBBBFQdiDmCDTe841/8pLaHW7bzL5U42OqWkyzvYfZt5+JqyrT+6LrV
+f5fl1zoNL21xQOLPvGQri6j39/3+9wMujo8UOY6PSB06U9s54uewnzt5H8z69qsV5pXme60W3jgW
+F7WAyhWcO7GQ+nLGKkMB07Zt9BrsGGBjkxiZvnt5d7iZ8M5m4ypj/wDyqbz9/wBT/f8A/BXP/ZRm
+d/K+k/1CPyj+pp/K5f55+15z518keZ/y91G01W01SZ2nLiPVrYyW8qTMDzQurFgXQnfl8Qrm90Pa
+GLVxIrl/CXCz4JYiHv8A+Qeia/NDH5tufO155k0u+s3gGm3Tzt9XufUjZuQkmlUPHwZdh0NQaHfV
+9qTgP3YgIyB57bhv04PO7eyZp3KYZ+afm/zN5Z0KGby5okmtanezC1gVAXSF3UlXkRPjYbdqDxYd
+83Q6eGWR45cIG7TmmYjYMC8p/kVrGu6ovmj81b1tV1Njyi0YODBEOoWQp8FB/vuP4fEtXM7P2nGE
+eDAKHf8Aj7y1QwEm5orzX+Rd9pepP5n/ACuvm0HWlq0mlhqWc46lFBqqV/kYFP8AVyODtMSHBnHF
+Hv8Ax9/NM8BBuGxZB+VP5j+ZPMs9/ovmbQJ9J13R1Q3s3ErbPzNEoGPJWehIA5KQKhu2Ua7RwxgT
+hK4yZYcplsRuHo2a1yHh35u+SvN1nNrXnD/lYl/omiIFli0yB7gBSEVFiiC3EacpHGwAG5zd6HPi
+lw4/DEpd+3z5OJmhIXLi2eW/lJ+UXnn829Svtdl1ue0XTjGo127MtzM9ytDHHG5dXrGg5E8vh+Hx
+zo4QERQFBwSSeb2z/oXX86P/AC8Gq/8AI2+/7Kskh6L+UP5dedPJv6W/xN5wu/Nf1/6v9U+tvO/1
+f0fV9Th68s3956i1pT7OKvRcVdirsVdirsVY/wCf/J9l5x8nar5bvKLFqMDRpKRX05R8UUlP8iRV
+b6MVfLf/ADiz50vvJX5han+XXmGtsmoztDHE/SLU4Dw4jt++Qca9yEpir7ExVK/MnmbQvLOjXGs6
+5eR2Om2q8pZ5TT5KoG7M3RVUVJ6Yq+M/zS/PHzr+bWrnyv5Vt5rPy67fDZoaS3CqaerduDRU/wAi
+vEd+RplWbNDFEymaiGUIGRoc0Nc/846uugI1vqXPX1BaRGFLVtv7tTTmtP5z18BnOw9pInLRj+77
++vv/AB9rsD2eeHY+pV/Io6rofmDWPK2rwSWlzJEl3FBIKCsbem5UjZuYddxUHjke34xy4YZYGwDW
+3n/YuhJjMxL2rOSdq7FXYq7FXYq7FXYq7FUt8w6Bp2v6Pc6VqCc7a5XiSPtIw3V0J6Mp3GZGl1M8
+GQTjzH2+TXlxicaLxryB5w1r8nPPM+i63yl8v3rKbrgCVKE0ju4V8R0ZR13HUDO3ywx67CJw59P1
+H8ebpgZYZ0X1xZXlpfWkN5ZyrPa3CLLBNGQyOjiqspHUEZzE4mJo8w54N7q2RS7FXYq73xVTuLi3
+treS4uJFht4VMk00hCoiKKszMdgAOpwxiSaHNBNPlfzv5j8wfnh+Yll5O8qBhoVtKTFKwIQqvwzX
+047IgNEB33p9p6Z13Z2iGGNn6zz/AFOtz5eM+T7B8j+TdG8m+V7Hy7o8fCzso+Jc/blkO8ksh7s7
+bn7htTNi0J9irsVdirsVdirsVdirsVfLP/OXf5WXENxb/mXoKNHNCY4tbMNVdWQhbe7BG9RtGx/1
+PfFWefl3/wA5I+VdQ/KqTzN5mu0ttV0YLbavarT1Z7gqfSaCPbl9YCkgdFIb9la4q+cvNPm3z/8A
+nr5uCUNnolo1YLRSxtrOIkgSSdPUmYd+p7cV6Yms1mPTw4pn3DqW3FhlkNB695O8l6J5U00Wemx/
+vHAN1duB6szDux8B2XoM4LXdoZNTK5cug7vx3u7w4I4xQT/MFvUJbGzluYbqSFGubfl6ExA5oHFG
+AbrQjqMsjmkImIPplzDEwBIPUNahew2Nhc3s54wWsTzSt4JGpZj9wxw4zOYiP4iB81nLhBPc8w/J
+Tzn5v8y3mqHV7oXFlaIhjHpojLJKxIAZQtQFQ9a50XbujwYYRMI8MifsH4DgaLNOZNmwHq+cy7F2
+KuxV2KuxV2KuxVjXnzyLpnm/SDZ3P7m7hq9leAVaJyO/ijftL/EDNj2d2jLTTsbxPMfjq4+o04yD
+zeb/AJZ/mj5g/KrXZPKnmyKSTQS9QFq5t+Z/v7c/txP1ZR8x8VQet1Gmx6vGMmM+r8bF1UJyxS4Z
+PqrTNT0/VLCDUNOuI7qyuVDwXETBkZT3BGczkxygeGQohzgQRYRWRZOxVSurq2tLaW6upUgtoVLz
+TSMEREUVLMxoABhjEyNDcoJp8v8A5n/mrr/5n65D5E8hQTTadcy+kxQcZL1lNeTV+xbpTl8VNvia
+nTOp7O7OGL1S+v7v2uvz5+LYcn0j+SX5N6V+Wvlv6uCl1r96FfV9RUGjMKlYoq7iKOu38x+I+A2z
+jPR8VdirsVdirsVdirsVdirsVSDz3rvlfQ/KWp6h5oaMaGsDx3kUgDCZJFK+iqEjm0leIXvir81d
+SfTpdTupdPhkt9MedzawyMJJI4WYmNGeihmCbV74q+q/y8tfLEHlOyPlsV06VefqGnqvJ0czH/fl
+RQ+HQbUzzrtWeY5z4v1D5V5eTv8ATCAgOFkma5yHYq7FWIfm3qBsfy81mRftSxLbge08ixN/wrHN
+r2Jj4tVHys/Z+txdZKsZSD/nH3TRb+S5rwj4767kYH/IjVYwP+CDZm+0mQnNGPQR+/8AAauz4+gn
+zenZzrnuxV2KuxV2KuxV2KuxVjnnbyLovm3Tfqt+np3MYJtL1APUiY+Feqn9pe/zocz9B2jk00rj
+vHqPx1aM+njkG/N4/ovmf8xfyX1w2rr9b0W4fkbVyxtLgDq8T0Jikp12r4gimdkPA12PiHP7R7/x
+7nUETwyovpX8vvzc8m+eLZf0ZdCDUgKzaVcEJcKR1KitJF/ykr70O2aHVaDJhO4uPf8Ajk5ePNGX
+vTXzl578seTtMOoa9eLboa+hAPimmYfsxRjdj+A7kZVp9LPMaiP1Mp5BEbvmXzJ54/Mb87vMcflj
+y1ZyQ6SzhksENFCKf96L2YbcV60+yDQAM1Cep0eghgF85d/6nX5cxn7n1H+S35IaB+Wmkkxlb3zD
+eIo1LVGHyJhgrukQbfxbqewGe0vSsVdirsVdirsVdirsVdirsVQup6np+l6fc6jqNwlrY2kbTXNx
+KeKJGgqzMfYYq+HfzQ/MTzL+dvnmHSNFR4PLtm7fo+2eoUIKh7y5pX42BoB+yPhG5JajU6mGGBnM
+7BnjxmZoPQ4Pyv8AK8fk1vK5i5W8g5yXVAJjcU2nr/MO3am3TOGl2xmOfxfs6V3ft73dDSQ4OH7X
+kehaz5g/KfzbLpWqK0+jXLB5VQfDJGaqlxDU7MKfEv0HsR0uowYu0MAlA+ocvI9x/HmHXY5ywTo8
+n0Fp2o2OpWMN9YzLcWlwoeGZDUEH/Pcds4jNhljkYyFSDuYTEhY5KzTQoaPIqnwJAOCOOR3AKmQH
+VyzQueKyKx8AQTiccgLIKiQPV5t/zkDctD5FijHS5voYm37BJJP1x5vPZwf4Qf6h+8OH2h/dj3p3
++UNt9X/LnRkoQXjklNRQ/vJnf9TbZjdtyvVT+H3Bs0Y/dBmOalynYq7FXYq7FXYq7FXYq7FUHq+j
+6ZrFhLYanbJdWkwo8Tjb2II3Vh2I3GXYNRPFLigaLCeMSFF4R50/JTXdCnOq+VpJby1ib1FjjJF5
+ARuCvGhenYr8Xt3zstB25jzenJ6Z/Yf1fF1OfRShvHcJFJ5F/M7zRY3PmTUI7m8eKMFHvZHa6mRe
+0SvV2CjcdK/s1OZsu0NNimMVgHy5D39zQMGSQ4qfTP8AziV518hXnlX/AA3p1lBpPmi0XnqUIr6l
+6F2+sq7lnfr8SV+A9AFIzYtD6BxV2KuxV2KuxV2KuxV2KuxV2KvjX/nI7847/wA+eYk/L/ye7XGj
+QTiO4kgNRfXSnswNDBEeh6Egt0CnIZMkYRMpGgExiSaDJvy88h2PlDRRbJxl1G4o9/dAfbcDZVPX
+gn7P3988/wC0+0Zamd8oDkP0+93um04xx82vOP5meVvKoMV7OZ7+lVsLejy+3PcKg/1j8q4dF2Tm
+1G4HDDvP6O9c2qhj25l47r/mfzt+ak6aXovlxrmO3f1I47SF7meOuxLzAURT32UZ1/Z/ZcNNdEkn
+n3fJ1OfUnJzDFvNXl7z35Lu/8P8AmCG60uQoLhbNpaxMsg+2nps0TVpQkHqKHcZseEXdbtFsbySH
+Yqu9ST0/T5H068uFTx5UpWnjir2HyZ+T/wCfGr+U9O1/yreSS6VdKzWkEOo+iQI5HRlMcjxoPjjI
+pXKMmmxT+qMT7wGcckhyJCOudA/5yq0IfvtM1G4VDuscNvqFadqwidj07HMXJ2Tpp84D4bfc2x1W
+QdUvl/Oj8y9CmEPmHQ0iPQpc209pKT1/aNP+FzCyezunly4o/H9bbHX5Bzop1pv/ADkboslBqWkX
+FsfG3dJx8/j9HNfl9mZfwTB94r9bkR7RHUMv0r82/wAvtSoserx28ndLoNb0/wBlIFT7mzWZuxdT
+D+HiHlv9nP7HIhrMcutMst7i3uIlmt5Umib7MkbBlPyIqM1s8coGpAg+bkxkDuFTIJdirsVdirsV
+dirH/PXm608q+XZ9Umo8391ZwH/dk7A8V+Qpyb2GZ/Z2iOoyiP8AD19zRqMwxxvq+cfL9n+Yf19/
+Omi29ytzYytfnU41CgPyLOyhqCTqeSqDt1FM7+WoxYyIGQBOwDoxjlIE0+1/yK/O7S/zJ0IpP6dp
+5nsVA1LT1OzrsPrEAO5jYncdVOx/ZJyGt6jirsVdirsVdirsVdirsVfO/wDzlT+dh8vaa/kfQJ6a
+7qUf+5S4jPxWtrINoxTpJMD8wm/7SnFWA/k3+W48v6eNZ1OL/c1ep8EbDe3hbfhQ9Hbq3h08a8V2
+52n4svCgfRHn5n9Q/HR3Gi03COI8yl/5qfm5LYTt5d8sP6mqM3pXd3GOZiY7elFStZa9T+z0+10v
+7I7G4gMmUbdI/pP6mGr1demPzZX+UH/OJcl6I/MP5lNKZJj6sehB2EjV35XkoPKp68FNfFuq51wF
+OqfT2j6Jo+i2Een6RZQafYxf3dtbRrFGPfigAqe5xVj35mflh5Y/MLy++k61CBKgLWGoIB69tKf2
+o2PY0HJejD6CFXwV+Z35WeaPy715tL1qHlbyFmsNRjB9C4jBoGU/st/Mh3X5UJVYdirsVfb3/OHX
+mKPUfyrfSS9Z9EvpovTrUiK4/wBIRvYM7yD6MVe7YqsmhhniaKaNZYnFHjcBlI8CDtirDde/JX8q
+Ne5HUvK1g0j15zQRC1lJPcyW/pOT9OKvMfMn/OF/5eXwZ9D1K+0aY/ZRit3AP9g/CT/krirzTVv+
+cTvzh8tSPdeVNVh1EDoLS4exuWp4rIVj/wCSpyGTHGYqQBHmmMiNwxq58/fnT5ImW382aVMYgeIO
+oWzRch0pHcRhUfp1+LNVn7C02TcDhPl+rk5UNbkj1tlGgf8AOQHlS94x6rBNpUx6uR68P/BIOf8A
+wmaPUezmWO+MiX2H9X2uZj7QifqFPRNK1vR9Wg9fTL2G9iHVoHV6V7NQ7H2OaTPpsmI1OJi5sMkZ
+cjaNyhm7FXYqlGq+VNC1fULe91S2F69opW2hn+OFCxqzekfhLGg3avTbMzDrsuKBhA8N8yOfz/U0
+zwRlKzumyqqqFUAKBQKNgAO2YhJJttp84edta0nyl+Y0Gu+Qr/0NQtH9W4WAfuI5wfiRSDxdJBUO
+lOPUd6D0PsqWc4R4w36d5Hm6HUiAn6H2P+TH5xaN+ZXlwXcIW11u0ATVdM5VMbnpJHXcxP8Asnt0
+PTNk470PFXYq7FXYq7FXYqwf84fzP078uvJtxrU/GXUJawaTZMf765YbVA34IPic+G3UjFXyR+U/
+lPUvNnmK589+ZXa65XDzRPKB/pF2Wq0h7cIz0AFK7D7NM5/tztLwo+HA+uXPyH6z+OjnaLT8R4jy
+DOPzf89t5Y8v+hZScdX1HlHbEdY0A/eS/MVovufbNJ2J2f4+TikPRD7T3fr/AGubrM/BGhzKf/8A
+OK/5HQWtjb/mF5ltxLqV3+90K2mBPoxHpdMD1kk6x+C/F1O3dukfTGKuxV2KpL5v8neXfN+hz6J5
+gs0vLCffi2zxuPsyROPiR17EfqxV8N/nR/zj/wCZfy5umvYeep+VpXpb6mq/FFyPwx3Kj7Ddg32W
+7UO2KvKcVeu/84z/AJoQeRvPwi1KX0tC11Vs7+RjRIpA1YJ29kZipJ6KxPbFX3sCCKjcHocVbxV2
+KuxV2Kqc9vBcQvBcRrNDIOMkUihlYHsVNQcVeX+cP+cZ/wAovM3OQ6QNIvH/AOPrSmFsQf8AjDRo
+D/yLrirw/wA0f84fef8AQZ21DyRrKal6dTHEWNhejwVH5GJvmXT5ZGURIURYSCRyYf8A8rL/ADW8
+jXo03zjpUslK8Y7+JreVlXasU6rxdf8AKo3zzT6rsHBk3j6D5cvl+qnLx62cee7P/LX5zeSdbKxS
+XJ0y7bb0byiKT/kygmP5VIPtnO6rsLPi3iOOPlz+X6rc/HrYS57FnSsrKGUhlIqCNwRmmIINFywW
+8CWLebfLnmTzCG0+PVV0jRm2n+rK0lzOpG6s7FFjXtRa17nembXRavBp/VwmeTz2A93P5uLmxTnt
+dRSjR/yO8g6cVea2l1GVTUPdyEiv+pH6aEfMHL83tBqJ/TUfcP12whocY57sS80+XfMH5YeaLfz3
+5JdorSKStxbAExxBz8UUigjlbydP8n58Tm97H7WGccE/7wf7L9vf8/dhavS8BsfT9z6x/Kf81NB/
+MbyzHq2nEQXsVI9U0xmDSW03genJHpVHpuPAggb1wmbYq7FXYq7FVK6ure0tprq5lWG2gRpZ5nIV
+ERByZmJ2AAFTir4W89eZtV/PD81xHas8Xlyw5RWXb0bJGHqTsDt6s7U/4Vei1zE12rjp8Rmfh5lt
+w4jOVB7Zp2n2enWMFjZxiG1tkWKGMdAqig655xmyyyTM5G5F6CEREUOTxPS9Gb81/wA/YNJlLNo1
+tMUuKbUsrEky0I6es9QD25jPQ+zNL4OCMevM+8/inQ6nJxzJfdcUUUUSRRIscUahY41AVVVRQAAb
+AAZntC/FXYq7FXYqo3dnaXtrLaXkKXFrOpjnglUOjowoVZWqCD74q+T/AM7f+cTri0a48wfl7E09
+pvJdeX6lpY+5NqTu6/8AFZ+Ifs16BV8xyRyRSNHIpSRCVdGBDBgaEEHoRiqLv9b1nUEjS/v7m7SF
+VjhWeV5QiIOKqocmgUbADFU/8k/mp588l38N1oOrzwxREcrCR2ktJFH7MkDHgRTaoow7EYq/Qb8v
+POFv5y8laR5mt4/RXUoBI8NeXpyqxjlQNtULIjCuKsixV2KuxV2KuxVB6rpGlavZSWGq2cF/ZS7S
+W1zGssbfNHBGKvD/AD5/zh75B1r1Lny1PL5cvmqREtbizY/8YnYOlT/K9B/LirxDWPy7/Pr8pmea
+GKW90OI8nuLOt5ZcQakvERzhHixVfnmJqdDhzj1xvz6/Ntx5pw5FNvKv/OQWi3fCDzDbNp0/Q3UI
+aWAmnUqKyJv2+L55zWr9nJDfEeLyPP58vudhi7QB2kKepWGo6fqNst1YXMd1bP8AZmhcOp+lSc57
+LhnjPDMGJ83YRmJCwbROVMlk0MU8LwzIJIZVKSRsKqysKEEHqCMlCZiQRsQggEUXiepWHmf8m/OM
+PnDyiS+jSH07i3erxhHYFrafuY2oOD9QadwCe77J7UGojwy2yD7fN0mq0xxmx9L7C/Lr8wvL/n3y
+zBr+iyExSfBc2z/3tvOAC8Ug8RXY9CNxm5cRk+KuxV2Kvm7/AJzA/NOTTNHg8haVKRf6ugn1ZkJ5
+JacqJDt3mdTyH8op0bFUg/KjyOvlfy2n1iMDVr8LNfsaVXb4Ia/8Vg7/AOVXOB7Z1/j5aH0R5fpL
+vNJg4I2eZZRr1/8Ao/Q9Rv8A/lktZp/+RUZf+Ga7SwE8sInkZAfa35ZVEnyYp/zg/o0Ump+atccV
+mghtbKJu/Gd3ll/GBM9PecfWeKuxV2KuxV2KuxV2KvOfPf5Aflj521UatrGmtHqRFJ7m0kMDTdKG
+Xjs7CmzUr+GKsb/6FD/Jv/lmvv8ApLb+mKu/6FD/ACb/AOWa+/6S2/pir0/yZ5Q0byf5as/LmirI
+mmWPqfV1lcyOPWleZ6sevxyHFU7xV2KuxV2KuxV2KuxV2KvMfzC/5x1/LLzr6lzcaf8AovVn3/Se
+ncYJGbrWSOhikr3LLy9xir5080f846/nH+XVzJqnlK6k1nT1NTLpwYXHFenrWR58/kvMZTmwQyx4
+ZgSDKEzE2DSH8r/85ABZRZea7IwSoeD3lup+FgaH1YT8Qp34/wDA5zes9nBzwn4H9B/X83Y4u0Ok
+w9b0nWdK1e0W80y7iu7ZukkTBgD4Hup9jvnM59PkxS4ZgxLsYZIyFg2q31jaX9pNZ3kKz2s6lJoX
+FVZT2ORxZZY5CUTUgmURIUeTxy2svzN/KLzbcaj5Eil1DS9RRkNuIZLqMqDVUnij35Rk/A+3z3YZ
+3Wg7YxZYXOQhMc7NfK/wHS59JKMthYZVB/zlL+eWlMZNc8owTWiEmRzaXlsaClaS83jp/sTmxx6r
+FM1GUZe4guPLHIcwQ9C8jf8AOYH5ea7NFaa9bzeW7uUhRLMwns+RNADOgVl+bxhR3OXsHulvcW9z
+BHcW0qTW8yh4Zo2Do6MKqysKggjoRir849U/MZtX/M6688azZnUTNdNcxWTSekFVPhtk5cZPhhVV
+FKb0yjU4pZMZjE8JPVnjkIyBItnP/Qyn/fuf9Pv/AF4zm/8AQx/tn+x/487D+Uv6P2/sQWuf85A/
+pXRNQ0z9A+j9etprb1vrfLh60ZTlx9Fa05VpXLcHs74eSM+O+Eg/T3f5zGev4okcPPz/AGPU/wDn
+B7UUbTvNmmkgPFNaXCjuRIsqH7vTH350zrn1DirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV
+dirsVdirsVdirBPzB/JP8uvPivJremKmpFaJqtofQul2oKuopJTsJFYYq+afOP8AzjN+afkK7fWP
+JF7LrNjGeX+iVjvVUb0ktqlZh/qcq/yjK8uKGSPDIAjzZRkYmwl/lf8AP1opf0f5vsmgnjb05LyB
+CCrA0PqwH4lI78f+BzmtZ7OA74T8D+g/r+bsMPaHSfzet6TrOlavZreaZdR3ds3SSJgwB8D3B9jv
+nMZ9PkxS4ZgxLsoZIyFg2jMpZsJ87flR5Z8zxSTLCthqxBKX0Kgcm/4uQUEg9/te+bjQds5cBAke
+KHcf0H8BxM+kjPlsWPfkJ+aPmL8t/PS+QfNEjHQbycWyo7FktbiZh6U8LH/dMpYcxsN+WxBr3OHN
+HLATibiXSzgYmjzfWP8AyrzyB/1LOlf9INt/zRlrF3/KvPIH/Us6V/0g23/NGKu/5V55A/6lnSv+
+kG2/5oxVHaV5Z8uaRJJJpOlWenySgLK9rbxQMyg1AYxqtRiqZYq7FXYq7FXYq7FXYq7FXYq7FXYq
+7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqwT8xvyU/L/AM/xFtbsBHqQXjFq1pSG6XsKuARIB2EisB2x
+V856t/ziZ+bHl/VpT5M1qO4sZhtcpcPYT0B2SVFJBp4hj8hleTFCYqQEh5i2UZGPI0of9C+f85Nf
+9XeT/uLS/wDNWUfkNP8A6nD/AEo/Uz8ef84/N3/Qvn/OTX/V3k/7i0v/ADVj+Q0/+pw/0o/Uvjz/
+AJx+aX3n/OK/576ldpcalLBdTgKguLi/MzqoNQAzVagqTTMjHijAVECI8tmEpEmybf/Z</xapGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xap:Thumbnails>
+ </rdf:Description>
+
+ <rdf:Description
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ </rdf:Description>
+
+<cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></svg:metadata></x:xmpmeta>
+ <xpacket />
+ </svg:metadata>
+ <svg:switch
+ id="switch6">
+ <svg:foreignObject
+ requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/"
+ x="0"
+ y="0"
+ width="1"
+ height="1"
+ id="foreignObject8">
+ <i:pgfRef
+ xlink:href="#adobe_illustrator_pgf">
+ </i:pgfRef>
+ </svg:foreignObject>
+ <svg:g
+ i:extraneous="self"
+ id="g10">
+ <svg:g
+ id="colors"
+ i:layer="yes"
+ i:dimmedPercent="3"
+ i:rgbTrio="#4F00FFFF4F00">
+ <svg:path
+ i:knockout="Off"
+ fill="#F8DC75"
+ d="M237.682,33.617c-0.019-5.071,0.402-24.5-2.5-30.4 c-7.869,2.99-19.189,11.68-22.431,21.588c-15.532-2.32-35.042-2.045-50.381,0.608C159.808,14.753,147.946,7.596,138.243,3 c-4.093,6.907-3.906,19.92-3.445,31.279c-0.018,0.013-0.037,0.024-0.054,0.037c1.8,47.7,22.2,74.399,52.799,92.399 c31.481-17.988,50.972-49.057,50.101-93.12C237.656,33.603,237.67,33.609,237.682,33.617z M216.485,25.421 c0.114,0.021,0.229,0.042,0.344,0.064C216.715,25.463,216.601,25.441,216.485,25.421z M214.527,25.083 c0.275,0.044,0.554,0.094,0.83,0.141C215.081,25.177,214.805,25.129,214.527,25.083z"
+ id="path13" />
+ <svg:path
+ i:knockout="Off"
+ fill="#D2A41F"
+ d="M91.013,133.328c46.474,4.115,90.927,22.883,141.085,49.085h25.598l0.361,0.191 c0.516-2.575-1.888-6.025-4.752-9.229c-4.941-5.528-11.623-6.145-19.707-5.951c-5.738-6.83-41.004-43.861-41.004-43.861 l-4.808,3.395c-38.75-21.75-49.155-62.513-49.155-62.513c-33.792,8.148-69.78,28.334-90.391,49.761l-3.118,3.292 c-1.489,1.597-2.928,3.174-4.312,4.723C18.967,146.661,3,170.87,3,175.213v2.25h23.816l-0.505-0.668 c-2.449-12.943,4.443-23.341,10.279-30.385c4.179-5.044,11.1-9.801,21.968-12.457L91.013,133.328z"
+ id="path15" />
+ </svg:g>
+ <svg:g
+ id="tomcat"
+ i:layer="yes"
+ i:dimmedPercent="3"
+ i:rgbTrio="#4F00FFFF4F00">
+ <svg:path
+ i:knockout="Off"
+ d="M240.682,32.617c-0.019-5.071-1.598-26.5-4.5-32.4c-7.869,2.99-22.189,12.68-25.431,22.588 c-15.532-2.32-33.042-2.045-48.381,0.608C159.808,12.753,146.946,4.596,137.243,0c-4.093,6.907-5.906,22.92-5.445,34.279 c-0.018,0.013-0.037,0.024-0.054,0.037c1.8,47.7,25.2,77.399,55.799,95.399c31.481-17.988,53.972-53.057,53.101-97.12 C240.656,32.603,240.67,32.609,240.682,32.617z M214.485,23.421c0.114,0.021,0.229,0.042,0.344,0.064 C214.715,23.463,214.601,23.441,214.485,23.421z M212.527,23.083c0.275,0.044,0.554,0.094,0.83,0.141 C213.081,23.177,212.805,23.129,212.527,23.083z M235.784,36.059c0.81,39.69-19.44,71.279-47.79,87.48 c-48.118-23.977-57.183-84.71-48.977-117.289c2.283,12.454,6.424,20.266,15.394,24.098c19.533-5.591,46.423-6.033,66.231-0.57 c8.255-6.001,11.456-15.169,13.204-23.18C236.029,15.921,235.777,36.055,235.784,36.059z"
+ id="path18" />
+ <svg:g
+ id="g20">
+ <svg:rect
+ x="133.209"
+ y="90.51"
+ i:knockout="Off"
+ width="26.245"
+ height="3.239"
+ id="rect22" />
+ <svg:rect
+ x="133.209"
+ y="82.732"
+ i:knockout="Off"
+ width="26.245"
+ height="3.24"
+ id="rect24" />
+ <svg:rect
+ x="213.35"
+ y="90.51"
+ i:knockout="Off"
+ width="26.244"
+ height="3.239"
+ id="rect26" />
+ <svg:rect
+ x="213.35"
+ y="82.732"
+ i:knockout="Off"
+ width="26.244"
+ height="3.24"
+ id="rect28" />
+ <svg:g
+ id="g30">
+ <svg:path
+ i:knockout="Off"
+ d="M204.1,63.524h-27.188h-3.021h-12.561v-2.917h13.31c1.639-7.018,1.963-13.725-0.014-17.125 c-0.844-1.446-2.01-2.121-3.674-2.121c-7.609,0-10.753,8.046-10.884,8.389l0.002-0.003l-2.73-1.024 c0.156-0.42,3.965-10.278,13.612-10.278c2.692,0,4.834,1.235,6.191,3.57c2.41,4.141,2.127,11.305,0.494,18.592l23.354,0 c3.103-9.116,9.581-13.414,20.405-13.414v2.916c-11.732,0-15.019,4.973-17.366,10.498l12.743,0l-0.029,2.901L204.1,63.524z"
+ id="path32" />
+ <svg:path
+ i:knockout="Off"
+ d="M206.017,77.925l0.019-0.003c-3.459-5.101-4.555-9.456-3.108-14.413l-2.971,0.015 c-1.035,3.3-0.62,8.273,1.929,12.54H172.21c1.806-3.616,3.479-8.025,4.702-12.54h-3.021 c-1.348,4.786-3.241,9.524-5.372,13.277l-0.689,1.213l16.652,10.482l-9.375,6.178l1.605,2.436l10.479-6.908l11.312,7.382 l1.554-2.468l-10.488-6.488c0,0,15.682-10.187,16.461-10.684C206.024,77.937,206.021,77.931,206.017,77.925z M187.156,86.733 l-12.317-7.755l24.071,0.006L187.156,86.733z"
+ id="path34" />
+ </svg:g>
+ </svg:g>
+ <svg:polygon
+ i:knockout="Off"
+ points="114.745,73.635 122.087,95.391 99.788,80.434 "
+ id="polygon36" />
+ <svg:polygon
+ i:knockout="Off"
+ points="93.261,83.153 101.147,96.75 84.559,88.32 "
+ id="polygon38" />
+ <svg:polygon
+ i:knockout="Off"
+ points="75.313,93.759 79.12,107.356 67.699,99.47 "
+ id="polygon40" />
+ <svg:polygon
+ i:knockout="Off"
+ points="196.871,130.199 189.801,141.077 202.31,135.366 "
+ id="polygon42" />
+ <svg:polygon
+ i:knockout="Off"
+ points="208.021,142.709 196.6,151.411 212.372,147.332 "
+ id="polygon44" />
+ <svg:polygon
+ i:knockout="Off"
+ points="180.282,24.686 188.713,43.178 194.151,24.414 "
+ id="polygon46" />
+ <svg:polygon
+ i:knockout="Off"
+ points="137.588,51.608 150.913,58.678 138.947,59.494 "
+ id="polygon48" />
+ <svg:polygon
+ i:knockout="Off"
+ points="140.851,66.021 149.009,69.284 142.211,71.188 "
+ id="polygon50" />
+ <svg:polygon
+ i:knockout="Off"
+ points="236.031,56.775 225.153,61.398 234.127,62.757 "
+ id="polygon52" />
+ <svg:polygon
+ i:knockout="Off"
+ points="231.68,70.1 223.25,72.548 230.048,74.995 "
+ id="polygon54" />
+ <svg:path
+ i:knockout="Off"
+ d="M256.305,173.375c-4.941-5.528-14.623-8.145-22.707-7.951c-5.738-6.83-39.004-41.861-39.004-41.861 l-2.306,2.903l40.162,43.238l1.743-0.149c10.912-0.935,17.115,4.983,18.757,6.819c1.204,1.347,1.931,2.575,2.326,3.539h-22.075 c-50.624-26.416-95.078-45.044-142.297-49.112c0.104-6.571,1.273-14.01,3.518-22.299l-4.343-1.177 c-2.308,8.521-3.523,16.236-3.661,23.133c-4.92-0.326-9.872-0.495-14.868-0.495c-4.237,0-8.095,0.394-11.614,1.077 c-4.59-4.587-8.5-8.959-11.823-13.108c21.936-22.85,58.15-43.498,89.533-51.092l-1.015-4.396 c-33.792,8.148-70.78,30.334-91.391,51.761c-9.565-12.91-13.36-23.504-14.487-31.532c-1.424-10.14,0.997-19.441,6.999-26.899 C47.15,44.099,60.502,43.277,74.23,45.586c-0.268,2.167,0.017,4.24,0.885,5.522c3.631,5.363,23.144,7.246,34.791,2.049 c-8.595-12.045-26.006-17.926-30.83-15.569c-1.598,0.781-2.804,2.214-3.63,3.886c-4.745-0.849-9.458-1.48-12.903-1.455 c-12.107,0.088-21.363,4.319-28.296,12.932c-6.802,8.451-9.551,18.944-7.95,30.347c1.516,10.8,6.863,22.286,15.825,34.198 c-1.489,1.597-2.928,3.174-4.312,4.723C15.967,146.661,0,172.87,0,177.213v2.25h28.816l-0.505-2.668 c-1.627-8.601,1.623-19.351,8.279-27.385c4.179-5.044,11.1-10.801,21.968-13.457c9.663,9.431,21.975,19.446,35.679,29.109 h21.414v-2.25c0-2.539-1.259-4.762-3.545-6.257c-3.383-2.212-8.605-2.517-13.402-0.881c-4.573-5.093-7.137-11.896-7.691-20.347 c46.474,4.115,90.927,22.883,141.085,49.085h27.598l0.361-1.809C260.572,180.029,259.169,176.579,256.305,173.375z M33.125,146.539c-6.816,8.227-10.429,19.094-9.601,28.424H5.372c3.647-7.894,18.176-30.712,39.644-53.76 c2.958,3.656,6.253,7.35,9.872,11.073C44.347,135.444,37.437,141.336,33.125,146.539z"
+ id="path56" />
+ </svg:g>
+ </svg:g>
+ </svg:switch>
+ <i:pgf
+ id="adobe_illustrator_pgf">
+
+ eJzdffle8sqy6H0B3gFUFGQwEyEBB2YHUEFwwJlJRJlkWGuv88d59lvVSUgICWmQ75x1716/7aed
+Tnd1dXXN1fF6iuVQsjmot0J8mHG7vN70qFWbDEYxN2l1n3e70/FkhE2+G7+bZcMMdEqeS29qx7vW
+aNwZ9GPkEXmYw7d951e565vTrN/t80NbpTPptqB1Mug1apPw+K+2X5sLXs7UJvAwciAfMKKbZWJ8
+1J28hOepwbTf7PTbqcF/YPyo6OYZzi3AU0GKwuOzzk1rbO4TjrK8jB3DnAy/CLwYluBNQYInDL6V
+GTSmvVZ/UhwNGq3xOD3oDkbjmDv9T63vvqy14UnNXW11u4O/3alurfHtgtVG3nKdbgsW1qtN3FFc
+ZfKcfyOv3o7hHXgdf8fm6Nt5D1rKrckEoIKBESXpy2reOB9Aqv7ne7pptTsEw4CIF78ycqXVG3YB
+KWRRPCCFl0XtX7UHwEOehqJsmJdlGfAmhiMy9BMlPiwwjAC/RMgj5Q193a2/Oq2/Y+6rQb+lLC45
+mpQ7/9XCqRg3xzBK68202xrd9jsTWASHTbKy4stBs9VVm8i7uW6NLJT8x+o/lQ6V2qjdmsBODbrT
+CaEUSZvhator1P5pjfQJroetfmVwR+ALiUJYFMWIWxQY5Rc2HHFLouyOMoA6ScEgC8tUp2TJtKwy
+No6E42gTRHHvi7Az16NOu9OPsYLoDnHYint2Ouo09S2Lcm5J+UHWEZYM/5e1/ysAw9onk1Zf2eZs
+v5ke9BDJY6Re2Ng+7Hp30FaezX4nT2C66VCBlfz9BvtRHHX6CIPrijyR3ordKTw6HQ2mw/P+x8Dl
+U05lEScd9a/78MunOzWajj/dlcGgC6dtroP6SBkFH44mxt5L54C+9uPrA601drrW7Xbao9rws9Ow
+Gt7i+Wweu3eXTgjbNGrpY5A/Z/8ufbPcIKi0gnL+0WxwizeWz/BPrz7odsY9fWBDi/67E0XARnVb
+/eZ4Nozypw5YofOX1rh8sEzrA1idYWtJa7b/V6s7GBrQOGup9Zvu+9poaDcsQvfR6TcBK+VpZ9LS
+N3rQGyIDd5c/a0NsXuipnBA4PcbzEQotPzgrvyArT5ARTv7ptsaug3x/8Hef/OGOuXxPgJLatDt5
+8bsPrmq9ljvoOih3gEm3tC6M+9rFqDzwG367cWn8MO/SuCLjfvgH/riAX76g6W+34L50P70w7ia0
+Pty4kIE9NF0HxRoA54673AcwLfxLAIQV6eA5rrFY6wI7axEginWXnbhBkMauhdZiY/bGt+XTYmoG
+gjbTKvgtwHBGpC6skHRYZyNZRnmkHBsc5v+ozTCQqdFmcBVWTV6CclJzed8OtL9hr/GvTgOxURv9
+o/z9cFm4ArlI/vBtN9W+QC3lCQzedvv+0+v2oUMIf/SBgvxAQt436+d/1bpTtYPsPjiHOeceT/4Z
+qk8PkqNRzQqCXmtSawLgvweAXQ+Av2qjTq3eRT1o/G8A4n8dhv9JLMT1Po3PTrc5avXVPiayNXQE
+mTXq1KcTBDRIHgUX1xIb15Dn4ZH4H95Y6iXNQ4zvOIPp2+2P3xpg5wx6cZvOBpi5/9lt0NawuB3k
+QewvuuUBHY7/rYvDNQRpyHFNKoC1A7leEYQ44areIeYk++9DlXEVi8TQHTS+W03n9fXB6vv3rU2D
+/k9SwQq84N98WCiRNL/28cff/2sScNztNP6/EH9kIeXBdNRoEa/Tv3JN8yD/4wjizFN2cNOqdf81
+pP6PpcBzXM3MAfjvWs1/rFbzd6c5+XRcEScyYVbk2H/ZilTgF1f12eq0P53VbVYSwgLL/9uWpUG/
+uK76YALqYaH1MVEciM4rdB+kBoN/z9IWF/AvEbYgm/4fl7WbEzgbAt7ggMAWRsVd8pxl3TM/BnFA
+uwu1fntaa7fcxcFwOjSRLnmhOGqNW6O/Wu5K6z8Td7bZmdTqnW5norJoMRLhI7MJZHdtNKkPaqOm
+u4HBAjfrHmmKnWPP9qilrdexb31GGRFO4CT7rpwOgGNPAwCOfesLQnyx2zzp4vPJqNYfD2uwr41/
+YLpO0z3u/Fdrtk0a2mX3sDZsjeBhb9olfjdNWjMax8RO19PJcDpx39TGk9ao81+ko1sPtajgRebe
+uWyNPx3eYOb2X6Mldwd61SYtWHmL2EhLO3/3QaUfAHBtdAOrx/3pstXsTHuGCV8MJ9+KPNX4CqCC
+kOHEbbB/TEdCIxfAvIr4qIb55rATNkFb63bGpqZebfytolnUMDasNXWzJHnuTk4ngxn2tP1nDAeM
+cX/MQB6RfqG/Wo0JkEy91q31G4t7PfcKYKzb6bfcEzhrdD3Hk9HgWzv7rE3nRrczBJJE581/4Dy0
+AW0Obwy1Uz/4qzUaooN0xl4ANY3BqNlqLm6D++BqMJl7vCrvcRhOp5YDne8djJqjcVhx4JgV74Vu
+tX5/MJmtXdnlhU4aHsbjeQ662HHabzh0AXkHJ6ZJdQSML/9nGNYlpdXo0GEwbE4dOoydRmgM5tmY
+qQOSzvIOgz6QyEShw6VzqT112iasyaonMOJ5lsQzNj1H5p7RiHXHueNnufNDZd+X7zp0AjY038/A
+lc1dP2vN1qi1fLwuiyezNlnaCXA3Ia6bpX16eGzHRkZu1a/fagPj/2v5YPUOnsF5CWYGvPVXq2s/
+yEd/Eh5P6+MlC8Muze5w9DGY8RcrKlO69UDbUbUDS3S3e9/hXm30PR58fIQVdZe6+0jX+yl6TwZD
+6r5d0LhnCLDpDPyh1TRDTdHdADVF7xnUFH3noF7ce+xLNJx6bbSMuLHfyBA9dOg6BGHQ6X8MnGYe
+GVZi3YUsRO0T5iK2C262PlCKGsxZa2ZMOn8N6hNMZHLsqIiij0532RHDjmMMdjr0mZMfVr0ao2Z4
+Ahq5ppFZnSDsM240+ssOo9Jn2G38Y9BrFvGmdKt1W+G/KPt9LiE77DUYtbWxlvZRx7Fi8NhlOBh3
+lhMZ9oL9Hn4ORv+lcraoXb/BqIO5YA4DdkfhmYJUx3Sx5X01WTkcTJYcG+ypMztrOgNadFAPsEe9
+M+nVhmYRadebrKI2Vl6i6DpYTuGzfnXVW7qsY7M17rT7TugeDkdhYkItoxbs9AlMbNxaxhtJt7/p
+uhndQksGc2Qi0Enfs2iUDwuWjAm6dTCJcE4cROSIU3eDOGClsLVsmnWeSQNWdOqqC4OozNl1NeJI
+ZG27GZBkxaewS1NJC1nCFqGTs7Y/nnTVXsNh035G7KbOOOtnPyB0wZPZtfLxL/RF2m+N5lyCS6dX
++muGgiHlyGoGEL/dFjGVdJM4PnPZYAJRUuvsRpuKyryyO504WW3icNZHoA6Oxi0cbWS/YOw5/u4M
+gVv2v504HCoEcNzbluu7GNQxvcywOt0TA52yxbL72mS8zvlP1D4FtKIxexGz2IiPa6kHRX3rdFRr
+ooAgbyk+FTtDZPaO4jc4uFP8ASk7f4AKumrfV3RrybZP2c4HoHRLo/WfVq3/G6P1T+ORwRGWuGFY
+o9eqP9D9Be5On7gcUCpbuWwWqc/3ZEg3d69B/1Z2Cq6hmMm9pYmN1TG6Lq3IU+uueT0NEKHrE8BI
+14aKA7TTWmKyaOOcItbg6FQ+p716v9bpLpGD2juYtwz/5pZKV61zDojqvlXHd5yhIQncmcHffSWR
+J9/pNw0kTvuamdI5zkols3mZpMcn64O/dFtu+atp3arV4V2+0/NvlaY1fc+5iOOEmFtf1r17yzZ3
+VPtndWzOv7UaMuffXQWX+ObKqDS9tAIm8U16RF4O+oPG52jQa1mh09r5s+xdM1KFpRuCI9gjVaCa
+2xK1y4+i8gJIHudDXhl1epfoUXDuCvydsich9tRSA37GDQEl50sNc51vEiUGQajMwnN2Jrh5efct
+BzeM9sI1UdtzgHhA39+D0XdhpqKu9l7KyU1k++bNuqBWlrphtNdS6MAoLPcdzfW9cTBR5jqvAIMR
+Q8voWQG4019iAWtds716q3meThdHxILUpOjSU16e1hGNg/7kBo1EZ3hmqh+FCFW0m4ohNkelHi0Z
+C54rmtKVIdNmKbLNL17W/rNED6UaodO31Ulp3lf01JTJb079OmqdqtKp6JyrD6Hqt2WH0ILD6xVj
+LM1R4Us2RoN6baLUjc3MDuihrmqmdppNDtkc3hrW+pp7XJOx5btTJGGFmCcLHjv1cWHQqC3OAA/J
+wVGsCJWm9GcAXqOju/4NM2b7jYEerxX0B6TUQufSM00eHpHyHKRdOBANi+daheLik2L7Y7HxoWZO
+LcDpu53GDKz4ojmgF77M12Lgjik1Griz2jMX2UljC5oYyXL6/FyKZGDcJlbteAPHYmgnMfY/bGXy
+F42PnL/EJRM/qVefcHL9fhy955lmvBXz9smf8fPx4CP3Xpju5TyBJ8bUFji5qx8wXHcSSd5UcpVE
+bPgii49i79HlPQy95wZkMJgvPk6Wp7e+ZL/eHqvvHP/0kvn77PZodFzrn3bvvuqp98tSMhnssy/x
+E/ZOymw3p9lM+uz5hQwVOD4aeoUxv1MKnHxOeAKIy0sBygqAHNWTweHVRSIvj4+ls8P7cG7wKNy5
+vNnR8yOTecxVK7mj5FHDCp7jof9wCBOchdLcztF7JjxN3Cajz29VsTpki7nd0kNXna+R3M18DP1s
+snIxmeptLq/Smn/wT2Cci2kmfP15OBoJmQ7DiVvDxN1eeUfpzjLFWs4/2a1lgy9XBykxyG2p47wP
+EqNRfFwBeIPnDBv6iunIiqdu0i2XdyzlJnfc6+B7Vyy19gMRT9p/LRyWYpXA0Y34OXphxodhviBz
+geNTz64w5saXAM2dFD4YS6eC9BP/gj/9fqa5W83MT/o8erl8LpFJgcbmp4V3o6+R2Plr2HLS152r
+gu2kYid/6rWa1OUdjQ49vtGY9Y6s1jqWiuyzsMXF9q0mHe8FL0M2k0Y+fbW9apZM6vIurFXwPwcO
+uXbJctKt3KuwfTvsFqwmZXKpfMJqUpcXphW3d/oj/5E1goXqK5P7uCpbT3rqOdxlL94qlpOennEV
+Mime/UUEc4/HlXcyKbufrGfnd/V+9Dw9LuCk8cU99VX5py7rh0lDQX1SmEUhpQKTUtda3NszTRqJ
+9N6GdpO+jV4++xWbSRM1MZrbYV1e07QqKZ2839hNerbD++LP1pMeel7G25+tG9OkwGGUaUtp//HP
+Tq9gNWkg3o0d20wa+dw/eUxcW08qVKtMTmaugMas1rqVa0d3bnrctdWkTO7lJWczqbjt/e5fpk2T
+wizatDXmNPh+Zz3pKZPca/miVUv0TraDJ+qk1ZDPhN6TK+Ho2aWcVTb7/J2bW+vjIVOIhlic9HBh
+0rPWQLyphTiYlAmZV1p4eqyZJiWzqGuNfjdzr3aTZpjL/RfZetLzn1jia3R1YzlpOb7Hw6m0Xqu4
+nW+VecZm0qcQU37zb1lPmj9rXT09+n36pC6vYdq7vX7bdtLyZ+m9bjfpKXOXHx5aTw==
+
+
+ WuC9Lu9tLnF4ZLnWu+HFlu2kd2+nWxO7Sa+Z+5N8Rp8U1mKY9vI4+/ZaenmxnPTl+vvcdtKvaqSZ
+s5n0Gbgl8zLuhqzXevU17F3LEm856dt5qG876chbDnj0SVGKGc/qLZPt9C4sJ5WuQluexEsoC5Py
+YfOhmb5F39RJ67zfdGhcXv9jobZPpuX2jn1n82stMO/7sSROemyaFIb9+tGYvnhgnnQ82D1SJ52c
+BGBf5tfqea49+ZVJU1X2fJ4VBkfj22MPTppY5EnnIW2lh6xpUsBY/GxLVKY9YfMhEysMDoUrRdLw
+O7F0fn7SndGoVu/jpCnzSkfJ1kCj3hTQmFmUR75iqqQ5iZXCJgRvDVrvFUWmtmpv4jxIZ7e7r4OY
+1VMikSNn1RLbu7N7+5M5e/dObZ8C683s2jyFHdgNpL0qt2RaX62o6bkosW8a3ONvyfy0/7n1YPs0
+WjyPPetPF3Zf4vZv3m3flj5rr3u2T5Pc7mPD6qmqwxQC/RPO9u1C/fojbvv0eqtRP7N5Kp3tnh3e
+jjWMfez9yKa3bwMdTT39YLdi5qf1i3Lf9uldJvA90p8uYOzeWz/w2L59/5yJHdk+ffe+RnesnqoY
++5oUh2e2b3/fcamS7dPed+741e4poKoUj8wwtvj8ghOOH2yfNvr1csHu6a5n9/x53x5ju9nkZb1l
++/YFd7LF2j1Nergdf8wWY5EzJnu0r6065oubznSgUhqfqE/T4UPT08r76X7S+FQI3iBDKSnGXDq0
+nwbdcjJ8fUm3Pyvo1EseHctnO0hZ9z7VWj5pxGzMvvFD4u7jtpysVLz3hEUlK5dNIVsbPXkDqcH4
+Sm8Du7I2etwjfC7GSp4rwsw8+/k46wlmbu49wbvXsif41qx4fE/+Kf5WBBL8TntC+bfIolFYbSdL
+fFkCqNMBsE4H3+JOVP5AS3yf82h25YuUe5s81xLxIbuVuQhsR7Sl7faSg8wrkOm2vMXtHRWPM639
+rJecOzRnnjQsWvdzKT3R2pKX9yT9jmPpp6pjPzDD6js333o/l9e257730DNwHFHcpl0L2GLRG/8L
+xYg7fT7+RtHPe925rFGsRdxGod6gGHHvvB5ua/22e7n0x4V0cHnRisKf+9vJ6GOXV2xkPwjHj0OF
+Tpgx101Wkv0ccxER9hWyQfcHWMsRThe84lZVuMw+Nn4+DjpHdb/4KBbOVLs5ujuaCeB0cvBz60cO
+s7glft/JU3c5eGhLv9AAt5WrhY1eBVvwmFz+sGgCz3I3hKvMuxVwhFvq4FXfqMA73RFpgDstbT8a
+dH478KSzOWKxxV31ZjlwQGPK1l7l72jAy2ZvczPcZZLl4PcODFCqHnS2Y8G5CQKHZhqLGUBh9yKv
+mY9KhkeQBVzaob5SNnjLhvRJR1M+zVBMCjr//LREO15z0kBsMMnipEOCFoabJj7Tn8Kbui+gah4P
+M9lGsSJqbsX2NNuoth6UNo2P5zPnzSPQlHLTbjReui6ib5GbPb3B38AI/5bPAergdy59EiuTbTdY
+FuPA8XF2D6At7yOMYbLq46GvOVZdNfMORmWlbW83ebt9hFoBs5Usdz2jXFa6OVAHvWr8BI6LuwOY
+BYWZOPGxp+qLO82MojYDZKmDz1bGq/wAOriHwYqiam3BfLMtIcvIoJMhN7+MjMGrQJbhNfzAmWPv
+P8WYQbTOgfezEnDkVC4Fr86fWYFnAdy+LXC4FhW8MQ14hEIJVaojXkh2y53q42m7b7tg+HGjLFfx
+3VgsF4yrwvLlulbZjb2tNUlF5ckLu3Fa7CERt/EgbStcR7wgauyddCyf3hbBctr1kh/c3glzjoCc
+z4YqaZyvKELnpwzsCxhId5T7S0F8A3Y/9ZVjWDnyleATj6jB7fpmvosK04Rd9Xq1H8K+eiCJy2Au
+AhF7H43rsE3xEC0CXXSn7fT55zcI1LVxFYWoJz/++oDoCORSj/IF+i3nULgSAi042o0VR5udympw
+aMYyM3xNr8fRsgjNqY4RVSJb4+Q0v4sz31jufvb5emLaq8jwQC6a9oqwd5fXlsHPjXjnoRhR/VF7
+yCCCzmx3/zXL78Tzhbm92t6z3KtWMbyr7osFxk5ipcvNYCwToNzJXZfKD615w2sWHQX3Jvm6Okgu
+LwIVpgXKASSwWatWIFnISic8MU4gDQJHugpBWIFyXi6WgJcOPy3F2K6uihhPL3FeamC6vBbnt7xE
+I6lzCyLf+fSSfbE8vzkrxcpi43Xd6omMqAbW5sZzeZURT3zZPBUpGYTMpWzNI2G5CmOenTqiw5jO
+nU+yVv3mUG2giNrWJbcci3he5mhCXzq8PTmdLX2ojy1VdvcuTyvPX02GTT23M+Gb26Ae7iczw1C3
+I50nqbLSSiYtV2PnRnwYL5dxLu8cITrrWd/SZHW9zeVdOuJ0M5rgTIp9yx6qEY/q+/o5sKJa7HyK
+3v0LM082SXYa82JuXz63N70v8s6m90Wmsm5W2RdppMhSJ5UGjVCCVFXtOrXhtM1TXWt1eZeqXTRM
+St3u07uB7eYAT17nGN4tCJmlqHR5nY/hiK3t7J39BpUmHQaQSafBroLK+hilmKOWvbJhfmsSgzN7
+n2BnckxlXNKpsWe6GutAY7pqb6lscKmHT7PSaYUMl8HosN79yQmVNbn0aJowdkLFPuiM5zPdeP4t
+xqpbu5vB2PGYjvXMrKlFDV3RYYAcTsv9lSxHW5BWtpGtzQYEqTpcCSQlwmsNFBVfoQDpbUR19uct
+bDulun1moVQv8Y/NLOxyfD70dKMNe+hLRl89Ye5lXE+lP6Nnw0w+/5PSgjVk0q9zprlXyxJkuLz0
+RjjJFrIg55dx34EBuLwWODmzwcnX+Yp7pQHnMqd5auBNHNSSleSey8u9TLzUJGBlZpuWu2hk0/iU
+bHdjEtijBc5FsxuYg3C7qgfIaN3M8eQTX2ZixSDWJ75PbhZ7XUUu2nD58+UuNKOmREvOq7vQiAZr
+YyAiAokT7TcIJAxu5k9WtY97eyP8hL1YMGcoXWiWnt4LkxNtTe8LvxPz7ZC9Aj7m7ESjON0wYtgs
+m/XxFnbf8XT3LlZ3odlgbN6JtjbG5B9m8bys46/qXVC40Fy0QPG/caGpUR4FKDsn2sp4iphAAilG
+QfNzvpI5igezgcI561qmOqgpJ9eGIOJJrDixCyLmkc6zlB5FZ/89UOD2SttkoOR52hnmTT4um2NB
+ZTKTUwkjvkxTeZqDhj+WSxX+5DbmM+0V6JbWrnT/LuECdhjzbwpjFnJ4HcI+ufXyixHedRgAgPSx
+9/NgC9JcJNERKPNpowXJZO8jUAvi1tYba61Pz+2fxypiZUtZ1j5vC1MfyWc7btLQdT72ULY9uusE
+3k6LPTb7Mj416fxrBHPSALdg1o+s+RitzEXCPqDWLubtdEtZiTAe0YTWHE4voo0/uatc0u2+E9r8
+PmcPPM25I7Sx4M2jXd+8hwRWuPwQ0x5h3ES/brj9msb8C4FxC4pw0UpfMiJtlM48noHGLGIfrz9L
+Ylen5T6toHN5KUQd7n7lN+GmmY08B+MqLNPrwDJxPDgvjrFCpxEtnBqob/p1Xcflndd20sARYpTH
+giJ95OGWGCmEJ//2bIy/HRjcjJJpIyPAAFZXeHAtNioPwugQIaTkTrd4XjZhqyBIgUX/prpIrLBb
+gaVgrk1w9fXNPIomwlj0TK4lX+4GxFzZEI0FFnmN0S9AMiHnA8eOfBPR5hjlmQsbu+hNF8SibeAY
+xZL9hilnf6WIRxoenI9W2jU7fzLAvWn75eFuo1kEAKHJ8WCVRUB3crLPz2YHqi3aXN5l5A7bvREj
+BuULUMeiH3HN9Vkn8Gj1lSvwvjsr7+HaNLZW7p21WCYV3DiiTbThN7EGZGEBIpZdXqtMZmAuBUqc
+0IhlktO7Ce8hws3ScRh6sfz8s5JYdjl4IhBG4ddiWeEw9xsSywBSyEos28Qslh++2tblatlzth4S
+WN+mxPLzD3KYTfgRCbJsxbKuw6wqlq3yuezEMkpkLcePTiy/jZaI5ZiPnlvSiGUA7snJWG9Nbg8s
+rSS7wOrDg0Vm/9JsRf1sl+O2PPlttHG5/7BZuf82WkHu2/mr5rdb3KgljnlDNLa9YTw7Xx9usrMj
+ZEY7NA4/Jb7vfPZpMl2tvH5c6qGaJF4/l3cxMv9Q3azXD/OUdL+fDcGumEqKKoSZ9VhERqhSSY1k
+kXr43lq+k2pkhNqtCIDSOpUNbkXAmE1oGGGcmAP/zoqMJYtSzn6VXiLTkG59bFKvl2baL0tRQtwd
+OKrXKuXMPL3OZz/18OboZFhMTCdYnJf7qtjSdYpUrPMafEiWgw+D5E2/nk+FpMH1Ap5md2iZb8vi
+xm1PqF96c3mxejrrCSX5V0/oQs6qhdMXctUT/Pyq4I8wtuWw1DpN6q3xBonDZPm795Ft3J80cC1Z
+rMisZmrl40LOPzpD9+rOXi7zHdrCKmpB1ZSUAuviWaWYDYz5XV3Sikdf9fNsPZRYLLa9OrnR92pJ
+v+IBM1f3at+zFCtS9BtN38Mhq34u72LPGEsz81bu1XLExX7NA7q1bOW+KGce8lRrwQuyIlQjnoZk
+Qz+7StnROBYYG+4hsS/kFR4+C7P7CewKeQ+3fLaFvBizMGwJG6YAL3AY7904Aidub/+I02c98m5f
+Z/xEV6PdcyggV28GY3KDSoUCvN1C67PpXATdMgEH1qtlfftV6YECd0z26umUYmNd3rnCf3vwSmsX
+Ru8fHRhojLoeG6ux4ytN6vIa1o/3Da0zqeAvKpOqroXCQyKW89ZUGJRYktgflhOHnckDjn2bDew3
+w8lr9uQe2qZbJhVrSTgmNx052vu6OWCvwVsZTcXdnl0aRkbX6hwyh/cpyygX6hnnbT9DJNEYMLWv
+Gl1wp9AAZ2clFXcXsOxcqGILHHKYhYKt3yTwZywMroy5sn4Fk6u4R12XQ1fDu6gTrkYq8xHe4u6A
+LkccmB5dyXJghXxLGuKjrUyZVwjtq74tAtoOCCT5lsuqvqkSkp0QiLOoKFyIBv7igJgSy5ZU2C1B
+oBVHqwb7dhwtq9wISmGp0nG0atCSMa/ugX/Nru6gUSq57OLtMOJGEsu03c8+Vx3sXCofZTVkmYq3
+DsZWj8lYZ9pjIIXWs+NYCQ1HeANRUQSJMvJOA5RTloS9V8geY/YRiOX2sNXpVXZfO791bmB3fnO/
+Ob0WOSR1jio9nDqMUue3qHMUKUq3csSvZ3Xq1PtgLTyFzj7mWo62It5lsXTHCh7QtxM2FTzNU72C
+Z3nNCH3NqWNRhjqUGk2gKpSkUist9TbLvL5Tytt6qEs5qXXL+XNgX1tsWcA4x5NpzIu5fVmUPr/e
+F+dLgFbdFzqVdaV9obsJaJVqZXPYCj0kv7mcCauVnSuZXKsdQ0rl1YzK2W3zVoeG7k4gClSqOgwi
+0zH6uCoq9Zqm5TWJKxvmk+MfKzGo172aBeH6hvnk2CwG7Whsptpb00H7bCWTY3anyg==
+
+
+ wu6fUTK4oKJdvHOv77ZHU8OYhfm8tvE8OTGL+bUxRjK1N4IxOtaj62N2xDDGU7kop5dYjvYgrWwj
+2wK1GBCkAsngUZwBRcVXKEDSbbblZ3/ewrYJUGKQaSFlxto/ZrKwna65GX7YX3PzMm6bkxhcXmcj
+fEkRNOU2uSjLZH/MVudKwJki71/ny1NNV1U/YTxUc2jvhXOq3+JeJj77GxbsfUpLarRXYS5OudZY
+tLyOB8jCulF48vlyBrH6ck1aiOXtQBZycUnJMoU8cy0e8SUIdDjitgi01GDPraozV0TgnO7h8qrV
+mezF2M4Iv/i1C22+sp7NL5gf69X1Utw/ttLphhGdXWgu+urMnRhrvuJgreonwJhDSRZ9JTR93oVT
+2TF1FcbyGw6xEnoThV0uLwL1+xxUFSQbF9oKt50Y9+9iungVwpJct1m2rVOe1oN9EBFLQilreaj8
+9/k1k5mNGRFaES1Lk51EfRXCyW10b+Gum5XuEzVV5tpehbBaLU9+zTxmK4x5Hd2vlJXQs6sQDBHe
+Ncuzac6ai648+5cpzKq9j0DRJIFSpoDmrSNWK2bSWSYuF3u2GjreBV17o6rGpzu4WFMaNitda90S
+gHCvFLYy1FjZlomWf51XvFApvJHbgBFtiSnt7juhjTZ25aIqX/5tPZGijZNiY+p7ih0rvReM7LVp
+bKWbEVzOhb44In2Zr6U0V2ZZLPT9avlsv4zANHePaOr4dEE3k/u2NxB8tRwvTHYMNyla3wxGjr7e
+XB/Rtn4dxjugvrfHdkSr+vWRla4zu90US1QXfFhWx4IqfQTFpCFErHGY9eqMaS9ypo6MYLVrYbqm
+wmNTKbwYa1mzuJffzK1NpHh5wb9pnWlPU77sfAWU7fpUzq+XLzuWKlBXeoc3R2M2gWNT2NgQ5XHO
+08eqb6c6TMtUApRijiUmoK8cH9sEjkmBqpPPwbVCxOO0Olxz18z+5PRK30Ogqv/Y++E2mUWQts3d
+mcsioDo51eGiR3Gte+HSK30UwbF4+W5Aa/E5rW9Td0Mpld4L3sO1acz5ywj0lgwZj13re0mOYnkS
+WHYXNGiFmxTLYCjSaxfLqeieQizPqjgpxXJt640yZ84olpdVCm9GLAPaIpu5S40ULy8Ry6abJ53K
+l9cUywseElK+vCGxXNu63NDNkwRZTmIZ7f3VKj8BbSuLZWqPYnFZPhcpZF0ill1GK4pKLL+NVq/7
+tF7LfC3watmKVnWfCzwZetZpvlpEL/djPmGjch8g/N6hlfsUt35jzfcKdZ8UlvjbiD6J16buU/X1
+kfp+2spP6rrPvaM71vnsr5DpOuf1q49NXr85ywJLWTfo9eNSD82p453DK6aSYuG3zXUFhsiI/YUF
+NmRRH9O6Falvn6tu+va5+pjarUhzXUE6HF3h7NOVLK9834X9Jq96XQHF2Qfq/+11BarcV8SWzhuO
+xRKfvBkkaqluNN87DDCZV4tjMftQ9eInqX03O1GsmC5jxXTB5fWEpNCb5Yeq9ytJcc0PVZs+U+3y
+/pEPVZs+U004/+Y/VG3q5/L+kQ9Vmz5TvXwta3+o2nYtG/1Qtekz1XgTxR/4ULXVl743/6FqE3Au
+7x/5UHVg/jPVsJY/8aFqE3DEB7v5D1WbPlOt1b5t+EPVps9UY5baH/hQtWlS/Dr2H/hQNcJg+Ez1
+zKuw2Q9Vz0sfowd+kx+qXjVz2KGM0uZD1RaRRINm88sPVdsBZ7aSaD9UTVtAPqar4V3vQ9Wm8Rbv
+6nQ0uWg+VL1SDS/dh6qdSUVZC/WHqqlLluc/U22fb0lLfJYfqnbOt/zth6otEGj7pe8Vk8eXIxDv
+7KK6LJP2gAysvrFjVWFHjcAF14nTLQEOZu+y8uwNR3lsyrMp/HYLX5Te4P15enE27dcZnDJLlxdn
+r+KDtSnPXgdjm7ky11Sc/ZuoqFqevYGsG4rybAqQyL78rjybojjbDmNrOq1sirO1L0pv8nKFxeJs
+my8ZrVKeTZ2j+KvybAqPmm2Uh748m6I4Wz+Va5dnU3A527XQl2dTf7X8V+XZFptoLs6212FWGNGx
+dtFKiq1Ynm2gWrvi7CX7QluevcK+/KI82xKL87GGjeyLo/a74l2dVuXZv/8CO015NoWyoX+Vae3y
+bIribGM04beV7vbF2evdaj5Xnk2BSrv85BXKsymKs1eOii6WZ1OUGlvl9a1Ynk1RnO1wLxxNeTZF
+cfZ81s1a5dlrY2zFCkrH4myn80JRdkwhpV2UQK1YfWkCaZZtu3559iJIFnnjvy7Ppqys/2V5tnNx
+tjHXGtfaMicOUq/U6uad2bezre7oNn49m75Wfdm3s6m+J05dNm7HmEw1VrTgrfjtbKdM+818O1uX
+yNZfz157N+a+nU19k96vvp1tpcEuq6OmUmkWlmv7bfRPuotcHAvRSRU1sffX8Out9u1sy7s6qRFI
+p8jQ36vwuVAZR319CahDBj9//s9VjNvc1LrhinEKL9wGKsYXa0X/RMW4PcY2WTG+gRsOKSrGaW84
+/F3FuDHn6s9VjNN80eD3FeMuh4SjzVSML2YQ/YmK8VmFnWWx8aYqxvVK4SjlQVunYnzdb9itVjG+
+HGObqhjH/OT1a6doK8bNsdc/UzFuWVm/8Ypx+rsIflMxPl+V9qcqxpfljm6uYnyluwfXrhi3/VrW
+RivGN1OX5FQxvkJd0i8qxhdy4P9IxfgGaIyiYtxFL31/UTE+R2N/rGJ8lW/Wr18xbvPN+g1XjJMb
+QTna6Oq6FeMu7+I3zzdfMb6hGiuHinEDJdOXpq1cMa74+uxUnk1VjCvaBb8ptNmUpq1e97pOxbi1
+72LTFeObo7HFWPbi3YMrlqatWDHuWsl0Wbdi3Hxn15+pGLe/qXWTFeOz6qc96vvX1qgY/81dN/QV
+4y6KD17/XtnQvlpOUdLyi4pxu+/ybLZifDmNLVaMr1rfPXc7kOVHHzZXMY7f4LbKl95sxbjyjdTf
+524trxg3c5g/UzHucvZEbKBifMZh2C3ar5KuUTG+5t1QK1aML/GQbLBiHLTxWc34H6kYJ2LZ/gsg
+m6wY178AssK3gleuGKeIjGygYtzCSvoDFeNk923LiTdVMW6oeqZ1WK9RMb7eDYerVoyvZImvXTFu
+cUfEH6gYJxVDd5v8NtKc10+tGHd5rT9xv9mKcVjLrGb8z1WMW0ZGNl4xrkdGqN2Ka1SMk7w+20/c
+b6pifHb20+Hon6sYd8i031DF+Er3j61dMW5z/9jyivFFPC2pGMfacPwG95+qDtdrw+Hs/7HqcL0f
+YuxPVYfr/VzeP1cdvnwtm6oO1/u5vH+uOlwvtl380vfmqsP12nC9amDz1eE6cHNfYd5wdThdZf1v
+q8NNlfV/qDrcsbJ+I9Xhepk26Px/rDpcrw3X5MufqA5XRUK3PQWM/bHqcF0xVK2kP1IdbpcDv9nq
+cJMO84eqw80+pT9THb65L+Utqw5fo15sjerwpV8v3Vh1uF4bvkZOL3V1uL5cy69mbKg63CKj+w9U
+h1tmdG+8OlwPYzvUWfyqOtzKStpYdbiGO6s6iz9QHa4jw+VIT+tXhy/U8P6R6nC6/LHfVocbswj+
+XHX4YtXzn6gOX5ajuLnqcKcI72aqw/XacIds219Vh9thbLPV4XptOE3m8LrV4TbZgxuuDtdlvVrN
+8Ueqw3VEm+5V2Gh1uJ6M5PL+uepw27VstDpcrw0309gmq8PtdZhNVodbSbHNV4cv2ZcNVofrteGb
+3Re7T3f/Yl9W+HT3Eovv19Xh+mZb6Pwbqw7XNxtj4n+qOtypinMz1eFzttgfqw6nuleB+SgIz0tR
+afAbqAs3xpENCRIur5Yi0WvZf8A39fC6+gdAz23PfvtsU4W8lLdq6NLeUsOD9X1TfQH4nXtFz1Wn
++MA6kFLq4cd8K/ZKpZwLGFuxlNMOY7T3XThjbPHm3xXu7Jpbmq0JvxJIJJL4RpWO5Py9dFtmZZ/X
+Z4unFYtI56xXE1Br3OJmF+giX2Cnrfek0PlxpQu5O7jSOZ3fwlK31/RPfJmRnaZ/brLTf/0V5uxC
+GZoN56er9l3L6Wh7EziAt2AU/8bpCON5V/gyi6PT8dzW6bg8D9Z+N/ZWOjQOVtL5eldSLqust0gJ
++90nwGcC0eXdxM0Jnwvp7fMItPkO7xIELknctkWgrQ6DxetOyWHUCMRZsHjdyZ5QcWchIS0yRsft
+JbVv/I48pKlsoPPB9i6sdn+NrMCLjX/172KzXzQALrFwsNcrfdbzvX+LMccP/tH5LbF6ekPfSL0g
+Gd+/zxsnIFmkelvd1EqBJ0c/03zKnlLLY5eihcXrv/w86sw7Olfsxp9UJhkb79Iwv2aWt7UPlj+5
+DZhvgFlnm2IlLSrqlFNHK95jJftjtsaN0/nVE7xtMXbk3wjGPFq92C8TqfMUSWR0X/xEoH6T222I
+8eWtfBtr4skUNVoe5XFS8rF0nSYd0LV6gcZwScIClsZaHNy1b5zGuBB1kY/L61RTTCdzl0vcue8j
+n73HzO6W9S+KwNJ17fQaIrxrfWm39kZzwYOLshSbSvDakrj+FWasW9/EbRFK1fr8EV73Vg1StR7c
+HI2tKn2tZK9uv5AR69Q0tkLyeLmPPNnGj4iOHqoybmdBp+9+uW97HdLqYWyEcF9nmY66pWFEuzIP
+MuLSa3VcXooRLWtT95ORI7simFtLD8n6sVAQkxTizUVzNgDuHA3x2TruF+ssgAHQ3j1DVZu6nywu
+3j24VvnY3WB5berc7juWYu+vaT6Z/MmEOjZTm4rl15qz9LfyBavWnWtTaWksvpAgYXYiLctAsPlm
+vQXfNDtCKArlZoFxwpO1ezoAj/u2yaJs9jlNYxRa+Rws13K30lVZSyuKKb9dSx01A/N3o3fcIYyr
+3fdg/33ku5Xuy1peiK1V1/76kga7FCVLi8/5S+freB+svl+JdetrXZplhSyrexStXKSUH8PEEe3C
+H1Y0tsKVEbWt0xM7sXyvi2UHbkkplp9/lovlFeRLbeuBxqtpJZZt7iGB3ac9dzRimdS91jfgc0G0
+2Yrlxd13/Hg3taavHz1Lnny/MbGM5dcgljdwi6ZStb5ULK9EY5eOFzzYiOVl36zfnFhe8Chi2DVo
+K5YBxlsa08wklu3X8uAslqkrV3Ur6W3kqFgtfPPcuX6d27TcfxttWO7HfLQXSnjnIolLyuv7v7xq
+cd4Sf1jBEaKOaIs7kxuEourZWUxi/brz2aepYLfw+r15lnn96oaPECy3xOm8fh/psIONiH4YmysX
+lpU0fzpduDCfgeuiuNOg+mu34sI9ilY5Sb9wK1Yt8y3Xvn2YlK7TS2S6z50fUKvXWi2PjdiyTC1a
+48KF+bNfpfHzr2JN6kIL8y0LQthebL2M2w7Xg6nLWPZdiHnr9TZ2YDsfRcTcdr7ZjTqqxxHxWKhk
+6weNXrLfCA2Ske700iQDyFSpbktkEoff18+5/d1rjbk0kruZj6GfTebvHwuzfQYrSQ==
+
+
+ r7xXT5G5+/uV3l3vrNRqqTgpXKe6kodNX92XWrnD7HMY1nfvy/lLXDLxk3r1YWWKYg7MWk8aORyx
+mIhXSlOsjz6TQp7dafY+de+ZP1zFTCNWa2Yb79niaMSNk5799qh0EPLGdvn7y0gyIgbGn+cHg2nN
+5d07a0ny/snTzuOW53zi9yRzNwdb1VcxtlO+3854v/vlwl7rcxgSy4Wft+h3s9BOfL9ffeZbZVm+
+ej77uSuzw/xH+bPU6d6eHlxO795O/b63t3TA/1WNfF33ioH4h8s7DDwmJiNv2bc3GvE7nq1Ba3Dg
+ZXY+4/7HQuMuIAcufcc/O71CjHu/OUoyh4dbo9FJrOjZfzm99HCp624g3hASTI45OWZylfscc7o9
+uGJOr68+R6POSWg0/TwGbjneC17Vw3xBjiXL2+09UkIO63vOhqKF3S8pepLOp7rRUoAUb8NKKxWA
+odUMWFy4YJHnoOyky2t55YK/05U9ga5Qwul5nXRjXG2vlDgMnQlKQfte6ufGGsddVih/3u78jBJ9
+8crl9dxf5QMOKJq+h3f2d70PxR0p3k15i+XTi7338vmRIO9eirCqlCdZOaifYIF8JXB0ELpH4KKJ
++MtrN3Ph852Qr2NXS0z2Lvo2Grcvthmu9LydjL4kWpnz3slDIjZ8OTR58oFHXv5kg9I4LBcvSp3Z
+6TXQOciFYlo/FC6vdixeLnXxznDdyWH6U7yuwl6NX5OwF/dz4zx5rcY2433/JTf1BD+/HvC+i7vX
+rCd4ef/g8YVqW3jLxQX+iHtCSb7oCR3svuI2HXtC/dKzJ9AIy4iOSPKm8ryXrTPxKBk7es8zTXLz
+Bfkt3notfgL3vffBqrYP8Tbgs4+XTGs0CiZ7g8IYVnX/g23NXDrl2Up8bSe76U7tgGWY8ftupn79
+dpWUgsNBIHv3cAadH7ZgvsA7ov+ceztrBhn2ddub6l2/SLl0clpLDMdsXfvi57HYCGYbje39RPzi
+G459Pj8hRhPDTSfbidF2c5QKSd0rht3zt5Plxt40WdqX7pKDQbiAiuqOWM3384nYdfor+x5qTxKH
+J4I3kyrcNXAtUZc39/52PUxWMo8ckHvwKPPBVPFaD5kla8U/3xOHomeEx8I/a+sd+hOFcqrb3wvh
+YLe4k5HU90/Mmyold8SUMAk85XyDdzbzEXq6Jpz/XQCiak5wnGrm4+U+muomujyOSOJBnvTnU2Ma
+uwzwT0gHeQI8kFfoIpe9vJNynuBNLvfmf8qLk+FrEfbqJAiAeHynk7dhHVb1ICBPvpgGEvGCB+/V
+3d/O5PNnUXh7Ozw3jm9P25zMCBc+zqVboaeUEOn7CQloe/rgTX+Gzptn22FvVN9nPPvv51sAfI8N
+ZILeac53dn4eu0pNnzLn54ldvS3e5qrfqbPb/o8yHzethmCRzS29i/gofj0lbz7ao8zHwc5btrH9
+fUKmgrUAAP5c9uc5ltv3BwPiduyhnG0ED0Nzi7ziYNJUn7iOdBhT35c3B0AHzyO8iyBNeFvmI3Uv
+5TKRRw4IqVrIZTk/6DAGdHDbb98JPnXwpfzJtqMDgDa9bVhQ/vF0YAD+KPdzRnYNtuSplBhNc3tA
+DNU7hvdsSZnw9WeGbCLoYx+9+E6y5Km2YRnRi8zF+3gX5N3RC8MFW92UmLj/IfKVYQfVLrCmh0ny
+mg2V1c1pDktkf9UuqXorcfdxew8Mda+QKlVPGYIMQmMfsIM3vXLu+azQSl6nU9VM/txzt/CgzVyQ
+033kCwXfxWrhNpF7be1UM+fdwFXmYzA6VhgXHy/vptqPpbv4x7SYRsJ9hrOPh1PRrggLm3U68k25
+99PDoa+We/fHMhhuu1ZhfNr/zgY6jxNxO339tgCS2JzAvpzswMjnfTwvd2Qtzy9HL/nsQaYd8tWT
+khgN5zLVShDQFn1iuEk8KRe97Yf4RapxnzsZnxZz73fVJChTFQGPVCpZDu1cpi+P+mmVWzQK41Sp
+dH2bavSnr+q+SP32M5+tlx5QF8yHxRPx4TSdvREmKgnkq9108z54n/kojd+QCd/msuxoJxOs/eAK
+HkOZg9rhbqzd37sFuCK+TGt8Iqi48wgyUYJAt+S5wiT3FryLoRpbMpoNVr4prnAPxBmXcP+KtDOD
+fLGYe+WZc+nPaF710CJHAz6dq6AElMXbI7wVMHm7G38nnfAukXt85yLV9VYq6XZ77AG4LyUET8o2
+Iu/+6F23cKqfl+hd6akCP3q13OHp0ylhZqQtdtWOd2KdV+kDHrCwFvVAAgCZVmfwdOo9ff7K1ivZ
+iD4YcLTUrfhQG96R7UbiLGdaD35+9ud76ps78mhC5GwPr35pprrhmwBYQS9+QmPZXaB5IZvztU5e
+koPP633VAtMfNL+esrVaRD6Wz7mBgtnLs7vvxOi0B/qD/7WUCd80OPJ0XudPI59+gbW0PytvoFsn
+jyx02ZjBLQ5MagtY6+1OIj7oVVPXk9o43op5+4oFdj4efOTeC9M9PUtAb5vd1nj80yNX1YDiGN2L
+7Q44ARTjn7vEwWQ/E5AjwiH8dniROBgPT+DB5UVmWitew4Ojk5y8c9NMv1xsnxEFK3oX2rrMvV/u
+RlWn4zAJVtL8Mb0GkLlptvF4RITjDUixwxGezw7uwTnoAjxPfBd44ivkyEXjjYeQqV82sC9+iEdf
+9fNsPZQ4V7I7duIfZweV5DUzvERCO1dE+bTH12HPfyrkphhyKxdwgYc0UWjhnAs+YKg/DaJsHIbe
+cwP99i5JHhx8JMuT4TSZf/RLsBYkP0PrTf/7OVvf3X87O3rm7xV1+PrH30hdT/d8yMzOMh+vW99n
+2zenYeDyz/d4MdBPznfx5QO0DBh1qGmJUCAcXCZ44PKysOXHMJjMAQNsbwMf37uA/f3ZBUWm6kve
+dIf72cb3jwwaUDKEU3WIiILDEHwE9p/YIlRCrhc68t8HOgQtZLnECsTPI4XVbFv29DWMBS/ZrVw2
+44+aepqdFWyl4wOQmE9QjbY+U6FYZkdhlLMfYBS2PDDAzVaydNX6grMvtKeNeRLA+wKkQeZi/2kH
+hmgNDVpfIwVSG9EvC29PN4fBx8xzLhMUAwb5eXJzeJ/z7b50svVyfpoNFMJKpXDKm8mn3vncc3On
+TXYf21hgAPEJKMHXHrmbazzHW7f+TqrxszVSucXO1jjnL3ZigePo3Vn6/Tu1n2m9Tx9zb5PPbiKW
+89ZmD7ZcXmApL8cKD3kU28+gj+UN2gxYP2I0l+kGFUGIBzslTvKTo9xb98CTiGXjxaQcz4e03Q0O
+QPdoT3PJXiyo3X7Uvp73Wq9iNhivwQvtJMb+h61M/uLxPc3e9sY5z345pD/AL0tefLRhzyPRlBhk
+H3DEi9Q3W2tkcs+X7Wzg8/URT+A78TilO1/iAehM99PoiD/rpAqPgwc4i7FnEOSfO8Ajr4RE7Opb
+Tl0Xhx1QaWK78tfI8+TyqqSksLAPJtXtDUPK0dUV7MdGixmNjg6wyzZoLh95llC8PphisOxGBvr1
+WFWQcjdbOX+1OAEau06HjomCiRufRMM9hBYKo8O9ON8ooHuzjnzdeAfw2fYkfpLbicRhsNkkl34R
+X8H2jzi9dHkNyuTifEXDDVx2OFHuvkrvnGRtVwq7r6z1kbuwWqvFzNuOKx3sm1ZK/DBWawXb3pva
+ySxdaYl2pWBX8udPPaPF0GyXTLhlcw+n7MztlIpx9YMO2mw1NCC+iDwj/EB7UM+bpB2efXgeb3u8
+X9lG9Z1LdS8OemAWHkfQ45jCjwsUcu+xgZDzyaI/GwoMhrqNddAJxvAsPsqJ+5J3y/Ld1w+s5AJG
+ko/GOunMJ+G1KPJ9yDyD8Y/g6DHdvLu/VC3e42wQDTcZTIlTwGKd2cl8fJT4mR3rz4TD58E4c/Lh
+gS4Hr7psdnnl67v2de71eaAIodgV030Tpzf8Pdj7500Ypxgh3hC8bxF08OHTa/K6cPaIqn0p984l
+IwqNHcZ7Nwx3dj3NnE6irVQkE7rTnwLG4o3rS5BExQFIIrkGnLgxVuAhasD0nTXc9mcECeSnPUhP
+I5CzM5BA5zcDlRmXbYEKxLu3V6uDhLtf3O3ZAKXcI3lli6f52wqvwIZ6207ExqEBbvxZNnA1qIBh
+cwUWX7LYK7dz6cZNGv0+j3jkuHTnKBWwnPSmx71qzuLMOHMR2N9OCfdcCk1PJlke98tAVAfTufUl
+eCLF/FOQKhcPZNq5Sf3PhnNnNAA7JQWpuWSmYYlyBanntQcyKdiVxmljrPVOT45/aHd6YVKuXTJE
+RgxoxS8bF3S0Lq7PFqkwaeJ+v0ZAgmMWfCVP0T+mPce7Sp8VoEr78Wcr8rICCXSh70s7kF4JSGhZ
+2AGFmDABpT/FOzhfaEGC86IDdVKZXC0Hak2QXN6VgNJBwrinn5YdWZz9ZQxpTXZEfH3V4UrUbzpy
+6oGc5J4tJ8XjiDT2ctFWVNq5jajaHMiX2rJzDgfO4pRjnpI6LF7IKh/j7jcsJn3Qd9+O5LoWrOcE
+bwS6ACm2ucNne/RA66Mlqo90OLQmm4Hd/xMCBUjqc6qTlI0UW0JUR5z1sMVne0rV1rJkWDs+XXz7
+oT0AQGP00LbGtsMyuZR4bQuryzveyrUZm2EHnvWPK8A6O654e7bNgV31uL63bY8rruX0LLVMLFf7
+NsM23myHBQR9GbgAcpiFYV/smMuLDdWW+9YnrCAc6XFkI0fgT24LBQt0vNpsXXVgqSkFC4G4znDI
+rebKBAkuVWXPLSZozaLHX9n6wQfGNkqvROlW3kD/fOr7MjQBdf/5PtvYFncUV/j1q3hMwhHogVfM
+WX6XuInU3y4+vtEPc8MGvqN7DJtP9k4fTo7qSeb4oqc5Z6Gtuu9ppD+fUt6Z77+L8ZwfLb7kF4l3
+BTO7NL8QrL8bRhfNceajUsJgzuN++uPos4iGu+KwP6yL8X7q23fzEW/tiUXcqyd84wIMlrO+4myC
+P6VZXOgZzDrf9uyrGaL/Z2YbfQEXzDJKqIfkTighsVz1VQkVsPnvSS7BXNwCHsKP6p97mXsllKV4
+/LEtefotkKgRWuJq3OgcgxhcsnJ3GwC6ewkYbRowOQ5Pu8fVbH1wFkoWm/GmIVjF+/vbYMfd7mTO
+u7e3JscnCQShlcTEo5pDNzhGk8urhE8OQ/et1Hfha6T4B+eCObXk7e7hMWz33fViQOm+q9u2JCKF
+33ycj0lxZ+mhQiL5armv7fTkSwmu5E9+BD3yg9vZSXde3zit7TEOW7LvnwWw9mHNzD5Sss/vM8TF
+Lr62f8haovf8Yc04PYnHPo2F1PfeaU4z631eY6ArffyilmvNXmPzVZT775feLkasRMXi67xe9IHG
+RiLG6bbk72QW0ObnZzHTBw8cvvxohp2JEj0ddRp+DdZ7KfHA+MPan7tg7+d8ecaLzulLOHK1XYUY
+mrvBfG6fO+a0bXyU0Oru5N738i9wAo+2SWQE3ZgZA0sBGkqA/f3QS1Yus3l9c1xezQ==
+
+
+ /+uVsVMcWj1fydIVaJkY6tHRMYsgyXgOCkrwCO24+QfFRLx3nDYEfV74bBdsZOKA04JCxEFV1UJG
+4ihRTudvQA/xn5MoHjpBJQw4PGldUl9JqfH4kDl4KEWVcNosGAXblPlIxJ+TF4Qnm4GKYrToKNmv
+196V84K35xzujVvtrG/rrp3JeT8u5gNKF+J9zz9IDobDekqYpkqmiJTCYT5zJ+Pnu8Dx9uE2vnMG
+mA/siNssc39wWf5GHfVkB/Sj/SfVEfJ+fgyc6mRsiFx2vZWSIZQzH4QBi6/16v8A7SqHmTPbEvqg
+B7MY0d3Z9s1RHInhEihmb0LcEYpD15wHqmVuzYIs1/qkuJa5aTc+Kbt3gRbfee27uBjb8l9IJVk6
+BS7YqpDAuPoOCcaNIoVUKB6PEe89MArvNF0YTK4RzKF2Srhp+nN6U8HARA45jMLCSGvvK1lJ336Q
+ZcyOoV8JtxWfLp6zb8PmF9DiVkQbjASC2Ex2J/R5z3Ah3yRZDHUraswf/yxdle8wMuJvXish++/W
+C4xTYGup7vd5WQvjA51PfOHLxfi++kDc/vGUT4c7hyL63bcQqYVovHF7Q4QWSfZAWQm41aJFC6I1
+1u6nSing0lupwmMpqbJWRbqeMBhFD6NQ68/kx2Gq+yzHCAx6nGYWf+metnOJduJZOQJkG9lU/dMU
+0VHjNPL4hHwyQOmH9/wnfhKjQ+IdVN+VO57sXn+3BCCxTy6vOTfk+DTvI9GLROzB10lxX2E1Jq70
+C4Z7Sngk3SjHzCGTdGtag+mTLVX3eKgWsvVws4VWUqe9rTiWQDiO1SDN6O5UTZBIpTygMBwntFCP
+b5cczePdcqwTOK4OFE1BCfoQl+xD7eeC8Omzo9c7hhAX0cf0AI/gzZxWE/Vk/8QzyJw/idtKyi1/
+6BOSkebpbeLno91XL/h6mISVQodOMBZAPWqQrNzv7GffxWHD0M/iTntxB4DK/aAH/gsTaUZqoHP2
+A0OQmon31MzWvc26iQQQTxktEUqVj2QtO3u5zHfw9Oj+I51guO3vj6z/tdYGPaMyzj62Jruq0Nv7
+8CYOI18dZMcvChcAZCW1lL5sH/NdSMpQEiQJxyditUI/9fl+iXZlJ/n8nq2XqjPZpgV97t+PK6nu
+Vj9HojyyeOpvYDgGtbCHDHkQPbwX3zDtpYMh8lI2WPk4MMCFn6AA6v0Za7qlwj7k5Hvi8CwdxsHi
+amhY3d9YshxMgLLRqUxIsgtqzJdaduT4v49dAsMKbiHKiu6Dm2m3NboeddqdvjvoirsOkucse9tv
+DnKjVqvS+s8kM2hMe63+xB1zHyTL6fNzCfhrY9BsQXfvXDyn8aFnOuppV7QxX8sg/aPYe3R5SehT
+zeES42PMMPWBrGuPF6LEx7X+affuq556vywlk8E++xI/Ye+kzHZzms2kz55ftCjq0FyxBKLIGZQV
+AAHdPji8ukjk5fGxdHZ4H84NHgVgrNnR8yOTecxVK7mj5FHDCh6NISo6z9dKkfOZwFseORfqB6ks
+d5YgQfPEx23lKnkmvl9RRc5Re1dVBEWT7/a30KR4UyLit6+5GvD8pytDogS2SZXn1H3qe1eaaCcE
+j+VXp6bwx5kQ1APgbLDdPlaYkS9br3QOM/n84d68CVMAtb8XxByeoprIo6RHvEQTsWtfCznJKVE0
+NTWz9pT6zpwxKg9nMi8khIRhp/RTCxihvK9EX0h8ngTkhffQi/IlF9x4NVyvpRLqOVN6WyzPHhzo
+gRwlf6ReOdxGsRp8ieTejpM1+4w5e6PncXAJyziVVaEU8vWUPKrKxVRWRYh8+ePyJkaNMFGkJ9lm
+7LhnYbj00UwMn748+2LpVrl4OxtnlohmCAKWrYwjlzd2WSudKOaBvtP3l8NzAvycDXSHcfeTH2Nb
+z7eX8zWeZ+zyBZTP4uOBIeqO6QioVPWOMDmvWwWB+CIbktfQqkp1Wyk20bseltQw3selrKf7YZxw
+V8lHNybtFB7A0mC+CWtE5OfwEz6RgYRZmSJIxZNbEA3j4JzhkhxlznOPW9qfhwB3/uHDuKDGjxfU
+ndeQJky07M3rglgiGYGouIeeMOVd+diaoOkWJGW20Mrkdv2lVOSuNNEyygw+EYwEHqN0vP/J+c4f
+bmabc6mmuoYS6J5gdmD3MTdAswwq9Rk6QpqZ4XlDFfBmMauNPDg6U3TDxWS5C80weQ7PJeeh7UOU
+Lu1oPj5ye8e+M2OXe/kj0w7kaxa2y2G2cfyyDasPPphAArFaehx2zGL+ZVwvgfWSDYPpIbfErdxb
+CbpIrOZveX45er5KH+WSjXYDU+Su0vxR5ZjYuEoCByba6VYMWct9kFhBhgQ7dvBzBiRXJCSSydQu
+Lm4T8ZPpZE4rP79Pd46OYwoTBu39OxEvT4qpkPQVSHXD7f1ksfFRQLjK5FNkzcfsY/MCY7Avx5ge
+gihq+NKd8SFL6iTmy2FN18KkNPPg+9p2UnSmzE3760nF41vhKskcTscqHzt4BEpW0unZg+3xYeA2
+PlI6oXZE3lET4zBZbhZZVlMAX/NZ4xFXbKDgI1ZonKksDNtaA6EBp3LBelET8UwJduoJROvlOtXL
+qZuMVsDgIvui/4kZna3UWWX7Ffc0jSkfQWK0n2DKSLo3S7W7RLfLQ7J/tv8zy+vSH1zMvvU10JBa
+64FmXPlBsVVNxCs3Y+Xp3AUcqyfMcIUK+t0+QUQNt+OtyvsNCNtaz1yaUrmYTGdyXy9YUT7seDHF
+xN3D0Yib7Hr8h1eCJ3Swd4cp9BnPTkY6nGXUn+CDC0/wZ3iND04wwb7pCV4+nHn2f7ZHsC+XLyYX
+J70RtroJhqkzqxphq5tgcF5WNsJWN8HURJCVjLDVTTDtoodVjLDVTTDislnRCFvdBMOSjFWNsNVN
+MCUpfzUjbHUTzOVdNMK0mljiifZXR6TqoZ87zDVZs0Kv2AbG4rezTMszDOIZaiTuKue1XFYqtZRy
+39zsURv3PEw+5KoU3UrcbS5ZnmyVcZObWPNxrBTKGzKq2qXXWXrdrVVaHGoXmL71Vpm8ZANjfnfG
+wpZngiUcM8Eau0ZbbHnWG36is7Q0E+yOIhNMS2jzTHzj5ZlgzPlzMKxFkpalCk7rxR/TSkHuO2e9
+2a50a+v45HTpSm/nPnW5NOuNyR5eZx1W2tqKHNiuVNt9ZRmpg0untMiz3TNjcdjJaSATDouPxGhQ
+5JlS/aA+uCfSjhTkaPJOed7bAuMk86Vkus1y2fb53fgTO59e92Wwqy4i4bieJ2d61+VV3gbl9gvs
+pdhuLlnqjWcxpQZ7+tpmQOa8jlDNO8/6b8/HimoL6ucNBu5bWAHYIlFivZgJU+7ec8kn1gPyI/WK
+7lq9sH2+NsY+2sy1S7TRZhJrNiVOhUNrRZtfLpcHwNHe/2XGCgVIJPBgCMlerRnsXxLqrwZBVm48
+L6+2dXpuymExpM44pUYZP1JtMPvSy/PyDGlAq+TldW9WT3UgsnJZvgdGnH6dFApr2VwWFl6BPbYC
+yeWlShb8ZQ6P8ZpCI1Cx4mTt/MVFkDBM+/vEorvBcna0/OwvMKQ12ZHp7L+8U1C/He2/2uaqkQJp
+Mu062WpW59wqVw3k/m+z1Shy1VAik1yamC/4RzKyydGb7f5qRFW3T9SiSP/dlECZJ6kW8fasS1R2
+qU/vZkq1Wsvq+dPvS9M1HdOybaFtLMv/ah6YBjWnmD/ZDfvxG8wCT16WXLrmcU2Y8pXNa+ktT5dH
+dvxjMWwSTbysDReoPitrsR8W7Zd31SF06x0ky4+eSYp7v/wislmpNrlKH7wSp/l83cmLfrOBegH6
+8rsNfn2zAWDM+W6DX99soAbpl99t8OubDVxeirsNAr+92YAU4TvdbfDrmw3UhLbldxv8+mYDl5fi
+boNf32wANOZ8t8GvbzZweSnuNvj1zQbouXK82yDw25sNMC7meLfBr282wFJMx7sNAr+92QB23/lu
+g1/fbABrcbrbAAxgh/sFHC81QHt/tQsVVptUuc9gVh6/eKPBBu8zUEvKrW402OB9Bvq1OAs3GgQ2
+d58BXryl3mhgIVoNlZsF081B0jDIjVPfmb3PmTC6RWob5fZ9/g7AkL4HWVHdJnC5lExV9Au9zF8K
+EM+cN47u9J7Yj/jopGQ5+L1DHEuGywO2qsJl9rHpbRNXMuxVXxV0IPck5YqfWUq47+ygs1XcnaVN
+vM2c5kRg9vQwgybU78d6W1LknzvJSJNrq36B0vM2iWjgqVRiGiUmt783muphDxQE7yAIvv2pXmC3
+qgyWPxmWofMgljn/+jnjMqGngDGW0mxfZAPj7G7685kPJpnjaZQQl8ur31iAQraRhR0ZAPqDUzWO
+fFS8IUEYY1TiOBuaRSXUT3ZwwZEHyed7vp93ti/aB8qUKvGr3e/qLBSSnt3Nu6uFQuDgoslBrihY
+JIHPJ4Z9ufxMRfziyJgRQfJFMOuWI/EJvK/sKdPKPuwBEvQ06fte7r0w4MFw2/pMdfKJseoO1Or9
+UUDf4+5Xoe00DIpKqJ3zfUivWP5fx5i4d7hvOGiRA7meaX1dHDKRev4ED1Ioze0cvWfC0/EDSJ/K
+VHvABJOV7G5HzWzeO+NzvnxSVyH2E7HsAXDQVP1E0S0vSbRBi2Tc1xOVG6mMmaEldX+1AIia4Y4R
+R/2GgMF/H7viQEbnLPuW7TeNuWQurxdayq3JdIgdIm+pVrvTL9T+aY1crFv5j4H/WDfnjspuLhLB
+fxg3D/8v1F2+xqA7GI397kLf5X07SI4mmU5j0hn0a6N/3DFsergs3J5n3DH3rGvc7QNImDfoDE/8
+mLz2BtC9uRh3Ev7/8LdrfwpzZ+D3axcTZjg+4mbCLCcL8E+EkSWY+tvFqIDBC//AHxfwyxc0/e0W
+3JfupxfG3cSxblwCK4R5GcAWInyYkeDtntIWjUKTFGZFRnRjQ1SGhQnRaDgiwUwCy4Yl8prEhwWZ
+4dxpl8AIAI0IDyUAxM3LXDjKiCym74UlkHxuXpLDgihIbkFkw5gCBC/xUT4s8xzMIQphjmOjbj4i
+hAWOg8lEeCREeTfPywCaQF7jZFguvMaL4QjHRsjgcoQX3TwnhMWIDFBH5TDLsvAaQC1HRAXGKBPF
+11gmLIk8QBAVwxLDYCc2zETgF5wtKokiaYmwLC6fA0AkjrzHwioFVmljYd2kJRpRWxgYkrREohHS
+wsusSN7jw1wEloC4EWVWgLXwAGaUcwOCw7LMwS+48IgIA0RkpQXekyPhKC/xSi+JgUHZCKBHgl8Y
+QIYgSWRT+EhUIDsHC5ZwC8jOMazSxghKJwkXjNsr46YubHja9QETQn+YXMGxBLvWI22wgIjSJsJa
+sUXgcBBsEQSlJSLwSgP8z91wKZ0krRMfdSsDCbOBRPfidA0AggGiBsTBS6zyROQEAgduiCiSpoiE
+hAQtUVmQlRYetxGIjYmyCiCw3wIBZLEXjiSpI0UlZaS56RCO/Vvrw0pOoXb4wiyMzA==
+
+
+ IPBw1sNSVMLjx8Ay4fBxoFlGOaQlwDEflWRcBeCdY4AKeUEGJCBa4HiJER7pmwHqwpPCSHBSgKp5
+IBegdDwgAg/HgQFUzdoKpC0aZZR+oN5ESFtEwSTPiGExipvEc2FJ4pAykT/g8YWJGFw/0iXP424J
+XAQQF4XXWJhbJCQjKQTCs3Bco4h3eJ8nYEELJ/HaYQfCBrA4EagPVyHKYZ6JwuBwklgBtrvqQtqO
+EMKOIow8TAa/8BKLrUDRPJwVNxx2RAgH/Tl8EoFfkUphRs7NCZEwnGGBkIyMZMVxeKwFmCfKAb9D
+YIBvhCWYi8DAsTATxwHIwK2gJRoWETwOliUzEraIsE+AKGA2wEMAoQilIMEpbbhYOHiiRHYJUCVE
+ZDcL7AQISybwwiRzLSpXSLv0Njie5GQADAycDQ4OmKmN4QSln8wqsDLALqMRmBMQIUUA8xwTBUaJ
+x59H/gHUzOGGMQJH4OJkgKLhQvgJqQMWYbGMRFCj8KIIo5x2DqkCuQ3wpGiEENQicRacaL6QUoQf
+iEIi+kKhtYThZNBr1CZUwlDrSiUMiSB0t1eQeVGNBQq6zIuqMk/WZF5ElXkozRSZx2kyT9RlXkST
+eTyReYwm83hN5kU1mcfrMo/VZJ64IPMiZpnHW8g8XpN5vCrzJE6Tebwm80RN5gGlqTJPVmUesBmT
+zIOWBZkHbSaZhy3zMg9bFmQeYy/zhAWZJ1rIPEGTeZIq81hGk3lRTeYJusyLajJPUGVeVJN5gibz
+zBuuyDxWE0K8LvNYTebxmsxjNZnHazKPVWUer8s8VpN5vCbzWE3m8ZrMM083k3mSrAkhXpN50KTK
+PF6VedCiSjNek2aMJvP4mcxb7EVGktSRiMwzT4dwIHELMuKMCYtAKeRI8ApDR/TLEYmwYCaCHB4o
+CTghS/YxCoyHsHxRIrsv4mmRCOETKQBDANkCBxeEqCInkZNGeZacLAGJFV8DkmR5RCD8AhySMEMg
+OlwdSC+ZQTICBHKIUiAaEJ4CvofgImkRlVKAo4AaUwQXIIiEJHG/kGgiynuyQtx4bkVCLNBL5nBX
+NNkrgFgBquHIsiMRWSRwskyUSGNAU1RAARVl8OiwbgVxiE0CCse7F1CZduKvU3K2EYG8DP/KcHh6
+5NzKHApWra1gbOPIlhQMby62zN77mDXCsQ3LUZCehglmbQVjG6yPFwTDeJZNszfxPAE9inxkBgqS
+kKjqBDPoDE36svQ3rdq0Vw1TzGAxzGGAz9CmL01/16pt9u4HbgfsuETYAHBYVuIJa4jgaRH1poJC
+fUwkMtfGAwELeAIt20D3kGUydQQYRASp2dgGS5WRunhU6YncRtUZGR7IA4kTUFSwirAXBGQ/ArIR
+hANoH4hRAJYbxbMCSiacF2xRtSzQhsKiGNUb4DXUcfA8651gX4Fjw2t8FMSOzJOWqERAEhXJogii
+qBTR2mSi2oFKysC5I2/KyIyUNo5lUO+UUF7gaHjM4QVBANYuskaw1AZlNaAyCoZOEdT0WMJBQNuV
+CVok5ABkwShj8DUQpiIyOgHPLbK+CAhTCTkPoJOXREXOwmAGpKM0jhJJqTaR/cLtZ/Dko/rECgo3
+4ySJJfsQAWUayBKMYxaPu9aCImzWBlwQeQiOBaQYlWW9DWQTTITyiVdsDpwO6JHVQUgrVpQEG2Ak
+D2xTCVCWOA3QOTolupxiovCgFER5lKPA2qISCKqe0oaESJoiZAxg5qh5ALeXJNRCo7AIGeUbil8B
+dWHoIQqMYWbEGlgZojxP5lFgqjzqOmAnSBLuN/RiCC9EWxwsFTJ6RJYUoSICTnAs2GdgOpLephyt
+KIeUgnZTBAWKonQocImipFDB3IlMW59INLhA8qmWTZTQHEgunqwZ9CeOaNDA9QRiXcvAEQhUAop5
+BVeirFC0iDJc5MnuE9JWDrLEsaoNilZVgfAK2DhJkb6oguC7qABGFH4eYSKyijGOVfuBbCNNomrb
+oZohs4Sjo56IG4jTMqgN4NaDwBNV8ECdB4YqabIJNxctzDuVBiReaSPDkhY8FKQFjaYFOklrigmA
+LEWJwQ1oifJEakTQRANyB8qAHZIi2sZzgtrEaaudf1W1Mm5dstvndz/cu5ZJRK0Ph4pVhKiAcGii
+HApGMKlQj5VUHQtW0HVxUcQpSm+wfjng5Ni28G4XQLCfkxMRUlRv0XCLAP5gLmAOIOUVNUqG0wHD
+ossCSJNsBuEqXYtXHaYCWgazQVaEG2jvOFUE7UtBUa4icNpgWCBB0CZEhf3wUVzB4qvLp0IHGyIB
+2WOEiaJURnKKsGhBC7hvcIi7hAswHE6vyZfu4qsOM0mCIkN5kEwysapwBKJO88hIQVTgqBJaNsjE
+gXEC5ZAm05sOExGjAfmliLiAXcc1RZQTh2IRrG6ewI/ePpRT0I8YUV2Ldx3mQncZw0pEFBDeDHNx
+ILPwBHBwGkEq4LCg0ooiylt4xrEcWejCq05TgeYqEi0BmJhEDhs6TDhUldHW59RhkVsSLhuBbZTJ
+qsyvLp9J0WKRXDkZLVFclMAAGxNR7YU5QQ1EaJEfS0TX4HhFu+5avOswF4NMl0eGDxKDEYkvDHkC
+4V3o5kEGDOPCwY2KaIKybDjKsjJpM7+7fC5V8KG4n3Nzwepwq2zcXBxrdnNxrIWbS1LdXGC8L7q5
+ZDRaoIlRLCvQQBn0I6C1CFsDz4jbDu0oBjUAaGPRVIA2dF2xqGihBSSJskpVHDrIOFSyZYJpURkL
+IOTRT4WePEmUOGKBy+iDRGUClKYosbeiRNxBi4xuCvQIRlVvInE7RfQmlFUo/1nF18QSrzlxcxG5
+xqMfh7jQ0JeG+pQiHBUnEqpmcIyEKJxiOHthiZhbyAtZ0c0BouDoKwoFx0RY8hpOi2tDJicR4cYR
+7xu6xMhxBV7LEZNZVjGM/jD8BRBEOBF6z2CkCApgVlaYUxQ9hRFeUxRgEjTUOaI/otNMa2kQlspw
+6GDRezEKmnliVgLj5UBTg8MkkwWjcgrT8cAtRBRnuMXoSOOQIEgngB+1EHS+SRySmIiCNYLmKScg
+USP5yKjqwUpA1spIh3iMiJwiXEIhSPTTRKNq2EB1jQqKaxTQBBhTXaOi5hrlFlyj7IJrFOYBjosi
+JIKyBNaLvh5CKKCHMKiHKO5GpBiM4PACKuEcg5qbdkRBhSDvCSIwaWQGQjQCK4ZHgog8F6hRBnMD
+34OHircJoBPRaObQlGAjCmcGUgYwQUkDBRNb0KJnRLKfwLii2AtMBOLcIr1ERlGcJVDHoQU1LZkl
+DJUokQ0iNVEnBgg4Hl7n0HkUVZkzUfU5UMBFDq0HHmMVMiHfqKS4YdHyAWQAMmFfRRZ1woga2MGR
+0Y0gYDhJIjhBB5PMysQw4XmwylAYK6cPNlpGjxi2sCKgXiAqJfH3gdmGDjTSiZFYluxcFIQPaYmi
+3sfxsuo0gxYRthIxGVUIDJvIatHhSxyR8DqPh59DhiKyioEDFEe8wgxhqVGVj+PSgLMD61HCeBLL
+oH8ZGST6LOAXYLKc+l6EHAwZNw5sKw4dh1FB8dezHJIOMk+Dnz1NfNBmP3tkwc8uWPjZuQU/u6h5
+1XnNzy7qPvWZn33WFtV96hHNzz7Xtuhn51H9jxBWSyw2JHJRwBYOYzLYMvOzEwPY7GfnzH52IAST
+n52Z+dmB04DOAfwAqJwHBgK0gfChps6rMoSLomcN0QAnV0RhAu/JnGKdzNoKxjYeScDUJoaBAGA0
+9DAyRKRhZAnIEpQTVbrA+WAjxE7mkBGAugRtOABuGViRsEkCacHzzEWRVyBeAFCGJxYBgioJguIj
+YDmF4cObPEGLwn70yAKrRBbSxrBX1Bz24qSFsBenh71ELezF6WEv0SLsFV0Ie0UWwl68Oeyl2DeE
+wnlZIFSIZlhPDdDwircRaE5ws6CskOOD+8FEyYFCZiMpwWMiQ4AwgbEz6GuYtRWgDf2caCkAaxcx
+ukDeRCUHcSZE8HDAoMSYAP01wiiEg5FscoCA3eHZQk4gS0TWgcxB1zOHngMGhS0GDnji58eRMPSA
+yFdpGTkB8E0SH4oi3zGv1zHaaRX58RZr7VZlVOt0WyNXe1z7q+Wu9fuDSW3SGsITd3vUGk8Go5Z7
+/Dn4G1vgFa2715u9zrn+L1T7Dxc=
+
+ </i:pgf>
+ <svg:text
+ xml:space="preserve"
+ style="font-size:13.03699398px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ x="246.20877"
+ y="10.629581"
+ id="text2436"
+ sodipodi:linespacing="125%"
+ transform="scale(0.9830254,1.0172677)"><svg:tspan
+ sodipodi:role="line"
+ id="tspan2438"
+ x="246.20877"
+ y="10.629581">TM</svg:tspan></svg:text>
+</svg:svg>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/BUILDING.txt b/web/tomcat/webapps/docs/BUILDING.txt
new file mode 100644
index 0000000..dbd76e9
--- /dev/null
+++ b/web/tomcat/webapps/docs/BUILDING.txt
@@ -0,0 +1,567 @@
+================================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+================================================================================
+
+ ====================================================
+ Building The Apache Tomcat 8.5 Servlet/JSP Container
+ ====================================================
+
+This subproject contains the source code for Tomcat 8.5, a container that
+implements the Servlet 3.1, JSP 2.3, EL 3.0, WebSocket 1.1 and JASPIC 1.1
+specifications from the Java Community Process <https://www.jcp.org/>.
+
+Note: If you just need to run Apache Tomcat, it is not necessary to build
+it. You may simply download a binary distribution. It is cross-platform.
+Read RUNNING.txt for the instruction on how to run it.
+
+In order to build a binary distribution version of Apache Tomcat from a
+source distribution, do the following:
+
+
+(1) Download and Install a Java Development Kit
+
+ 1. If the JDK is already installed, skip to (2).
+
+ 2. Download a version 7 of Java Development Kit (JDK) release (use the
+ latest update available for your chosen version) from one of:
+
+ http://www.oracle.com/technetwork/java/javase/downloads/index.html
+ http://openjdk.java.net/install/index.html
+ or another JDK vendor.
+
+ Note regarding later versions of Java:
+
+ As documented elsewhere, one of components in Apache Tomcat includes
+ a private copy of the Apache Commons DBCP 2 library.
+
+ The JDBC interfaces implemented by DBCP frequently change in non-backwards
+ compatible ways between versions of the Java SE specification. Therefore,
+ it is likely that DBCP 2 will only compile with the specific version of Java
+ listed above and that compilation will fail if a later version of Java is
+ used.
+
+ See Apache Commons DBCP 2 project web site for more details on
+ available versions of the library and its requirements,
+
+ https://commons.apache.org/dbcp/
+
+ 3. Install the JDK according to the instructions included with the release.
+
+ 4. Set an environment variable JAVA_HOME to the pathname of the directory
+ into which you installed the JDK release.
+
+
+(2) Install Apache Ant version 1.9.10 or later on your computer.
+
+ 1. If Apache Ant version 1.9.10 or later is already installed on your
+ computer, skip to (3).
+
+ 2. Download a binary distribution of Ant from:
+
+ https://ant.apache.org/bindownload.cgi
+
+ 3. Unpack the binary distribution into a convenient location so that the
+ Ant release resides in its own directory (conventionally named
+ "apache-ant-[version]").
+
+ For the purposes of the remainder of this document, the symbolic name
+ "${ant.home}" is used to refer to the full pathname of the release
+ directory.
+
+ 4. Create an ANT_HOME environment variable to point the directory
+ ${ant.home}.
+
+ 5. Modify the PATH environment variable to include the directory
+ ${ant.home}/bin in its list. This makes the "ant" command line script
+ available, which will be used to actually perform the build.
+
+
+(3) Building Tomcat 8.5
+
+(3.1) Checkout or obtain the source code for Tomcat 8.5
+
+Clone the source using git, then checkout a specific major branch or
+master for the latest code development, or download and unpack a source
+package.
+
+ * Tomcat GitHub repository URL:
+
+ https://github.com/apache/tomcat
+
+ * Source packages can be downloaded from:
+
+ https://tomcat.apache.org/download-80.cgi
+
+The location where the source has been placed will be further referred as
+${tomcat.source}.
+
+The Tomcat local build process does not modify line-endings. The svn repository
+is configured so that all files will be checked out with the line-ending
+appropriate for the current platform. When using a source package you should
+ensure that you use the source package that has the appropriate line-ending
+for your platform:
+
+ zip -> CRLF
+ tar.gz -> LF
+
+Note that the release build process does modify line-endings to ensure that
+each release package has the appropriate line-endings.
+
+(3.2) Building
+
+ 1. The build is controlled by creating a ${tomcat.source}/build.properties
+ file.
+
+ It is recommended to always create the file, because of unfortunate
+ default value of base.path property. You may start with the following
+ content for the file:
+
+ # ----- Default Base Path for Dependent Packages -----
+ # Replace this path with the directory path where dependencies binaries
+ # should be downloaded
+ base.path=/home/me/some-place-to-download-to
+
+ 2. Configure base.path property by adding it to the
+ ${tomcat.source}/build.properties file.
+
+ The base.path property specifies the place where Tomcat dependencies
+ required by the build are downloaded. It is recommended to place this
+ directory outside of the source tree, so that you do not waste your
+ time re-downloading the libraries.
+
+* NOTE: The default value of the base.path property configures the build script
+ to download the libraries required to build Tomcat to the
+ ${user.home}/tomcat-build-libs directory.
+
+* NOTE: Users accessing the Internet through a proxy must use the properties
+ file to indicate to Ant the proxy configuration.
+
+ The following properties should be added to the ${tomcat.source}/build.properties
+ file.
+
+ proxy.use=true
+ proxy.host=proxy.domain
+ proxy.port=8080
+ proxy.user=username
+ proxy.password=password
+
+ See Apache Ant documentation for the <setproxy> task for details.
+
+ 3. Go to the sources directory and run Ant:
+
+ cd ${tomcat.source}
+ ant
+
+ This will execute the "deploy" target in build.xml.
+
+ Once the build has completed successfully, a usable Tomcat installation
+ will have been produced in the ${tomcat.source}/output/build directory,
+ and can be started and stopped with the usual scripts.
+
+ Note that the build includes Tomcat documentation, which can be found
+ in the output/build/webapps/docs directory.
+
+ The path of the output directory can be controlled by specifying the
+ "tomcat.output" property in the build.properties file.
+
+* NOTE: Do not run the build as the root user. Building and running Tomcat
+ does not require root privileges.
+
+
+(4) Updating sources and rebuilding
+
+It is recommended that you regularly update the downloaded Tomcat 8.5
+sources using your git client.
+
+For a quick rebuild of only modified code you can use:
+
+ cd ${tomcat.source}
+ ant
+
+
+(5) Special builds
+
+There are several targets in Tomcat build files that are useful to be
+called separately. They build components that you may want to build
+quickly, or ones that are included in the full release and are not built
+during the default "deploy" build.
+
+(5.1) Building documentation
+
+The documentation web application is built during the default "deploy"
+build.
+
+It can be built quickly by using the following commands:
+
+ cd ${tomcat.source}
+ ant build-docs
+
+The output of this command will be found in the following directory:
+
+ output/build/webapps/docs
+
+
+The API documentation (Javadoc) is built during a "release" build. It is
+easy to build it separately by using the following commands:
+
+ cd ${tomcat.source}
+ ant javadoc
+
+The output of this command will be found in the following directories:
+
+ output/dist/webapps/docs/api
+ output/dist/webapps/docs/elapi
+ output/dist/webapps/docs/jspapi
+ output/dist/webapps/docs/servletapi
+
+
+(5.2) Building the extras (commons-logging, webservices etc.)
+
+These components are documented on the "Additional Components"
+(extras.html) page of documentation. They are built during a "release"
+build.
+
+You can build them by using the following commands:
+
+ cd ${tomcat.source}
+ ant extras
+
+(5.3) Building the embedded packages
+
+These are built during a "release" build.
+
+You can build them by using the following commands:
+
+ cd ${tomcat.source}
+ ant embed
+
+
+(6) Building a full release (as provided via the ASF download pages)
+
+ A full release includes the Windows installer which requires a Windows
+ environment to be available to create it. If not building in a Windows
+ environment, the build scripts assume that Wine is available. If this is not
+ the case, the skip.installer property may be set to skip the creation of the
+ Windows installer.
+
+ Provided that Wine is available on non-Windows platforms, a full release
+ build may be made on Windows, Linux or MacOS.
+
+ 1. Configure GPG, if needed
+
+ If the released artifacts have to be cryptographically signed with a
+ PGP signature, like the official ASF releases are, the following
+ property can be added to the build.properties file:
+
+ # Location of GPG executable (used only for releases)
+ gpg.exec=/path/to/gpg
+
+ You do not need it if you do not plan to sign the release.
+
+ If "gpg.exec" property does not point to an existing file, it will be
+ ignored and this feature will be disabled.
+
+ You will be prompted for the GPG passphrase when the release build
+ starts, unless "gpg.passphrase" property is set.
+
+ 2. If building the Windows installer
+
+ If running the build in a UAC enabled environment, building the Windows
+ installer requires elevated privileges. The simplest way to do this is to
+ open the command prompt used for the build with the "Run as administrator"
+ option.
+
+ 3. Configure the code signing service
+
+ ASF committers performing official releases will need to configure the code
+ signing service so that the Windows installer is signed during the build
+ process. The following properties need to be added to the build.properties
+ file:
+
+ # Location of GPG executable (used only for releases)
+ gpg.exec=/path/to/gpg
+ # Code signing of Windows installer
+ do.codesigning=true
+ codesigning.storepass=request-via-pmc
+
+ Release managers will be provided with the necessary credentials by the PMC.
+ It will also be necessary to enable TLS 1.2 and the correct cipher suite to
+ for the build process to communicate with the code signing service. The
+ simplest way is by setting the ANT_OPTS environment variable.
+ E.g. (for Windows):
+
+ set ANT_OPTS=-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2 -Dhttps.cipherSuites=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
+
+ You will also need to download and install the Java 7 unlimited strength
+ jurisdiction policy files in order to use the above cipher suite.
+
+ 4. Build the release:
+
+ cd ${tomcat.source}
+ ant release
+
+
+(7) Tests
+
+(7.1) Running Tomcat tests
+
+Tomcat includes a number of junit tests. The tests are not run when a
+release is built. There is separate command to run them.
+
+To run the testsuite use the following command:
+
+ cd ${tomcat.source}
+ ant test
+
+It is advisable to redirect output of the above command to a file for later
+inspection.
+
+The JUnit reports generated by the tests will be written to the following
+directory:
+
+ output/build/logs
+
+By default the testsuite is run three times to test 3 different
+implementations of Tomcat connectors: NIO, NIO2 and APR. (If you are not
+familiar with Tomcat connectors, see config/http.html in documentation for
+details).
+
+The 3 runs are enabled and disabled individually by the following
+properties, which all are "true" by default:
+
+ execute.test.nio=true
+ execute.test.nio2=true
+ execute.test.apr=true
+
+The APR connector can be tested only if Tomcat-Native library binaries are
+found by the testsuite. The "test.apr.loc" property specifies the directory
+where the library binaries are located.
+
+By default the "test.apr.loc" property specifies the following location:
+
+ output/build/bin/native/
+
+If you are on Windows and want to test the APR connector you can put the
+tcnative-1.dll file into ${tomcat.source}/bin/native/ and it will be copied
+into the above directory when the build runs.
+
+The unit tests include tests of the clustering functionality which require
+multicast to be enabled. There is a simple application provided in the Tomcat
+test source (org.apache.catalina.tribes.TesterMulticast) that can be used to
+check if a machine supports multicast. Notes on enabling multicast for different
+operating systems are provided in the Javadoc for that class.
+
+
+(7.2) Running a single test
+
+It is possible to run a single JUnit test class by adding the "test.entry"
+property to the build.properties file. The property specifies the name of
+the test class.
+
+For example:
+
+ test.entry=org.apache.catalina.util.TestServerInfo
+
+It is possible to further limit such run to a number of selected test
+methods by adding "test.entry.methods" property. The property specifies a
+comma-separated list of test case methods.
+
+For example:
+
+ test.entry=org.apache.el.lang.TestELArithmetic
+ test.entry.methods=testMultiply01,testMultiply02
+
+
+(7.3) Running a set of tests
+
+It is possible to run a set of JUnit test classes by adding the "test.name"
+property to the build.properties file. The property specifies an Ant
+includes pattern for the fileset of test class files to run.
+
+The default value is "**/Test*.java", so all test classes are being
+executed (with few exceptions - see build.xml for several exclude patterns).
+
+You can include multiple patterns by concatenating them with a comma (",")
+as the separator.
+
+For example:
+
+ test.name=**/TestSsl.java,**/TestWebSocketFrameClientSSL.java
+
+You can exclude specific JUnit test classes by adding the "test.exclude"
+property to the build.properties file. The property specifies an Ant
+excludes pattern for the fileset of test class files to exclude form the run.
+The default value is empty, so no classes are excluded. The syntax is the same
+as for the property "test.name".
+
+
+(7.4) Other configuration options
+
+ 1. It is possible to configure the directory where JUnit reports are
+ written to. It is configured by "test.reports" property. The default
+ value is
+
+ output/build/logs
+
+ 2. It is possible to enable generation of access log file when the tests
+ are run. This is off by default and can be enabled by the following
+ property:
+
+ test.accesslog=true
+
+ The "access_log.<date>" file will be written to the same directory as
+ JUnit reports,
+
+ output/build/logs
+
+ 3. The testsuite respects logging configuration as configured by
+ ${tomcat.source}/conf/logging.properties
+
+ The log files will be written to the temporary directory used by the
+ tests,
+
+ output/test-tmp/logs
+
+ 4. It is possible to configure formatter used by JUnit reports.
+ Configuration properties are "junit.formatter.type",
+ "junit.formatter.extension" and "junit.formatter.usefile".
+
+ For example the following property disables generation of separate report
+ files:
+
+ junit.formatter.usefile=false
+
+ 5. It is possible to speed up testing by letting JUnit to run several
+ tests in parallel.
+
+ This is configured by setting "test.threads" property. The recommended
+ value is one thread per core.
+
+ 6. Optional support is provided for the Cobertura code coverage tool.
+
+NOTE: Cobertura is licensed under GPL v2 with parts of it being under
+ Apache License v1.1. See https://cobertura.github.io/cobertura/ for details.
+ Using it during Tomcat build is optional and is off by default.
+
+ Cobertura can be enabled using the following properties:
+
+ test.cobertura=true
+ test.threads=1
+
+ Using Cobertura currently requires setting test.threads configuration
+ property to the value of 1. Setting that property to a different value
+ will disable code coverage.
+
+ The report files by default are written to
+
+ output/coverage
+
+ 7. The performance tests are written to run reasonably powerful machines (such
+ as a developer may use day to day) assuming no other resource hungry
+ processes are running.
+
+ These assumptions are not always true (e.g. on CI systems running in a
+ virtual machine) so the performance tests may be disabled by using the
+ following property:
+
+ test.excludePerformance=true
+
+ 8. Some tests include checks that the access log valve entries are as expected.
+ These checks include timings. On slower / loaded systems these checks will
+ often fail. The checks may be relaxed by using the following property:
+
+ test.relaxTiming=true
+
+ 9. It is known that some platforms (e.g. OSX El Capitan) require IPv4 to
+ be the default for the multicast tests to work. This is configured by
+ the following property:
+
+ java.net.preferIPv4Stack=true
+
+ 10. By default the output of unit tests is sent to the console and can be
+ quite verbose. The output can be disabled by setting the property:
+
+ test.verbose=false
+
+(8) Source code checks
+
+(8.1) Checkstyle
+
+NOTE: Checkstyle is licensed under LGPL. Using Checkstyle during Tomcat
+ build is optional and is off by default.
+
+ See http://checkstyle.sourceforge.net/ for more information.
+
+Tomcat comes with a Checkstyle configuration that tests its source code
+for certain conventions, like presence of the license header.
+
+To enable Checkstyle, add the following property to build.properties file:
+
+ execute.validate=true
+
+Once Checkstyle is enabled, the check will be performed automatically
+during the build. The check is run before compilation of the source code.
+
+To speed-up repeated runs of this check, a cache is configured. The cache
+is located in the following directory:
+
+ output/res/checkstyle
+
+It is possible to run the check separately by calling the "validate"
+target. The command is:
+
+ cd ${tomcat.source}
+ ant -Dexecute.validate=true validate
+
+
+(8.2) FindBugs
+
+NOTE: FindBugs is licensed under LGPL. Using Findbugs during Tomcat build is
+ optional and is off by default.
+
+ See https://spotbugs.github.io/ for more information.
+
+To enable FindBugs, add the following property to build.properties file:
+
+ execute.findbugs=true
+
+To compile Tomcat classes and generate a FindBugs report, call the
+"findbugs" target. For example:
+
+ cd ${tomcat.source}
+ ant -Dexecute.findbugs=true findbugs
+
+The report file by default is written to
+
+ output/findbugs
+
+
+(8.3) End-of-line conventions check
+
+You usually would not need to run this check. You can skip this section.
+
+Apache Tomcat project has convention that all of its textual source files,
+stored in the Git repository, use Unix style LF line endings.
+
+This test is used by developers to check that the source code adheres to
+this convention. It verifies that the ends of lines in textual files are
+appropriate. The idea is to run this check regularly and notify developers
+when an inconsistency is detected.
+
+The command to run this test is:
+
+ cd ${tomcat.source}
+ ant validate-eoln
diff --git a/web/tomcat/webapps/docs/RELEASE-NOTES.txt b/web/tomcat/webapps/docs/RELEASE-NOTES.txt
new file mode 100644
index 0000000..0dd3a67
--- /dev/null
+++ b/web/tomcat/webapps/docs/RELEASE-NOTES.txt
@@ -0,0 +1,178 @@
+================================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+================================================================================
+
+
+ Apache Tomcat Version 8.5.73
+ Release Notes
+
+
+=========
+CONTENTS:
+=========
+
+* Dependency Changes
+* API Stability
+* Bundled APIs
+* Web application reloading and static fields in shared libraries
+* Security manager URLs
+* Symlinking static resources
+* Viewing the Tomcat Change Log
+* Cryptographic software notice
+* When all else fails
+
+
+===================
+Dependency Changes:
+===================
+Tomcat 8.5 is designed to run on Java 7 and later.
+
+
+==============
+API Stability:
+==============
+
+The public interfaces for the following classes are fixed and will not be
+changed at all during the remaining lifetime of the 8.x series:
+- All classes in the javax namespace
+
+The public interfaces for the following classes may be added to in order to
+resolve bugs and/or add new features. No existing interface method will be
+removed or changed although it may be deprecated.
+- org.apache.catalina.* (excluding sub-packages)
+
+Note: As Tomcat 8 matures, the above list will be added to. The list is not
+ considered complete at this time.
+
+Note: A large number of deprecated methods, fields and configuration options
+ were removed in the transition from 8.0.x to 8.5.x. If any of those
+ removals triggers significant problems for the user community that the
+ deletion may be reverted in a later point release.
+
+The remaining classes are considered part of the Tomcat internals and may change
+without notice between point releases.
+
+
+=============
+Bundled APIs:
+=============
+A standard installation of Tomcat 8.5 makes all of the following APIs available
+for use by web applications (by placing them in "lib"):
+* annotations-api.jar (Annotations package)
+* catalina.jar (Tomcat Catalina implementation)
+* catalina-ant.jar (Tomcat Catalina Ant tasks)
+* catalina-ha.jar (High availability package)
+* catalina-storeconfig.jar (Generation of XML configuration from current state)
+* catalina-tribes.jar (Group communication)
+* ecj-4.6.3.jar (Eclipse JDT Java compiler)
+* el-api.jar (EL 3.0 API)
+* jasper.jar (Jasper 2 Compiler and Runtime)
+* jasper-el.jar (Jasper 2 EL implementation)
+* jsp-api.jar (JSP 2.3 API)
+* servlet-api.jar (Servlet 3.1 API)
+* tomcat-api.jar (Interfaces shared by Catalina and Jasper)
+* tomcat-coyote.jar (Tomcat connectors and utility classes)
+* tomcat-dbcp.jar (package renamed database connection pool based on Commons DBCP 2)
+* tomcat-jdbc.jar (Tomcat's database connection pooling solution)
+* tomcat-jni.jar (Interface to the native component of the APR/native connector)
+* tomcat-util.jar (Various utilities)
+* tomcat-websocket.jar (WebSocket 1.1 implementation)
+* websocket-api.jar (WebSocket 1.1 API)
+
+You can make additional APIs available to all of your web applications by
+putting unpacked classes into a "classes" directory (not created by default),
+or by placing them in JAR files in the "lib" directory.
+
+To override the XML parser implementation or interfaces, use the appropriate
+feature for your JVM. For Java <= 8 use the endorsed standards override
+feature. The default configuration defines JARs located in "endorsed" as endorsed.
+For Java 9+ use the upgradeable modules feature.
+
+
+================================================================
+Web application reloading and static fields in shared libraries:
+================================================================
+Some shared libraries (many are part of the JDK) keep references to objects
+instantiated by the web application. To avoid class loading related problems
+(ClassCastExceptions, messages indicating that the classloader
+is stopped, etc.), the shared libraries state should be reinitialized.
+
+Something which might help is to avoid putting classes which would be
+referenced by a shared static field in the web application classloader,
+and putting them in the shared classloader instead (JARs should be put in the
+"lib" folder, and classes should be put in the "classes" folder).
+
+
+======================
+Security manager URLs:
+======================
+In order to grant security permissions to JARs located inside the
+web application repository, use URLs of the following format
+in your policy file:
+
+file:${catalina.base}/webapps/examples/WEB-INF/lib/driver.jar
+
+
+============================
+Symlinking static resources:
+============================
+By default, Unix symlinks will not work when used in a web application to link
+resources located outside the web application root directory.
+
+This behavior is optional, and the "allowLinking" flag may be used to disable
+the check.
+
+
+==============================
+Viewing the Tomcat Change Log:
+==============================
+The full change log is available from https://tomcat.apache.org and is also
+included in the documentation web application.
+
+
+=============================
+Cryptographic software notice
+=============================
+This distribution includes cryptographic software. The country in
+which you currently reside may have restrictions on the import,
+possession, use, and/or re-export to another country, of
+encryption software. BEFORE using any encryption software, please
+check your country's laws, regulations and policies concerning the
+import, possession, or use, and re-export of encryption software, to
+see if this is permitted. See <http://www.wassenaar.org/> for more
+information.
+
+The U.S. Government Department of Commerce, Bureau of Industry and
+Security (BIS), has classified this software as Export Commodity
+Control Number (ECCN) 5D002.C.1, which includes information security
+software using or performing cryptographic functions with asymmetric
+algorithms. The form and manner of this Apache Software Foundation
+distribution makes it eligible for export under the License Exception
+ENC Technology Software Unrestricted (TSU) exception (see the BIS
+Export Administration Regulations, Section 740.13) for both object
+code and source code.
+
+The following provides more details on the included cryptographic
+software:
+ - Tomcat includes code designed to work with JSSE
+ - Tomcat includes code designed to work with OpenSSL
+
+
+====================
+When all else fails:
+====================
+See the FAQ
+https://tomcat.apache.org/faq/
diff --git a/web/tomcat/webapps/docs/RUNNING.txt b/web/tomcat/webapps/docs/RUNNING.txt
new file mode 100644
index 0000000..59ce0a8
--- /dev/null
+++ b/web/tomcat/webapps/docs/RUNNING.txt
@@ -0,0 +1,477 @@
+================================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+================================================================================
+
+ ===================================================
+ Running The Apache Tomcat 8.5 Servlet/JSP Container
+ ===================================================
+
+Apache Tomcat 8.5 requires a Java Standard Edition Runtime
+Environment (JRE) version 7 or later.
+
+=============================
+Running With JRE 7 Or Later
+=============================
+
+(1) Download and Install a Java SE Runtime Environment (JRE)
+
+(1.1) Download a Java SE Runtime Environment (JRE),
+ release version 7 or later, from
+ http://www.oracle.com/technetwork/java/javase/downloads/index.html
+
+(1.2) Install the JRE according to the instructions included with the
+ release.
+
+ You may also use a full Java Development Kit (JDK) rather than just
+ a JRE.
+
+
+(2) Download and Install Apache Tomcat
+
+(2.1) Download a binary distribution of Tomcat from:
+
+ https://tomcat.apache.org/
+
+(2.2) Unpack the binary distribution so that it resides in its own
+ directory (conventionally named "apache-tomcat-[version]").
+
+ For the purposes of the remainder of this document, the name
+ "CATALINA_HOME" is used to refer to the full pathname of that
+ directory.
+
+NOTE: As an alternative to downloading a binary distribution, you can
+create your own from the Tomcat source code, as described in
+"BUILDING.txt". You can either
+
+ a) Do the full "release" build and find the created distribution in the
+ "output/release" directory and then proceed with unpacking as above, or
+
+ b) Do a simple build and use the "output/build" directory as
+ "CATALINA_HOME". Be warned that there are some differences between the
+ contents of the "output/build" directory and a full "release"
+ distribution.
+
+
+(3) Configure Environment Variables
+
+Tomcat is a Java application and does not use environment variables directly.
+Environment variables are used by the Tomcat startup scripts. The scripts use
+the environment variables to prepare the command that starts Tomcat.
+
+(3.1) Set CATALINA_HOME (required) and CATALINA_BASE (optional)
+
+The CATALINA_HOME environment variable should be set to the location of the
+root directory of the "binary" distribution of Tomcat.
+
+The Tomcat startup scripts have some logic to set this variable
+automatically if it is absent, based on the location of the startup script
+in *nix and on the current directory in Windows. That logic might not work
+in all circumstances, so setting the variable explicitly is recommended.
+
+The CATALINA_BASE environment variable specifies location of the root
+directory of the "active configuration" of Tomcat. It is optional. It
+defaults to be equal to CATALINA_HOME.
+
+Using distinct values for the CATALINA_HOME and CATALINA_BASE variables is
+recommended to simplify further upgrades and maintenance. It is documented
+in the "Multiple Tomcat Instances" section below.
+
+
+(3.2) Set JRE_HOME or JAVA_HOME (required)
+
+These variables are used to specify location of a Java Runtime
+Environment or of a Java Development Kit that is used to start Tomcat.
+
+The JRE_HOME variable is used to specify location of a JRE. The JAVA_HOME
+variable is used to specify location of a JDK.
+
+Using JAVA_HOME provides access to certain additional startup options that
+are not allowed when JRE_HOME is used.
+
+If both JRE_HOME and JAVA_HOME are specified, JRE_HOME is used.
+
+The recommended place to specify these variables is a "setenv" script. See
+below.
+
+
+(3.3) Other variables (optional)
+
+Other environment variables exist, besides the four described above.
+See the comments at the top of catalina.bat or catalina.sh scripts for
+the list and a description of each of them.
+
+One frequently used variable is CATALINA_OPTS. It allows specification of
+additional options for the java command that starts Tomcat.
+
+See the Java documentation for the options that affect the Java Runtime
+Environment.
+
+See the "System Properties" page in the Tomcat Configuration Reference for
+the system properties that are specific to Tomcat.
+
+A similar variable is JAVA_OPTS. It is used less frequently. It allows
+specification of options that are used both to start and to stop Tomcat as well
+as for other commands.
+
+Note: Do not use JAVA_OPTS to specify memory limits. You do not need much
+memory for a small process that is used to stop Tomcat. Those settings
+belong to CATALINA_OPTS.
+
+Another frequently used variable is CATALINA_PID (on *nix only). It
+specifies the location of the file where process id of the forked Tomcat
+java process will be written. This setting is optional. It will enable the
+following features:
+
+ * better protection against duplicate start attempts and
+ * allows forceful termination of Tomcat process when it does not react to
+ the standard shutdown command.
+
+
+(3.4) Using the "setenv" script (optional, recommended)
+
+Apart from CATALINA_HOME and CATALINA_BASE, all environment variables can
+be specified in the "setenv" script. The script is placed either into
+CATALINA_BASE/bin or into CATALINA_HOME/bin directory and is named
+setenv.bat (on Windows) or setenv.sh (on *nix). The file has to be
+readable.
+
+By default the setenv script file is absent. If the script file is present
+both in CATALINA_BASE and in CATALINA_HOME, the one in CATALINA_BASE is
+preferred.
+
+For example, to configure the JRE_HOME and CATALINA_PID variables you can
+create the following script file:
+
+On Windows, %CATALINA_BASE%\bin\setenv.bat:
+
+ set "JRE_HOME=%ProgramFiles%\Java\jre7"
+ exit /b 0
+
+On *nix, $CATALINA_BASE/bin/setenv.sh:
+
+ JRE_HOME=/usr/java/latest
+ CATALINA_PID="$CATALINA_BASE/tomcat.pid"
+
+
+The CATALINA_HOME and CATALINA_BASE variables cannot be configured in the
+setenv script, because they are used to locate that file.
+
+All the environment variables described here and the "setenv" script are
+used only if you use the standard scripts to launch Tomcat. For example, if
+you have installed Tomcat as a service on Windows, the service wrapper
+launches Java directly and does not use the script files.
+
+
+(4) Start Up Tomcat
+
+(4.1) Tomcat can be started by executing one of the following commands:
+
+ On Windows:
+
+ %CATALINA_HOME%\bin\startup.bat
+
+ or
+
+ %CATALINA_HOME%\bin\catalina.bat start
+
+ On *nix:
+
+ $CATALINA_HOME/bin/startup.sh
+
+ or
+
+ $CATALINA_HOME/bin/catalina.sh start
+
+(4.2) After startup, the default web applications included with Tomcat will be
+ available by visiting:
+
+ http://localhost:8080/
+
+(4.3) Further information about configuring and running Tomcat can be found in
+ the documentation included here, as well as on the Tomcat web site:
+
+ https://tomcat.apache.org/
+
+
+(5) Shut Down Tomcat
+
+(5.1) Tomcat can be shut down by executing one of the following commands:
+
+ On Windows:
+
+ %CATALINA_HOME%\bin\shutdown.bat
+
+ or
+
+ %CATALINA_HOME%\bin\catalina.bat stop
+
+ On *nix:
+
+ $CATALINA_HOME/bin/shutdown.sh
+
+ or
+
+ $CATALINA_HOME/bin/catalina.sh stop
+
+==================================================
+Advanced Configuration - Multiple Tomcat Instances
+==================================================
+
+In many circumstances, it is desirable to have a single copy of a Tomcat
+binary distribution shared among multiple users on the same server. To make
+this possible, you can set the CATALINA_BASE environment variable to the
+directory that contains the files for your 'personal' Tomcat instance.
+
+When running with a separate CATALINA_HOME and CATALINA_BASE, the files
+and directories are split as following:
+
+In CATALINA_BASE:
+
+ * bin - Only the following files:
+
+ * setenv.sh (*nix) or setenv.bat (Windows),
+ * tomcat-juli.jar
+
+ The setenv scripts were described above. The tomcat-juli library
+ is documented in the Logging chapter in the User Guide.
+
+ * conf - Server configuration files (including server.xml)
+
+ * lib - Libraries and classes, as explained below
+
+ * logs - Log and output files
+
+ * webapps - Automatically loaded web applications
+
+ * work - Temporary working directories for web applications
+
+ * temp - Directory used by the JVM for temporary files (java.io.tmpdir)
+
+
+In CATALINA_HOME:
+
+ * bin - Startup and shutdown scripts
+
+ The following files will be used only if they are absent in
+ CATALINA_BASE/bin:
+
+ setenv.sh (*nix), setenv.bat (Windows), tomcat-juli.jar
+
+ * lib - Libraries and classes, as explained below
+
+ * endorsed - Libraries that override standard "Endorsed Standards"
+ libraries provided by JRE. See Classloading documentation
+ in the User Guide for details.
+ This is only supported for Java <= 8.
+ By default this "endorsed" directory is absent.
+
+In the default configuration the JAR libraries and classes both in
+CATALINA_BASE/lib and in CATALINA_HOME/lib will be added to the common
+classpath, but the ones in CATALINA_BASE will be added first and thus will
+be searched first.
+
+The idea is that you may leave the standard Tomcat libraries in
+CATALINA_HOME/lib and add other ones such as database drivers into
+CATALINA_BASE/lib.
+
+In general it is advised to never share libraries between web applications,
+but put them into WEB-INF/lib directories inside the applications. See
+Classloading documentation in the User Guide for details.
+
+
+It might be useful to note that the values of CATALINA_HOME and
+CATALINA_BASE can be referenced in the XML configuration files processed
+by Tomcat as ${catalina.home} and ${catalina.base} respectively.
+
+For example, the standard manager web application can be kept in
+CATALINA_HOME/webapps/manager and loaded into CATALINA_BASE by copying
+its deployment descriptor into the desired virtual host:
+
+ * Copy the CATALINA_HOME/webapps/manager/META-INF/context.xml
+ file as CATALINA_BASE/conf/Catalina/localhost/manager.xml
+
+ * Add docBase attribute as shown below.
+
+The file will look like the following:
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <Context docBase="${catalina.home}/webapps/manager"
+ antiResourceLocking="false" privileged="true" >
+ <Valve className="org.apache.catalina.valves.RemoteAddrValve"
+ allow="127\.0\.0\.1" />
+ <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
+ </Context>
+
+See Deployer chapter in User Guide and Context and Host chapters in the
+Configuration Reference for more information on contexts and web
+application deployment.
+
+
+================
+Troubleshooting
+================
+
+There are only really 2 things likely to go wrong during the stand-alone
+Tomcat install:
+
+(1) The most common hiccup is when another web server (or any process for that
+ matter) has laid claim to port 8080. This is the default HTTP port that
+ Tomcat attempts to bind to at startup. To change this, open the file:
+
+ $CATALINA_HOME/conf/server.xml
+
+ and search for '8080'. Change it to a port that isn't in use, and is
+ greater than 1024, as ports less than or equal to 1024 require superuser
+ access to bind under UNIX.
+
+ Restart Tomcat and you're in business. Be sure that you replace the "8080"
+ in the URL you're using to access Tomcat. For example, if you change the
+ port to 1977, you would request the URL http://localhost:1977/ in your
+ browser.
+
+(2) The 'localhost' machine isn't found. This could happen if you're behind a
+ proxy. If that's the case, make sure the proxy configuration for your
+ browser knows that you shouldn't be going through the proxy to access the
+ "localhost".
+
+ In Firefox, this is under Tools/Preferences -> Advanced/Network ->
+ Connection -> Settings..., and in Internet Explorer it is Tools ->
+ Internet Options -> Connections -> LAN Settings.
+
+
+====================
+Optional Components
+====================
+
+The following optional components may be included with the Apache Tomcat binary
+distribution. If they are not included, you can install them separately.
+
+ 1. Apache Tomcat Native library
+
+ 2. Apache Commons Daemon service launcher
+
+Both of them are implemented in C language and as such have to be compiled
+into binary code. The binary code will be specific for a platform and CPU
+architecture and it must match the Java Runtime Environment executables
+that will be used to launch Tomcat.
+
+The Windows-specific binary distributions of Apache Tomcat include binary
+files for these components. On other platforms you would have to look for
+binary versions elsewhere or compile them yourself.
+
+If you are new to Tomcat, do not bother with these components to start with.
+If you do use them, do not forget to read their documentation.
+
+
+Apache Tomcat Native library
+-----------------------------
+
+It is a library that allows to use the "Apr" variant of HTTP and AJP
+protocol connectors in Apache Tomcat. It is built around OpenSSL and Apache
+Portable Runtime (APR) libraries. Those are the same libraries as used by
+Apache HTTPD Server project.
+
+This feature was especially important in the old days when Java performance
+was poor. It is less important nowadays, but it is still used and respected
+by many. See Tomcat documentation for more details.
+
+For further reading:
+
+ - Apache Tomcat documentation
+
+ * Documentation for APR/Native library in the Tomcat User's Guide
+
+ https://tomcat.apache.org/tomcat-8.5-doc/apr.html
+
+ * Documentation for the HTTP and AJP protocol connectors in the Tomcat
+ Configuration Reference
+
+ https://tomcat.apache.org/tomcat-8.5-doc/config/http.html
+
+ https://tomcat.apache.org/tomcat-8.5-doc/config/ajp.html
+
+ - Apache Tomcat Native project home
+
+ https://tomcat.apache.org/native-doc/
+
+ - Other projects
+
+ * OpenSSL
+
+ https://www.openssl.org/
+
+ * Apache Portable Runtime
+
+ https://apr.apache.org/
+
+ * Apache HTTP Server
+
+ https://httpd.apache.org/
+
+To disable Apache Tomcat Native library:
+
+ - To disable Apache Tomcat Native library when it is installed, or
+ - To remove the warning that is logged during Tomcat startup when the
+ library is not installed:
+
+ Edit the "conf/server.xml" file and remove "AprLifecycleListener" from
+ it.
+
+The binary file of Apache Tomcat Native library is usually named
+
+ - "tcnative-1.dll" on Windows
+ - "libtcnative-1.so" on *nix systems
+
+
+Apache Commons Daemon
+----------------------
+
+Apache Commons Daemon project provides wrappers that can be used to
+install Apache Tomcat as a service on Windows or as a daemon on *nix
+systems.
+
+The Windows-specific implementation of Apache Commons Daemon is called
+"procrun". The *nix-specific one is called "jsvc".
+
+For further reading:
+
+ - Apache Commons Daemon project
+
+ https://commons.apache.org/daemon/
+
+ - Apache Tomcat documentation
+
+ * Installing Apache Tomcat
+
+ https://tomcat.apache.org/tomcat-8.5-doc/setup.html
+
+ * Windows Service How-To
+
+ https://tomcat.apache.org/tomcat-8.5-doc/windows-service-howto.html
+
+The binary files of Apache Commons Daemon in Apache Tomcat distributions
+for Windows are named:
+
+ - "tomcat8.exe"
+ - "tomcat8w.exe"
+
+These files are renamed copies of "prunsrv.exe" and "prunmgr.exe" from
+Apache Commons Daemon distribution. The file names have a meaning: they are
+used as the service name to register the service in Windows, as well as the
+key name to store distinct configuration for this installation of
+"procrun". If you would like to install several instances of Tomcat 8.5
+in parallel, you have to further rename those files, using the same naming
+scheme.
diff --git a/web/tomcat/webapps/docs/WEB-INF/web.xml b/web/tomcat/webapps/docs/WEB-INF/web.xml
new file mode 100644
index 0000000..8920ccd
--- /dev/null
+++ b/web/tomcat/webapps/docs/WEB-INF/web.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
+ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+ version="3.1"
+ metadata-complete="true">
+
+ <display-name>Tomcat Documentation</display-name>
+ <description>
+ Tomcat Documentation.
+ </description>
+</web-app>
diff --git a/web/tomcat/webapps/docs/aio.html b/web/tomcat/webapps/docs/aio.html
new file mode 100644
index 0000000..e533cc0
--- /dev/null
+++ b/web/tomcat/webapps/docs/aio.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Advanced IO and Tomcat</title><meta name="author" content="Remy Maucherat"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Advanced IO and Tomcat</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Asynchronous_writes">Asynchronous writes</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>
+ <b>IMPORTANT NOTE: Usage of these features requires using the
+ HTTP connectors. The AJP connectors do not support them.</b>
+ </p>
+
+ </div><h3 id="Asynchronous_writes">Asynchronous writes</h3><div class="text">
+
+ <p>
+ When using HTTP connectors (based on APR or NIO/NIO2),
+ Tomcat supports using sendfile to send large static files.
+ These writes, as soon as the system load increases, will be performed
+ asynchronously in the most efficient way. Instead of sending a large response using
+ blocking writes, it is possible to write content to a static file, and write it
+ using a sendfile code. A caching valve could take advantage of this to cache the
+ response data in a file rather than store it in memory. Sendfile support is
+ available if the request attribute <code>org.apache.tomcat.sendfile.support</code>
+ is set to <code>Boolean.TRUE</code>.
+ </p>
+
+ <p>
+ Any servlet can instruct Tomcat to perform a sendfile call by setting the appropriate
+ request attributes. It is also necessary to correctly set the content length
+ for the response. When using sendfile, it is best to ensure that neither the
+ request or response have been wrapped, since as the response body will be sent later
+ by the connector itself, it cannot be filtered. Other than setting the 3 needed
+ request attributes, the servlet should not send any response data, but it may use
+ any method which will result in modifying the response header (like setting cookies).
+ </p>
+
+ <ul>
+ <li><code>org.apache.tomcat.sendfile.filename</code>: Canonical filename of the file which will be sent as
+ a String</li>
+ <li><code>org.apache.tomcat.sendfile.start</code>: Start offset as a Long</li>
+ <li><code>org.apache.tomcat.sendfile.end</code>: End offset as a Long</li>
+ </ul>
+ <p>
+ In addition to setting these parameters it is necessary to set the content-length header.
+ Tomcat will not do that for you, since you may have already written data to the output stream.
+ </p>
+
+ <p>
+ Note that the use of sendfile will disable any compression that Tomcat may
+ otherwise have performed on the response.
+ </p>
+
+ </div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/annotationapi/index.html b/web/tomcat/webapps/docs/annotationapi/index.html
new file mode 100644
index 0000000..e504cfc
--- /dev/null
+++ b/web/tomcat/webapps/docs/annotationapi/index.html
@@ -0,0 +1,34 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="UTF-8" />
+ <title>API docs</title>
+</head>
+
+<body>
+
+The Annotation API Javadoc is not installed by default. Download and install
+the "fulldocs" package to get it.
+
+You can also access the javadoc online in the Tomcat
+<a href="https://tomcat.apache.org/tomcat-8.5-doc/">
+ documentation bundle</a>.
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/docs/api/index.html b/web/tomcat/webapps/docs/api/index.html
new file mode 100644
index 0000000..261884d
--- /dev/null
+++ b/web/tomcat/webapps/docs/api/index.html
@@ -0,0 +1,34 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8" />
+ <title>API docs</title>
+</head>
+
+<body>
+
+Tomcat's internal javadoc is not installed by default. Download and install
+the "fulldocs" package to get it.
+
+You can also access the javadoc online in the Tomcat
+<a href="https://tomcat.apache.org/tomcat-8.5-doc/">
+documentation bundle</a>.
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/docs/appdev/build.xml.txt b/web/tomcat/webapps/docs/appdev/build.xml.txt
new file mode 100644
index 0000000..a75afe1
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/build.xml.txt
@@ -0,0 +1,508 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!--
+ General purpose build script for web applications and web services,
+ including enhanced support for deploying directly to a Tomcat
+ based server.
+
+ This build script assumes that the source code of your web application
+ is organized into the following subdirectories underneath the source
+ code directory from which you execute the build script:
+
+ docs Static documentation files to be copied to
+ the "docs" subdirectory of your distribution.
+
+ src Java source code (and associated resource files)
+ to be compiled to the "WEB-INF/classes"
+ subdirectory of your web application.
+
+ web Static HTML, JSP, and other content (such as
+ image files), including the WEB-INF subdirectory
+ and its configuration file contents.
+-->
+
+
+<!-- A "project" describes a set of targets that may be requested
+ when Ant is executed. The "default" attribute defines the
+ target which is executed if no specific target is requested,
+ and the "basedir" attribute defines the current working directory
+ from which Ant executes the requested task. This is normally
+ set to the current working directory.
+-->
+
+<project name="My Project" default="compile" basedir=".">
+
+
+
+<!-- ===================== Property Definitions =========================== -->
+
+
+<!--
+
+ Each of the following properties are used in the build script.
+ Values for these properties are set by the first place they are
+ defined, from the following list:
+
+ * Definitions on the "ant" command line (ant -Dfoo=bar compile).
+
+ * Definitions from a "build.properties" file in the top level
+ source directory of this application.
+
+ * Definitions from a "build.properties" file in the developer's
+ home directory.
+
+ * Default definitions in this build.xml file.
+
+ You will note below that property values can be composed based on the
+ contents of previously defined properties. This is a powerful technique
+ that helps you minimize the number of changes required when your development
+ environment is modified. Note that property composition is allowed within
+ "build.properties" files as well as in the "build.xml" script.
+
+-->
+
+ <property file="build.properties"/>
+ <property file="${user.home}/build.properties"/>
+
+
+<!-- ==================== File and Directory Names ======================== -->
+
+
+<!--
+
+ These properties generally define file and directory names (or paths) that
+ affect where the build process stores its outputs.
+
+ app.name Base name of this application, used to
+ construct filenames and directories.
+ Defaults to "myapp".
+
+ app.path Context path to which this application should be
+ deployed (defaults to "/" plus the value of the
+ "app.name" property).
+
+ app.version Version number of this iteration of the application.
+
+ build.home The directory into which the "prepare" and
+ "compile" targets will generate their output.
+ Defaults to "build".
+
+ catalina.home The directory in which you have installed
+ a binary distribution of Tomcat. This will
+ be used by the "deploy" target.
+
+ dist.home The name of the base directory in which
+ distribution files are created.
+ Defaults to "dist".
+
+ manager.password The login password of a user that is assigned the
+ "manager-script" role (so that they can execute
+ commands via the "/manager" web application)
+
+ manager.url The URL of the "/manager" web application on the
+ Tomcat installation to which we will deploy web
+ applications and web services.
+
+ manager.username The login username of a user that is assigned the
+ "manager-script" role (so that they can execute
+ commands via the "/manager" web application)
+
+-->
+
+ <property name="app.name" value="myapp"/>
+ <property name="app.path" value="/${app.name}"/>
+ <property name="app.version" value="0.1-dev"/>
+ <property name="build.home" value="${basedir}/build"/>
+ <property name="catalina.home" value="../../../.."/> <!-- UPDATE THIS! -->
+ <property name="dist.home" value="${basedir}/dist"/>
+ <property name="docs.home" value="${basedir}/docs"/>
+ <property name="manager.url" value="http://localhost:8080/manager/text"/>
+ <property name="src.home" value="${basedir}/src"/>
+ <property name="web.home" value="${basedir}/web"/>
+
+
+<!-- ==================== External Dependencies =========================== -->
+
+
+<!--
+
+ Use property values to define the locations of external JAR files on which
+ your application will depend. In general, these values will be used for
+ two purposes:
+ * Inclusion on the classpath that is passed to the Javac compiler
+ * Being copied into the "/WEB-INF/lib" directory during execution
+ of the "deploy" target.
+
+ Because we will automatically include all of the Java classes that Tomcat
+ exposes to web applications, we will not need to explicitly list any of those
+ dependencies. You only need to worry about external dependencies for JAR
+ files that you are going to include inside your "/WEB-INF/lib" directory.
+
+-->
+
+<!-- Dummy external dependency -->
+<!--
+ <property name="foo.jar"
+ value="/path/to/foo.jar"/>
+-->
+
+
+<!-- ==================== Compilation Classpath =========================== -->
+
+<!--
+
+ Rather than relying on the CLASSPATH environment variable, Ant includes
+ features that makes it easy to dynamically construct the classpath you
+ need for each compilation. The example below constructs the compile
+ classpath to include the servlet.jar file, as well as the other components
+ that Tomcat makes available to web applications automatically, plus anything
+ that you explicitly added.
+
+-->
+
+ <path id="compile.classpath">
+
+ <!-- Include all JAR files that will be included in /WEB-INF/lib -->
+ <!-- *** CUSTOMIZE HERE AS REQUIRED BY YOUR APPLICATION *** -->
+<!--
+ <pathelement location="${foo.jar}"/>
+-->
+
+ <!-- Include all elements that Tomcat exposes to applications -->
+ <fileset dir="${catalina.home}/bin">
+ <include name="*.jar"/>
+ </fileset>
+ <pathelement location="${catalina.home}/lib"/>
+ <fileset dir="${catalina.home}/lib">
+ <include name="*.jar"/>
+ </fileset>
+
+ </path>
+
+
+
+<!-- ================== Custom Ant Task Definitions ======================= -->
+
+
+<!--
+
+ These properties define custom tasks for the Ant build tool that interact
+ with the "/manager" web application installed with Tomcat. Before they
+ can be successfully utilized, you must perform the following steps:
+
+ - Copy the file "lib/catalina-ant.jar" from your Tomcat
+ installation into the "lib" directory of your Ant installation.
+
+ - Create a "build.properties" file in your application's top-level
+ source directory (or your user login home directory) that defines
+ appropriate values for the "manager.password", "manager.url", and
+ "manager.username" properties described above.
+
+ For more information about the Manager web application, and the functionality
+ of these tasks, see <http://localhost:8080/tomcat-docs/manager-howto.html>.
+
+-->
+
+ <taskdef resource="org/apache/catalina/ant/catalina.tasks"
+ classpathref="compile.classpath"/>
+
+
+<!-- ==================== Compilation Control Options ==================== -->
+
+<!--
+
+ These properties control option settings on the Javac compiler when it
+ is invoked using the <javac> task.
+
+ compile.debug Should compilation include the debug option?
+
+ compile.deprecation Should compilation include the deprecation option?
+
+-->
+
+ <property name="compile.debug" value="true"/>
+ <property name="compile.deprecation" value="false"/>
+
+
+
+<!-- ==================== All Target ====================================== -->
+
+<!--
+
+ The "all" target is a shortcut for running the "clean" target followed
+ by the "compile" target, to force a complete recompile.
+
+-->
+
+ <target name="all" depends="clean,compile"
+ description="Clean build and dist directories, then compile"/>
+
+
+
+<!-- ==================== Clean Target ==================================== -->
+
+<!--
+
+ The "clean" target deletes any previous "build" and "dist" directory,
+ so that you can be ensured the application can be built from scratch.
+
+-->
+
+ <target name="clean"
+ description="Delete old build and dist directories">
+ <delete dir="${build.home}"/>
+ <delete dir="${dist.home}"/>
+ </target>
+
+
+
+<!-- ==================== Compile Target ================================== -->
+
+<!--
+
+ The "compile" target transforms source files (from your "src" directory)
+ into object files in the appropriate location in the build directory.
+ This example assumes that you will be including your classes in an
+ unpacked directory hierarchy under "/WEB-INF/classes".
+
+-->
+
+ <target name="compile" depends="prepare"
+ description="Compile Java sources">
+
+ <!-- Compile Java classes as necessary -->
+ <mkdir dir="${build.home}/WEB-INF/classes"/>
+ <javac srcdir="${src.home}"
+ destdir="${build.home}/WEB-INF/classes"
+ debug="${compile.debug}"
+ deprecation="${compile.deprecation}">
+ <classpath refid="compile.classpath"/>
+ </javac>
+
+ <!-- Copy application resources -->
+ <copy todir="${build.home}/WEB-INF/classes">
+ <fileset dir="${src.home}" excludes="**/*.java"/>
+ </copy>
+
+ </target>
+
+
+
+<!-- ==================== Dist Target ===================================== -->
+
+
+<!--
+
+ The "dist" target creates a binary distribution of your application
+ in a directory structure ready to be archived in a tar.gz or zip file.
+ Note that this target depends on two others:
+
+ * "compile" so that the entire web application (including external
+ dependencies) will have been assembled
+
+ * "javadoc" so that the application Javadocs will have been created
+
+-->
+
+ <target name="dist" depends="compile,javadoc"
+ description="Create binary distribution">
+
+ <!-- Copy documentation subdirectories -->
+ <mkdir dir="${dist.home}/docs"/>
+ <copy todir="${dist.home}/docs">
+ <fileset dir="${docs.home}"/>
+ </copy>
+
+ <!-- Create application JAR file -->
+ <jar jarfile="${dist.home}/${app.name}-${app.version}.war"
+ basedir="${build.home}"/>
+
+ <!-- Copy additional files to ${dist.home} as necessary -->
+
+ </target>
+
+
+
+<!-- ==================== Install Target ================================== -->
+
+<!--
+
+ The "install" target tells the specified Tomcat installation to dynamically
+ install this web application and make it available for execution. It does
+ *not* cause the existence of this web application to be remembered across
+ Tomcat restarts; if you restart the server, you will need to re-install all
+ this web application.
+
+ If you have already installed this application, and simply want Tomcat to
+ recognize that you have updated Java classes (or the web.xml file), use the
+ "reload" target instead.
+
+ NOTE: This target will only succeed if it is run from the same server that
+ Tomcat is running on.
+
+ NOTE: This is the logical opposite of the "remove" target.
+
+-->
+
+ <target name="install" depends="compile"
+ description="Install application to servlet container">
+
+ <deploy url="${manager.url}"
+ username="${manager.username}"
+ password="${manager.password}"
+ path="${app.path}"
+ localWar="file://${build.home}"/>
+
+ </target>
+
+
+<!-- ==================== Javadoc Target ================================== -->
+
+<!--
+
+ The "javadoc" target creates Javadoc API documentation for the Java
+ classes included in your application. Normally, this is only required
+ when preparing a distribution release, but is available as a separate
+ target in case the developer wants to create Javadocs independently.
+
+-->
+
+ <target name="javadoc" depends="compile"
+ description="Create Javadoc API documentation">
+
+ <mkdir dir="${dist.home}/docs/api"/>
+ <javadoc sourcepath="${src.home}"
+ destdir="${dist.home}/docs/api"
+ packagenames="*">
+ <classpath refid="compile.classpath"/>
+ </javadoc>
+
+ </target>
+
+
+
+<!-- ====================== List Target =================================== -->
+
+<!--
+
+ The "list" target asks the specified Tomcat installation to list the
+ currently running web applications, either loaded at startup time or
+ installed dynamically. It is useful to determine whether or not the
+ application you are currently developing has been installed.
+
+-->
+
+ <target name="list"
+ description="List installed applications on servlet container">
+
+ <list url="${manager.url}"
+ username="${manager.username}"
+ password="${manager.password}"/>
+
+ </target>
+
+
+<!-- ==================== Prepare Target ================================== -->
+
+<!--
+
+ The "prepare" target is used to create the "build" destination directory,
+ and copy the static contents of your web application to it. If you need
+ to copy static files from external dependencies, you can customize the
+ contents of this task.
+
+ Normally, this task is executed indirectly when needed.
+
+-->
+
+ <target name="prepare">
+
+ <!-- Create build directories as needed -->
+ <mkdir dir="${build.home}"/>
+ <mkdir dir="${build.home}/WEB-INF"/>
+ <mkdir dir="${build.home}/WEB-INF/classes"/>
+
+
+ <!-- Copy static content of this web application -->
+ <copy todir="${build.home}">
+ <fileset dir="${web.home}"/>
+ </copy>
+
+ <!-- Copy external dependencies as required -->
+ <!-- *** CUSTOMIZE HERE AS REQUIRED BY YOUR APPLICATION *** -->
+ <mkdir dir="${build.home}/WEB-INF/lib"/>
+<!--
+ <copy todir="${build.home}/WEB-INF/lib" file="${foo.jar}"/>
+-->
+
+ <!-- Copy static files from external dependencies as needed -->
+ <!-- *** CUSTOMIZE HERE AS REQUIRED BY YOUR APPLICATION *** -->
+
+ </target>
+
+
+<!-- ==================== Reload Target =================================== -->
+
+<!--
+
+ The "reload" signals the specified application Tomcat to shut itself down
+ and reload. This can be useful when the web application context is not
+ reloadable and you have updated classes or property files in the
+ /WEB-INF/classes directory or when you have added or updated jar files in the
+ /WEB-INF/lib directory.
+
+ NOTE: The /WEB-INF/web.xml web application configuration file is not reread
+ on a reload. If you have made changes to your web.xml file you must stop
+ then start the web application.
+
+-->
+
+ <target name="reload" depends="compile"
+ description="Reload application on servlet container">
+
+ <reload url="${manager.url}"
+ username="${manager.username}"
+ password="${manager.password}"
+ path="${app.path}"/>
+
+ </target>
+
+
+<!-- ==================== Remove Target =================================== -->
+
+<!--
+
+ The "remove" target tells the specified Tomcat installation to dynamically
+ remove this web application from service.
+
+ NOTE: This is the logical opposite of the "install" target.
+
+-->
+
+ <target name="remove"
+ description="Remove application on servlet container">
+
+ <undeploy url="${manager.url}"
+ username="${manager.username}"
+ password="${manager.password}"
+ path="${app.path}"/>
+
+ </target>
+
+
+</project>
diff --git a/web/tomcat/webapps/docs/appdev/deployment.html b/web/tomcat/webapps/docs/appdev/deployment.html
new file mode 100644
index 0000000..5781373
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/deployment.html
@@ -0,0 +1,202 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Application Developer's Guide (8.5.73) - Deployment</title><meta name="author" content="Craig R. McClanahan"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Application Developer's Guide</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">App Dev Guide Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="introduction.html">Introduction</a></li><li><a href="installation.html">Installation</a></li><li><a href="deployment.html">Deployment</a></li><li><a href="source.html">Source Code</a></li><li><a href="processes.html">Processes</a></li><li><a href="sample/">Example App</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Deployment</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Background">Background</a></li><li><a href="#Standard_Directory_Layout">Standard Directory Layout</a></li><li><a href="#Shared_Library_Files">Shared Library Files</a></li><li><a href="#Web_Application_Deployment_Descriptor">Web Application Deployment Descriptor</a></li><li><a href="#Tomcat_Context_Descriptor">Tomcat Context Descriptor</a></li><li><a href="#Deployment_With_Tomcat">Deployment With Tomcat</a></li></ul>
+</div><h3 id="Background">Background</h3><div class="text">
+
+<p>Before describing how to organize your source code directories,
+it is useful to examine the runtime organization of a web application.
+Prior to the Servlet API Specification, version 2.2, there was little
+consistency between server platforms. However, servers that conform
+to the 2.2 (or later) specification are required to accept a
+<em>Web Application Archive</em> in a standard format, which is discussed
+further below.</p>
+
+<p>A web application is defined as a hierarchy of directories and files
+in a standard layout. Such a hierarchy can be accessed in its "unpacked"
+form, where each directory and file exists in the filesystem separately,
+or in a "packed" form known as a Web ARchive, or WAR file. The former format
+is more useful during development, while the latter is used when you
+distribute your application to be installed.</p>
+
+<p>The top-level directory of your web application hierarchy is also the
+<em>document root</em> of your application. Here, you will place the HTML
+files and JSP pages that comprise your application's user interface. When the
+system administrator deploys your application into a particular server, they
+assign a <em>context path</em> to your application (a later section
+of this manual describes deployment on Tomcat). Thus, if the
+system administrator assigns your application to the context path
+<code>/catalog</code>, then a request URI referring to
+<code>/catalog/index.html</code> will retrieve the <code>index.html</code>
+file from your document root.</p>
+
+</div><h3 id="Standard_Directory_Layout">Standard Directory Layout</h3><div class="text">
+
+<p>To facilitate creation of a Web Application Archive file in the required
+format, it is convenient to arrange the "executable" files of your web
+application (that is, the files that Tomcat actually uses when executing
+your app) in the same organization as required by the WAR format itself.
+To do this, you will end up with the following contents in your
+application's "document root" directory:</p>
+<ul>
+<li><strong>*.html, *.jsp, etc.</strong> - The HTML and JSP pages, along
+ with other files that must be visible to the client browser (such as
+ JavaScript, stylesheet files, and images) for your application.
+ In larger applications you may choose to divide these files into
+ a subdirectory hierarchy, but for smaller apps, it is generally
+ much simpler to maintain only a single directory for these files.
+ <br><br></li>
+<li><strong>/WEB-INF/web.xml</strong> - The <em>Web Application Deployment
+ Descriptor</em> for your application. This is an XML file describing
+ the servlets and other components that make up your application,
+ along with any initialization parameters and container-managed
+ security constraints that you want the server to enforce for you.
+ This file is discussed in more detail in the following subsection.
+ <br><br></li>
+<li><strong>/WEB-INF/classes/</strong> - This directory contains any Java
+ class files (and associated resources) required for your application,
+ including both servlet and non-servlet classes, that are not combined
+ into JAR files. If your classes are organized into Java packages,
+ you must reflect this in the directory hierarchy under
+ <code>/WEB-INF/classes/</code>. For example, a Java class named
+ <code>com.mycompany.mypackage.MyServlet</code>
+ would need to be stored in a file named
+ <code>/WEB-INF/classes/com/mycompany/mypackage/MyServlet.class</code>.
+ <br><br></li>
+<li><strong>/WEB-INF/lib/</strong> - This directory contains JAR files that
+ contain Java class files (and associated resources) required for your
+ application, such as third party class libraries or JDBC drivers.</li>
+</ul>
+
+<p>When you install an application into Tomcat (or any other 2.2 or later
+Servlet container), the classes in the <code>WEB-INF/classes/</code>
+directory, as well as all classes in JAR files found in the
+<code>WEB-INF/lib/</code> directory, are made visible to other classes
+within your particular web application. Thus, if
+you include all of the required library classes in one of these places (be
+sure to check licenses for redistribution rights for any third party libraries
+you utilize), you will simplify the installation of your web application --
+no adjustment to the system class path (or installation of global library
+files in your server) will be necessary.</p>
+
+<p>Much of this information was extracted from Chapter 9 of the Servlet
+API Specification, version 2.3, which you should consult for more details.</p>
+
+</div><h3 id="Shared_Library_Files">Shared Library Files</h3><div class="text">
+
+<p>Like most servlet containers, Tomcat also supports mechanisms to install
+library JAR files (or unpacked classes) once, and make them visible to all
+installed web applications (without having to be included inside the web
+application itself). The details of how Tomcat locates and shares such
+classes are described in the
+<a href="../class-loader-howto.html">Class Loader How-To</a> documentation.
+The location commonly used within a Tomcat installation for shared code is
+<strong>$CATALINA_HOME/lib</strong>. JAR files placed here are visible both to
+web applications and internal Tomcat code. This is a good place to put JDBC
+drivers that are required for both your application or internal Tomcat use
+(such as for a DataSourceRealm).</p>
+
+<p>Out of the box, a standard Tomcat installation includes a variety
+of pre-installed shared library files, including:</p>
+<ul>
+<li>The <em>Servlet 3.1</em> and <em>JSP 2.3</em> APIs that are fundamental
+ to writing servlets and JavaServer Pages.<br><br></li>
+</ul>
+
+</div><h3 id="Web_Application_Deployment_Descriptor">Web Application Deployment Descriptor</h3><div class="text">
+
+<p>As mentioned above, the <code>/WEB-INF/web.xml</code> file contains the
+Web Application Deployment Descriptor for your application. As the filename
+extension implies, this file is an XML document, and defines everything about
+your application that a server needs to know (except the <em>context path</em>,
+which is assigned by the system administrator when the application is
+deployed).</p>
+
+<p>The complete syntax and semantics for the deployment descriptor is defined
+in Chapter 13 of the Servlet API Specification, version 2.3. Over time, it
+is expected that development tools will be provided that create and edit the
+deployment descriptor for you. In the meantime, to provide a starting point,
+a <a href="web.xml.txt" target="_blank">basic web.xml file</a>
+is provided. This file includes comments that describe the purpose of each
+included element.</p>
+
+<p><strong>NOTE</strong> - The Servlet Specification includes a Document
+Type Descriptor (DTD) for the web application deployment descriptor, and
+Tomcat enforces the rules defined here when processing your application's
+<code>/WEB-INF/web.xml</code> file. In particular, you <strong>must</strong>
+enter your descriptor elements (such as <code><filter></code>,
+<code><servlet></code>, and <code><servlet-mapping></code> in
+the order defined by the DTD (see Section 13.3).</p>
+
+</div><h3 id="Tomcat_Context_Descriptor">Tomcat Context Descriptor</h3><div class="text">
+
+<p>A /META-INF/context.xml file can be used to define Tomcat specific
+configuration options, such as an access log, data sources, session manager
+configuration and more. This XML file must contain one Context element, which
+will be considered as if it was the child of the Host element corresponding
+to the Host to which the web application is being deployed. The
+<a href="../config/context.html">Tomcat configuration documentation</a> contains
+information on the Context element.</p>
+
+</div><h3 id="Deployment_With_Tomcat">Deployment With Tomcat</h3><div class="text">
+
+ <p><em>The description below uses the variable name $CATALINA_BASE to refer the
+ base directory against which most relative paths are resolved. If you have
+ not configured Tomcat for multiple instances by setting a CATALINA_BASE
+ directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME,
+ the directory into which you have installed Tomcat.</em></p>
+
+<p>In order to be executed, a web application must be deployed on
+a servlet container. This is true even during development.
+We will describe using Tomcat to provide the execution environment.
+A web application can be deployed in Tomcat by one of the following
+approaches:</p>
+<ul>
+<li><em>Copy unpacked directory hierarchy into a subdirectory in directory
+ <code>$CATALINA_BASE/webapps/</code></em>. Tomcat will assign a
+ context path to your application based on the subdirectory name you
+ choose. We will use this technique in the <code>build.xml</code>
+ file that we construct, because it is the quickest and easiest approach
+ during development. Be sure to restart Tomcat after installing or
+ updating your application.
+ <br><br></li>
+<li><em>Copy the web application archive file into directory
+ <code>$CATALINA_BASE/webapps/</code></em>. When Tomcat is started, it will
+ automatically expand the web application archive file into its unpacked
+ form, and execute the application that way. This approach would typically
+ be used to install an additional application, provided by a third party
+ vendor or by your internal development staff, into an existing
+ Tomcat installation. <strong>NOTE</strong> - If you use this approach,
+ and wish to update your application later, you must both replace the
+ web application archive file <strong>AND</strong> delete the expanded
+ directory that Tomcat created, and then restart Tomcat, in order to reflect
+ your changes.
+ <br><br></li>
+<li><em>Use the Tomcat "Manager" web application to deploy and undeploy
+ web applications</em>. Tomcat includes a web application, deployed
+ by default on context path <code>/manager</code>, that allows you to
+ deploy and undeploy applications on a running Tomcat server without
+ restarting it. See <a href="../manager-howto.html">Manager App How-To</a>
+ for more information on using the Manager web application.<br><br></li>
+<li><em>Use "Manager" Ant Tasks In Your Build Script</em>. Tomcat
+ includes a set of custom task definitions for the <code>Ant</code>
+ build tool that allow you to automate the execution of commands to the
+ "Manager" web application. These tasks are used in the Tomcat deployer.
+ <br><br></li>
+<li><em>Use the Tomcat Deployer</em>. Tomcat includes a packaged tool
+ bundling the Ant tasks, and can be used to automatically precompile JSPs
+ which are part of the web application before deployment to the server.
+ <br><br></li>
+</ul>
+
+<p>Deploying your app on other servlet containers will be specific to each
+container, but all containers compatible with the Servlet API Specification
+(version 2.2 or later) are required to accept a web application archive file.
+Note that other containers are <strong>NOT</strong> required to accept an
+unpacked directory structure (as Tomcat does), or to provide mechanisms for
+shared library files, but these features are commonly available.</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/appdev/index.html b/web/tomcat/webapps/docs/appdev/index.html
new file mode 100644
index 0000000..a98178f
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/index.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Application Developer's Guide (8.5.73) - Table of Contents</title><meta name="author" content="Craig R. McClanahan"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Application Developer's Guide</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">App Dev Guide Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="introduction.html">Introduction</a></li><li><a href="installation.html">Installation</a></li><li><a href="deployment.html">Deployment</a></li><li><a href="source.html">Source Code</a></li><li><a href="processes.html">Processes</a></li><li><a href="sample/">Example App</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Table of Contents</h2><h3 id="Preface">Preface</h3><div class="text">
+
+<p>This manual includes contributions from many members of the Tomcat Project
+developer community. The following authors have provided significant content:
+</p>
+<ul>
+<li>Craig R. McClanahan
+ (<a href="mailto:craigmcc@apache.org">craigmcc@apache.org</a>)</li>
+</ul>
+
+</div><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+
+<p>The information presented is divided into the following sections:</p>
+<ul>
+<li><a href="introduction.html"><strong>Introduction</strong></a> -
+ Briefly describes the information covered here, with
+ links and references to other sources of information.</li>
+<li><a href="installation.html"><strong>Installation</strong></a> -
+ Covers acquiring and installing the required software
+ components to use Tomcat for web application development.</li>
+<li><a href="deployment.html"><strong>Deployment Organization</strong></a> -
+ Discusses the standard directory layout for a web application
+ (defined in the Servlet API Specification), the Web Application
+ Deployment Descriptor, and options for integration with Tomcat
+ in your development environment.</li>
+<li><a href="source.html"><strong>Source Organization</strong></a> -
+ Describes a useful approach to organizing the source code
+ directories for your project, and introduces the
+ <code>build.xml</code> used by Ant to manage compilation.</li>
+<li><a href="processes.html"><strong>Development Processes</strong></a> -
+ Provides brief descriptions of typical development processes
+ utilizing the recommended deployment and source organizations.</li>
+<li><a href="sample/" target="_blank"><strong>Example Application</strong></a> -
+ This directory contains a very simple, but functionally complete,
+ "Hello, World" application built according to the principles
+ described in this manual. You can use this application to
+ practice using the described techniques.</li>
+</ul>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/appdev/installation.html b/web/tomcat/webapps/docs/appdev/installation.html
new file mode 100644
index 0000000..00000b2
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/installation.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Application Developer's Guide (8.5.73) - Installation</title><meta name="author" content="Craig R. McClanahan"><meta name="author" content="Yoav Shapira"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Application Developer's Guide</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">App Dev Guide Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="introduction.html">Introduction</a></li><li><a href="installation.html">Installation</a></li><li><a href="deployment.html">Deployment</a></li><li><a href="source.html">Source Code</a></li><li><a href="processes.html">Processes</a></li><li><a href="sample/">Example App</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Installation</h2><h3 id="Installation">Installation</h3><div class="text">
+
+<p>In order to use Tomcat for developing web applications, you must first
+install it (and the software it depends on). The required steps are outlined
+in the following subsections.</p>
+
+<div class="subsection"><h4 id="JDK">JDK</h4><div class="text">
+
+<p>Tomcat 8.5 was designed to run on Java 7 or later.
+</p>
+
+<p>Compatible JDKs for many platforms (or links to where they can be found)
+are available at
+<a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">http://www.oracle.com/technetwork/java/javase/downloads/index.html</a>.</p>
+
+</div></div>
+
+<div class="subsection"><h4 id="Tomcat">Tomcat</h4><div class="text">
+
+<p>Binary downloads of the <strong>Tomcat</strong> server are available from
+<a href="https://tomcat.apache.org/">https://tomcat.apache.org/</a>.
+This manual assumes you are using the most recent release
+of Tomcat 8. Detailed instructions for downloading and installing
+Tomcat are available <a href="../setup.html">here</a>.</p>
+
+<p>In the remainder of this manual, example shell scripts assume that you have
+set an environment variable <code>CATALINA_HOME</code> that contains the
+pathname to the directory in which Tomcat has been installed. Optionally, if
+Tomcat has been configured for multiple instances, each instance will have its
+own <code>CATALINA_BASE</code> configured.</p>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="Ant">Ant</h4><div class="text">
+
+<p>Binary downloads of the <strong>Ant</strong> build tool are available from
+<a href="https://ant.apache.org/">https://ant.apache.org/</a>.
+This manual assumes you are using Ant 1.8 or later. The instructions may
+also be compatible with other versions, but this has not been tested.</p>
+
+<p>Download and install Ant.
+Then, add the <code>bin</code> directory of the Ant distribution to your
+<code>PATH</code> environment variable, following the standard practices for
+your operating system platform. Once you have done this, you will be able to
+execute the <code>ant</code> shell command directly.</p>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="CVS">CVS</h4><div class="text">
+
+<p>Besides the required tools described above, you are strongly encouraged
+to download and install a <em>source code control</em> system, such as the
+<strong>Concurrent Version System</strong> (CVS), to maintain historical
+versions of the source files that make up your web application. Besides
+the server, you will also need appropriate client
+tools to check out source code files, and check in modified versions.</p>
+
+<p>Detailed instructions for installing and using source code control
+applications is beyond the scope of this manual. However, CVS server and
+client tools for many platforms (along with documentation) can be downloaded
+from <a href="http://www.cvshome.org/">http://www.cvshome.org/</a>.</p>
+
+</div></div>
+
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/appdev/introduction.html b/web/tomcat/webapps/docs/appdev/introduction.html
new file mode 100644
index 0000000..cbae83b
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/introduction.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Application Developer's Guide (8.5.73) - Introduction</title><meta name="author" content="Craig R. McClanahan"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Application Developer's Guide</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">App Dev Guide Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="introduction.html">Introduction</a></li><li><a href="installation.html">Installation</a></li><li><a href="deployment.html">Deployment</a></li><li><a href="source.html">Source Code</a></li><li><a href="processes.html">Processes</a></li><li><a href="sample/">Example App</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Introduction</h2><h3 id="Overview">Overview</h3><div class="text">
+
+<p>Congratulations! You've decided to (or been told to) learn how to
+build web applications using servlets and JSP pages, and picked the
+Tomcat server to use for your learning and development. But now what
+do you do?</p>
+
+<p>This manual is a primer covering the basic steps of using Tomcat to
+set up a development environment, organize your source code, and then
+build and test your application. It does not discuss architectures or
+recommended coding practices for web application development,
+or provide in depth instructions on operating the development
+tools that are discussed. References to sources of additional information
+are included in the following subsections.</p>
+
+<p>The discussion in this manual is aimed at developers who will be using
+a text editor along with command line tools to develop and debug their
+applications. As such, the recommendations are fairly generic – but you
+should easily be able to apply them in either a Windows-based or Unix-based
+development environment. If you are utilizing an Integrated Development
+Environment (IDE) tool, you will need to adapt the advice given here to
+the details of your particular environment.</p>
+
+</div><h3 id="Links">Links</h3><div class="text">
+
+<p>The following links provide access to selected sources of online
+information, documentation, and software that is useful in developing
+web applications with Tomcat.</p>
+<ul>
+<li><p><a href="https://jcp.org/aboutJava/communityprocess/mrel/jsr245/index2.html">https://jcp.org/aboutJava/communityprocess/mrel/jsr245/index2.html</a> -
+ <i>JavaServer Pages (JSP) Specification, Version 2.3</i>. Describes
+ the programming environment provided by standard implementations
+ of the JavaServer Pages (JSP) technology. In conjunction with
+ the Servlet API Specification (see below), this document describes
+ what a portable API page is allowed to contain. Specific
+ information on scripting (Chapter 9), tag extensions (Chapter 7),
+ and packaging JSP pages (Appendix A) is useful. The Javadoc
+ API Documentation is included in the specification, and with the
+ Tomcat download.</p></li>
+<li><p><a href="http://jcp.org/aboutJava/communityprocess/final/jsr340/index.html">http://jcp.org/aboutJava/communityprocess/final/jsr340/index.html</a> -
+ <i>Servlet API Specification, Version 3.1</i>. Describes the
+ programming environment that must be provided by all servlet
+ containers conforming to this specification. In particular, you
+ will need this document to understand the web application
+ directory structure and deployment file (Chapter 10), methods of
+ mapping request URIs to servlets (Chapter 12), container managed
+ security (Chapter 13), and the syntax of the <code>web.xml</code>
+ Web Application Deployment Descriptor (Chapter 14). The Javadoc
+ API Documentation is included in the specification, and with the
+ Tomcat download.</p></li>
+</ul>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/appdev/processes.html b/web/tomcat/webapps/docs/appdev/processes.html
new file mode 100644
index 0000000..6569b6d
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/processes.html
@@ -0,0 +1,273 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Application Developer's Guide (8.5.73) - Development Processes</title><meta name="author" content="Craig R. McClanahan"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Application Developer's Guide</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">App Dev Guide Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="introduction.html">Introduction</a></li><li><a href="installation.html">Installation</a></li><li><a href="deployment.html">Deployment</a></li><li><a href="source.html">Source Code</a></li><li><a href="processes.html">Processes</a></li><li><a href="sample/">Example App</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Development Processes</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Development_Processes">Development Processes</a><ol><li><a href="#One-Time_Setup_of_Ant_and_Tomcat_for_Development">One-Time Setup of Ant and Tomcat for Development</a></li><li><a href="#Create_Project_Source_Code_Directory">Create Project Source Code Directory</a></li><li><a href="#Edit_Source_Code_and_Pages">Edit Source Code and Pages</a></li><li><a href="#Build_the_Web_Application">Build the Web Application</a></li><li><a href="#Test_Your_Web_Application">Test Your Web Application</a></li><li><a href="#Creating_a_Release">Creating a Release</a></li></ol></li></ul>
+</div><h3 id="Development_Processes">Development Processes</h3><div class="text">
+
+<p>Although application development can take many forms, this manual proposes
+a fairly generic process for creating web applications using Tomcat. The
+following sections highlight the commands and tasks that you, as the developer
+of the code, will perform. The same basic approach works when you have
+multiple programmers involved, as long as you have an appropriate source code
+control system and internal team rules about who is working on what parts
+of the application at any given time.</p>
+
+<p>The task descriptions below assume that you will be using CVS for source
+code control, and that you have already configured access to the appropriate
+CVS repository. Instructions for doing this are beyond the scope of this
+manual. If you are using a different source code control environment, you
+will need to figure out the corresponding commands for your system.</p>
+
+
+<div class="subsection"><h4 id="One-Time_Setup_of_Ant_and_Tomcat_for_Development">One-Time Setup of Ant and Tomcat for Development</h4><div class="text">
+
+<p>In order to take advantage of the special Ant tasks that interact with the
+<em>Manager</em> web application, you need to perform the following tasks
+once (no matter how many web applications you plan to develop).</p>
+<ul>
+<li><p><em>Configure the Ant custom tasks</em>. The implementation code for the
+ Ant custom tasks is in a JAR file named
+ <code>$CATALINA_HOME/lib/catalina-ant.jar</code>, which must be
+ copied in to the <code>lib</code> directory of your Ant installation.
+ </p></li>
+<li><p><em>Define one or more Tomcat users</em>. The <em>Manager</em> web
+ application runs under a security constraint that requires a user to be
+ logged in, and have the security role <code>manager-script</code> assigned
+ to then. How such users are defined depends on which Realm you have
+ configured in Tomcat's <code>conf/server.xml</code> file -- see the
+ <a href="../realm-howto.html">Realm Configuration How-To</a> for more
+ information. You may define any number of users (with any username
+ and password that you like) with the <code>manager-script</code> role.
+ </p></li>
+</ul>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="Create_Project_Source_Code_Directory">Create Project Source Code Directory</h4><div class="text">
+
+<p>The first step is to create a new project source directory, and customize
+the <code>build.xml</code> and <code>build.properties</code> files you will
+be using. The directory structure is described in <a href="source.html">the
+previous section</a>, or you can use the
+<a href="sample/">sample application</a> as a starting point.</p>
+
+<p>Create your project source directory, and define it within your CVS
+repository. This might be done by a series of commands like this, where
+<code>{project}</code> is the name under which your project should be
+stored in the CVS repository, and {username} is your login username:</p>
+<div class="codeBox"><pre><code>cd {my home directory}
+mkdir myapp <-- Assumed "project source directory"
+cd myapp
+mkdir docs
+mkdir src
+mkdir web
+mkdir web/WEB-INF
+cvs import -m "Initial Project Creation" {project} \
+ {username} start</code></pre></div>
+
+<p>Now, to verify that it was created correctly in CVS, we will perform a
+checkout of the new project:</p>
+<div class="codeBox"><pre><code>cd ..
+mv myapp myapp.bu
+cvs checkout {project}</code></pre></div>
+
+<p>Next, you will need to create and check in an initial version of the
+<code>build.xml</code> script to be used for development. For getting
+started quickly and easily, base your <code>build.xml</code> on the
+<a href="build.xml.txt">basic build.xml file</a>, included with this manual,
+or code it from scratch.</p>
+<div class="codeBox"><pre><code>cd {my home directory}
+cd myapp
+emacs build.xml <-- if you want a real editor :-)
+cvs add build.xml
+cvs commit</code></pre></div>
+
+<p>Until you perform the CVS commit, your changes are local to your own
+development directory. Committing makes those changes visible to other
+developers on your team that are sharing the same CVS repository.</p>
+
+<p>The next step is to customize the Ant <em>properties</em> that are
+named in the <code>build.xml</code> script. This is done by creating a
+file named <code>build.properties</code> in your project's top-level
+directory. The supported properties are listed in the comments inside
+the sample <code>build.xml</code> script. At a minimum, you will generally
+need to define the <code>catalina.home</code> property defining where
+Tomcat is installed, and the manager application username and password.
+You might end up with something like this:</p>
+<div class="codeBox"><pre><code># Context path to install this application on
+app.path=/hello
+
+# Tomcat installation directory
+catalina.home=/usr/local/apache-tomcat-8.5
+
+# Manager webapp username and password
+manager.username=myusername
+manager.password=mypassword</code></pre></div>
+
+<p>In general, you will <strong>not</strong> want to check the
+<code>build.properties</code> file in to the CVS repository, because it
+is unique to each developer's environment.</p>
+
+<p>Now, create the initial version of the web application deployment
+descriptor. You can base <code>web.xml</code> on the
+<a href="web.xml.txt">basic web.xml file</a>, or code it from scratch.</p>
+<div class="codeBox"><pre><code>cd {my home directory}
+cd myapp/web/WEB-INF
+emacs web.xml
+cvs add web.xml
+cvs commit</code></pre></div>
+
+Note that this is only an example web.xml file. The full definition
+of the deployment descriptor file is in the
+<a href="https://wiki.apache.org/tomcat/Specifications">Servlet Specification.</a>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="Edit_Source_Code_and_Pages">Edit Source Code and Pages</h4><div class="text">
+
+<p>The edit/build/test tasks will generally be your most common activities
+during development and maintenance. The following general principles apply.
+As described in <a href="source.html">Source Organization</a>, newly created
+source files should be located in the appropriate subdirectory, under your
+project source directory.</p>
+
+<p>Whenever you wish to refresh your development directory to reflect the
+work performed by other developers, you will ask CVS to do it for you:</p>
+<div class="codeBox"><pre><code>cd {my home directory}
+cd myapp
+cvs update -dP</code></pre></div>
+
+<p>To create a new file, go to the appropriate directory, create the file,
+and register it with CVS. When you are satisfied with it's contents (after
+building and testing is successful), commit the new file to the repository.
+For example, to create a new JSP page:</p>
+<div class="codeBox"><pre><code>cd {my home directory}
+cd myapp/web <-- Ultimate destination is document root
+emacs mypage.jsp
+cvs add mypage.jsp
+... build and test the application ...
+cvs commit</code></pre></div>
+
+<p>Java source code that is defined in packages must be organized in a
+directory hierarchy (under the <strong>src/</strong> subdirectory) that
+matches the package names. For example, a Java class named
+<code>com.mycompany.mypackage.MyClass.java</code> should be stored in file
+<code>src/com/mycompany/mypackage/MyClass.java</code>.
+Whenever you create a new subdirectory, don't forget to
+register it with CVS.</p>
+
+<p>To edit an existing source file, you will generally just start editing
+and testing, then commit the changed file when everything works. Although
+CVS can be configured to required you to "check out" or "lock" a file you
+are going to be modifying, this is generally not used.</p>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="Build_the_Web_Application">Build the Web Application</h4><div class="text">
+
+<p>When you are ready to compile the application, issue the following
+commands (generally, you will want a shell window open that is set to
+the project source directory, so that only the last command is needed):</p>
+<div class="codeBox"><pre><code>cd {my home directory}
+cd myapp <-- Normally leave a window open here
+ant</code></pre></div>
+
+<p>The Ant tool will be execute the default "compile" target in your
+<code>build.xml</code> file, which will compile any new or updated Java
+code. If this is the first time you compile after a "build clean",
+it will cause everything to be recompiled.</p>
+
+<p>To force the recompilation of your entire application, do this instead:</p>
+<div class="codeBox"><pre><code>cd {my home directory}
+cd myapp
+ant all</code></pre></div>
+
+<p>This is a very good habit immediately before checking in changes, to
+make sure that you have not introduced any subtle problems that Javac's
+conditional checking did not catch.</p>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="Test_Your_Web_Application">Test Your Web Application</h4><div class="text">
+
+<p>To test your application, you will want to install it under Tomcat. The
+quickest way to do that is to use the custom Ant tasks that are included in
+the sample <code>build.xml</code> script. Using these commands might follow
+a pattern like this:</p>
+<ul>
+<li><p><em>Start Tomcat if needed</em>. If Tomcat is not already running,
+ you will need to start it in the usual way.
+ </p></li>
+<li><p><em>Compile your application</em>. Use the <code>ant compile</code>
+ command (or just <code>ant</code>, since this is the default). Make
+ sure that there are no compilation errors.
+ </p></li>
+<li><p><em>Install the application</em>. Use the <code>ant install</code>
+ command. This tells Tomcat to immediately start running your app on
+ the context path defined in the <code>app.path</code> build property.
+ Tomcat does <strong>NOT</strong> have to be restarted for this to
+ take effect.
+ </p></li>
+<li><p><em>Test the application</em>. Using your browser or other testing
+ tools, test the functionality of your application.
+ </p></li>
+<li><p><em>Modify and rebuild as needed</em>. As you discover that changes
+ are required, make those changes in the original <strong>source</strong>
+ files, not in the output build directory, and re-issue the
+ <code>ant compile</code> command. This ensures that your changes will
+ be available to be saved (via <code>cvs commit</code>) later on --
+ the output build directory is deleted and recreated as necessary.
+ </p></li>
+<li><p><em>Reload the application</em>. Tomcat will recognize changes in
+ JSP pages automatically, but it will continue to use the old versions
+ of any servlet or JavaBean classes until the application is reloaded.
+ You can trigger this by executing the <code>ant reload</code> command.
+ </p></li>
+<li><p><em>Remove the application when you are done</em>. When you are through
+ working on this application, you can remove it from live execution by
+ running the <code>ant remove</code> command.
+ </p></li>
+</ul>
+
+<p>Do not forget to commit your changes to the source code repository when
+you have completed your testing!</p>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="Creating_a_Release">Creating a Release</h4><div class="text">
+
+<p>When you are through adding new functionality, and you've tested everything
+(you DO test, don't you :-), it is time to create the distributable version
+of your web application that can be deployed on the production server. The
+following general steps are required:</p>
+<ul>
+<li><p>Issue the command <code>ant all</code> from the project source
+ directory, to rebuild everything from scratch one last time.
+ </p></li>
+<li><p>Use the <code>cvs tag</code> command to create an identifier for
+ all of the source files utilized to create this release. This allows
+ you to reliably reconstruct a release (from sources) at a later
+ time.
+ </p></li>
+<li><p>Issue the command <code>ant dist</code> to create a distributable
+ web application archive (WAR) file, as well as a JAR file containing
+ the corresponding source code.
+ </p></li>
+<li><p>Package the contents of the <code>dist</code> directory using the
+ <strong>tar</strong> or <strong>zip</strong> utility, according to
+ the standard release procedures used by your organization.
+ </p></li>
+</ul>
+
+</div></div>
+
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/appdev/sample/build.xml b/web/tomcat/webapps/docs/appdev/sample/build.xml
new file mode 100644
index 0000000..a75afe1
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/sample/build.xml
@@ -0,0 +1,508 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!--
+ General purpose build script for web applications and web services,
+ including enhanced support for deploying directly to a Tomcat
+ based server.
+
+ This build script assumes that the source code of your web application
+ is organized into the following subdirectories underneath the source
+ code directory from which you execute the build script:
+
+ docs Static documentation files to be copied to
+ the "docs" subdirectory of your distribution.
+
+ src Java source code (and associated resource files)
+ to be compiled to the "WEB-INF/classes"
+ subdirectory of your web application.
+
+ web Static HTML, JSP, and other content (such as
+ image files), including the WEB-INF subdirectory
+ and its configuration file contents.
+-->
+
+
+<!-- A "project" describes a set of targets that may be requested
+ when Ant is executed. The "default" attribute defines the
+ target which is executed if no specific target is requested,
+ and the "basedir" attribute defines the current working directory
+ from which Ant executes the requested task. This is normally
+ set to the current working directory.
+-->
+
+<project name="My Project" default="compile" basedir=".">
+
+
+
+<!-- ===================== Property Definitions =========================== -->
+
+
+<!--
+
+ Each of the following properties are used in the build script.
+ Values for these properties are set by the first place they are
+ defined, from the following list:
+
+ * Definitions on the "ant" command line (ant -Dfoo=bar compile).
+
+ * Definitions from a "build.properties" file in the top level
+ source directory of this application.
+
+ * Definitions from a "build.properties" file in the developer's
+ home directory.
+
+ * Default definitions in this build.xml file.
+
+ You will note below that property values can be composed based on the
+ contents of previously defined properties. This is a powerful technique
+ that helps you minimize the number of changes required when your development
+ environment is modified. Note that property composition is allowed within
+ "build.properties" files as well as in the "build.xml" script.
+
+-->
+
+ <property file="build.properties"/>
+ <property file="${user.home}/build.properties"/>
+
+
+<!-- ==================== File and Directory Names ======================== -->
+
+
+<!--
+
+ These properties generally define file and directory names (or paths) that
+ affect where the build process stores its outputs.
+
+ app.name Base name of this application, used to
+ construct filenames and directories.
+ Defaults to "myapp".
+
+ app.path Context path to which this application should be
+ deployed (defaults to "/" plus the value of the
+ "app.name" property).
+
+ app.version Version number of this iteration of the application.
+
+ build.home The directory into which the "prepare" and
+ "compile" targets will generate their output.
+ Defaults to "build".
+
+ catalina.home The directory in which you have installed
+ a binary distribution of Tomcat. This will
+ be used by the "deploy" target.
+
+ dist.home The name of the base directory in which
+ distribution files are created.
+ Defaults to "dist".
+
+ manager.password The login password of a user that is assigned the
+ "manager-script" role (so that they can execute
+ commands via the "/manager" web application)
+
+ manager.url The URL of the "/manager" web application on the
+ Tomcat installation to which we will deploy web
+ applications and web services.
+
+ manager.username The login username of a user that is assigned the
+ "manager-script" role (so that they can execute
+ commands via the "/manager" web application)
+
+-->
+
+ <property name="app.name" value="myapp"/>
+ <property name="app.path" value="/${app.name}"/>
+ <property name="app.version" value="0.1-dev"/>
+ <property name="build.home" value="${basedir}/build"/>
+ <property name="catalina.home" value="../../../.."/> <!-- UPDATE THIS! -->
+ <property name="dist.home" value="${basedir}/dist"/>
+ <property name="docs.home" value="${basedir}/docs"/>
+ <property name="manager.url" value="http://localhost:8080/manager/text"/>
+ <property name="src.home" value="${basedir}/src"/>
+ <property name="web.home" value="${basedir}/web"/>
+
+
+<!-- ==================== External Dependencies =========================== -->
+
+
+<!--
+
+ Use property values to define the locations of external JAR files on which
+ your application will depend. In general, these values will be used for
+ two purposes:
+ * Inclusion on the classpath that is passed to the Javac compiler
+ * Being copied into the "/WEB-INF/lib" directory during execution
+ of the "deploy" target.
+
+ Because we will automatically include all of the Java classes that Tomcat
+ exposes to web applications, we will not need to explicitly list any of those
+ dependencies. You only need to worry about external dependencies for JAR
+ files that you are going to include inside your "/WEB-INF/lib" directory.
+
+-->
+
+<!-- Dummy external dependency -->
+<!--
+ <property name="foo.jar"
+ value="/path/to/foo.jar"/>
+-->
+
+
+<!-- ==================== Compilation Classpath =========================== -->
+
+<!--
+
+ Rather than relying on the CLASSPATH environment variable, Ant includes
+ features that makes it easy to dynamically construct the classpath you
+ need for each compilation. The example below constructs the compile
+ classpath to include the servlet.jar file, as well as the other components
+ that Tomcat makes available to web applications automatically, plus anything
+ that you explicitly added.
+
+-->
+
+ <path id="compile.classpath">
+
+ <!-- Include all JAR files that will be included in /WEB-INF/lib -->
+ <!-- *** CUSTOMIZE HERE AS REQUIRED BY YOUR APPLICATION *** -->
+<!--
+ <pathelement location="${foo.jar}"/>
+-->
+
+ <!-- Include all elements that Tomcat exposes to applications -->
+ <fileset dir="${catalina.home}/bin">
+ <include name="*.jar"/>
+ </fileset>
+ <pathelement location="${catalina.home}/lib"/>
+ <fileset dir="${catalina.home}/lib">
+ <include name="*.jar"/>
+ </fileset>
+
+ </path>
+
+
+
+<!-- ================== Custom Ant Task Definitions ======================= -->
+
+
+<!--
+
+ These properties define custom tasks for the Ant build tool that interact
+ with the "/manager" web application installed with Tomcat. Before they
+ can be successfully utilized, you must perform the following steps:
+
+ - Copy the file "lib/catalina-ant.jar" from your Tomcat
+ installation into the "lib" directory of your Ant installation.
+
+ - Create a "build.properties" file in your application's top-level
+ source directory (or your user login home directory) that defines
+ appropriate values for the "manager.password", "manager.url", and
+ "manager.username" properties described above.
+
+ For more information about the Manager web application, and the functionality
+ of these tasks, see <http://localhost:8080/tomcat-docs/manager-howto.html>.
+
+-->
+
+ <taskdef resource="org/apache/catalina/ant/catalina.tasks"
+ classpathref="compile.classpath"/>
+
+
+<!-- ==================== Compilation Control Options ==================== -->
+
+<!--
+
+ These properties control option settings on the Javac compiler when it
+ is invoked using the <javac> task.
+
+ compile.debug Should compilation include the debug option?
+
+ compile.deprecation Should compilation include the deprecation option?
+
+-->
+
+ <property name="compile.debug" value="true"/>
+ <property name="compile.deprecation" value="false"/>
+
+
+
+<!-- ==================== All Target ====================================== -->
+
+<!--
+
+ The "all" target is a shortcut for running the "clean" target followed
+ by the "compile" target, to force a complete recompile.
+
+-->
+
+ <target name="all" depends="clean,compile"
+ description="Clean build and dist directories, then compile"/>
+
+
+
+<!-- ==================== Clean Target ==================================== -->
+
+<!--
+
+ The "clean" target deletes any previous "build" and "dist" directory,
+ so that you can be ensured the application can be built from scratch.
+
+-->
+
+ <target name="clean"
+ description="Delete old build and dist directories">
+ <delete dir="${build.home}"/>
+ <delete dir="${dist.home}"/>
+ </target>
+
+
+
+<!-- ==================== Compile Target ================================== -->
+
+<!--
+
+ The "compile" target transforms source files (from your "src" directory)
+ into object files in the appropriate location in the build directory.
+ This example assumes that you will be including your classes in an
+ unpacked directory hierarchy under "/WEB-INF/classes".
+
+-->
+
+ <target name="compile" depends="prepare"
+ description="Compile Java sources">
+
+ <!-- Compile Java classes as necessary -->
+ <mkdir dir="${build.home}/WEB-INF/classes"/>
+ <javac srcdir="${src.home}"
+ destdir="${build.home}/WEB-INF/classes"
+ debug="${compile.debug}"
+ deprecation="${compile.deprecation}">
+ <classpath refid="compile.classpath"/>
+ </javac>
+
+ <!-- Copy application resources -->
+ <copy todir="${build.home}/WEB-INF/classes">
+ <fileset dir="${src.home}" excludes="**/*.java"/>
+ </copy>
+
+ </target>
+
+
+
+<!-- ==================== Dist Target ===================================== -->
+
+
+<!--
+
+ The "dist" target creates a binary distribution of your application
+ in a directory structure ready to be archived in a tar.gz or zip file.
+ Note that this target depends on two others:
+
+ * "compile" so that the entire web application (including external
+ dependencies) will have been assembled
+
+ * "javadoc" so that the application Javadocs will have been created
+
+-->
+
+ <target name="dist" depends="compile,javadoc"
+ description="Create binary distribution">
+
+ <!-- Copy documentation subdirectories -->
+ <mkdir dir="${dist.home}/docs"/>
+ <copy todir="${dist.home}/docs">
+ <fileset dir="${docs.home}"/>
+ </copy>
+
+ <!-- Create application JAR file -->
+ <jar jarfile="${dist.home}/${app.name}-${app.version}.war"
+ basedir="${build.home}"/>
+
+ <!-- Copy additional files to ${dist.home} as necessary -->
+
+ </target>
+
+
+
+<!-- ==================== Install Target ================================== -->
+
+<!--
+
+ The "install" target tells the specified Tomcat installation to dynamically
+ install this web application and make it available for execution. It does
+ *not* cause the existence of this web application to be remembered across
+ Tomcat restarts; if you restart the server, you will need to re-install all
+ this web application.
+
+ If you have already installed this application, and simply want Tomcat to
+ recognize that you have updated Java classes (or the web.xml file), use the
+ "reload" target instead.
+
+ NOTE: This target will only succeed if it is run from the same server that
+ Tomcat is running on.
+
+ NOTE: This is the logical opposite of the "remove" target.
+
+-->
+
+ <target name="install" depends="compile"
+ description="Install application to servlet container">
+
+ <deploy url="${manager.url}"
+ username="${manager.username}"
+ password="${manager.password}"
+ path="${app.path}"
+ localWar="file://${build.home}"/>
+
+ </target>
+
+
+<!-- ==================== Javadoc Target ================================== -->
+
+<!--
+
+ The "javadoc" target creates Javadoc API documentation for the Java
+ classes included in your application. Normally, this is only required
+ when preparing a distribution release, but is available as a separate
+ target in case the developer wants to create Javadocs independently.
+
+-->
+
+ <target name="javadoc" depends="compile"
+ description="Create Javadoc API documentation">
+
+ <mkdir dir="${dist.home}/docs/api"/>
+ <javadoc sourcepath="${src.home}"
+ destdir="${dist.home}/docs/api"
+ packagenames="*">
+ <classpath refid="compile.classpath"/>
+ </javadoc>
+
+ </target>
+
+
+
+<!-- ====================== List Target =================================== -->
+
+<!--
+
+ The "list" target asks the specified Tomcat installation to list the
+ currently running web applications, either loaded at startup time or
+ installed dynamically. It is useful to determine whether or not the
+ application you are currently developing has been installed.
+
+-->
+
+ <target name="list"
+ description="List installed applications on servlet container">
+
+ <list url="${manager.url}"
+ username="${manager.username}"
+ password="${manager.password}"/>
+
+ </target>
+
+
+<!-- ==================== Prepare Target ================================== -->
+
+<!--
+
+ The "prepare" target is used to create the "build" destination directory,
+ and copy the static contents of your web application to it. If you need
+ to copy static files from external dependencies, you can customize the
+ contents of this task.
+
+ Normally, this task is executed indirectly when needed.
+
+-->
+
+ <target name="prepare">
+
+ <!-- Create build directories as needed -->
+ <mkdir dir="${build.home}"/>
+ <mkdir dir="${build.home}/WEB-INF"/>
+ <mkdir dir="${build.home}/WEB-INF/classes"/>
+
+
+ <!-- Copy static content of this web application -->
+ <copy todir="${build.home}">
+ <fileset dir="${web.home}"/>
+ </copy>
+
+ <!-- Copy external dependencies as required -->
+ <!-- *** CUSTOMIZE HERE AS REQUIRED BY YOUR APPLICATION *** -->
+ <mkdir dir="${build.home}/WEB-INF/lib"/>
+<!--
+ <copy todir="${build.home}/WEB-INF/lib" file="${foo.jar}"/>
+-->
+
+ <!-- Copy static files from external dependencies as needed -->
+ <!-- *** CUSTOMIZE HERE AS REQUIRED BY YOUR APPLICATION *** -->
+
+ </target>
+
+
+<!-- ==================== Reload Target =================================== -->
+
+<!--
+
+ The "reload" signals the specified application Tomcat to shut itself down
+ and reload. This can be useful when the web application context is not
+ reloadable and you have updated classes or property files in the
+ /WEB-INF/classes directory or when you have added or updated jar files in the
+ /WEB-INF/lib directory.
+
+ NOTE: The /WEB-INF/web.xml web application configuration file is not reread
+ on a reload. If you have made changes to your web.xml file you must stop
+ then start the web application.
+
+-->
+
+ <target name="reload" depends="compile"
+ description="Reload application on servlet container">
+
+ <reload url="${manager.url}"
+ username="${manager.username}"
+ password="${manager.password}"
+ path="${app.path}"/>
+
+ </target>
+
+
+<!-- ==================== Remove Target =================================== -->
+
+<!--
+
+ The "remove" target tells the specified Tomcat installation to dynamically
+ remove this web application from service.
+
+ NOTE: This is the logical opposite of the "install" target.
+
+-->
+
+ <target name="remove"
+ description="Remove application on servlet container">
+
+ <undeploy url="${manager.url}"
+ username="${manager.username}"
+ password="${manager.password}"
+ path="${app.path}"/>
+
+ </target>
+
+
+</project>
diff --git a/web/tomcat/webapps/docs/appdev/sample/docs/README.txt b/web/tomcat/webapps/docs/appdev/sample/docs/README.txt
new file mode 100644
index 0000000..f146b0e
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/sample/docs/README.txt
@@ -0,0 +1,17 @@
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+This is a dummy README file for the sample
+web application.
diff --git a/web/tomcat/webapps/docs/appdev/sample/index.html b/web/tomcat/webapps/docs/appdev/sample/index.html
new file mode 100644
index 0000000..589bd71
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/sample/index.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+<head>
+<meta charset="UTF-8" />
+<meta name="author" content="Ben Souther" />
+<title>Sample Application</title>
+</head>
+<body>
+<h2>Sample Application</h2>
+ <p>
+ The example app has been packaged as a war file and can be downloaded
+ <a href="sample.war">here</a> (Note: make sure your browser doesn't
+ change file extension or append a new one).
+ </p>
+ <p>
+ The easiest way to run this application is simply to move the war file
+ to your <b>CATALINA_BASE/webapps</b> directory. A default Tomcat install
+ will automatically expand and deploy the application for you. You can
+ view it with the following URL (assuming that you're running tomcat on
+ port 8080 which is the default):
+ <br />
+ <a href="http://localhost:8080/sample">http://localhost:8080/sample</a>
+ </p>
+ <p>
+ If you just want to browse the contents, you can unpack the war file
+ with the <b>jar</b> command.
+ </p>
+ <pre>
+ jar -xvf sample.war
+ </pre>
+ <p>
+ Note: <b>CATALINA_BASE</b> is usually the directory in which you
+ unpacked the Tomcat distribution. For more information on
+ <b>CATALINA_HOME</b>, <b>CATALINA_BASE</b> and the difference between
+ them see <b>RUNNING.txt</b> in the directory you unpacked your Tomcat
+ distribution.
+ </p>
+</body>
+</html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/appdev/sample/sample.war b/web/tomcat/webapps/docs/appdev/sample/sample.war
new file mode 100644
index 0000000..0a127e6
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/sample/sample.war
Binary files differ
diff --git a/web/tomcat/webapps/docs/appdev/sample/src/mypackage/Hello.java b/web/tomcat/webapps/docs/appdev/sample/src/mypackage/Hello.java
new file mode 100644
index 0000000..6984ffe
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/sample/src/mypackage/Hello.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package mypackage;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+
+/**
+ * Simple servlet to validate that the Hello, World example can
+ * execute servlets. In the web application deployment descriptor,
+ * this servlet must be mapped to correspond to the link in the
+ * "index.html" file.
+ *
+ * @author Craig R. McClanahan <Craig.McClanahan@eng.sun.com>
+ */
+
+public final class Hello extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Respond to a GET request for the content produced by
+ * this servlet.
+ *
+ * @param request The servlet request we are processing
+ * @param response The servlet response we are producing
+ *
+ * @exception IOException if an input/output error occurs
+ * @exception ServletException if a servlet error occurs
+ */
+ @Override
+ public void doGet(HttpServletRequest request,
+ HttpServletResponse response)
+ throws IOException, ServletException {
+
+ response.setContentType("text/html");
+ response.setCharacterEncoding("UTF-8");
+ try (PrintWriter writer = response.getWriter()) {
+
+ writer.println("<!DOCTYPE html><html>");
+ writer.println("<head>");
+ writer.println("<meta charset=\"UTF-8\" />");
+ writer.println("<title>Sample Application Servlet Page</title>");
+ writer.println("</head>");
+ writer.println("<body>");
+
+
+ writer.println("<div style=\"float: left; padding: 10px;\">");
+ writer.println("<img src=\"images/tomcat.gif\" alt=\"\" />");
+ writer.println("</div>");
+ writer.println("<h1>Sample Application Servlet</h1>");
+ writer.println("<p>");
+ writer.println("This is the output of a servlet that is part of");
+ writer.println("the Hello, World application.");
+ writer.println("</p>");
+
+ writer.println("</body>");
+ writer.println("</html>");
+ }
+ }
+
+
+}
diff --git a/web/tomcat/webapps/docs/appdev/sample/web/WEB-INF/web.xml b/web/tomcat/webapps/docs/appdev/sample/web/WEB-INF/web.xml
new file mode 100644
index 0000000..cbcba17
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/sample/web/WEB-INF/web.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
+ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+ version="3.1">
+
+ <display-name>Hello, World Application</display-name>
+ <description>
+ This is a simple web application with a source code organization
+ based on the recommendations of the Application Developer's Guide.
+ </description>
+
+ <servlet>
+ <servlet-name>HelloServlet</servlet-name>
+ <servlet-class>mypackage.Hello</servlet-class>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>HelloServlet</servlet-name>
+ <url-pattern>/hello</url-pattern>
+ </servlet-mapping>
+
+</web-app>
diff --git a/web/tomcat/webapps/docs/appdev/sample/web/hello.jsp b/web/tomcat/webapps/docs/appdev/sample/web/hello.jsp
new file mode 100644
index 0000000..bd5680a
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/sample/web/hello.jsp
@@ -0,0 +1,37 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ page session="false" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8" />
+<title>Sample Application JSP Page</title>
+</head>
+<body>
+
+<div style="float: left; padding: 10px;">
+<img src="images/tomcat.gif" alt="" />
+</div>
+<h1>Sample Application JSP Page</h1>
+This is the output of a JSP page that is part of the Hello, World
+application.
+
+
+<%= new String("Hello!") %>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/docs/appdev/sample/web/images/tomcat.gif b/web/tomcat/webapps/docs/appdev/sample/web/images/tomcat.gif
new file mode 100644
index 0000000..f2aa6f8
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/sample/web/images/tomcat.gif
Binary files differ
diff --git a/web/tomcat/webapps/docs/appdev/sample/web/index.html b/web/tomcat/webapps/docs/appdev/sample/web/index.html
new file mode 100644
index 0000000..1c6938a
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/sample/web/index.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html><!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+<head>
+<meta charset="UTF-8" />
+<title>Sample "Hello, World" Application</title>
+</head>
+<body>
+
+<div style="float: left; padding: 10px;">
+<img src="images/tomcat.gif" alt="" />
+</div>
+<h1>Sample "Hello, World" Application</h1>
+<p>This is the home page for a sample application used to illustrate the
+source directory organization of a web application utilizing the principles
+outlined in the Application Developer's Guide.
+
+<p>To prove that they work, you can execute either of the following links:</p>
+<ul>
+<li>To a <a href="hello.jsp">JSP page</a>.</li>
+<li>To a <a href="hello">servlet</a>.</li>
+</ul>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/docs/appdev/source.html b/web/tomcat/webapps/docs/appdev/source.html
new file mode 100644
index 0000000..21b45ba
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/source.html
@@ -0,0 +1,279 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Application Developer's Guide (8.5.73) - Source Organization</title><meta name="author" content="Craig R. McClanahan"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Application Developer's Guide</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">App Dev Guide Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="introduction.html">Introduction</a></li><li><a href="installation.html">Installation</a></li><li><a href="deployment.html">Deployment</a></li><li><a href="source.html">Source Code</a></li><li><a href="processes.html">Processes</a></li><li><a href="sample/">Example App</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Source Organization</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Directory_Structure">Directory Structure</a><ol><li><a href="#External_Dependencies">External Dependencies</a></li></ol></li><li><a href="#Source_Code_Control">Source Code Control</a></li><li><a href="#BUILD.XML_Configuration_File">BUILD.XML Configuration File</a></li></ul>
+</div><h3 id="Directory_Structure">Directory Structure</h3><div class="text">
+
+ <p><em>The description below uses the variable name $CATALINA_BASE to refer the
+ base directory against which most relative paths are resolved. If you have
+ not configured Tomcat for multiple instances by setting a CATALINA_BASE
+ directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME,
+ the directory into which you have installed Tomcat.</em></p>
+
+<p>A key recommendation of this manual is to separate the directory
+hierarchy containing your source code (described in this section) from
+the directory hierarchy containing your deployable application
+(described in the preceding section). Maintaining this separation has
+the following advantages:</p>
+<ul>
+<li><p>The contents of the source directories can be more easily administered,
+ moved, and backed up if the "executable" version of the application
+ is not intermixed.
+ </p></li>
+<li><p>Source code control is easier to manage on directories that contain
+ only source files.
+ </p></li>
+<li><p>The files that make up an installable distribution of your
+ application are much easier to select when the deployment
+ hierarchy is separate.</p></li>
+</ul>
+
+<p>As we will see, the <code>ant</code> development tool makes the creation
+and processing of such directory hierarchies nearly painless.</p>
+
+<p>The actual directory and file hierarchy used to contain the source code
+of an application can be pretty much anything you like. However, the
+following organization has proven to be quite generally applicable, and is
+expected by the example <code>build.xml</code> configuration file that
+is discussed below. All of these components exist under a top level
+<em>project source directory</em> for your application:</p>
+<ul>
+<li><strong>docs/</strong> - Documentation for your application, in whatever
+ format your development team is using.<br><br></li>
+<li><strong>src/</strong> - Java source files that generate the servlets,
+ beans, and other Java classes that are unique to your application.
+ If your source code is organized in packages (<strong>highly</strong>
+ recommended), the package hierarchy should be reflected as a directory
+ structure underneath this directory.<br><br></li>
+<li><strong>web/</strong> - The static content of your web site (HTML pages,
+ JSP pages, JavaScript files, CSS stylesheet files, and images) that will
+ be accessible to application clients. This directory will be the
+ <em>document root</em> of your web application, and any subdirectory
+ structure found here will be reflected in the request URIs required to
+ access those files.<br><br></li>
+<li><strong>web/WEB-INF/</strong> - The special configuration files required
+ for your application, including the web application deployment descriptor
+ (<code>web.xml</code>, defined in the
+ <a href="https://wiki.apache.org/tomcat/Specifications">Servlet Specification</a>),
+ tag library descriptors for custom tag libraries
+ you have created, and other resource files you wish to include within
+ your web application. Even though this directory appears to be a
+ subdirectory of your <em>document root</em>, the Servlet Specification
+ prohibits serving the contents of this directory (or any file it contains)
+ directly to a client request. Therefore, this is a good place to store
+ configuration information that is sensitive (such as database connection
+ usernames and passwords), but is required for your application to
+ operate successfully.</li>
+</ul>
+
+<p>During the development process, two additional directories will be
+created on a temporary basis:</p>
+<ul>
+<li><strong>build/</strong> - When you execute a default build
+ (<code>ant</code>), this directory will contain an exact image
+ of the files in the web application archive for this application.
+ Tomcat allows you to deploy an application in an unpacked
+ directory like this, either by copying it to the
+ <code>$CATALINA_BASE/webapps</code> directory, or by <em>installing</em>
+ it via the "Manager" web application. The latter approach is very
+ useful during development, and will be illustrated below.
+ <br><br></li>
+<li><strong>dist/</strong> - When you execute the <code>ant dist</code>
+ target, this directory will be created. It will create an exact image
+ of the binary distribution for your web application, including an license
+ information, documentation, and README files that you have prepared.</li>
+</ul>
+
+<p>Note that these two directories should <strong>NOT</strong> be archived in
+your source code control system, because they are deleted and recreated (from
+scratch) as needed during development. For that reason, you should not edit
+any source files in these directories if you want to maintain a permanent
+record of the changes, because the changes will be lost the next time that a
+build is performed.</p>
+
+ <div class="subsection"><h4 id="External_Dependencies">External Dependencies</h4><div class="text">
+
+ <p>What do you do if your application requires JAR files (or other
+ resources) from external projects or packages? A common example is that
+ you need to include a JDBC driver in your web application, in order to
+ operate.</p>
+
+ <p>Different developers take different approaches to this problem.
+ Some will encourage checking a copy of the JAR files you depend on into
+ the source code control archives for every application that requires those
+ JAR files. However, this can cause significant management issues when you
+ use the same JAR in many applications - particular when faced with a need
+ to upgrade to a different version of that JAR file.</p>
+
+ <p>Therefore, this manual recommends that you <strong>NOT</strong> store
+ a copy of the packages you depend on inside the source control archives
+ of your applications. Instead, the external dependencies should be
+ integrated as part of the process of <strong>building</strong> your
+ application. In that way, you can always pick up the appropriate version
+ of the JAR files from wherever your development system administrator has
+ installed them, without having to worry about updating your application
+ every time the version of the dependent JAR file is changed.</p>
+
+ <p>In the example Ant <code>build.xml</code> file, we will demonstrate
+ how to define <em>build properties</em> that let you configure the locations
+ of the files to be copied, without having to modify <code>build.xml</code>
+ when these files change. The build properties used by a particular
+ developer can be customized on a per-application basis, or defaulted to
+ "standard" build properties stored in the developer's home directory.</p>
+
+ <p>In many cases, your development system administrator will have already
+ installed the required JAR files into the <code>lib</code> directory of Tomcat.
+ If this has been done, you need
+ to take no actions at all - the example <code>build.xml</code> file
+ automatically constructs a compile classpath that includes these files.</p>
+
+ </div></div>
+
+</div><h3 id="Source_Code_Control">Source Code Control</h3><div class="text">
+
+<p>As mentioned earlier, it is highly recommended that you place all of the
+source files that comprise your application under the management of a
+source code control system like the Concurrent Version System (CVS). If you
+elect to do this, every directory and file in the source hierarchy should be
+registered and saved -- but none of the generated files. If you register
+binary format files (such as images or JAR libraries), be sure to indicate
+this to your source code control system.</p>
+
+<p>We recommended (in the previous section) that you should not store the
+contents of the <code>build/</code> and <code>dist/</code> directories
+created by your development process in the source code control system. An
+easy way to tell CVS to ignore these directories is to create a file named
+<code>.cvsignore</code> (note the leading period) in your top-level source
+directory, with the following contents:</p>
+<div class="codeBox"><pre><code>build
+dist
+build.properties</code></pre></div>
+
+<p>The reason for mentioning <code>build.properties</code> here will be
+explained in the <a href="processes.html">Processes</a> section.</p>
+
+<p>Detailed instructions for your source code control environment are beyond
+the scope of this manual. However, the following steps are followed when
+using a command-line CVS client:</p>
+<ul>
+<li>To refresh the state of your source code to that stored in the
+ the source repository, go to your project source directory, and
+ execute <code>cvs update -dP</code>.
+ <br><br></li>
+<li>When you create a new subdirectory in the source code hierarchy, register
+ it in CVS with a command like <code>cvs add {subdirname}</code>.
+ <br><br></li>
+<li>When you first create a new source code file, navigate to the directory
+ that contains it, and register the new file with a command like
+ <code>cvs add {filename}</code>.
+ <br><br></li>
+<li>If you no longer need a particular source code file, navigate to the
+ containing directory and remove the file. Then, deregister it in CVS
+ with a command like <code>cvs remove {filename}</code>.
+ <br><br></li>
+<li>While you are creating, modifying, and deleting source files, changes
+ are not yet reflected in the server repository. To save your changes in
+ their current state, go to the project source directory
+ and execute <code>cvs commit</code>. You will be asked to write a brief
+ description of the changes you have just completed, which will be stored
+ with the new version of any updated source file.</li>
+</ul>
+
+<p>CVS, like other source code control systems, has many additional features
+(such as the ability to tag the files that made up a particular release, and
+support for multiple development branches that can later be merged). See the
+links and references in the <a href="introduction.html">Introduction</a> for
+more information.</p>
+
+</div><h3 id="BUILD.XML_Configuration_File">BUILD.XML Configuration File</h3><div class="text">
+
+<p>We will be using the <strong>ant</strong> tool to manage the compilation of
+our Java source code files, and creation of the deployment hierarchy. Ant
+operates under the control of a build file, normally called
+<code>build.xml</code>, that defines the processing steps required. This
+file is stored in the top-level directory of your source code hierarchy, and
+should be checked in to your source code control system.</p>
+
+<p>Like a Makefile, the <code>build.xml</code> file provides several
+"targets" that support optional development activities (such as creating
+the associated Javadoc documentation, erasing the deployment home directory
+so you can build your project from scratch, or creating the web application
+archive file so you can distribute your application. A well-constructed
+<code>build.xml</code> file will contain internal documentation describing
+the targets that are designed for use by the developer, versus those targets
+used internally. To ask Ant to display the project documentation, change to
+the directory containing the <code>build.xml</code> file and type:</p>
+<div class="codeBox"><pre><code>ant -projecthelp</code></pre></div>
+
+<p>To give you a head start, a <a href="build.xml.txt">basic build.xml file</a>
+is provided that you can customize and install in the project source directory
+for your application. This file includes comments that describe the various
+targets that can be executed. Briefly, the following targets are generally
+provided:</p>
+<ul>
+<li><strong>clean</strong> - This target deletes any existing
+ <code>build</code> and <code>dist</code> directories, so that they
+ can be reconstructed from scratch. This allows you to guarantee that
+ you have not made source code modifications that will result in
+ problems at runtime due to not recompiling all affected classes.
+ <br><br></li>
+<li><strong>compile</strong> - This target is used to compile any source code
+ that has been changed since the last time compilation took place. The
+ resulting class files are created in the <code>WEB-INF/classes</code>
+ subdirectory of your <code>build</code> directory, exactly where the
+ structure of a web application requires them to be. Because
+ this command is executed so often during development, it is normally
+ made the "default" target so that a simple <code>ant</code> command will
+ execute it.
+ <br><br></li>
+<li><strong>all</strong> - This target is a short cut for running the
+ <code>clean</code> target, followed by the <code>compile</code> target.
+ Thus, it guarantees that you will recompile the entire application, to
+ ensure that you have not unknowingly introduced any incompatible changes.
+ <br><br></li>
+<li><strong>javadoc</strong> - This target creates Javadoc API documentation
+ for the Java classes in this web application. The example
+ <code>build.xml</code> file assumes you want to include the API
+ documentation with your app distribution, so it generates the docs
+ in a subdirectory of the <code>dist</code> directory. Because you normally
+ do not need to generate the Javadocs on every compilation, this target is
+ usually a dependency of the <code>dist</code> target, but not of the
+ <code>compile</code> target.
+ <br><br></li>
+<li><strong>dist</strong> - This target creates a distribution directory for
+ your application, including any required documentation, the Javadocs for
+ your Java classes, and a web application archive (WAR) file that will be
+ delivered to system administrators who wish to install your application.
+ Because this target also depends on the <code>deploy</code> target, the
+ web application archive will have also picked up any external dependencies
+ that were included at deployment time.</li>
+</ul>
+
+<p>For interactive development and testing of your web application using
+Tomcat, the following additional targets are defined:</p>
+<ul>
+<li><strong>install</strong> - Tell the currently running Tomcat to make
+ the application you are developing immediately available for execution
+ and testing. This action does not require Tomcat to be restarted, but
+ it is also not remembered after Tomcat is restarted the next time.
+ <br><br></li>
+<li><strong>reload</strong> - Once the application is installed, you can
+ continue to make changes and recompile using the <code>compile</code>
+ target. Tomcat will automatically recognize changes made to JSP pages,
+ but not to servlet or JavaBean classes - this command will tell Tomcat
+ to restart the currently installed application so that such changes are
+ recognized.
+ <br><br></li>
+<li><strong>remove</strong> - When you have completed your development and
+ testing activities, you can optionally tell Tomcat to remove this
+ application from service.
+ </li>
+</ul>
+
+<p>Using the development and testing targets requires some additional
+one-time setup that is described on the next page.</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/appdev/web.xml.txt b/web/tomcat/webapps/docs/appdev/web.xml.txt
new file mode 100644
index 0000000..8f07916
--- /dev/null
+++ b/web/tomcat/webapps/docs/appdev/web.xml.txt
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!DOCTYPE web-app
+ PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+ "http://java.sun.com/dtd/web-app_2_3.dtd">
+
+<web-app>
+
+
+ <!-- General description of your web application -->
+
+ <display-name>My Web Application</display-name>
+ <description>
+ This is version X.X of an application to perform
+ a wild and wonderful task, based on servlets and
+ JSP pages. It was written by Dave Developer
+ (dave@mycompany.com), who should be contacted for
+ more information.
+ </description>
+
+
+ <!-- Context initialization parameters that define shared
+ String constants used within your application, which
+ can be customized by the system administrator who is
+ installing your application. The values actually
+ assigned to these parameters can be retrieved in a
+ servlet or JSP page by calling:
+
+ String value =
+ getServletContext().getInitParameter("name");
+
+ where "name" matches the <param-name> element of
+ one of these initialization parameters.
+
+ You can define any number of context initialization
+ parameters, including zero.
+ -->
+
+ <context-param>
+ <param-name>webadmin</param-name>
+ <param-value>myaddress@mycompany.com</param-value>
+ <description>
+ The EMAIL address of the administrator to whom questions
+ and comments about this application should be addressed.
+ </description>
+ </context-param>
+
+
+ <!-- Servlet definitions for the servlets that make up
+ your web application, including initialization
+ parameters. With Tomcat, you can also send requests
+ to servlets not listed here with a request like this:
+
+ http://localhost:8080/{context-path}/servlet/{classname}
+
+ but this usage is not guaranteed to be portable. It also
+ makes relative references to images and other resources
+ required by your servlet more complicated, so defining
+ all of your servlets (and defining a mapping to them with
+ a servlet-mapping element) is recommended.
+
+ Servlet initialization parameters can be retrieved in a
+ servlet or JSP page by calling:
+
+ String value =
+ getServletConfig().getInitParameter("name");
+
+ where "name" matches the <param-name> element of
+ one of these initialization parameters.
+
+ You can define any number of servlets, including zero.
+ -->
+
+ <servlet>
+ <servlet-name>controller</servlet-name>
+ <description>
+ This servlet plays the "controller" role in the MVC architecture
+ used in this application. It is generally mapped to the ".do"
+ filename extension with a servlet-mapping element, and all form
+ submits in the app will be submitted to a request URI like
+ "saveCustomer.do", which will therefore be mapped to this servlet.
+
+ The initialization parameter names for this servlet are the
+ "servlet path" that will be received by this servlet (after the
+ filename extension is removed). The corresponding value is the
+ name of the action class that will be used to process this request.
+ </description>
+ <servlet-class>com.mycompany.mypackage.ControllerServlet</servlet-class>
+ <init-param>
+ <param-name>listOrders</param-name>
+ <param-value>com.mycompany.myactions.ListOrdersAction</param-value>
+ </init-param>
+ <init-param>
+ <param-name>saveCustomer</param-name>
+ <param-value>com.mycompany.myactions.SaveCustomerAction</param-value>
+ </init-param>
+ <!-- Load this servlet at server startup time -->
+ <load-on-startup>5</load-on-startup>
+ </servlet>
+
+ <servlet>
+ <servlet-name>graph</servlet-name>
+ <description>
+ This servlet produces GIF images that are dynamically generated
+ graphs, based on the input parameters included on the request.
+ It is generally mapped to a specific request URI like "/graph".
+ </description>
+ </servlet>
+
+
+ <!-- Define mappings that are used by the servlet container to
+ translate a particular request URI (context-relative) to a
+ particular servlet. The examples below correspond to the
+ servlet descriptions above. Thus, a request URI like:
+
+ http://localhost:8080/{contextpath}/graph
+
+ will be mapped to the "graph" servlet, while a request like:
+
+ http://localhost:8080/{contextpath}/saveCustomer.do
+
+ will be mapped to the "controller" servlet.
+
+ You may define any number of servlet mappings, including zero.
+ It is also legal to define more than one mapping for the same
+ servlet, if you wish to.
+ -->
+
+ <servlet-mapping>
+ <servlet-name>controller</servlet-name>
+ <url-pattern>*.do</url-pattern>
+ </servlet-mapping>
+
+ <servlet-mapping>
+ <servlet-name>graph</servlet-name>
+ <url-pattern>/graph</url-pattern>
+ </servlet-mapping>
+
+
+ <!-- Define the default session timeout for your application,
+ in minutes. From a servlet or JSP page, you can modify
+ the timeout for a particular session dynamically by using
+ HttpSession.getMaxInactiveInterval(). -->
+
+ <session-config>
+ <session-timeout>30</session-timeout> <!-- 30 minutes -->
+ </session-config>
+
+
+</web-app>
diff --git a/web/tomcat/webapps/docs/apr.html b/web/tomcat/webapps/docs/apr.html
new file mode 100644
index 0000000..1b6760b
--- /dev/null
+++ b/web/tomcat/webapps/docs/apr.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Apache Portable Runtime (APR) based Native library for Tomcat</title><meta name="author" content="Remy Maucherat"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Portable Runtime (APR) based Native library for Tomcat</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Installation">Installation</a><ol><li><a href="#Windows">Windows</a></li><li><a href="#Linux">Linux</a></li></ol></li><li><a href="#APR_Components">APR Components</a></li><li><a href="#APR_Lifecycle_Listener_Configuration">APR Lifecycle Listener Configuration</a></li><li><a href="#APR_Connectors_Configuration">APR Connectors Configuration</a><ol><li><a href="#HTTP/HTTPS">HTTP/HTTPS</a></li><li><a href="#AJP">AJP</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>
+ Tomcat can use the <a href="https://apr.apache.org/">Apache Portable Runtime</a> to
+ provide superior scalability, performance, and better integration with native server
+ technologies. The Apache Portable Runtime is a highly portable library that is at
+ the heart of Apache HTTP Server 2.x. APR has many uses, including access to advanced IO
+ functionality (such as sendfile, epoll and OpenSSL), OS level functionality (random number
+ generation, system status, etc), and native process handling (shared memory, NT
+ pipes and Unix sockets).
+ </p>
+
+ <p>
+ These features allows making Tomcat a general purpose webserver, will enable much better
+ integration with other native web technologies, and overall make Java much more viable as
+ a full fledged webserver platform rather than simply a backend focused technology.
+ </p>
+
+ </div><h3 id="Installation">Installation</h3><div class="text">
+
+ <p>
+ APR support requires three main native components to be installed:
+ </p>
+ <ul>
+ <li>APR library</li>
+ <li>JNI wrappers for APR used by Tomcat (libtcnative)</li>
+ <li>OpenSSL libraries</li>
+ </ul>
+
+ <div class="subsection"><h4 id="Windows">Windows</h4><div class="text">
+
+ <p>
+ Windows binaries are provided for tcnative-1, which is a statically compiled .dll which includes
+ OpenSSL and APR. It can be downloaded from <a href="https://tomcat.apache.org/download-native.cgi">here</a>
+ as 32bit or AMD x86-64 binaries.
+ In security conscious production environments, it is recommended to use separate shared dlls
+ for OpenSSL, APR, and libtcnative-1, and update them as needed according to security bulletins.
+ Windows OpenSSL binaries are linked from the <a href="https://www.openssl.org">Official OpenSSL
+ website</a> (see related/binaries).
+ </p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Linux">Linux</h4><div class="text">
+
+ <p>
+ Most Linux distributions will ship packages for APR and OpenSSL. The JNI wrapper (libtcnative) will
+ then have to be compiled. It depends on APR, OpenSSL, and the Java headers.
+ </p>
+
+ <p>
+ Requirements:
+ </p>
+ <ul>
+ <li>APR 1.2+ development headers (libapr1-dev package)</li>
+ <li>OpenSSL 1.0.2+ development headers (libssl-dev package)</li>
+ <li>JNI headers from Java compatible JDK 1.4+</li>
+ <li>GNU development environment (gcc, make)</li>
+ </ul>
+
+ <p>
+ The wrapper library sources are located in the Tomcat binary bundle, in the
+ <code>bin/tomcat-native.tar.gz</code> archive.
+ Once the build environment is installed and the source archive is extracted, the wrapper library
+ can be compiled using (from the folder containing the configure script):
+ </p>
+ <div class="codeBox"><pre><code>./configure && make && make install</code></pre></div>
+
+ </div></div>
+
+ </div><h3 id="APR_Components">APR Components</h3><div class="text">
+
+ <p>
+ Once the libraries are properly installed and available to Java (if loading fails, the library path
+ will be displayed), the Tomcat connectors will automatically use APR. Configuration of the connectors
+ is similar to the regular connectors, but have a few extra attributes which are used to configure
+ APR components. Note that the defaults should be well tuned for most use cases, and additional
+ tweaking shouldn't be required.
+ </p>
+
+ <p>
+ When APR is enabled, the following features are also enabled in Tomcat:
+ </p>
+ <ul>
+ <li>Secure session ID generation by default on all platforms (platforms other than Linux required
+ random number generation using a configured entropy)</li>
+ <li>OS level statistics on memory usage and CPU usage by the Tomcat process are displayed by
+ the status servlet</li>
+ </ul>
+
+ </div><h3 id="APR_Lifecycle_Listener_Configuration">APR Lifecycle Listener Configuration</h3><div class="text">
+ <p>See <a href="config/listeners.html#APR_Lifecycle_Listener_-_org.apache.catalina.core.AprLifecycleListener">the
+ listener configuration</a>.</p>
+ </div><h3 id="APR_Connectors_Configuration">APR Connectors Configuration</h3><div class="text">
+
+ <div class="subsection"><h4 id="HTTP/HTTPS">HTTP/HTTPS</h4><div class="text">
+
+ <p>For HTTP configuration, see the <a href="config/http.html">HTTP</a>
+ connector configuration documentation.</p>
+
+ <p>For HTTPS configuration, see the
+ <a href="config/http.html#SSL_Support">HTTPS</a> connector configuration
+ documentation.</p>
+
+ <p>An example SSL Connector declaration is:</p>
+ <div class="codeBox"><pre><code><Connector port="443" maxHttpHeaderSize="8192"
+ maxThreads="150"
+ enableLookups="false" disableUploadTimeout="true"
+ acceptCount="100" scheme="https" secure="true"
+ SSLEnabled="true"
+ SSLCertificateFile="${catalina.base}/conf/localhost.crt"
+ SSLCertificateKeyFile="${catalina.base}/conf/localhost.key" /></code></pre></div>
+
+
+ </div></div>
+
+ <div class="subsection"><h4 id="AJP">AJP</h4><div class="text">
+
+ <p>For AJP configuration, see the <a href="config/ajp.html">AJP</a>
+ connector configuration documentation.</p>
+
+ </div></div>
+
+ </div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/architecture/index.html b/web/tomcat/webapps/docs/architecture/index.html
new file mode 100644
index 0000000..8fb5cb1
--- /dev/null
+++ b/web/tomcat/webapps/docs/architecture/index.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Architecture (8.5.73) - Table of Contents</title><meta name="author" content="Yoav Shapira"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Architecture</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Architecture Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="overview.html">Overview</a></li><li><a href="startup.html">Server Startup</a></li><li><a href="requestProcess.html">Request Process</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Table of Contents</h2><h3 id="Preface">Preface</h3><div class="text">
+
+<p>This section of the Tomcat documentation attempts to explain
+the architecture and design of the Tomcat server. It includes significant
+contributions from several tomcat developers:
+</p>
+<ul>
+<li>Yoav Shapira
+ (<a href="mailto:yoavs@apache.org">yoavs@apache.org</a>)</li>
+<li>Jeanfrancois Arcand
+ (<a href="mailto:jfarcand@apache.org">jfarcand@apache.org</a>)</li>
+<li>Filip Hanik
+ (<a href="mailto:fhanik@apache.org">fhanik@apache.org</a>)</li>
+</ul>
+
+</div><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+
+<p>The information presented is divided into the following sections:</p>
+<ul>
+<li><a href="overview.html"><strong>Overview</strong></a> -
+ An overview of the Tomcat server architecture with key terms
+ and concepts.</li>
+<li><a href="startup.html"><strong>Server Startup</strong></a> -
+ A detailed description, with sequence diagrams, of how the Tomcat
+ server starts up.</li>
+<li><a href="requestProcess.html"><strong>Request Process Flow</strong></a> -
+ A detailed description of how Tomcat handles a request.</li>
+</ul>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/architecture/overview.html b/web/tomcat/webapps/docs/architecture/overview.html
new file mode 100644
index 0000000..c502fbd
--- /dev/null
+++ b/web/tomcat/webapps/docs/architecture/overview.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Architecture (8.5.73) - Architecture Overview</title><meta name="author" content="Yoav Shapira"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Architecture</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Architecture Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="overview.html">Overview</a></li><li><a href="startup.html">Server Startup</a></li><li><a href="requestProcess.html">Request Process</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Architecture Overview</h2><h3 id="Overview">Overview</h3><div class="text">
+<p>
+This page provides an overview of the Tomcat server architecture.
+</p>
+</div><h3 id="Terms">Terms</h3><div class="text">
+
+<div class="subsection"><h4 id="Server">Server</h4><div class="text">
+<p>
+In the Tomcat world, a
+<a href="../config/server.html">Server</a> represents the whole container.
+Tomcat provides a default implementation of the
+<a href="../api/org/apache/catalina/Server.html">Server interface</a>
+which is rarely customized by users.
+</p>
+</div></div>
+
+<div class="subsection"><h4 id="Service">Service</h4><div class="text">
+<p>
+A <a href="../config/service.html">Service</a> is an intermediate component
+which lives inside a Server and ties one or more Connectors to exactly one
+Engine. The Service element is rarely customized by users, as the default
+implementation is simple and sufficient:
+<a href="../api/org/apache/catalina/Service.html">Service interface</a>.
+</p>
+</div></div>
+
+<div class="subsection"><h4 id="Engine">Engine</h4><div class="text">
+<p>
+An
+<a href="../config/engine.html">Engine</a> represents request processing
+pipeline for a specific Service. As a Service may have multiple Connectors,
+the Engine receives and processes all requests from these connectors, handing
+the response back to the appropriate connector for transmission to the client.
+The <a href="../api/org/apache/catalina/Engine.html">Engine interface</a>
+may be implemented to supply custom Engines, though this is uncommon.
+</p>
+<p>
+Note that the Engine may be used for Tomcat server clustering via the
+jvmRoute parameter. Read the Clustering documentation for more information.
+</p>
+</div></div>
+
+<div class="subsection"><h4 id="Host">Host</h4><div class="text">
+<p>
+A <a href="../config/host.html">Host</a> is an association of a network name,
+e.g. www.yourcompany.com, to the Tomcat server. An Engine may contain
+multiple hosts, and the Host element also supports network aliases such as
+yourcompany.com and abc.yourcompany.com. Users rarely create custom
+<a href="../api/org/apache/catalina/Host.html">Hosts</a>
+because the
+<a href="../api/org/apache/catalina/core/StandardHost.html">StandardHost
+implementation</a> provides significant additional functionality.
+</p>
+</div></div>
+
+<div class="subsection"><h4 id="Connector">Connector</h4><div class="text">
+<p>
+A Connector handles communications with the client. There are multiple
+connectors available with Tomcat. These include the
+<a href="../config/http.html">HTTP connector</a> which is used for
+most HTTP traffic, especially when running Tomcat as a standalone server,
+and the <a href="../config/ajp.html">AJP connector</a> which implements
+the AJP protocol used when connecting Tomcat to a web server such as
+Apache HTTPD server. Creating a customized connector is a significant
+effort.
+</p>
+</div></div>
+
+<div class="subsection"><h4 id="Context">Context</h4><div class="text">
+<p>
+A
+<a href="../config/context.html">Context</a>
+represents a web application. A Host may contain multiple
+contexts, each with a unique path. The
+<a href="../api/org/apache/catalina/Context.html">Context
+interface</a> may be implemented to create custom Contexts, but
+this is rarely the case because the
+<a href="../api/org/apache/catalina/core/StandardContext.html">
+StandardContext</a> provides significant additional functionality.
+</p>
+</div></div>
+</div><h3 id="Comments">Comments</h3><div class="text">
+<p>
+Tomcat is designed to be a fast and efficient implementation of the
+Servlet Specification. Tomcat came about as the reference implementation
+of this specification, and has remained rigorous in adhering to the
+specification. At the same time, significant attention has been paid
+to Tomcat's performance and it is now on par with other servlet containers,
+including commercial ones.
+</p>
+<p>
+In recent releases of Tomcat, mostly starting with Tomcat 5,
+we have begun efforts to make more aspects of Tomcat manageable via
+JMX. In addition, the Manager and Admin webapps have been greatly
+enhanced and improved. Manageability is a primary area of concern
+for us as the product matures and the specification becomes more
+stable.
+</p>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/architecture/requestProcess.html b/web/tomcat/webapps/docs/architecture/requestProcess.html
new file mode 100644
index 0000000..ce32cf9
--- /dev/null
+++ b/web/tomcat/webapps/docs/architecture/requestProcess.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Architecture (8.5.73) - Request Process Flow</title><meta name="author" content="Yoav Shapira"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Architecture</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Architecture Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="overview.html">Overview</a></li><li><a href="startup.html">Server Startup</a></li><li><a href="requestProcess.html">Request Process</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Request Process Flow</h2><h3 id="Request_Process_Flow">Request Process Flow</h3><div class="text">
+
+<p>
+This page describes the process used by Tomcat to handle
+an incoming request. This process is largely defined by
+the Servlet Specification, which outlines the order
+of events that must take place.
+</p>
+
+<div class="subsection"><h4 id="description">description</h4><div class="text">
+<p>
+TODO
+</p>
+</div></div>
+
+<div class="subsection"><h4 id="diagrams">diagrams</h4><div class="text">
+<p>
+A UML sequence diagram of the request process is available
+<a href="requestProcess/request-process.png">here.</a>
+</p>
+<p>
+A UML sequence diagram of the authentication process is available
+<a href="requestProcess/authentication-process.png">here.</a>
+</p>
+
+</div></div>
+
+<div class="subsection"><h4 id="comments">comments</h4><div class="text">
+<p>
+The Servlet Specification provides many opportunities for
+listening in (using Listeners) or modifying (using Filters)
+the request handling process even before the request arrives
+at the servlet that will handle it.
+</p>
+
+</div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/architecture/requestProcess/authentication-process.png b/web/tomcat/webapps/docs/architecture/requestProcess/authentication-process.png
new file mode 100644
index 0000000..e23c333
--- /dev/null
+++ b/web/tomcat/webapps/docs/architecture/requestProcess/authentication-process.png
Binary files differ
diff --git a/web/tomcat/webapps/docs/architecture/requestProcess/request-process.png b/web/tomcat/webapps/docs/architecture/requestProcess/request-process.png
new file mode 100644
index 0000000..33ae3c3
--- /dev/null
+++ b/web/tomcat/webapps/docs/architecture/requestProcess/request-process.png
Binary files differ
diff --git a/web/tomcat/webapps/docs/architecture/startup.html b/web/tomcat/webapps/docs/architecture/startup.html
new file mode 100644
index 0000000..8e5001a
--- /dev/null
+++ b/web/tomcat/webapps/docs/architecture/startup.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Architecture (8.5.73) - Startup</title><meta name="author" content="Yoav Shapira"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Architecture</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Architecture Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="overview.html">Overview</a></li><li><a href="startup.html">Server Startup</a></li><li><a href="requestProcess.html">Request Process</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Startup</h2><h3 id="Server_Startup">Server Startup</h3><div class="text">
+
+<p>
+This page describes how the Tomcat server starts up. There are several
+different ways to start tomcat, including:
+</p>
+<ul>
+ <li>From the command line.</li>
+ <li>From a Java program as an embedded server.</li>
+ <li>Automatically as a Windows service.</li>
+</ul>
+
+<div class="subsection"><h4 id="description">description</h4><div class="text">
+<p>
+A text description of the startup procedure is available
+<a href="startup/serverStartup.txt">here.</a>
+</p>
+</div></div>
+
+<div class="subsection"><h4 id="diagram">diagram</h4><div class="text">
+<p>
+A UML sequence diagram of the startup procedure is available
+<a href="startup/serverStartup.pdf">here.</a>
+</p>
+</div></div>
+
+<div class="subsection"><h4 id="comments">comments</h4><div class="text">
+<p>
+The startup process can be customized in many ways, both
+by modifying Tomcat code and by implementing your own
+LifecycleListeners which are then registered in the server.xml
+configuration file.
+</p>
+
+</div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/architecture/startup/serverStartup.pdf b/web/tomcat/webapps/docs/architecture/startup/serverStartup.pdf
new file mode 100644
index 0000000..34aa598
--- /dev/null
+++ b/web/tomcat/webapps/docs/architecture/startup/serverStartup.pdf
Binary files differ
diff --git a/web/tomcat/webapps/docs/architecture/startup/serverStartup.txt b/web/tomcat/webapps/docs/architecture/startup/serverStartup.txt
new file mode 100644
index 0000000..c7c8c0d
--- /dev/null
+++ b/web/tomcat/webapps/docs/architecture/startup/serverStartup.txt
@@ -0,0 +1,139 @@
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+Tomcat Startup Sequence
+
+Sequence 1. Start from Command Line
+Class: org.apache.catalina.startup.Bootstrap
+What it does:
+ a) Set up classloaders
+ commonLoader (common)-> System Loader
+ sharedLoader (shared)-> commonLoader -> System Loader
+ catalinaLoader(server) -> commonLoader -> System Loader
+ (by default the commonLoader is used for the
+ sharedLoader and the serverLoader)
+ b) Load startup class (reflection)
+ org.apache.catalina.startup.Catalina
+ setParentClassloader -> sharedLoader
+ Thread.contextClassloader -> catalinaLoader
+ c) Bootstrap.daemon.init() complete
+
+Sequence 2. Process command line argument (start, stop)
+Class: org.apache.catalina.startup.Bootstrap (assume command->start)
+What it does:
+ a) Catalina.setAwait(true);
+ b) Catalina.load()
+ b1) initDirs() -> set properties like
+ catalina.home
+ catalina.base == catalina.home (most cases)
+ b2) initNaming
+ setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY,
+ org.apache.naming.java.javaURLContextFactory ->default)
+ b3) createStartDigester()
+ Configures a digester for the main server.xml elements like
+ org.apache.catalina.core.StandardServer (can change of course :)
+ org.apache.catalina.deploy.NamingResources
+ Stores naming resources in the J2EE JNDI tree
+ org.apache.catalina.LifecycleListener
+ implements events for start/stop of major components
+ org.apache.catalina.core.StandardService
+ The single entry for a set of connectors,
+ so that a container can listen to multiple connectors
+ ie, single entry
+ org.apache.catalina.Connector
+ Connectors to listen for incoming requests only
+ It also adds the following rulesets to the digester
+ NamingRuleSet
+ EngineRuleSet
+ HostRuleSet
+ ContextRuleSet
+ b4) Load the server.xml and parse it using the digester
+ Parsing the server.xml using the digester is an automatic
+ XML-object mapping tool, that will create the objects defined in server.xml
+ Startup of the actual container has not started yet.
+ b5) Assigns System.out and System.err to the SystemLogHandler class
+ b6) Calls initialize on all components, this makes each object register itself with the
+ JMX agent.
+ During the process call the Connectors also initialize the adapters.
+ The adapters are the components that do the request pre-processing.
+ Typical adapters are HTTP1.1 (default if no protocol is specified,
+ org.apache.coyote.http11.Http11NioProtocol)
+ AJP1.3 for mod_jk etc.
+
+ c) Catalina.start()
+ c1) Starts the NamingContext and binds all JNDI references into it
+ c2) Starts the services under <Server> which are:
+ StandardService -> starts Engine (ContainerBase -> Realm,Cluster etc)
+ c3) StandardHost (started by the service)
+ Configures an ErrorReportValve to do proper HTML output for different HTTP
+ errors codes
+ Starts the Valves in the pipeline (at least the ErrorReportValve)
+ Configures the StandardHostValve,
+ this valves ties the Webapp Class loader to the thread context
+ it also finds the session for the request
+ and invokes the context pipeline
+ Starts the HostConfig component
+ This component deploys all the webapps
+ (webapps & conf/Catalina/localhost/*.xml)
+ HostConfig will create a Digester for your context, this digester
+ will then invoke ContextConfig.start()
+ The ContextConfig.start() will process the default web.xml (conf/web.xml)
+ and then process the applications web.xml (WEB-INF/web.xml)
+
+ c4) During the lifetime of the container (StandardEngine) there is a background thread that
+ keeps checking if the context has changed. If a context changes (timestamp of war file,
+ context xml file, web.xml) then a reload is issued (stop/remove/deploy/start)
+
+ d) Tomcat receives a request on an HTTP port
+ d1) The request is received by a separate thread which is waiting in the ThreadPoolExecutor
+ class. It is waiting for a request in a regular ServerSocket.accept() method.
+ When a request is received, this thread wakes up.
+ d2) The ThreadPoolExecutor assigns the a TaskThread to handle the request.
+ It also supplies a JMX object name to the catalina container (not used I believe)
+ d3) The processor to handle the request in this case is Coyote Http11Processor,
+ and the process method is invoked.
+ This same processor is also continuing to check the input stream of the socket
+ until the keep alive point is reached or the connection is disconnected.
+ d4) The HTTP request is parsed using an internal buffer class (Http11InputBuffer)
+ The buffer class parses the request line, the headers, etc and store the result in a
+ Coyote request (not an HTTP request) This request contains all the HTTP info, such
+ as servername, port, scheme, etc.
+ d5) The processor contains a reference to an Adapter, in this case it is the
+ CoyoteAdapter. Once the request has been parsed, the Http11Processor
+ invokes service() on the adapter. In the service method, the Request contains a
+ CoyoteRequest and CoyoteResponse (null for the first time)
+ The CoyoteRequest(Response) implements HttpRequest(Response) and HttpServletRequest(Response)
+ The adapter parses and associates everything with the request, cookies, the context through a
+ Mapper, etc
+ d6) When the parsing is finished, the CoyoteAdapter invokes its container (StandardEngine)
+ and invokes the invoke(request,response) method.
+ This initiates the HTTP request into the Catalina container starting at the engine level
+ d7) The StandardEngine.invoke() simply invokes the container pipeline.invoke()
+ d8) By default the engine only has one valve the StandardEngineValve, this valve simply
+ invokes the invoke() method on the Host pipeline (StandardHost.getPipeLine())
+ d9) the StandardHost has two valves by default, the StandardHostValve and the ErrorReportValve
+ d10) The standard host valve associates the correct class loader with the current thread
+ It also retrieves the Manager and the session associated with the request (if there is one)
+ If there is a session access() is called to keep the session alive
+ d11) After that the StandardHostValve invokes the pipeline on the context associated
+ with the request.
+ d12) The first valve that gets invoked by the Context pipeline is the FormAuthenticator
+ valve. Then the StandardContextValve gets invoke.
+ The StandardContextValve invokes any context listeners associated with the context.
+ Next it invokes the pipeline on the Wrapper component (StandardWrapperValve)
+ d13) During the invocation of the StandardWrapperValve, the JSP wrapper (Jasper) gets invoked
+ This results in the actual compilation of the JSP.
+ And then invokes the actual servlet.
+ e) Invocation of the servlet class
diff --git a/web/tomcat/webapps/docs/balancer-howto.html b/web/tomcat/webapps/docs/balancer-howto.html
new file mode 100644
index 0000000..0c08ecc
--- /dev/null
+++ b/web/tomcat/webapps/docs/balancer-howto.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Load Balancer How-To</title><meta name="author" content="Yoav Shapira"><meta name="author" content="Remy Maucherat"><meta name="author" content="Andy Oliver"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Load Balancer How-To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Using_the_JK_1.2.x_native_connector">Using the JK 1.2.x native connector</a></li><li><a href="#Using_Apache_HTTP_Server_2.x_with_mod_proxy">Using Apache HTTP Server 2.x with mod_proxy</a></li></ul>
+</div><h3 id="Using_the_JK_1.2.x_native_connector">Using the JK 1.2.x native connector</h3><div class="text">
+
+Please refer to the JK 1.2.x documentation.
+
+</div><h3 id="Using_Apache_HTTP_Server_2.x_with_mod_proxy">Using Apache HTTP Server 2.x with mod_proxy</h3><div class="text">
+
+Please refer to the mod_proxy documentation for Apache HTTP Server 2.2. This supports either
+HTTP or AJP load balancing. This new version of mod_proxy is also usable with
+Apache HTTP Server 2.0, but mod_proxy will have to be compiled separately using the code
+from Apache HTTP Server 2.2.
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/building.html b/web/tomcat/webapps/docs/building.html
new file mode 100644
index 0000000..bac6774
--- /dev/null
+++ b/web/tomcat/webapps/docs/building.html
@@ -0,0 +1,236 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Building Tomcat</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Building Tomcat</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Download_a_Java_Development_Kit_(JDK)_version_7">Download a Java Development Kit (JDK) version 7</a></li><li><a href="#Install_Apache_Ant_1.9.10_or_later">Install Apache Ant 1.9.10 or later</a></li><li><a href="#Checkout_or_obtain_the_Tomcat_source_code">Checkout or obtain the Tomcat source code</a></li><li><a href="#Configure_download_area">Configure download area</a></li><li><a href="#Building_Tomcat">Building Tomcat</a></li><li><a href="#Building_with_Eclipse">Building with Eclipse</a></li><li><a href="#Building_with_other_IDEs">Building with other IDEs</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+<p>
+Building Apache Tomcat from source is very easy, and is the first step to
+contributing to Tomcat. The complete and comprehensive instructions are
+provided in the file <a href="BUILDING.txt">BUILDING.txt</a>.
+The following is a quick step by step guide.
+</p>
+
+</div><h3 id="Download_a_Java_Development_Kit_(JDK)_version_7">Download a Java Development Kit (JDK) version 7</h3><div class="text">
+
+<p>
+Building Apache Tomcat requires a JDK (version 7) to be installed. You can download one from<br>
+<a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">http://www.oracle.com/technetwork/java/javase/downloads/index.html</a><br>
+<a href="http://openjdk.java.net/install/index.html">http://openjdk.java.net/install/index.html</a><br>
+or another JDK vendor.
+</p>
+
+<p>
+<b>IMPORTANT</b>: Set an environment variable JAVA_HOME to the pathname of the
+directory into which you installed the JDK release.
+</p>
+
+</div><h3 id="Install_Apache_Ant_1.9.10_or_later">Install Apache Ant 1.9.10 or later</h3><div class="text">
+
+<p>
+Download a binary distribution of Ant 1.9.10 or later from
+<a href="https://ant.apache.org/bindownload.cgi">here</a>.
+</p>
+
+<p>
+Unpack the binary distribution into a convenient location so that the
+Ant release resides in its own directory (conventionally named
+<code>apache-ant-1.9.x</code>). For the remainder of this guide,
+the symbolic name <code>${ant.home}</code> is used to refer to the full pathname of
+ the Ant installation directory.
+</p>
+
+<p>
+<b>IMPORTANT</b>: Create an ANT_HOME environment variable to point the directory <code>${ant.home}</code>,
+and modify the PATH environment variable to include directory
+<code>${ant.home}/bin</code> in its list. This makes the <code>ant</code> command line script
+available, which will be used to actually perform the build.
+</p>
+
+</div><h3 id="Checkout_or_obtain_the_Tomcat_source_code">Checkout or obtain the Tomcat source code</h3><div class="text">
+
+ <p>
+ Tomcat SVN repository URL:
+ <a href="https://svn.apache.org/repos/asf/tomcat/tc8.5.x/trunk/">https://svn.apache.org/repos/asf/tomcat/tc8.5.x/trunk/</a>
+ </p>
+ <p>
+ Tomcat source packages:
+ <a href="https://tomcat.apache.org/download-80.cgi">https://tomcat.apache.org/download-80.cgi</a>.
+ </p>
+
+ <p>
+ Checkout the source using SVN, selecting a tag for released version or
+ trunk for the current development code, or download and unpack a
+ source package. For the remainder of this guide, the symbolic name
+ <code>${tomcat.source}</code> is used to refer to the
+ location where the source has been placed.
+ </p>
+
+</div><h3 id="Configure_download_area">Configure download area</h3><div class="text">
+
+<p>
+ Building Tomcat involves downloading a number of libraries that it depends on.
+ It is strongly recommended to configure download area for those libraries.
+</p>
+
+<p>
+ By default the build is configured to download the dependencies into the
+ <code>${user.home}/tomcat-build-libs</code> directory. You can change this
+ (see below) but it must be an absolute path.
+</p>
+
+<p>
+ The build is controlled by creating a
+ <code>${tomcat.source}/build.properties</code> file. It can be used to
+ redefine any property that is present in <code>build.properties.default</code>
+ and <code>build.xml</code> files. The <code>build.properties</code> file
+ does not exist by default. You have to create it.
+</p>
+
+<p>
+ The download area is defined by property <code>base.path</code>. For example:
+</p>
+
+<div class="codeBox"><pre><code># ----- Default Base Path for Dependent Packages -----
+# Replace this path with the directory path where
+# dependencies binaries should be downloaded.
+base.path=/home/me/some-place-to-download-to</code></pre></div>
+
+<p>
+ Different versions of Tomcat are allowed to share the same download area.
+</p>
+
+<p>
+ Another example:
+</p>
+
+<div class="codeBox"><pre><code>base.path=${user.dir}/../libraries-tomcat8.5</code></pre></div>
+
+<p>
+ Users who access the Internet through a proxy must use the properties
+ file to indicate to Ant the proxy configuration:
+</p>
+
+<div class="codeBox"><pre><code># ----- Proxy setup -----
+proxy.host=proxy.domain
+proxy.port=8080
+proxy.use=on</code></pre></div>
+
+</div><h3 id="Building_Tomcat">Building Tomcat</h3><div class="text">
+
+<p>
+Use the following commands to build Tomcat:
+</p>
+
+<p>
+<code>cd ${tomcat.source}</code><br>
+<code>ant</code>
+</p>
+
+<p>
+Once the build has completed successfully, a usable Tomcat installation will have been
+produced in the <code>${tomcat.source}/output/build</code> directory, and can be started
+and stopped with the usual scripts.
+</p>
+</div><h3 id="Building_with_Eclipse">Building with Eclipse</h3><div class="text">
+
+<p>
+<b>IMPORTANT:</b> This is not a supported means of building Tomcat; this information is
+provided without warranty :-).
+The only supported means of building Tomcat is with the Ant build described above.
+However, some developers like to work on Java code with a Java IDE,
+and the following steps have been used by some developers.
+</p>
+
+<p>
+<b>NOTE:</b> This will not let you build everything under Eclipse;
+the build process requires use of Ant for the many stages that aren't
+simple Java compilations.
+However, it will allow you to view and edit the Java code,
+get warnings, reformat code, perform refactorings, run Tomcat
+under the IDE, and so on.
+</p>
+
+<p>
+<b>WARNING:</b> Do not forget to create and configure
+ <code>${tomcat.source}/build.properties</code> file as described above
+ before running any Ant targets.
+</p>
+
+<p>
+Sample Eclipse project files and launch targets are provided in the
+<code>res/ide-support/eclipse</code> directory of the source tree.
+The instructions below will automatically copy these into the required locations.
+</p>
+<p>
+An Ant target is provided as a convenience to download all binary dependencies, and to create
+the Eclipse project and classpath files in the root of the source tree.
+</p>
+
+<p>
+<code>cd ${tomcat.source}</code><br>
+<code>ant ide-eclipse</code>
+</p>
+
+<p>
+Start Eclipse and create a new Workspace.
+</p>
+
+<p>
+Open the <em>Preferences</em> dialog and then select <em>Java->Build Path->Classpath
+Variables</em> to add two new <em>Classpath Variables</em>:
+</p>
+
+
+<table class="defaultTable">
+ <tr><td>TOMCAT_LIBS_BASE</td><td>The same location as the <code>base.path</code>
+ setting in <code>build.properties</code>, where the binary dependencies have been downloaded</td></tr>
+ <tr><td>ANT_HOME</td><td>the base path of Ant 1.9.10 or later</td></tr>
+</table>
+
+
+<p>
+Use <em>File->Import</em> and choose <em>Existing Projects into Workspace</em>.
+From there choose the root directory of the Tomcat source tree (<code>${tomcat.source}</code>)
+and import the Tomcat project located there.
+</p>
+
+<p>
+<code>start-tomcat</code> and <code>stop-tomcat</code> launch configurations are provided in
+<code>res/ide-support/eclipse</code> and will be available in the <em>Run->Run Configurations</em>
+dialog. Use these to start and stop Tomcat from Eclipse.
+If you want to configure these yourself (or are using a different IDE)
+then use <code>org.apache.catalina.startup.Bootstrap</code> as the main class,
+<code>start</code>/<code>stop</code> etc. as program arguments, and specify <code>-Dcatalina.home=...</code>
+(with the name of your build directory) as VM arguments.
+</p>
+
+<p>
+Tweaking a few formatting preferences will make it much easier to keep consistent with Tomcat
+coding conventions (and have your contributions accepted):
+</p>
+
+<table class="defaultTable">
+ <tr><td>Java -> Code Style -> Formatter -> Edit...</td>
+ <td>Tab policy: Spaces only<br>Tab and Indentation size: 4</td></tr>
+ <tr><td>General -> Editors -> Text Editors</td>
+ <td>Displayed tab width: 2<br>Insert spaces for tabs<br>Show whitespace characters (optional)</td></tr>
+ <tr><td>XML -> XML Files -> Editor</td><td>Indent using spaces<br>Indentation size: 2</td></tr>
+ <tr><td>Ant -> Editor -> Formatter</td><td>Tab size: 2<br>Use tab character instead of spaces: unchecked</td></tr>
+</table>
+
+<p>
+The recommended configuration of Compiler Warnings is documented in
+<code>res/ide-support/eclipse/java-compiler-errors-warnings.txt</code> file.
+</p>
+
+</div><h3 id="Building_with_other_IDEs">Building with other IDEs</h3><div class="text">
+<p>
+The same general approach should work for most IDEs; it has been reported
+to work in IntelliJ IDEA, for example.
+</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/cgi-howto.html b/web/tomcat/webapps/docs/cgi-howto.html
new file mode 100644
index 0000000..4cb9e20
--- /dev/null
+++ b/web/tomcat/webapps/docs/cgi-howto.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - CGI How To</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>CGI How To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Installation">Installation</a></li><li><a href="#Configuration">Configuration</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+<p>The CGI (Common Gateway Interface) defines a way for a web server to
+interact with external content-generating programs, which are often
+referred to as CGI programs or CGI scripts.
+</p>
+
+<p>Within Tomcat, CGI support can be added when you are using Tomcat as your
+HTTP server and require CGI support. Typically this is done
+during development when you don't want to run a web server like
+Apache httpd.
+Tomcat's CGI support is largely compatible with Apache httpd's,
+but there are some limitations (e.g., only one cgi-bin directory).
+</p>
+
+<p>CGI support is implemented using the servlet class
+<code>org.apache.catalina.servlets.CGIServlet</code>. Traditionally,
+this servlet is mapped to the URL pattern "/cgi-bin/*".</p>
+
+<p>By default CGI support is disabled in Tomcat.</p>
+</div><h3 id="Installation">Installation</h3><div class="text">
+
+<p><strong>CAUTION</strong> - CGI scripts are used to execute programs
+external to the Tomcat JVM. If you are using the Java SecurityManager this
+will bypass your security policy configuration in <code>catalina.policy.</code></p>
+
+<p>To enable CGI support:</p>
+
+<ol>
+<li><p>There are commented-out sample servlet and servlet-mapping elements for
+CGI servlet in the default <code>$CATALINA_BASE/conf/web.xml</code> file.
+To enable CGI support in your web application, copy that servlet and
+servlet-mapping declarations into <code>WEB-INF/web.xml</code> file of your
+web application.</p>
+
+<p>Uncommenting the servlet and servlet-mapping in
+<code>$CATALINA_BASE/conf/web.xml</code> file enables CGI for all installed
+web applications at once.</p>
+</li>
+
+<li><p>Set <code>privileged="true"</code> on the Context element for your
+web application.</p>
+
+<p>Only Contexts which are marked as privileged are allowed to use the
+CGI servlet. Note that modifying the global <code>$CATALINA_BASE/conf/context.xml</code>
+file affects all web applications. See
+<a href="config/context.html">Context documentation</a> for details.</p>
+</li>
+</ol>
+
+</div><h3 id="Configuration">Configuration</h3><div class="text">
+
+<p>There are several servlet init parameters which can be used to
+configure the behaviour of the CGI servlet.</p>
+<ul>
+<li><strong>cgiMethods</strong> - Comma separated list of HTTP methods. Requests
+using one of these methods will be passed to the CGI script for the script to
+generate the response. The default value is <code>GET,POST</code>. Use
+<code>*</code> for the script to handle all requests regardless of method.
+Unless over-ridden by the configuration of this parameter, requests using HEAD,
+OPTIONS or TRACE will have handled by the superclass.</li>
+<li><strong>cgiPathPrefix</strong> - The CGI search path will start at
+the web application root directory + File.separator + this prefix.
+By default there is no value, which results in the web application root
+directory being used as the search path. The recommended value is
+<code>WEB-INF/cgi</code></li>
+<li><strong>cmdLineArgumentsDecoded</strong> - If command line arguments
+are enabled (via <strong>enableCmdLineArguments</strong>) and Tomcat is running
+on Windows then each individual decoded command line argument must match this
+pattern else the request will be rejected. This is to protect against known
+issues passing command line arguments from Java to Windows. These issues can
+lead to remote code execution. For more information on these issues see
+<a href="https://codewhitesec.blogspot.com/2016/02/java-and-command-line-injections-in-windows.html">Markus
+Wulftange's blog</a> and this archived
+<a href="https://web.archive.org/web/20161228144344/https://blogs.msdn.microsoft.com/twistylittlepassagesallalike/2011/04/23/everyone-quotes-command-line-arguments-the-wrong-way/">blog
+by Daniel Colascione</a>.</li>
+<li><strong>cmdLineArgumentsEncoded</strong> - If command line arguments
+are enabled (via <strong>enableCmdLineArguments</strong>) individual encoded
+command line argument must match this pattern else the request will be rejected.
+The default matches the allowed values defined by RFC3875 and is
+<code>[a-zA-Z0-9\Q%;/?:@&,$-_.!~*'()\E]+</code></li>
+<li><strong>enableCmdLineArguments</strong> - Are command line arguments
+generated from the query string as per section 4.4 of 3875 RFC? The default is
+<code>false</code>.</li>
+<li><strong>environment-variable-</strong> - An environment to be set for the
+execution environment of the CGI script. The name of variable is taken from the
+parameter name. To configure an environment variable named FOO, configure a
+parameter named environment-variable-FOO. The parameter value is used as the
+environment variable value. The default is no environment variables.</li>
+<li><strong>executable</strong> - The name of the executable to be used to
+run the script. You may explicitly set this parameter to be an empty string
+if your script is itself executable (e.g. an exe file). Default is
+<code>perl</code>.</li>
+<li><strong>executable-arg-1</strong>, <strong>executable-arg-2</strong>,
+and so on - additional arguments for the executable. These precede the
+CGI script name. By default there are no additional arguments.</li>
+<li><strong>envHttpHeaders</strong> - A regular expression used to select the
+HTTP headers passed to the CGI process as environment variables. Note that
+headers are converted to upper case before matching and that the entire header
+name must match the pattern. Default is
+<code>ACCEPT[-0-9A-Z]*|CACHE-CONTROL|COOKIE|HOST|IF-[-0-9A-Z]*|REFERER|USER-AGENT</code>
+</li>
+<li><strong>parameterEncoding</strong> - Name of the parameter encoding
+to be used with the CGI servlet. Default is
+<code>System.getProperty("file.encoding","UTF-8")</code>. That is the system
+default encoding, or UTF-8 if that system property is not available.</li>
+<li><strong>passShellEnvironment</strong> - Should the shell environment
+variables from Tomcat process (if any) be passed to the CGI script? Default is
+<code>false</code>.</li>
+<li><strong>stderrTimeout</strong> - The time (in milliseconds) to wait for
+the reading of stderr to complete before terminating the CGI process. Default
+is <code>2000</code>.</li>
+</ul>
+
+<p>The CGI script executed depends on the configuration of the CGI Servlet and
+how the request is mapped to the CGI Servlet. The CGI search path starts at the
+web application root directory + File.separator + cgiPathPrefix. The
+<strong>pathInfo</strong> is then searched unless it is <code>null</code> - in
+which case the <strong>servletPath</strong> is searched.</p>
+
+<p>The search starts with the first path segment and expands one path segment
+at a time until no path segments are left (resulting in a 404) or a script is
+found. Any remaining path segments are passed to the script in the
+<strong>PATH_INFO</strong> environment variable.</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/changelog.html b/web/tomcat/webapps/docs/changelog.html
new file mode 100644
index 0000000..8222e9e
--- /dev/null
+++ b/web/tomcat/webapps/docs/changelog.html
@@ -0,0 +1,10025 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Changelog</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Changelog</h2><h3 id="Tomcat_8.5.73_(schultz)"><span style="float: right;">release in progress</span> Tomcat 8.5.73 (schultz)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.73_(schultz)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve robustness of JNDIRealm for exceptions occurring when getting
+ the connection. Also add missing close when running into issues
+ getting the passord of a user. (remm)
+ </li>
+ <li><img alt="Docs: " class="icon" src="./images/docs.gif">
+ Add Javadoc comment which listeners must be nested whithin
+ <code>Server</code> elements only. (michaelo)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Log warning if a listener is not nested inside a Server element
+ although it must have been. (michaelo)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.73_(schultz)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Improve performance of Connector shutdown - primarily to reduce the time
+ it takes to run the test suite. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://github.com/apache/tomcat/pull/457">#457</a>: Add a <code>toString()</code> method to
+ <code>MimeHeader</code> to aid debugging. (dblevins)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Do not ignore the error condition if the APR connector is not able to
+ open a server socket as continuing in this case will trigger a JVM crash.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve error handling if APR/Native fails to attach TLS capabilities to
+ a TLS enabled client connection. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve error handling if APR/Native fails to accept an incoming
+ connection. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.73_(schultz)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Add a new method <code>WsServerContainer.upgradeHttpToWebSocket()</code>
+ to align with the new method that will be available from WebSocket 2.1
+ onwards. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.72_(schultz)"><span style="float: right;">2021-10-06</span> Tomcat 8.5.72 (schultz)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.72_(schultz)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65553">65553</a>: Implement a work-around for a
+ <a href="https://bugs.openjdk.java.net/browse/JDK-8273874">JRE bug</a>
+ that can trigger a memory leak when using the JNDI realm. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://github.com/apache/tomcat/pull/451">#451</a>: Improve the usefulness of the thread name cache used in
+ JULI. Pull request provided by t-gergely. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.72_(schultz)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Further improvements in the management of the connection flow control
+ window. This addresses various bugs that caused streams to incorrectly
+ report that they had timed out waiting for an allocation from the
+ connection flow control window. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65577">65577</a>: Fix a <code>AccessControlException</code> reporting
+ when running an NIO2 connector with TLS enabled. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Reclassify TLS ciphers that use AESCCM8 as medium security rather than
+ high security to align with recent changes in OpenSSL. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix an issue that caused some Servlet non-blocking API reads of the HTTP
+ request body to incorrectly use blocking IO. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.72_(schultz)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix the implementation of <code>MethodExpression.getMethodInfo()</code>
+ so that it returns the expected value rather than failing when the
+ method expression is defined with the parameter values in the expression
+ rather than the types being passed explicitly to
+ <code>ExpressionFactory.createMethodExpression()</code>. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Regenerate the EL parser using JavaCC 7.0.10. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a bug that prevented the EL parser correctly parsing a literal Map
+ that used variables rather than literals for both keys and values.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.72_(schultz)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ The internal upgrade handler should close the associated
+ <code>WebConnection</code> on destroy. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.72_(schultz)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Clarify the JASPIC configuration options in the documentation web
+ application. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.72_(schultz)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65585">65585</a>: Update obsolete comments at the start of the
+ <code>build.properties.default</code> file. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.71_(schultz)"><span style="float: right;">2021-09-13</span> Tomcat 8.5.71 (schultz)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.71_(schultz)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Enable Tomcat to start if an (old) XML parser is configured that does
+ not support <code>allow-java-encodings</code>. A warning will be logged
+ if such an XML parser is detected. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Change the behaviour of custom error pages. If an error occurs after the
+ response is committed, once the custom error page content has been added
+ to the response the connection is now closed immediately rather than
+ closed cleanly. i.e. the last chunk that marks the end of the response
+ body is no longer sent. This acts as an additional signal to the client
+ that the request experienced an error. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65479">65479</a>: When handling requests using JASPIC authentication,
+ ensure that <code>PasswordValidationCallback.getResult()</code> returns
+ the result of the password validation rather than always returning
+ <code>false</code>. Fixed via pull request <a href="https://github.com/apache/tomcat/pull/438">#438</a> provided by
+ Robert Rodewald. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor the authenticators to delegate the check for preemptive
+ authentication to the individual authenticators where an authentication
+ scheme specific check can be performed. Based on pull request
+ <a href="https://github.com/apache/tomcat/pull/444">#444</a> by Robert Rodewald. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add <code>derby-*.jar</code> to the list of JARs to skip when scanning
+ for TLDs, web fragments and annotations. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.71_(schultz)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a logic error that meant setting
+ <code>certificateKeystoreFile</code> to <code>NONE</code> did not have
+ the expected effect. <code>NONE</code> was incorrectly treated as a file
+ path. Patch provided by Mikael Sterner. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65505">65505</a>: When an HTTP header value is removed, ensure that the
+ order of the remaining header values is unchanged. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65563">65563</a>: Correct parsing of HTTP <code>Content-Range</code>
+ headers. Tomcat was incorrectly requiring an <code>=</code> character
+ after <code>bytes</code>. Fix based on pull request <a href="https://github.com/apache/tomcat/pull/449">#449</a> by
+ Thierry Guérin. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.71_(schultz)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65506">65506</a>: Fix write timeout check that was using the read
+ timeout value. Patch submitted by Gustavo Mahlow. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.71_(schultz)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Remove unnecessary Context settings from the examples web application.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Document default value for <code>unpackWARs</code> and related clean-up.
+ Pull request <a href="https://github.com/apache/tomcat/pull/439">#439</a> provided by Robert Rodewald. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Clarify the documentation of the <code>compressionMinSize</code> and
+ <code>compressibleMimeType</code> HTTP <code>Connector</code>
+ attributes. Pull request <a href="https://github.com/apache/tomcat/pull/442">#442</a> provided by crisgeek. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.71_(schultz)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix failing build when building on non-English locales. Pull request
+ <a href="https://github.com/apache/tomcat/pull/441">#441</a> provided by Dachuan J. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update to JSign version 4.0 to enable code signing without the need for
+ the installation of additional client tools. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons BCEL to 40d5eb4 (2021-09-01,
+ 6.6.0-SNAPSHOT). Code clean-up only. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons Codec to fd44e6b (2021-09-01,
+ 1.16-SNAPSHOT). Minor refactoring. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65661">65661</a>: Update the internal fork of Apache Commons FileUpload
+ to 33d2d79 (2021-09-01, 2.0-SNAPSHOT). Refactoring and code clean-up. As
+ a result of Commons File Upload now using
+ <code>java.nio.file.Files</code>, applications using multi-part uploads
+ need to ensure that the JVM is configured with sufficient direct memory
+ to store all in progress multi-part uploads. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons Pool to 0da5c54
+ (2021-02-02, 2.9.1-SNAPSHOT). Refactoring and code clean-up. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons DBCP to c6d5cd9
+ (2021-06-05, 2.9.0-SNAPSHOT). Refactoring and code clean-up. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.31 to
+ pick up Windows binaries built with OpenSSL 1.1.1l.(markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Switch to the CDN as the primary download location for ASF dependencies.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Chinese translations contributed by syseal, wolibo,
+ ZhangJieWen and DigitalFatCat. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Japanese translations contributed by tak7iji. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Korean translations. (woonsan)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.70_(markt)"><span style="float: right;">2021-08-16</span> Tomcat 8.5.70 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.70_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65411">65411</a>: Always close the connection when an uncaught
+ <code>NamingException</code> occurs to avoid connection locking.
+ Submitted by Ole Ostergaard. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65433">65433</a>: Correct a regression in the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65397">65397</a>
+ where a <code>StringIndexOutOfBoundsException</code> could be triggered
+ if the canonical path of the target of a symlink was shorter than the
+ canonical path of the directory in which the symlink had been created.
+ Patch provided by Cedomir Igaly. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65443">65443</a>: Refactor the <code>CorsFilter</code> to make it easier
+ to extend. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ To avoid unnecessary cache revalidation, do not add an HTTP
+ <code>Expires</code> header when setting adding an HTTP header of
+ <code>CacheControl: private</code>. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.70_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct bugs in the HTTP/2 connection flow control management that meant
+ it was possible for a connection to stall waiting for a connection flow
+ control window update that had already arrived. Any streams on that
+ connection that were trying to write when this happened would time out.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65454">65454</a>: Fix a race condition that could result in a delay to
+ a new request. The new request could be queued to wait for an existing
+ request to finish processing rather than the thread pool creating a new
+ thread to process the new request. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65460">65460</a>: Correct a regression introduced in the previous
+ release in the change to reduce the number of small HTTP/2 window
+ updates sent for streams. A logic error meant that small window updates
+ for the connection were not flushed. This meant that the connection flow
+ window may not update quite as quickly as the ideal. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.70_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Chinese translations contributed by ZhangJieWen and
+ chengzheyan. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to French translations. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Japanese translations contributed by tak7iji. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Korean translations. (woonsan)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.69_(schultz)"><span style="float: right;">2021-07-05</span> Tomcat 8.5.69 (schultz)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.69_(schultz)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor the <code>RemoteIpValve</code> to use the common utility method
+ for list to comma separated string conversion. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix serialization warnings in <code>UserDatabasePrincipal</code>
+ reported by SpotBugs. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65397">65397</a>: Calls to
+ <code>ServletContext.getResourcePaths()</code> no longer include
+ symbolic links in the results unless <code>allowLinking</code> has been
+ set to <code>true</code>. If a resource is skipped because of this
+ change, a warning will be logged as this typically indicates a
+ configuration issue. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.69_(schultz)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65368">65368</a>: Improve handling of clean closes of inbound TLS
+ connections. Treat them the same way as clean closes of non-TLS
+ connections rather than as unknown errors. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Modify the HTTP/2 connector not to sent small updates for stream flow
+ control windows to the user agent as, depending on how the user agent is
+ written, this may trigger small writes from the user agent that in turn
+ trigger the overhead protection. Small updates for stream flow control
+ windows are now combined with subsequent flow control window updates for
+ that stream to ensure that all stream flow control window updates sent
+ from Tomcat are larger than <code>overheadWindowUpdateThreshold</code>.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add additional debug logging to track the current state of the HTTP/2
+ overhead count that Tomcat uses to detect and close potentially
+ malicious connections. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Many HTTP/2 requests from browsers will trigger one overhead frame and
+ one non-overhead frame. Change the overhead calculation so that a
+ non-overhead frame reduces the current overhead count by 2 rather than
+ 1. This means that, over time, the overhead count for a well-behaved
+ connection will trend downwards. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Change the initial HTTP/2 overhead count from <code>-10</code> to
+ <code>-10 * overheadCountFactor</code>. This means that, regardless of
+ the value chosen for <code>overheadCountFactor</code>, when a connection
+ opens 10 overhead frames in a row will be required to trigger the
+ overhead protection. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Increase the default <code>overheadCountFactor</code> from
+ <code>1</code> to <code>10</code> and change the reduction in overhead
+ count for a non-overhead frame from <code>-2</code> to <code>-20</code>.
+ This allows for a larger range (0-20) to be used for
+ <code>overheadCountFactor</code> providing for finer-grained control.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Modify the parsing of HTTP header values that use the
+ <code>1#token</code> to ignore empty elements as per RFC 7230 section 7
+ instead of treating the presence of empty elements as an error. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Expand the unit tests for <code>HttpServlet.doHead()</code> and correct
+ the flushing of the response buffer. The buffer used to behave as if it
+ was one byte smaller than the configured size. The buffer was flushed
+ (and the response committed if required) when the buffer was full. The
+ buffer is now flushed (and the response committed if required) if the
+ buffer is full and there is more data to write. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix an issue where concurrent HTTP/2 writes (or concurrent reads) to the
+ same connection could hang and eventually timeout when async IO was
+ enabled (it is enabled by default). (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.69_(schultz)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65390">65390</a>: Correct a regression in the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65124">65124</a>
+ and restore code that was removed in error leading to JSP compilation
+ failures in some circumstances. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add support for specifying Java 17 (with the value <code>17</code>) as
+ the compiler source and/or compiler target for JSP compilation. If used
+ with an Eclipse JDT compiler version that does not support these values,
+ a warning will be logged and the latest supported version will used.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65377">65377</a>: Update the Java code generation for JSPs not to use
+ the boxed primitive constructors as they have been deprecated in Java 9
+ and marked for future removal in Java 16. <code>valueOf()</code> is now
+ used instead. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.69_(schultz)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor the <code>DigestAuthenticator</code> to reuse a shared
+ <code>SecureRandom</code> instance rather than create a new one to
+ generate the <code>cnonce</code> if required. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.69_(schultz)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65385">65385</a>: Correct the link in the documentation web application
+ the Maven Central repository. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65404">65404</a>: Correct a regression in the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63362">63362</a>
+ that caused the server status page in the Manager web application to be
+ truncated if HTTP upgrade was used such as when starting a WebSocket
+ connection. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.69_(schultz)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update JUnit to version 4.13.2. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update UnboundID to 6.0.0. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update CheckStyle backport to 8.43 . (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.68_(schultz)"><span style="float: right;">2021-06-15</span> Tomcat 8.5.68 (schultz)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.68_(schultz)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update to the Java 7 compatible build of JSign 3.1 to pick up a fix for
+ SHA-512 signatures. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65369">65369</a> / <a href="https://github.com/apache/tomcat/pull/422">#422</a>: Add the additional
+ <code>--add-opens=...</code> options required for running Tomcat on Java
+ 16 onwards to the <code>service.bat</code> script to align it with the
+ other start-up scripts. PR provided by MCMicS. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.67_(schultz)"><span style="float: right;">not released</span> Tomcat 8.5.67 (schultz)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.67_(schultz)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65301">65301</a>: <code>RemoteIpValve</code> will now avoid getting
+ the local host name when it is not needed. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65308">65308</a>: NPE in JNDIRealm when no <code>userRoleAttribute</code>
+ is given. (fschumacher)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://github.com/apache/tomcat/pull/412">#412</a>: Add commented out, sample users for the Tomcat Manager app
+ to the default <code>tomcat-users.xml</code> file. Based on a PR by
+ Arnaud Dagnelies. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://github.com/apache/tomcat/pull/418">#418</a>: Add a new option, <code>pass-through</code>, to the
+ default servlet's <code>useBomIfPresent</code> initialization parameter
+ that causes the default servlet to leave any BOM in place when
+ processing a static file and not to use the BOM to determine the
+ encoding of the file. Based on a pull request by Jean-Louis Monteiro.
+ (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Add <code>cookieName</code> attribute to the SSO valve to configure the
+ SSO cookie name. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://github.com/apache/tomcat/pull/419">#419</a>: When processing POST requests of type
+ <code>multipart/form-data</code> for parts without a filename that are
+ added to the parameter map in String form, check the size of the part
+ before attempting conversion to String. Pull request provided by
+ tianshuang. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62912">62912</a>: Don't mutate an application provided content header if
+ it does not contain a charset. Also remove the outdated workaround for
+ the buggy Adobe Reader 9 plug-in for IE. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ AprLifecycleListener does not show dev version suffix for libtcnative
+ and libapr. (michaelo)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Refactor principal handling in <code>UserDatabaseRealm</code> using
+ an inner class that extends <code>GenericPrincipal</code>. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Enable the default <code>doHead()</code> implementation in
+ <code>HttpServlet</code> to correctly handle responses where the content
+ length needs to be represented as a long since it is larger than the
+ maximum value that can be represented by an int. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid synchronization on roles verification for the memory
+ <code>UserDatabase</code>. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix the default <code>doHead()</code> implementation in
+ <code>HttpServlet</code> to correctly handle responses where the Servlet
+ calls <code>ServletResponse.reset()</code> and/or
+ <code>ServletResponse.resetBuffer()</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix the default <code>doHead()</code> implementation in
+ <code>HttpServlet</code> to correctly handle responses generated using
+ the Servlet non-blocking API. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.67_(schultz)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65303">65303</a>: Fix a possible <code>NullPointerException</code> if
+ an error occurs on an HTTP/1.1 connection being upgraded to HTTP/2 or on
+ a pushed HTTP/2 stream. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65311">65311</a>: Fix a race condition in the
+ <code>NioBlockingSelector</code> that could cause a delay to select
+ operations. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Simplify AprEndpoint socket bind for all platforms. (michaelo)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65340">65340</a>: Add missing check for a negative return value for
+ <code>Hpack.decodeInteger</code> in the <code>HpackDecoder</code>,
+ which could cause a <code>NegativeArraySizeException</code> exception.
+ Submitted by Thomas, and verified the fix is present in the donated
+ hpack code in a further update. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add debug logging for HTTP/2 HPACK header decoding. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct parsing of HTTP headers consisting of a list of tokens so that a
+ header with an empty token is treated consistently regardless of whether
+ the empty token is at the start, middle or end of the list of tokens.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Remove support for the <code>identity</code> transfer encoding. The
+ inclusion of this encoding in RFC 2616 was an error that was corrected
+ in 2001. Requests using this transfer encoding will now receive a 501
+ response. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Process transfer encoding headers from both HTTP 1.0 and HTTP 1.1
+ clients. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that if the transfer encoding header contains the
+ <code>chunked</code>, that the <code>chunked</code> encoding is the
+ final encoding listed. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.67_(schultz)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Review code used to generate Java source from JSPs and tags and remove
+ code found to be unnecessary. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor use of internal <code>ChildInfo</code> class to use compile
+ time type checking rather than run time type checking. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65358">65358</a>: Improve expression language method matching for
+ methods with varargs. Where multiple methods may match the provided
+ parameters, the method that requires the fewest varargs is preferred.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65332">65332</a>: Add a commented out section in
+ <code>catalina.policy</code> that provides the necessary permissions to
+ compile JSPs with javac when running on Java 9 onwards with a security
+ manager. It is commented out as it will cause errors if used with
+ earlier Java versions. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.67_(schultz)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65317">65317</a>: When using <code>permessage-deflate</code>, the
+ WebSocket connection was incorrectly closed if the uncompressed payload
+ size was an exact multiple of 8192. Based on a patch provided by Saksham
+ Verma. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65342">65342</a>: Correct a regression introduced with the fix for
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65262">65262</a> that meant Tomcat's WebSocket implementation would only
+ work with Tomcat's implementation of the Java EE WebSocket API. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.67_(schultz)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the description of the <code>maxConnections</code> and
+ <code>acceptCount</code> attributes in the Connector section of the
+ documentation web application. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.67_(schultz)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to French translations. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Korean translations. (woonsan)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.30. Also
+ update the minimum recommended version to 1.2.30. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Use JSign to integrate the build script with the code signing service to
+ enable release builds to be created on Linux as well as Windows. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.66_(markt)"><span style="float: right;">2021-05-12</span> Tomcat 8.5.66 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.66_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Expand coverage of unit tests for JNDIRealm using the UnboundID LDAP SDK
+ for Java. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65224">65224</a>: Ensure the correct escaping of attribute values and
+ search filters in the JNDIRealm. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65235">65235</a>: Add missing attributes to the MBean descriptor file
+ for the <code>RemoteIpValve</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65244">65244</a>: HandlesTypes should include classes that use
+ the specified annotation types on fields or methods. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65251">65251</a>: Correct a regression introduced in 8.5.64 that meant
+ that the auto-deployment process may attempt a second, concurrent
+ deployment of a web application that is being deployed by the Manager
+ resulting in one of the deployments failing and errors being reported.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the <code>SSLValve</code> so it is able to handle escaped
+ client certificate headers from Nginx. Based on a patch by Florent
+ Guillaume. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.66_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that all HTTP requests that contain an invalid character in the
+ protocol component of the request line are rejected with a 400 response
+ rather than some requests being rejected with a 505 response. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When generating the error message for an HTTP request with an invalid
+ request line, ensure that all the available data is included in the
+ error message. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65272">65272</a>: Restore the optional HTTP feature that allows
+ <code>LF</code> to be treated as a line terminator for the request line
+ and/or HTTP headers lines as well as the standard <code>CRLF</code>.
+ This behaviour was previously removed as a side-effect of the fix for
+ CVE-2020-1935. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.66_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Review code used to generate Java source from JSPs and tags and remove
+ code found to be unnecessary. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <code><servlet></code> entries in web.xml that include a
+ <code><jsp-file></code> element and a negative
+ <code><load-no-startup></code> element that is not the default
+ value of <code>-1</code> will no longer be loaded at start-up. This
+ makes it possible to define a <code><jsp-file></code> that will
+ not be loaded at start-up. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Allow the JSP configuration option
+ <code>useInstanceManagerForTags</code> to be used with Tags that are
+ implemented as inner classes. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.66_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor the way Tomcat passes path parameters to POJO end points to
+ simplify the code. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65262">65262</a>: Refactor the creation of WebSocket end point, decoder
+ and encoder instances to be more IoC friendly. Instances are now created
+ via the <code>InstanceManager</code> where possible. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.66_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65235">65235</a>: Correct name of <code>changeLocalName</code> in the
+ documentation for the <code>RemoteIpValve</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65265">65265</a>: Avoid getting the boot classpath when it is not
+ available in the Manager diagnostics. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.66_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.28.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Move <code>SystemPropertySource</code> to be a regular class to allow
+ more precise configuration if needed. The system property source will
+ still always be enabled. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Chinese translations. Provided by bytesgo. (mark)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to French translations. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Korean translations. (woonsan)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.65_(markt)"><span style="float: right;">2021-04-06</span> Tomcat 8.5.65 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.65_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid NPE when a JNDI reference cannot be resolved in favor of a
+ NamingException. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid using reflection for setting properties on the webapp
+ classloader. Based on a patch submitted by Romain Manni-Bucau. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.65_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve consistency of OpenSSL error stack handling in the TLS engine,
+ and log all errors found as debug. (remm)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Re-factor the HTTP/2 implementation classes to better align with 9.0.x
+ and 10.0.x to make maintenance simpler. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that HTTP/2 streams are only recycled once as multiple attempts
+ to recycle an HTTP/2 stream may result in
+ <code>NullPointerException</code>s. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Simplify the closing on an HTTP/2 stream when an error condition is
+ present. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64771">64771</a>: Prevent concurrent calls to
+ <code>ServletInputStream.isReady()</code> corrupting the input buffer.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65179">65179</a>: Ensure that the connection level flow control window
+ from the client to the server is updated when handling DATA frames
+ received for completed streams else the flow control window may become
+ exhausted. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65203">65203</a>: Fix a regression introduced in 8.5.64 that meant that
+ an error during an asynchronous read broke all future asynchronous reads
+ associated with the same request instance. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Disable keep-alive when inconsistent content delimitation is present in
+ a request. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.65_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Implement the first phase of reproducible builds. Sequential builds on
+ the same machine now produce identical output provided that the Ant
+ property <code>ant.tstamp.now.iso</code> is set. The minimum required
+ Ant version is now 1.9.10. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Chinese translations. Provided by Ruan Wenjun. (mark)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to French translations. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Japanese translations. Provided by kfujino and
+ Shirayuking. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Korean translations. (woonsan)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.27.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.64_(markt)"><span style="float: right;">2021-03-10</span> Tomcat 8.5.64 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.64_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Revert an incorrect fix for a potential resource leak that broke
+ deployment via the Ant deploy task. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the <code>AsyncListener.onError()</code> event is triggered
+ when a I/O error occurs during non-blocking I/O. There were some cases
+ discovered where this was not happening. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Make the non-blocking I/O error handling more robust by handling the
+ case where the application code swallows an <code>IOException</code> in
+ <code>WriteListener.onWritePossible()</code> and
+ <code>ReadListener.onDataAvailable()</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64938">64938</a>: Align the behaviour when <code>null</code> is passed
+ to the <code>ServletResponse</code> methods
+ <code>setCharacterEncoding()</code>, <code>setContentType()</code> and
+ <code>setLocale()</code> with the recent clarification from the Jakarta
+ Servlet project of the expected behaviour in these cases. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Make the <code>StandardContext.postWorkDirectory()</code> protected
+ rather than private to help users wishing to customise the default
+ work directory behaviour. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.64_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65118">65118</a>: Fix a potential <code>NullPointerException</code> when
+ pruning closed HTTP/2 streams from the connection. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid NullPointerException when a secure channel is closed before the
+ SSL engine was initialized. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve error message for failed ConfigFileLoader lookups. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the <code>ReadListener</code>'s <code>onError()</code> event
+ is triggered if the client closes the connection before sending the
+ entire request body and the server is ready the request body using
+ non-blocking I/O. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65137">65137</a>: Ensure that a response is not corrupted as well as
+ incomplete if the connection is closed before the response is fully
+ written due to a write timeout. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Related to bug <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65131">65131</a>, make sure all errors from OpenSSL are
+ fully cleared, as there could be more than one error present after
+ an operation (confirmed in the OpenSSL API documentation). (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Make handling of OpenSSL read errors more robust when plain text data is
+ reported to be available to read. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct handling of write errors during non-blocking I/O to ensure that
+ the associated <code>AsyncContext</code> was closed down correctly.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.64_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65136">65136</a>: Remove the restriction that prevented the Manager web
+ application deploying different web applications in parallel. This
+ required some refactoring, most notably to
+ <code>HostConfig.check()</code> and how it is used. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.64_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to French translations. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Korean translations. (woonsan)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Russian translations. Provided by Azat. (mark)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Chinese translations. Provided by shawn. (mark)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.63_(markt)"><span style="float: right;">2021-02-03</span> Tomcat 8.5.63 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.63_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65106">65106</a>: Fix the ConfigFileLoader handling of file URIs when
+ running under a security manager on some JREs. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.63_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that SNI provided host names are matched to SSL virtual host
+ configurations in a case insensitive manner. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.62_(markt)"><span style="float: right;">not released</span> Tomcat 8.5.62 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.62_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=50175">50175</a>: Add a new attribute to the standard context
+ implementation, <code>skipMemoryLeakChecksOnJvmShutdown</code>, that
+ allows the user to configure Tomcat to skip the memory leak checks
+ usually performed during web application stop if that stop is triggered
+ by a JVM shutdown. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60781">60781</a>: Escape elements in the access log that need to be
+ escaped for the access log to be parsed unambiguously.
+ (fschumacher/markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64110">64110</a>: Add support for additional TLS related request
+ attributes that provide details of the protocols and ciphers requested
+ by a client in the initial TLS handshake. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Let the <code>RemoteCIDRValve</code> inherit from
+ <code>RequestFilterValve</code> and support all of its features.
+ Especially add support for connector specific configuration
+ using <code>addConnectorPort</code>. (rjung)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add <code>peerAddress</code> to coyote request, which contains
+ the IP address of the direct connection peer. If a reverse proxy
+ sits in front of Tomcat and the protocol used is AJP or HTTP
+ in combination with the <code>RemoteIp(Valve|Filter)</code>,
+ the peer address might differ from the <code>remoteAddress</code>.
+ The latter then contains the address of the client in front of the
+ reverse proxy, not the address of the proxy itself.
+ Support for the peer address has been added to the
+ RemoteAddrValve and RemoteCIDRValve with the new attribute
+ <code>usePeerAddress</code>. This can be used to restrict access
+ to Tomcat based on the reverse proxy IP address, which is especially
+ useful to harden access to AJP connectors. The peer address can also
+ be logged in the access log using the new <code>%{peer}a</code>
+ syntax. (rjung)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid uncaught InaccessibleObjectException on Java 16 trying to clear
+ references threads. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65033">65033</a>: Fix JNDI realm error handling when connecting to a
+ failed server when pooling was not enabled. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65047">65047</a>: If the <code>AccessLogValve</code> is unable to open
+ the access log file, include information on the current user in the
+ associated log message (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.62_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Additional fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64830">64830</a> to address an edge case that could
+ trigger request corruption with h2c connections. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64974">64974</a>: Improve handling of pipelined HTTP requests in
+ combination with the Servlet non-blocking IO API. It was possible that
+ some requests could get dropped. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65001">65001</a>: Fix error handling for exceptions thrown from calls
+ to <code>ReadListener</code> and <code>WriteListener</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid possible infinite loop in <code>OpenSSLEngine.unwrap</code>
+ when the destination buffers state is changed concurrently. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.62_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add a new <code>StringInterpreter</code> interface that allows
+ applications to provide customised string attribute value to type
+ conversion within JSPs. This allows applications to provide a conversion
+ implementation that is optimised for the application. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64965">64965</a>: <code>JspContextWrapper.findAttribute</code> should
+ ignore expired sessions rather than throw an
+ <code>IllegalStateException</code>. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.62_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=65007">65007</a>: Clarify that the commands shown in the TLS
+ documentation for importing a signed TLS certificate from a certificate
+ authority are typical examples that may need to be adjusted in some
+ cases. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.62_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Chinese translations. Provided by leeyazhou and Yi Shen.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to French translations. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Korean translations. (woonsan)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.26.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons Pool to 2.9.1-SNAPSHOT
+ (2021-01-15). (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons DBCP to 2.9.0-SNAPSHOT
+ (2021-01-15). (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Migrate to new code signing service. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Use <code>java.nio.file.Path</code> to test for one directory being a
+ sub-directory of another in a consistent way. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update to Commons Daemon 1.2.4. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Russian translations. Provided by Polina and Azat.
+ (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the NSIS Installer used to build the Windows installer to version
+ 3.06.1. (kkolinko)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.61_(markt)"><span style="float: right;">2020-12-08</span> Tomcat 8.5.61 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.61_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=56181">56181</a>: Update the RemoteIpValve and RemoteIpFilter so that
+ calls to <code>ServletRequest.getRemoteHost()</code> are consistent with
+ the return value of <code>ServletRequest.getRemoteAddr()</code> rather
+ than always returning a value for the proxy. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=56890">56890</a>: Align the behaviour of
+ <code>ServletContext.getRealPath(String path)</code> with the recent
+ clarification from the Servlet specification project. If the path
+ parameter does not start with <code>/</code> then Tomcat processes the
+ call as if <code>/</code> is appended to the beginning of the
+ provided path. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64921">64921</a>: Ensure that the <code>LoadBalancerDrainingValve</code>
+ uses the correct setting for the secure attribute for any session
+ cookies it creates. Based on a pull request by Andreas Kurth. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64947">64947</a>: Don't assume that the <code>Upgrade</code> header has
+ been set on the <code>HttpServletResponse</code> before any call is made
+ to <code>HttpServletRequest.upgrade()</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that values are not duplicated when manipulating the vary header.
+ Based on a pull request by Fredrik Fall. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.61_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64944">64944</a>: Ensure that the bytesSent metric is correctly updated
+ when compression is enabled. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.61_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64951">64951</a>: Fix a potential file descriptor leak when WebSocket
+ connections are attempted and fail. Patch provided by Maurizio Adami.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.61_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a regression in the addition of the HTTP header security filter
+ to the examples web application that prevented the Servlet examples that
+ depend on the asynchronous API from functioning correctly.
+ (kkolinko/markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.61_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Start all core threads when starting the receiver and dispatch
+ interceptor. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.61_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64931">64931</a>: Implement validation of <code>changelog.xml</code>
+ file at build time. (kkolinko)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update to Maven Ant Resolver Tasks 1.3.0. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62695">62695</a>: Provide SHA-256 and SHA-512 checksums for files
+ published via Maven. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.60_(markt)"><span style="float: right;">2020-11-17</span> Tomcat 8.5.60 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.60_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=55559">55559</a>: Add a new attribute, <code>localJndiResource</code>,
+ that allows a UserDatabaseRealm to obtain a UserDatabase instance from
+ the local (web application) JNDI context rather than the global JNDI
+ context. This option is only useful when the Realm is defined on the
+ Context. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Add connection pooling to JNDI realm. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64805">64805</a>: Correct imports used by <code>JMXProxyServlet</code>.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix JNDIRealm pooling problems retrying on another bad connection. Any
+ retries are made on a new connection, just like with the single
+ connection scenario. Also remove all connections from the pool after
+ an error. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ JNDIRealm connections should only be created with the container
+ classloader as the thread context classloader, just like for the JAAS
+ realm. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64871">64871</a>: Log a warning if Tomcat blocks access to a file
+ because it uses symlinks. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Rename <code>JDBCStore</code> to <code>DataSourceStore</code>
+ and remove bottlenecks for database backed session store. The
+ <code>JDBCStore</code> is deprecated but remains unchanged. Patch
+ submitted by Philippe Mouawad. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.60_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor the HTTP/2 window update handling for padding in data frames to
+ ensure that the connection window is correctly updated after a data
+ frame with zero length padding is received. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix processing of URIs with %nn encoded solidus characters when
+ <code>encodedSolidusHandling</code> was set to <code>passthrough</code>
+ and the encoded solidus was preceded by other %nn encoded characters.
+ Based on a pull request by willmeck. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63362">63362</a>: Add collection of statistics for HTTP/2, WebSocket and
+ connections upgraded via the HTTP upgrade mechanism. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Provide messages for some <code>SocketTimeoutException</code> instances
+ that did not have one. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add additional debug logging for I/O issues when communicating with the
+ user agent. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64830">64830</a>: Fix concurrency issue in HPACK decoder. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.60_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64848">64848</a>: Fix a variation of this memory leak when a write I/O
+ error occurs on a non-container thread. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.60_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64799">64799</a>: Added missing resources to host-manager web app. (isapir)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64797">64797</a>: Align manager.xml template file in Host-Manager with
+ context.xml of real Manager web application. (isapir)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Configure the examples web applications to set
+ <code>SameSite=strict</code> for all cookies, including session cookies,
+ created by the application. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Configure the examples, Manager and Host Manager to use the HTTP header
+ security filter with default settings apart from no HSTS header. Based
+ on a suggestion by Debangshu Kundu. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.60_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to French translations. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Korean translations. (woonsan)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Russian translations. Provided by Azat. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.59_(markt)"><span style="float: right;">2020-10-09</span> Tomcat 8.5.59 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.59_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix race condition when saving and recycling session in
+ <code>PersistentValve</code>. (kfujino)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Deprecate the JDBCRealm. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct numerous spellings throughout the code base. Based on a pull
+ request from John Bampton. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64715">64715</a>: Add PasswordValidationCallback to the JASPIC
+ implementation. Patch provided by Robert Rodewald. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Throw <code>SQLException</code> instead of
+ <code>NullpointerException</code> when failing to connect to the
+ database. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64735">64735</a>: Ensure that none of the methods on a
+ <code>ServletContext</code> instance always fail when running under a
+ SecurityManager. Pull request provided by Kyle Stiemann. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64765">64765</a>: Ensure that the number of currently processing threads
+ is tracked correctly when a web application is undeployed, long running
+ requests are being processed and
+ <code>renewThreadsWhenStoppingContext</code> is enabled for the web
+ application. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improve the error messages when running under JPMS without the necessary
+ options to enable reflection required by the memory leak prevention /
+ detection code. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When estimating the size of a resource in the static resource cache,
+ include a specific allowance for the path to the resource. Based on a
+ pull request by blueSky1825821. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.59_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Do not send an HTTP/2 PING frame to measure round-trip time when it is
+ known that the HTTP/2 connection is not in a good state. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64743">64743</a>: Correct a regression introduced in 8.5.57 that
+ caused a <code>Connection: close</code> header to be added to the
+ response if the Connector was configured with
+ <code>maxSwallowSize=-1</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When logging HTTP/2 debug messages, use consistent formatting for stream
+ identifiers. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct some double counting in the code that tracks the number of
+ in-flight asynchronous requests. The tracking enables Tomcat to shutdown
+ gracefully when asynchronous processing is in use. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Don't send the Keep-Alive response header if the connection has been
+ explicitly closed. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor the handling of closed HTTP/2 streams to reduce the heap usage
+ associated with used streams and to retain information for more streams
+ in the priority tree. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.59_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Use lazy instantiation to improve the performance when working with
+ listeners added to the <code>ELContext</code>. Pull request provided by
+ Thomas Andraschko. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.59_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Configure the Manager and Host Manager applications to set
+ <code>SameSite=strict</code> for all cookies, including session cookies,
+ created by the application. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Update the Manager How-To in the documentation web application to
+ clarify when a user may wish to deploy additional instances of the
+ Manager web application. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.59_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update to Commons Daemon 1.2.3. This adds support to jsvc for
+ <code>--enable-preview</code> and native memory tracking (Procrun
+ already supported these features), adds some addition debug logging and
+ adds a new feature to Procrun that outputs the command to (re-)configure
+ the service with the current settings. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ When building, only rebuild JAR files if the contents has changed.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Chinese translations. Pull request provided by Yang
+ Yang. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand coverage of Russian translations. Pull request provided by
+ Nikolay Gribanov. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix running service.bat when called from <code>$CATALINA_HOME</code>.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Complete the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63815">63815</a>. Users wishing to use system
+ properties that require quoting with <code>catalina.sh</code> and the
+ <code>debug</code> option must use a JRE that includes the fix for <a href="https://bugs.openjdk.java.net/browse/JDK-8234808">JDK-8234808</a>.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Chinese translations. Provided by leeyazhou. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to French translations. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Korean translations. (woonsan)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to Spanish translations. Provided by Andrewlanecarr.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.58_(markt)"><span style="float: right;">2020-09-15</span> Tomcat 8.5.58 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.58_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=53411">53411</a>: Improve the handling of HTTP requests that do not
+ explicitly specify a host name when no default host is configured. Also
+ improve the tracking of changes to the default host as hosts are added
+ and removed while Tomcat is running. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64582">64582</a>: Pre-load the <code>CoyoteOutputStream</code> class to
+ prevent a potential exception when running under a security manager.
+ Patch provided by Johnathan Gilday. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64593">64593</a>: If a request is not matched to a Context, delay
+ issuing the 404 response to give the rewrite valve, if configured, an
+ opportunity to rewrite the request. (remm/markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Refactor the Default servlet to provide a single method that can be
+ overridden (<code>generateETag()</code>) should a custom entity tag
+ format be required. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the validation of entity tags provided with conditional
+ requests. Requests with headers that contain invalid entity tags will be
+ rejected with a 400 response code. Improve the matching algorithm used
+ to compare entity tags in conditional requests with the entity tag for
+ the requested resource. Based on a pull request by Sergey Ponomarev.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the description of the storage format for salted hashes in the
+ Javadoc for <code>MessageDigestCredentialHandler</code> and refactor the
+ associated code for clarity.
+ Based on a patch provided by Milo van der Zee. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the path validation to allow the use of the file system root for
+ the <code>docBase</code> attribute of a <code>Context</code>. Note that
+ such a configuration should be used with caution. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Added filtering expression for requests that are not supposed to use
+ session in <code>PersistentValve</code>. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Use the correct method to calculate session idle time in
+ <code>PersistentValve</code>. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64712">64712</a>: The JASPIC authenticator now checks the
+ <code>ServerAuthModule</code> for
+ <code>jakarta.servlet.http.authType</code> and, if present, uses the
+ value provided. Based on a patch by Robert Rodewald. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64713">64713</a>: The JASPIC authenticator now checks the value of
+ <code>jakarta.servlet.http.registerSession</code> set by the
+ <code>ServerAuthModule</code> when deciding whether or nor to register
+ the session. Based on a patch by Robert Rodewald. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.58_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=57661">57661</a>: For requests containing the
+ <code>Expect: 100-continue</code> header, add optional support to delay
+ sending an intermediate 100 status response until the servlet reads the
+ request body, allowing the servlet the opportunity to respond without
+ asking for the request body. Based on a pull request by malaysf. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor the implementation of
+ <code>ServletInputStream.available()</code> to provide a more accurate
+ return value, particularly when end of stream has been reached. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64614">64614</a>: Improve compatibility with FIPS keystores. When a FIPS
+ keystore is configured and the keystore contains multiple keys, the
+ alias attribute will be ignored and the key used will be implementation
+ dependent. (jfclere)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64621">64621</a>: Improve handling HTTP/2 stream reset frames received
+ from clients. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64660">64660</a>: Avoid a potential NPE in the AprEndpoint if a socket
+ is closed in one thread at the same time as the poller is processing an
+ event for that socket in another. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64671">64671</a>: Avoid several potential NPEs introduced in the changes
+ in the previous release to reduce the memory footprint of closed HTTP/2
+ streams. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor the HTTP/2 implementation to more consistently return a stream
+ closed error if errors occur after a stream has been reset by the
+ client. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve handling of HTTP/2 stream level flow control errors and notify
+ the stream immediately if it is waiting for an allocation when the flow
+ control error occurs. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that window update frames are sent for HTTP/2 connections to
+ account for DATA frames containing padding including when the associated
+ stream has been closed. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that window update frames are sent for HTTP/2 connections and
+ streams to account for DATA frames containing zero-length padding.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64710">64710</a>: Revert the changes to reduce the memory footprint of
+ closed HTTP/2 streams as they triggered multiple regressions in the form
+ of <code>NullPointerException</code>s. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the HTTP/2 overhead protection check is performed after
+ each HTTP/2 frame is processed. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.58_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Requests received via proxies may be marked as using the <code>ws</code>
+ or <code>wss</code> protocol rather than <code>http</code> or
+ <code>https</code>. Ensure that such requests are not rejected. PR
+ provided by Ronny Perinke. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64848">64848</a>: Fix a potential issue where the write lock for a
+ WebSocket connection may not be released if an exception occurs during
+ the write. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64644">64644</a>: Add support for a read idle timeout and a write idle
+ timeout to the WebSocket session via custom properties in the user
+ properties instance associated with the session. Based on a pull request
+ by sakshamverma. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.58_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Remove the localization of the text output of the Manager application
+ list of contexts and the Host Manager application list of hosts so that
+ the output is more consistent. PR provided by Holomark. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Clean-up / standardize the XSL files used to generate the documentation.
+ PR provided by John Bampton. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62723">62723</a>: Clarify the effects of some options for cluster
+ <code>channelSendOptions</code>. Patch provided by Mitch Claborn.
+ (schultz)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Remove the out of date functional specification section from the
+ documentation web application. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Extracted CSS styles from the Manager we application for better code
+ maintenance and replaced the GIF logo with SVG. (isapir)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add document for <code>PersistentValve</code>. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.58_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improve the quality of the Japanese translations provided with Apache
+ Tomcat. Includes contributions from Yuki Shira. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64645">64645</a>: Use a non-zero exit code if the
+ <code>service.bat</code> does not complete normally. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons BCEL to 6.5.0. Code clean-up
+ only. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons Codec to 53c93d0 (2020-08-18,
+ 1.15-SNAPSHOT). Code clean-up. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons FileUpload to c25a4e3
+ (2020-08-26, 2.0-SNAPSHOT). Code clean-up and RFC 2231 support. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons Pool to 2.8.1. Code clean-up
+ and improved abandoned pool handling. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons DBCP to 6d232e5 (2020-08-11,
+ 2.8.0-SNAPSHOT). Code clean-up various bug fixes. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.25.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.57_(markt)"><span style="float: right;">2020-07-05</span> Tomcat 8.5.57 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.57_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Remove the error message on start if <code>java.io.tmpdir</code> is
+ missing and add an explicit error message on application deployment when
+ the sole feature that depends on it (anti-resource locking) is
+ configured and can't be used. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Implement a significant portion of the TLS environment variables for
+ the rewrite valve. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64506">64506</a>: Correct a potential race condition in the resource
+ cache implementation that could lead to
+ <code>NullPointerException</code>s during class loading. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add <code>application/wasm</code> to the media types recognised by
+ Tomcat. Based on a PR by Thiago Henrique Hüpner. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a bug in <code>HttpServlet</code> so that a <code>405</code>
+ response is returned for an HTTP/2 request if the mapped servlet does
+ implement the requested method rather than the more general
+ <code>400</code> response. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64541">64541</a>: Refactor the DTD used to validate
+ <code>mbeans-descriptors.xml</code> files to avoid issues when XML
+ entity expansion is limited or disabled. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.57_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Include a <code>Connection: close</code> HTTP header when committing a
+ response and it is known that the <code>maxSwallowSize</code> limit is
+ going to be exceeded. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64509">64509</a>: Correctly parse RFC 2109 version 1 cookies that use a
+ comma as a separator between cookies when using the RFC 6265 cookie
+ processor. Based on a patch by W J Carpenter. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix the utility code that converted IPv6 addresses to a canonical form
+ to correctly handle input addresses that ended with a pair of colons.
+ Based on a patch by syarramsetty-skyhook. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correctly parse RFC 2109 version 1 cookies that have additional linear
+ white space around cookie attribute names and values when using the RFC
+ 6265 cookie processor. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Once an HTTP/2 stream has been closed, ensure that the code that cleans
+ up references that are no longer required is called. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Reduce the memory footprint of closed HTTP/2 streams. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the HTTP/1.1 processor is correctly recycled when a direct
+ connection to h2c is made. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.57_(markt)/Cluster">Cluster</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64560">64560</a>: Refactor the replication of a changed session ID for a
+ replicated session so that the list of changes associated with the
+ session is not reset when the session ID changes. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.57_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64563">64563</a>: Add additional validation of payload length for
+ WebSocket messages. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the calculation of payload length when four or more bytes are
+ required to represent the payload length. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.57_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64501">64501</a>: Refactor the handling of the deprecated
+ <code>LOGGING_CONFIG</code> environment variable to avoid using a POSIX
+ shell feature that is not available by default on Solaris 10. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64514">64514</a>: Fixes some missing class dependency issues in bootstrap
+ to address packaging/dependency concerns for JPMS and OSGi. Pull request
+ provided by Raymond Augé. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64521">64521</a>: Avoid moving i18n translations into classes dir since
+ they are packaged into separate jars. Pull request provided by Raymond
+ Augé. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64522">64522</a>: Package jars in effective dependency order. Pull
+ request provided by Raymond Augé. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improve the quality and expand the coverage of the French translations
+ provided with Apache Tomcat. (remm)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.56_(markt)"><span style="float: right;">2020-06-07</span> Tomcat 8.5.56 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.56_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64432">64432</a>: Correct a refactoring regression that broke handling
+ of multi-line configuration in the RewriteValve. Patch provided by Jj.
+ (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Add the special internal rewrite maps for case modification and
+ escaping. (remm/fschumacher)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64470">64470</a>: The default value of the solidus handling should
+ reflect the associated system property. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Implement a few rewrite SSL env that correspond to Servlet request
+ attributes. (remm)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64442">64442</a>: Be more flexible with respect to the ordering of
+ groups, roles and users in the <code>tomcat-users.xml</code> file.
+ (fschumacher)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.56_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Add support for ALPN on recent OpenJDK 8 releases. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64467">64467</a>: Improve performance of closing idle HTTP/2 streams.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64483">64483</a>: Log a warning if an AJP request is rejected because it
+ contains an unexpected request attribute. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.56_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64488">64488</a>: Ensure that the ImportHandler from the Expression
+ Language API is able to load classes from the Java runtime when running
+ under a SecurityManager. Based on a patch by Volodymyr Siedleck. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.56_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Consistently throw a <code>DeploymentException</code> when an invalid
+ endpoint path is specified and catch invalid endpoint paths earlier.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Include the target URL in the log message when a WebSocket connection
+ fails. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.56_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61127">61127</a>Allow human-readable names for channelSendOptions and
+ mapSendOptions. Patch provided by Igal Sapir. (schultz)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.56_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the list of known <code>Charset</code>s in the
+ <code>CharsetCache</code> to include <code>ISO-8859-16</code>, added in
+ OpenJDK 15. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improve the quality and expand the coverage of the French translations
+ provided with Apache Tomcat. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64430">64430</a>: Add support for the <code>CATALINA_OUT_CMD</code>
+ environment variable that defines a command to which captured stdout and
+ stderr will be redirected. Patch provided by Harald Dunkel. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Switch from the unsupported Maven Ant Tasks to the supported Maven
+ Resolver Ant Tasks to upload artifacts to the ASF Maven repository (and
+ from there to Maven Central). (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.55_(markt)"><span style="float: right;">2020-05-11</span> Tomcat 8.5.55 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.55_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Remove the remainder of the deprecated Servlet 4 Preview API. Users
+ still depending on this feature should ideally upgrade to Tomcat
+ 9.0.x. If upgrade is not possible, application code should cast to the
+ internal Tomcat implementation classes. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Rework the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64021">64021</a> to better support web applications
+ that use a custom class loader that loads resources from non-standard
+ locations. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Remove redundant sole path/URI from error page message on SC_NOT_FOUND.
+ (michaelo)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Log a warning if a <code>CredentialHandler</code> instance is added to
+ an instance of the <code>CombinedRealm</code> (or a sub-class) as the
+ <code>CombinedRealm</code> doesn't use a configured
+ <code>CredentialHandler</code> and it is likely that a configuration
+ error has occurred. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add more descriptive error message in DefaultServlet for SC_NOT_FOUND.
+ (michaelo)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59203">59203</a>: Before calling <code>Thread.stop()</code> (if
+ configured to do so) on a web application created thread that is not
+ stopped by the web application when the web application is stopped, try
+ interrupting the thread first. Based on a pull request by Govinda
+ Sakhare. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64309">64309</a>: Improve the regular expression used to search for
+ class loader repositories when bootstrapping Tomcat. Pull request
+ provided by Paul Muriel Biya-Bi. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64384">64384</a>: Fix multipart configuration ignoring some parameters
+ in some cases. (schultz)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64386">64386</a>: WebdavServlet does not send "getlastmodified"
+ property for resource collections. (michaelo)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64398">64398</a>: Change default value separator for property
+ replacement to <code>:-</code> due to possible conflicts. The
+ syntax is now <code>${name:-default}</code>. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improve validation of storage location when using FileStore. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.55_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Move <code>SocketProperties</code> mbean to its own type rather than
+ use a subType to improve robustness with tools. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Include the problematic data in the error message when reporting that
+ the provided request line contains an invalid component. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the handling of requests that use an expectation. Do not disable
+ keep-alive where the response has a non-2xx status code but the request
+ body has been fully read. (rjung/markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64403">64403</a>: Ensure that compressed HTTP/2 responses are not sent
+ with a content length header appropriate for the original, uncompressed
+ response. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.55_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Remove redundant sole path/URI from error page message on SC_NOT_FOUND.
+ (michaelo)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add more descriptive error message in DefaultServlet for SC_NOT_FOUND.
+ (michaelo)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64373">64373</a>: When a tag file is packaged in a WAR and then that WAR
+ is unpacked in <code>/WEB-INF/classes</code> ensure that the tag file
+ can still be found. Patch provided by Karl von Randow. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the Jasper code that interfaces with the Eclipse Compiler
+ for Java (ECJ) enables Jasper to compile JSPs using ECJ 4.14 onwards
+ when the JSPs have inner classes. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.55_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix the saving of a Context configuration file via the scripting
+ interface of the Manager web application. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add a section to the TLS Connector documentation on different key store
+ types and how to configure them. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.55_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update JUnit to version 4.13. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add missing entries to test class path in sample NetBeans configuration
+ files. Patch provided by Brian Burch. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor to use parameterized <code>Collection</code> constructors where
+ possible. Pull request provided by Lars Grefer. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor to use empty arrays with <code>Collections.toArray()</code>.
+ Pull request provided by Lars Grefer. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor loops with a condition to exit as soon as the condition is met.
+ Pull request provided by Lars Grefer. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor bulk addition to collections to use <code>addAll()</code>
+ rather than a loop. Pull request provided by Lars Grefer. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the coverage of the Chinese translations provided with Apache
+ Tomcat. Contributions provided by winsonzhao, ZhangJieWen and Lee
+ Yazhou. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.24.
+ (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor to use enhanced for loops where possible. Pull request by Lars
+ Grefer. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improve IDE support for IntelliJ IDEA. Patch provided by Lars Grefer.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.54_(markt)"><span style="float: right;">2020-04-08</span> Tomcat 8.5.54 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.54_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure all URL patterns provided via web.xml are %nn decoded
+ consistently using the encoding of the web.xml file where specified and
+ UTF-8 where no explicit encoding is specified. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Allow a comma separated list of class names for the
+ <code>org.apache.tomcat.util.digester.PROPERTY_SOURCE</code>
+ system property. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64149">64149</a>: Avoid NPE when using the access log valve without
+ a pattern. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64226">64226</a>: Reset timezone after parsing a date since the date
+ format is reused. Test case submitted by Gary Thomas. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64247">64247</a>: Using a wildcard for <code>jarsToSkip</code> should
+ not override a possibly present <code>jarsToScan</code>. Based on code
+ submitted by Iridias. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64265">64265</a>: Fix ETag comparison performed by the default servlet.
+ The default servlet always uses weak comparison. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add support for default values when using <code>${...}</code> property
+ replacement in configuration files. Based on a pull request provided by
+ Bernd Bohmann. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.54_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ When configuring an HTTP Connector, warn if the encoding specified for
+ <code>URIEncoding</code> is not a superset of US-ASCII as required by
+ RFC7230. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64240">64240</a>: Ensure that HTTP/0.9 requests that contain additional
+ data on the request line after the URI are treated consistently. Such
+ requests will now always be treated as HTTP/1.1. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expose the HTTP/2 connection ID and stream ID to applications via the
+ request attributes <code>org.apache.coyote.connectionID</code> and
+ <code>org.apache.coyote.streamID</code> respectively. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Replace the system property
+ <code>org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH</code>
+ with the Connector attribute <code>encodedSolidusHandling</code> that
+ adds an additional option to pass the <code>%2f</code> sequence through
+ to the application without decoding it in addition to rejecting such
+ sequences and decoding such sequences. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expose the associated <code>HttpServletRequest</code> to the
+ <code>CookieProcessor</code> when generating a cookie header so the
+ header can be tailored based on the properties of the request, such as
+ the user agent, if required. Based on a patch by Lazar Kirchev. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.54_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add support for specifying Java 14 (with the value <code>14</code>) and
+ Java 15 (with the value <code>15</code>) as the compiler source and/or
+ compiler target for JSP compilation. If used with an ECJ version that
+ does not support these values, a warning will be logged and the latest
+ supported version will used. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.54_(markt)/Cluster">Cluster</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor the creation of <code>DeltaRequest</code> objects to make it
+ simpler to use custom implementations. Based on a pull request provided
+ by Thomas Stock. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.54_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the documentation web application to remove references to the
+ <code>org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH</code>
+ system property changing how the sequence <code>%5c</code> is
+ interpreted in a URI. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.54_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improve the quality and expand the coverage of the French translations
+ provided with Apache Tomcat. Contribution provided by Tom Bens. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the coverage of the Chinese translations provided with Apache
+ Tomcat. Contribution provided by Lee Yazhou. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64270">64270</a>: Set the documented default umask of <code>0027</code>
+ when using jsvc via <code>daemon.sh</code> and allow the umask used to
+ be configured via the <code>UMASK</code> environment variable as it is
+ when using <code>catalina.sh</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Deprecated the <code>LOGGING_CONFIG</code> environment variable and
+ replace it with the <code>CATALINA_LOGGING_CONFIG</code> environment
+ variable to avoid clashes with other components that use
+ <code>LOGGING_CONFIG</code>. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.53_(markt)"><span style="float: right;">2020-03-16</span> Tomcat 8.5.53 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.53_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64210">64210</a>: Correct a regression in the improvements to HTTP
+ header validation that caused requests to be incorrectly treated as
+ invalid if a <code>CRLF</code> sequence was split between TCP packets.
+ Improve validation of request lines, including for HTTP/0.9 requests.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.53_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64206">64206</a>: Correct a regression introduced in 8.5.51 that meant
+ that the HTTP port specified when using the Windows Installer was
+ ignored and 8080 was always used. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.52_(markt)"><span style="float: right;">not released</span> Tomcat 8.5.52 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.52_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Store config compatibility with HostWebXmlCacheCleaner listener. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Modify the <code>RewriteValve</code> to use
+ <code>ServletRequest.getServerName()</code> to populate the
+ <code>HTTP_HOST</code> variable rather than extracting it from the
+ <code>Host</code> header as this allows HTTP/2 to be supported. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Remove <code>PushBuilder</code> from the deprecated Servlet 4 Preview
+ API. Users still depending on this feature should ideally upgrade to
+ Tomcat 9.0.x. If upgrade is not possible, application code should cast
+ to the internal Tomcat implementation classes. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Switch Tomcat embedded to loading MIME type mappings from a property
+ file generated from the default <code>web.xml</code> so the MIME type
+ mappings are consistent regardless of how Tomcat is started. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Missing store config attributes for Resources elements. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64153">64153</a>: Ensure that the parent for the web application class
+ loader is set consistently. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64166">64166</a>: Ensure that the names returned by
+ <code>HttpServletResponse.getHeaderNames()</code> are unique. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Rename <code>org.apache.tomcat.util.digester.Digester$EnvironmentPropertySource</code>
+ to
+ <code>org.apache.tomcat.util.digester.EnvironmentPropertySource</code>.
+ The old class is still available but deprecated. Patch provided by Bernd
+ Bohmann. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add new attribute <code>persistAuthentication</code> to both
+ <code>StandardManager</code> and <code>PersistentManager</code> to
+ support authentication persistence. Patch provided by Carsten Klein.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64184">64184</a>: Avoid repeated log messages if a
+ <code>MemoryUserDatabase</code> is configured but the specified
+ configuration file is missing. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64189">64189</a>: Expose the web application version String as a
+ <code>ServletContext</code> attribute named
+ <code>org.apache.catalina.webappVersion</code>. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.52_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When the NIO or APR/native connectors were configured with
+ <code>useAsyncIO="true"</code> and a zero length read or write was
+ performed, the read/write would time out rather than return immediately.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64141">64141</a>: If using a CA certificate, remove a default value
+ for the truststore file when not using a JSSE configuration. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve robustness of OpenSSLEngine shutdown. Based on code submitted
+ by Manuel Dominguez Sarmiento. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add the TLS request attributes used by IIS to the attributes that an AJP
+ Connector will always accept. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ A zero length AJP secret will now behave as if it has not been
+ specified. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64188">64188</a>: If an error occurs while committing or flushing the
+ response when using a multiplexing protocol like HTTP/2 that requires
+ the channel to be closed but not the connection, just close the channel
+ and allow the other channels using the connection to continue. Based on
+ a suggestion from Alejandro Anadon. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the semantics of <code>getEnableSessionCreation</code> and
+ <code>setEnableSessionCreation</code> for <code>OpenSSLEngine</code>.
+ Pull request provided by Alexander Scheel. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Allow async requests to complete cleanly when the Connector is paused
+ before <code>complete()</code> is called on a container thread. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.52_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Parameterize JSP version and API class names in localization messages to
+ allow simpler re-use between major versions. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that TLD files listed in the <code>jsp-config</code> section of
+ <code>web.xml</code> that are registered in the
+ <code>uriTldResourcePathMap</code> with the URI specified in
+ <code>web.xml</code> are also registered with the URI in the TLD file if
+ it is different. Patch provided by Markus Lottmann. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.52_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the documentation for the <code>address</code> attribute of the
+ AJP Connector and document that the AJP Connector also supports the
+ <code>ipv6v6only</code> attribute with the APR/Native implementation.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.52_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the coverage of the French translations provided with Apache
+ Tomcat. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the coverage of the Chinese translations provided with Apache
+ Tomcat. Contribution provided by BoltzmannWxd. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the coverage of the Korean translations provided with Apache
+ Tomcat. Contributions provided by B. Cansmile Cha. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64190">64190</a>: Add support for specifying milliseconds (using
+ <code>S</code>, <code>SS</code> or <code>SSS</code>) in the timestamp
+ used by JULI's <code>OneLineFormatter</code>. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.51_(markt)"><span style="float: right;">2020-02-11</span> Tomcat 8.5.51 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.51_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Remove part of the deprecated Servlet 4 Preview API. Users still
+ depending on this feature should ideally upgrade to Tomcat 9.0.x. If
+ upgrade is not possible, application code should cast to the internal
+ Tomcat implementation classes. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Do not store username and password as session notes during
+ authentication if they are not needed. (kkolinko)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid useless environment restore when not using GSSCredential
+ in JNDIRealm. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58577">58577</a>: Respect the argument-count when searching for MBean
+ operations to invoke via the JMXProxyServlet. (schultz)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62755">62755</a>: Add ability to opt out of adding the default web.xml
+ config when embedding Tomcat and adding a context via
+ <code>addWebapp()</code>. Call
+ <code>setAddDefaultWebXmlToWebapp(false)</code> to prevent the automatic
+ config. (isapir/markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63691">63691</a>: Skip all jar and directory scanning when the wildcard
+ pattern "*" or "*.jar" is set or added to
+ <code>tomcat.util.scan.StandardJarScanFilter.jarsToSkip</code>. (isapir)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64005">64005</a>: Correct a regression in the static resource caching
+ changes introduced in 8.5.28. Avoid a <code>NullPointerException</code>
+ when working with the URL provided for the root of a packed WAR. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64008">64008</a>: Clarify/expand the Javadoc for the
+ <code>Tomcat#addWebapp()</code> and related methods. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Deprecate the <code>JmxRemoteLifecycleListener</code> as the features it
+ provides are now available in the remote JMX capability included with
+ the JRE. This listener will be removed in Tomcat 10 and may be removed
+ from Tomcat 8.5.x some time after 2020-12-31. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64011">64011</a>: <code>JNDIRealm</code> no longer authenticates to LDAP.
+ (michaelo)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64021">64021</a>: Ensure that container provided SCIs are always loaded
+ before application provided SCIs. Note that where both the container and
+ the application provide the same SCI, it is the application provided SCI
+ that will be used. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ SCI definitions from JARs unpacked into <code>WEB-INF/classes</code> are
+ now handled consistently and will always be found irrespective of
+ whether the web application defines a JAR ordering or not. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64023">64023</a>: Skip null-valued session attributes when deserializing
+ sessions. (schultz)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Do not throw a NullPointerException when an MBean or operation cannot
+ be found by the JMXProxyServlet. (schultz)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64067">64067</a>: Allow more than one parameter when defining RewriteMaps.
+ (fschumacher)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64074">64074</a>: <code>InputStream</code>s for directories obtained
+ from resource URLs now return a directory listing consistent with the
+ behaviour of <code>FileURLConnection</code>. In addition to restoring
+ the behaviour that was lost as a result of the introduction of
+ <code>CachedResourceURLConnection</code>, it expands the feature to
+ include packedWARs and to take account of resource JARs. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Refactor recycle facade system property into a new connector attribute
+ named <code>discardFacades</code>. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64089">64089</a>: Add <code>${...}</code> property replacement support
+ to XML external entity definitions. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Deprecate <code>MappingData.contextPath</code> as it is unused. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a problem that meant that remote host, address and port information
+ could be missing in the access log for an HTTP/2 request where the
+ connection was closed unexpectedly. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.51_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that Servlet Asynchronous processing timeouts fire when requests
+ are made using HTTP/2. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix the corruption of the TLS configuration when using the deprecated TLS
+ attributes on the Connector if the configuration has already been set
+ via the new <code>SSLHostConfig</code> and
+ <code>SSLHostConfigCertificate</code> elements. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63966">63966</a>: Switch the message shown when using HTTP to connect to
+ an HTTPS port from ISO-8859-1 to UTF-8. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add support for RFC 5915 formatted, unencrypted EC key files when using
+ a JSSE based TLS connector. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ When reporting / logging invalid HTTP headers encode any non-printing
+ characters using the 0xNN form. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a regression introduced in 8.5.48 that meant invalid tokens in
+ the <code>Transfer-Encoding</code> header were ignored rather than
+ treated as an error. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Rename the HTTP Connector attribute <code>rejectIllegalHeaderName</code>
+ to <code>rejectIllegalHeader</code> and expand the underlying
+ implementation to include header values as well as names. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Disable (comment out in server.xml) the AJP/1.3 connector by default.
+ (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Change the default bind address for the AJP/1.3 connector to be the
+ loopback address. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Rename the <code>requiredSecret</code> attribute of the AJP/1.3
+ Connector to <code>secret</code> and add a new attribute
+ <code>secretRequired</code> that defaults to <code>true</code>. When
+ <code>secretRequired</code> is <code>true</code> the AJP/1.3 Connector
+ will not start unless the <code>secret</code> attribute is configured to
+ a non-null, non-zero length String. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add a new attribute, <code>allowedRequestAttributesPattern</code> to
+ the AJP/1.3 Connector. Requests with unrecognised attributes will be
+ blocked with a 403. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.51_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Update the performance optimisation for using expressions in tags that
+ depend on uninitialised tag attributes with implied scope to make the
+ performance optimisation aware of the new public class
+ (<code>java.lang.Record</code>) added in Java 14. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64097">64097</a>: Replace the faulty custom services lookup used for
+ <code>ExpressionFactory</code> implementations with
+ <code>ServiceLoader</code>. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add a <code>META-INF/services</code> entry to jasper-el.jar so that the
+ Expression Language implementation can be discovered via the services
+ API. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.51_(markt)/Cluster">Cluster</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64043">64043</a>: Ensure that session ID changes are replicated during
+ form-authentication. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.51_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=64000">64000</a>: In the examples web application, where a Servlet
+ example includes i18n support, the Locale used should be based on the
+ request locale and not the server locale. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add additional information on securing AJP/1.3 Connectors. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.51_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63995">63995</a>: Ensure statements are closed when a pooled JDBC
+ connection is passivated in Tomcat's fork of Commons DBCP2. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.50_(markt)"><span style="float: right;">2019-12-12</span> Tomcat 8.5.50 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.50_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvements to CsrfPreventionFilter: additional logging, allow the
+ CSRF nonce request parameter name to be customized.
+ (schultz)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63681">63681</a>: Introduce RealmBase#authenticate(GSSName, GSSCredential)
+ and friends. (michaelo)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63964">63964</a>: Correct a regression in the static resource caching
+ changes introduced in 8.5.48. URLs constructed from URLs obtained from
+ the cache could not be used to access resources. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63968">63968</a>: Fix <code>ClassCastException</code> in the
+ <code>Expires</code> filter which was a regression in the fix for
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63909">63909</a>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63970">63970</a>: Correct a regression in the static resource caching
+ changes introduced in 8.5.48. Connections to URLs obtained for JAR
+ resources could not be cast to <code>JarURLConnection</code>. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63937">63937</a>: Add a new attribute to the standard
+ <code>Authenticator</code> implementations,
+ <code>allowCorsPreflight</code>, that allows the
+ <code>Authenticator</code>s to be configured to allow CORS preflight
+ requests to bypass authentication as required by the CORS specification.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63939">63939</a>: Correct the same origin check in the CORS filter. An
+ origin with an explicit default port is now considered to be the same as
+ an origin without a default port and origins are now compared in a
+ case-sensitive manner as required by the CORS specification. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63982">63982</a>: CombinedRealm makes assumptions about principal implementation
+ (michaelo)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63983">63983</a>: Correct a regression in the static resource caching
+ changes introduced in 8.5.48. A large number of file descriptors were
+ opened that could reach the OS limit before being released by GC.
+ (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63987">63987</a>: Deprecate <code>Realm.getRoles(Principal)</code>. (michaelo)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Add a unit test for the session <code>FileStore</code> implementation
+ and refactor loops in <code>FileStore</code> to use the ForEach style.
+ Pull request provided by Govinda Sakhare. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor FORM authentication to reduce duplicate code and to ensure that
+ the authenticated Principal is not cached in the session when caching is
+ disabled. This is the fix for CVE-2019-17563. (markt/kkolinko)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.50_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor the APR poller to always use a single pollset now that the
+ Windows operating systems that required multiple smaller pollsets to be
+ used are no longer supported. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Add vectoring for NIO in the base and SSL channels. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add async API to the NIO and APR connector. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63931">63931</a>: Improve timeout handling for asyncIO to ensure that
+ blocking operations see a <code>SocketTimeoutException</code> if one
+ occurs. (remm/markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63932">63932</a>: By default, do not compress content that has a strong
+ ETag. This behaviour is configuration for the HTTP/1.1 and HTTP/2
+ connectors via the new Connector attribute
+ <code>noCompressionStrongETag</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Simplify regular endpoint writes by removing write(Non)BlockingDirect.
+ All regular writes will now be buffered for a more predictable
+ behavior. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Send an exception directly to the completion handler when a timeout
+ exception occurs for the operation, and add a boolean to make sure the
+ completion handler is called only once. (remm/markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.50_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure a couple of very unlikely concurrency issues are avoided when
+ writing WebSocket messages. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.50_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix the broken re-try link on the error page for the FORM authentication
+ example in the JSP section of the examples web application. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the documentation for the <code>maxConnections</code> attribute
+ of the <code>Connector</code> in the documentation web application.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add the ability to set and display session attributes in the JSP FORM
+ authentication example to demonstrate session persistence across
+ restarts for authenticated sessions. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.50_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63815">63815</a> (quoting the use of
+ <code>CATALINA_OPTS</code> and <code>JAVA_OPTS</code> when used in shell
+ scripts to avoid the expansion of <code>*</code>) as it caused various
+ regressions, particularly with <code>daemon.sh</code>. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the search made by the Windows installer for a suitable Java
+ installation to include the 64-bit JDK registry entries and the
+ <code>JAVA_HOME</code> environment variable. Pull request provided by
+ Alexander Norz. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the coverage of the German translations provided with Apache
+ Tomcat. Contribution provided by Jens. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the coverage of the French translations provided with Apache
+ Tomcat. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the coverage of the Japanese translations provided with Apache
+ Tomcat. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the coverage of the Korean translations provided with Apache
+ Tomcat. (woonsan)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the coverage of the Chinese translations provided with Apache
+ Tomcat. Contributions provided by lins and 纾�. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons BCEL to ff6941e (2019-12-06,
+ 6.4.2-dev). Code clean-up only. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons Codec to 9637dd4 (2019-12-06,
+ 1.14-SNAPSHOT). Code clean-up and a fix for CODEC-265. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons FileUpload to 2317552
+ (2019-12-06, 2.0-SNAPSHOT). Refactoring. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons Pool 2 to 6092f92 (2019-12-06,
+ 2.8.0-SNAPSHOT). Clean-up and minor refactoring. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons DBCP 2 to a36390 (2019-12-06,
+ 2.7.1-SNAPSHOT). Minor refactoring. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.49_(markt)"><span style="float: right;">2019-11-21</span> Tomcat 8.5.49 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.49_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a regression introduced in 8.5.48 that could trigger a
+ <code>NullPointerException</code> when using a
+ <code>RequestDispatcher</code>. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improvement to CsrfPreventionFilter: expose the latest available nonce
+ as a request attribute; expose the expected nonce request parameter
+ name as a context attribute.
+ (schultz)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.48_(markt)"><span style="float: right;">not released</span> Tomcat 8.5.48 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.48_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63832">63832</a>: Properly mark container as FAILED when a JVM error
+ occurs on stop. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63836">63836</a>: Ensure that references to the Host object are cleared
+ once the Host instance is destroyed. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63872">63872</a>: Fix some edge cases where the docBase was not being
+ set using a canonical path which in turn meant resource URLs were not
+ being constructed as expected. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Make a best effort attempt to clean-up if a request fails during
+ processing due to an <code>OutOfMemoryException</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that, when static resource caching is enabled for a web
+ application, all access to static files (including JSP files) goes via
+ the cache so that a consistent view of the static files is seen. Prior
+ to this change it was possible to see an updated last modified time but
+ the content would be that prior to the modification. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63905">63905</a> Clean up Tomcat CSS. (michaelo)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63909">63909</a>: When the <code>ExpiresFilter</code> is used without a
+ default and the response is served by the Default Servlet, ensure that
+ the filter processes the response if the Default Servlet sets a 304 (Not
+ Found) status code. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Update the Servlet 4 preview API to reflect changes made to the API in
+ the final release. Note that this preview API has been deprecated for over a
+ year and may be removed as soon as the next 8.5.x release. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor JMX remote RMI registry creation. This is the fix for
+ CVE-2019-12418. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.48_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that <code>ServletRequest.isAsyncStarted()</code> returns
+ <code>false</code> once <code>AsyncContext.complete()</code> or
+ <code>AsyncContext.dispatch()</code> has been called during
+ <code>AsyncListener.onTimeout()</code> or
+ <code>AsyncListener.onError()</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63816">63816</a> and <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63817">63817</a>: Correctly handle I/O errors after
+ asynchronous processing has been started but before the container thread
+ that started asynchronous processing has completed processing the
+ current request/response. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63825">63825</a>: When processing the <code>Expect</code> and
+ <code>Connection</code> HTTP headers looking for a specific token, be
+ stricter in ensuring that the exact token is present. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63829">63829</a>: Improve the check of the <code>Content-Encoding</code>
+ header when looking to see if Tomcat is serving pre-compressed content.
+ Ensure that only a full token is matched and that the match is case
+ insensitive. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63835">63835</a>: Add support for Keep-Alive response header. (michaelo)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63864">63864</a>: Refactor parsing of the <code>transfer-encoding</code>
+ request header to use the shared parsing code and reduce duplication.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63865">63865</a>: Add <code>Unset</code> option to same-site cookies
+ and pass through <code>None</code> value if set by user. Patch provided
+ by John Kelly. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63894">63894</a>: Ensure that the configured values for
+ <code>certificateVerification</code> and
+ <code>certificateVerificationDepth</code> are correctly passed to the
+ OpenSSL based SSLEngine implementation. (remm/markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63859">63859</a>: Do not perform a blocking read after a
+ <code>CPING</code> message is received by the AJP connector because, if
+ the JK Connector is configured with
+ <code>ping_mode="I"</code>, the <code>CPING</code> message
+ will not always be followed by the start of a request. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Properly calculate all dynamic parts of the ErrorReportValve response
+ on the fly in
+ <code>org.apache.coyote.http2.TestHttp2InitialConnection</code>.
+ (michaelo)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.48_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63897">63897</a>: Capture the timestamp of a JSP for the purposes of
+ modification tracking before the JSP is compiled to prevent a race
+ condition if the JSP is modified during compilation. Patch provided by
+ Karl von Randow. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a race condition that could mean changes to a modified JSP were not
+ visible to end users. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.48_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63913">63913</a>: Wrap any <code>NullPointerException</code>s throw by
+ the <code>Inflater</code> or <code>Deflater</code> used by the
+ <code>PerMessageDeflate</code> extension in an <code>IOException</code>
+ so that the error can be caught and handled by the WebSocket error
+ handling mechanism. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.48_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the description of the default value for the server attribute in
+ the security How-To. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.48_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63815">63815</a>: Quote the use of <code>CATALINA_OPTS</code> and
+ <code>JAVA_OPTS</code> when used in shell scripts to avoid the expansion
+ of <code>*</code>. Note that any newlines present in
+ <code>CATALINA_OPTS</code> and/or <code>JAVA_OPTS</code> will no longer
+ removed. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63826">63826</a>: Remove <code>commons-daemon-native.tar.gz</code> and
+ <code>tomcat-native.tar.gz</code> from the binary zip distributions for
+ Windows since compiled versions of those components are already
+ included within the zip distributions. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63838">63838</a>: Suppress reflexive access warnings when running the
+ unit tests on the command line. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add missing charsets from the HPE JVM on HP-UX to pass unit tests in
+ <code>org.apache.tomcat.util.buf.TestCharsetCache</code>. (michaelo)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the coverage and quality of the French translations provided
+ with Apache Tomcat. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the coverage and quality of the Korean translations provided
+ with Apache Tomcat. (woonsan)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the coverage and quality of the Simplified Chinese translations
+ provided with Apache Tomcat. Contributions provided by rpo130, Mason
+ Shen, leeyazhou, winsonzhao, qingshi huang, Lay, Shucheng Hou and
+ Yanming Zhou. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.47_(markt)"><span style="float: right;">2019-10-11</span> Tomcat 8.5.47 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.47_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Use URL safe base 64 encoding rather than standard base 64 encoding when
+ generating or parsing the <code>HTTP2-Settings</code> header as part of
+ an HTTP upgrade to <code>h2c</code> as required by RFC 7540. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63765">63765</a>: NIO2 should try to unwrap after TLS handshake to
+ avoid edge cases. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63766">63766</a>: Ensure Processor objects are recycled when processing
+ an HTTP upgrade connection that terminates before processing switches to
+ the Processor for the upgraded protocol. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.47_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63781">63781</a>: When performing various checks related to the
+ visibility of classes, fields and methods in the EL implementation, also
+ check that the containing module has been exported. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Web_Socket">Web Socket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63753">63753</a>: Ensure that the <code>Host</code> header in a Web
+ Socket HTTP upgrade request only contains a port if a non-default port
+ is being used. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When running on Java 9 and above, don't attempt to instantiate WebSocket
+ Endpoints found in modules that are not exported. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.47_(markt)/Web_Applications">Web Applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Docs: " class="icon" src="./images/docs.gif">
+ Add Javadoc for the Common Annotations API implementation. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.47_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When connections are validated without an explicit validation query,
+ ensure that any transactions opened by the validation process are
+ committed. Patch provided by Pascal Davoust. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.47_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Deprecate <code>org.apache.tomcat.util.compat.TLS</code>.
+ Its functionality was only used for unit tests in
+ <code>org.apache.tomcat.util.net.TesterSupport</code>
+ and has been moved there. (rjung)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63759">63759</a>: When installing Tomcat with the Windows installer,
+ grant sufficient privileges to enable the uninstaller to execute when
+ user account control is active. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Use a build property to define the minimum supported Java version and
+ use that build property to reduce the number of edits required to update
+ the minimum supported Java version. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63767">63767</a>: Update to Commons Daemon 1.2.2. This corrects a
+ regression in Commons Daemon 1.2.0 and 1.2.1 that caused the Windows
+ Service to crash on start when running on an operating system that had
+ not been fully updated. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.46_(markt)"><span style="float: right;">2019-09-19</span> Tomcat 8.5.46 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.46_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63684">63684</a>: <code>Wrapper</code> never passed to
+ <code>RealmBase.hasRole()</code> for given security constraints.
+ (michaelo)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid a potential <code>NullPointerException</code> on Service stop if a
+ Service is embedded directly (i.e. with no Server) in an application
+ and JNDI is enabled. Patch provided by S. Ali Tokmen. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add a new <code>PropertySource</code> implementation,
+ <code>EnvironmentPropertySource</code>, that can be used to do property
+ replacement in configuration files with environment variables. Based on
+ a pull request provided by Thomas Meyer. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.46_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63682">63682</a>: Fix a potential hang when using the asynchronous
+ Servlet API to write the response body and the stream and/or connection
+ window reaches 0 bytes in size. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63690">63690</a>: Use the average of the current and previous sizes when
+ calculating overhead for HTTP/2 <code>DATA</code> and
+ <code>WINDOW_UPDATE</code> frames to avoid false positives as a result
+ of client side buffering behaviour that causes a small percentage of
+ non-final DATA frames to be smaller than expected. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63706">63706</a>: Avoid NPE accessing https port with plaintext. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct typos in the names of the configuration attributes
+ <code>overheadDataThreshold</code> and
+ <code>overheadWindowUpdateThreshold</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ If the HTTP/2 connection requires an initial window size larger than the
+ default, send a WINDOW_UPDATE to increase the flow control window for the
+ connection so that the initial size of the flow control window for the
+ connection is consistent with the increased value. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63710">63710</a>: When using HTTP/2, ensure that a
+ <code>content-length</code> header is not set for those responses with
+ status codes that do not permit one. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63737">63737</a>: Correct various issues when parsing the
+ <code>accept-encoding</code> header to determine if gzip encoding is
+ supported including only parsing the first header found. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.46_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the source code links on the index page for the ROOT web
+ application to point to Git rather than Subversion. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix various issues with the Javadoc generated for the documentation web
+ application to enable release builds to be built with Java 10 onwards.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a large number of Javadoc and documentation typos. Patch provided by
+ KangZhiDong. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Spelling and formatting corrections for the cluster how-to. Pull request
+ provided by Bill Mitchell. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.46_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Back-port various corrections and improvements to the English versions
+ of the i18n messages. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Include the available German translations in the standard Tomcat
+ distribution. Back-port additions and updates to the German i18n
+ messages. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Back-port various corrections and improvements to the Spanish i18n
+ messages. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Back-port various corrections and improvements to the French i18n
+ messages. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Back-port various corrections and improvements to the Japanese i18n
+ messages. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Back-port various corrections and improvements to the Russian i18n
+ messages. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add Korean translations to the standard Tomcat distribution. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add Simplified Chinese translations to the standard Tomcat distribution.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62140">62140</a>: Additional usage documentation in comments for
+ <code>catalina.[bat|sh]</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix <code>JSSE_OPTS</code> quoting in <code>catalina.bat</code>.
+ Contributed by Peter Uhnak. (fschumacher)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63625">63625</a>: Update to Commons Daemon 1.2.1. This corrects several
+ regressions in Commons Daemon 1.2.1, most notably the Windows Service
+ crashing on start when using 32-bit JVMs. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63689">63689</a>: Correct a regression in the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63285">63285</a>
+ that meant that when installing a service, the service display name was
+ not set. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When performing a silent install with the Windows Installer, ensure that
+ the registry entries are added to the 64-bit registry when using a
+ 64-bit JVM. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Remove unused i18n messages and associated translations. Patch provided
+ by KangZhiDong. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.45_(markt)"><span style="float: right;">2019-08-21</span> Tomcat 8.5.45 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.45_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Remove the code in the sendfile poller that ensured smaller pollsets
+ were used with older, no longer supported versions of Windows that
+ could not support larger pollsets. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.44_(markt)"><span style="float: right;">not released</span> Tomcat 8.5.44 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.44_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62258">62258</a>: Don't trigger the standard error page mechanism when
+ the error has caused the connection to the client to be closed as no-one
+ will ever see the error page. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62496">62496</a>: Add option to write auth information (remote user/auth type)
+ to response headers. (michaelo)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=51497">51497</a>: Add an option, <code>ipv6Canonical</code>, to the
+ <code>AccessLogValve</code> that causes IPv6 addresses to be output in
+ canonical form defined by RFC 5952. (ognjen/markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=57665">57665</a>: Add support for the <code>X-Forwarded-Host</code>
+ header to the <code>RemoteIpFilter</code> and <code>RemoteIpValve</code>.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63550">63550</a>: Only try the <code>alternateURL</code> in the
+ <code>JNDIRealm</code> if one has been specified. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63556">63556</a>: Mark request as forwarded in RemoteIpValve and
+ RemoteIpFilter (michaelo)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63579">63579</a>: Correct parsing of malformed OPTIONS requests and
+ reject them with a 400 response rather than triggering an internal error
+ that results in a 500 response. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63608">63608</a>: Align the implementation of the negative match feature
+ for patterns used with the <code>RewriteValve</code> with the
+ description in the documentation. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63627">63627</a>: Implement more fine-grained handling in
+ <code>RealmBase.authenticate(GSSContext, boolean)</code>. (michaelo)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ If an unhandled exception occurs on a asynchronous thread started via
+ <code>AsyncContext.start(Runnable)</code>, process it using the standard
+ error page mechanism. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Discard large byte buffers allocated using setBufferSize when recycling
+ the request. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct version information in <code>X-Powered-By</code> header. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid a <code>NullPointerException</code> in the
+ <code>CrawlerSessionManagerValve</code> if no ROOT Context is deployed
+ and a request does not map to any of the other deployed Contexts. Patch
+ provided by Jop Zinkweg. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63636">63636</a>: <code>Context.findRoleMapping()</code> never called
+ in <code>StandardWrapper.findSecurityReference()</code>. (michaelo)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.44_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63524">63524</a>: Improve the handling of PEM file based keys and
+ certificates that do not include a full certificate chain when
+ configuring the internal, in-memory key store. Improve the handling of
+ PKCS#1 formatted private keys when configuring the internal, in-memory
+ key store. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63568">63568</a>: Avoid error when trying to set tcpNoDelay on socket
+ types that do not support it, which can occur when using the NIO
+ inherited channel capability. Submitted by Franti拧ek Ku膷era. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct parsing of invalid host names that contain bytes in the range
+ 128 to 255 and reject them with a 400 response rather than triggering an
+ internal error that results in a 500 response. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63571">63571</a>: Allow users to configure infinite TLS session caches
+ and/or timeouts. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63578">63578</a>: Improve handling of invalid requests so that 400
+ responses are returned to the client rather than 500 responses. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix h2spec test suite failure. It is an error if a Huffman encoded
+ string literal contains the EOS symbol. (jfclere)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Connections that fail the TLS handshake will now appear in the access
+ logs with a 400 status code. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Timeouts for HTTP/2 connections were not always correctly handled
+ leaving some connections open for longer than expected. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the HTTP/2 excessive overhead protection to cover various forms
+ of abusive client behaviour and close the connection if any such
+ behaviour is detected. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a crash on shutdown with the APR/native connector when a blocking
+ I/O operation was still in progress when the connector stopped. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.44_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63597">63597</a>: Update the custom 404 error page for the Host Manager
+ to take account of previous refactoring so that the page is used for
+ 404 errors rather than falling back to the default error page. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.44_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=55969">55969</a>: Tighten up the security of the Apache Tomcat
+ installation created by the Windows installer. Change the default
+ shutdown port used by the Windows installer from <code>8005</code> to
+ <code>-1</code> (disabled). Limit access to the chosen installation
+ directory to local administrators, Local System and Local Service.
+ (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62696">62696</a>: The digital signature for the Windows installer now
+ uses SHA-256 for hashes. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63285">63285</a>: Modify <code>service.bat</code> so that when
+ installing a Windows service, by default, it changes the name of the
+ executables used by the Windows service to match the service name. This
+ makes the installation behaviour consistent with the Windows installer.
+ The original executable names will be restored when the Windows service
+ is removed. The renaming can be disabled by using the new
+ <code>--no-rename</code> option after the service name. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Switch from Checkstyle to the JRE6 backport and update to version 8.22.
+ This allows Tomcat 8.5 to use the newer Checkstyle releases while still
+ building with Java 7. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63285">63285</a>: Add an option to <code>service.bat</code> so that when
+ installing a Windows service, the name of the executables used by the
+ Windows service may be changed to match the service name. This makes the
+ installation behaviour consistent with the Windows installer. The
+ original executable names will be restored when the Windows service is
+ removed. The renaming can be enabled by using the new
+ <code>--rename</code> option after the service name. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63310">63310</a>: Update to Commons Daemon 1.2.0. This provides improved
+ support for Java 11. This also changes the user configured by the
+ Windows installer for the Windows service from <code>Local System</code>
+ to the lower privileged <code>Local Service</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63567">63567</a>: Restore the passing of <code>$LOGGING_MANAGER</code>
+ to the jvm in <code>catalina.sh</code> when calling <code>stop</code>.
+ (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons Codec to 3ebef4a (2018-08-01) to
+ pick up the fix for CODEC-134. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons Pool2 to 796e32d (2018-08-01) to
+ pick up the changes Commons Pool2 2.7.0. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons DBCP2 to 87d9e3a (2018-08-01) to
+ pick up the changes Commons DBCP2 2.7.0 and DBCP-555. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63648">63648</a>: Update the test TLS keys and certificates used in the
+ test suite to replace the keys and certificates that are about to
+ expire. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.43_(markt)"><span style="float: right;">2019-07-09</span> Tomcat 8.5.43 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.43_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Modify the Default and WebDAV Servlets so that a 405 status code is
+ returned for <code>PUT</code> and <code>DELETE</code> requests when
+ disabled via the <code>readonly</code> initialisation parameter.
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Align the contents of the <code>Allow</code> header with the response
+ code for the Default and WebDAV Servlets. For any given resource a
+ method that returns a 405 status code will not be listed in the
+ <code>Allow</code> header and a method listed in the <code>Allow</code>
+ header will not return a 405 status code. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When using WebDAV to copy a file resource to a destination that requires
+ a collection to be overwritten, ensure that the operation succeeds
+ rather than fails (with a 500 response). This enables Tomcat to pass two
+ additional tests from the Litmus WebDAV test suite. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=49464">49464</a>: Improve the Default Servlet's handling of static files
+ when the file encoding is not compatible with the required response
+ encoding. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">Fix typo in UTF-32LE charset name. Patch by zhanhb vi Github.
+ (fschumacher)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58590">58590</a>: Add the ability for a UserDatabase to monitor the
+ backing XML file for changes and reload the source file if a change in
+ the last modified time is detected. This is enabled by default meaning
+ that changes to <code>$CATALINA_BASE/conf/tomcat-users.xml</code> will
+ now take effect a short time after the file is saved. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve parsing of Range request headers. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Range headers that specify a range unit Tomcat does not recognise should
+ be ignored rather than triggering a 416 response. Based on a pull
+ request by zhanhb. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When comparing a date from a <code>If-Range</code> header, an exact
+ match is required. Based on a pull request by zhanhb. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add an option to the default servlet to disable processing of PUT
+ requests with Content-Range headers as partial PUTs. The default
+ behaviour (processing as partial PUT) is unchanged. Based on a pull
+ request by zhanhb. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve parsing of Content-Range headers. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the HEAD response is consistent with the GET response when
+ <code>HttpServlet</code> is relied upon to generate the HEAD response
+ and the GET response uses chunking. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the recommended minimum Tomcat Native version to 1.2.23. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.43_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid a potential hang when a client connects using TLS 1.0 to a Tomcat
+ HTTPS connector configured to use NIO or NIO with OpenSSL 1.1.1 or
+ later. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Once a URI is identified as invalid don't attempt to process it further.
+ Based on a PR by Alex Repert. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix to avoid the possibility of long poll times for individual pollers
+ when using multiple pollers with APR. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63205">63205</a> so it only applies when using
+ PKCS12 keystores as regressions have been reported with some other
+ keystore types. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.43_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Include file names in error messages if SMAP processor is unable to
+ delete or rename a class file during SMAP generation. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.43_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63521">63521</a>: As required by the WebSocket specification, if a POJO
+ that is deployed as a result of the SCI scan for annotated POJOs is
+ subsequently deployed via the programmatic API ignore the programmatic
+ deployment. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.43_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Switch i18n message files to use UTF-8 and convert to ASCII at build
+ time. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63523">63523</a>: Restore SSLUtilBase methods as protected to preserve
+ compatibility. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Switch the check for terminal availability to test for stdin as using
+ stdout does not work when output is piped to another process. Patch
+ provided by Rados艂aw Józwik. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.42_(markt)"><span style="float: right;">2019-06-07</span> Tomcat 8.5.42 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.42_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=57287">57287</a>: Add file sorting to DefaultServlet (schultz)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the default servlet reads the entire global XSLT file if
+ one is defined. Identified by Coverity Scan. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid potential <code>NullPointerException</code> when generating an
+ HTTP <code>Allow</code> header. Identified by Coverity Scan. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Remove any fragment included in the target path used to obtain a
+ <code>RequestDispatcher</code>. The requested target path is logged as a
+ warning since this is an application error. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.42_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Add additional NIO2 style read and write methods closer to core NIO2,
+ for possible use with an asynchronous workflow like CompletableFuture.
+ (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid useless exception wrapping in async IO. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63412">63412</a>: Security manager failure when using the async IO
+ API from a webapp. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix concurrency issue that lead to incorrect HTTP/2 connection timeout.
+ (remm/markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Reduce the default for <code>maxConcurrentStreams</code> on the
+ <code>Http2Protocol</code> from 200 to 100 to align with typical
+ defaults for HTTP/2 implementations. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Reduce the default HTTP/2 header list size from 4GB to 32kB to align
+ with typical HTTP/2 implementations. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add support for same-site cookie attribute. Patch provided by John
+ Kelly. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a bug in the stream flushing code that could lead to multiple
+ threads processing the stream concurrently which in turn could cause
+ errors processing the stream. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.42_(markt)/Cluster">Cluster</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62841">62841</a>: Refactor the <code>DeltaRequest</code> serialization
+ to reduce the window during which the <code>DeltaSession</code> is
+ locked and to remove a potential cause of deadlocks during
+ serialization. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63441">63441</a>: Further streamline the processing of session creation
+ messages in the <code>DeltaManager</code> to reduce the possibility of a
+ session update message being processed before the session has been
+ created. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.42_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Treat <code>NoRouteToHostException</code> the same way as
+ <code>SocketTimeoutException</code> when checking the health of group
+ members. This avoids a SEVERE log message every time the check is
+ performed when the host associated with a group member is not powered
+ on. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.42_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Switch from FindBugs to SpotBugs. (fschumacher)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63403">63403</a>: Fix TestHttp2InitialConnection test failures when
+ running with a non-English locale. (kkolinko)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Use the <code>test</code> command to check for terminal availability
+ rather than the <code>tty</code> command since the <code>tty</code>
+ based test fails on non-English locales. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.41_(markt)"><span style="float: right;">2019-05-13</span> Tomcat 8.5.41 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.41_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a potential resource leak when executing CGI scripts from a WAR
+ file. Identified by Coverity scan. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a potential concurrency issue in the StringCache identified by
+ Coverity scan. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a potential concurrency issue in the main Sendfile thread of the APR
+ connector. Identified by Coverity scan. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a potential resource leak when running a web application from a WAR
+ file. Identified by Coverity scan. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a potential resource leak on some exception paths in the
+ <code>DataSourceRealm</code>. Identified by Coverity scan. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a potential resource leak on an exception path when parsing JSP
+ files. Identified by Coverity scan. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a potential resource leak when a JNDI lookup returns an object of an
+ in compatible class. Identified by Coverity scan. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor <code>ManagerServlet</code> to avoid loading classes when
+ filtering JNDI resources for resources of a specified type. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid <code>OutOfMemoryError</code>s and
+ <code>ArrayIndexOutOfBoundsException</code>s when accessing large files
+ via the default servlet when resource caching has been disabled. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid a <code>NullPointerException</code> when a <code>Context</code> is
+ defined in <code>server.xml</code> with a <code>docBase</code> but not
+ the optional <code>path</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63324">63324</a>: Refactor the <code>CrawlerSessionManagerValve</code>
+ so that the object placed in the session is compatible with session
+ serialization with mem-cached. Patch provided by Martin Lemanski.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63333">63333</a>: Override the <code>isAvailable()</code> method in the
+ <code>JAASRealm</code> so that only login failures caused by invalid
+ credentials trigger account lock out when the <code>LockOutRealm</code>
+ is in use. Patch provided by jchobantonov. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.41_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When running on newer JREs that don't support SSLv2Hello, don't warn
+ that it is not available unless explicitly configured. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor Hostname validation to improve performance. Patch provided by
+ Uwe Hees. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Expand HTTP/2 timeout handling to include connection window exhaustion
+ on write. This is the fix for CVE-2019-10072. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.41_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63335">63335</a>: Ensure that stack traces written by the
+ <code>OneLineFormatter</code> are fully indented. The entire stack trace
+ is now indented by an additional TAB character. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When using the <code>OneLineFormatter</code>, don't print a blank line
+ in the log after printing a stack trace. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Apache Commons DBCP 2 to dcdbc72
+ (2019-04-24) to pick up some clean-up and enhancements less the JDBC 4.2
+ related changes that require Java 8. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Apache Commons Pool 2 to 0664f4d
+ (2019-04-30) to pick up some enhancements and bug fixes. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Apache Commons FileUpload to 41e4047
+ (2019-04-24) pick up some enhancements. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.40_(markt)"><span style="float: right;">2019-04-12</span> Tomcat 8.5.40 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.40_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63196">63196</a>: Provide a default (<code>X-Forwarded-Proto</code>) for
+ the <code>protocolHeader</code> attribute of the
+ <code>RemoteIpFilter</code> and <code>RemoteIpValve</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63235">63235</a>: Refactor Charset cache to reduce start time. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63249">63249</a>: Use a consistent log level (<code>WARN</code>) when
+ logging the failure to register or deregister a JMX Bean. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63249">63249</a>: Use a consistent log level (<code>ERROR</code>) when
+ logging the <code>LifecycleException</code> associated with the failure
+ to start or stop a component. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When the SSI directive <code>fsize</code> is used with an invalid
+ target, return a file size of <code>-</code> rather than
+ <code>1k</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63251">63251</a>: Implement a work-around for a known JRE bug (<a href="https://bugs.openjdk.java.net/browse/JDK-8194653">JDK-8194653</a>)
+ that may cause a dead-lock when Tomcat starts. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63275">63275</a>: When using a <code>RequestDispatcher</code> ensure
+ that <code>HttpServletRequest.getContextPath()</code> returns an encoded
+ path in the dispatched request. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63286">63286</a>: Document the differences in behaviour between the
+ <code>LogFormat</code> directive in httpd and the <code>pattern</code>
+ attribute in the <code>AccessLogValve</code> for <code>%D</code> and
+ <code>%T</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63311">63311</a>: Add support for https URLs to the local resolver within
+ Tomcat used to resolve standard XML DTDs and schemas when Tomcat is
+ configured to validate XML configuration files such as web.xml. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Encode the output of the SSI <code>printenv</code> command. This is the
+ fix for CVE-2019-0221. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Use constants for SSI encoding values. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ When the CGI Servlet is configured with
+ <code>enableCmdLineArguments</code> set to true, limit the encoded form
+ of the individual command line arguments to those values allowed by RFC
+ 3875. This restriction may be relaxed by the use of the new
+ initialisation parameter <code>cmdLineArgumentsEncoded</code>. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ When the CGI Servlet is configured with
+ <code>enableCmdLineArguments</code> set to true, limit the decoded form
+ of the individual command line arguments to known safe values when
+ running on Windows. This restriction may be relaxed by the use of the
+ new initialisation parameter <code>cmdLineArgumentsDecoded</code>. This
+ is the fix for CVE-2019-0232. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Change the default for the <code>enableCmdLineArguments</code> parameter
+ of the CGI servlet from <code>true</code> to <code>false</code> as
+ additional hardening against CVE-2019-0232. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.40_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix bad interaction between NIO2 async read API and the regular read.
+ (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor NIO2 write pending strategy for the classic IO API. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Harmonize NIO2 isReadyForWrite with isReadyForRead code. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When using a JSSE TLS connector that supported ALPN (Java 9 onwards) and
+ a protocol was not negotiated, Tomcat failed to fallback to HTTP/1.1 and
+ instead dropped the connection. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a regression in the TLS connector refactoring in Tomcat 9.0.17
+ that prevented the use of PKCS#8 private keys with OpenSSL based
+ connectors. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When performing an upgrade from HTTP/1.1 to HTTP/2, ensure that any
+ query string present in the original HTTP/1.1 request is passed to the
+ HTTP/2 request processing. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When Tomcat writes a final response without reading all of an HTTP/2
+ request, reset the stream to inform the client that the remaining
+ request body is not required. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63312">63312</a>: Correct a regression in the error page handling that
+ prevented error pages from issuing redirects or taking other action that
+ required the response status code to be changed. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.40_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add support for specifying Java 11 (with the value <code>11</code>) as
+ the compiler source and/or compiler target for JSP compilation. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add support for specifying Java 12 (with the value <code>12</code>) and
+ Java 13 (with the value <code>13</code>) as the compiler source and/or
+ compiler target for JSP compilation. If used with an ECJ version that
+ does not support these values, a warning will be logged and the latest
+ supported version will used. Based on a patch by Thomas Collignon.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.40_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the handling of exceptions during TLS handshakes for the
+ WebSocket client. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.40_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63184">63184</a>: Expand the SSI documentation to provide more
+ information on the supported directives and their attributes. Patch
+ provided by nightwatchcyber. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add a note to the documentation about the risk of DoS with poorly
+ written regular expressions and the <code>RewriteValve</code>. Patch
+ provided by salgattas. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.40_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63320">63320</a>: Ensure that <code>StatementCache</code> caches
+ statements that include arrays in arguments. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.39_(markt)"><span style="float: right;">2019-03-19</span> Tomcat 8.5.39 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.39_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Minor HTTP/2 push fixes. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor how cookies are transferred from the base request to a
+ <code>PushBuilder</code> so that they are accessible, and may be edited,
+ via the standard <code>PushBuilder</code> methods for working with HTTP
+ headers. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Refactor error handling to enable errors that occur before processing is
+ passed to the application to be handled by the application provided
+ error handling and/or the container provided error handling
+ (<code>ErrorReportValve</code>) as appropriate. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Pass 404 errors triggered by a missing ROOT web application to the
+ container error handling to generate the response body. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Pass 400 errors triggered by invalid request targets to the container
+ error handling to generate the response body. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Pass errors triggered by invalid requests or unavailable services to the
+ application provided error handling and/or the container provided error
+ handling (<code>ErrorReportValve</code>) as appropriate. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor the MBean implementations for the internal Tomcat components
+ to reduce code duplication. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Simplify the value of <code>jarsToSkip</code> property in
+ <code>catalina.properties</code> file for tomcat-i18n jar files.
+ Use prefix pattern instead of listing each language. (kkolinko)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Restore the getter and setter for the access log valve attribute
+ <code>maxLogMessageBufferSize</code> that were accidentally removed.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63206">63206</a>: Add a new attribute to <code>Context</code> -
+ <code>createUploadTargets</code> which, if <code>true</code> enables
+ Tomcat to create the temporary upload location used by a Servlet if the
+ location specified by the Servlet does not already exist. The default
+ value is <code>false</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63210">63210</a>: Ensure that the Apache Commons DBCP 2 based default
+ connection pool is correctly shutdown when it is no longer required.
+ This ensures that a non-daemon thread is not left running that will
+ prevent Tomcat from shutting down cleanly. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63213">63213</a>: Ensure the correct escaping of group names when
+ searching for nested groups when the JNDIRealm is configured with
+ <code>roleNested</code> set to <code>true</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63236">63236</a>: Use <code>String.intern()</code> as suggested by
+ Phillip Webb to reduce memory wasted due to String duplication. This
+ changes saves ~245k when starting a clean installation. With additional
+ thanks to YourKit Java profiler for helping to track down the wasted
+ memory and the root causes. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63246">63246</a>: Fix a potential <code>NullPointerException</code> when
+ calling <code>AsyncContext.dispatch()</code>. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.39_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the <code>toString()</code>, <code>toBytes()</code> and
+ <code>toChars()</code> methods of <code>MessageBytes</code> behave
+ consistently and do not throw a <code>NullPointerException</code> both
+ on newly created objects and immediately after a call to
+ <code>recycle()</code>. This should not impact typical Tomcat users. It
+ may impact users who use these classes directly in their own code.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When performing an HTTP/1.1 upgrade to HTTP/2 (h2c) ensure that the hostname
+ and port from the HTTP/1.1 Host header of the upgraded request are made
+ available via the standard methods
+ <code>ServletRequest.getServerName()</code> and
+ <code>ServletRequest.getServerPort()</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Make PEM file parser a public utility class. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor the APR/Native endpoint TLS configuration code to enable JSSE
+ style configuration - including JKS keystores - to be used with the
+ APR/Native connector. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ With the TLS configuration refactoring, the configuration attributes
+ <code>sessionCacheSize</code> and <code>sessionTimeout</code> are no
+ longer limited to JSSE implementations. They may now be used with
+ OpenSSL implementations as well. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor NIO2 read pending strategy for the classic IO API. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63182">63182</a>: Avoid extra read notifications for HTTP/1.1 with
+ NIO2 when using asynchronous threads. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63205">63205</a>: Add a work-around for a known
+ <a href="https://bugs.openjdk.java.net/browse/JDK-8157404">JRE KeyStore
+ loading bug</a>. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Sync with NIO2 async API from Tomcat 9 branch. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ NIO2 should try to use SocketTimeoutException everywhere rather than a
+ mix of it and InterruptedByTimeout. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct an error in the request validation that meant that HTTP/2 push
+ requests always resulted in a 400 response. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63223">63223</a>: Correctly account for push requests when tracking
+ currently active HTTP/2 streams. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Verify HTTP/2 stream is still writable before assuming a timeout
+ occurred. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid some overflow cases with OpenSSL to improve efficiency, as the
+ OpenSSL engine has an internal buffer. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Harmonize HTTP/1.1 NIO2 keepalive code. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.39_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Remove the <code>STREAMS_DROP_EMPTY_MESSAGES</code> system property that
+ was introduced to work-around four failing TCK tests. An alternative
+ solution has been implemented. Sending messages via
+ <code>getSendStream()</code> and <code>getSendWriter()</code> will now
+ only result in messages on the wire if data is written to the
+ <code>OutputStream</code> or <code>Writer</code>. Writing zero length
+ data will result in an empty message. Note that sending a message via an
+ <code>Encoder</code> may result in the message being send via
+ <code>getSendStream()</code> or <code>getSendWriter()</code>. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.39_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Use client's preferred language for the Server Status page of the
+ Manager web application. Review and fix several cases when the
+ client's language preference was not respected in Manager and
+ Host Manager web applications. (kkolinko)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix messages used by Manager and Host Manager web applications.
+ Disambiguate message keys used when adding or removing a host.
+ Improve display of summary values on the status page: separate
+ terms and values with a whitespace. Improve wording of messages
+ for expire sessions command. (kkolinko)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Do not add CSRF nonce parameter and suppress Referer header for external
+ links in Manager and Host Manager web applications. (kkolinko)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.39_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that members registered in the addSuspects list are static
+ members. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.39_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the coverage and quality of the Russian translations provided
+ with Apache Tomcat. (kkolinko)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63041">63041</a>: Revert the changes for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=53930">53930</a> that added
+ support for the <code>CATALINA_OUT_CMD</code> environment variable as
+ they prevented correct operation with systemd configurations that did
+ not explicitly specify a PID file. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.38_(markt)"><span style="float: right;">2019-02-08</span> Tomcat 8.5.38 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.38_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=54741">54741</a>: Add a new method,
+ <code>Tomcat.addWebapp(String,URL)</code>, that allows a web application
+ to be deployed from a URL when using Tomcat in embedded mode. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the <code>ServletOutputStream</code> implementation is
+ consistent with the requirements of asynchronous I/O and that all of the
+ write methods use a single write rather than multiple writes. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the Javadoc for <code>Context.getDocBase()</code> and
+ <code>Context.setDocBase()</code> and remove text that indicates that a
+ URL may be used for the <code>docBase</code> as this has not been the
+ case for quite some time. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Ensure that Tomcat is fully terminated when running as a service.
+ (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Treat I/O errors during request body reads the same way as I/O errors
+ during response body writes. The errors are treated as client side
+ errors rather than server side errors and only logged at debug level.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63038">63038</a>: Ensure that a <code>ClassNotFoundException</code> is
+ thrown when attempting to load a class from a corrupted JAR file.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Make the removal of leading and trailing whitespace from credentials
+ passed to BASIC authentication configurable via a new attribute,
+ <code>trimCredentials</code> on the <code>BasicAuthenticator</code>.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63003">63003</a>: Extend the <code>unloadDelay</code> attribute on a
+ <code>Context</code> to include in-flight asynchronous requests. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63026">63026</a>: Add a new attribute, <code>forceDnHexEscape</code>, to
+ the <code>JNDIRealm</code> that forces escaping in the String
+ representation of a distinguished name to use the <code>\nn</code> form.
+ This may avoid issues with realms using Active Directory which appears
+ to be more tolerant of optional escaping when the <code>\nn</code> form
+ is used. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid a swallowed (and therefore ignored) access failure during web
+ application class loading when running under a
+ <code>SecurityManager</code>. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the recommended minimum Tomcat Native version to 1.2.21. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63137">63137</a>: If the resources for a web application have been
+ configured with multiple locations mapped to
+ <code>/WEB-INF/classes</code>, ensure that all of those locations are
+ used when building the web application class path. Patch provided by
+ Marcin Go艂臋bski. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.38_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63009">63009</a>: Include the optional <code>content-length</code>
+ header in HTTP/2 responses where an appropriate value is available.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63022">63022</a>: Do not use the socket open state when using the
+ wrapper isClosed method for NIO and NIO2, as it will disable all
+ further processing. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix socket close discrepancies for NIO2, now the wrapper close
+ is used everywhere except for socket accept problems. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.38_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63056">63056</a>: Correct a regression in the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=53737">53737</a>
+ that did not correctly scan the web application directory structure for
+ JSPs. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Update the performance optimisation for using expressions in tags that
+ depend on uninitialised tag attributes with implied scope to make the
+ performance optimisation aware of the new public class
+ (<code>java.lang.Enum$EnumDesc</code>) added in Java 12. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.38_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=57974">57974</a>: Ensure implementation of
+ <code>Session.getOpenSessions()</code> returns correct value for both
+ client-side and server-side calls. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63019">63019</a>: Use payload remaining bytes rather than limit when
+ writing. Submitted by Benoit Courtilly. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When running under a <code>SecurityManager</code>, ensure that the
+ <code>ServiceLoader</code> look-up for the default
+ <code>javax.websocket.server.ServerEndpointConfig.Configurator</code>
+ implementation completes correctly rather than silently using the
+ hard-coded fall-back. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the network connection is closed if the client receives an
+ I/O error trying to communicate with the server. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ignore synthetic methods when scanning POJO methods. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Implement the requirements of section 5.2.1 of the WebSocket 1.1
+ specification and ensure that if the deployment of one Endpoint fails,
+ no Endpoints are deployed for that web application. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Implement the requirements of section 4.3 of the WebSocket 1.1
+ specification and ensure that the deployment of an Endpoint fails if
+ <code>@PathParam</code> is used with an invalid parameter type. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure a <code>DeploymentException</code> rather than an
+ <code>IllegalArgumentException</code> is thrown if a method annotated
+ with <code>@OnMessage</code> does not conform to the requirements set
+ out in the Javadoc. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve algorithm that determines if two <code>@OnMessage</code>
+ annotations have been added for the same message type. Prior to this
+ change some matches were missed. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.38_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63103">63103</a>: Remove the unused source.jsp file and associated tag
+ from the examples web application as it is no longer used. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63143">63143</a>: Ensure that the Manager web application respects the
+ language preferences of the user as configured in the browser when the
+ language of the default system locale is not English. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.38_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add EncryptInterceptor to the portfolio of available clustering
+ interceptors. This adds symmetric encryption of session data
+ to Tomcat clustering regardless of the type of cluster manager
+ or membership being used. (schultz)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.21 to
+ pick up the memory leak fixes when using NIO/NIO2 with OpenSSL. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.38_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63041">63041</a>: Correct a regression in the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=53930">53930</a>
+ that prevented Tomcat from working correctly with systemd. Patch
+ provided by Patrik S. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the NSIS Installer used to build the Windows installer to version
+ 3.04. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.37_(markt)"><span style="float: right;">2018-12-18</span> Tomcat 8.5.37 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.37_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the recommended minimum Tomcat Native version to 1.2.19. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.37_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.19 to
+ pick up the latest Windows binaries built with APR 1.6.5 and OpenSSL
+ 1.1.1a. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.36_(markt)"><span style="float: right;">not released</span> Tomcat 8.5.36 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.36_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62788">62788</a>: Add explicit logging configuration to write log files
+ using UTF-8 to align with Tomcat's use of UTF-8 by default
+ elsewhere. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ The default Servlet should not override a previously set content-type.
+ (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62897">62897</a>: Provide a property
+ (<code>clearReferencesThreadLocals</code>) on the standard
+ <code>Context</code> implementation that enables the check for memory
+ leaks via <code>ThreadLocal</code>s to be disabled because this check
+ depends on the use of an API that has been deprecated in later versions
+ of Java. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix more storeconfig issues with duplicated SSL attributes. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62968">62968</a>: Avoid unnecessary (and relatively expensive)
+ <code>getResources()</code> call in the Mapper when processing rule 7.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62978">62978</a>: Update the RemoteIpValve to handle multiple values in
+ the <code>x-forwarded-proto</code> header. Patch provided by Tom Groot.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Update the RemoteIpFilter to handle multiple values in the
+ <code>x-forwarded-proto</code> header. Based on a patch provided by Tom
+ Groot. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62986">62986</a>: Refactor the code that performs class scanning during
+ web application start to make integration simpler for downstream users.
+ Patch provided by rmannibucau. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62988">62988</a>: Fix the <code>LoadBalancerDrainingValve</code> so it
+ works when the session cookie configuration is not explicitly declared.
+ Based on a patch provided by Andreas Kurth. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63002">63002</a>: Fix setting rewrite qsdiscard flag. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Implement the requirements of section 8.2.2 2c of the Servlet
+ specification and prevent a web application from deploying if it has
+ fragments with duplicate names and is configured to use relative
+ ordering of fragments. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.36_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid an exception when using Tomcat Native built with a version of
+ OpenSSL that does not support TLSv1.3. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62899">62899</a>: Prevent the incorrect timing out of connections when
+ Servlet non-blocking I/O is used to read a request body over an HTTP/2
+ stream. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid bad SSLHostConfig JMX registrations before init. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.36_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=53737">53737</a>: Extend JspC, the precompilation tool, to include
+ support for resource JARs. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62976">62976</a>: Avoid an <code>IllegalStateException</code> when using
+ background compilation when tag files are packaged in JAR files. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.36_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62918">62918</a>: Filter out subtype mbeans to avoid breaking the
+ connector status page. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.36_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Prevent an error when running in a Cygwin shell and the
+ <code>JAVA_ENDORSED_DIRS</code> system property is empty. Patch provided
+ by Zemian Deng. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=53930">53930</a>: Add support for the <code>CATALINA_OUT_CMD</code>
+ environment variable that defines a command to which captured stdout and
+ stderr will be redirected. Patch provided by Casey Lucas. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.35_(markt)"><span style="float: right;">2018-11-07</span> Tomcat 8.5.35 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.35_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61692">61692</a>: Add the ability to control which HTTP methods are
+ handled by the CGI Servlet via a new initialization parameter
+ <code>cgiMethods</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62687">62687</a>: Expose content length information for resources
+ when using a compressed war. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62737">62737</a>: Fix rewrite substitutions parsing of {} nesting.
+ (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add rewrite flags output when getting the rewrite configuration back.
+ (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add missing qsdiscard flag to the rewrite flags as a cleaner way to
+ discard the query string. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add documentation about the files <code>context.xml.default</code> and
+ <code>web.xml.default</code> that can be used to customize <code>conf/context.xml</code>
+ and <code>conf/web.xml</code> on a per host basis. (fschumacher)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that a canonical path is always used for the docBase of a Context
+ to ensure consistent behaviour. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62803">62803</a>: Fix SSL connector configuration processing
+ in storeconfig. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62797">62797</a>: Pass throwable to keep client aborts with status 200
+ rather than 500. Patch submitted by zikfat. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62809">62809</a>: Correct a regression in the implementation of DIGEST
+ authentication support for the Deployer Ant tasks (bug <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=45832">45832</a>)
+ that prevented the <code>DeployTask</code> from working when
+ authentication was required. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the recommended minimum Tomcat Native version to 1.2.18. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Ignore an attribute named <code>source</code> on <code>Context</code>
+ elements provided by <code>StandardContext</code>. This is to suppress
+ warnings generated by the Eclipse / Tomcat integration provided by
+ Eclipse. Based on a patch by mdfst13. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62830">62830</a>: Added <code>JniLifeCycleListener</code> and static
+ methods <code>Library.loadLibrary(libraryName)</code> and
+ <code>Library.load(filename)</code> to load a native library by a
+ shared class loader so that more than one Webapp can use it. (isapir)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a typo in the Spanish resource files. Patch provided by Diego
+ Agulló. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62868">62868</a>: Order the <code>Enumeration<URL></code> provided
+ by <code>WebappClassLoaderBase.getResources(String)</code> according to
+ the setting of the delegate flag. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.35_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add TLSv1.3 to the default protocols and to the <code>all</code>
+ alias for JSSE based TLS connectors when running on a JVM that
+ supports TLS version 1.3. One such JVM is OpenJDK version 11. (rjung)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62685">62685</a>: Correct an error in host name validation parsing that
+ did not allow a fully qualified domain name to terminate with a period.
+ Patch provided by AG. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62739">62739</a>: Do not reject requests with an empty HTTP Host header.
+ Such requests are unusual but not invalid. Patch provided by Michael
+ Orr. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62748">62748</a>: Add TLS 1.3 support for the APR/Native connector and
+ the NIO/NIO2 connector when using the OpenSSL backed JSSE
+ implementation. (schultz/markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62791">62791</a>: Remove an unnecessary check in the NIO TLS
+ implementation that prevented from secure WebSocket connections from
+ being established. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix server initiated TLS renegotiation to obtain a client certificate
+ when using NIO/NIO2 and the OpenSSL backed JSSE TLS implementation.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62871">62871</a>: Improve MBeans for Endpoint instances (type
+ <code>ThreadPool</code> in JMX) by using explicit declaration of
+ attributes and operations rather than relying on introspection. Add a
+ new MBean to expose the <code>Socketproperties</code> values. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.35_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct parsing of XML whitespace in TLD function signatures that
+ incorrectly only looked for the space character. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62674">62674</a>: Correct a regression in the stand-alone JSP compiler
+ utility, <code>JspC</code>, caused by the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=53492">53492</a>, that
+ caused the JSP compiler to hang. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62721">62721</a>: Correct generation of web.xml header when using JspC.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62757">62757</a>: Correct a regression in the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62603">62603</a>
+ that caused <code>NullPointerException</code>s when compiling tag files
+ on first access when development mode was disabled and background
+ compilation was enabled. Based on a patch by Jordi Llach. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.35_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62731">62731</a>: Make the URI returned by
+ <code>HandshakeRequest.getRequestURI()</code> and
+ <code>Session.getRequestURI()</code> absolute so that the scheme, host
+ and port are accessible. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.35_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62676">62676</a>: Expand the CORS filter documentation to make it clear
+ that explicit configuration is required to enable support for
+ cross-origin requests. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62712">62712</a>: Correct NPE in Manager application when attempting to
+ view configured certificates for an APR/native TLS connector. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62761">62761</a>: Correct the advanced CORS example in the Filter
+ documentation to use a valid configuration. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62786">62786</a>: Add a note to the Context documentation to explain
+ that, by default, settings for a Context element defined in server.xml
+ will be overwritten by settings specified in a default context file such
+ as <code>conf/context.xml</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Create a little visual separation between the Undeploy button and the
+ other buttons in the Manager application. Patch provided by 艁ukasz
+ J膮der. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.35_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Apache Commons Pool 2 to d4e0e88
+ (2018-09-12) to pick up some bug fixes and enhancements. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.18 to
+ pick up the latest Windows binaries built with APR 1.6.5 and OpenSSL
+ 1.1.1. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.34_(markt)"><span style="float: right;">2018-09-10</span> Tomcat 8.5.34 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.34_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Make the <code>isLocked()</code> method of the <code>LockOutRealm</code>
+ public and expose the method via JMX. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the handling of path parameters when working with
+ RequestDispatcher objects. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62664">62664</a>: Process requests with content type
+ <code>multipart/form-data</code> to servlets with a
+ <code>@MultipartConfig</code> annotation regardless of HTTP method.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62667">62667</a>: Add recursion to rewrite substitution parsing. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62669">62669</a>: When using the SSIFilter and a resource does not
+ specify a content type, do not force the content type to
+ <code>application/x-octet-stream</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62670">62670</a>: Adjust the memory leak protection for the
+ <code>DriverManager</code> so that JDBC drivers located in
+ <code>$CATALINA_HOME/lib</code> and <code>$CATALINA_BASE/lib</code> are
+ loaded via the service loader mechanism when the protection is enabled.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When generating a redirect to a directory in the Default Servlet, avoid
+ generating a protocol relative redirect. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.34_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix potential deadlocks when using asynchronous Servlet processing with
+ HTTP/2 connectors. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62620">62620</a>: Fix corruption of response bodies when writing large
+ bodies using asynchronous processing over HTTP/2. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62628">62628</a>: Additional fixes for output corruption of response
+ bodies when writing large bodies using asynchronous processing over
+ HTTP/2. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.34_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the JSP version in the X-PoweredBy HTTP header generated when
+ the xpoweredBy option is enabled. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62662">62662</a>: Fix the corruption of web.xml output during JSP
+ compilation caused by the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=53492">53492</a>. Patch provided by
+ Bernhard Frauendienst. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.34_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the information in the documentation web application regarding
+ the use of <code>CATALINA_HOME</code> and <code>CATALINA_BASE</code>.
+ Patch provided by Marek Czernek. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62652">62652</a>: Make it clearer that the version of DBCP that is
+ packaged in Tomcat 8.5.x is DBCP 2. Correct the names of some DBCP 2
+ configuration attributes that changed between 1.x and 2.x. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62666">62666</a>: Expand internationalisation support in the Manager
+ application to include the server status page and provide Russian
+ translations in addition to English. Patch provided by Artem Chebykin.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.34_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Switch the build script to use http for downloads from an ASF mirror
+ using the closer.lua script to avoid failures due to HTTPS to HTTP
+ redirects. (rjung)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.33_(markt)"><span style="float: right;">2018-08-17</span> Tomcat 8.5.33 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.33_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the HTTP Vary header is set correctly when using the CORS
+ filter and improve the cacheability of requests that pass through the
+ COPRS filter. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62527">62527</a>: Revert restriction of JNDI to the <code>java:</code>
+ namespace. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Introduce a new class - <code>MultiThrowable</code> - to report
+ exceptions when multiple actions are taken where each action may throw
+ an exception but all actions are taken before any errors are reported.
+ Use this new class when reporting multiple container (e.g. web
+ application) failures during start. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correctly decode URL paths (<code>+</code> should not be decoded to a
+ space in the path) in the <code>RequestDispatcher</code> and the web
+ application class loader. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Make logout more robust if JASPIC subject is unexpectedly unavailable.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62547">62547</a>: JASPIC <code>cleanSubject()</code> was not called on
+ logout when the authenticator was configured to cache the authenticated
+ Principal. Patch provided by Guillermo González de Agüero. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62559">62559</a>: Add <code>jaxb-*.jar</code> to the list of JARs
+ ignored by <code>StandardJarScanner</code>. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62560">62560</a>: Add <code>oraclepki.jar</code> to the list of JARs
+ ignored by <code>StandardJarScanner</code>. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62607">62607</a>: Return a non-zero exit code from
+ <code>catalina.[bat|sh] run</code> if Tomcat fails to start. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Remove <code>ServletException</code> from declaration of
+ <code>Tomcat.addWebapp(String,String)</code> since it is never thrown.
+ Patch provided by Tzafrir. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Use short circuit logic to prevent potential NPE in CorsFilter. (fschumacher)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Simplify construction of appName from container name in JAASRealm. (fschumacher)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.33_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60560">60560</a>: Add support for using an inherited channel to
+ the NIO connector. Based on a patch submitted by Thomas Meyer with
+ testing and suggestions by Coty Sutherland. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62507">62507</a>: Ensure that JSSE based TLS connectors work correctly
+ with a DKS keystore. Note: DKS keystores require Java 8 or later.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor code that adds an additional header name to the
+ <code>Vary</code> HTTP response header to use a common utility method
+ that addresses several additional edge cases. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62515">62515</a>: When a connector is configured (via setting
+ <code>bindOnInit</code> to <code>false</code>) to bind/unbind the server
+ socket during start/stop, close the socket earlier in the stop process
+ so new connections do not sit in the TCP backlog during the shutdown
+ process only to be dropped as stop completes. In this scenario new
+ connections will now be refused immediately. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62526">62526</a>: Correctly handle PKCS12 format key stores when the key
+ store password is configured to be the empty string. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix error in back-port of HTTP/2 compression that meant compression was
+ never enabled. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62605">62605</a>: Ensure <code>ReadListener.onDataAvailable()</code> is
+ called when the initial request body data arrives after the request
+ headers when using asynchronous processing over HTTP/2. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62614">62614</a>: Ensure that
+ <code>WriteListener.onWritePossible()</code> is called after
+ <code>isReady()</code> returns <code>false</code> and the window size is
+ subsequently incremented when using asynchronous processing over HTTP/2.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.33_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=53011">53011</a>: When pre-compiling with JspC, report all compilation
+ errors rather than stopping after the first error. A new option
+ <code>-failFast</code> can be used to restore the previous behaviour of
+ stopping after the first error. Based on a patch provided by Marc Pompl.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=53492">53492</a>: Make the Java file generation process multi-threaded.
+ By default, one thread will be used per core. Based on a patch by Dan
+ Fabulich. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62453">62453</a>: Add a performance optimisation for using expressions
+ in tags that depend on uninitialised tag attributes with implied scope.
+ Generally, using an explicit scope with tag attributes in EL is the best
+ way to avoid various potential performance issues. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correctly decode URL paths (<code>+</code> should not be decoded to a
+ space in the path) in the Jasper class loader. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62603">62603</a>: Fix a potential race condition when development mode
+ is disabled and background compilation checks are enabled. It was
+ possible that some updates would not take effect and/or
+ <code>ClassNotFoundException</code>s would occur. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.33_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62596">62596</a>: Remove the limit on the size of the initial HTTP
+ upgrade request used to establish the web socket connection. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.33_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61565">61565</a>: Add the ability to trigger a reloading of TLS host
+ configuration (certificate and key files, server.xml is not re-parsed)
+ via the Manager web application. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62558">62558</a>: Add Russian translations for the Manager and Host
+ Manager web applications. Based on a patch by Ivan Krasnov. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62561">62561</a>: Add advanced class loader configuration information
+ regarding the use of the Server and Shared class loaders to the
+ documentation web application. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.33_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensures that the specified <code>rxBufSize</code> is correctly set to
+ receiver buffer size. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.33_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Support building with Java 9+ while preserving the Java 7 compatibility
+ at runtime (requires Ant 1.9.8 or later). (ebourg)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update WSDL4J library to version 1.6.3 (from 1.6.2). (kkolinko)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update JUnit library to version 4.12 (from 4.11). (kkolinko)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Downgrade CGLib library used for testing with EasyMock to version
+ 2.2.2 (from 2.2.3) as version 2.2.3 is not available from Maven Central.
+ (markt/kkolinko)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Implement checksum checks when downloading dependencies that are used
+ to build Tomcat. (kkolinko)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fixed spelling. Patch provided by Jimmy Casey via GitHub. (violetagg)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Apache Commons Pool 2 to 3e02523
+ (2018-08-09) to pick up some bug fixes and enhancements. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Apache Commons DBCP 2 to abc0484
+ (2018-08-09) to pick up some bug fixes and enhancements. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct various spelling errors throughout the source code and
+ documentation. Patch provided by Kazuhiro Sera. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.32_(markt)"><span style="float: right;">2018-06-25</span> Tomcat 8.5.32 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.32_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Treat the <code><mapped-name></code> element of a
+ <code><env-entry></code> in web.xml in the same way as the
+ <code>mappedName</code> element of the equivalent <code>@Resource</code>
+ annotation. Both now attempt to set the <code>mappedName</code> property
+ of the resource. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the processing of resources with
+ <code><injection-target></code>s defined in web.xml. First look
+ for a match using JavaBean property names and then, only if a match is
+ not found, look for a match using fields. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When restoring a saved request with a request body after FORM
+ authentication, ensure that calls to the <code>HttpServletRequest</code>
+ methods <code>getRequestURI()</code>, <code>getQueryString()</code> and
+ <code>getProtocol()</code> are not corrupted by the processing of the
+ saved request body. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ JNDI resources that are defined with injection targets but no value are
+ now treated as if the resource is not defined. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that JNDI names used for <code><lookup-name></code> entries
+ in web.xml and for <code>lookup</code> elements of
+ <code>@Resource</code> annotations specify a name with an explicit
+ <code>java:</code> namespace. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor the <code>org.apache.naming</code> package to reduce duplicate
+ code. Duplicate code identified by the Simian tool. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=50019">50019</a>: Add support for <code><lookup-name></code>.
+ Based on a patch by Gurkan Erdogdu. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=51953">51953</a>: Add the <code>RemoteCIDRFilter</code> and
+ <code>RemoteCIDRValve</code> that can be used to allow/deny requests
+ based on IPv4 and/or IPv6 client address where the IP ranges are defined
+ using CIDR notation. Based on a patch by Francis Galiegue. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62343">62343</a>: Make CORS filter defaults more secure. This is the fix
+ for CVE-2018-8014. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the web application resources implementation does not
+ incorrectly cache results for resources that are only visible as class
+ loader resources. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Make all loggers associated with Tomcat provided Filters non-static to
+ ensure that log messages are not lost when a web application is
+ reloaded. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the manifest for the annotations-api.jar. The JAR implements the
+ Common Annotations API 1.2 and the manifest should reflect that. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Switch to non-static loggers where there is a possibility of a logger
+ becoming associated with a web application class loader causing log
+ messages to be lost if the web application is stopped. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62389">62389</a>: Add the IPv6 loopback address to the default
+ <code>internalProxies</code> regular expression. Patch by Craig Andrews.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ In the <code>RemoteIpValve</code> and <code>RemoteIpFilter</code>,
+ correctly handle the case when the request passes through one or more
+ <code>trustedProxies</code> but no <code>internalProxies</code>. Based
+ on a patch by zhanhb. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the logic in <code>MBeanFactory.removeConnector()</code> to
+ ensure that the correct Connector is removed when there are multiple
+ Connectors using different addresses but the same port. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Make <code>JAASRealm</code> mis-configuration more obvious by requiring
+ the authenticated Subject to include at least one Principal of a type
+ specified by <code>userClassNames</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62476">62476</a>: Use GMT timezone for the value of
+ <code>Expires</code> header as required by HTTP specification
+ (RFC 7231, 7234). (kkolinko)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.32_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Consistent exception propagation for NIO2 SSL close. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Log an error message if the AJP connector detects that the reverse proxy
+ is sending AJP messages that are too large for the configured
+ <code>packetSize</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Relax Host validation by removing the requirement that the final
+ component of a FQDN must be alphabetic. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62371">62371</a>: Improve logging of Host validation failures. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add missing handshake timeout for NIO2. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correctly handle a digest authorization header when the user name
+ contains an escaped character. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correctly handle a digest authorization header when one of the hex
+ field values ends the header with in an invalid character. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correctly handle an invalid quality value in an
+ <code>Accept-Language</code> header. (markt)
+ </li>
+ <li><img alt="Docs: " class="icon" src="./images/docs.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62423">62423</a>: Fix SSL docs CRL attribute typo. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve IPv6 validation by ensuring that IPv4-Mapped IPv6 addresses do
+ not contain leading zeros in the IPv4 part. Based on a patch by Katya
+ Stoycheva. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix <code>NullPointerException</code> thrown from <code>
+ replaceSystemProperties()</code> when trying to log messages. (csutherl)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid unnecessary processing of async timeouts. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.32_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=50234">50234</a>: Add the capability to generate a web-fragment.xml file
+ to JspC. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62080">62080</a>: Ensure that all reads of the current thread's context
+ class loader made by the UEL API and implementation are performed via a
+ <code>PrivilegedAction</code> to ensure that a
+ <code>SecurityException</code> is not triggered when running under a
+ <code>SecurityManager</code>. (mark)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62350">62350</a>: Refactor
+ <code>org.apache.jasper.runtime.BodyContentImpl</code> so a
+ <code>SecurityException</code> is not thrown when running under a
+ SecurityManger and additional permissions are not required in the
+ <code>catalina.policy</code> file. This is a follow-up to the fix for
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=43925">43925</a>. (kkolinko/markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Update web.xml, web-fragment.xml and web.xml extracts generated by JspC
+ to use the Servlet 3.1 version of the relevant schemas. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.32_(markt)/Cluster">Cluster</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Remove duplicate calls when creating a replicated session to reduce the
+ time taken to create the session and thereby reduce the chances of a
+ subsequent session update message being ignored because the session does
+ not yet exist. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.32_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When decoding of path parameter failed, make sure to throw
+ <code>DecodeException</code> instead of throwing
+ <code>ArrayIndexOutOfBoundsException</code>. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Enable host name verification when using TLS with the WebSocket client.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.32_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62395">62395</a>: Clarify the meaning of the connector attribute
+ <code>minSpareThreads</code> in the documentation web application.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the documentation for the <code>allowHostHeaderMismatch</code>
+ attribute of the standard HTTP Connector implementations. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.32_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the correct default value is returned when retrieve unset
+ properties in <code>McastService</code>. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.32_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When <code>logValidationErrors</code> is set to true, the connection
+ validation error is logged as <code>SEVERE</code> instead of
+ <code>WARNING</code>. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.32_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62391">62391</a>: Remove references to <code>javaw.exe</code> as this
+ file is not required by Tomcat and the references prevent the use of the
+ Server JRE. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.17 to
+ pick up the latest Windows binaries built with APR 1.6.3 and OpenSSL
+ 1.0.2o. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62458">62458</a>: Update the internal fork of Commons Pool 2 to dfef97b
+ (2018-06-18) to pick up some bug fixes and enhancements. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons DBCP 2 to 2.4.0. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.31_(markt)"><span style="float: right;">2018-05-03</span> Tomcat 8.5.31 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.31_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62263">62263</a>: Avoid a <code>NullPointerException</code> when the
+ <code>RemoteIpValve</code> processes a request for which no Context can
+ be found. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a rare edge case that is unlikely to occur in real usage. This edge
+ case meant that writing long streams of UTF-8 characters to the HTTP
+ response that consisted almost entirely of surrogate pairs could result
+ in one surrogate pair being dropped. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Register MBean when DataSource Resource <code>
+ type="javax.sql.XADataSource"</code>. Patch provided by Masafumi Miura.
+ (csutherl)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Update the internal fork of Apache Commons BCEL to r1829827 to add early
+ access Java 11 support to the annotation scanning code. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62297">62297</a>: Enable the <code>CrawlerSessionManagerValve</code> to
+ correctly handle bots that crawl multiple hosts and/or web applications
+ when the Valve is configured on a Host or an Engine. (fschumacher)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62309">62309</a>: Fix a <code>SecurityException</code> when using JASPIC
+ under a <code>SecurityManager</code> when authentication is not
+ mandatory. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62329">62329</a>: Correctly list resources in JAR files when directories
+ do not have dedicated entries. Patch provided by Meelis Müür. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Collapse multiple leading <code>/</code> characters to a single
+ <code>/</code> in the return value of
+ <code>HttpServletRequest#getContextPath()</code> to avoid issues if the
+ value is used with <code>HttpServletResponse#sendRedirect()</code>. This
+ behaviour is enabled by default and configurable via the new Context
+ attribute <code>allowMultipleLeadingForwardSlashInPath</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve handing of overflow in the UTF-8 decoder with supplementary
+ characters. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.31_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct off-by-one error in thread pool that allowed thread pools to
+ increase in size to one more than the configured limit. Patch provided
+ by usc. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Prevent unexpected TLS handshake failures caused by errors during a
+ previous handshake that were not correctly cleaned-up when using the NIO
+ or NIO2 connector with the <code>OpenSSLImplementation</code>. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Enable strict validation of the provided host name and port for all
+ connectors. Requests with invalid host names and/or ports will be
+ rejected with a 400 response. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62273">62273</a>: Implement configuration options to work-around
+ specification non-compliant user agents (including all the major
+ browsers) that do not correctly %nn encode URI paths and query strings
+ as required by RFC 7230 and RFC 3986. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.31_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Enable ECJ version 4.7 and later to be used as a drop in replacement for
+ the ECJ version that ships with Apache Tomcat. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Enable Java 10 to be specified as a JSP source and/or target if a newer
+ ECJ version is used. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62287">62287</a>: Do not rely on hash codes to test instances of
+ <code>ValueExpressionImpl</code> for equality. Patch provided by Mark
+ Struberg. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.31_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62301">62301</a>: Correct a regression in the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61491">61491</a>
+ that didn't correctly handle a final empty message part in all
+ circumstances when using <code>PerMessageDeflate</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62332">62332</a>: Ensure WebSocket connections are closed after an I/O
+ error is experienced reading from the client. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.31_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid warning when running under Cygwin when the
+ <code>JAVA_ENDORSED_DIRS</code> environment variable is not set. Patch
+ provided by Zemian Deng. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.30_(markt)"><span style="float: right;">2018-04-07</span> Tomcat 8.5.30 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.30_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=51195">51195</a>: Avoid a false positive report of a web application
+ memory leak by clearing <code>ObjectStreamClass$Caches</code> of classes
+ loaded by the web application when the web application is stopped.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=52688">52688</a>: Add support for the <code>maxDays</code> attribute to
+ the <code>AccessLogValve</code> and <code>ExtendedAccessLogValve</code>.
+ This allows the maximum number of days for which rotated access logs
+ should be retained before deletion to be defined. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure the MBean names for the <code>SSLHostConfig</code> and
+ <code>SSLHostConfigCertificate</code> are correctly formed when the
+ <code>Connector</code> is bound to a specific IP address. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62168">62168</a>: When using the <code>PersistentManager</code> honor a
+ value of <code>-1</code> for <code>minIdleSwap</code> and do not swap
+ out sessions to keep the number of active sessions under
+ <code>maxActive</code>. Patch provided by Holger Sunke. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62172">62172</a>: Improve Javadoc for
+ <code>org.apache.catalina.startup.Constants</code> and ensure that the
+ constants are correctly used. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62175">62175</a>: Avoid infinite recursion, when trying to validate
+ a session while loading it with <code>PersistentManager</code>.
+ (fschumacher)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that <code>NamingContextListener</code> instances are only
+ notified once of property changes on the associated naming resources.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add LoadBalancerDrainingValve, a Valve designed to reduce the amount of
+ time required for a node to drain its authenticated users. (schultz)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62224">62224</a>: Disable the <code>forkJoinCommonPoolProtection</code>
+ of the <code>JreMemoryLeakPreventionListener</code> when running on Java
+ 9 and above since the underlying JRE bug has been fixed. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.30_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid potential loop in APR/Native poller. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure streams that are received but not processed are excluded from the
+ tracking of maximum ID of processed streams. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor the check for a paused connector to consistently prevent new
+ streams from being created after the connector has been paused. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve debug logging for HTTP/2 pushed streams. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ The OpenSSL engine SSL session will now ignore invalid accesses. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62177">62177</a>: Correct two protocol errors with HTTP/2
+ <code>PUSH_PROMISE</code> frames. Firstly, the HTTP/2 protocol only
+ permits pushes to be sent on peer initiated requests. Secondly, pushes
+ must be sent in order of increasing stream ID. These restriction were
+ not being enforced leading to protocol errors at the client. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.30_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add document for <code>FragmentationInterceptor</code>. (kfujino)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Document how the roles for an authenticated user are determined when the
+ <code>CombinedRealm</code> is used. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.30_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add JMX support for <code>FragmentationInterceptor</code> in order to
+ prevent warning of startup. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.30_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that <code>SQLWarning</code> has been cleared when connection
+ returns to the pool. (kfujino)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Enable clearing of <code>SQLWarning</code> via JMX. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that parameters have been cleared when
+ <code>PreparedStatement</code> and/or <code>CallableStatement</code> are
+ cached. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Enable PoolCleaner to be started even if <code>validationQuery</code>
+ is not set. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.30_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62164">62164</a>: Switch the build script to use TLS for downloads from
+ SourceForge and Maven Central to avoid failures due to HTTP to HTTPS
+ redirects. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Always report the OS's umask when launching the JVM. (schultz)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.29_(markt)"><span style="float: right;">2018-03-08</span> Tomcat 8.5.29 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.29_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Minor optimization when calling class transformers. (rjung)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Prevent Tomcat from applying gzip compression to content that is already
+ compressed with brotli compression. Based on a patch provided by burka.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62090">62090</a>: Null container names are not allowed. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62104">62104</a>: Fix programmatic login regression as the
+ NonLoginAuthenticator has to be set for it to work (if no login method
+ is specified). (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62117">62117</a>: Improve error message in <code>catalina.sh</code> when
+ calling <code>kill -0 <pid></code> fails. Based on a suggestion
+ from Mark Morschhaeuser. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62118">62118</a>: Correctly create a JNDI <code>ServiceRef</code> using
+ the specified interface rather than the concrete type. Based on a
+ suggestion by Ángel Álvarez Páscua. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix for <code>RequestDumperFilter</code> log attribute. Patch provided
+ by Kirill Romanov via Github. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62123">62123</a>: Avoid <code>ConcurrentModificationException</code>
+ when attempting to clean up application triggered RMI memory leaks on
+ web application stop. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a regression in the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60276">60276</a> that meant that
+ compression was applied to all MIME types. Patch provided by Stefan
+ Knoblich. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.29_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add minor HPACK fixes, based on fixes by Stuart Douglas. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61751">61751</a>: Follow up fix so that OpenSSL engine returns
+ underflow when unwrapping if no bytes were produced and the input is
+ empty. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Minor OpenSSL engine cleanups. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ NIO SSL handshake should throw an exception on overflow status, like
+ NIO2 SSL. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.29_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=48672">48672</a>: Add documentation for the Host Manager web
+ application. Patch provided by Marek Czernek. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Work-around a known, non-specification compliant behaviour in some
+ versions of IE that can allow XSS when the Manager application generates
+ a plain text response. Based on a suggestion from Muthukumar Marikani.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.29_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the build script so MD5 hashes are no longer generated for
+ releases as per the change in the ASF distribution policy. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.28_(markt)"><span style="float: right;">2018-02-11</span> Tomcat 8.5.28 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.28_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Prevent a stack trace being written to standard out when running on Java
+ 10 due to changes in the <code>LogManager</code> implementation. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62000">62000</a>: When a JNDI reference cannot be resolved, ensure that
+ the root cause exception is reported rather than swallowed. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62036">62036</a>: When caching an authenticated user Principal in the
+ session when the web application is configured with the
+ <code>NonLoginAuthenticator</code>, cache the internal Principal object
+ rather than the user facing Principal object as Tomcat requires the
+ internal object to correctly process later authorization checks. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid duplicate load attempts if one has been made already. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid NPE in ThreadLocalLeakPreventionListener if there is no Engine.
+ (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62067">62067</a>: Correctly apply security constraints mapped to the
+ context root using a URL pattern of <code>""</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When using Tomcat embedded, only perform Authenticator configuration
+ once during web application start. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Process all <code>ServletSecurity</code> annotations at web application
+ start rather than at servlet load time to ensure constraints are applied
+ consistently. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.28_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61751">61751</a>: Fix truncated request input streams when using NIO2
+ with TLS. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62023">62023</a>: Log error reporting multiple SSLHostConfig elements
+ when using the APR Connector instead of crashing Tomcat. (csutherl)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62032">62032</a>: Fix NullPointerException when certificateFile is not
+ defined on an SSLHostConfig and unify the behavior when a
+ certificateFile is defined but the file does not exist for both
+ JKS and PEM file types. (csutherl)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.28_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62024">62024</a>: When closing a connection with an abnormal close,
+ close the socket immediately rather than waiting for a close message
+ from the client that may never arrive. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Webapps">Webapps</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62049">62049</a>: Fix missing class from manager 404 JSP error page.
+ (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.28_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Enhance the JMX support for jdbc-pool in order to expose
+ <code>PooledConnection</code> and <code>JdbcInterceptors</code>.
+ (kfujino)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add MBean for <code>PooledConnection</code>. (kfujino)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62011">62011</a>: Add MBean for <code>StatementCache</code>. (kfujino)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expose the cache size for each connection via JMX in
+ <code>StatementCache</code>. (kfujino)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add MBean for <code>ResetAbandonedTimer</code>. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.28_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the NSIS Installer used to build the Windows installer to version
+ 3.03. (kkolinko)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.27_(markt)"><span style="float: right;">2018-01-22</span> Tomcat 8.5.27 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.27_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a regression in the previous fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61916">61916</a> that meant
+ that any call to <code>addHeader()</code> would have been replaced with
+ a call to <code>setHeader()</code> for all requests mapped to the
+ <code>AddDefaultCharsetFilter</code>. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.27_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61993">61993</a>: Improve handling for <code>ByteChunk</code> and
+ <code>CharChunk</code> instances that grow close to the maximum size
+ allowed by the JRE. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.27_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=43925">43925</a>: Add a new system property
+ (<code>org.apache.jasper.runtime.BodyContentImpl.BUFFER_SIZE</code>) to
+ control the size of the buffer used by Jasper when buffering tag bodies.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.27_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62006">62006</a>: Document the new <code>JvmOptions9</code> command line
+ parameter for <code>tomcat8.exe</code>. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.26_(markt)"><span style="float: right;">not released</span> Tomcat 8.5.26 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.26_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct Javadoc errors in release build.
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.25_(markt)"><span style="float: right;">not released</span> Tomcat 8.5.25 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.25_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=47214">47214</a>: Use a loop to preload anonymous inner classes
+ when running under a <code>SecurityManager</code>, to be safe for
+ future changes in the code or using a different compiler. (kkolinko)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=57619">57619</a>: Implement a small optimisation to how JAR URLs are
+ processed to reduce the storage of duplicate String objects in memory.
+ Patch provided by Dmitri Blinov. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add some missing NPEs to ServletContext. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61916">61916</a>: Extend the <code>AddDefaultCharsetFilter</code> to add
+ a character set when the content type is set via
+ <code>setHeader()</code> or <code>addHeader()</code> as well as when it
+ is set via <code>setContentType()</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61999">61999</a>: maxSavePostSize set to 0 should disable saving POST
+ data during authentication. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.25_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60276">60276</a>: Implement GZIP compression support for responses
+ served over HTTP/2. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Do not call onDataAvailable without any data to read. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61886">61886</a>: Log errors on non-container threads at
+ <code>DEBUG</code> rather than <code>INFO</code>. The exception will be
+ made available to the application via the asynchronous error handling
+ mechanism. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61914">61914</a>: Possible NPE with Java 9 when creating an SSL engine.
+ Patch submitted by Evgenij Ryazanov. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61918">61918</a>: Fix connectionLimitLatch counting when closing an
+ already closed socket. Based on a patch by Ryan Fong. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add support for the OpenSSL ARIA ciphers to the OpenSSL to JSSE
+ cipher mapping. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61932">61932</a>: Allow a call to <code>AsyncContext.dispatch()</code>
+ to terminate non-blocking I/O. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61948">61948</a>: Improve the handling of malformed ClientHello messages
+ in the code that extracts the SNI information from a TLS handshake for
+ the JSSE based NIO and NIO2 connectors. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix NIO2 handshaking with a full input buffer. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Return a simple, plain text error message if a client attempts to make a
+ plain text HTTP connection to a TLS enabled NIO or NIO2 Connector.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correctly handle EOF when <code>ServletInputStream.isReady()</code> is
+ called. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.25_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61854">61854</a>: When using sets and/or maps in EL expressions, ensure
+ that Jasper correctly parses the expression. Patch provided by Ricardo
+ Martin Camarero. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the handling of methods with varargs in EL expressions. In
+ particular, the calling of a varargs method with no parameters now works
+ correctly. Based on a patch by Nitkalya (Ing) Wiriyanuparb. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.25_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Remove the Servlet 4.0 early preview example from the examples web
+ application as the early preview is now deprecated in favour of Tomcat
+ 9 which provides a full Servlet 4.0 implementation. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61223">61223</a>: Add the mbeans-descriptors.dtd file to the custom
+ MBean documentation so users have a reference to use when constructing
+ mbeans-descriptors.xml files for custom components. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61566">61566</a>: Expose the currently in use certificate chain and list
+ of trusted certificates for all virtual hosts configured using the JSSE
+ style (keystore) TLS configuration via the Manager web application.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Partial fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61886">61886</a>. Ensure that multiple threads do not
+ attempt to complete the <code>AsyncContext</code> if an I/O error occurs
+ in the stock ticker example Servlet. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61886">61886</a>: Prevent <code>ConcurrentModificationException</code>
+ when running the asynchronous stock ticker in the examples web
+ application. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61886">61886</a>: Prevent <code>NullPointerException</code> and other
+ errors if the stock ticker example is running when the examples web
+ application is stopped. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61910">61910</a>: Clarify the meaning of the <code>allowLinking</code>
+ option in the documentation web application. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add OCSP configuration information to the SSL How-To. Patch provided by
+ Marek Czernek. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.25_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61312">61312</a>: Prevent <code>NullPointerException</code> when using
+ the statement cache of connection that has been closed. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.25_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add an additional system property for the system property replacement.
+ (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add missing SHA-512 hash for release artifacts to the build script.
+ (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons Pool 2 to 2.4.3. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons DBCP 2 to 8a71764 (2017-10-18) to
+ pick up some bug fixes and enhancements. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons FileUpload to 6c00d57 (2017-11-23)
+ to pick up some code clean-up. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons Codec to r1817136 to pick up some
+ code clean-up. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ The native source bundles (for Commons Daemon and Tomcat Native) are no
+ longer copied to the bin directory for the deploy target. They are now
+ only copied to the bin directory for the release target. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.24_(markt)"><span style="float: right;">2017-11-30</span> Tomcat 8.5.24 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.24_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ When running under Java 9 or later, and the
+ <code>urlCacheProtection</code> option of the
+ <code>JreMemoryLeakPreventionListener</code> is enabled, use the API
+ added in Java 9 to only disable the caching for JAR URL connections.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix possible <code>SecurityException</code> when using TLS related
+ request attributes. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61597">61597</a>: Extend the <code>StandardJarScanner</code> to scan
+ JARs on the module path when running on Java 9 and class path scanning
+ is enabled. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61601">61601</a>: Add support for multi-release JARs in JAR scanning and
+ web application class loading. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61681">61681</a>: Allow HTTP/2 push when using request wrapping. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Provide the <code>SessionInitializerFilter</code> that can be used to
+ ensure that an HTTP session exists when initiating a WebSocket
+ connection. Patch provided by isapir. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61682">61682</a>: When re-prioritising HTTP/2 streams, ensure that both
+ parent and children fields are correctly updated to avoid a possible
+ <code>StackOverflowError</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve concurrency by reducing the scope of the synchronisation for
+ <code>javax.security.auth.message.config.AuthConfigFactory</code> in the
+ JASPIC API implementation. Based on a patch by Pavan Kumar. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid a possible <code>NullPointerException</code> when timing out
+ <code>AsyncContext</code> instances during shut down. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61777">61777</a>: Avoid a <code>NullPointerException</code> when
+ detaching a JASPIC <code>RegistrationListener</code>. Patch provided by
+ Lazar. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61778">61778</a>: Correct the return value when detaching a JASPIC
+ <code>RegistrationListener</code>. Patch provided by Lazar. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61779">61779</a>: Avoid a <code>NullPointerException</code> when a
+ <code>null</code> <code>RegistrationListener</code> is passed to
+ <code>AuthConfigFactory.getConfigProvider()</code>. Patch provided by
+ Lazar. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61780">61780</a>: Only include the default JASPIC registration ID in the
+ return value for a call to
+ <code>AuthConfigFactory.getRegistrationIDs()</code> if a
+ <code>RegistrationContext</code> has been registered using the default
+ registration ID. Patch provided by Lazar. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61781">61781</a>: Enable JASPIC provider registrations to be persisted
+ when the layer and/or application context are <code>null</code>. Patch
+ provided by Lazar. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61782">61782</a>: When calling
+ <code>AuthConfigFactory.doRegisterConfigProvider()</code> and the
+ requested JASPIC config provider class is found by the web application
+ class loader, do not attempt to load the class with the class loader
+ that loaded the JASPIC API. Patch provided by Lazar. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61783">61783</a>: When calling
+ <code>AuthConfigFactory.removeRegistration()</code> and the registration
+ is persistent, it should be removed from the persistent store. Patch
+ provided by Lazar. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61784">61784</a>: Correctly handle the case when
+ <code>AuthConfigFactoryImpl.registerConfigProvider()</code> is called
+ with a provider name of <code>null</code>. Patch provided by Lazar.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61795">61795</a>: Add a property to the <code>Authenticator</code>
+ implementations to enable a custom JASPIC <code>CallbackHandler</code>
+ to be specified. Patch provided by Lazar. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.24_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Enable ALPN and also, therefore, HTTP/2 for the NIO and NIO2 HTTP
+ connectors when using the JSSE implementation for TLS when running on
+ Java 9. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60762">60762</a>: Add the ability to make changes to the TLS
+ configuration of a connector at runtime without having to restart the
+ Connector. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61568">61568</a>: Avoid a potential <code>SecurityException</code> when
+ using the NIO2 connector and a new thread is added to the pool. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61583">61583</a>: Correct a further regression in the fix to enable the
+ use of Java key stores that contained multiple keys that did not all
+ have the same password. This fixes PKCS11 key store handling with
+ multiple keys selected with an alias. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Reduce default HTTP/2 stream concurrent execution within a connection
+ from 200 to 20. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61668">61668</a>: Avoid a possible NPE when calling
+ <code>AbstractHttp11Protocol.getSSLProtocol()</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61673">61673</a>: Avoid a possible
+ <code>ConcurrentModificationException</code> when working with the
+ streams associated with a connection. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61719">61719</a>: Avoid possible NPE calling
+ InputStream.setReadListener with HTTP/2. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61736">61736</a>: Improve performance of NIO connector when clients
+ leave large time gaps between network packets. Patch provided by Zilong
+ Song. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61740">61740</a>: Correct an off-by-one error in the Hpack header index
+ validation that caused intermittent request failures when using HTTP/2.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.24_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61816">61816</a>: Invalid expressions in attribute values or template
+ text should trigger a translation (compile time) error, not a run time
+ error. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.24_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61604">61604</a>: Add support for authentication in the websocket
+ client. Patch submitted by J Fernandez. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.24_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Enable Javadoc to be built with Java 9. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61603">61603</a>: Add XML filtering for the status servlet output where
+ needed. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the description of how the CGI servlet maps a request to a
+ script in the CGI How-To. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.24_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix incorrect behavior that attempts to resend channel messages more
+ than the actual setting value of <code>maxRetryAttempts</code>.
+ (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the remaining Sender can send channel messages by avoiding
+ unintended <code>ChannelException</code> caused by comparing the number
+ of failed members and the number of remaining Senders. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that remaining SelectionKeys that were not handled by throwing a
+ <code>ChannelException</code> during SelectionKey processing are
+ handled. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.24_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61439">61439</a> and exclude the JPA, JAX-WS and EJB
+ annotations completely from the Tomcat distributions. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve handling of endorsed directories. The endorsed directory
+ mechanism will only be used if the <code>JAVA_ENDORSED_DIRS</code>
+ system property is explicitly set or if
+ <code>$CATALINA_HOME/endorsed</code> exists. When running on Java 9, any
+ such attempted use of the endorsed directory mechanism will trigger an
+ error and Tomcat will fail to start. (rjung)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactoring in preparation for Java 9. Refactor to avoid using some
+ methods that will be deprecated in Java 9 onwards. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=51496">51496</a>: When using the Windows installer, check if the
+ requested service name already exists and, if it does, prompt the user
+ to select an alternative service name. Patch provided by Ralph
+ Plawetzki. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add necessary Java 9 configuration options to the startup scripts to
+ prevent warnings being generated on web application stop. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61590">61590</a>: Enable <code>service.bat</code> to recognise when
+ <code>JAVA_HOME</code> is configured for a Java 9 JDK. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61598">61598</a>: Update the Windows installer to search the new (as of
+ Java 9) registry locations when looking for a JRE. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add generation of a SHA-512 hash for release artifacts to the build
+ script. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61658">61658</a>: Update MIME mappings for fonts to use
+ <code>font/*</code> as per RFC8081. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.16 to
+ pick up the latest Windows binaries built with APR 1.6.3 and OpenSSL
+ 1.0.2m. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the NSIS Installer used to build the Windows installer to version
+ 3.02.1. (kkolinko)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the Windows installer to use "The Apache Software Foundation" as
+ the Publisher when Tomcat is displayed in the list of installed
+ applications in Microsoft Windows. (kkolinko)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61803">61803</a>: Remove outdated SSL information from the Security
+ documentation. (remm)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.23_(markt)"><span style="float: right;">2017-10-01</span> Tomcat 8.5.23 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.23_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Use the correct path when loading the JVM <code>logging.properties</code>
+ file for Java 9. (rjung)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add additional validation to the resource handling required to fix
+ CVE-2017-12617 on Windows. The checks were being performed elsewhere but
+ adding them to the resource handling ensures that the checks are always
+ performed. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61554">61554</a>: Exclude test files in unusual encodings and markdown
+ files intended for display in GitHub from RAT analysis. Patch provided
+ by Chris Thistlethwaite. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.23_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61563">61563</a>: Correct typos in Spanish translation. Patch provided by
+ Gonzalo Vásquez. (csutherl)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.22_(markt)"><span style="float: right;">not released</span> Tomcat 8.5.22 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.22_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60963">60963</a>: Add <code>ExtractingRoot</code>, a new
+ <code>WebResourceRoot</code> implementation that extracts JARs to the
+ work directory for improved performance when deploying packed WAR files.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add an option to reject requests that contain HTTP headers with invalid
+ (non-token) header names with a 400 response. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61542">61542</a>: Fix CVE-2017-12617 and prevent JSPs from being
+ uploaded via a specially crafted request when HTTP PUT was enabled.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Implement the requirements of RFC 7230 (and RFC 2616) that HTTP/1.1
+ requests must include a <code>Host</code> header and any request that
+ does not must be rejected with a 400 response. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Implement the requirements of RFC 7230 that any HTTP/1.1 request that
+ specifies a host in the request line, must specify the same host in the
+ <code>Host</code> header and that any such request that does not, must
+ be rejected with a 400 response. This check is optional but disabled by
+ default. It may be enabled with the
+ <code>allowHostHeaderMismatch</code> attribute of the Connector. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Implement the requirements of RFC 7230 that any HTTP/1.1 request that
+ contains multiple <code>Host</code> headers is rejected with a 400
+ response. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.22_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Add a way to set the property source in embedded mode. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61557">61557</a>: Correct a further regression in the fix to enable the
+ use of Java key stores that contain multiple keys that do not all have
+ the same password. The regression broke support for some FIPS compliant
+ key stores. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.22_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61545">61545</a>: Correctly handle invocations of methods defined in the
+ <code>PooledConnection</code> interface when using pooled XA
+ connections. Patch provided by Nils Winkler. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.22_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Update fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59904">59904</a> so that values less than zero are accepted
+ instead of throwing a NegativeArraySizeException. (remm)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.21_(markt)"><span style="float: right;">2017-09-19</span> Tomcat 8.5.21 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.21_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Before generating an error page in the <code>ErrorReportValve</code>,
+ check to see if I/O is still permitted for the associated connection
+ before generating the error page so that the page generation can be
+ skipped if the page is never going to be sent. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61189">61189</a>: Add the ability to set environment variables for
+ individual CGI scripts. Based on a patch by jm009. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61210">61210</a>: When running under a SecurityManager, do not print a
+ warning about not being able to read a logging configuration file when
+ that file does not exist. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61280">61280</a>: Add RFC 7617 support to the
+ <code>BasicAuthenticator</code>. Note that the default configuration
+ does not change the existing behaviour. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61424">61424</a>: Avoid a possible <code>StackOverflowError</code> when
+ running under a <code>SecurityManager</code> and using
+ <code>Subject.doAs()</code>. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.21_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ The minimum required Tomcat Native version has been increased to 1.2.14.
+ This version includes a new API needed for correct client certificate
+ support when using a Java connector with OpenSSL TLS implementation and
+ support for the <code>SSL_CONF</code> OpenSSL API. (rjung)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add support for the OpenSSL <code>SSL_CONF</code> API when using
+ TLS with OpenSSL implementation. It can be used by adding
+ <code>OpenSSLConf</code> elements underneath <code>SSLHostConfig</code>.
+ The new element contains a list of <code>OpenSSLConfCmd</code> elements,
+ each with the attributes <code>name</code> and <code>value</code>.
+ (rjung)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When using a Java connector in combination with the OpenSSL TLS
+ implementation, do not configure each SSL connection object via
+ the OpenSSLEngine. For OpenSSL the SSL object inherits its
+ settings from the SSL_CTX which we have already configured.
+ (rjung)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When using JSSE TLS configuration with the OpenSSL implementation and
+ client certificates: include client CA subjects in the TLS handshake
+ so that the client can choose an appropriate client certificate to
+ present. (rjung)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ If an invalid option is specified for the
+ <code>certificateVerification</code> attribute of an
+ <code>SSLHostConfig</code> element, treat it as <code>required</code>
+ which is the most secure / restrictive option in addition to reporting
+ the configuration error. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the handling of client disconnections during the TLS
+ renegotiation handshake. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Prevent exceptions being thrown during normal shutdown of NIO
+ connections. This enables TLS connections to close cleanly. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix possible race condition when setting IO listeners on an upgraded
+ connection. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=48655">48655</a>: Enable Tomcat to shutdown cleanly when using sendfile,
+ the APR/native connector and a multi-part download is in progress.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58244">58244</a>: Handle the case when OpenSSL resumes a TLS session
+ using a ticket and the full client certificate chain is not available.
+ In this case the client certificate without the chain will be presented
+ to the application. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the warning message when JSSE and OpenSSL configuration styles
+ are mixed on the same <code>SSLHostConfig</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61415">61415</a>: Fix TLS renegotiation with OpenSSL based connections
+ and session caching. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Delay checking that the configured attributes for an
+ <code>SSLHostConfig</code> instance are consistent with the configured
+ SSL implementation until <code>Connector</code> start to avoid incorrect
+ warnings when the SSL implementation changes during initialisation.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61450">61450</a>: Fix default key alias algorithm. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61451">61451</a>: Correct a regression in the fix to enable the use of
+ Java key stores that contained multiple keys that did not all have the
+ same password. The regression broke support for any key store that did
+ not store keys in PKCS #8 format such as hardware key stores and Windows
+ key stores. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.21_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60523">60523</a>: Reduce the number of packets used to send WebSocket
+ messages by not flushing between the header and the payload when the
+ two are written together. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61491">61491</a>: When using the <code>permessage-deflate</code>
+ extension, correctly handle the sending of empty messages after
+ non-empty messages to avoid the <code>IllegalArgumentException</code>.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.21_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Show connector cipher list in the manager web application in the
+ correct cipher order. (rjung)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.21_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ To avoid unexpected session timeout notification from backup session,
+ update the access time when receiving the map member notification
+ message. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add member info to the log message when the failure detection check
+ fails in <code>TcpFailureDetector</code>. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid Ping timeout until the added map member by receiving
+ <code>MSG_START</code> message is completely started. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When sending a channel message, make sure that the Sender has connected.
+ (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the backup node selection logic that node 0 is returned twice
+ consecutively. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix race condition of <code>responseMap</code> in
+ <code>RpcChannel</code>. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.21_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61391">61391</a>: Ensure that failed queries are logged if the
+ <code>SlowQueryReport</code> interceptor is configured to do so and the
+ connection has been abandoned. Patch provided by Craig Webb. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61425">61425</a>: Ensure that transaction of idle connection has
+ terminated when the <code>testWhileIdle</code> is set to
+ <code>true</code> and <code>defaultAutoCommit</code> is set to
+ <code>false</code>. Patch provided by WangZheng. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.21_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61439">61439</a>: Remove the Java Annotation API classes from
+ tomcat-embed-core.jar and package them in a separate JAR in the
+ embedded distribution to provide end users with greater flexibility to
+ handle potential conflicts with the JRE and/or other JARs. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61441">61441</a>: Improve the detection of <code>JAVA_HOME</code> by the
+ <code>daemon.sh</code> script when running on a platform where Java has
+ been installed from an RPM. (rjung)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.14 to
+ pick up the latest Windows binaries built with APR 1.6.2 and OpenSSL
+ 1.0.2l. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61599">61599</a>: Update to Commons Daemon 1.1.0 for improved Java 9
+ support. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.20_(markt)"><span style="float: right;">2017-08-08</span> Tomcat 8.5.20 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.20_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Revert the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=49464">49464</a> since it continued to trigger
+ regressions. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a bug in the <code>PushBuilder</code> implementation that
+ meant push URLs containing <code>%nn</code> sequences were not correctly
+ decoded. Identified by FindBugs. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61164">61164</a>: Add support for the <code>%X</code> pattern in the
+ <code>AccessLogValve</code> that reports the connection status at the
+ end of the request. Patch provided by Zemian Deng. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61351">61351</a>: Correctly handle %nn decoding of URL patterns in
+ web.xml and similar locations that may legitimately contain characters
+ that are not permitted by RFC 3986. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61366">61366</a>: Add a new attribute, <code>localDataSource</code>, to
+ the <code>JDBCStore</code> that allows the Store to be configured to use
+ a DataSource defined by the web application rather than the default of
+ using a globally defined DataSource. Patch provided by Jonathan
+ Horowitz. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.20_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61086">61086</a>: Ensure to explicitly signal an empty request body for
+ HTTP 205 responses. Additional fix to r1795278. Based on a patch
+ provided by Alexandr Saperov. (violetagg)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61345">61345</a>: Add a server listener that can be used to do system
+ property replacement from the property source configured in the
+ digester. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add additional logging to record problems that occur while waiting for
+ the NIO pollers to stop during the Connector stop process. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.20_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61364">61364</a>: Ensure that files are closed after detecting encoding
+ of JSPs so that files do not remain locked by the file system. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.20_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=57767">57767</a>: Add support to the WebSocket client for following
+ redirects when attempting to establish a WebSocket connection. Patch
+ provided by J Fernandez. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.19_(markt)"><span style="float: right;">2017-07-28</span> Tomcat 8.5.19 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.19_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Performance improvements for service loader look-ups (and look-ups of
+ other class loader resources) when the web application is deployed in a
+ packed WAR file. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61253">61253</a>: Add warn message when Digester.updateAttributes
+ throws an exception instead of ignoring it. (csutherl)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a further regression in the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=49464">49464</a> that could
+ cause an byte order mark character to appear at the start of content
+ included by the <code>DefaultServlet</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61313">61313</a>: Make the read timeout configurable in the
+ <code>JNDIRealm</code> and ensure that a read timeout will result in an
+ attempt to fail over to the alternateURL. Based on patches by Peter
+ Maloney and Felix Schumacher. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.19_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the documentation for how <code>StandardRoot</code> is
+ configured. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.19_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61316">61316</a>: Fix corruption of UTF-16 encoded source files in
+ released source distributions. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.18_(markt)"><span style="float: right;">not released</span> Tomcat 8.5.18 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.18_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61232">61232</a>: When log rotation is disabled only one separator will
+ be used when generating the log file name. For example if the prefix is
+ <code>catalina.</code> and the suffix is <code>.log</code> then the log
+ file name will be <code>catalina.log</code> instead of
+ <code>catalina..log</code>. Patch provided by Katya Stoycheva.
+ (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61264">61264</a>: Correct a regression in the refactoring to use
+ <code>Charset</code> rather than <code>String</code> to store request
+ character encoding that prevented <code>getReader()</code> throwing an
+ <code>UnsupportedEncodingException</code> if the user agent specifies
+ an unsupported character encoding. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a regression in the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=49464">49464</a> that could cause an
+ incorrect <code>Content-Length</code> header to be sent by the
+ <code>DefaultServlet</code> if the encoding of a static is not
+ consistent with the encoding of the response. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.18_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Enable TLS connectors to use Java key stores that contain multiple keys
+ where each key has a separate password. Based on a patch by Frank
+ Taffelt. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the handling of HTTP/2 stream resets due to excessive headers
+ when a continuation frame is used. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.18_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=53031">53031</a>: Add support for the <code>fork</code> option when
+ compiling JSPs with the Jasper Ant task and javac. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.18_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=52791">52791</a>: Add the ability to set the defaults used by the
+ Windows installer from a configuration file. Patch provided by Sandra
+ Madden. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.17_(markt)"><span style="float: right;">not released</span> Tomcat 8.5.17 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.17_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=49464">49464</a>: Improve the Default Servlet's handling of static files
+ when the file encoding is not compatible with the required response
+ encoding. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61214">61214</a>: Remove deleted attribute <code>servlets</code> from
+ the Context MBean description. Patch provided by Alexis Hassler. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61215">61215</a>: Correctly define <code>addConnectorPort</code> and
+ <code>invalidAuthenticationWhenDeny</code> in the
+ <code>mbean-descriptors.xml</code> file for the
+ <code>org.apache.catalina.valves</code> package so that the attributes
+ are accessible via JMX. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Make asynchronous error handling more robust. In particular ensure that
+ <code>onError()</code> is called for any registered
+ <code>AsyncListener</code>s after an I/O error on a non-container
+ thread. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Additional permission for deleting files is granted to JULI as it is
+ required by FileHandler when running under a Security Manager. The
+ thread that cleans the log files is marked as daemon thread.
+ (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61229">61229</a>: Correct a regression in 8.5.15 that broke WebDAV
+ handling for resources with names that included a <code>&</code>
+ character. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.17_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Restore the ability to configure support for SSLv3. Enabling this
+ protocol will trigger a warning in the logs since it is known to be
+ insecure. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Do not log a warning when a <code>null</code> session is returned for an
+ OpenSSL based TLS session since this is expected when session tickets
+ are enabled. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When the access log valve logs a TLS related request attribute and the
+ NIO2 connector is used with OpenSSL, ensure that the TLS attributes are
+ available to the access log valve when the connection is closing.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60461">60461</a>: Sync SSL session access for the APR connector. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ To ease migration from 8.0.x to 8.5.x, if the HTTP or AJP BIO connector
+ is explicitly configured, rather than failing to start the connector
+ because BIO has been removed, automatically switch to NIO and continue.
+ A warning will be logged to alert the user to the switch. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.17_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Remove references to the Loader attribute
+ <code>searchExternalFirst</code> from the documentation since the
+ attribute is no longer supported. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.16_(markt)"><span style="float: right;">2017-06-26</span> Tomcat 8.5.16 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.16_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61072">61072</a>: Respect the documentation statements that allow
+ using the platform default secure random for session id generation.
+ (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the javadoc for
+ <code>o.a.c.connector.CoyoteAdapter#parseSessionCookiesId</code>.
+ Patch provided by John Andrew (XUZHOUWANG) via Github. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61101">61101</a>: CORS filter should set Vary header in response.
+ Submitted by Rick Riemer. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61105">61105</a>: Add a new JULI FileHandler configuration for
+ specifying the maximum number of days to keep the log files.
+ (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61125">61125</a>: Ensure that <code>WarURLConnection</code> returns the
+ correct value for calls to <code>getLastModified()</code> as this is
+ required for the correct detection of JSP modifications when the JSP is
+ packaged in a WAR file. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the <code>SSLValve</code> so it is able to handle client
+ certificate headers from Nginx. Based on a patch by Lucas Ventura Carro.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61134">61134</a>: Do not use '[' and ']' symbols around substituted
+ text fragments when generating the default error pages. Patch provided
+ by Katya Todorova. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61154">61154</a>: Allow the Manager and Host Manager web applications to
+ start by default when running under a security manager. This was
+ accomplished by adding a custom permission,
+ <code>org.apache.catalina.security.DeployXmlPermission</code>, that
+ permits an application to use a <code>META-INF/context.xml</code> file
+ and then granting that permission to the Manager and Host Manager.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61173">61173</a>: Polish the javadoc for
+ <code>o.a.catalina.startup.Tomcat</code>. Patch provided by
+ peterhansson_se. (violetagg)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ A new configuration property <code>crawlerIps</code> is added to the
+ <code>o.a.catalina.valves.CrawlerSessionManagerValve</code>. Using this
+ property one can specify a regular expression that will be used to
+ identify crawlers based on their IP address. Based on a patch provided
+ by Tetradeus. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61180">61180</a>: Log a warning message rather than an information
+ message if it takes more than 100ms to initialised a
+ <code>SecureRandom</code> instance for a web application to use to
+ generate session identifiers. Patch provided by Piotr Chlebda. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61185">61185</a>: When an asynchronous request is dispatched via
+ <code>AsyncContext.dispatch()</code> ensure that
+ <code>getRequestURI()</code> for the dispatched request matches that of
+ the original request. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61197">61197</a>: Ensure that the charset name used in the
+ <code>Content-Type</code> header has exactly the same form as that
+ provided by the application. This reverts a behavioural change in
+ 8.5.15 that caused problems for some clients. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61201">61201</a>: Ensure that the <code>SCRIPT_NAME</code> environment
+ variable for CGI executables is populated in a consistent way regardless
+ of how the CGI servlet is mapped to a request. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.16_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61086">61086</a>: Explicitly signal an empty request body for HTTP 205
+ responses. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61120">61120</a>: Do not ignore path parameters when processing HTTP/2
+ requests. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Revert a change introduced in the fix for bug <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60718">60718</a> that
+ changed the status code recorded in the access log when the client
+ dropped the connection from 200 to 500. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add additional syncs to the SSL session object provided by the OpenSSL
+ engine so that a concurrent destruction cannot cause a JVM crash.
+ (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61195">61195</a>: Backport, with deprecation where appropriate, the
+ endpoint and protocol property changes from 9.0.x to ease migration from
+ 8.5.x to 9.0.x. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.16_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=44787">44787</a>: Improve error message when JSP compiler configuration
+ options are not valid. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61137">61137</a>: <code>j.s.jsp.tagext.TagLibraryInfo#uri</code> and
+ <code>j.s.jsp.tagext.TagLibraryInfo#prefix</code> fields should not be
+ final. Patch provided by Katya Todorova. (violetagg)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.16_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the log message when a <code>MessageHandler</code> for
+ <code>PongMessage</code> does not implement
+ <code>MessageHandler.Whole</code>. (rjung)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Introduce new API <code>o.a.tomcat.websocket.WsSession#suspend</code>/
+ <code>o.a.tomcat.websocket.WsSession#resume</code> that can be used to
+ suspend/resume reading of the incoming messages. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve thread-safety of <code>Future</code>s used to report the result
+ of sending WebSocket messages. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61183">61183</a>: Correct a regression in the previous fix for
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58624">58624</a> that could trigger a deadlock depending on the locking
+ strategy employed by the client code. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.16_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Better document the meaning of the trimSpaces option for Jasper. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61150">61150</a>: Configure the Manager and Host-Manager web
+ applications to permit serialization and deserialization of
+ CRSFPreventionFilter related session objects to avoid warning messages
+ and/or stack traces on web application stop and/or start when running
+ under a security manager. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the TLS configuration documentation to remove SSLv2 and SSLv3
+ from the list of supported protocols. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.16_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add JMX support for Tribes components. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.16_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=45832">45832</a>: Add HTTP DIGEST authentication support to the Catalina
+ Ant tasks used to communicate with the Manager application. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=45879">45879</a>: Add the <code>RELEASE-NOTES</code> file to the root of
+ the installation created by the Tomcat installer for Windows to make it
+ easier for users to identify the installed Tomcat version. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61055">61055</a>: Clarify the code comments in the rewrite valve to make
+ clear that there are no plans to provide proxy support for this valve
+ since Tomcat does not have proxy capabilities. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61076">61076</a>: Document the <code>altDDName</code> attribute for the
+ <code>Context</code> element. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct typo in Jar Scan Filter Configuration Reference.
+ Issue reported via comments.apache.org. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61145">61145</a>: Add missing <code>@Documented</code> annotation to
+ annotations in the annotations API. Patch provided by Katya Todorova.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61146">61146</a>: Add missing <code>lookup()</code> method to
+ <code>@EJB</code> annotation in the annotations API. Patch provided by
+ Katya Todorova. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct typo in Context Container Configuration Reference.
+ Patch provided by Katya Todorova. (violetagg)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.15_(markt)"><span style="float: right;">2017-05-10</span> Tomcat 8.5.15 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.15_(markt)/General">General</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Allow to exclude JUnit test classes using the build property
+ <code>test.exclude</code> and document the property in
+ BUILDING.txt. (rjung)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.15_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Review those places where Tomcat re-encodes a URI or URI component and
+ ensure that the correct encoding (path differs from query string) is
+ applied and that the encoding is applied consistently. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid a <code>NullPointerException</code> when reading attributes for a
+ initialised HTTP connector where TLS is enabled. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Always quote the <code>hostName</code> of an <code>SSLHostConfig</code>
+ element when using it as part of the JMX object name to avoid errors that
+ prevent the associated TLS connector from starting if a wild card
+ <code>hostName</code> is configured (because <code>*</code> is a
+ reserved character for JMX object names). (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Switch to using <code>Charset</code> rather than <code>String</code> to
+ store encoding settings (including for configuration and for the
+ <code>Content-Type header</code>) to reduce the number of places the
+ associated <code>Charset</code> needs to be looked up. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Use a more reliable mechanism for the <code>DefaultServlet</code> when
+ determining if the current request is for custom error page or not.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that when the Default or WebDAV servlets process an error
+ dispatch that the error resource is processed via the
+ <code>doGet()</code> method irrespective of the method used for the
+ original request that triggered the error. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ If a static custom error page is specified that does not exist or cannot
+ be read, ensure that the intended error status is returned rather than a
+ 404 or 403. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When the WebDAV servlet is configured and an error dispatch is made to a
+ custom error page located below <code>WEB-INF</code>, ensure that the
+ target error page is displayed rather than a 404 response. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61047">61047</a>: Add MIME mapping for woff2 fonts in the default
+ web.xml. Patch provided by Justin Williamson. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the logic that selects the encoding to use to decode the query
+ string in the <code>SSIServletExternalResolver</code> so that the
+ <code>useBodyEncodingForURI</code> attribute of the
+ <code>Connector</code> is correctly taken into account. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Within the Expires filter, make the content type value specified with the
+ <code>ExpiresByType</code> parameter, case insensitive. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.15_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When a <code>TrustManager</code> is configured that does not support
+ <code>certificateVerificationDepth</code> only log a warning about that
+ lack of support when <code>certificateVerificationDepth</code> has been
+ explicitly set. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60970">60970</a>: Extend the fix for large headers to push requests.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Do not include a <code>Date</code> header in HTTP/2 responses with
+ status codes less than 200. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.15_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When no BOM is present and an encoding is detected, do not skip the
+ bytes used to detect the encoding since they are not part of a BOM.
+ (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61057">61057</a>: Update to Eclipse JDT Compiler 4.6.3. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61065">61065</a>: Ensure that once the class is resolved by
+ <code>javax.el.ImportHandler#resolveClass</code> it will be cached with
+ the proper name. (violetagg)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.15_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=61003">61003</a>: Ensure the flags for reading/writing in
+ <code>o.a.t.websocket.AsyncChannelWrapperSecure</code> are correctly
+ reset even if some exceptions occurred during processing. (markt/violetagg)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.15_(markt)/Web_Applications">Web Applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add documents for <code>maxIdleTime</code> attribute to Channel Receiver
+ docs. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.15_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Modify the Ant build script used to publish to a Maven repository so
+ that it no longer requires artifacts to be GPG signed. This is make it
+ possible for the CI system to upload snapshot builds to the ASF Maven
+ repository. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Review i18n property files, remove unnecessary escaping and consistently
+ use <code>[...]</code> to delimit inserted values. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.14_(markt)"><span style="float: right;">2017-04-18</span> Tomcat 8.5.14 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.14_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59825">59825</a>: Log a message that lists the components in the
+ processing chain that do not support async processing when a call to
+ <code>ServletRequest.startAsync()</code> fails. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60926">60926</a>: Ensure
+ <code>o.a.c.core.ApplicationContextFacade#setSessionTimeout</code> will
+ invoke the correct method when running Tomcat with security manager.
+ (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the early access Servlet 4.0 API implementation to reflect the
+ change in method name from <code>getPushBuilder()</code> to
+ <code>newPushBuilder()</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a regression in the X to comma refactoring that broke JMX
+ operations that take parameters. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid a <code>NullPointerException</code> when reading attributes for a
+ running HTTP connector where TLS is not enabled. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60940">60940</a>: Improve the handling of the <code>META-INF/</code> and
+ <code>META-INF/MANIFEST.MF</code> entries for Jar files located in
+ <code>/WEB-INF/lib</code> when running a web application from a packed
+ WAR file. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Pre-load the <code>ExceptionUtils</code> class. Since the class is used
+ extensively in error handling, it is prudent to pre-load it to avoid any
+ failure to load this class masking the true problem during error
+ handling. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid potential <code>NullPointerException</code>s related to access
+ logging during shutdown, some of which have been observed when running
+ the unit tests. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When there is no <code>javax.servlet.WriteListener</code> registered
+ then a call to <code>javax.servlet.ServletOutputStream#isReady</code>
+ will return <code>false</code> instead of throwing
+ <code>IllegalStateException</code>. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When there is no <code>javax.servlet.ReadListener</code> registered
+ then a call to <code>javax.servlet.ServletInputStream#isReady</code>
+ will return <code>false</code> instead of throwing
+ <code>IllegalStateException</code>. (violetagg)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.14_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Align cipher configuration parsing with current OpenSSL master. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60970">60970</a>: Fix infinite loop if application tries to write a
+ large header to the response when using HTTP/2. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.14_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60925">60925</a>: Improve the handling of access to properties defined
+ by interfaces when a <code>BeanELResolver</code> is used under a
+ <code>SecurityManager</code>. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.14_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor the creating a constructor for a proxy class to reduce
+ duplicate code. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ In <code>StatementFacade</code>, the method call on the statements that
+ have been closed throw <code>SQLException</code> rather than
+ <code>NullPointerException</code>. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.14_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct comments about Java 8 in <code>Jre8Compat</code>.
+ Patch provided by fibbers via Github. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60932">60932</a>: Correctly escape single quotes when used in i18n
+ messages. Based on a patch by Michael Osipov. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Update the custom Ant task that integrates with the Symantec code
+ signing service to use the now mandatory 2-factor authentication.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.13_(markt)"><span style="float: right;">2017-03-30</span> Tomcat 8.5.13 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.13_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=54618">54618</a>: Add support to the
+ <code>HttpHeaderSecurityFilter</code> for the HSTS preload parameter.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60853">60853</a>: Expose the <code>SSLHostConfig</code> and
+ <code>SSLHostConfigCertificate</code> objects via JMX. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60876">60876</a>: Ensure that <code>Set-Cookie</code> headers generated
+ by the <code>Rfc6265CookieProcessor</code> are aligned with the
+ specification. Patch provided by Jim Griswold. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60882">60882</a>: Fix a <code>NullPointerException</code> when obtaining
+ a <code>RequestDispatcher</code> for a request that will not have any
+ pathInfo associated with it. This was a regression in the changes in
+ 8.5.12 for the Servlet 4.0 API early preview changes. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Align <code>PushBuilder</code> API with changes from Servlet expert
+ group. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor the various implementations of X to comma separated list to a
+ single utility class and update the code to use the new utility class.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60911">60911</a>: Ensure NPE will not be thrown when looking for SSL
+ session ID. Based on a patch by Didier Gutacker. (violetagg)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.13_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60362">60362</a>: Add a new Connector configuration
+ <code>sendReasonPhrase</code>. When this attribute is set to
+ <code>true</code>, a reason phrase will be sent with the response.
+ By default a reason phrase will not be sent. This option is deprecated
+ and is not available in Tomcat 9. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix HTTP/2 incorrect input unblocking on EOF. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Close the connection sooner if an event occurs for a current connection
+ that is not consistent with the current state of that connection.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Speed up shutdown when using multiple acceptor threads by ensuring that
+ the code that unlocks the acceptor threads correctly handles the case
+ where there are multiple threads. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60852">60852</a>: Correctly spell compressible when used in
+ configuration attributes and internal code. Based on a patch by Michael
+ Osipov. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60900">60900</a>: Avoid a <code>NullPointerException</code> in the APR
+ Poller if a connection is closed at the same time as new data arrives on
+ that connection. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve HPACK specification compliance by fixing some test failures
+ reported by the h2spec tool written by Moto Ishizawa. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve HTTP/2 specification compliance by fixing some test failures
+ reported by the h2spec tool written by Moto Ishizawa. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60918">60918</a>: Fix sendfile processing error that could lead to
+ subsequent requests experiencing an <code>IllegalStateException</code>.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve sendfile handling when requests are pipelined. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.13_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the error handling for simple tags to ensure that the tag is
+ released and destroyed once used. (remm, violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60844">60844</a>: Correctly handle the error when fewer parameter values
+ than required by the method are used to invoke an EL method expression.
+ Patch provided by Daniel Gray. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.13_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60764">60764</a>: Implement <code>equals()</code> and
+ <code>hashCode()</code> in the <code>StatementFacade</code> in order to
+ enable these methods to be called on the closed statements if any
+ statement proxy is set. This behavior can be changed with
+ <code>useStatementFacade</code> attribute. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.13_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor the build script and the NSIS installer script so that either
+ NSIS 2.x or NSIS 3.x can be used to build the installer. This is
+ primarily to re-enable building the installer on the Linux based CI
+ system where the combination of NSIS 3.x and wine leads to failed
+ installer builds. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.12_(markt)"><span style="float: right;">2017-03-13</span> Tomcat 8.5.12 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.12_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60469">60469</a>: Refactor <code>RealmBase</code> for better code re-use
+ when implementing Realms that use a custom <code>Principal</code>.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60490">60490</a>: Various formatting and layout improvements for the
+ <code>ErrorReportValve</code>. Patch provided by Michael Osipov. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60596">60596</a>: Improve performance of DefaultServlet when sendfile
+ feature is disabled on connector. (kkolinko)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Make it easier for sub-classes of <code>Tomcat</code> to modify the
+ default web.xml settings by over-riding
+ <code>getDefaultWebXmlListener()</code>. Patch provided by Aaron
+ Anderson. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Reduce the contention in the default <code>InstanceManager</code>
+ implementation when multiple threads are managing objects and need to
+ reference the annotation cache. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60674">60674</a>: Remove <code>final</code> marker from
+ <code>CorsFilter</code> to enable sub-classing. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60683">60683</a>: Security manager failure causing NPEs when doing IO
+ on some JVMs. (csutherl)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60688">60688</a>: Update the internal fork of Apache Commons BCEL to
+ r1782855 to add early access Java 9 support to the annotation scanning
+ code. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60694">60694</a>: Prevent NPE during authentication when no JASPIC
+ <code>AuthConfigFactory</code> is available. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60697">60697</a>: When HTTP TRACE requests are disabled on the
+ Connector, ensure that the HTTP OPTIONS response from custom servlets
+ does not include TRACE in the returned Allow header. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60718">60718</a>: Improve error handling for asynchronous processing and
+ correct a number of cases where the <code>requestDestroyed()</code>
+ event was not being fired and an entry wasn't being made in the access
+ logs. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60720">60720</a>: Replace "WWW-Authenticate" literal with static final
+ AUTH_HEADER_NAME in SpnegoAuthenticator. Patch provided by Michael
+ Osipov. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ The default JASPIC <code>AuthConfigFactory</code> now correctly notifies
+ registered <code>RegistrationListener</code>s when a new
+ <code>AuthConfigProvider</code> is registered. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Improve the performance of <code>AuthenticatorBase</code> when there is
+ no JASPIC configuration available. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When HTTP TRACE requests are disabled on the Connector, ensure that the
+ HTTP OPTIONS response from the WebDAV servlet does not include
+ TRACE in the returned Allow header. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60722">60722</a>: Take account of the
+ <strong>dispatchersUseEncodedPaths</strong> setting on the current
+ <strong>Context</strong> when generating paths for dispatches triggered
+ by <code>AsyncContext.dispatch()</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60728">60728</a>: Make the separator Tomcat uses in the Tomcat specific
+ <code>war:file:...</code> URL protocol customizable via a system
+ property. The separator is equivalent to the use of the <code>!</code>
+ character in <code>jar:file:...</code> URLs. The default separator of
+ <code>*</code> remains unchanged. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the <code>org.apache.catalina.servlet4preview</code> package that
+ can be used to gain early access to Servlet 4.0 features to align with
+ the latest proposals from the Servlet 4.0 expert group. This includes
+ updates to the new Servlet mapping API, new methods on the
+ <code>ServletContext</code> to make the available API more equivalent to
+ the deployment descriptor, updates to the HTTP push API and the ability
+ to set default request and response character encoding per web
+ application. Note that the Servlet 4.0 API is still a work in progress
+ and further changes are likely. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60798">60798</a>: Correct a bug in the handling of JARs in unpacked WARs
+ that meant multiple attempts to read the same entry from a JAR in
+ succession would fail for the second and subsequent attempts. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60808">60808</a>: Ensure that the <code>Map</code> returned by
+ <code>ServletRequest.getParameterMap()</code> is fully immutable. Based
+ on a patch provided by woosan. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60824">60824</a>: Correctly cache the <code>Subject</code> in the
+ session - if there is a session - when running under a
+ <code>SecurityManager</code>. Patch provided by Jan Engehausen. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure request and response facades are used when firing application
+ listeners. (markt/remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.12_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve handling of case when an HTTP/2 client sends more data that is
+ subject to flow control than the current window size allows. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve NIO2 look-ahead parsing of TLS client hello for SNI with large
+ client hello messages. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59807">59807</a>: Provide a better error message when there is no
+ <strong>SSLHostConfig</strong> defined with a <code>hostName</code> that
+ matches the <code>defaultSSLHostConfigName</code> for the associated
+ <strong>Connector</strong>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Include the value of <code>SslHostConfig.truststoreAlgorithm</code> when
+ warning that the algorithm does not support the
+ <code>certificateVerificationDepth</code> configuration option. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that executor thread pools used with connectors pre-start the
+ configured minimum number of idle threads. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60594">60594</a>: Allow some invalid characters that were recently
+ restricted to be processed in requests by using the system property
+ <code>tomcat.util.http.parser.HttpParser.requestTargetAllow</code>.
+ (csutherl)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60627">60627</a>: Modify the <code>Rfc6265CookieProcessor</code> so that
+ in addition to cookie headers that start with an explicit RFC 2109
+ <code>$Version=1</code>, cookies that start with <code>$Version=0</code>
+ are also parsed as RFC 2109 cookies. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60716">60716</a>: Add a new JSSE specific attribute,
+ <code>revocationEnabled</code>, to <code>SSLHostConfig</code> to permit
+ JSSE provider revocation checks to be enabled when no
+ <code>certificateRevocationListFile</code> has been configured. The
+ expectation is that configuration will be performed via a JSSE provider
+ specific mechanisms. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Modify the cookie header generated by the
+ <code>Rfc6265CookieProcessor</code> so it always sends an
+ <code>Expires</code> attribute as well as a <code>Max-Age</code>
+ attribute to avoid problems with Microsoft browsers that do not support
+ the <code>Max-Age</code> attribute. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60761">60761</a>: Expose a protected getter and setter for
+ <code>NioEndpoint.stopLatch</code> to make the class easier to extend.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Prevent blocking reads after a stream exception occurs with HTTP/2.
+ (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.12_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Follow up to the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58178">58178</a>. When creating the
+ <code>ELContext</code> for a tag file, ensure that any registered
+ <code>ELContextListener</code>s are fired. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor code generated for JSPs to reduce the size of the code required
+ for tags. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60769">60769</a>: Correct a regression in the XML encoding detection
+ refactoring carried out for 8.5.10 that incorrectly always used the
+ detected BOM encoding in preference to any encoding specified in the
+ prolog. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update to the Eclipse JDT Compiler 4.6.1. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.12_(markt)/Cluster">Cluster</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Make the <code>accessTimeout</code> configurable in
+ <code>BackupManager</code> and <code>ClusterSingleSignOn</code>. The
+ <code>accessTimeout</code> is used as a timeout period for PING in
+ replication map. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60806">60806</a>: To avoid <code>ClassNotFoundException</code>, make
+ sure that the web application class loader is passed to
+ <code>ReplicatedContext</code>. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.12_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60617">60617</a>: Correctly create a <code>CONNECT</code> request when
+ establishing a WebSocket connection via a proxy. Patch provided by
+ Svetlin Zarev. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.12_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add log message that PING message has received beyond the timeout
+ period. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When a PING message that beyond the time-out period has been received,
+ make sure that valid member is added to the map membership. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that <code>NoRpcChannelReply</code> messages are not received on
+ <code>RpcCallback</code>. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.12_(markt)/Web_Applications">Web Applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add Specification and Javadoc references for JASPIC to the Docs
+ application. (csutherl)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.12_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Spelling corrections provided by Josh Soref. (violetagg)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.12 to
+ pick up the latest Windows binaries built with OpenSSL 1.0.2k. (violetagg)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60784">60784</a>: Update all unit tests that test the HTTP status line
+ to check for the required space after the status code. Patch provided by
+ Michael Osipov. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the NSIS Installer used to build the Windows installer to version
+ 3.01. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.11_(markt)"><span style="float: right;">2017-01-16</span> Tomcat 8.5.11 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.11_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60620">60620</a>:
+ Extend the <code>JreMemoryLeakPreventionListener</code> to provide
+ protection against <code>ForkJoinPool.commonPool()</code> related memory
+ leaks. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.11_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure UpgradeProcessor instances associated with closed connections are
+ removed from the map of current connections to Processors. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Remove a workaround for a problem previously reported with WebSocket,
+ TLS and APR that treated some error conditions as not errors. The
+ original problem cannot be reproduced with the current code and the
+ work-around is now causing problems. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.11_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60497">60497</a>: Follow up fix using a better variable name for the
+ tag reuse flag. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Revert use of try/finally for simple tags. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.11_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Prevent potential processing loop on unexpected WebSocket connection
+ closure. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.11_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Enable reset the statistics without restarting the pool. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.11_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Spelling corrections provided by Josh Soref. (violetagg)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.10_(markt)"><span style="float: right;">not released</span> Tomcat 8.5.10 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.10_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=53602">53602</a>: Add HTTP status code 451 (RFC 7725) to the list of
+ HTTP status codes recognised by the ErrorReportValve. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60446">60446</a>: Handle the case where the stored user credential uses
+ a different key length than the length currently configured for the
+ <code>CredentialHandler</code>. Based on a patch by Niklas Holm. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the warnings that reference required options for running on Java
+ 9 to use the latest syntax for those options. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60513">60513</a>: Fix thread safety issue with RMI cleanup code. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.10_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Expand the search process for a server certificate when OpenSSL is used
+ with a JSSE connector and an explicit alias has not been configured.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60450">60450</a>: Improve the selection algorithm for the default trust
+ store type for a TLS Virtual Host. In particular, don't use
+ <code>PKCS12</code> as a default trust store type. Better document how
+ the default trust store type is selected for a TLS virtual host. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60451">60451</a>: Correctly handle HTTP/2 header values that contain
+ characters with unicode code points in the range 128 to 255. Reject
+ with a clear error message HTTP/2 header values that contain characters
+ with unicode code points above 255. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the logic that selects an address to use to unlock the Acceptor
+ to take account of platforms what do not listen on all local addresses
+ when configured with an address of <code>0.0.0.0</code> or
+ <code>::</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a regression in the refactoring to make wider use of
+ <code>ByteBuffer</code> that caused an intermittent failure in the unit
+ tests. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60482">60482</a>: HTTP/2 shouldn't do URL decoding on the query string.
+ (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix an HTTP/2 compression error. Once a new size has been agreed for the
+ dynamic HPACK table, the next header block must begin with a dynamic
+ table update. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60508">60508</a>: Set request start time for HTTP/2. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.10_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Implement a simpler JSP file encoding detector that delegates XML prolog
+ encoding detection to the JRE rather than using a custom XML parser.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60497">60497</a>: Restore previous tag reuse behavior following the use
+ of try/finally. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the error handling for simple tags to ensure that the tag is
+ released and destroyed once used. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.10_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correctly handle blocking WebSocket writes when the write times out just
+ before the write is attempted. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.10_(markt)/Web_Applications">Web Applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ In the documentation web application, be explicit that clustering
+ requires a secure network for all of the cluster network traffic.
+ (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the ASF logos to the new versions.
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60344">60344</a>: Add a note to BUILDING.txt regarding using the source
+ bundle with the correct line endings. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60468">60468</a>: Correct the format of the sample ISO-8601 date used
+ to report the build date for the documentation. Patch provided by
+ Michael Osipov. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.10_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the ASF logos used in the Apache Tomcat installer for Windows to
+ use the new versions.
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.9_(markt)"><span style="float: right;">2016-12-08</span> Tomcat 8.5.9 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.9_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60202">60202</a>: Add an available flag to realms, to indicate the
+ state, or the realm backend. Update lockout realm to only register
+ auth failures if the realm is available. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60340">60340</a>: Readability improvements for CSS used in
+ DefaultServlet and ErrorReportValve. Patch provided by Michael
+ Osipov. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60351">60351</a>: Delay creating <code>META-INF/war-tracker</code> file
+ until after the WAR has been expanded to address the case where the
+ Tomcat process terminates during the expansion. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correctly generate URLs for resources located inside JARs that are
+ themselves located inside a packed WAR file. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correctly handle the <code>configClass</code> attribute of a Host when
+ embedding Tomcat. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60368">60368</a>: Restore egde case for embedded allowing the connector
+ to be removed. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60379">60379</a>: Dispose of the GSS credential once it is no longer
+ required. Patch provided by Michael Osipov. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60380">60380</a>: Ensure that a call to
+ <code>HttpServletRequest#logout()</code> triggers a call to
+ <code>TomcatPrincipal#logout()</code>. Based on a patch by Michael
+ Osipov. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60387">60387</a>: Correct the javadoc for
+ <code>o.a.catalina.AccessLog.setRequestAttributesEnabled</code>.
+ The default value is different for the different implementations.
+ (violetagg)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60393">60393</a>: Use consistent parameter naming in implementations of
+ <code>Realm#authenticate(GSSContext, boolean)</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60395">60395</a>: Log when an <code>Authenticator</code> passes an
+ incomplete <code>GSSContext</code> to a Realm since it indicates a bug
+ in the <code>Authenticator</code>. Patch provided by Michael Osipov.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60400">60400</a>: When expanding the buffer used for reading the
+ request body, ensure the read position will be restored to the
+ original one. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60410">60410</a>: Ensure that multiple calls to
+ <code>JarInputStreamWrapper#close()</code> do not incorrectly trigger
+ the closure of the underlying JAR or WAR file. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60411">60411</a>: Implement support in the <code>RewriteValve</code> for
+ symbolic names to specify the redirect code to use when returning a
+ redirect response to the user agent. Patch provided by Michael Osipov.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60413">60413</a>: In the <code>RewriteValve</code> write empty capture
+ groups as the empty string rather than as <code>"null"</code>
+ when generating the re-written URL. Based on a patch by Michael Osipov.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.9_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60372">60372</a>: Ensure the response headers' buffer limit is reset to
+ the capacity of this buffer when IOException occurs while writing the
+ headers to the socket. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the availability of configured upgrade protocols that
+ require ALPN is correctly reported during Tomcat start. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60386">60386</a>: Implement a more sophisticated pruning algorithm for
+ removing closed streams from the priority tree to ensure that the tree
+ does not grow too large. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60409">60409</a>: When unable to complete sendfile request, ensure the
+ Processor will be added to the cache only once. (markt/violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the endpoint is able to unlock the acceptor thread during
+ shutdown if the endpoint is configured to listen to any local address
+ of a specific type such as <code>0.0.0.0</code> or <code>::</code>.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add a new configuration option, <code>ipv6v6only</code> to the APR
+ connectors that allows them to be configure to only accept IPv6
+ connections when configured with an IPv6 address rather than the
+ default which is to accept IPv4 connections as well if the operating
+ system uses a dual network stack. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the logic that unlocks the acceptor thread so a better choice is
+ made for the address to connect to when a connector is configured for
+ any local port. This reduces the likelihood of the unlock failing.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60436">60436</a>: Avoid a potential NPE when processing async timeouts.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Reduce the window in which an async request that has just started
+ processing on a container thread remains eligible for an async timeout.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.9_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60431">60431</a>: Improve handling of varargs in UEL expressions. Based
+ on a patch by Ben Wolfe. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.9_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix JDK version number documented in BUILDING.txt. (rjung)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a typo in Host Configuration Reference.
+ Issue reported via comments.apache.org. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60412">60412</a>: Add information on the comment syntax for the
+ <code>RewriteValve</code> configuration. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60467">60467</a>: remove problematic characters from XML documentation.
+ Based upon a patch by Michael Osipov. (schultz)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.9_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Reduce the warning logs for a message received from a different domain
+ in order to avoid excessive log outputs. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.9_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60437">60437</a>: Avoid possible handshake overflows in the websocket
+ client. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.9_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58816">58816</a>: Implement the statistics of jdbc-pool. The stats infos
+ are <code>borrowedCount</code>, <code>returnedCount</code>,
+ <code>createdCount</code>, <code>releasedCount</code>,
+ <code>reconnectedCount</code>, <code>releasedIdleCount</code> and
+ <code>removeAbandonedCount</code>. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60194">60194</a>: If <code>validationQuery</code> is not specified,
+ connection validation is done by calling the <code>isValid()</code>
+ method. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60398">60398</a>: Fix testcase of <code>TestSlowQueryReport</code>.
+ (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.9_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Allow customization of service.bat, such as heap memory size, service
+ startup mode and JVM args. Patch provided by isapir via Github.
+ (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60366">60366</a>: Change <code>catalina.bat</code> to use directly
+ <code>LOGGING_MANAGER</code> and <code>LOGGING_CONFIG</code> variables
+ in order to configure logging, instead of modifying
+ <code>JAVA_OPTS</code>. Patch provided by Petter Isberg. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60383">60383</a>: JASPIC API is added as a dependency to the
+ <code>org.apache.tomcat:tomcat-catalina</code> maven artifact.
+ (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Update the comments associated with the TLS Connector examples in
+ <code>server.xml</code>. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ New property is added <code>test.verbose</code> in order to control
+ whether the output of the tests is displayed on the console or not.
+ Patch provided by Emmanuel Bourg. (violetagg)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ <code>TestOpenSSLCipherConfigurationParser.testSpecification</code>
+ - if there are test failures, provide more detailed information. Patch
+ provided by Emmanuel Bourg. (violetagg)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.8_(markt)"><span style="float: right;">2016-11-08</span> Tomcat 8.5.8 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.8_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Check that threadPriority values used in AbstractProtocol are valid.
+ (fschumacher)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.7_(markt)"><span style="float: right;">not released</span> Tomcat 8.5.7 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.7_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When creating a new Connector via JMX, ensure that both HTTP/1.1 and
+ AJP/1.3 connectors can be created. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Include the Context name in the log message when an item cannot be
+ added to the cache. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Exclude JAR files in <code>/WEB-INF/lib</code> from the static resource
+ cache. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When calling <code>getResourceAsStream()</code> on a directory, ensure
+ that <code>null</code> is returned. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60161">60161</a>: Allow creating subcategories of the container logger,
+ and use it for the rewrite valve. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correctly test for control characters when reading the provided shutdown
+ password. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60297">60297</a>: Simplify connector creation in embedded mode. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor creation of containers in embedded mode for more consistency
+ and flexibility. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Introduce new methods <code>read(ByteBuffer)</code>/
+ <code>write(ByteBuffer)</code> in
+ <code>o.a.catalina.connector.CoyoteInputStream</code>/
+ <code>o.a.catalina.connector.CoyoteOutputStream</code>. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When configuring the JMX remote listener, specify the allowed types for
+ the credentials. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.7_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the HPACK header table size configuration that transposed the
+ client and server table sizes when creating the encoder and decoder.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Don't continue to process an HTTP/2 stream if it is reset during header
+ parsing. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ HTTP/2 uses separate headers for each Cookie. As required by RFC 7540,
+ merge these into a single Cookie header before processing continues.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Align the HTTP/2 implementation with the HTTP/1.1 implementation and
+ return a 500 response when an unhandled exception occurs during request
+ processing. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the HTTP header parser so that DEL is not treated as a valid
+ token character. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add checks around the handling of HTTP/2 pseudo headers. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add support for trailer headers to the HTTP/2 implementation. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60232">60232</a>: When processing headers for an HTTP/2 stream, ensure
+ that the read buffer is large enough for the header being processed.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add configuration options to the HTTP/2 implementation to control the
+ maximum number of headers allowed, the maximum size of headers allowed,
+ the maximum number of trailer headers allowed, the maximum size of
+ trailer headers allowed and the maximum number of cookies allowed.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correctly differentiate between sending and receiving a reset frame when
+ tracking the state of an HTTP/2 stream. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60319">60319</a>: When using an Executor, disconnect it from the
+ Connector attributes <code>maxThreads</code>,
+ <code>minSpareThreads</code> and <code>threadPriority</code> to enable
+ the configuration settings to be consistently reported. These Connector
+ attributes will be reported as <code>-1</code> when an Executor is in
+ use. The values used by the executor may be set and obtained via the
+ Executor. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ If an I/O error occurs during async processing on a non-container
+ thread, ensure that the <code>onError()</code> event is triggered.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve detection of I/O errors during async processing on non-container
+ threads and trigger async error handling when they are detected. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add additional checks for valid characters to the HTTP request line
+ parsing so invalid request lines are rejected sooner. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.7_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add HTTP/2 configuration information to the documentation web
+ application. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix default value of <code>validationInterval</code> attribute in
+ jdbc-pool. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a typo in CGI How-To.
+ Issue reported via comments.apache.org. (violetagg)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.7_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When the proxy node sends a backup retrieve message, ensure that using
+ the <code>channelSendOptions</code> that has been set rather than the
+ default <code>channelSendOptions</code>. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.7_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add the JASPIC API jar to the Maven Central publication script. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Remove classes from tomcat-util-scan.jar that are duplicates of those in
+ tomcat-util.jar. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.6_(markt)"><span style="float: right;">2016-10-10</span> Tomcat 8.5.6 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.6_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59961">59961</a>: Add an option to the <code>StandardJarScanner</code>
+ to control whether or not JAR Manifests are scanned for additional
+ class path entries. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60013">60013</a>: Refactor the previous fix to align the behaviour of
+ the Rewrite Valve with mod_rewrite. As part of this, provide an
+ implementation for the <code>B</code> and <code>NE</code> flags and
+ improve the handling for the <code>QSA</code> flag. Includes multiple
+ test cases by Santhana Preethiand a patch by Tiago Oliveira. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60087">60087</a>: Refactor the web resources handling to use the Tomcat
+ specific <code>war:file:...</code> URL protocol to refer to WAR files
+ and their contents rather than the standard <code>jar:file:...</code>
+ form since some components of the JRE, such as JAR verification, give
+ unexpected results when the standard form is used. A side-effect of the
+ refactoring is that when using packed WARs, it is now possible to
+ reference a WAR and/or specific JARs within a WAR in the security policy
+ file used when running under a <code>SecurityManager</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60116">60116</a>: Fix a problem with the rewrite valve that caused back
+ references evaluated in conditions to be forced to lower case when using
+ the <code>NC</code> flag. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure <code>Digester.useContextClassLoader</code> is considered in
+ case the class loader is used. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60117">60117</a>: Ensure that the name of <code>LogLevel</code> is
+ localized when using <code>OneLineFormatter</code>. Patch provided by
+ Tatsuya Bessho. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60138">60138</a>: Fix the <code>SSLHostConfig</code> so that the
+ <code>protocols</code> attribute is limited to the protocols supported
+ by the current JSSE implementation rather than the default protocols
+ used by the implementation. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60146">60146</a>: Improve performance for resource retrieval by making
+ calls to WebResource.getInputStream() trigger caching if the resource is
+ small enough. Patch provided by mohitchugh. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60151">60151</a>: Improve the exception error messages when a
+ <code>ResourceLink</code> fails to specify the type, specifies an
+ unknown type or specifies the wrong type. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60167">60167</a>: Ignore empty lines in <code>/etc/passwd</code> files
+ when using the <code>PasswdUserDatabase</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60170">60170</a>: Exclude the compressed test file
+ <code>index.html.br</code> from RAT analysis. Patch provided by Gavin
+ McDonald. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When starting web resources, ensure that class resources are only
+ started once. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the access checks for linked global resources to handle the case
+ where the current class loader is a child of the web application class
+ loader. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60196">60196</a>: Ensure that the <code>isMandatory</code> flag is
+ correctly set when using JASPIC authentication. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60199">60199</a>: Log a warning if deserialization issues prevent a
+ session attribute from being loaded. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60208">60208</a>: When using RFC6265 compliant cookies, the
+ <code>/</code> character should not be allowed in a cookie name since
+ the RFC6265 will drop such cookies as invalid. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.6_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Refactor the code that implements the requirement that a call to
+ <code>complete()</code> or <code>dispatch()</code> made from a
+ non-container thread before the container initiated thread that called
+ <code>startAsync()</code> completes must be delayed until the container
+ initiated thread has completed. Rather than implementing this by
+ blocking the non-container thread, extend the internal state machine to
+ track this. This removes the possibility that blocking the non-container
+ thread could trigger a deadlock. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fail earlier if the client closes the connection during SNI processing.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60123">60123</a>: Avoid potential threading issues that could cause
+ excessively large vales to be returned for the processing time of
+ a current request. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60174">60174</a>: Log instances of <code>HeadersTooLargeException</code>
+ during request processing. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60173">60173</a>: Allow up to 64kB HTTP/2 header table size limit. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Java 9 compatibility of direct ByteBuffer cleaner. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.6_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60101">60101</a>: Remove preloading of the class that was deleted.
+ (violetagg)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.6_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Expand the documentation for the nested elements within a
+ <code>Resources</code> element to clarify the behaviour of different
+ configuration options with respect to the order in which resources are
+ searched. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add an example of using the <code>classesToInitialize</code> attribute
+ of the <code>JreMemoryLeakPreventionListener</code> to the documentation
+ web application. Based on a patch by Cris Berneburg. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60192">60192</a>: Correct a typo in the status output of the Manager
+ application. Patch provided by Radhakrishna Pemmasani. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.6_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Notify jmx when returning the connection that has been marked suspect.
+ (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the <code>POOL_EMPTY</code> notification has been added to
+ the jmx notification types. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60099">60099</a>: Ensure that use all method arguments as a cache key
+ when using <code>StatementCache</code>. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60139">60139</a>: Correct Javadocs for
+ <code>PoolConfiguration.getValidationInterval</code> and
+ <code>setValidationInterval</code>. Reported by Phillip Webb. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.6_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Update the download location for Objenesis. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60164">60164</a>: Replace <code>log4j-core*.jar</code> with
+ <code>log4j-web*.jar</code> since it is <code>log4j-web*.jar</code> that
+ contains the <code>ServletContainerInitializer</code>. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add documentation to the bin/catalina.bat script to remind users that
+ environment variables don't affect the configuration of Tomcat when
+ run as a Windows Service. Based upon a documentation patch by
+ James H.H. Lampert. (schultz)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.10 to
+ pick up the latest Windows binaries built with OpenSSL 1.0.2j. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.5_(markt)"><span style="float: right;">2016-09-05</span> Tomcat 8.5.5 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.5_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=18500">18500</a>: Add limited support for wildcard host names and host
+ aliases. Names of the form <code>*.domainname</code> are now permitted.
+ Note that an exact host name match takes precedence over a wild card
+ host name match. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59813">59813</a>: Ensure that circular relations of the Class-Path
+ attribute from JAR manifests will be processed correctly. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that reading the <code>singleThreadModel</code> attribute of a
+ <code>StandardWrapper</code> via JMX does not trigger initialisation of
+ the associated servlet. With some frameworks this can trigger an
+ unexpected initialisation thread and if initialisation is not thread-safe
+ the initialisation can then fail. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Compatibility with rewrite from httpd for non existing headers.
+ (jfclere)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ By default, treat paths used to obtain a request dispatcher as encoded.
+ This behaviour can be changed per web application via the
+ <code>dispatchersUseEncodedPaths</code> attribute of the Context.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59839">59839</a>: Apply <code>roleSearchAsUser</code> to all nested searches
+ in JNDIRealm. (fschumacher)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59859">59859</a>: Fix resource leak in WebDAV servlet. Based on patch by
+ Coty Sutherland. (fschumacher)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Provide a mechanism that enables the container to check if a component
+ (typically a web application) has been granted a given permission when
+ running under a SecurityManager without the current execution stack
+ having to have passed through the component. Use this new mechanism to
+ extend SecurityManager protection to the system property replacement
+ feature of the digester. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ When retrieving an object via a <code>ResourceLink</code>, ensure that
+ the object obtained is of the expected type. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59823">59823</a>: Ensure that JASPIC configuration is taken into account
+ when calling <code>HttpServletRequest.authenticate()</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59824">59824</a>: Mark the <code>RewriteValve</code> as supporting async
+ processing by default. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59862">59862</a>: Allow nested jar files scanning to be filtered with
+ the system property
+ <code>tomcat.util.scan.StandardJarScanFilter.jarsToSkip</code>. Patch
+ is provided by Terence Bandoian. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59866">59866</a>: When scanning <code>WEB-INF/classes</code> for
+ annotations, don't scan the contents of
+ <code>WEB-INF/classes/META-INF</code> (if present) since classes will
+ never be loaded from that location. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59888">59888</a>: Correctly handle tabs and spaces in quoted version one
+ cookies when using the <code>Rfc6265CookieProcessor</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59912">59912</a>: Fix an edge case in input stream handling where an
+ <code>IOException</code> could be thrown when reading a POST body.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59913">59913</a>: Correct a regression introduced with the support for
+ the Servlet 4 <code>HttpServletRequest.getMapping()</code> API that
+ caused the attributes for forwarded requests to be lost if requested
+ from within a subsequent include. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59966">59966</a>: Do not start the web application if the error page
+ configuration in web.xml is invalid. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Switch the CGI servlet to the standard logging mechanism and remove
+ support for the debug attribute. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60012">60012</a>: Improvements in the log messages. Based on
+ suggestions by Nemo Chen. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Changes to the <code>allowLinking</code> attribute of a
+ <code>StandardRoot</code> instance now invalidate the cache if caching
+ is enabled. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add a new initialisation parameter, <code>envHttpHeaders</code>, to
+ the CGI Servlet to mitigate <a href="https://httpoxy.org">httpoxy</a>
+ (<a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-5388">CVE-2016-5388</a>) by default and to provide a mechanism that can be
+ used to mitigate any future, similar issues. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ When adding and removing <code>ResourceLink</code>s dynamically, ensure
+ that the global resource is only visible via the
+ <code>ResourceLinkFactory</code> when it is meant to be. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60008">60008</a>: When processing CORs requests, treat any origin with a
+ URI scheme of <code>file</code> as a valid origin. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve handling of exceptions during a Lifecycle events triggered by a
+ state transition. The exception is now caught and the component is now
+ placed into the <code>FAILED</code> state. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60013">60013</a>: Fix encoding issues when using the RewriteValve with
+ UTF-8 query strings or UTF-8 redirect URLs. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60022">60022</a>: Improve handling when a WAR file and/or the associated
+ exploded directory are symlinked into the <code>appBase</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a file descriptor leak when reading the global web.xml. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Consistently decode URL patterns provided via web.xml using the encoding
+ of the web.xml file where specified or UTF-8 where no explicit encoding
+ is specified. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Make timing attacks against the Realm implementations harder. (schultz)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ A number of the JRE memory leaks addressed by the
+ <code>JreMemoryLeakPreventionListener</code> have been fixed in Java 9
+ so the associated protection is now disabled when running on Java 9
+ onwards. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.5_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a regression in refactoring to enable injection of custom
+ keystores that broke the automatic conversion of OpenSSL style PEM
+ key and certificate files for use with JSSE TLS connectors. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59910">59910</a>: Don't hardcode key alias value to "tomcat" for JSSE.
+ When using a keystore, OpenSSL will still default to it. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59904">59904</a>: Add a limit (default 200) for the number of cookies
+ allowed per request. Based on a patch by gehui. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59925">59925</a>: Correct regression in r1628368 and ensure that HTTP
+ separators are handled as configured in the
+ <code>LegacyCookieProcessor</code>. Patch provided by Kyohei Nakamura.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59950">59950</a>: Correct log message when reporting that the current
+ number of HTTP/2 streams for a connection could not be pruned to below
+ the limit. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that <code>Semaphore.release</code> is called in all cases. Even
+ when there is an exception. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60030">60030</a>: Correct a potential infinite loop in the SNI parsing
+ code triggered by failing to handle an end of stream condition. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Small logging optimization in the <code>Rfc6265CookieProcessor</code>.
+ Patch provided by Svetlin Zarev. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ OpenSSL now disables 3DES by default so reflect this when using OpenSSL
+ syntax to select ciphers. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Use the proper ERROR socket status code for async errors with NIO2.
+ (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60035">60035</a>: Fix a potential connection leak if the client drops a
+ TLS connection before the handshake completes. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor the JSSE client certificate validation so that the
+ effectiveness of the <code>certificateVerificationDepth</code>
+ configuration attribute does not depend on the presence of a certificate
+ revocation list. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Log a warning at start up if a JSSE TLS connector is configured with
+ a trusted certificate that is either not yet valid or has expired.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.5_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When writing out a full web.xml file with JspC ensure that the encoding
+ used in the XML prolog matches the encoding used to write the contents
+ of the file. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve the error handling for custom tags to ensure that the tag is
+ returned to the pool or released and destroyed once used. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60032">60032</a>: Fix handling of method calls that use varargs within
+ EL value expressions. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ignore <code>engineOptionsClass</code> and <code>scratchdir</code> when
+ running under a security manager. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fixed StringIndexOutOfBoundsException. Based on a patch provided by
+ wuwen via Github. (violetagg)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.5_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59908">59908</a>: Ensure that a reason phrase is included in the close
+ message if a session is closed due to a timeout. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.5_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59867">59867</a>: Correct the documentation provided by Manager's
+ 403.jsp. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59868">59868</a>: Clarify the documentation for the Manager web
+ application to make clearer that the host name and IP address in the
+ server section are the primary host name and IP address. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59940">59940</a>: Correct the name of the
+ <code>truststorePassword</code> attribute of the
+ <code>SSLHostConfig</code> element in the configuration documentation.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ MBeans Descriptors How-To is moved to
+ <code>mbeans-descriptors-howto.html</code>. Patch provided by Radoslav
+ Husar. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Update NIO Connector configuration documentation with an information
+ about <code>socket.directSslBuffer</code>. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60034">60034</a>: Correct a typo in the Manager How-To page of the
+ documentation web application. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.5_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ In order to avoid the unintended skip of <code>PoolCleaner</code>,
+ remove the check code of the execution interval in the task that has
+ been scheduled. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59850">59850</a>: Ensure that the <code>ResultSet</code> is closed when
+ enabling the <code>StatementCache</code> interceptor. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59923">59923</a>: Reduce the default value of
+ <code>validationInterval</code> in order to avoid the potential issue
+ that continues to return an invalid connection after database restart.
+ (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the <code>ResultSet</code> is returned as Proxy object when
+ enabling the <code>StatementDecoratorInterceptor</code>. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60043">60043</a>: Ensure that the <code>suspectTimeout</code> works
+ without removing connection when the <code>removeAbandoned</code> is
+ disabled. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add log message of when returning the connection that has been marked
+ suspect. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct Javadoc for <code>ConnectionPool.suspect()</code>. Based on a
+ patch by Yahya Cahyadi. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.5_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59871">59871</a>: Add a property (<code>timeFormat</code>) to
+ JULI's <code>OneLineFormatter</code> to enable the format of the
+ time stamp used in log messages to be configured. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59899">59899</a>: Update Tomcat's copy of the Java Persistence
+ annotations to include the changes made in 2.1 / JavaEE 7. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fixed typos in mbeans-descriptors.xml files. (violetagg)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons BCEL to r1757132 to align with the
+ BCEL 6 release. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons DBCP 2 to r1757164 to pick up a
+ couple of bug fixes. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons Codec to r1757174. Code formatting
+ changes only. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons FileUpload to afdedc9. This pulls in
+ a fix to improve the performance with large multipart boundaries.
+ (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.4_(markt)"><span style="float: right;">2016-07-12</span> Tomcat 8.5.4 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.4_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=57705">57705</a>: Add debug logging for requests denied by the remote
+ host and remote address valves and filters. Based on a patch by Graham
+ Leggett. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a regression in the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58588">58588</a> that removed the
+ entire <code>org.apache.juli</code> package from the embedded JARs
+ rendering them unusable. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59399">59399</a>: Add a new option to the Realm implementations that
+ ship with Tomcat that allows the HTTP status code used for HTTP -> HTTPS
+ redirects to be controlled per Realm. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Change the default of the
+ <code>sessionCookiePathUsesTrailingSlash</code> attribute of the
+ <code>Context</code> element to <code>false</code> since the problems
+ caused when a Servlet is mapped to <code>/*</code> are more significant
+ than the security risk of not enabling this option by default. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Follow-up to <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59655">59655</a>. Improve the documentation for configuring
+ permitted cookie names. Patch provided by Kyohei Nakamura. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Do not attempt to start web resources during a web application's
+ initialisation phase since the web application is not fully configured
+ at that point and the web resources may not be correctly configured.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59708">59708</a>: Modify the LockOutRealm logic. Valid authentication
+ attempts during the lock out period will no longer reset the lock out
+ timer to zero. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve error handling around user code prior to calling
+ <code>InstanceManager.destroy()</code> to ensure that the method is
+ executed. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.4_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor the certificate keystore and trust store generation to make it
+ easier for embedded users to inject their own key stores. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59233">59233</a>: Add the ability to add TLS virtual hosts dynamically.
+ (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Add a <code>maxConcurrentStreamExecution</code> on the HTTP/2
+ protocol handler to allow restricting the amount of concurrent stream
+ that are being executed in a single connection. The default is to
+ not limit it. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a problem with <code>ServletRequest.getServerPort()</code> for
+ secure HTTP/2 connections that meant an incorrect value was returned when
+ using the default port. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve error handling around user code prior to calling
+ <code>InstanceManager.destroy()</code> to ensure that the method is
+ executed. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Document the default for the HTTP/2 configuration parameter
+ <code>maxConcurrentStreamExecution</code> as 20. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.4_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve error handling around user code prior to calling
+ <code>InstanceManager.destroy()</code> to ensure that the method is
+ executed. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.4_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Now the WebSocket implementation is not built directly on top of the
+ Servlet API and can use Tomcat internals, there is no need for the
+ dedicated WebSocket Executor. It has been replaced by the use of the
+ Connector/Endpoint provided Executor. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve error handling around user code prior to calling
+ <code>InstanceManager.destroy()</code> to ensure that the method is
+ executed. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.4_(markt)/Web_Applications">Web Applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Do not log an additional case of <code>IOException</code>s in the
+ error handler for the Drawboard WebSocket example when the root cause is
+ the client disconnecting since the logs add no value. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59642">59642</a>: Mention the <code>localDataSource</code> in the
+ <code>DataSourceRealm</code> section of the Realm How-To. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59672">59672</a>: Update the security considerations page of the
+ documentation web application to take account of the fact that the
+ Manager and HostManager applications now have a
+ <code>RemoteAddrValve</code> configured by default. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Follow-up to the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59399">59399</a>. Ensure that the new attribute
+ <code>transportGuaranteeRedirectStatus</code> is documented for all
+ <strong>Realm</strong>s. Also document the <code>NullRealm</code> and
+ when it is automatically created for an <strong>Engine</strong>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix the description of <code>maxAge</code> attribute in jdbc-pool doc.
+ This attribute works both when a connection is returned and when a
+ connection is borrowed. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59774">59774</a>: Correct the <code>prefix</code> values in the
+ documented examples for configuring the <code>AccessLogValve</code>.
+ Patch provided by Mike Noordermeer. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Extras">Extras</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58588">58588</a>: Remove the JULI extras package from the distribution.
+ It was only useful for switching Tomcat's internal logging to log4j
+ 1.2.x and that version of log4j is no longer supported. No additional
+ Tomcat code is required if switching Tomcat's internal logging to log
+ via log4j 2.x. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.4_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add log message when the ping has timed-out. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ If the ping message has been received at the
+ <code>AbstractReplicatedMap#leftOver</code> method, ensure that notify
+ the member is alive than ignore it. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.4_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix the duplicated connection release when connection verification
+ failed. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that do not remove the abandoned connection that has been already
+ released. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.4_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59276">59276</a>: Update optional Checkstyle library to 6.17. (kkolinko)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Use the mirror network rather than the ASF master site to download the
+ current ASF dependencies. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.8 to
+ pick up the latest fixes and make 1.2.8 the minimum recommended version.
+ (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Use UTF-8 with a standard prolog for all XML files. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.3_(markt)"><span style="float: right;">2016-06-13</span> Tomcat 8.5.3 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.3_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ RMI Target related memory leaks are avoidable which makes them an
+ application bug that needs to be fixed rather than a JRE bug to work
+ around. Therefore, start logging RMI Target related memory leaks on web
+ application stop. Add an option that controls if the check for these
+ leaks is made. Log a warning if running on Java 9 with this check
+ enabled but without the command line option it requires. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure NPE will not be thrown during deployment when scanning jar files
+ without MANIFEST.MF file. (violetagg)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Remove the <code>clearReferencesStatic</code> option from
+ <code>StandardContext</code>. It was known to cause problems with some
+ libraries (such as log4j) and was only linked to suspected memory leaks
+ rather than known memory leaks. It had been disabled by default with no
+ increase in the reports of memory leaks for some time. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59604">59604</a>: Correct the assumption made in the URL decoding that
+ the default platform encoding is always compatible with ISO-8859-1. This
+ assumption is not always valid, e.g. on z/OS. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59608">59608</a>: Skip over any invalid <code>Class-Path</code> attribute
+ from JAR manifests. Log errors at debug level due to many bad libraries.
+ (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix error message when failed to register MBean. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59655">59655</a>: Configure the cookie name validation to use RFC6265 rules by default to
+ align it with the default cookie parser. Document the impact system properties have on
+ cookie name validation. (mark)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.3_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that requests with HTTP method names that are not tokens (as
+ required by RFC 7231) are rejected with a 400 response. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When an asynchronous request is processed by the AJP connector, ensure
+ that request processing has fully completed before starting the next
+ request. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve handling of HTTP/2 stream resets. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58750">58750</a>: The HTTP Server header is no longer set by default. A
+ Server header may be configured by setting the <code>server</code>
+ attribute on the <code>Connector</code>. A new <code>Connector</code>
+ attribute, <code>serverRemoveAppProvidedValues</code> may be used to
+ remove any Server header set by a web application. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59564">59564</a>: Correct offset when reading into HTTP/2 input buffer
+ that could cause problems reading request bodies. (violetagg/markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Modify the handling of read/write timeouts so that the appropriate error
+ handling (<code>ReadListener.onError()</code>,
+ <code>WriteListener.onError()</code> or
+ <code>AsyncListener.onError()</code>) is called. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ If an async dispatch results in the completion of request processing,
+ ensure that any remaining request body is swallowed before starting the
+ processing of the next request else the remaining body may be read as the
+ start of the next request leading to a 400 response. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a cause of multiple attempts to close the same socket. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.3_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59567">59567</a>: Fix NPE scanning webapps for TLDs when an exploded
+ JAR has an empty WEB-INF/classes/META-INF folder. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a memory leak in the expression language implementation that caused
+ the class loader of the first web application to use expressions to be
+ pinned in memory. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59654">59654</a>: Improve error message when attempting to use a TLD
+ file from an invalid location. Patch provided by Huxing Zhang. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.3_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59659">59659</a>: Fix possible memory leak in WebSocket handling of
+ unexpected client disconnects. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.3_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58891">58891</a>: Update the SSL how-to. Based on a suggestion by
+ Alexander Kjäll. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.3_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a memory leak with the pool cleaner thread that retained a reference
+ to the web application class loader for the first web application to use
+ a connection pool. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.3_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons DBCP 2 to r1743696 (2.1.1 plus
+ additional fixes). (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons Pool 2 to r1743697 (2.4.2 plus
+ additional fixes). (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons File Upload to r1743698 (1.3.1 plus
+ additional fixes). (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58626">58626</a>: Add support for a new environment variable
+ (<code>USE_NOHUP</code>) that causes <code>nohup</code> to be used when
+ starting Tomcat. It is disabled by default except on HP-UX where it is
+ enabled by default since it is required when starting Tomcat at boot on
+ HP-UX. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.2_(markt)"><span style="float: right;">2016-05-16</span> Tomcat 8.5.2 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.2_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that annotated web components packed in web fragments will be
+ processed when <code>unpackWARs</code> is enabled. (violetagg)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.1_(markt)"><span style="float: right;">not released</span> Tomcat 8.5.1 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.1_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59206">59206</a>: Ensure NPE will not be thrown by
+ <code>o.a.tomcat.util.file.ConfigFileLoader</code> when
+ <code>catalina.base</code> is not specified. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59217">59217</a>: Remove duplication in the recycling of the path in
+ <code>o.a.tomcat.util.http.ServerCookie</code>. Patch is provided by
+ Kyohei Nakamura. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fixed possible NPE in
+ <code>o.a.catalina.loader.WebappClassLoaderBase.getResourceAsStream</code>
+ (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59213">59213</a>: Async dispatches should be based off a wrapped request.
+ (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that <code>javax.servlet.ServletRequest</code> and
+ <code>javax.servlet.ServletResponse</code> provided during
+ <code>javax.servlet.AsyncListener</code> registration are made
+ available via <code>javax.servlet.AsyncEvent.getSuppliedRequest</code>
+ and <code>javax.servlet.AsyncEvent.getSuppliedResponse</code>
+ (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59219">59219</a>: Ensure <code>AsyncListener.onError()</code> is called
+ if an <code>Exception</code> is thrown during async processing. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59220">59220</a>: Ensure that <code>AsyncListener.onComplete()</code> is
+ called if the async request times out and the response is already
+ committed. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59226">59226</a>: Process the <code>Class-Path</code> attribute from
+ JAR manifests for JARs on the class path excluding JARs packaged in
+ <code>WEB-INF/lib</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59255">59255</a>: Fix possible NPE in mapper. (kkolinko/remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59256">59256</a>: <code>slf4j-taglib*.jar</code> should not be excluded
+ from the standard JAR scanning by default. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Clarify in the log message that specifying both urlPatterns and value
+ attributes in WebServlet and WebFilter annotations is not allowed.
+ (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure the exceptions caused by Valves will be available in the log
+ files so that they can be evaluated when
+ <code>o.a.catalina.valves.ErrorReportValve.showReport</code> is
+ disabled. Patch is provided by Svetlin Zarev. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Remove unused <code>distributable</code> attribute that is defined as
+ <code>TransientAttribute</code> of <code>Manager</code> in StoreConfig.
+ (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix handling of Cluster Receiver in StoreConfig. The <code>bind</code>
+ and <code>host</code> attributes define as
+ <code>TransientAttribute</code>. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59261">59261</a>: <code>ServletRequest.getAsyncContext()</code> now
+ throws an <code>IllegalStateException</code> as required by the Servlet
+ specification if the request is not in asynchronous mode when called.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59269">59269</a>: Correct the implementation of
+ <code>PersistentManagerBase</code> so that <code>minIdleSwap</code>
+ functions as designed and sessions are swapped out to keep the active
+ session count below <code>maxActiveSessions</code>. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add the <code>org.apache.catalina.servlet4preview</code> package that
+ can be used to gain early access to Servlet 4.0 features. Note that this
+ package will <strong>not</strong> be present in Tomcat 9. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correctly configure the base path for a resources directory provided by
+ an expanded JAR file. Patch provided by hengyunabc. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ When multiple compressed formats are available and the client does not
+ express a preference, use the server order to determine the preferred
+ format. Based on a patch by gmokki. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59284">59284</a>: Allow the Tomcat provided JASPIC
+ <code>SimpleServerAuthConfig</code> to pick up module configuration
+ properties from either the property set passed to its constructor or
+ from the properties passed in the call to <code>getAuthContext</code>.
+ Based on a patch by Thomas Maslen. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59310">59310</a>: Do not add a <code>Content-Length: 0</code> header for
+ custom responses to <code>HEAD</code> requests that do not set a
+ <code>Content-Length</code> value. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When normalizing paths, improve the handling when paths end with
+ <code>/.</code> or <code>/..</code> and ensure that input and output are
+ consistent with respect to whether or not they end with <code>/</code>.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59317">59317</a>: Ensure that
+ <code>HttpServletRequest.getRequestURI()</code> returns an encoded URI
+ rather than a decoded URI after a dispatch. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Use the correct URL for the fragment when reporting errors processing
+ a <code>web-fragment.xml</code> file from a JAR located in an unpacked
+ WAR. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that <code>JarScanner</code> only uses the explicit call-back to
+ process <code>WEB-INF/classes</code> and only when configured to treat
+ the contents of <code>WEB-INF/classes</code> as a possible exploded JAR.
+ (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Remove the <code>java2DDisposerProtection</code> option from the
+ <code>JreMemoryLeakPreventionListener</code>. The leak is fixed in Java
+ 7 onwards and Tomcat 8 requires Java 7 so the option is unnecessary.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the value for the header <code>X-Frame-Options</code> is
+ constructed correctly according to the specification when
+ <code>ALLOW-FROM</code> option is used. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix an <code>IllegalArgumentException</code> if the first use of an
+ internal <code>Response</code> object requires JASPIC authentication.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Do not trigger unnecessary session ID changes when using JASPIC and the
+ user is authenticated using cached credentials. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59437">59437</a>: Ensure that the JASPIC <code>CallbackHandler</code> is
+ thread-safe. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59449">59449</a>: In <code>ContainerBase</code>, ensure that the process
+ to remove a child container is the reverse of the process to add one.
+ Patch provided by Huxing Zhang. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.1_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Align cipher configuration parsing with current OpenSSL master. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Change the default for <code>honorCipherOrder</code> to
+ <code>false</code>. With the current default TLS configuration, it is no
+ longer necessary for this to be <code>true</code> for a reasonably
+ secure configuration. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add a new environment variable <code>JSSE_OPTS</code> that is intended
+ to be used to pass JVM wide configuration to the JSSE implementation.
+ The default value is <code>-Djdk.tls.ephemeralDHKeySize=2048</code>
+ which protects against weak Diffie-Hellman keys. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When running on Java 7, exclude DHE ciphers from the default cipher list
+ for JSSE connectors since they use weak 768 bit DH keys and cannot be
+ configured to use more secure keys. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58970">58970</a>: Fix a connection counting bug in the NIO connector
+ that meant some dropped connections were not removed from the current
+ connection count. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59289">59289</a>: Do not recycle upgrade processors in unexpected close
+ situations. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59295">59295</a>: Use <code>Locale.toLanguageTag()</code> to construct
+ the <code>Content-Language</code> HTTP header to ensure the locale is
+ correctly represented. Patch provided by zikfat. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59344">59344</a>: Add support for using pem encoded certificates with
+ JSSE SSL. Submitted by Emmanuel Bourg with additional tweaks. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Make the TLS certificate chain available to clients when using
+ JSSE+OpenSSL with the certificate chain stored in a Java KeyStore.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Work around <a href="https://github.com/openssl/openssl/issues/188">a
+ known issue in OpenSSL</a> that does not permit the TLS handshake to be
+ failed if the ALPN negotiation fails. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59421">59421</a>: Add direct HTTP/2 connection support. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correctly handle a call to <code>AsyncContext.complete()</code> from a
+ non-container thread when non-blocking I/O is being used. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59451">59451</a>: Correct Javadoc for <code>MessageBytes</code>. Patch
+ provided by Kyohei Nakamura. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59450">59450</a>: Correctly handle the case where the
+ <code>LegacyCookieProcessor</code> is configured with
+ <code>allowHttpSepsInV0</code> set to <code>false</code> and
+ <code>forwardSlashIsSeparator</code> set to <code>true</code>. Patch
+ provided by Kyohei Nakamura. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.1_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When scanning JARs for TLDs, correctly handle the (rare) case where a
+ JAR has been exploded into <code>WEB-INF/classes</code> and the web
+ application is deployed as a packed WAR. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59640">59640</a>: NPEs with not found TLDs. (remm)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.1_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59189">59189</a>: Explicitly release the native memory held by the
+ <code>Inflater</code> and <code>Deflater</code> when using
+ PerMessageDeflate and the WebSocket session ends. Based on a patch by
+ Henrik Olsson. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Return back a container specific extension to the WsServerContainer
+ to allow frameworks to more easily dispatch requests to WebSocket
+ endpoints. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a regression caused by the connector refactoring and ensure that the
+ thread context class loader is set to the web application
+ classloader when processing WebSocket messages on the server. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that a client disconnection triggers the error handling for the
+ associated WebSocket end point. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Make WebSocket client more robust when handling errors during the close
+ of a WebSocket session. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.1_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59210">59210</a>: Server push example has to use
+ <code>o.a.catalina.connector.RequestFacade</code> when obtaining
+ <code>o.a.catalina.core.ApplicationPushBuilder</code>. Patch is
+ provided by Huxing Zhang. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59218">59218</a>: Correct the path to <code>jaspic-providers.xml</code>
+ in Jaspic How-To. Patch is provided by Tatsuya Bessho. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Remove button that has accidentally been added to the host manager.
+ Submitted by Coty Sutherland. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Update in the documentation the link to the maven repository where
+ Tomcat snapshot artifacts are deployed. (markt/violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Clarify in the documentation that calls to
+ <code>ServletContext.log(String, Throwable)</code> or
+ <code>GenericServlet.log(String, Throwable)</code> are logged at the
+ SEVERE level. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a typo in SSL/TLS Configuration How-To.
+ Issue reported via comments.apache.org. (violetagg)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.1_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Avoid NPE when a proxy node failed to retrieve a backup entry. (kfujino)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add log of when received an unexpected messages. (kfujino)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add the flag indicating that member is a localMember. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix potential NPE that depends on the setting order of attributes of
+ static member when using the static cluster. (kfujino)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add get/set method for the channel that is related to
+ <code>ChannelInterceptor</code>. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ As with the multicast cluster environment, in the static cluster
+ environment, the local member inherits properties from the cluster
+ receiver. (kfujino)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add get/set method for the channel that is related to each Channel
+ services. (kfujino)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add name to channel in order to identify channels. In tomcat cluster
+ environment, it is set the cluster name + "-Channel" as default value.
+ (kfujino)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add the channel name to the thread which is invoked by channel services
+ in order to identify the associated channel. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that clear the channel instance from channel services when
+ stopping channel. (kfujino)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Implement map state in the replication map. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the ping is not executed during the start/stop of the
+ replication map. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ In ping processing in the replication map, send not the
+ <code>INIT</code> message but the newly introduced <code>PING</code>
+ message. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.1_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59209">59209</a>: Remove <code>honorCipherOrder=false</code> attribute
+ from the connector example in server.xml. When the block is uncommented
+ the connector will use the default value for this attribute which is
+ <code>false</code>. If one needs to enable it, one can add it
+ explicitly to the connector definition. Use of this feature requires
+ Java 8 or later. Patch is provided by Huxing Zhang. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59211">59211</a>: Add hamcrest to Eclipse classpath. Patch is provided
+ by Huxing Zhang. (violetagg)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59280">59280</a>: Update the NSIS Installer used to build the
+ Windows Installers to version 2.51. (kkolinko)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.7 to
+ pick up the Windows binaries that are based on OpenSSL 1.0.2h and APR
+ 1.5.2. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="Tomcat_8.5.0_(markt)"><span style="float: right;">2016-03-24</span> Tomcat 8.5.0 (markt)</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_8.5.0_(markt)/General">General</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Remove support for Comet. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Tighten up the default file permissions for the <code>.tar.gz</code>
+ distribution so no files or directories are world readable by default.
+ Configure Tomcat to run with a default umask of <code>0027</code> which
+ may be overridden by setting <code>UMASK</code> in
+ <code>setenv.sh</code>. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Remove native code (Windows Service Wrapper, APR/native connector)
+ support for Windows Itanium. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.0_(markt)/Catalina">Catalina</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ The default HTTP cookie parser has been changed to
+ <code>org.apache.tomcat.util.http.Rfc6265CookieProcessor</code>. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor creation of <code>MapperListener</code> to ensure that the
+ <code>Mapper</code> used is the <code>Mapper</code> associated with the
+ <code>Service</code> for which the listener was created. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Move the functionality that provides redirects for context roots and
+ directories where a trailing <code>/</code> is added from the Mapper to
+ the <code>DefaultServlet</code>. This enables such requests to be
+ processed by any configured Valves and Filters before the redirect is
+ made. This behaviour is configurable via the
+ <code>mapperContextRootRedirectEnabled</code> and
+ <code>mapperDirectoryRedirectEnabled</code> attributes of the Context
+ which may be used to restore the previous behaviour. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor <code>Service.getContainer()</code> to return an
+ <code>Engine</code> rather than a <code>Container</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=34319">34319</a>: Only load those keys in
+ <code>StoreBase.processExpire</code> from JDBCStore that are old enough
+ to be expired. Based on a patch by Tom Anderson. (fschumacher)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58351">58351</a>: Make the server build date and server version number
+ accessible via JMX. Patch provided by Huxing Zhang. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=56917">56917</a>: As per RFC7231 (HTTP/1.1), allow HTTP/1.1 and later
+ redirects to use relative URIs. This is controlled by a new attribute
+ <code>useRelativeRedirects</code> on the <strong>Context</strong> and
+ defaults to <code>true</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58629">58629</a>: Allow an embedded Tomcat instance to start when the
+ <code>Service</code> has no <code>Engine</code> configured. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correctly notify the MapperListener associated with a Service if the
+ Engine for that Service is changed. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Make a web application's CredentialHandler available through a context
+ attribute. This allows a web application to use the same algorithm
+ for validating or generating new stored credentials from cleartext
+ ones. (schultz)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58635">58635</a>: Enable break points to be set within agent code when
+ running Tomcat with a Java agent. Based on a patch by Huxing Zhang.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fixed potential NPE in <code>HostConfig</code> while deploying an
+ application. Issue reported by coverity scan. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58655">58655</a>: Fix an <code> IllegalStateException</code> when
+ calling <code>HttpServletResponse.sendRedirect()</code> with the
+ <code>RemoteIpFilter</code>. This was caused by trying to correctly
+ generate the absolute URI for the redirect. With the fix for
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=56917">56917</a>, redirects may now be relative making the
+ <code>sendRedirect()</code> implementation for the
+ <code>RemoteIpFilter</code> much simpler. This also addresses issues
+ where the redirect may not have behaved as expected when redirecting
+ from http to https to from https to http. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58657">58657</a>: Exceptions in a Servlet 3.1 <code>ReadListener</code>
+ or <code>WriteListener</code> do not need to be immediately fatal to the
+ connection. Allow an error response to be written. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct implementation of
+ <code>validateClientProvidedNewSessionId</code> so client provided
+ session IDs may be rejected if validation is enabled. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58701">58701</a>: Reset the <code>instanceInitialized</code> field in
+ <code>StandardWrapper</code> when unloading a Servlet so that a new
+ instance may be correctly initialized. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Add a new flag <code>aprPreferred</code> to the Apr listener. if set to
+ <code>false</code>, when using the connector defaults, it will use
+ NIO + OpenSSL if tomcat-native is available, rather than the APR
+ connector. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add path parameter handling to
+ <code>HttpServletRequest.getContextPath()</code>. This is a follow-up to
+ the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=57215">57215</a>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58692">58692</a>: Make <code>StandardJarScanner</code> more robust. Log
+ a warning if a class path entry cannot be scanned rather than triggering
+ the failure of the web application. Includes a test case written by
+ Derek Abdine. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58702">58702</a>: Ensure an access log entry is generated if the client
+ aborts the connection. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fixed various issues reported by Findbugs. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58735">58735</a>: Add support for the <code>X-XSS-Protection</code>
+ header to the <code>HttpHeaderSecurityFilter</code>. Patch provided by
+ Jacopo Cappellato. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add the <code>StatusManagerServlet</code> to the list of Servlets that
+ can only be loaded by privileged applications. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Simplify code and fix messages in
+ <code>org.apache.catalina.core.DefaultInstanceManager</code> class.
+ (kkolinko)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58751">58751</a>: Correctly handle the case where an
+ <code>AsyncListener</code> dispatches to a Servlet on an asynchronous
+ timeout and the Servlet uses <code>sendError()</code> to trigger an
+ error page. Includes a test case based on code provided by Andy
+ Wilkinson.(markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the proper file encoding, if specified, will be used when
+ a readme file is served by DefaultServlet. (violetagg)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix declaration of <code>localPort</code> attribute of Connector MBean:
+ it is read-only. (kkolinko)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58766">58766</a>: Make skipping non-class files during annotation
+ scanning faster by checking the file name first. Improve debug logging.
+ (kkolinko)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58768">58768</a>: Log a warning if a redirect fails because of an
+ invalid location. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58827">58827</a>: Remove remains of JSR-77 implementation. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58836">58836</a>: Correctly merge query string parameters when
+ processing a forwarded request where the target includes a query string
+ that contains a parameter with no value. (markt/kkolinko)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Make sure that shared Digester is reset in an unlikely error case
+ in <code>HostConfig.deployWAR()</code>. (kkolinko)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Extend the feature available in the cluster session manager
+ implementations that enables session attribute replication to be
+ filtered based on attribute name to all session manager implementations.
+ Note that configuration attribute name has changed from
+ <code>sessionAttributeFilter</code> to
+ <code>sessionAttributeNameFilter</code>. Apply the filter on load as
+ well as unload to ensure that configuration changes made while the web
+ application is stopped are applied to any persisted data. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Extend the session attribute filtering options to include filtering
+ based on the implementation class of the value and optional
+ <code>WARN</code> level logging if an attribute is filtered. These
+ options are available for all of the Manager implementations that ship
+ with Tomcat. When a <code>SecurityManager</code> is used filtering will
+ be enabled by default. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Remove <code>distributable</code> and <code>maxInactiveInterval</code>
+ from the <code>Manager</code> interface because the attributes are never
+ used. The equivalent attributes from the <code>Context</code> always
+ take precedence. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58867">58867</a>: Improve checking on Host start for WAR files that have
+ been modified while Tomcat has stopped and re-expand them if
+ <code>unpackWARs</code> is <code>true</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58900">58900</a>: Correctly undeploy symlinked resources and prevent an
+ infinite cycle of deploy / undeploy. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Protect initialization of <code>ResourceLinkFactory</code> when
+ running with a SecurityManager. (kkolinko)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a thread safety issue in the filtering of session attributes
+ based on the implementing class name of the value object. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix class loader decision on the delegation for class loading and
+ resource lookup and make it faster too. (rjung)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58905">58905</a>: Ensure that <code>Tomcat.silence()</code> silences the
+ correct logger and respects the current setting. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58946">58946</a>: Ensure that the request parameter map remains
+ immutable when processing via a RequestDispatcher. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that <code>/WEB-INF/classes</code> is never processed as a web
+ fragment. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Switch default connector when native is installed. Unless configured
+ otherwise, the NIO endpoint will be used by default. If SSL is
+ configured, OpenSSL will be used rather than JSSE. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct a regression in the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58867">58867</a>. When configuring a
+ Context to use an external directory for the <code>docBase</code>, and
+ that directory happens to be located along side the original WAR, use
+ the directory as the <code>docBase</code> rather than expanding the
+ WAR into the <code>appBase</code> and using the newly created expanded
+ directory as the <code>docBase</code>. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58988">58988</a>: Special characters in the substitutions for the
+ RewriteValve can now be quoted with a backslash. (fschumacher)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58999">58999</a>: Fix class and resource name filtering in
+ WebappClassLoader. It throws a StringIndexOutOfBoundsException if the
+ name is exactly "org" or "javax". (rjung)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add JASPIC (JSR-196) support. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Make checking for var and map replacement in RewriteValve a bit stricter
+ and correct detection of colon in var replacement. (fschumacher)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor the web application class loader to reduce the impact of JAR
+ scanning on the memory footprint of the web application. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix some resource leaks in the error handling for accessing files from
+ JARs and WARs. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor the JAR and JAR-in-WAR resource handling to reduce the memory
+ footprint of the web application. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor the web.xml parsing so a new parser is created every time the
+ web application starts rather than creating and caching the parser when
+ the Context is created. This enables the parser to take account of
+ modified Context configuration parameters and reduces (slightly) the
+ memory footprint of a running Tomcat instance. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Switch the web application class loader to the
+ <code>ParallelWebappClassLoader</code> by default. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=57809">57809</a>: Remove the custom context attribute that held the
+ effective web.xml. Components needing access to configuration
+ information may access it via the Servlet API. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Refactor JAR scanning to reduce memory footprint. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59001">59001</a>: Correctly handle the case when Tomcat is installed on
+ a path where one of the segments ends in an exclamation mark. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Expand the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59001">59001</a> to cover the special sequences used
+ in Tomcat's custom jar:war: URLs. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59043">59043</a>: Avoid warning while expiring sessions associated with
+ a single sign on if <code>HttpServletRequest.logout()</code> is used.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59054">59054</a>: Ensure that using the
+ <code>CrawlerSessionManagerValve</code> in a distributed environment
+ does not trigger an error when the Valve registers itself in the
+ session. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add socket properties support to storeconfig. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix incorrect parsing of the NE and NC flags in rewrite rules. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59065">59065</a>: Correct the timing of the check for colons in paths
+ on non-Windows systems implemented in <code>catalina.sh</code> so it
+ works correctly with Cygwin. Patch provided by Ed Randall. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When a Host is configured with an appBase that does not exist, create
+ the appBase before trying to expand an external WAR file into it.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59115">59115</a>: When using the Servlet 3.0 file upload, the submitted
+ file name may be provided as a token or a quoted-string. If a
+ quoted-string, unquote the string before returning it to the user.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59123">59123</a>: Close <code>NamingEnumeration</code> objects used by
+ the <code>JNDIRealm</code> once they are no longer required.
+ (fschumacher/markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Implement the proposed Servlet 4.0 API to provide mapping type
+ information for the current request. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59138">59138</a>: Correct a false positive warning for ThreadLocal
+ related memory leaks when the key class but not the value class has been
+ loaded by the web application class loader. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59017">59017</a>: Make the pre-compressed file support in the Default
+ Servlet generic so any compression may be used rather than just gzip.
+ Patch provided by Mikko Tiihonen. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59145">59145</a>: Don't log an invalid warning when a user logs out of
+ a session associated with SSO. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59150">59150</a>: Add an additional flag on APR listener to allow
+ disabling automatic use of OpenSSL. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59151">59151</a>: Fix a regression in the fix for <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=56917">56917</a> that
+ added additional (and arguably unnecessary) validation to the provided
+ redirect location. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59154">59154</a>: Fix a <code>NullPointerException</code> in the
+ <code>JAASMemoryLoginModule</code> resulting from the introduction of
+ the <code>CredentialHandler</code> to <code>Realm</code>s.
+ (schultz/markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.0_(markt)/Coyote">Coyote</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Remove support for the HTTP BIO and AJP BIO connectors. (markt)
+ </li>
+ <li><img alt="Code: " class="icon" src="./images/code.gif">
+ Refactor HTTP upgrade and AJP implementations to reduce duplication.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add support for HPACK header encoding and decoding, contributed
+ by Stuart Douglas. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=57108">57108</a>: Add support for Server Name Indication (SNI). There
+ has been significant changes to the SSL configuration in server.xml to
+ support this. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add SSL engine for JSSE backed by OpenSSL. Includes ALPN support.
+ Based on code contributed by Numa de Montmollin and derived from code
+ developed by Twitter and Netty. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ RFC 7230 states that clients should ignore reason phrases in HTTP/1.1
+ response messages. Since the reason phrase is optional, Tomcat no longer
+ sends it. As a result the system property
+ <code>org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER</code> is no
+ longer used and has been removed. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ The minimum required Tomcat Native version has been increased to 1.2.2.
+ The 1.2.x branch includes ALPN and SNI support which are required for
+ HTTP/2. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Add support for HTTP/2 including server push. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58621">58621</a>: The certificate chain cannot be set using the main
+ certificate attribute, so restore the certificate chain property. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Allow a new SSL config type where a connector can use either JSSE or
+ OpenSSL. Both could be allowed, but it would likely create support
+ issues. This type is used by the OpenSSL implementation for NIOx. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Improve upgrade context classloader handling by using Context.bind and
+ unbind. (remm)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Improve OpenSSL keystore/truststore configuration by using the code
+ from the JSSE implementation. (remm, jfclere)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a potential loop when a client drops the connection unexpectedly.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ OpenSSL renegotiation support for client certificate authentication.
+ (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix NIO connector renegotiation. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58659">58659</a>: Fix a potential deadlock during HTTP/2 processing when
+ the connection window size is limited. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct an NPE when listing the enabled ciphers (e.g. via the Manager
+ web application) for a TLS enabled APR/native connector. (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ New configuration option <code>ajpFlush</code> for the AJP connectors
+ to disable the sending of AJP flush packets. (rjung)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Handle the case in the NIO connector where the required TLS buffer sizes
+ increase after the connection has been initiated. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Handle the case in the NIO2 connector where the required TLS buffer
+ sizes increase after the connection has been initiated. (markt/remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Bad processing of handshake errors in NIO2. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Use JSSE session configuration options with OpenSSL. (remm)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59015">59015</a>: Fix potential cause of endless APR Poller loop during
+ shutdown if the Poller experiences an error during the shutdown process.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Align cipher aliases for <code>kECDHE</code> and <code>ECDHE</code> with
+ the current OpenSSL implementation. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59081">59081</a>: Retain the user defined cipher order when defining
+ ciphers. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59089">59089</a>: Correctly ignore HTTP headers that include non-token
+ characters in the header name. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.0_(markt)/Jasper">Jasper</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=57136#c25">57136#c25</a>: Change default value of
+ <code>quoteAttributeEL</code> setting in Jasper to be <code>true</code>
+ for better compatibility with other implementations and older versions
+ of Tomcat. Add command line option <code>-no-quoteAttributeEL</code> in
+ JspC. (kkolinko)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix handling of missing messages in
+ <code>org.apache.el.util.MessageFactory</code>. (violetagg)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update to the Eclipse JDT Compiler 4.5.1. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=57583">57583</a>: Improve the performance of
+ <code>javax.servlet.jsp.el.ScopedAttributeELResolver</code> when
+ resolving attributes that do not exist. This improvement only works when
+ Jasper is used with Tomcat's EL implementation. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.0_(markt)/Cluster">Cluster</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Enable an explicit configuration of local member in the static cluster
+ membership. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix potential integer overflow in <code>DeltaSession</code>.
+ Reported by coverity scan. (fschumacher)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ In order to avoid that the heartbeat thread and the background thread to
+ run <code>Channel.heartbeat</code> simultaneously, if
+ <code>heartbeatBackgroundEnabled</code> of <code>SimpleTcpCluster</code>
+ set to <code>true</code>, ensure that the heartbeat thread does not
+ start. (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.0_(markt)/WebSocket">WebSocket</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=55006">55006</a>: The WebSocket client now honors the
+ <code>java.net.java.net.ProxySelector</code> configuration (using the
+ HTTP type) when establishing WebSocket connections to servers. Based on
+ a patch by Niki Dokovski. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=57489">57489</a>: Ensure <code>onClose()</code> is called when a
+ WebSocket connection is closed even if the sending of the close message
+ fails. Includes test cases by Barry Coughlan. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58624">58624</a>: Correct a potential deadlock if the WebSocket
+ connection is closed when a message write is in progress. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix a timing issue on session close that could result in an exception
+ being thrown for an incomplete message even through the message was
+ completed. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correctly handle compression of partial messages when the final message
+ fragment has a zero length payload. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59119">59119</a>: Correct read logic for WebSocket client when using
+ secure connections. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59134">59134</a>: Correct client connect logic for secure connections
+ made through a proxy. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.0_(markt)/Web_applications">Web applications</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=48674">48674</a>: Implement an option within the Host Manager web
+ application to persist the current configuration. Based on a patch by
+ Coty Sutherland. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58631">58631</a>: Correct the continuation character use in the Windows
+ Service How-To page of the documentation web application. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the SSL documentation for deprecated attributes to point to the
+ correct, new location for attributes related to individual certificates.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct some typos in the JNDI resources How-To. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Don't create session unnecessarily in the Manager application. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Don't create session unnecessarily in the Host Manager application.
+ (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58723">58723</a>: Clarify documentation and error messages for the text
+ interface of the manager to make clear that version must be used with
+ path when referencing contexts deployed using parallel deployment.
+ (markt)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Document <code>test.threads</code> option in BUILDING.txt. (kkolinko)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct an error in the documentation of the expected behaviour for
+ automatic deployment. If a WAR is updated and an expanded directory is
+ present, the directory will always be deleted and recreated by expanding
+ the WAR if <code>unpackWARs</code> is <code>true</code>. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58935">58935</a>: Remove incorrect references in the documentation to
+ using <code>jar:file:</code> URLs with the Manager application. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct the description of the
+ <code>ServletRequest.getServerPort()</code> in Proxy How-To.
+ Issue reported via comments.apache.org. (violetagg)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ The Manager and Host Manager applications are now only accessible via
+ <code>localhost</code> by default. (markt)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.0_(markt)/Tribes">Tribes</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Clarify the handling of Copy message and Copy nodes. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ensure that the static member is registered to the add suspect list even
+ if the static member that is registered to the remove suspect list has
+ disappeared. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ When using a static cluster, add the members that have been cached in
+ the membership service to the map members list in order to ensure that
+ the map member is a static member. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add support for the startup notification of local members in the static
+ cluster. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Ignore the unnecessary member remove operation from different domain.
+ (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Add support for the shutdown notification of local members in the static
+ cluster. (kfujino)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ If promoting a proxy node to a primary node when getting a session,
+ notify the change of the new primary node to the original backup node.
+ (kfujino)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.0_(markt)/jdbc-pool">jdbc-pool</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Correct evaluation of system property
+ <code>org.apache.tomcat.jdbc.pool.onlyAttemptCurrentClassLoader</code>.
+ It was basically ignored before. Reported by coverity scan. (fschumacher)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ Fix potential integer overflow in <code>ConnectionPool</code> and
+ <code>PooledConnection</code>. Reported by coverity scan. (fschumacher)
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_8.5.0_(markt)/Other">Other</h4><div class="text">
+ <ul class="changelog">
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Allow to configure multiple JUnit test class patterns with the build
+ property <code>test.name</code> and document the property in
+ BUILDING.txt. (rjung)
+ </li>
+ <li><img alt="Add: " class="icon" src="./images/add.gif">
+ Support the use of the <code>threads</code> attribute on Ant's
+ junit task. Note that using this with a value of greater than one will
+ disable Cobertura code coverage. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update optional Checkstyle library to 6.14.1. (kkolinko)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.4 to
+ pick up the Windows binaries that are based on OpenSSL 1.0.2e and APR
+ 1.5.1. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the NSIS Installer used to build the Windows Installers to
+ version 2.50. (markt/kkolinko)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons BCEL to r1725718 to align with the
+ refactoring for BCEL 6, the next major BCEL release. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons DBCP 2 to r1725730 (2.1.1 plus
+ additional fixes). (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons Pool 2 to r1725738 (2.4.2 plus
+ additional fixes). (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the internal fork of Commons Codec to r1725746 (1.9 plus
+ additional fixes). (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=58283">58283</a>: Change the default download location for libraries
+ during the build process from <code>/usr/share/java</code> to
+ <code>${user.home}/temp</code>. Patch provided by Ahmed Hosni. (markt)
+ </li>
+ <li><img alt="Fix: " class="icon" src="./images/fix.gif">
+ <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=59031">59031</a>: When using the Windows uninstaller, do not remove the
+ contents of any directories that have been symlinked into the Tomcat
+ directory structure. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Update the packaged version of the Tomcat Native Library to 1.2.5 to
+ pick up the Windows binaries that are based on OpenSSL 1.0.2g and APR
+ 1.5.1. (markt)
+ </li>
+ <li><img alt="Update: " class="icon" src="./images/update.gif">
+ Modify the default <code>tomcat-users.xml</code> file to make it harder
+ for users to configure the entries intended for use with the examples
+ web application for the Manager application. (markt)
+ </li>
+ </ul>
+ </div></div>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/class-loader-howto.html b/web/tomcat/webapps/docs/class-loader-howto.html
new file mode 100644
index 0000000..c8a1208
--- /dev/null
+++ b/web/tomcat/webapps/docs/class-loader-howto.html
@@ -0,0 +1,249 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Class Loader How-To</title><meta name="author" content="Craig R. McClanahan"><meta name="author" content="Yoav Shapira"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Class Loader How-To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Overview">Overview</a></li><li><a href="#Class_Loader_Definitions">Class Loader Definitions</a></li><li><a href="#XML_Parsers_and_Java">XML Parsers and Java</a></li><li><a href="#Running_under_a_security_manager">Running under a security manager</a></li><li><a href="#Advanced_configuration">Advanced configuration</a></li></ul>
+</div><h3 id="Overview">Overview</h3><div class="text">
+
+<p>Like many server applications, Tomcat installs a variety of class loaders
+(that is, classes that implement <code>java.lang.ClassLoader</code>) to allow
+different portions of the container, and the web applications running on the
+container, to have access to different repositories of available classes and
+resources. This mechanism is used to provide the functionality defined in the
+Servlet Specification, version 2.4 — in particular, Sections 9.4
+and 9.6.</p>
+
+<p>In a Java environment, class loaders are
+arranged in a parent-child tree. Normally, when a class loader is asked to
+load a particular class or resource, it delegates the request to a parent
+class loader first, and then looks in its own repositories only if the parent
+class loader(s) cannot find the requested class or resource. Note, that the
+model for web application class loaders <em>differs</em> slightly from this,
+as discussed below, but the main principles are the same.</p>
+
+<p>When Tomcat is started, it creates a set of class loaders that are
+organized into the following parent-child relationships, where the parent
+class loader is above the child class loader:</p>
+
+<div class="codeBox"><pre><code> Bootstrap
+ |
+ System
+ |
+ Common
+ / \
+ Webapp1 Webapp2 ...</code></pre></div>
+
+<p>The characteristics of each of these class loaders, including the source
+of classes and resources that they make visible, are discussed in detail in
+the following section.</p>
+
+</div><h3 id="Class_Loader_Definitions">Class Loader Definitions</h3><div class="text">
+
+<p>As indicated in the diagram above, Tomcat creates the following class
+loaders as it is initialized:</p>
+<ul>
+<li><p><strong>Bootstrap</strong> — This class loader contains the basic
+ runtime classes provided by the Java Virtual Machine, plus any classes from
+ JAR files present in the System Extensions directory
+ (<code>$JAVA_HOME/jre/lib/ext</code>). <em>Note</em>: some JVMs may
+ implement this as more than one class loader, or it may not be visible
+ (as a class loader) at all.</p></li>
+<li><p><strong>System</strong> — This class loader is normally initialized
+ from the contents of the <code>CLASSPATH</code> environment variable. All
+ such classes are visible to both Tomcat internal classes, and to web
+ applications. However, the standard Tomcat startup scripts
+ (<code>$CATALINA_HOME/bin/catalina.sh</code> or
+ <code>%CATALINA_HOME%\bin\catalina.bat</code>) totally ignore the contents
+ of the <code>CLASSPATH</code> environment variable itself, and instead
+ build the System class loader from the following repositories:
+ </p>
+ <ul>
+ <li><p><em>$CATALINA_HOME/bin/bootstrap.jar</em> — Contains the
+ main() method that is used to initialize the Tomcat server, and the
+ class loader implementation classes it depends on.</p></li>
+ <li><p><em>$CATALINA_BASE/bin/tomcat-juli.jar</em> or
+ <em>$CATALINA_HOME/bin/tomcat-juli.jar</em> — Logging
+ implementation classes. These include enhancement classes to
+ <code>java.util.logging</code> API, known as Tomcat JULI,
+ and a package-renamed copy of Apache Commons Logging library
+ used internally by Tomcat.
+ See <a href="logging.html">logging documentation</a> for more
+ details.</p>
+ <p>If <code>tomcat-juli.jar</code> is present in
+ <em>$CATALINA_BASE/bin</em>, it is used instead of the one in
+ <em>$CATALINA_HOME/bin</em>. It is useful in certain logging
+ configurations</p></li>
+ <li><p><em>$CATALINA_HOME/bin/commons-daemon.jar</em> — The classes
+ from <a href="https://commons.apache.org/daemon/">Apache Commons
+ Daemon</a> project.
+ This JAR file is not present in the <code>CLASSPATH</code> built by
+ <code>catalina.bat</code>|<code>.sh</code> scripts, but is referenced
+ from the manifest file of <em>bootstrap.jar</em>.</p></li>
+ </ul>
+ </li>
+<li><p><strong>Common</strong> — This class loader contains additional
+ classes that are made visible to both Tomcat internal classes and to all
+ web applications.</p>
+ <p>Normally, application classes should <strong>NOT</strong>
+ be placed here. The locations searched by this class loader are defined by
+ the <code>common.loader</code> property in
+ $CATALINA_BASE/conf/catalina.properties. The default setting will search the
+ following locations in the order they are listed:</p>
+ <ul>
+ <li>unpacked classes and resources in <code>$CATALINA_BASE/lib</code></li>
+ <li>JAR files in <code>$CATALINA_BASE/lib</code></li>
+ <li>unpacked classes and resources in <code>$CATALINA_HOME/lib</code></li>
+ <li>JAR files in <code>$CATALINA_HOME/lib</code></li>
+ </ul>
+ <p>By default, this includes the following:</p>
+ <ul>
+ <li><em>annotations-api.jar</em> — JavaEE annotations classes.</li>
+ <li><em>catalina.jar</em> — Implementation of the Catalina servlet
+ container portion of Tomcat.</li>
+ <li><em>catalina-ant.jar</em> — Tomcat Catalina Ant tasks.</li>
+ <li><em>catalina-ha.jar</em> — High availability package.</li>
+ <li><em>catalina-storeconfig.jar</em> — Generation of XML
+ configuration files from current state</li>
+ <li><em>catalina-tribes.jar</em> — Group communication package.</li>
+ <li><em>ecj-*.jar</em> — Eclipse JDT Java compiler.</li>
+ <li><em>el-api.jar</em> — EL 3.0 API.</li>
+ <li><em>jasper.jar</em> — Tomcat Jasper JSP Compiler and Runtime.</li>
+ <li><em>jasper-el.jar</em> — Tomcat Jasper EL implementation.</li>
+ <li><em>jsp-api.jar</em> — JSP 2.3 API.</li>
+ <li><em>servlet-api.jar</em> — Servlet 3.1 API.</li>
+ <li><em>tomcat-api.jar</em> — Several interfaces defined by Tomcat.</li>
+ <li><em>tomcat-coyote.jar</em> — Tomcat connectors and utility classes.</li>
+ <li><em>tomcat-dbcp.jar</em> — Database connection pool
+ implementation based on package-renamed copy of Apache Commons Pool 2
+ and Apache Commons DBCP 2.</li>
+ <li><em>tomcat-i18n-**.jar</em> — Optional JARs containing resource bundles
+ for other languages. As default bundles are also included in each
+ individual JAR, they can be safely removed if no internationalization
+ of messages is needed.</li>
+ <li><em>tomcat-jdbc.jar</em> — An alternative database connection pool
+ implementation, known as Tomcat JDBC pool. See
+ <a href="jdbc-pool.html">documentation</a> for more details.</li>
+ <li><em>tomcat-util.jar</em> — Common classes used by various components of
+ Apache Tomcat.</li>
+ <li><em>tomcat-websocket.jar</em> — WebSocket 1.1 implementation</li>
+ <li><em>websocket-api.jar</em> — WebSocket 1.1 API</li>
+ </ul></li>
+<li><p><strong>WebappX</strong> — A class loader is created for each web
+ application that is deployed in a single Tomcat instance. All unpacked
+ classes and resources in the <code>/WEB-INF/classes</code> directory of
+ your web application, plus classes and resources in JAR files
+ under the <code>/WEB-INF/lib</code> directory of your web application,
+ are made visible to this web application, but not to other ones.</p></li>
+</ul>
+
+<p>As mentioned above, the web application class loader diverges from the
+default Java delegation model (in accordance with the recommendations in the
+Servlet Specification, version 2.4, section 9.7.2 Web Application Classloader).
+When a request to load a
+class from the web application's <em>WebappX</em> class loader is processed,
+this class loader will look in the local repositories <strong>first</strong>,
+instead of delegating before looking. There are exceptions. Classes which are
+part of the JRE base classes cannot be overridden. There are some exceptions
+such as the XML parser components which can be overridden using the appropriate
+JVM feature which is the endorsed standards override feature for Java <= 8
+and the upgradeable modules feature for Java 9+.
+Lastly, the web application class loader will always delegate first for JavaEE
+API classes for the specifications implemented by Tomcat
+(Servlet, JSP, EL, WebSocket). All other class loaders in Tomcat follow the
+usual delegation pattern.</p>
+
+<p>Therefore, from the perspective of a web application, class or resource
+loading looks in the following repositories, in this order:</p>
+<ul>
+<li>Bootstrap classes of your JVM</li>
+<li><em>/WEB-INF/classes</em> of your web application</li>
+<li><em>/WEB-INF/lib/*.jar</em> of your web application</li>
+<li>System class loader classes (described above)</li>
+<li>Common class loader classes (described above)</li>
+</ul>
+
+<p>If the web application class loader is
+<a href="config/loader.html">configured</a> with
+<code><Loader delegate="true"/></code>
+then the order becomes:</p>
+<ul>
+<li>Bootstrap classes of your JVM</li>
+<li>System class loader classes (described above)</li>
+<li>Common class loader classes (described above)</li>
+<li><em>/WEB-INF/classes</em> of your web application</li>
+<li><em>/WEB-INF/lib/*.jar</em> of your web application</li>
+</ul>
+
+</div><h3 id="XML_Parsers_and_Java">XML Parsers and Java</h3><div class="text">
+
+<p>Starting with Java 1.4 a copy of JAXP APIs and an XML parser are packed
+inside the JRE. This has impacts on applications that wish to use their own
+XML parser.</p>
+
+<p>In old versions of Tomcat, you could simply replace the XML parser
+in the Tomcat libraries directory to change the parser
+used by all web applications. However, this technique will not be effective
+when you are running modern versions of Java, because the usual class loader
+delegation process will always choose the implementation inside the JDK in
+preference to this one.</p>
+
+<p>Java <= 8 supports a mechanism called the "Endorsed Standards Override
+Mechanism" to allow replacement of APIs created outside of the JCP
+(i.e. DOM and SAX from W3C). It can also be used to update the XML parser
+implementation. For more information, see:
+<a href="http://docs.oracle.com/javase/1.5.0/docs/guide/standards/index.html">
+http://docs.oracle.com/javase/1.5.0/docs/guide/standards/index.html</a>. For
+Java 9+, use the upgradeable modules feature.</p>
+
+<p>Tomcat utilizes the endorsed mechanism by including the system property setting
+<code>-Djava.endorsed.dirs=$JAVA_ENDORSED_DIRS</code> in the
+command line that starts the container. The default value of this option is
+<em>$CATALINA_HOME/endorsed</em>. This <em>endorsed</em> directory is not
+created by default. Note that the endorsed feature is no longer supported
+with Java 9 and the above system property will only be set if either the
+directory <em>$CATALINA_HOME/endorsed</em> exists, or the variable
+<code>JAVA_ENDORSED_DIRS</code> has been set.
+</p>
+
+<p>Note that overriding any JRE component carries risk. If the overriding
+component does not provide a 100% compatible API (e.g. the API provided by
+Xerces is not 100% compatible with the XML API provided by the JRE) then there
+is a risk that Tomcat and/or the deployed application will experience errors.</p>
+
+</div><h3 id="Running_under_a_security_manager">Running under a security manager</h3><div class="text">
+
+<p>When running under a security manager the locations from which classes
+are permitted to be loaded will also depend on the contents of your policy
+file. See <a href="security-manager-howto.html">Security Manager How-To</a>
+for further information.</p>
+
+</div><h3 id="Advanced_configuration">Advanced configuration</h3><div class="text">
+
+<p>A more complex class loader hierarchy may also be configured. See the diagram
+below. By default, the <strong>Server</strong> and <strong>Shared</strong>
+class loaders are not defined and the simplified hierarchy shown above is used.
+This more complex hierarchy may be use by defining values for the
+<code>server.loader</code> and/or <code>shared.loader</code> properties in
+<code>conf/catalina.properties</code>.</p>
+
+<div class="codeBox"><pre><code>
+ Bootstrap
+ |
+ System
+ |
+ Common
+ / \
+Server Shared
+ / \
+ Webapp1 Webapp2 ...</code></pre></div>
+
+<p>The <strong>Server</strong> class loader is only visible to Tomcat internals
+and is completely invisible to web applications.</p>
+
+<p>The <strong>Shared</strong> class loader is visible to all web applications
+and may be used to shared code across all web applications. However, any updates
+to this shared code will require a Tomcat restart.</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/cluster-howto.html b/web/tomcat/webapps/docs/cluster-howto.html
new file mode 100644
index 0000000..ea7af24
--- /dev/null
+++ b/web/tomcat/webapps/docs/cluster-howto.html
@@ -0,0 +1,647 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Clustering/Session Replication How-To</title><meta name="author" content="Filip Hanik"><meta name="author" content="Peter Rossbach"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Clustering/Session Replication How-To</h2><h3 id="Important_Note">Important Note</h3><div class="text">
+<p><b>You can also check the <a href="config/cluster.html">configuration reference documentation.</a></b>
+</p>
+</div><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#For_the_impatient">For the impatient</a></li><li><a href="#Security">Security</a></li><li><a href="#Cluster_Basics">Cluster Basics</a></li><li><a href="#Overview">Overview</a></li><li><a href="#Cluster_Information">Cluster Information</a></li><li><a href="#Bind_session_after_crash_to_failover_node">Bind session after crash to failover node</a></li><li><a href="#Configuration_Example">Configuration Example</a></li><li><a href="#Cluster_Architecture">Cluster Architecture</a></li><li><a href="#How_it_Works">How it Works</a></li><li><a href="#Monitoring_your_Cluster_with_JMX">Monitoring your Cluster with JMX</a></li><li><a href="#FAQ">FAQ</a></li></ul>
+</div><h3 id="For_the_impatient">For the impatient</h3><div class="text">
+ <p>
+ Simply add
+ </p>
+ <div class="codeBox"><pre><code><Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/></code></pre></div>
+ <p>
+ to your <code><Engine></code> or your <code><Host></code> element to enable clustering.
+ </p>
+ <p>
+ Using the above configuration will enable all-to-all session replication
+ using the <code>DeltaManager</code> to replicate session deltas. By all-to-all, we mean that <i>every</i>
+ session gets replicated to <i>all the other nodes</i> in the cluster.
+ This works great for smaller clusters, but we don't recommend it for larger clusters — more than 4 nodes or so.
+ Also, when using the DeltaManager, Tomcat will replicate sessions to <i>all</i> nodes,
+ <i>even nodes that don't have the application deployed</i>.<br>
+ To get around these problem, you'll want to use the <code>BackupManager</code>. The <code>BackupManager</code>
+ only replicates the session data to <i>one</i> backup node, and only to nodes that have the application deployed.
+ Once you have a simple cluster running with the <code>DeltaManager</code>, you will probably want to
+ migrate to the <code>BackupManager</code> as you increase the number of nodes in your cluster.
+ </p>
+ <p>
+ Here are some of the important default values:
+ </p>
+ <ol>
+ <li>Multicast address is 228.0.0.4</li>
+ <li>Multicast port is 45564 (the port and the address together determine cluster membership.</li>
+ <li>The IP broadcasted is <code>java.net.InetAddress.getLocalHost().getHostAddress()</code> (make sure you don't broadcast 127.0.0.1, this is a common error)</li>
+ <li>The TCP port listening for replication messages is the first available server socket in range <code>4000-4100</code></li>
+ <li>Listener is configured <code>ClusterSessionListener</code></li>
+ <li>Two interceptors are configured <code>TcpFailureDetector</code> and <code>MessageDispatchInterceptor</code></li>
+ </ol>
+ <p>
+ The following is the default cluster configuration:
+ </p>
+ <div class="codeBox"><pre><code> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
+ channelSendOptions="8">
+
+ <Manager className="org.apache.catalina.ha.session.DeltaManager"
+ expireSessionsOnShutdown="false"
+ notifyListenersOnReplication="true"/>
+
+ <Channel className="org.apache.catalina.tribes.group.GroupChannel">
+ <Membership className="org.apache.catalina.tribes.membership.McastService"
+ address="228.0.0.4"
+ port="45564"
+ frequency="500"
+ dropTime="3000"/>
+ <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
+ address="auto"
+ port="4000"
+ autoBind="100"
+ selectorTimeout="5000"
+ maxThreads="6"/>
+
+ <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
+ <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
+ </Sender>
+ <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
+ <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
+ </Channel>
+
+ <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
+ filter=""/>
+ <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
+
+ <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
+ tempDir="/tmp/war-temp/"
+ deployDir="/tmp/war-deploy/"
+ watchDir="/tmp/war-listen/"
+ watchEnabled="false"/>
+
+ <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
+ </Cluster></code></pre></div>
+ <p>We will cover this section in more detail later in this document.</p>
+</div><h3 id="Security">Security</h3><div class="text">
+
+<p>The cluster implementation is written on the basis that a secure, trusted
+network is used for all of the cluster related network traffic. It is not safe
+to run a cluster on a insecure, untrusted network.</p>
+
+<p>There are many options for providing a secure, trusted network for use by a
+Tomcat cluster. These include:</p>
+<ul>
+ <li>private LAN</li>
+ <li>a Virtual Private Network (VPN)</li>
+ <li>IPSEC</li>
+ <li>Encrypt cluster traffic using the <a href="config/cluster-interceptor.html#org.apache.catalina.tribes.group.interceptors.EncryptInterceptor_Attributes">EncryptInterceptor</a></li>
+</ul>
+
+</div><h3 id="Cluster_Basics">Cluster Basics</h3><div class="text">
+
+<p>To run session replication in your Tomcat 8 container, the following steps
+should be completed:</p>
+<ul>
+ <li>All your session attributes must implement <code>java.io.Serializable</code></li>
+ <li>Uncomment the <code>Cluster</code> element in server.xml</li>
+ <li>If you have defined custom cluster valves, make sure you have the <code>ReplicationValve</code> defined as well under the Cluster element in server.xml</li>
+ <li>If your Tomcat instances are running on the same machine, make sure the <code>Receiver.port</code>
+ attribute is unique for each instance, in most cases Tomcat is smart enough to resolve this on it's own by autodetecting available ports in the range 4000-4100</li>
+ <li>Make sure your <code>web.xml</code> has the
+ <code><distributable/></code> element</li>
+ <li>If you are using mod_jk, make sure that jvmRoute attribute is set at your Engine <code><Engine name="Catalina" jvmRoute="node01" ></code>
+ and that the jvmRoute attribute value matches your worker name in workers.properties</li>
+ <li>Make sure that all nodes have the same time and sync with NTP service!</li>
+ <li>Make sure that your loadbalancer is configured for sticky session mode.</li>
+</ul>
+<p>Load balancing can be achieved through many techniques, as seen in the
+<a href="balancer-howto.html">Load Balancing</a> chapter.</p>
+<p>Note: Remember that your session state is tracked by a cookie, so your URL must look the same from the out
+ side otherwise, a new session will be created.</p>
+<p>The Cluster module uses the Tomcat JULI logging framework, so you can configure logging
+ through the regular logging.properties file. To track messages, you can enable logging on the key: <code>org.apache.catalina.tribes.MESSAGES</code></p>
+</div><h3 id="Overview">Overview</h3><div class="text">
+
+<p>To enable session replication in Tomcat, three different paths can be followed to achieve the exact same thing:</p>
+<ol>
+ <li>Using session persistence, and saving the session to a shared file system (PersistenceManager + FileStore)</li>
+ <li>Using session persistence, and saving the session to a shared database (PersistenceManager + JDBCStore)</li>
+ <li>Using in-memory-replication, using the SimpleTcpCluster that ships with Tomcat (lib/catalina-tribes.jar + lib/catalina-ha.jar)</li>
+</ol>
+
+<p>Tomcat can perform an all-to-all replication of session state using the <code>DeltaManager</code> or
+ perform backup replication to only one node using the <code>BackupManager</code>.
+ The all-to-all replication is an algorithm that is only efficient when the clusters are small. For larger clusters, you
+ should use the BackupManager to use a primary-secondary session replication strategy where the session will only be
+ stored at one backup node.<br>
+
+ Currently you can use the domain worker attribute (mod_jk > 1.2.8) to build cluster partitions
+ with the potential of having a more scalable cluster solution with the DeltaManager
+ (you'll need to configure the domain interceptor for this).
+ In order to keep the network traffic down in an all-to-all environment, you can split your cluster
+ into smaller groups. This can be easily achieved by using different multicast addresses for the different groups.
+ A very simple setup would look like this:
+ </p>
+
+<div class="codeBox"><pre><code> DNS Round Robin
+ |
+ Load Balancer
+ / \
+ Cluster1 Cluster2
+ / \ / \
+ Tomcat1 Tomcat2 Tomcat3 Tomcat4</code></pre></div>
+
+<p>What is important to mention here, is that session replication is only the beginning of clustering.
+ Another popular concept used to implement clusters is farming, i.e., you deploy your apps only to one
+ server, and the cluster will distribute the deployments across the entire cluster.
+ This is all capabilities that can go into with the FarmWarDeployer (s. cluster example at <code>server.xml</code>)</p>
+<p>In the next section will go deeper into how session replication works and how to configure it.</p>
+
+</div><h3 id="Cluster_Information">Cluster Information</h3><div class="text">
+<p>Membership is established using multicast heartbeats.
+ Hence, if you wish to subdivide your clusters, you can do this by
+ changing the multicast IP address or port in the <code><Membership></code> element.
+</p>
+<p>
+ The heartbeat contains the IP address of the Tomcat node and the TCP port that
+ Tomcat listens to for replication traffic. All data communication happens over TCP.
+</p>
+<p>
+ The <code>ReplicationValve</code> is used to find out when the request has been completed and initiate the
+ replication, if any. Data is only replicated if the session has changed (by calling setAttribute or removeAttribute
+ on the session).
+</p>
+<p>
+ One of the most important performance considerations is the synchronous versus asynchronous replication.
+ In a synchronous replication mode the request doesn't return until the replicated session has been
+ sent over the wire and reinstantiated on all the other cluster nodes.
+ Synchronous vs. asynchronous is configured using the <code>channelSendOptions</code>
+ flag and is an integer value. The default value for the <code>SimpleTcpCluster/DeltaManager</code> combo is
+ 8, which is asynchronous.
+ See the <a href="config/cluster.html#SimpleTcpCluster_Attributes">configuration reference</a>
+ for more discussion on the various <code>channelSendOptions</code> values.
+</p>
+<p>
+ For convenience, <code>channelSendOptions</code> can be set by name(s) rather than integer,
+ which are then translated to their integer value upon startup. The valid option names are:
+ "asynchronous" (alias "async"), "byte_message" (alias "byte"), "multicast", "secure",
+ "synchronized_ack" (alias "sync"), "udp", "use_ack". Use comma to separate multiple names,
+ e.g. pass "async, multicast" for the options
+ <code>SEND_OPTIONS_ASYNCHRONOUS | SEND_OPTIONS_MULTICAST</code>.
+</p>
+<p>
+ You can read more on the <a href="tribes/introduction.html">send flag(overview)</a> or the
+ <a href="https://tomcat.apache.org/tomcat-8.5-doc/api/org/apache/catalina/tribes/Channel.html">send flag(javadoc)</a>.
+ During async replication, the request is returned before the data has been replicated. async
+ replication yields shorter request times, and synchronous replication guarantees the session
+ to be replicated before the request returns.
+</p>
+</div><h3 id="Bind_session_after_crash_to_failover_node">Bind session after crash to failover node</h3><div class="text">
+<p>
+ If you are using mod_jk and not using sticky sessions or for some reasons sticky session don't
+ work, or you are simply failing over, the session id will need to be modified as it previously contained
+ the worker id of the previous tomcat (as defined by jvmRoute in the Engine element).
+ To solve this, we will use the JvmRouteBinderValve.
+</p>
+<p>
+ The JvmRouteBinderValve rewrites the session id to ensure that the next request will remain sticky
+ (and not fall back to go to random nodes since the worker is no longer available) after a fail over.
+ The valve rewrites the JSESSIONID value in the cookie with the same name.
+ Not having this valve in place, will make it harder to ensure stickiness in case of a failure for the mod_jk module.
+</p>
+<p>
+ Remember, if you are adding your own valves in server.xml then the defaults are no longer valid,
+ make sure that you add in all the appropriate valves as defined by the default.
+</p>
+<p>
+ <b>Hint:</b><br>
+ With attribute <i>sessionIdAttribute</i> you can change the request attribute name that included the old session id.
+ Default attribute name is <i>org.apache.catalina.ha.session.JvmRouteOriginalSessionID</i>.
+</p>
+<p>
+ <b>Trick:</b><br>
+ You can enable this mod_jk turnover mode via JMX before you drop a node to all backup nodes!
+ Set enable true on all JvmRouteBinderValve backups, disable worker at mod_jk
+ and then drop node and restart it! Then enable mod_jk Worker and disable JvmRouteBinderValves again.
+ This use case means that only requested session are migrated.
+</p>
+
+
+</div><h3 id="Configuration_Example">Configuration Example</h3><div class="text">
+ <div class="codeBox"><pre><code> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
+ channelSendOptions="6">
+
+ <Manager className="org.apache.catalina.ha.session.BackupManager"
+ expireSessionsOnShutdown="false"
+ notifyListenersOnReplication="true"
+ mapSendOptions="6"/>
+ <!--
+ <Manager className="org.apache.catalina.ha.session.DeltaManager"
+ expireSessionsOnShutdown="false"
+ notifyListenersOnReplication="true"/>
+ -->
+ <Channel className="org.apache.catalina.tribes.group.GroupChannel">
+ <Membership className="org.apache.catalina.tribes.membership.McastService"
+ address="228.0.0.4"
+ port="45564"
+ frequency="500"
+ dropTime="3000"/>
+ <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
+ address="auto"
+ port="5000"
+ selectorTimeout="100"
+ maxThreads="6"/>
+
+ <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
+ <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
+ </Sender>
+ <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
+ <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
+ <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
+ </Channel>
+
+ <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
+ filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>
+
+ <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
+ tempDir="/tmp/war-temp/"
+ deployDir="/tmp/war-deploy/"
+ watchDir="/tmp/war-listen/"
+ watchEnabled="false"/>
+
+ <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
+ </Cluster></code></pre></div>
+ <p>
+ Break it down!!
+ </p>
+ <div class="codeBox"><pre><code> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
+ channelSendOptions="6"></code></pre></div>
+ <p>
+ The main element, inside this element all cluster details can be configured.
+ The <code>channelSendOptions</code> is the flag that is attached to each message sent by the
+ SimpleTcpCluster class or any objects that are invoking the SimpleTcpCluster.send method.
+ The description of the send flags is available at <a href="https://tomcat.apache.org/tomcat-8.5-doc/api/org/apache/catalina/tribes/Channel.html">
+ our javadoc site</a>
+ The <code>DeltaManager</code> sends information using the SimpleTcpCluster.send method, while the backup manager
+ sends it itself directly through the channel.
+ <br>For more info, Please visit the <a href="config/cluster.html">reference documentation</a>
+ </p>
+ <div class="codeBox"><pre><code> <Manager className="org.apache.catalina.ha.session.BackupManager"
+ expireSessionsOnShutdown="false"
+ notifyListenersOnReplication="true"
+ mapSendOptions="6"/>
+ <!--
+ <Manager className="org.apache.catalina.ha.session.DeltaManager"
+ expireSessionsOnShutdown="false"
+ notifyListenersOnReplication="true"/>
+ --></code></pre></div>
+ <p>
+ This is a template for the manager configuration that will be used if no manager is defined in the <Context>
+ element. In Tomcat 5.x each webapp marked distributable had to use the same manager, this is no longer the case
+ since Tomcat you can define a manager class for each webapp, so that you can mix managers in your cluster.
+ Obviously the managers on one node's application has to correspond with the same manager on the same application on the other node.
+ If no manager has been specified for the webapp, and the webapp is marked <distributable/> Tomcat will take this manager configuration
+ and create a manager instance cloning this configuration.
+ <br>For more info, Please visit the <a href="config/cluster-manager.html">reference documentation</a>
+ </p>
+ <div class="codeBox"><pre><code> <Channel className="org.apache.catalina.tribes.group.GroupChannel"></code></pre></div>
+ <p>
+ The channel element is <a href="tribes/introduction.html">Tribes</a>, the group communication framework
+ used inside Tomcat. This element encapsulates everything that has to do with communication and membership logic.
+ <br>For more info, Please visit the <a href="config/cluster-channel.html">reference documentation</a>
+ </p>
+ <div class="codeBox"><pre><code> <Membership className="org.apache.catalina.tribes.membership.McastService"
+ address="228.0.0.4"
+ port="45564"
+ frequency="500"
+ dropTime="3000"/></code></pre></div>
+ <p>
+ Membership is done using multicasting. Please note that Tribes also supports static memberships using the
+ <code>StaticMembershipInterceptor</code> if you want to extend your membership to points beyond multicasting.
+ The address attribute is the multicast address used and the port is the multicast port. These two together
+ create the cluster separation. If you want a QA cluster and a production cluster, the easiest config is to
+ have the QA cluster be on a separate multicast address/port combination than the production cluster.<br>
+ The membership component broadcasts TCP address/port of itself to the other nodes so that communication between
+ nodes can be done over TCP. Please note that the address being broadcasted is the one of the
+ <code>Receiver.address</code> attribute.
+ <br>For more info, Please visit the <a href="config/cluster-membership.html">reference documentation</a>
+ </p>
+ <div class="codeBox"><pre><code> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
+ address="auto"
+ port="5000"
+ selectorTimeout="100"
+ maxThreads="6"/></code></pre></div>
+ <p>
+ In tribes the logic of sending and receiving data has been broken into two functional components. The Receiver, as the name suggests
+ is responsible for receiving messages. Since the Tribes stack is thread less, (a popular improvement now adopted by other frameworks as well),
+ there is a thread pool in this component that has a maxThreads and minThreads setting.<br>
+ The address attribute is the host address that will be broadcasted by the membership component to the other nodes.
+ <br>For more info, Please visit the <a href="config/cluster-receiver.html">reference documentation</a>
+ </p>
+ <div class="codeBox"><pre><code> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
+ <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
+ </Sender></code></pre></div>
+ <p>
+ The sender component, as the name indicates is responsible for sending messages to other nodes.
+ The sender has a shell component, the <code>ReplicationTransmitter</code> but the real stuff done is done in the
+ sub component, <code>Transport</code>.
+ Tribes support having a pool of senders, so that messages can be sent in parallel and if using the NIO sender,
+ you can send messages concurrently as well.<br>
+ Concurrently means one message to multiple senders at the same time and Parallel means multiple messages to multiple senders
+ at the same time.
+ <br>For more info, Please visit the <a href="config/cluster-sender.html">reference documentation</a>
+ </p>
+ <div class="codeBox"><pre><code> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
+ <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
+ <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
+ </Channel></code></pre></div>
+ <p>
+ Tribes uses a stack to send messages through. Each element in the stack is called an interceptor, and works much like the valves do
+ in the Tomcat servlet container.
+ Using interceptors, logic can be broken into more manageable pieces of code. The interceptors configured above are:<br>
+ TcpFailureDetector - verifies crashed members through TCP, if multicast packets get dropped, this interceptor protects against false positives,
+ ie the node marked as crashed even though it still is alive and running.<br>
+ MessageDispatchInterceptor - dispatches messages to a thread (thread pool) to send message asynchronously.<br>
+ ThroughputInterceptor - prints out simple stats on message traffic.<br>
+ Please note that the order of interceptors is important. The way they are defined in server.xml is the way they are represented in the
+ channel stack. Think of it as a linked list, with the head being the first most interceptor and the tail the last.
+ <br>For more info, Please visit the <a href="config/cluster-interceptor.html">reference documentation</a>
+ </p>
+ <div class="codeBox"><pre><code> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
+ filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/></code></pre></div>
+ <p>
+ The cluster uses valves to track requests to web applications, we've mentioned the ReplicationValve and the JvmRouteBinderValve above.
+ The <Cluster> element itself is not part of the pipeline in Tomcat, instead the cluster adds the valve to its parent container.
+ If the <Cluster> elements is configured in the <Engine> element, the valves get added to the engine and so on.
+ <br>For more info, Please visit the <a href="config/cluster-valve.html">reference documentation</a>
+ </p>
+ <div class="codeBox"><pre><code> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
+ tempDir="/tmp/war-temp/"
+ deployDir="/tmp/war-deploy/"
+ watchDir="/tmp/war-listen/"
+ watchEnabled="false"/></code></pre></div>
+ <p>
+ The default tomcat cluster supports farmed deployment, ie, the cluster can deploy and undeploy applications on the other nodes.
+ The state of this component is currently in flux but will be addressed soon. There was a change in the deployment algorithm
+ between Tomcat 5.0 and 5.5 and at that point, the logic of this component changed to where the deploy dir has to match the
+ webapps directory.
+ <br>For more info, Please visit the <a href="config/cluster-deployer.html">reference documentation</a>
+ </p>
+ <div class="codeBox"><pre><code> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
+ </Cluster></code></pre></div>
+ <p>
+ Since the SimpleTcpCluster itself is a sender and receiver of the Channel object, components can register themselves as listeners to
+ the SimpleTcpCluster. The listener above <code>ClusterSessionListener</code> listens for DeltaManager replication messages
+ and applies the deltas to the manager that in turn applies it to the session.
+ <br>For more info, Please visit the <a href="config/cluster-listener.html">reference documentation</a>
+ </p>
+
+</div><h3 id="Cluster_Architecture">Cluster Architecture</h3><div class="text">
+
+<p><b>Component Levels:</b></p>
+<div class="codeBox"><pre><code> Server
+ |
+ Service
+ |
+ Engine
+ | \
+ | --- Cluster --*
+ |
+ Host
+ |
+ ------
+ / \
+ Cluster Context(1-N)
+ | \
+ | -- Manager
+ | \
+ | -- DeltaManager
+ | -- BackupManager
+ |
+ ---------------------------
+ | \
+ Channel \
+ ----------------------------- \
+ | \
+ Interceptor_1 .. \
+ | \
+ Interceptor_N \
+ ----------------------------- \
+ | | | \
+ Receiver Sender Membership \
+ -- Valve
+ | \
+ | -- ReplicationValve
+ | -- JvmRouteBinderValve
+ |
+ -- LifecycleListener
+ |
+ -- ClusterListener
+ | \
+ | -- ClusterSessionListener
+ |
+ -- Deployer
+ \
+ -- FarmWarDeployer
+
+</code></pre></div>
+
+
+</div><h3 id="How_it_Works">How it Works</h3><div class="text">
+<p>To make it easy to understand how clustering works, we are gonna to take you through a series of scenarios.
+ In this scenario we only plan to use two tomcat instances <code>TomcatA</code> and <code>TomcatB</code>.
+ We will cover the following sequence of events:</p>
+
+<ol>
+<li><code>TomcatA</code> starts up</li>
+<li><code>TomcatB</code> starts up (Wait the TomcatA start is complete)</li>
+<li><code>TomcatA</code> receives a request, a session <code>S1</code> is created.</li>
+<li><code>TomcatA</code> crashes</li>
+<li><code>TomcatB</code> receives a request for session <code>S1</code></li>
+<li><code>TomcatA</code> starts up</li>
+<li><code>TomcatA</code> receives a request, invalidate is called on the session (<code>S1</code>)</li>
+<li><code>TomcatB</code> receives a request, for a new session (<code>S2</code>)</li>
+<li><code>TomcatA</code> The session <code>S2</code> expires due to inactivity.</li>
+</ol>
+
+<p>Ok, now that we have a good sequence, we will take you through exactly what happens in the session replication code</p>
+
+<ol>
+<li><b><code>TomcatA</code> starts up</b>
+ <p>
+ Tomcat starts up using the standard start up sequence. When the Host object is created, a cluster object is associated with it.
+ When the contexts are parsed, if the distributable element is in place in the web.xml file,
+ Tomcat asks the Cluster class (in this case <code>SimpleTcpCluster</code>) to create a manager
+ for the replicated context. So with clustering enabled, distributable set in web.xml
+ Tomcat will create a <code>DeltaManager</code> for that context instead of a <code>StandardManager</code>.
+ The cluster class will start up a membership service (multicast) and a replication service (tcp unicast).
+ More on the architecture further down in this document.
+ </p>
+</li>
+<li><b><code>TomcatB</code> starts up</b>
+ <p>
+ When TomcatB starts up, it follows the same sequence as TomcatA did with one exception.
+ The cluster is started and will establish a membership (TomcatA, TomcatB).
+ TomcatB will now request the session state from a server that already exists in the cluster,
+ in this case TomcatA. TomcatA responds to the request, and before TomcatB starts listening
+ for HTTP requests, the state has been transferred from TomcatA to TomcatB.
+ In case TomcatA doesn't respond, TomcatB will time out after 60 seconds, issue a log
+ entry, and continue starting. The session state gets transferred for each web
+ application that has distributable in its web.xml. (Note: To use session replication
+ efficiently, all your tomcat instances should be configured the same.)
+ </p>
+</li>
+<li><B><code>TomcatA</code> receives a request, a session <code>S1</code> is created.</B>
+ <p>
+ The request coming in to TomcatA is handled exactly the same way as without session
+ replication, until the request is completed, at which time the
+ <code>ReplicationValve</code> will intercept the request before the response is
+ returned to the user. At this point it finds that the session has been modified,
+ and it uses TCP to replicate the session to TomcatB. Once the serialized data has
+ been handed off to the operating system's TCP logic, the request returns to the user,
+ back through the valve pipeline. For each request the entire session is replicated,
+ this allows code that modifies attributes in the session without calling setAttribute
+ or removeAttribute to be replicated. A useDirtyFlag configuration parameter can
+ be used to optimize the number of times a session is replicated.
+ </p>
+
+</li>
+<li><b><code>TomcatA</code> crashes</b>
+ <p>
+ When TomcatA crashes, TomcatB receives a notification that TomcatA has dropped out
+ of the cluster. TomcatB removes TomcatA from its membership list, and TomcatA will
+ no longer be notified of any changes that occurs in TomcatB. The load balancer
+ will redirect the requests from TomcatA to TomcatB and all the sessions are current.
+ </p>
+</li>
+<li><b><code>TomcatB</code> receives a request for session <code>S1</code></b>
+ <p>Nothing exciting, TomcatB will process the request as any other request.
+ </p>
+</li>
+<li><b><code>TomcatA</code> starts up</b>
+ <p>Upon start up, before TomcatA starts taking new request and making itself
+ available to it will follow the start up sequence described above 1) 2).
+ It will join the cluster, contact TomcatB for the current state of all the sessions.
+ And once it receives the session state, it finishes loading and opens its HTTP/mod_jk ports.
+ So no requests will make it to TomcatA until it has received the session state from TomcatB.
+ </p>
+</li>
+<li><b><code>TomcatA</code> receives a request, invalidate is called on the session (<code>S1</code>)</b>
+ <p>The invalidate call is intercepted, and the session is queued with invalidated sessions.
+ When the request is complete, instead of sending out the session that has changed, it sends out
+ an "expire" message to TomcatB and TomcatB will invalidate the session as well.
+ </p>
+
+</li>
+<li><b><code>TomcatB</code> receives a request, for a new session (<code>S2</code>)</b>
+ <p>Same scenario as in step 3)
+ </p>
+
+
+</li>
+<li><code>TomcatA</code> The session <code>S2</code> expires due to inactivity.
+ <p>The invalidate call is intercepted the same way as when a session is invalidated by the user,
+ and the session is queued with invalidated sessions.
+ At this point, the invalidated session will not be replicated across until
+ another request comes through the system and checks the invalid queue.
+ </p>
+</li>
+</ol>
+
+<p>Phuuuhh! :)</p>
+
+<p><b>Membership</b>
+ Clustering membership is established using very simple multicast pings.
+ Each Tomcat instance will periodically send out a multicast ping,
+ in the ping message the instance will broadcast its IP and TCP listen port
+ for replication.
+ If an instance has not received such a ping within a given timeframe, the
+ member is considered dead. Very simple, and very effective!
+ Of course, you need to enable multicasting on your system.
+</p>
+
+<p><b>TCP Replication</b>
+ Once a multicast ping has been received, the member is added to the cluster
+ Upon the next replication request, the sending instance will use the host and
+ port info and establish a TCP socket. Using this socket it sends over the serialized data.
+ The reason I chose TCP sockets is because it has built in flow control and guaranteed delivery.
+ So I know, when I send some data, it will make it there :)
+</p>
+
+<p><b>Distributed locking and pages using frames</b>
+ Tomcat does not keep session instances in sync across the cluster.
+ The implementation of such logic would be to much overhead and cause all
+ kinds of problems. If your client accesses the same session
+ simultaneously using multiple requests, then the last request
+ will override the other sessions in the cluster.
+</p>
+
+</div><h3 id="Monitoring_your_Cluster_with_JMX">Monitoring your Cluster with JMX</h3><div class="text">
+<p>Monitoring is a very important question when you use a cluster. Some of the cluster objects are JMX MBeans </p>
+<p>Add the following parameter to your startup script:</p>
+<div class="codeBox"><pre><code>set CATALINA_OPTS=\
+-Dcom.sun.management.jmxremote \
+-Dcom.sun.management.jmxremote.port=%my.jmx.port% \
+-Dcom.sun.management.jmxremote.ssl=false \
+-Dcom.sun.management.jmxremote.authenticate=false</code></pre></div>
+
+<p>
+ List of Cluster Mbeans
+</p>
+<table class="defaultTable">
+
+ <tr>
+ <th>Name</th>
+ <th>Description</th>
+ <th>MBean ObjectName - Engine</th>
+ <th>MBean ObjectName - Host</th>
+ </tr>
+
+ <tr>
+ <td>Cluster</td>
+ <td>The complete cluster element</td>
+ <td><code>type=Cluster</code></td>
+ <td><code>type=Cluster,host=${HOST}</code></td>
+ </tr>
+
+ <tr>
+ <td>DeltaManager</td>
+ <td>This manager control the sessions and handle session replication </td>
+ <td><code>type=Manager,context=${APP.CONTEXT.PATH}, host=${HOST}</code></td>
+ <td><code>type=Manager,context=${APP.CONTEXT.PATH}, host=${HOST}</code></td>
+ </tr>
+
+ <tr>
+ <td>FarmWarDeployer</td>
+ <td>Manages the process of deploying an application to all nodes in the cluster</td>
+ <td>Not supported</td>
+ <td><code>type=Cluster, host=${HOST}, component=deployer</code></td>
+ </tr>
+
+ <tr>
+ <td>Member</td>
+ <td>Represents a node in the cluster</td>
+ <td>type=Cluster, component=member, name=${NODE_NAME}</td>
+ <td><code>type=Cluster, host=${HOST}, component=member, name=${NODE_NAME}</code></td>
+ </tr>
+
+ <tr>
+ <td>ReplicationValve</td>
+ <td>This valve control the replication to the backup nodes</td>
+ <td><code>type=Valve,name=ReplicationValve</code></td>
+ <td><code>type=Valve,name=ReplicationValve,host=${HOST}</code></td>
+ </tr>
+
+ <tr>
+ <td>JvmRouteBinderValve</td>
+ <td>This is a cluster fallback valve to change the Session ID to the current tomcat jvmroute.</td>
+ <td><code>type=Valve,name=JvmRouteBinderValve,
+ context=${APP.CONTEXT.PATH}</code></td>
+ <td><code>type=Valve,name=JvmRouteBinderValve,host=${HOST},
+ context=${APP.CONTEXT.PATH}</code></td>
+ </tr>
+
+</table>
+</div><h3 id="FAQ">FAQ</h3><div class="text">
+<p>Please see <a href="https://wiki.apache.org/tomcat/FAQ/Clustering">the clustering section of the FAQ</a>.</p>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/comments.html b/web/tomcat/webapps/docs/comments.html
new file mode 100644
index 0000000..d1888ac
--- /dev/null
+++ b/web/tomcat/webapps/docs/comments.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Documentation User Comments</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Documentation User Comments</h2><h3 id="Introduction">Introduction</h3><div class="text">
+
+<p>The Tomcat documentation integrates the
+<a href="https://comments.apache.org/help.html">Apache Comments System</a>.
+It allows users to add comments to most documentation pages. The comments
+section can be found at the end of each page.</p>
+
+</div><h3 id="Allowed_Content">Allowed Content</h3><div class="text">
+
+<p>Please use the Apache Comments System responsibly. We can only provide
+this service to the community as long as it isn't misused.</p>
+
+<p>The comments are not for general Q&A.
+Comments should be pointed towards suggestions on improving the documentation
+or server. Questions on how to use Apache Tomcat should be directed
+to our <a href="https://tomcat.apache.org/lists.html">mailing lists</a>.</p>
+
+<p>Comments may be removed by moderators if they are either
+implemented or considered invalid/off-topic.</p>
+
+<p>HTML is not allowed in comments, and will just display as raw source code
+if attempted. Links that do not point to an Apache site (*.apache.org) will
+need approval by a moderator before the comment is visible to regular visitors.</p>
+
+</div><h3 id="License">License</h3><div class="text">
+
+<p>Any submitted comments must be contributed under the terms of the
+<a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
+
+</div><h3 id="Verified_Users">Verified Users</h3><div class="text">
+
+<p>Verified users gain the Apache feather next to their name,
+and may post comments with links in them without requiring approval
+by a moderator before the comments are shown. Being a verified user
+in itself does not give you moderating rights. If you are interested
+in becoming a verified user, please contact us on the
+<a href="https://tomcat.apache.org/lists.html#tomcat-users">users mailing list</a>.</p>
+
+<p>All ASF committers are automatically verified users.</p>
+
+</div><h3 id="Moderators">Moderators</h3><div class="text">
+
+<p>Moderators are allowed to mark comments as "Resolved", "Invalid"
+or "Sticky", remove marks, approve comments e.g. if they contain
+a link, and delete comments. Moderators can also subscribe to new
+comments and comment updates and use the dashboard to gain some
+overview over all comments of a site.</p>
+
+<p>To use the moderation features, you need to login to the comments
+system. Furthermore you will need to allow cookies to be set for
+comments.apache.org (this is done using a secure https cookie). Once
+logged in as a moderator you will see additional moderation
+options attached to each comment.</p>
+
+<p>If you are a long time follower of the Apache Tomcat projects
+and you are interested in becoming a moderator, please contact us on the
+<a href="https://tomcat.apache.org/lists.html#tomcat-users">users mailing list</a>.</p>
+
+</div><h3 id="Privacy_Policy">Privacy Policy</h3><div class="text">
+
+<p>No data except what you personally submit is kept on record.
+A cookie is used to keep track of moderators and other people
+who wish to create an account to avoid having to enter their
+credentials whenever they wish to post a comment.</p>
+
+<p>To prevent spam and unsolicited comments, we use a digest of
+visitors' IPs to keep track of comments posted by them.</p>
+
+<p>Entering an email address when you post a comment is completely
+optional, and will not be shared with anyone. If you enter an
+email address, it will be used to notify you when someone posts
+a reply to one of your comments, provided you have registered
+an account and validated your email address.</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/ajp.html b/web/tomcat/webapps/docs/config/ajp.html
new file mode 100644
index 0000000..a41c332
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/ajp.html
@@ -0,0 +1,766 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The AJP Connector</title><meta name="author" content="Yoav Shapira"><meta name="author" content="Andrew R. Jaquith"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The AJP Connector</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementations">Standard Implementations</a></li><li><a href="#Java_TCP_socket_attributes">Java TCP socket attributes</a></li><li><a href="#NIO_specific_configuration">NIO specific configuration</a></li><li><a href="#NIO2_specific_configuration">NIO2 specific configuration</a></li><li><a href="#APR/native_specific_configuration">APR/native specific configuration</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a><ol><li><a href="#Proxy_Support">Proxy Support</a></li><li><a href="#Connector_Comparison">Connector Comparison</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The <strong>AJP Connector</strong> element represents a
+ <strong>Connector</strong> component that communicates with a web
+ connector via the <code>AJP</code> protocol. This is used for cases
+ where you wish to invisibly integrate Tomcat into an existing (or new)
+ Apache installation, and you want Apache to handle the static content
+ contained in the web application, and/or utilize Apache's SSL
+ processing.</p>
+
+ <p>Use of the AJP protocol requires additional security considerations because
+ it allows greater direct manipulation of Tomcat's internal data structures
+ than the HTTP connectors. Particular attention should be paid to the values
+ used for the <code>address</code>, <code>secret</code>,
+ <code>secretRequired</code> and <code>allowedRequestAttributesPattern</code>
+ attributes.</p>
+
+ <p>This connector supports load balancing when used in conjunction with
+ the <code>jvmRoute</code> attribute of the
+ <a href="engine.html">Engine</a>.</p>
+
+ <p>The native connectors supported with this Tomcat release are:</p>
+ <ul>
+ <li>JK 1.2.x with any of the supported servers. See
+ <a href="https://tomcat.apache.org/connectors-doc/">the JK docs</a>
+ for details.</li>
+ <li>mod_proxy on Apache httpd 2.x (included by default in Apache HTTP
+ Server 2.2), with AJP enabled: see
+ <a href="https://httpd.apache.org/docs/2.2/mod/mod_proxy_ajp.html">the
+ httpd docs</a> for details.</li>
+ </ul>
+
+ <p><b>Other native connectors supporting AJP may work, but are no longer
+ supported.</b></p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>Connector</strong>
+ support the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">ajpFlush</code></td><td>
+ <p>A boolean value which can be used to enable or disable sending
+ AJP flush messages to the fronting proxy whenever an explicit
+ flush happens. The default value is <code>true</code>.<br>
+ An AJP flush message is a SEND_BODY_CHUNK packet with no body content.
+ Proxy implementations like mod_jk or mod_proxy_ajp will flush the
+ data buffered in the web server to the client when they receive
+ such a packet. Setting this to <code>false</code> can reduce
+ AJP packet traffic but might delay sending packets to the client.
+ At the end of the response, AJP does always flush to the client.</p>
+ </td></tr><tr><td><code class="attributeName">allowTrace</code></td><td>
+ <p>A boolean value which can be used to enable or disable the TRACE
+ HTTP method. If not specified, this attribute is set to false.</p>
+ </td></tr><tr><td><code class="attributeName">asyncTimeout</code></td><td>
+ <p>The default timeout for asynchronous requests in milliseconds. If not
+ specified, this attribute is set to the Servlet specification default of
+ 30000 (30 seconds).</p>
+ </td></tr><tr><td><code class="attributeName">enableLookups</code></td><td>
+ <p>Set to <code>true</code> if you want calls to
+ <code>request.getRemoteHost()</code> to perform DNS lookups in
+ order to return the actual host name of the remote client. Set
+ to <code>false</code> to skip the DNS lookup and return the IP
+ address in String form instead (thereby improving performance).
+ By default, DNS lookups are disabled.</p>
+ </td></tr><tr><td><code class="attributeName">encodedSolidusHandling</code></td><td>
+ <p>When set to <code>reject</code> request paths containing a
+ <code>%2f</code> sequence will be rejected with a 400 response. When set
+ to <code>decode</code> request paths containing a <code>%2f</code>
+ sequence will have that sequence decoded to <code>/</code> at the same
+ time other <code>%nn</code> sequences are decoded. When set to
+ <code>passthrough</code> request paths containing a <code>%2f</code>
+ sequence will be processed with the <code>%2f</code> sequence unchanged.
+ If not specified the default value is <code>reject</code>. This default
+ may be modified if the deprecated <a href="systemprops.html">system
+ property</a>
+ <code>org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH</code> is
+ set.</p>
+ </td></tr><tr><td><code class="attributeName">maxHeaderCount</code></td><td>
+ <p>The maximum number of headers in a request that are allowed by the
+ container. A request that contains more headers than the specified limit
+ will be rejected. A value of less than 0 means no limit.
+ If not specified, a default of 100 is used.</p>
+ </td></tr><tr><td><code class="attributeName">maxParameterCount</code></td><td>
+ <p>The maximum number of parameter and value pairs (GET plus POST) which
+ will be automatically parsed by the container. Parameter and value pairs
+ beyond this limit will be ignored. A value of less than 0 means no limit.
+ If not specified, a default of 10000 is used. Note that
+ <code>FailedRequestFilter</code> <a href="filter.html">filter</a> can be
+ used to reject requests that hit the limit.</p>
+ </td></tr><tr><td><code class="attributeName">maxPostSize</code></td><td>
+ <p>The maximum size in bytes of the POST which will be handled by
+ the container FORM URL parameter parsing. The limit can be disabled by
+ setting this attribute to a value less than zero. If not specified, this
+ attribute is set to 2097152 (2 megabytes). Note that the
+ <a href="filter.html#Failed_Request_Filter"><code>FailedRequestFilter</code></a>
+ can be used to reject requests that exceed this limit.</p>
+ </td></tr><tr><td><code class="attributeName">maxSavePostSize</code></td><td>
+ <p>The maximum size in bytes of the POST which will be saved/buffered by
+ the container during FORM or CLIENT-CERT authentication. For both types
+ of authentication, the POST will be saved/buffered before the user is
+ authenticated. For CLIENT-CERT authentication, the POST is buffered for
+ the duration of the SSL handshake and the buffer emptied when the request
+ is processed. For FORM authentication the POST is saved whilst the user
+ is re-directed to the login form and is retained until the user
+ successfully authenticates or the session associated with the
+ authentication request expires. The limit can be disabled by setting this
+ attribute to -1. Setting the attribute to zero will disable the saving of
+ POST data during authentication. If not specified, this attribute is set
+ to 4096 (4 kilobytes).</p>
+ </td></tr><tr><td><code class="attributeName">parseBodyMethods</code></td><td>
+ <p>A comma-separated list of HTTP methods for which request
+ bodies using <code>application/x-www-form-urlencoded</code> will be parsed
+ for request parameters identically to POST. This is useful in RESTful
+ applications that want to support POST-style semantics for PUT requests.
+ Note that any setting other than <code>POST</code> causes Tomcat
+ to behave in a way that goes against the intent of the servlet
+ specification.
+ The HTTP method TRACE is specifically forbidden here in accordance
+ with the HTTP specification.
+ The default is <code>POST</code></p>
+ </td></tr><tr><td><strong><code class="attributeName">port</code></strong></td><td>
+ <p>The TCP port number on which this <strong>Connector</strong>
+ will create a server socket and await incoming connections. Your
+ operating system will allow only one server application to listen
+ to a particular port number on a particular IP address. If the special
+ value of 0 (zero) is used, then Tomcat will select a free port at random
+ to use for this connector. This is typically only useful in embedded and
+ testing applications.</p>
+ </td></tr><tr><td><code class="attributeName">protocol</code></td><td>
+ <p>Sets the protocol to handle incoming traffic. To configure an AJP
+ connector this must be specified. If no value for protocol is provided,
+ an <a href="http.html">HTTP connector</a> rather than an AJP connector
+ will be configured.<br>
+ The standard protocol value for an AJP connector is <code>AJP/1.3</code>
+ which uses an auto-switching mechanism to select either a Java NIO based
+ connector or an APR/native based connector. If the
+ <code>PATH</code> (Windows) or <code>LD_LIBRARY_PATH</code> (on most unix
+ systems) environment variables contain the Tomcat native library, the
+ native/APR connector will be used. If the native library cannot be
+ found, the Java NIO based connector will be used.<br>
+ To use an explicit protocol rather than rely on the auto-switching
+ mechanism described above, the following values may be used:<br>
+ <code>org.apache.coyote.ajp.AjpNioProtocol</code>
+ - non blocking Java NIO connector.<br>
+ <code>org.apache.coyote.ajp.AjpNio2Protocol</code>
+ - non blocking Java NIO2 connector.<br>
+ <code>org.apache.coyote.ajp.AjpAprProtocol</code>
+ - the APR/native connector.<br>
+ Custom implementations may also be used.<br>
+ Take a look at our <a href="#Connector_Comparison">Connector
+ Comparison</a> chart.
+ </p>
+ </td></tr><tr><td><code class="attributeName">proxyName</code></td><td>
+ <p>If this <strong>Connector</strong> is being used in a proxy
+ configuration, configure this attribute to specify the server name
+ to be returned for calls to <code>request.getServerName()</code>.
+ See <a href="#Proxy_Support">Proxy Support</a> for more
+ information.</p>
+ </td></tr><tr><td><code class="attributeName">proxyPort</code></td><td>
+ <p>If this <strong>Connector</strong> is being used in a proxy
+ configuration, configure this attribute to specify the server port
+ to be returned for calls to <code>request.getServerPort()</code>.
+ See <a href="#Proxy_Support">Proxy Support</a> for more
+ information.</p>
+ </td></tr><tr><td><code class="attributeName">redirectPort</code></td><td>
+ <p>If this <strong>Connector</strong> is supporting non-SSL
+ requests, and a request is received for which a matching
+ <code><security-constraint></code> requires SSL transport,
+ Catalina will automatically redirect the request to the port
+ number specified here.</p>
+ </td></tr><tr><td><code class="attributeName">scheme</code></td><td>
+ <p>Set this attribute to the name of the protocol you wish to have
+ returned by calls to <code>request.getScheme()</code>. For
+ example, you would set this attribute to "<code>https</code>"
+ for an SSL Connector. The default value is "<code>http</code>".
+ </p>
+ </td></tr><tr><td><code class="attributeName">secure</code></td><td>
+ <p>Set this attribute to <code>true</code> if you wish to have
+ calls to <code>request.isSecure()</code> to return <code>true</code>
+ for requests received by this Connector. You would want this on an
+ SSL Connector or a non SSL connector that is receiving data from a
+ SSL accelerator, like a crypto card, an SSL appliance or even a webserver.
+ The default value is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">sendReasonPhrase</code></td><td>
+ <p>Set this attribute to <code>true</code> if you wish to have
+ a reason phrase in the response.
+ The default value is <code>false</code>.</p>
+ <p><strong>Note:</strong> This option is deprecated and will be removed
+ in Tomcat 9. The reason phrase will not be sent.</p>
+ </td></tr><tr><td><code class="attributeName">URIEncoding</code></td><td>
+ <p>This specifies the character encoding used to decode the URI bytes,
+ after %xx decoding the URL. If not specified, UTF-8 will be used unless
+ the <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code>
+ <a href="systemprops.html">system property</a> is set to <code>true</code>
+ in which case ISO-8859-1 will be used.</p>
+ </td></tr><tr><td><code class="attributeName">useBodyEncodingForURI</code></td><td>
+ <p>This specifies if the encoding specified in contentType should be used
+ for URI query parameters, instead of using the URIEncoding. This
+ setting is present for compatibility with Tomcat 4.1.x, where the
+ encoding specified in the contentType, or explicitly set using
+ Request.setCharacterEncoding method was also used for the parameters from
+ the URL. The default value is <code>false</code>.
+ </p>
+ <p><em>Notes:</em> See notes on this attribute in
+ <a href="http.html">HTTP Connector</a> documentation.</p>
+ </td></tr><tr><td><code class="attributeName">useIPVHosts</code></td><td>
+ <p>Set this attribute to <code>true</code> to cause Tomcat to use
+ the IP address passed by the native web server to determine the Host
+ to send the request to. The default value is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">xpoweredBy</code></td><td>
+ <p>Set this attribute to <code>true</code> to cause Tomcat to advertise
+ support for the Servlet specification using the header recommended in the
+ specification. The default value is <code>false</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Standard_Implementations">Standard Implementations</h4><div class="text">
+
+ <p>To use AJP, you must specify the protocol attribute (see above).</p>
+
+ <p>The standard AJP connectors (NIO, NIO2 and APR/native) all support the
+ following attributes in addition to the common Connector attributes listed
+ above.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">acceptCount</code></td><td>
+ <p>The maximum length of the operating system provided queue for incoming
+ connection requests when <code>maxConnections</code> has been reached. The
+ operating system may ignore this setting and use a different size for the
+ queue. When this queue is full, the operating system may actively refuse
+ additional connections or those connections may time out. The default
+ value is 100.</p>
+ </td></tr><tr><td><code class="attributeName">acceptorThreadCount</code></td><td>
+ <p>The number of threads to be used to accept connections. Increase this
+ value on a multi CPU machine, although you would never really need more
+ than <code>2</code>. Also, with a lot of non keep alive connections, you
+ might want to increase this value as well. Default value is
+ <code>1</code>.</p>
+ </td></tr><tr><td><code class="attributeName">acceptorThreadPriority</code></td><td>
+ <p>The priority of the acceptor threads. The threads used to accept
+ new connections. The default value is <code>5</code> (the value of the
+ <code>java.lang.Thread.NORM_PRIORITY</code> constant). See the JavaDoc
+ for the <code>java.lang.Thread</code> class for more details on what
+ this priority means.</p>
+ </td></tr><tr><td><code class="attributeName">address</code></td><td>
+ <p>For servers with more than one IP address, this attribute specifies
+ which address will be used for listening on the specified port. By
+ default, the connector will listen on the loopback address. Unless the JVM
+ is configured otherwise using system properties, the Java based connectors
+ (NIO, NIO2) will listen on both IPv4 and IPv6 addresses when configured
+ with either <code>0.0.0.0</code> or <code>::</code>. The APR/native
+ connector will only listen on IPv4 addresses if configured with
+ <code>0.0.0.0</code> and will listen on IPv6 addresses (and optionally
+ IPv4 addresses depending on the setting of <strong>ipv6v6only</strong>) if
+ configured with <code>::</code>.</p>
+ </td></tr><tr><td><code class="attributeName">allowedRequestAttributesPattern</code></td><td>
+ <p>The AJP protocol passes some information from the reverse proxy to the
+ AJP connector using request attributes. These attributes are:</p>
+ <ul>
+ <li>javax.servlet.request.cipher_suite</li>
+ <li>javax.servlet.request.key_size</li>
+ <li>javax.servlet.request.ssl_session</li>
+ <li>javax.servlet.request.X509Certificate</li>
+ <li>AJP_LOCAL_ADDR</li>
+ <li>AJP_REMOTE_PORT</li>
+ <li>AJP_SSL_PROTOCOL</li>
+ <li>JK_LB_ACTIVATION</li>
+ <li>CERT_ISSUER (IIS only)</li>
+ <li>CERT_SUBJECT (IIS only)</li>
+ <li>CERT_COOKIE (IIS only)</li>
+ <li>HTTPS_SERVER_SUBJECT (IIS only)</li>
+ <li>CERT_FLAGS (IIS only)</li>
+ <li>HTTPS_SECRETKEYSIZE (IIS only)</li>
+ <li>CERT_SERIALNUMBER (IIS only)</li>
+ <li>HTTPS_SERVER_ISSUER (IIS only)</li>
+ <li>HTTPS_KEYSIZE (IIS only)</li>
+ </ul>
+ <p>The AJP protocol supports the passing of arbitrary request attributes.
+ Requests containing arbitrary request attributes will be rejected with a
+ 403 response unless the entire attribute name matches this regular
+ expression. If not specified, the default value is <code>null</code>.</p>
+ </td></tr><tr><td><code class="attributeName">bindOnInit</code></td><td>
+ <p>Controls when the socket used by the connector is bound. By default it
+ is bound when the connector is initiated and unbound when the connector is
+ destroyed. If set to <code>false</code>, the socket will be bound when the
+ connector is started and unbound when it is stopped.</p>
+ </td></tr><tr><td><code class="attributeName">clientCertProvider</code></td><td>
+ <p>When client certificate information is presented in a form other than
+ instances of <code>java.security.cert.X509Certificate</code> it needs to
+ be converted before it can be used and this property controls which JSSE
+ provider is used to perform the conversion. For example it is used with
+ the AJP connectors, the <a href="http.html">HTTP APR connector</a> and
+ with the <a href="valve.html#SSL_Authenticator_Valve">
+ org.apache.catalina.valves.SSLValve</a>.If not specified, the default
+ provider will be used.</p>
+ </td></tr><tr><td><code class="attributeName">connectionLinger</code></td><td>
+ <p>The number of seconds during which the sockets used by this
+ <strong>Connector</strong> will linger when they are closed. The default
+ value is <code>-1</code> which disables socket linger.</p>
+ </td></tr><tr><td><code class="attributeName">connectionTimeout</code></td><td>
+ <p>The number of milliseconds this <strong>Connector</strong> will wait,
+ after accepting a connection, for the request URI line to be
+ presented. The default value for AJP protocol connectors
+ is <code>-1</code> (i.e. infinite).</p>
+ </td></tr><tr><td><code class="attributeName">executor</code></td><td>
+ <p>A reference to the name in an <a href="executor.html">Executor</a>
+ element. If this attribute is set, and the named executor exists, the
+ connector will use the executor, and all the other thread attributes will
+ be ignored. Note that if a shared executor is not specified for a
+ connector then the connector will use a private, internal executor to
+ provide the thread pool.</p>
+ </td></tr><tr><td><code class="attributeName">executorTerminationTimeoutMillis</code></td><td>
+ <p>The time that the private internal executor will wait for request
+ processing threads to terminate before continuing with the process of
+ stopping the connector. If not set, the default is <code>5000</code> (5
+ seconds).</p>
+ </td></tr><tr><td><code class="attributeName">keepAliveTimeout</code></td><td>
+ <p>The number of milliseconds this <strong>Connector</strong> will wait for
+ another AJP request before closing the connection.
+ The default value is to use the value that has been set for the
+ connectionTimeout attribute.</p>
+ </td></tr><tr><td><code class="attributeName">maxConnections</code></td><td>
+ <p>The maximum number of connections that the server will accept and
+ process at any given time. When this number has been reached, the server
+ will accept, but not process, one further connection. This additional
+ connection be blocked until the number of connections being processed
+ falls below <strong>maxConnections</strong> at which point the server will
+ start accepting and processing new connections again. Note that once the
+ limit has been reached, the operating system may still accept connections
+ based on the <code>acceptCount</code> setting. The default value varies by
+ connector type. For NIO and NIO2 the default is <code>10000</code>.
+ For APR/native, the default is <code>8192</code>.</p>
+ <p>For NIO/NIO2 only, setting the value to -1, will disable the
+ maxConnections feature and connections will not be counted.</p>
+ </td></tr><tr><td><code class="attributeName">maxCookieCount</code></td><td>
+ <p>The maximum number of cookies that are permitted for a request. A value
+ of less than zero means no limit. If not specified, a default value of 200
+ will be used.</p>
+ </td></tr><tr><td><code class="attributeName">maxThreads</code></td><td>
+ <p>The maximum number of request processing threads to be created
+ by this <strong>Connector</strong>, which therefore determines the
+ maximum number of simultaneous requests that can be handled. If
+ not specified, this attribute is set to 200. If an executor is associated
+ with this connector, this attribute is ignored as the connector will
+ execute tasks using the executor rather than an internal thread pool. Note
+ that if an executor is configured any value set for this attribute will be
+ recorded correctly but it will be reported (e.g. via JMX) as
+ <code>-1</code> to make clear that it is not used.</p>
+ </td></tr><tr><td><code class="attributeName">minSpareThreads</code></td><td>
+ <p>The minimum number of threads always kept running. This includes both
+ active and idle threads. If not specified, the default of <code>10</code>
+ is used. If an executor is associated with this connector, this attribute
+ is ignored as the connector will execute tasks using the executor rather
+ than an internal thread pool. Note that if an executor is configured any
+ value set for this attribute will be recorded correctly but it will be
+ reported (e.g. via JMX) as <code>-1</code> to make clear that it is not
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">packetSize</code></td><td>
+ <p>This attribute sets the maximum AJP packet size in Bytes. The maximum
+ value is 65536. It should be the same as the <code>max_packet_size</code>
+ directive configured for mod_jk. Normally it is not necessary to change
+ the maximum packet size. Problems with the default value have been
+ reported when sending certificates or certificate chains. The default
+ value is 8192. If set to less than 8192 then the setting will ignored and
+ the default value of 8192 used.</p>
+ </td></tr><tr><td><code class="attributeName">processorCache</code></td><td>
+ <p>The protocol handler caches Processor objects to speed up performance.
+ This setting dictates how many of these objects get cached.
+ <code>-1</code> means unlimited, default is <code>200</code>. If not using
+ Servlet 3.0 asynchronous processing, a good default is to use the same as
+ the maxThreads setting. If using Servlet 3.0 asynchronous processing, a
+ good default is to use the larger of maxThreads and the maximum number of
+ expected concurrent requests (synchronous and asynchronous).</p>
+ </td></tr><tr><td><code class="attributeName">secret</code></td><td>
+ <p>Only requests from workers with this secret keyword will be accepted.
+ The default value is <code>null</code>. This attribute must be specified
+ with a non-null, non-zero length value unless
+ <strong>secretRequired</strong> is explicitly configured to be
+ <code>false</code>. If this attribute is configured with a non-null,
+ non-zero length value then the workers <strong>must</strong> provide a
+ matching value else the request will be rejected irrespective of the
+ setting of <strong>secretRequired</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">secretRequired</code></td><td>
+ <p>If this attribute is <code>true</code>, the AJP Connector will only
+ start if the <strong>secret</strong> attribute is configured with a
+ non-null, non-zero length value. This attribute only controls whether
+ the <strong>secret</strong> attribute is required to be specified for the
+ AJP Connector to start. It <strong>does not</strong> control whether
+ workers are required to provide the secret. The default value is
+ <code>true</code>. This attribute should only be set to <code>false</code>
+ when the Connector is used on a trusted network.</p>
+ </td></tr><tr><td><code class="attributeName">tcpNoDelay</code></td><td>
+ <p>If set to <code>true</code>, the TCP_NO_DELAY option will be
+ set on the server socket, which improves performance under most
+ circumstances. This is set to <code>true</code> by default.</p>
+ </td></tr><tr><td><code class="attributeName">threadPriority</code></td><td>
+ <p>The priority of the request processing threads within the JVM.
+ The default value is <code>5</code> (the value of the
+ <code>java.lang.Thread.NORM_PRIORITY</code> constant). See the JavaDoc
+ for the <code>java.lang.Thread</code> class for more details on what
+ this priority means.If an executor is associated
+ with this connector, this attribute is ignored as the connector will
+ execute tasks using the executor rather than an internal thread pool. Note
+ that if an executor is configured any value set for this attribute will be
+ recorded correctly but it will be reported (e.g. via JMX) as
+ <code>-1</code> to make clear that it is not used.</p>
+ </td></tr><tr><td><code class="attributeName">tomcatAuthentication</code></td><td>
+ <p>If set to <code>true</code>, the authentication will be done in Tomcat.
+ Otherwise, the authenticated principal will be propagated from the native
+ webserver and used for authorization in Tomcat. </p>
+ <p>The web server must send the user principal (username) as a request
+ <i>attribute</i> named <code>REMOTE_USER</code>.</p>
+ <p>Note that this principal will have no roles associated with it.</p>
+ <p>The default value is <code>true</code>. If
+ <code>tomcatAuthorization</code> is set to <code>true</code> this
+ attribute has no effect.</p>
+ </td></tr><tr><td><code class="attributeName">tomcatAuthorization</code></td><td>
+ <p>If set to <code>true</code>, the authenticated principal will be
+ propagated from the native webserver and considered already authenticated
+ in Tomcat. If the web application has one or more security constraints,
+ authorization will then be performed by Tomcat and roles assigned to the
+ authenticated principal. If the appropriate Tomcat Realm for the request
+ does not recognise the provided user name, a Principal will be still be
+ created but it will have no roles. The default value is
+ <code>false</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Java_TCP_socket_attributes">Java TCP socket attributes</h4><div class="text">
+
+ <p>The NIO and NIO2 implementation support the following Java TCP socket
+ attributes in addition to the common Connector and HTTP attributes listed
+ above.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">socket.rxBufSize</code></td><td>
+ <p>(int)The socket receive buffer (SO_RCVBUF) size in bytes. JVM default
+ used if not set.</p>
+ </td></tr><tr><td><code class="attributeName">socket.txBufSize</code></td><td>
+ <p>(int)The socket send buffer (SO_SNDBUF) size in bytes. JVM default
+ used if not set. Care should be taken if explicitly setting this value.
+ Very poor performance has been observed on some JVMs with values less
+ than ~8k.</p>
+ </td></tr><tr><td><code class="attributeName">socket.tcpNoDelay</code></td><td>
+ <p>(bool)This is equivalent to standard attribute
+ <strong>tcpNoDelay</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">socket.soKeepAlive</code></td><td>
+ <p>(bool)Boolean value for the socket's keep alive setting
+ (SO_KEEPALIVE). JVM default used if not set.</p>
+ </td></tr><tr><td><code class="attributeName">socket.ooBInline</code></td><td>
+ <p>(bool)Boolean value for the socket OOBINLINE setting. JVM default
+ used if not set.</p>
+ </td></tr><tr><td><code class="attributeName">socket.soReuseAddress</code></td><td>
+ <p>(bool)Boolean value for the sockets reuse address option
+ (SO_REUSEADDR). JVM default used if not set.</p>
+ </td></tr><tr><td><code class="attributeName">socket.soLingerOn</code></td><td>
+ <p>(bool)Boolean value for the sockets so linger option (SO_LINGER).
+ A value for the standard attribute <strong>connectionLinger</strong>
+ that is >=0 is equivalent to setting this to <code>true</code>.
+ A value for the standard attribute <strong>connectionLinger</strong>
+ that is <0 is equivalent to setting this to <code>false</code>.
+ Both this attribute and <code>soLingerTime</code> must be set else the
+ JVM defaults will be used for both.</p>
+ </td></tr><tr><td><code class="attributeName">socket.soLingerTime</code></td><td>
+ <p>(int)Value in seconds for the sockets so linger option (SO_LINGER).
+ This is equivalent to standard attribute
+ <strong>connectionLinger</strong>.
+ Both this attribute and <code>soLingerOn</code> must be set else the
+ JVM defaults will be used for both.</p>
+ </td></tr><tr><td><code class="attributeName">socket.soTimeout</code></td><td>
+ <p>This is equivalent to standard attribute
+ <strong>connectionTimeout</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">socket.performanceConnectionTime</code></td><td>
+ <p>(int)The first value for the performance settings. See
+ <a href="http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)">Socket Performance Options</a>
+ All three performance attributes must be set else the JVM defaults will
+ be used for all three.</p>
+ </td></tr><tr><td><code class="attributeName">socket.performanceLatency</code></td><td>
+ <p>(int)The second value for the performance settings. See
+ <a href="http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)">Socket Performance Options</a>
+ All three performance attributes must be set else the JVM defaults will
+ be used for all three.</p>
+ </td></tr><tr><td><code class="attributeName">socket.performanceBandwidth</code></td><td>
+ <p>(int)The third value for the performance settings. See
+ <a href="http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)">Socket Performance Options</a>
+ All three performance attributes must be set else the JVM defaults will
+ be used for all three.</p>
+ </td></tr><tr><td><code class="attributeName">socket.unlockTimeout</code></td><td>
+ <p>(int) The timeout for a socket unlock. When a connector is stopped, it will try to release the acceptor thread by opening a connector to itself.
+ The default value is <code>250</code> and the value is in milliseconds</p>
+ </td></tr></table>
+ </div></div>
+
+ <div class="subsection"><h4 id="NIO_specific_configuration">NIO specific configuration</h4><div class="text">
+
+ <p>The following attributes are specific to the NIO connector.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">socket.directBuffer</code></td><td>
+ <p>(bool)Boolean value, whether to use direct ByteBuffers or java mapped
+ ByteBuffers. Default is <code>false</code>.<br>
+ When you are using direct buffers, make sure you allocate the
+ appropriate amount of memory for the direct memory space. On Sun's JDK
+ that would be something like <code>-XX:MaxDirectMemorySize=256m</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">socket.appReadBufSize</code></td><td>
+ <p>(int)Each connection that is opened up in Tomcat get associated with
+ a read ByteBuffer. This attribute controls the size of this buffer. By
+ default this read buffer is sized at <code>8192</code> bytes. For lower
+ concurrency, you can increase this to buffer more data. For an extreme
+ amount of keep alive connections, decrease this number or increase your
+ heap size.</p>
+ </td></tr><tr><td><code class="attributeName">socket.appWriteBufSize</code></td><td>
+ <p>(int)Each connection that is opened up in Tomcat get associated with
+ a write ByteBuffer. This attribute controls the size of this buffer. By
+ default this write buffer is sized at <code>8192</code> bytes. For low
+ concurrency you can increase this to buffer more response data. For an
+ extreme amount of keep alive connections, decrease this number or
+ increase your heap size.<br>
+ The default value here is pretty low, you should up it if you are not
+ dealing with tens of thousands concurrent connections.</p>
+ </td></tr><tr><td><code class="attributeName">socket.bufferPool</code></td><td>
+ <p>(int)The NIO connector uses a class called NioChannel that holds
+ elements linked to a socket. To reduce garbage collection, the NIO
+ connector caches these channel objects. This value specifies the size of
+ this cache. The default value is <code>500</code>, and represents that
+ the cache will hold 500 NioChannel objects. Other values are
+ <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p>
+ </td></tr><tr><td><code class="attributeName">socket.bufferPoolSize</code></td><td>
+ <p>(int)The NioChannel pool can also be size based, not used object
+ based. The size is calculated as follows:<br>
+ NioChannel
+ <code>buffer size = read buffer size + write buffer size</code><br>
+ SecureNioChannel <code>buffer size = application read buffer size +
+ application write buffer size + network read buffer size +
+ network write buffer size</code><br>
+ The value is in bytes, the default value is <code>1024*1024*100</code>
+ (100MB).</p>
+ </td></tr><tr><td><code class="attributeName">socket.processorCache</code></td><td>
+ <p>(int)Tomcat will cache SocketProcessor objects to reduce garbage
+ collection. The integer value specifies how many objects to keep in the
+ cache at most. The default is <code>500</code>. Other values are
+ <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p>
+ </td></tr><tr><td><code class="attributeName">socket.keyCache</code></td><td>
+ <p>(int)Tomcat will cache KeyAttachment objects to reduce garbage
+ collection. The integer value specifies how many objects to keep in the
+ cache at most. The default is <code>500</code>. Other values are
+ <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p>
+ </td></tr><tr><td><code class="attributeName">socket.eventCache</code></td><td>
+ <p>(int)Tomcat will cache PollerEvent objects to reduce garbage
+ collection. The integer value specifies how many objects to keep in the
+ cache at most. The default is <code>500</code>. Other values are
+ <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p>
+ </td></tr><tr><td><code class="attributeName">selectorPool.maxSelectors</code></td><td>
+ <p>(int)The max selectors to be used in the pool, to reduce selector
+ contention. Use this option when the command line
+ <code>org.apache.tomcat.util.net.NioSelectorShared</code> value is set
+ to false. Default value is <code>200</code>.</p>
+ </td></tr><tr><td><code class="attributeName">selectorPool.maxSpareSelectors</code></td><td>
+ <p>(int)The max spare selectors to be used in the pool, to reduce
+ selector contention. When a selector is returned to the pool, the system
+ can decide to keep it or let it be GC'd. Use this option when the
+ command line <code>org.apache.tomcat.util.net.NioSelectorShared</code>
+ value is set to false. Default value is <code>-1</code> (unlimited).</p>
+ </td></tr><tr><td><code class="attributeName">command-line-options</code></td><td>
+ <p>The following command line options are available for the NIO
+ connector:<br>
+ <code>-Dorg.apache.tomcat.util.net.NioSelectorShared=true|false</code>
+ - default is <code>true</code>. Set this value to <code>false</code> if you wish to
+ use a selector for each thread. When you set it to <code>false</code>, you can
+ control the size of the pool of selectors by using the
+ <strong>selectorPool.maxSelectors</strong> attribute.</p>
+ </td></tr></table>
+ </div></div>
+
+ <div class="subsection"><h4 id="NIO2_specific_configuration">NIO2 specific configuration</h4><div class="text">
+
+ <p>The following attributes are specific to the NIO2 connector.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">useCaches</code></td><td>
+ <p>(bool)Use this attribute to enable or disable object caching to
+ reduce the amount of GC objects produced.
+ The default value is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">socket.directBuffer</code></td><td>
+ <p>(bool)Boolean value, whether to use direct ByteBuffers or java mapped
+ ByteBuffers. Default is <code>false</code>.<br>
+ When you are using direct buffers, make sure you allocate the
+ appropriate amount of memory for the direct memory space. On Sun's JDK
+ that would be something like <code>-XX:MaxDirectMemorySize=256m</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">socket.appReadBufSize</code></td><td>
+ <p>(int)Each connection that is opened up in Tomcat get associated with
+ a read ByteBuffer. This attribute controls the size of this buffer. By
+ default this read buffer is sized at <code>8192</code> bytes. For lower
+ concurrency, you can increase this to buffer more data. For an extreme
+ amount of keep alive connections, decrease this number or increase your
+ heap size.</p>
+ </td></tr><tr><td><code class="attributeName">socket.appWriteBufSize</code></td><td>
+ <p>(int)Each connection that is opened up in Tomcat get associated with
+ a write ByteBuffer. This attribute controls the size of this buffer. By
+ default this write buffer is sized at <code>8192</code> bytes. For low
+ concurrency you can increase this to buffer more response data. For an
+ extreme amount of keep alive connections, decrease this number or
+ increase your heap size.<br>
+ The default value here is pretty low, you should up it if you are not
+ dealing with tens of thousands concurrent connections.</p>
+ </td></tr><tr><td><code class="attributeName">socket.bufferPoolSize</code></td><td>
+ <p>(int)The NIO2 connector uses a class called Nio2Channel that holds
+ elements linked to a socket. To reduce garbage collection, the NIO
+ connector caches these channel objects. This value specifies the size of
+ this cache. The default value is <code>500</code>, and represents that
+ the cache will hold 500 Nio2Channel objects. Other values are
+ <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p>
+ </td></tr><tr><td><code class="attributeName">socket.processorCache</code></td><td>
+ <p>(int)Tomcat will cache SocketProcessor objects to reduce garbage
+ collection. The integer value specifies how many objects to keep in the
+ cache at most. The default is <code>500</code>. Other values are
+ <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p>
+ </td></tr></table>
+ </div></div>
+
+ <div class="subsection"><h4 id="APR/native_specific_configuration">APR/native specific configuration</h4><div class="text">
+
+ <p>The APR/native implementation supports the following attributes in
+ addition to the common Connector and AJP attributes listed above.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">ipv6v6only</code></td><td>
+ <p>If listening on an IPv6 address on a dual stack system, should the
+ connector only listen on the IPv6 address? If not specified the default
+ is <code>false</code> and the connector will listen on the IPv6 address
+ and the equivalent IPv4 address if present.</p>
+ </td></tr><tr><td><code class="attributeName">pollTime</code></td><td>
+ <p>Duration of a poll call in microseconds. Lowering this value will
+ slightly decrease latency of connections being kept alive in some cases
+ , but will use more CPU as more poll calls are being made. The default
+ value is 2000 (2ms).
+ </p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+ <p>None at this time.</p>
+
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+
+ <div class="subsection"><h4 id="Proxy_Support">Proxy Support</h4><div class="text">
+
+ <p>The <code>proxyName</code> and <code>proxyPort</code> attributes can
+ be used when Tomcat is run behind a proxy server. These attributes
+ modify the values returned to web applications that call the
+ <code>request.getServerName()</code> and <code>request.getServerPort()</code>
+ methods, which are often used to construct absolute URLs for redirects.
+ Without configuring these attributes, the values returned would reflect
+ the server name and port on which the connection from the proxy server
+ was received, rather than the server name and port to whom the client
+ directed the original request.</p>
+
+ <p>For more information, see the
+ <a href="../proxy-howto.html">Proxy Support How-To</a>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Connector_Comparison">Connector Comparison</h4><div class="text">
+
+ <p>Below is a small chart that shows how the connectors differ.</p>
+
+ <table class="defaultTable" style="text-align: center;">
+ <tr>
+ <th></th>
+ <th style="text-align: center;">Java Nio Connector<br>NIO</th>
+ <th style="text-align: center;">Java Nio2 Connector<br>NIO2</th>
+ <th style="text-align: center;">APR/native Connector<br>APR</th>
+ </tr>
+ <tr>
+ <th>Classname</th>
+ <td><code class="noHighlight">AjpNioProtocol</code></td>
+ <td><code class="noHighlight">AjpNio2Protocol</code></td>
+ <td><code class="noHighlight">AjpAprProtocol</code></td>
+ </tr>
+ <tr>
+ <th>Tomcat Version</th>
+ <td>7.x onwards</td>
+ <td>8.x onwards</td>
+ <td>5.5.x onwards</td>
+ </tr>
+ <tr>
+ <th>Support Polling</th>
+ <td>YES</td>
+ <td>YES</td>
+ <td>YES</td>
+ </tr>
+ <tr>
+ <th>Polling Size</th>
+ <td><code class="noHighlight">maxConnections</code></td>
+ <td><code class="noHighlight">maxConnections</code></td>
+ <td><code class="noHighlight">maxConnections</code></td>
+ </tr>
+ <tr>
+ <th>Read Request Headers</th>
+ <td>Blocking</td>
+ <td>Blocking</td>
+ <td>Blocking</td>
+ </tr>
+ <tr>
+ <th>Read Request Body</th>
+ <td>Blocking</td>
+ <td>Blocking</td>
+ <td>Blocking</td>
+ </tr>
+ <tr>
+ <th>Write Response Headers and Body</th>
+ <td>Blocking</td>
+ <td>Blocking</td>
+ <td>Blocking</td>
+ </tr>
+ <tr>
+ <th>Wait for next Request</th>
+ <td>Non Blocking</td>
+ <td>Non Blocking</td>
+ <td>Non Blocking</td>
+ </tr>
+ <tr>
+ <th>Max Connections</th>
+ <td><code class="noHighlight">maxConnections</code></td>
+ <td><code class="noHighlight">maxConnections</code></td>
+ <td><code class="noHighlight">maxConnections</code></td>
+ </tr>
+ </table>
+
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/automatic-deployment.html b/web/tomcat/webapps/docs/config/automatic-deployment.html
new file mode 100644
index 0000000..346801e
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/automatic-deployment.html
@@ -0,0 +1,498 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - Automatic Deployment - Use cases</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Automatic Deployment - Use cases</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Key">Key</a></li><li><a href="#New_files">New files</a></li><li><a href="#Deleted_files">Deleted files</a></li><li><a href="#Modified_files">Modified files</a></li><li><a href="#Added_files">Added files</a></li><li><a href="#Notes">Notes</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>This page defines the expected behaviour of the automatic deployer in many
+ typical use cases. This is a complex area of Tomcat's functionality.
+ While any difference between this document and Tomcat's behaviour is a
+ bug, the fix may be to change this document, Tomcat's behaviour or
+ both.</p>
+
+</div><h3 id="Key">Key</h3><div class="text">
+
+ <table class="detail-table">
+ <tr>
+ <th>Term</th><th>Description</th>
+ </tr>
+ <tr>
+ <td>XML</td>
+ <td>An XML configuration file located in the Host's
+ <em>configBase</em>. It must contain a single <Context> element
+ and may contain optional nested elements. It does not define an
+ explicit <em>docBase</em> attribute. It represents a single web
+ application. It is often referred to as a context.xml file.</td>
+ </tr><tr>
+ <td>XML+EW</td>
+ <td>An XML configuration file located in the Host's
+ <em>configBase</em>. It must contain a single <Context> element
+ and may contain optional nested elements. It includes an explicit
+ <em>docBase</em> attribute that points to an external WAR. It
+ represents a single web application. It is often referred to as a
+ context.xml file.</td>
+ </tr><tr>
+ <td>XML+ED</td>
+ <td>An XML configuration file located in the Host's
+ <em>configBase</em>. It must contain a single <Context> element
+ and may contain optional nested elements. It includes an explicit
+ <em>docBase</em> attribute that points to an external directory. It
+ represents a single web application. It is often referred to as a
+ context.xml file.</td>
+ </tr><tr>
+ <td>WAR</td>
+ <td>A WAR file located in the Host's <em>appBase</em>. The WAR does
+ not include an embedded context.xml file.</td>
+ </tr><tr>
+ <td>WAR+XML</td>
+ <td>A WAR file located in the Host's <em>appBase</em>. The WAR does
+ include an embedded context.xml file.</td>
+ </tr><tr>
+ <td>DIR</td>
+ <td>A directory located in the Host's <em>appBase</em>. The directory
+ does not include an embedded context.xml file.</td>
+ </tr><tr>
+ <td>DIR+XML</td>
+ <td>A directory located in the Host's <em>appBase</em>. The directory
+ does include an embedded context.xml file.</td>
+ </tr><tr>
+ <td>redeploy</td>
+ <td>The Context object that represents the web application is destroyed
+ and a new Context object is created. If present and permitted by the
+ configuration, this new Context object is created by parsing the
+ context.xml file. The web.xml file is parsed during the application
+ start process. Any sessions stored in the standard Manager in the
+ default configuration will not be persisted. Any requests to the web
+ application during the redeploy will be handled as if the web
+ application is not deployed.</td>
+ </tr><tr>
+ <td>reload</td>
+ <td>The Context object that represents the web application is stopped and
+ then started. The web.xml file is parsed during the application start
+ process. Any sessions stored in the standard Manager in the default
+ configuration will not be persisted. Any requests to the web
+ application during the reload will be held until the reload completes
+ at which point they will continue using the reloaded web application.
+ </td>
+ </tr>
+ </table>
+
+</div><h3 id="New_files">New files</h3><div class="text">
+
+ <p>This section describes Tomcat's behaviour when the automatic
+ deployment process discovers a new web application.</p>
+
+ <table class="detail-table">
+ <tr>
+ <th rowspan="2">Starting artifact(s)</th>
+ <th colspan="3">Configuration Settings</th>
+ <th colspan="4">Result</th>
+ </tr>
+ <tr>
+ <th>deployXML</th><th>copyXML</th><th>unpackWARs</th>
+ <th>XML</th><th>WAR</th><th>DIR</th><th>Notes</th>
+ </tr>
+ <tr>
+ <td>XML</td>
+ <td>either</td><td>either</td><td>either</td>
+ <td>Y</td><td>N</td><td>N</td><td>1, 2, 3</td>
+ </tr>
+ <tr>
+ <td>XML+EW</td>
+ <td>either</td><td>either</td><td>false</td>
+ <td>Y</td><td>N</td><td>N</td><td>1</td>
+ </tr>
+ <tr>
+ <td>XML+EW</td>
+ <td>either</td><td>either</td><td>true</td>
+ <td>Y</td><td>N</td><td>Y</td><td>1</td>
+ </tr>
+ <tr>
+ <td>XML+ED</td>
+ <td>either</td><td>either</td><td>either</td>
+ <td>Y</td><td>N</td><td>N</td><td>1, 2</td>
+ </tr>
+ <tr>
+ <td>WAR+XML</td>
+ <td>false</td><td>either</td><td>false</td>
+ <td>N</td><td>Y</td><td>N</td><td>4</td>
+ </tr>
+ <tr>
+ <td>WAR+XML</td>
+ <td>false</td><td>either</td><td>true</td>
+ <td>N</td><td>Y</td><td>Y</td><td>4</td>
+ </tr>
+ <tr>
+ <td>WAR+XML</td>
+ <td>true</td><td>false</td><td>false</td>
+ <td>N</td><td>Y</td><td>N</td><td></td>
+ </tr>
+ <tr>
+ <td>WAR+XML</td>
+ <td>true</td><td>false</td><td>true</td>
+ <td>N</td><td>Y</td><td>Y</td><td></td>
+ </tr>
+ <tr>
+ <td>WAR+XML</td>
+ <td>true</td><td>true</td><td>false</td>
+ <td>Y</td><td>Y</td><td>N</td><td></td>
+ </tr>
+ <tr>
+ <td>WAR+XML</td>
+ <td>true</td><td>true</td><td>true</td>
+ <td>Y</td><td>Y</td><td>Y</td><td></td>
+ </tr>
+ <tr>
+ <td>WAR</td>
+ <td>either</td><td>either</td><td>false</td>
+ <td>N</td><td>Y</td><td>N</td><td></td>
+ </tr>
+ <tr>
+ <td>WAR</td>
+ <td>either</td><td>either</td><td>true</td>
+ <td>N</td><td>Y</td><td>Y</td><td></td>
+ </tr>
+ <tr>
+ <td>DIR+XML</td>
+ <td>false</td><td>either</td><td>either</td>
+ <td>N</td><td>N</td><td>Y</td><td>4</td>
+ </tr>
+ <tr>
+ <td>DIR+XML</td>
+ <td>true</td><td>false</td><td>either</td>
+ <td>N</td><td>N</td><td>Y</td><td></td>
+ </tr>
+ <tr>
+ <td>DIR+XML</td>
+ <td>true</td><td>true</td><td>either</td>
+ <td>Y</td><td>N</td><td>Y</td><td></td>
+ </tr>
+ <tr>
+ <td>DIR</td>
+ <td>false</td><td>either</td><td>either</td>
+ <td>N</td><td>N</td><td>Y</td><td></td>
+ </tr>
+ </table>
+
+</div><h3 id="Deleted_files">Deleted files</h3><div class="text">
+
+ <p>This section describes Tomcat's behaviour when the automatic
+ deployment process detects that a web application file has been deleted.</p>
+
+ <p>When a file is deleted or modified any redeploy resources that are listed
+ after the modified/deleted resource are themselves deleted (and possibly
+ re-created). The order of redeploy resources is:</p>
+
+ <ol>
+ <li>WAR</li>
+ <li>DIR</li>
+ <li>XML</li>
+ <li>global resources</li>
+ </ol>
+
+ <p>There are some exceptions to the deletion rule above:</p>
+
+ <ul>
+ <li>global resources are never deleted</li>
+ <li>external resources are never deleted</li>
+ <li>if the WAR or DIR has been modified then the XML file is only deleted if
+ <em>copyXML</em> is <code>true</code> and <em>deployXML</em> is
+ <code>true</code></li>
+ </ul>
+
+ <p>In the following table:</p>
+
+ <ul>
+ <li>'-' means "unchanged from not present". i.e. the artifact wasn't present
+ before the change and isn't present after it either. '-' rather than 'N'
+ is used to focus attention on what changes.</li>
+ <li>'R' means that the directory is re-created by expanding the WAR file.
+ This will only happen if <em>unpackWARs</em> is <code>true</code>.</li>
+ <li>'XW' means that the if the WAR contains a META-INF/context.xml file it
+ will be extracted and placed in the Host's <em>configBase</em>.
+ This only happens if <em>copyXML</em> is <code>true</code> and
+ <em>deployXML</em> is <code>true</code>.</li>
+ <li>'XD' means that the if the directory contains a META-INF/context.xml
+ file it will be copied to the Host's <em>configBase</em>. This only
+ happens if <em>copyXML</em> is <code>true</code> and <em>deployXML</em>
+ is <code>true</code>.</li>
+ </ul>
+
+ <table class="detail-table">
+ <tr>
+ <th colspan="3">Artifacts present</th>
+ <th rowspan="2">Artifact removed</th>
+ <th colspan="4">Artifacts remaining</th>
+ </tr>
+ <tr>
+ <th>XML</th><th>WAR</th><th>DIR</th>
+ <th>XML</th><th>WAR</th><th>DIR</th><th>Notes</th>
+ </tr>
+ <tr>
+ <td>N</td><td>N</td><td>Y</td>
+ <td>DIR</td>
+ <td>-</td><td>-</td><td>N</td><td></td>
+ </tr>
+ <tr>
+ <td>N</td><td>Y</td><td>N</td>
+ <td>WAR</td>
+ <td>-</td><td>N</td><td>-</td><td></td>
+ </tr>
+ <tr>
+ <td>N</td><td>Y</td><td>Y</td>
+ <td>DIR</td>
+ <td>-</td><td>Y</td><td>R</td><td></td>
+ </tr>
+ <tr>
+ <td>N</td><td>Y</td><td>Y</td>
+ <td>WAR</td>
+ <td>-</td><td>N</td><td>N</td><td></td>
+ </tr>
+ <tr>
+ <td>Y</td><td>N</td><td>N</td>
+ <td>XML</td>
+ <td>N</td><td>-</td><td>-</td><td></td>
+ </tr>
+ <tr>
+ <td>Y</td><td>N</td><td>Y</td>
+ <td>DIR</td>
+ <td>N</td><td>-</td><td>N</td><td>5</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>N</td><td>Y</td>
+ <td>XML</td>
+ <td>XD</td><td>-</td><td>Y</td><td></td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y</td><td>N</td>
+ <td>WAR</td>
+ <td>N</td><td>N</td><td>-</td><td>5</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y</td><td>N</td>
+ <td>XML</td>
+ <td>XW</td><td>Y</td><td>-</td><td></td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y</td><td>Y</td>
+ <td>DIR</td>
+ <td>XW</td><td>Y</td><td>R</td><td></td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y</td><td>Y</td>
+ <td>WAR</td>
+ <td>N</td><td>N</td><td>N</td><td></td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y</td><td>Y</td>
+ <td>XML</td>
+ <td>XW</td><td>Y</td><td>Y</td><td></td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y (external)</td><td>N</td>
+ <td>WAR</td>
+ <td>Y</td><td>N</td><td>-</td><td>3</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y (external)</td><td>N</td>
+ <td>XML</td>
+ <td>N</td><td>Y (external)</td><td>-</td><td>6</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>N</td><td>Y (external)</td>
+ <td>DIR</td>
+ <td>Y</td><td>-</td><td>N</td><td>3</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>N</td><td>Y (external)</td>
+ <td>XML</td>
+ <td>N</td><td>-</td><td>Y (external)</td><td>6</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y (external)</td><td>Y</td>
+ <td>DIR</td>
+ <td>Y</td><td>Y (external)</td><td>R</td><td></td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y (external)</td><td>Y</td>
+ <td>WAR</td>
+ <td>Y</td><td>N</td><td>N</td><td>3</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y (external)</td><td>Y</td>
+ <td>XML</td>
+ <td>N</td><td>Y (external)</td><td>N</td><td>6</td>
+ </tr>
+ </table>
+
+</div><h3 id="Modified_files">Modified files</h3><div class="text">
+
+ <p>This section describes Tomcat's behaviour when the automatic
+ deployment process detects that a web application file has been modified.</p>
+
+ <p>In the following table:</p>
+
+ <ul>
+ <li>'-' means "unchanged from not present". i.e. the artifact wasn't present
+ before the change and isn't present after it either. '-' rather than 'N'
+ is used to focus attention on what changes.</li>
+ <li>'M' means that the artifact has been modified.</li>
+ <li>'R' means that the directory is deleted and re-created by expanding the
+ WAR file. This will only happen if <em>unpackWARs</em> is
+ <code>true</code>.</li>
+ </ul>
+
+ <table class="detail-table">
+ <tr>
+ <th colspan="3">Artifacts present</th>
+ <th rowspan="2">Artifact modified</th>
+ <th colspan="4">Artifacts remaining</th>
+ </tr>
+ <tr>
+ <th>XML</th><th>WAR</th><th>DIR</th>
+ <th>XML</th><th>WAR</th><th>DIR</th><th>Action</th>
+ </tr>
+ <tr>
+ <td>N</td><td>N</td><td>Y</td>
+ <td>DIR</td>
+ <td>-</td><td>-</td><td>M</td><td>None</td>
+ </tr>
+ <tr>
+ <td>N</td><td>Y</td><td>N</td>
+ <td>WAR</td>
+ <td>-</td><td>M</td><td>-</td><td>Redeploy</td>
+ </tr>
+ <tr>
+ <td>N</td><td>Y</td><td>Y</td>
+ <td>DIR</td>
+ <td>-</td><td>Y</td><td>M</td><td>None</td>
+ </tr>
+ <tr>
+ <td>N</td><td>Y</td><td>Y</td>
+ <td>WAR</td>
+ <td>-</td><td>M</td><td>R</td><td>Redeploy</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>N</td><td>N</td>
+ <td>XML</td>
+ <td>M</td><td>-</td><td>-</td><td>Redeploy</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>N</td><td>Y</td>
+ <td>DIR</td>
+ <td>Y</td><td>-</td><td>M</td><td>None</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>N</td><td>Y</td>
+ <td>XML</td>
+ <td>M</td><td>-</td><td>Y</td><td>Redeploy</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y</td><td>N</td>
+ <td>WAR</td>
+ <td>Y</td><td>M</td><td>-</td><td>Reload</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y</td><td>N</td>
+ <td>XML</td>
+ <td>M</td><td>Y</td><td>-</td><td>Redeploy</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y</td><td>Y</td>
+ <td>DIR</td>
+ <td>Y</td><td>Y</td><td>M</td><td>None</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y</td><td>Y</td>
+ <td>WAR</td>
+ <td>Y</td><td>M</td><td>R</td><td>Reload</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y</td><td>Y</td>
+ <td>XML</td>
+ <td>M</td><td>Y</td><td>Y</td><td>Redeploy</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y(external)</td><td>N</td>
+ <td>WAR</td>
+ <td>Y</td><td>M(external)</td><td>-</td><td>Reload</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y(external)</td><td>N</td>
+ <td>XML</td>
+ <td>M</td><td>Y(external)</td><td>-</td><td>Redeploy</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>N</td><td>Y(external)</td>
+ <td>DIR</td>
+ <td>Y</td><td>-</td><td>M(external)</td><td>None</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>N</td><td>Y(external)</td>
+ <td>XML</td>
+ <td>M</td><td>-</td><td>Y(external)</td><td>Redeploy</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y(external)</td><td>Y</td>
+ <td>DIR</td>
+ <td>Y</td><td>Y(external)</td><td>M</td><td>None</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y(external)</td><td>Y</td>
+ <td>WAR</td>
+ <td>Y</td><td>M(external)</td><td>R</td><td>Reload</td>
+ </tr>
+ <tr>
+ <td>Y</td><td>Y(external)</td><td>Y</td>
+ <td>XML</td>
+ <td>M</td><td>Y(external)</td><td>Y</td><td>Redeploy</td>
+ </tr>
+ </table>
+
+</div><h3 id="Added_files">Added files</h3><div class="text">
+
+ <p>This is treated as if the added file has been modified with the following
+ additional actions:</p>
+
+ <ul>
+ <li>If a WAR is added, any DIR is removed and may be recreated depending on
+ <em>unpackWARs</em>.</li>
+ <li>If an XML file is added that refers to an external <em>docBase</em> any
+ WAR or DIR in the appBase will be removed. The DIR may be recreated if
+ the external resource is a WAR and <em>unpackWARs</em> is true.</li>
+ <li>If a DIR is added when a WAR already exists and <em>unpackWARs</em> is
+ <code>false</code>, the DIR will be ignored but a warning will be
+ logged when the DIR is first detected. If the WAR is removed, the DIR
+ will be left and may be deployed via automatic deployment.</li>
+ <li>If a WAR is added to the <em>appBase</em> when an external WAR already
+ exists, the WAR in the <em>appBase</em> will be ignored but a warning
+ will be logged when the WAR in the <em>appBase</em> is first detected.
+ If the external WAR is removed, the WAR in the <em>appBase</em> will be
+ left and may be deployed via automatic deployment.</li>
+ <li>If an XML file is added to the META-INF directory of an application
+ deployed from that DIR, the application will always be redeployed. The
+ result will be the same as for a new deployment.</li>
+ </ul>
+
+</div><h3 id="Notes">Notes</h3><div class="text">
+
+ <ol>
+ <li><em>deployXML</em> and <em>copyXML</em> are ignored since an XML file
+ was discovered in the <em>configBase</em>.</li>
+ <li><em>unpackWARs</em> is ignored since there is no WAR file.</li>
+ <li>The context will fail to start because there is no content in the
+ expected <em>docBase</em>.</li>
+ <li>The web application fails to deploy because it contains an embedded
+ META-INF/context.xml, <em>deployXML</em> is <code>false</code> and an
+ XML has not been provided in the <em>configBase</em>.</li>
+ <li>The XML file is only deleted if <em>copyXML</em> is <code>true</code>
+ and <em>deployXML</em> is <code>true</code>.</li>
+ <li>Although the external resource is still present, the web application is
+ fully undeployed as Tomcat has no knowledge of the external resource.
+ </li>
+ </ol>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/cluster-channel.html b/web/tomcat/webapps/docs/config/cluster-channel.html
new file mode 100644
index 0000000..9b60ed0
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/cluster-channel.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Cluster Channel object</title><meta name="author" content="Filip Hanik"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Cluster Channel object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#org.apache.catalina.tribes.group.GroupChannel_Attributes">org.apache.catalina.tribes.group.GroupChannel Attributes</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ The cluster channel is the main component of a small framework we've nicknamed Apache Tribes.<br>
+ The channel manages a set of sub components and together they create a group communication framework.<br>
+ This framework is then used internally by the components that need to send messages between different Tomcat instances.
+ <br>
+ A few examples of these components would be the SimpleTcpCluster that does the messaging for the DeltaManager,
+ or the BackupManager that uses a different replication strategy. The ReplicatedContext object does also
+ use the channel object to communicate context attribute changes.
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+ <p><b><a href="cluster-membership.html">Channel/Membership</a>:</b> <br>
+ The Membership component is responsible for auto discovering new nodes in the cluster
+ and also to provide for notifications for any nodes that have not responded with a heartbeat.
+ The default implementation uses multicast.<br>
+ In the membership component you configure how your nodes, aka. members, are to be discovered and/or
+ divided up.
+ You can always find out more about <a href="../tribes/introduction.html">Apache Tribes</a>
+ </p>
+ <p><b><a href="cluster-sender.html">Channel/Sender</a>:</b> <br>
+ The Sender component manages all outbound connections and data messages that are sent
+ over the network from one node to another.
+ This component allows messages to be sent in parallel.
+ The default implementation uses TCP client sockets, and socket tuning for outgoing messages are
+ configured here.<br>
+ You can always find out more about <a href="../tribes/introduction.html">Apache Tribes</a>
+ </p>
+ <p><b><a href="cluster-sender.html#transport">Channel/Sender/Transport</a>:</b> <br>
+ The Transport component is the bottom IO layer for the sender component.
+ The default implementation uses non-blocking TCP client sockets.<br>
+ You can always find out more about <a href="../tribes/introduction.html">Apache Tribes</a>
+ </p>
+ <p><b><a href="cluster-receiver.html">Channel/Receiver</a>:</b> <br>
+ The receiver component listens for messages from other nodes.
+ Here you will configure the cluster thread pool, as it will dispatch incoming
+ messages to a thread pool for faster processing.
+ The default implementation uses non-blocking TCP server sockets.<br>
+ You can always find out more about <a href="../tribes/introduction.html">Apache Tribes</a>
+ </p>
+ <p><b><a href="cluster-interceptor.html">Channel/Interceptor</a>:</b> <br>
+ The channel will send messages through an interceptor stack. Because of this, you have the ability to
+ customize the way messages are sent and received, and even how membership is handled.<br>
+ You can always find out more about <a href="../tribes/introduction.html">Apache Tribes</a>
+ </p>
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ The default value here is <code>org.apache.catalina.tribes.group.GroupChannel</code> and is
+ currently the only implementation available.
+ </td></tr></table>
+
+
+ </div></div>
+
+ <div class="subsection"><h4 id="org.apache.catalina.tribes.group.GroupChannel_Attributes">org.apache.catalina.tribes.group.GroupChannel Attributes</h4><div class="text">
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">heartbeat</code></td><td>
+ Flag whether the channel manages its own heartbeat.
+ If set to true, the channel start a local thread for the heart beat.
+ If set this flag to false, you must set SimpleTcpCluster#heartbeatBackgroundEnabled
+ to true. default value is true.
+ </td></tr><tr><td><code class="attributeName">heartbeatSleeptime</code></td><td>
+ If heartbeat == true, specifies the interval of heartbeat thread in milliseconds.
+ The default is 5000 (5 seconds).
+ </td></tr><tr><td><code class="attributeName">optionCheck</code></td><td>
+ If set to true, the GroupChannel will check the option flags that each
+ interceptor is using. Reports an error if two interceptor share the same
+ flag. The default is false.
+ </td></tr><tr><td><code class="attributeName">jmxEnabled</code></td><td>
+ Flag whether the channel components register with JMX or not.
+ The default value is true.
+ </td></tr><tr><td><code class="attributeName">jmxDomain</code></td><td>
+ if <code>jmxEnabled</code> set to true, specifies the jmx domain which
+ this channel should be registered. The ClusterChannel is used as the
+ default value.
+ </td></tr><tr><td><code class="attributeName">jmxPrefix</code></td><td>
+ if <code>jmxEnabled</code> set to true, specifies the jmx prefix which
+ will be used with channel ObjectName.
+ </td></tr></table>
+
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/cluster-deployer.html b/web/tomcat/webapps/docs/config/cluster-deployer.html
new file mode 100644
index 0000000..1469363
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/cluster-deployer.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Cluster Deployer object</title><meta name="author" content="Filip Hanik"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Cluster Deployer object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#org.apache.catalina.ha.deploy.FarmWarDeployer">org.apache.catalina.ha.deploy.FarmWarDeployer</a><ol><li><a href="#Attributes">Attributes</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>The Farm War Deployer can deploy and undeploy web applications on the other
+ nodes in the cluster.</p>
+ <p><strong>Note:</strong> FarmWarDeployer can be configured at host level
+ cluster only.
+ </p>
+</div><h3 id="org.apache.catalina.ha.deploy.FarmWarDeployer">org.apache.catalina.ha.deploy.FarmWarDeployer</h3><div class="text">
+
+ <div class="subsection"><h4 id="Attributes">Attributes</h4><div class="text">
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ The cluster deployer class, currently only one is available,
+ <code>org.apache.catalina.ha.deploy.FarmWarDeployer.</code>
+ </td></tr><tr><td><strong><code class="attributeName">deployDir</code></strong></td><td>
+ Deployment directory. This is the pathname of a directory where deploy
+ the web applications. You may specify an absolute pathname, or a
+ pathname that is relative to the $CATALINA_BASE directory. In the
+ current implementation, this attribute must be the same value as the
+ <strong>Host's appBase</strong>.
+ </td></tr><tr><td><strong><code class="attributeName">tempDir</code></strong></td><td>
+ The temporaryDirectory to store binary data when downloading a war from
+ the cluster. You may specify an absolute pathname, or a pathname that is
+ relative to the $CATALINA_BASE directory.
+ </td></tr><tr><td><code class="attributeName">watchDir</code></td><td>
+ This is the pathname of a directory where watch for changes(add/modify/remove)
+ of web applications. You may specify an absolute pathname, or a pathname
+ that is relative to the $CATALINA_BASE directory.
+ <strong>Note: </strong> if <strong>watchEnabled</strong> is false, this
+ attribute will have no effect.
+ </td></tr><tr><td><code class="attributeName">watchEnabled</code></td><td>
+ Set to true if you want to watch for changes of web applications.
+ Only when this attribute set to true, you can trigger a deploy/undeploy
+ of web applications. The flag's value defaults to false.
+ </td></tr><tr><td><code class="attributeName">processDeployFrequency</code></td><td>
+ Frequency of the Farm watchDir check. Cluster wide deployment will be
+ done once for the specified amount of backgroundProcess calls (ie, the
+ lower the amount, the most often the checks will occur). The minimum
+ value is 1, and the default value is 2.
+ <strong>Note: </strong> if <strong>watchEnabled</strong> is false, this
+ attribute will have no effect.
+ </td></tr><tr><td><code class="attributeName">maxValidTime</code></td><td>
+ The maximum valid time(in seconds) of FileMessageFactory.
+ FileMessageFactory will be removed immediately after receiving the
+ complete WAR file but when failing to receive a FileMessage which was
+ sent dividing, FileMessageFactory will leak without being removed.
+ FileMessageFactory that is leaking will be automatically removed after
+ maxValidTime. If a negative value specified, FileMessageFactory will
+ never be removed. If the attribute is not provided, a default of 300
+ seconds (5 minutes) is used.
+ </td></tr></table>
+
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/cluster-interceptor.html b/web/tomcat/webapps/docs/config/cluster-interceptor.html
new file mode 100644
index 0000000..887e6f8
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/cluster-interceptor.html
@@ -0,0 +1,275 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Channel Interceptor object</title><meta name="author" content="Filip Hanik"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Channel Interceptor object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Available_Interceptors">Available Interceptors</a></li><li><a href="#Static_Membership">Static Membership</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#org.apache.catalina.tribes.group.interceptors.DomainFilterInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.DomainFilterInterceptor Attributes</a></li><li><a href="#org.apache.catalina.tribes.group.interceptors.FragmentationInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.FragmentationInterceptor Attributes</a></li><li><a href="#org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor Attributes</a></li><li><a href="#org.apache.catalina.tribes.group.interceptors.TcpFailureDetector_Attributes">org.apache.catalina.tribes.group.interceptors.TcpFailureDetector Attributes</a></li><li><a href="#org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor Attributes</a></li><li><a href="#org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor Attributes</a></li><li><a href="#org.apache.catalina.tribes.group.interceptors.EncryptInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.EncryptInterceptor Attributes</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a><ol><li><a href="#StaticMember_Attributes">StaticMember Attributes</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>
+ Apache Tribes supports an interceptor architecture to intercept both messages and membership notifications.
+ This architecture allows decoupling of logic and opens the way for some very useful feature add ons.
+ </p>
+</div><h3 id="Available_Interceptors">Available Interceptors</h3><div class="text">
+ <ul>
+ <li><code>org.apache.catalina.tribes.group.interceptors.TcpFailureDetector</code></li>
+ <li><code>org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor</code></li>
+ <li><code>org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor</code></li>
+ <li><code>org.apache.catalina.tribes.group.interceptors.NonBlockingCoordinator</code></li>
+ <li><code>org.apache.catalina.tribes.group.interceptors.OrderInterceptor</code></li>
+ <li><code>org.apache.catalina.tribes.group.interceptors.SimpleCoordinator</code></li>
+ <li><code>org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor</code></li>
+ <li><code>org.apache.catalina.tribes.group.interceptors.TwoPhaseCommitInterceptor</code></li>
+ <li><code>org.apache.catalina.tribes.group.interceptors.DomainFilterInterceptor</code></li>
+ <li><code>org.apache.catalina.tribes.group.interceptors.FragmentationInterceptor</code></li>
+ <li><code>org.apache.catalina.tribes.group.interceptors.GzipInterceptor</code></li>
+ <li><code>org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor</code></li>
+ <li><code>org.apache.catalina.tribes.group.interceptors.EncryptInterceptor</code></li>
+ </ul>
+</div><h3 id="Static_Membership">Static Membership</h3><div class="text">
+ <p>
+ In addition to dynamic discovery, Apache Tribes also supports static membership, with membership verification.
+ To achieve this add the <code>org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor</code>
+ after the <code>org.apache.catalina.tribes.group.interceptors.TcpFailureDetector</code> interceptor.
+ Inside the <code>StaticMembershipInterceptor</code> you can add the static members you wish to have.
+ The <code>TcpFailureDetector</code> will do a health check on the static members,and also monitor them for crashes
+ so they will have the same level of notification mechanism as the members that are automatically discovered.</p>
+ <div class="codeBox"><pre><code> <Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
+ <LocalMember className="org.apache.catalina.tribes.membership.StaticMember"
+ domain="staging-cluster"
+ uniqueId="{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,1}"/>
+ <Member className="org.apache.catalina.tribes.membership.StaticMember"
+ port="5678"
+ securePort="-1"
+ host="tomcat01.mydomain.com"
+ domain="staging-cluster"
+ uniqueId="{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}"/>
+ </Interceptor></code></pre></div>
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ Required, as there is no default
+ </td></tr><tr><td><code class="attributeName">optionFlag</code></td><td>
+ If you want the interceptor to trigger on certain message depending on the message's option flag,
+ you can setup the interceptors flag here.
+ The default value is <code>0</code>, meaning this interceptor will trigger on all messages.
+ </td></tr></table>
+ </div></div>
+
+ <div class="subsection"><h4 id="org.apache.catalina.tribes.group.interceptors.DomainFilterInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.DomainFilterInterceptor Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">domain</code></strong></td><td>
+ The logical cluster domain that this Interceptor accepts.
+ Two different type of values are possible:<br>
+ 1. Regular string values like "staging-domain" or "tomcat-cluster" will be converted into bytes
+ using ISO-8859-1 encoding.<br>
+ 2. byte array in string form, for example {216,123,12,3}<br>
+ </td></tr><tr><td><code class="attributeName">logInterval</code></td><td>
+ This value indicates the interval for logging for messages from different domains.
+ The default is 100, which means that to log per 100 messages.
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.catalina.tribes.group.interceptors.FragmentationInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.FragmentationInterceptor Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">expire</code></td><td>
+ How long do we keep the fragments in memory and wait for the rest to arrive.
+ The default is 60000 ms.
+ </td></tr><tr><td><code class="attributeName">maxSize</code></td><td>
+ The maximum message size in bytes. If the message size exceeds this value, this interceptor fragments the message and sends them.
+ If it is less than this value, this interceptor does not fragment the message and sent in as one message. The default is 1024*100.
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">optionFlag</code></td><td>
+ The default and hard coded value is <code>8 (org.apache.catalina.tribes.Channel.SEND_OPTIONS_ASYNCHRONOUS)</code>.
+ The dispatcher will trigger on this value only, as it is predefined by Tribes.
+ </td></tr><tr><td><code class="attributeName">alwaysSend</code></td><td>
+ What behavior should be executed when the dispatch queue is full. If <code>true</code> (default), then the message is
+ is sent synchronously, if <code>false</code> an error is thrown.
+ </td></tr><tr><td><code class="attributeName">maxQueueSize</code></td><td>
+ Size in bytes of the dispatch queue, the default value is <code> 1024*1024*64 (64MB)</code> sets the maximum queue size for the dispatch queue
+ if the queue fills up, one can trigger the behavior, if <code>alwaysSend</code> is set to true, the message will be sent synchronously
+ if the flag is false, an error is thrown
+ </td></tr><tr><td><code class="attributeName">maxThreads</code></td><td>
+ The maximum number of threads in this pool, default is 10.
+ </td></tr><tr><td><code class="attributeName">maxSpareThreads</code></td><td>
+ The number of threads to keep in the pool, default is 2.
+ </td></tr><tr><td><code class="attributeName">keepAliveTime</code></td><td>
+ Maximum number of milliseconds of until Idle thread terminates. Default value is 5000(5 seconds).
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector_Attributes">org.apache.catalina.tribes.group.interceptors.TcpFailureDetector Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">connectTimeout</code></td><td>
+ Specifies the timeout, in milliseconds, to use when attempting a TCP connection
+ to the suspect node. Default is 1000.
+ </td></tr><tr><td><code class="attributeName">performSendTest</code></td><td>
+ If true is set, send a test message to the suspect node. Default is true.
+ </td></tr><tr><td><code class="attributeName">performReadTest</code></td><td>
+ If true is set, read the response of the test message that sent. Default is false.
+ <strong>Note:</strong> if <code>performSendTest</code> is false, this attribute will have no effect.
+ </td></tr><tr><td><code class="attributeName">readTestTimeout</code></td><td>
+ Specifies the timeout, in milliseconds, to use when performing a read test
+ to the suspicious node. Default is 5000.
+ </td></tr><tr><td><code class="attributeName">removeSuspectsTimeout</code></td><td>
+ The maximum time(in seconds) for remove from removeSuspects. Member of
+ removeSuspects will be automatically removed after removeSuspectsTimeout.
+ If a negative value specified, the removeSuspects members never be
+ removed until disappeared really. If the attribute is not provided,
+ a default of 300 seconds (5 minutes) is used.
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">interval</code></td><td>
+ If useThread == true, defines the interval of sending a ping message.
+ default is 1000 ms.
+ </td></tr><tr><td><code class="attributeName">useThread</code></td><td>
+ Flag of whether to start a thread for sending a ping message.
+ If set to true, this interceptor will start a local thread for sending a ping message.
+ if set to false, channel heartbeat will send a ping message.
+ default is false.
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">interval</code></td><td>
+ Defines the interval in number of messages when we are to report the throughput statistics.
+ The report is logged to the <code>org.apache.juli.logging.LogFactory.getLog(ThroughputInterceptor.class)</code>
+ logger under the <code>INFO</code> level.
+ Default value is to report every <code>10000</code> messages.
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.catalina.tribes.group.interceptors.EncryptInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.EncryptInterceptor Attributes</h4><div class="text">
+ <p>
+ The EncryptInterceptor adds encryption to the channel messages carrying
+ session data between nodes. Added in Tomcat 9.0.13.
+ </p>
+ <p>
+ If using the <code>TcpFailureDetector</code>, the <code>EncryptInterceptor</code>
+ <i>must</i> be inserted into the interceptor chain <i>before</i> the
+ <code>TcpFailureDetector</code>. This is because when validating cluster
+ members, <code>TcpFailureDetector</code> writes channel data directly
+ to the other members without using the remainder of the interceptor chain,
+ but on the receiving side, the message still goes through the chain (in reverse).
+ Because of this asymmetry, the <code>EncryptInterceptor</code> must execute
+ <i>before</i> the <code>TcpFailureDetector</code> on the sender and <i>after</i>
+ it on the receiver, otherwise message corruption will occur.
+ </p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">encryptionAlgorithm</code></td><td>
+ The encryption algorithm to be used, including the mode and padding. Please see
+ <a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html">https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html</a>
+ for the standard JCA names that can be used.
+
+ EncryptInterceptor currently supports the following
+ <a href="https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation">block-cipher modes</a>:
+ CBC, OFB, CFB, and GCM.
+
+ The length of the key will specify the flavor of the encryption algorithm
+ to be used, if applicable (e.g. AES-128 versus AES-256).
+
+ The default algorithm is <code>AES/CBC/PKCS5Padding</code>.
+ </td></tr><tr><td><strong><code class="attributeName">encryptionKey</code></strong></td><td>
+ The key to be used with the encryption algorithm.
+
+ The key should be specified as hex-encoded bytes of the appropriate
+ length for the algorithm (e.g. 16 bytes / 32 characters / 128 bits for
+ AES-128, 32 bytes / 64 characters / 256 bits for AES-256, etc.).
+ </td></tr></table>
+ </div></div>
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+ <div class="subsection"><h4 id="StaticMember_Attributes">StaticMember Attributes</h4><div class="text">
+ <p><b>LocalMember:</b> <br>
+ Static member that is the local member of the static cluster group.
+ </p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ Only one implementation available:<code>org.apache.catalina.tribes.membership.StaticMember</code>
+ </td></tr><tr><td><code class="attributeName">port</code></td><td>
+ There is no need to set.
+ The value of this attribute inherits from the cluster receiver setting.
+ </td></tr><tr><td><code class="attributeName">securePort</code></td><td>
+ There is no need to set.
+ The value of this attribute inherits from the cluster receiver setting.
+ </td></tr><tr><td><code class="attributeName">host</code></td><td>
+ There is no need to set.
+ The value of this attribute inherits from the cluster receiver setting.
+ </td></tr><tr><td><code class="attributeName">domain</code></td><td>
+ The logical cluster domain for that this static member listens for cluster messages.
+ Two different type of values are possible:<br>
+ 1. Regular string values like "staging-domain" or "tomcat-cluster" will be converted into bytes
+ using ISO-8859-1 encoding.
+ 2. byte array in string form, for example {216,123,12,3}<br>
+ </td></tr><tr><td><strong><code class="attributeName">uniqueId</code></strong></td><td>
+ A universally uniqueId for this static member.
+ The values must be 16 bytes in the following form:<br>
+ 1. byte array in string form, for example {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}<br>
+ </td></tr></table>
+
+ <p><b>Member:</b> <br>
+ Static member that add to the static cluster group.
+ </p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ Only one implementation available:<code>org.apache.catalina.tribes.membership.StaticMember</code>
+ </td></tr><tr><td><strong><code class="attributeName">port</code></strong></td><td>
+ The port that this static member listens to for cluster messages
+ </td></tr><tr><td><code class="attributeName">securePort</code></td><td>
+ The secure port this static member listens to for encrypted cluster messages
+ default value is <code>-1</code>, this value means the member is not listening on a secure port
+ </td></tr><tr><td><strong><code class="attributeName">host</code></strong></td><td>
+ The host (or network interface) that this static member listens for cluster messages.
+ Three different type of values are possible:<br>
+ 1. IP address in the form of "216.123.1.23"<br>
+ 2. Hostnames like "tomcat01.mydomain.com" or "tomcat01" as long as they resolve correctly<br>
+ 3. byte array in string form, for example {216,123,12,3}<br>
+ </td></tr><tr><td><code class="attributeName">domain</code></td><td>
+ The logical cluster domain for that this static member listens for cluster messages.
+ Two different type of values are possible:<br>
+ 1. Regular string values like "staging-domain" or "tomcat-cluster" will be converted into bytes
+ using ISO-8859-1 encoding.<br>
+ 2. byte array in string form, for example {216,123,12,3}<br>
+ </td></tr><tr><td><strong><code class="attributeName">uniqueId</code></strong></td><td>
+ A universally uniqueId for this static member.
+ The values must be 16 bytes in the following form:<br>
+ 1. byte array in string form, for example {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}<br>
+ </td></tr></table>
+ </div></div>
+
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/cluster-listener.html b/web/tomcat/webapps/docs/config/cluster-listener.html
new file mode 100644
index 0000000..4db10f1
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/cluster-listener.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The ClusterListener object</title><meta name="author" content="Filip Hanik"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The ClusterListener object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#org.apache.catalina.ha.session.ClusterSessionListener">org.apache.catalina.ha.session.ClusterSessionListener</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>
+ The <code>org.apache.catalina.ha.ClusterListener</code> base class
+ lets you listen in on messages that are received by the <code>Cluster</code> component.
+ </p>
+
+</div><h3 id="org.apache.catalina.ha.session.ClusterSessionListener">org.apache.catalina.ha.session.ClusterSessionListener</h3><div class="text">
+ <p>
+ When using the DeltaManager, the messages are received by the Cluster object and are propagated to the
+ to the manager through this listener.
+ </p>
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+
+ </td></tr></table>
+
+
+ </div></div>
+
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/cluster-manager.html b/web/tomcat/webapps/docs/config/cluster-manager.html
new file mode 100644
index 0000000..cbc201b
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/cluster-manager.html
@@ -0,0 +1,241 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The ClusterManager object</title><meta name="author" content="Filip Hanik"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The ClusterManager object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#The_<Manager>">The <Manager></a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#org.apache.catalina.ha.session.DeltaManager_Attributes">org.apache.catalina.ha.session.DeltaManager Attributes</a></li><li><a href="#org.apache.catalina.ha.session.BackupManager_Attributes">org.apache.catalina.ha.session.BackupManager Attributes</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>A cluster manager is an extension to Tomcat's session manager interface,
+ <code>org.apache.catalina.Manager</code>.
+ A cluster manager must implement the
+ <code>org.apache.catalina.ha.ClusterManager</code> and is solely responsible
+ for how the session is replicated.<br>
+ There are currently two different managers, the
+ <code>org.apache.catalina.ha.session.DeltaManager</code> replicates deltas of
+ session data to all members in the cluster. This implementation is proven and
+ works very well, but has a limitation as it requires the cluster members to be
+ homogeneous, all nodes must deploy the same applications and be exact
+ replicas. The <code>org.apache.catalina.ha.session.BackupManager</code> also
+ replicates deltas but only to one backup node. The location of the backup node
+ is known to all nodes in the cluster. It also supports heterogeneous
+ deployments, so the manager knows at what locations the web application is
+ deployed.</p>
+</div><h3 id="The_<Manager>">The <Manager></h3><div class="text">
+ <p>The <code><Manager></code> element defined inside the
+ <code><Cluster></code> element is the template defined for all web
+ applications that are marked <code><distributable/></code> in their
+ <code>web.xml</code> file. However, you can still override the manager
+ implementation on a per web application basis, by putting the
+ <code><Manager></code> inside the <code><Context></code> element
+ either in the <code><a href="context.html">context.xml</a></code> file or the
+ <code><a href="index.html">server.xml</a></code> file.</p>
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ </td></tr><tr><td><code class="attributeName">name</code></td><td>
+ <b>The name of this cluster manager, the name is used to identify a
+ session manager on a node. The name might get modified by the
+ <code>Cluster</code> element to make it unique in the container.</b>
+ </td></tr><tr><td><code class="attributeName">notifyListenersOnReplication</code></td><td>
+ Set to <code>true</code> if you wish to have session listeners notified
+ when session attributes are being replicated or removed across Tomcat
+ nodes in the cluster.
+ </td></tr><tr><td><code class="attributeName">processExpiresFrequency</code></td><td>
+ <p>Frequency of the session expiration, and related manager operations.
+ Manager operations will be done once for the specified amount of
+ backgroundProcess calls (i.e., the lower the amount, the more often the
+ checks will occur). The minimum value is 1, and the default value is 6.
+ </p>
+ </td></tr><tr><td><code class="attributeName">secureRandomClass</code></td><td>
+ <p>Name of the Java class that extends
+ <code>java.security.SecureRandom</code> to use to generate session IDs.
+ If not specified, the default value is
+ <code>java.security.SecureRandom</code>.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomProvider</code></td><td>
+ <p>Name of the provider to use to create the
+ <code>java.security.SecureRandom</code> instances that generate session
+ IDs. If an invalid algorithm and/or provider is specified, the Manager
+ will use the platform default provider and the default algorithm. If not
+ specified, the platform default provider will be used.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomAlgorithm</code></td><td>
+ <p>Name of the algorithm to use to create the
+ <code>java.security.SecureRandom</code> instances that generate session
+ IDs. If an invalid algorithm and/or provider is specified, the Manager
+ will use the platform default provider and the default algorithm. If not
+ specified, the default algorithm of SHA1PRNG will be used. If the
+ default algorithm is not supported, the platform default will be used.
+ To specify that the platform default should be used, do not set the
+ secureRandomProvider attribute and set this attribute to the empty
+ string.</p>
+ </td></tr><tr><td><code class="attributeName">recordAllActions</code></td><td>
+ <p>Flag whether send all actions for session across Tomcat cluster
+ nodes. If set to false, if already done something to the same attribute,
+ make sure don't send multiple actions across Tomcat cluster nodes.
+ In that case, sends only the actions that have been added at last.
+ Default is <code>false</code>.</p>
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.catalina.ha.session.DeltaManager_Attributes">org.apache.catalina.ha.session.DeltaManager Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">expireSessionsOnShutdown</code></td><td>
+ When a web application is being shutdown, Tomcat issues an expire call
+ to each session to notify all the listeners. If you wish for all
+ sessions to expire on all nodes when a shutdown occurs on one node, set
+ this value to <code>true</code>.
+ Default value is <code>false</code>.
+ </td></tr><tr><td><code class="attributeName">maxActiveSessions</code></td><td>
+ The maximum number of active sessions that will be created by this
+ Manager, or -1 (the default) for no limit. For this manager, all
+ sessions are counted as active sessions irrespective if whether or not
+ the current node is the primary node for the session.
+ </td></tr><tr><td><code class="attributeName">notifySessionListenersOnReplication</code></td><td>
+ Set to <code>true</code> if you wish to have session listeners notified
+ when sessions are created and expired across Tomcat nodes in the
+ cluster.
+ </td></tr><tr><td><code class="attributeName">notifyContainerListenersOnReplication</code></td><td>
+ Set to <code>true</code> if you wish to have container listeners notified
+ across Tomcat nodes in the cluster.
+ </td></tr><tr><td><code class="attributeName">stateTransferTimeout</code></td><td>
+ The time in seconds to wait for a session state transfer to complete
+ from another node when a node is starting up.
+ Default value is <code>60</code> seconds.
+ </td></tr><tr><td><code class="attributeName">sendAllSessions</code></td><td>
+ Flag whether send sessions as split blocks.
+ If set to <code>true</code>, send all sessions as one big block.
+ If set to <code>false</code>, send sessions as split blocks.
+ Default value is <code>true</code>.
+ </td></tr><tr><td><code class="attributeName">sendAllSessionsSize</code></td><td>
+ The number of sessions in a session block message. This value is
+ effective only when <code>sendAllSessions</code> is <code>false</code>.
+ Default is <code>1000</code>.
+ </td></tr><tr><td><code class="attributeName">sendAllSessionsWaitTime</code></td><td>
+ Wait time between sending of session block messages. This value is
+ effective only when <code>sendAllSessions</code> is <code>false</code>.
+ Default is <code>2000</code> milliseconds.
+ </td></tr><tr><td><code class="attributeName">sessionAttributeNameFilter</code></td><td>
+ <p>A regular expression used to filter which session attributes will be
+ replicated. An attribute will only be replicated if its name matches
+ this pattern. If the pattern is zero length or <code>null</code>, all
+ attributes are eligible for replication. The pattern is anchored so the
+ session attribute name must fully match the pattern. As an example, the
+ value <code>(userName|sessionHistory)</code> will only replicate the
+ two session attributes named <code>userName</code> and
+ <code>sessionHistory</code>. If not specified, the default value of
+ <code>null</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">sessionAttributeValueClassNameFilter</code></td><td>
+ <p>A regular expression used to filter which session attributes will be
+ replicated. An attribute will only be replicated if the implementation
+ class name of the value matches this pattern. If the pattern is zero
+ length or <code>null</code>, all attributes are eligible for
+ replication. The pattern is anchored so the fully qualified class name
+ must fully match the pattern. If not specified, the default value of
+ <code>null</code> will be used unless a <code>SecurityManager</code> is
+ enabled in which case the default will be
+ <code>java\\.lang\\.(?:Boolean|Integer|Long|Number|String)</code>.</p>
+ </td></tr><tr><td><code class="attributeName">stateTimestampDrop</code></td><td>
+ When this node sends a <code>GET_ALL_SESSIONS</code> message to other
+ node, all session messages that are received as a response are queued.
+ If this attribute is set to <code>true</code>, the received session
+ messages (except any <code>GET_ALL_SESSIONS</code> sent by other nodes)
+ are filtered by their timestamp. A message is dropped if it is not a
+ <code>GET_ALL_SESSIONS</code> message and its timestamp is earlier than
+ the timestamp of our <code>GET_ALL_SESSIONS</code> message.
+ If set to <code>false</code>, all queued session messages are handled.
+ Default is <code>true</code>.
+ </td></tr><tr><td><code class="attributeName">warnOnSessionAttributeFilterFailure</code></td><td>
+ <p>If <strong>sessionAttributeNameFilter</strong> or
+ <strong>sessionAttributeValueClassNameFilter</strong> blocks an
+ attribute, should this be logged at <code>WARN</code> level? If
+ <code>WARN</code> level logging is disabled then it will be logged at
+ <code>DEBUG</code>. The default value of this attribute is
+ <code>false</code> unless a <code>SecurityManager</code> is enabled in
+ which case the default will be <code>true</code>.</p>
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.catalina.ha.session.BackupManager_Attributes">org.apache.catalina.ha.session.BackupManager Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">mapSendOptions</code></td><td>
+ The backup manager uses a replicated map, this map is sending and
+ receiving messages. You can setup the flag for how this map is sending
+ messages, the default value is <code>6</code>(synchronous).<br>
+ Note that if you use asynchronous messaging it is possible for update
+ messages for a session to be processed by the receiving node in a
+ different order to the order in which they were sent.
+ </td></tr><tr><td><code class="attributeName">maxActiveSessions</code></td><td>
+ The maximum number of active sessions that will be created by this
+ Manager, or -1 (the default) for no limit. For this manager, only
+ sessions where the current node is the primary node for the session are
+ considered active sessions.
+ </td></tr><tr><td><code class="attributeName">rpcTimeout</code></td><td>
+ Timeout for RPC message used for broadcast and transfer state from
+ another map.
+ Default value is <code>15000</code> milliseconds.
+ </td></tr><tr><td><code class="attributeName">sessionAttributeNameFilter</code></td><td>
+ <p>A regular expression used to filter which session attributes will be
+ replicated. An attribute will only be replicated if its name matches
+ this pattern. If the pattern is zero length or <code>null</code>, all
+ attributes are eligible for replication. The pattern is anchored so the
+ session attribute name must fully match the pattern. As an example, the
+ value <code>(userName|sessionHistory)</code> will only replicate the
+ two session attributes named <code>userName</code> and
+ <code>sessionHistory</code>. If not specified, the default value of
+ <code>null</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">sessionAttributeValueClassNameFilter</code></td><td>
+ <p>A regular expression used to filter which session attributes will be
+ replicated. An attribute will only be replicated if the implementation
+ class name of the value matches this pattern. If the pattern is zero
+ length or <code>null</code>, all attributes are eligible for
+ replication. The pattern is anchored so the fully qualified class name
+ must fully match the pattern. If not specified, the default value of
+ <code>null</code> will be used unless a <code>SecurityManager</code> is
+ enabled in which case the default will be
+ <code>java\\.lang\\.(?:Boolean|Integer|Long|Number|String)</code>.</p>
+ </td></tr><tr><td><code class="attributeName">terminateOnStartFailure</code></td><td>
+ Set to true if you wish to terminate replication map when replication
+ map fails to start. If replication map is terminated, associated context
+ will fail to start. If you set this attribute to false, replication map
+ does not end. It will try to join the map membership in the heartbeat.
+ Default value is <code>false</code> .
+ </td></tr><tr><td><code class="attributeName">warnOnSessionAttributeFilterFailure</code></td><td>
+ <p>If <strong>sessionAttributeNameFilter</strong> or
+ <strong>sessionAttributeValueClassNameFilter</strong> blocks an
+ attribute, should this be logged at <code>WARN</code> level? If
+ <code>WARN</code> level logging is disabled then it will be logged at
+ <code>DEBUG</code>. The default value of this attribute is
+ <code>false</code> unless a <code>SecurityManager</code> is enabled in
+ which case the default will be <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">accessTimeout</code></td><td>
+ The timeout for a ping message. If a remote map does not respond within
+ this timeout period, its regarded as disappeared.
+ Default value is <code>5000</code> milliseconds.
+ </td></tr></table>
+ </div></div>
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+ <h3>All Manager Implementations</h3>
+ <p>All Manager implementations allow nesting of a
+ <strong><SessionIdGenerator></strong> element. It defines
+ the behavior of session id generation. All implementations
+ of the <a href="sessionidgenerator.html">SessionIdGenerator</a> allow the
+ following attributes:
+ </p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">sessionIdLength</code></td><td>
+ <p>The length of the session ID may be changed with the
+ <strong>sessionIdLength</strong> attribute.
+ </p>
+ </td></tr></table>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/cluster-membership.html b/web/tomcat/webapps/docs/config/cluster-membership.html
new file mode 100644
index 0000000..97de164
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/cluster-membership.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Cluster Membership object</title><meta name="author" content="Filip Hanik"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Cluster Membership object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Default_Implementation">Default Implementation</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Multicast_Attributes">Multicast Attributes</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>
+ The membership component in the Apache Tribes <a href="cluster-channel.html">Channel</a> is responsible
+ for dynamic discovery of other members(nodes) in the cluster.
+ </p>
+</div><h3 id="Default_Implementation">Default Implementation</h3><div class="text">
+ <p>
+ The default implementation of the cluster group notification is built on top of multicast heartbeats
+ sent using UDP packets to a multicast IP address.
+ Cluster members are grouped together by using the same multicast address/port combination.
+ Each member sends out a heartbeat with a given interval (<code>frequency</code>), and this
+ heartbeat is used for dynamic discovery.
+ In a similar fashion, if a heartbeat has not been received in a timeframe specified by <code>dropTime</code>
+ ms. a member is considered suspect and the channel and any membership listener will be notified.
+ </p>
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Multicast_Attributes">Multicast Attributes</h4><div class="text">
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>
+ The default value is <code>org.apache.catalina.tribes.membership.McastService</code>
+ and is currently the only implementation.
+ This implementation uses multicast heartbeats for member discovery.
+ </p>
+ </td></tr><tr><td><code class="attributeName">address</code></td><td>
+ <p>
+ The multicast address that the membership will broadcast its presence and listen
+ for other heartbeats on. The default value is <code>228.0.0.4</code>
+ Make sure your network is enabled for multicast traffic.<br>
+ The multicast address, in conjunction with the <code>port</code> is what
+ creates a cluster group. To divide up your farm into several different group, or to
+ split up QA from production, change the <code>port</code> or the <code>address</code>
+ <br>Previously known as mcastAddr.
+ </p>
+ </td></tr><tr><td><code class="attributeName">port</code></td><td>
+ <p>
+ The multicast port, the default value is <code>45564</code><br>
+ The multicast port, in conjunction with the <code>address</code> is what
+ creates a cluster group. To divide up your farm into several different group, or to
+ split up QA from production, change the <code>port</code> or the <code>address</code>
+ </p>
+ </td></tr><tr><td><code class="attributeName">frequency</code></td><td>
+ <p>
+ The frequency in milliseconds in which heartbeats are sent out. The default value is <code>500</code> ms.<br>
+ In most cases the default value is sufficient. Changing this value, simply changes the interval in between heartbeats.
+ </p>
+ </td></tr><tr><td><code class="attributeName">dropTime</code></td><td>
+ <p>
+ The membership component will time out members and notify the Channel if a member fails to send a heartbeat within
+ a give time. The default value is <code>3000</code> ms. This means, that if a heartbeat is not received from a
+ member in that timeframe, the membership component will notify the cluster of this.<br>
+ On a high latency network you may wish to increase this value, to protect against false positives.<br>
+ Apache Tribes also provides a <a href="cluster-interceptor.html#org.apache.catalina.tribes.group.interceptors.TcpFailureDetector_Attributes"><code>TcpFailureDetector</code></a> that will
+ verify a timeout using a TCP connection when a heartbeat timeout has occurred. This protects against false positives.
+ </p>
+ </td></tr><tr><td><code class="attributeName">bind</code></td><td>
+ <p>
+ Use this attribute if you wish to bind your multicast traffic to a specific network interface.
+ By default, or when this attribute is unset, it tries to bind to <code>0.0.0.0</code> and sometimes on multihomed hosts
+ this becomes a problem.
+ </p>
+ </td></tr><tr><td><code class="attributeName">ttl</code></td><td>
+ <p>
+ The time-to-live setting for the multicast heartbeats.
+ This setting should be a value between 0 and 255. The default value is VM implementation specific.
+ </p>
+ </td></tr><tr><td><code class="attributeName">domain</code></td><td>
+ <p>
+ Apache Tribes has the ability to logically group members into domains, by using this domain attribute.
+ The <code>org.apache.catalina.tribes.Member.getDomain()</code> method returns the value specified here.
+ </p>
+ </td></tr><tr><td><code class="attributeName">soTimeout</code></td><td>
+ <p>
+ The sending and receiving of heartbeats is done on a single thread, hence to avoid blocking this thread forever,
+ you can control the <code>SO_TIMEOUT</code> value on this socket.<br>
+ If a value smaller or equal to 0 is presented, the code will default this value to frequency
+ </p>
+ </td></tr><tr><td><code class="attributeName">recoveryEnabled</code></td><td>
+ <p>
+ In case of a network failure, Java multicast socket don't transparently fail over, instead the socket will continuously
+ throw IOException upon each receive request. When recoveryEnabled is set to true, this will close the multicast socket
+ and open a new socket with the same properties as defined above.<br>
+ The default is <code>true</code>. <br>
+ </p>
+ </td></tr><tr><td><code class="attributeName">recoveryCounter</code></td><td>
+ <p>
+ When <code>recoveryEnabled==true</code> this value indicates how many
+ times an error has to occur before recovery is attempted. The default is
+ <code>10</code>. <br>
+ </p>
+ </td></tr><tr><td><code class="attributeName">recoverySleepTime</code></td><td>
+ <p>
+ When <code>recoveryEnabled==true</code> this value indicates how long time (in milliseconds)
+ the system will sleep in between recovery attempts, until it recovers successfully.
+ The default is <code>5000</code> (5 seconds). <br>
+ </p>
+ </td></tr><tr><td><code class="attributeName">localLoopbackDisabled</code></td><td>
+ <p>
+ Membership uses multicast, it will call <code>java.net.MulticastSocket.setLoopbackMode(localLoopbackDisabled)</code>.
+ When <code>localLoopbackDisabled==true</code> multicast messages will not reach other nodes on the same local machine.
+ The default is <code>false</code>. <br>
+ </p>
+ </td></tr></table>
+
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/cluster-receiver.html b/web/tomcat/webapps/docs/config/cluster-receiver.html
new file mode 100644
index 0000000..6b59834
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/cluster-receiver.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Cluster Receiver object</title><meta name="author" content="Filip Hanik"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Cluster Receiver object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Blocking_vs_Non-Blocking_Receiver">Blocking vs Non-Blocking Receiver</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#NioReceiver">NioReceiver</a></li><li><a href="#BioReceiver">BioReceiver</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>
+ The receiver component is responsible for receiving cluster messages.
+ As you might notice through the configuration, is that the receiving of messages
+ and sending of messages are two different components, this is different from many other
+ frameworks, but there is a good reason for it, to decouple the logic for how messages are sent from
+ how messages are received.<br>
+ The receiver is very much like the Tomcat Connector, its the base of the thread pool
+ for incoming cluster messages. The receiver is straight forward, but all the socket settings
+ for incoming traffic are managed here.
+ </p>
+</div><h3 id="Blocking_vs_Non-Blocking_Receiver">Blocking vs Non-Blocking Receiver</h3><div class="text">
+ <p>
+ The receiver supports both a non blocking, <code>org.apache.catalina.tribes.transport.nio.NioReceiver</code>, and a
+ blocking, <code>org.apache.catalina.tribes.transport.bio.BioReceiver</code>. It is preferred to use the non blocking receiver
+ to be able to grow your cluster without running into thread starvation.<br>
+ Using the non blocking receiver allows you to with a very limited thread count to serve a large number of messages.
+ Usually the rule is to use 1 thread per node in the cluster for small clusters, and then depending on your message frequency
+ and your hardware, you'll find an optimal number of threads peak out at a certain number.
+ </p>
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ The implementation of the receiver component. Two implementations available,
+ <code>org.apache.catalina.tribes.transport.nio.NioReceiver</code> and
+ <code>org.apache.catalina.tribes.transport.bio.BioReceiver</code>.<br>
+ The <code>org.apache.catalina.tribes.transport.nio.NioReceiver</code> is the
+ preferred implementation
+ </td></tr><tr><td><code class="attributeName">address</code></td><td>
+ The address (network interface) to listen for incoming traffic.
+ Same as the bind address. The default value is <code>auto</code> and translates to
+ <code>java.net.InetAddress.getLocalHost().getHostAddress()</code>.
+ </td></tr><tr><td><code class="attributeName">direct</code></td><td>
+ Possible values are <code>true</code> or <code>false</code>.
+ Set to true if you want the receiver to use direct bytebuffers when reading data
+ from the sockets.
+ </td></tr><tr><td><code class="attributeName">port</code></td><td>
+ The listen port for incoming data. The default value is <code>4000</code>.
+ To avoid port conflicts the receiver will automatically bind to a free port within the range of
+ <code> port <= bindPort < port+autoBind</code>
+ So for example, if port is 4000, and autoBind is set to 10, then the receiver will open up
+ a server socket on the first available port in the range 4000-4009.
+ </td></tr><tr><td><code class="attributeName">autoBind</code></td><td>
+ Default value is <code>100</code>.
+ Use this value if you wish to automatically avoid port conflicts the cluster receiver will try to open a
+ server socket on the <code>port</code> attribute port, and then work up <code>autoBind</code> number of times.
+ </td></tr><tr><td><code class="attributeName">securePort</code></td><td>
+ The secure listen port. This port is SSL enabled. If this attribute is omitted no SSL port is opened up.
+ There default value is unset, meaning there is no SSL socket available.
+ </td></tr><tr><td><code class="attributeName">udpPort</code></td><td>
+ The UDP listen port. If this attribute is omitted no UDP port is opened up.
+ There default value is unset, meaning there is no UDP listener available.
+ </td></tr><tr><td><code class="attributeName">selectorTimeout</code></td><td>
+ The value in milliseconds for the polling timeout in the <code>NioReceiver</code>. On older versions of the JDK
+ there have been bugs, that should all now be cleared out where the selector never woke up.
+ The default value is a very high <code>5000</code> milliseconds.
+ </td></tr><tr><td><code class="attributeName">maxThreads</code></td><td>
+ The maximum number of threads in the receiver thread pool. The default value is <code>15</code>
+ Adjust this value relative to the number of nodes in the cluster, the number of messages being exchanged and
+ the hardware you are running on. A higher value doesn't mean more efficiency, tune this value according to your
+ own test results.
+ </td></tr><tr><td><code class="attributeName">minThreads</code></td><td>
+ Minimum number of threads to be created when the receiver is started up. Default value is <code>6</code>
+ </td></tr><tr><td><code class="attributeName">maxIdleTime</code></td><td>
+ Maximum number of milliseconds of until Idle thread terminates. Default value is <code>60000</code> milliseconds.
+ </td></tr><tr><td><code class="attributeName">ooBInline</code></td><td>
+ Boolean value for the socket OOBINLINE option. Possible values are <code>true</code> or <code>false</code>.
+ </td></tr><tr><td><code class="attributeName">rxBufSize</code></td><td>
+ The receiver buffer size on the receiving sockets. Value is in bytes, the default value is <code>43800</code> bytes.
+ </td></tr><tr><td><code class="attributeName">txBufSize</code></td><td>
+ The sending buffer size on the receiving sockets. Value is in bytes, the default value is <code>25188</code> bytes.
+ </td></tr><tr><td><code class="attributeName">udpRxBufSize</code></td><td>
+ The receive buffer size on the datagram socket.
+ Default value is <code>25188</code> bytes.
+ </td></tr><tr><td><code class="attributeName">udpTxBufSize</code></td><td>
+ The send buffer size on the datagram socket.
+ Default value is <code>43800</code> bytes.
+ </td></tr><tr><td><code class="attributeName">soKeepAlive</code></td><td>
+ Boolean value for the socket SO_KEEPALIVE option. Possible values are <code>true</code> or <code>false</code>.
+ </td></tr><tr><td><code class="attributeName">soLingerOn</code></td><td>
+ Boolean value to determine whether to use the SO_LINGER socket option.
+ Possible values are <code>true</code> or <code>false</code>. Default value is <code>true</code>.
+ </td></tr><tr><td><code class="attributeName">soLingerTime</code></td><td>
+ Sets the SO_LINGER socket option time value. The value is in seconds.
+ The default value is <code>3</code> seconds.
+ </td></tr><tr><td><code class="attributeName">soReuseAddress</code></td><td>
+ Boolean value for the socket SO_REUSEADDR option. Possible values are <code>true</code> or <code>false</code>.
+ </td></tr><tr><td><code class="attributeName">tcpNoDelay</code></td><td>
+ Boolean value for the socket TCP_NODELAY option. Possible values are <code>true</code> or <code>false</code>.
+ The default value is <code>true</code>
+ </td></tr><tr><td><code class="attributeName">timeout</code></td><td>
+ Sets the SO_TIMEOUT option on the socket. The value is in milliseconds and the default value is <code>3000</code>
+ milliseconds.
+ </td></tr><tr><td><code class="attributeName">useBufferPool</code></td><td>
+ Boolean value whether to use a shared buffer pool of cached <code>org.apache.catalina.tribes.io.XByteBuffer</code>
+ objects. If set to true, the XByteBuffer that is used to pass a message up the channel, will be recycled at the end
+ of the requests. This means that interceptors in the channel must not maintain a reference to the object
+ after the <code>org.apache.catalina.tribes.ChannelInterceptor#messageReceived</code> method has exited.
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="NioReceiver">NioReceiver</h4><div class="text">
+ </div></div>
+ <div class="subsection"><h4 id="BioReceiver">BioReceiver</h4><div class="text">
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/cluster-sender.html b/web/tomcat/webapps/docs/config/cluster-sender.html
new file mode 100644
index 0000000..8204597
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/cluster-sender.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Cluster Sender object</title><meta name="author" content="Filip Hanik"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Cluster Sender object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Concurrent_Parallel_Delivery">Concurrent Parallel Delivery</a></li><li><a href="#Nested_Elements">Nested Elements</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Sender_Attributes">Common Sender Attributes</a></li><li><a href="#Common_Transport_Attributes">Common Transport Attributes</a></li><li><a href="#Common_PooledSender_Attributes">Common PooledSender Attributes</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>
+ The channel sender component is responsible for delivering outgoing cluster messages over the network.
+ In the default implementation, <code>org.apache.catalina.tribes.transport.ReplicationTransmitter</code>,
+ the sender is a fairly empty shell with not much logic around a fairly complex <code><Transport></code>
+ component the implements the actual delivery mechanism.
+ </p>
+</div><h3 id="Concurrent_Parallel_Delivery">Concurrent Parallel Delivery</h3><div class="text">
+ <p>
+ In the default <code>transport</code> implementation, <code>org.apache.catalina.tribes.transport.nio.PooledParallelSender</code>,
+ Apache Tribes implements what we like to call "Concurrent Parallel Delivery".
+ This means that we can send a message to more than one destination at the same time(parallel), and
+ deliver two messages to the same destination at the same time(concurrent). Combine these two and we have
+ "Concurrent Parallel Delivery".
+ </p>
+ <p>
+ When is this useful? The simplest example we can think of is when part of your code is sending a 10MB message,
+ like a war file being deployed, and you need to push through a small 10KB message, say a session being replicated,
+ you don't have to wait for the 10MB message to finish, as a separate thread will push in the small message
+ transmission at the same time. Currently there is no interrupt, pause or priority mechanism available, but check back soon.
+ </p>
+</div><h3 id="Nested_Elements">Nested Elements</h3><div class="text">
+ <p>
+ The nested element <code><Transport></code> is not required, but encouraged, as this is where
+ you would set all the socket options for the outgoing messages. Please see its attributes below.
+ There are two implementations, in a similar manner to the <a href="cluster-receiver.html">receiver</a>, one is non-blocking
+ based and the other is built using blocking IO. <br>
+ <code>org.apache.catalina.tribes.transport.bio.PooledMultiSender</code> is the blocking implementation and
+ <code>org.apache.catalina.tribes.transport.nio.PooledParallelSender</code>.
+ Parallel delivery is not available for the blocking implementation due to the fact that it is blocking a thread on sending data.
+ </p>
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+ <div class="subsection"><h4 id="Common_Sender_Attributes">Common Sender Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ Required, only available implementation is <code>org.apache.catalina.tribes.transport.ReplicationTransmitter</code>
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="Common_Transport_Attributes">Common Transport Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ Required, an implementation of the <code>org.apache.catalina.tribes.transport.MultiPointSender</code>.<br>
+ Non-blocking implementation is <code>org.apache.catalina.tribes.transport.nio.PooledParallelSender</code><br>
+ Blocking implementation is <code>org.apache.catalina.tribes.transport.bio.PooledMultiSender</code>
+ </td></tr><tr><td><code class="attributeName">rxBufSize</code></td><td>
+ The receive buffer size on the socket.
+ Default value is <code>25188</code> bytes.
+ </td></tr><tr><td><code class="attributeName">txBufSize</code></td><td>
+ The send buffer size on the socket.
+ Default value is <code>43800</code> bytes.
+ </td></tr><tr><td><code class="attributeName">udpRxBufSize</code></td><td>
+ The receive buffer size on the datagram socket.
+ Default value is <code>25188</code> bytes.
+ </td></tr><tr><td><code class="attributeName">udpTxBufSize</code></td><td>
+ The send buffer size on the datagram socket.
+ Default value is <code>43800</code> bytes.
+ </td></tr><tr><td><code class="attributeName">directBuffer</code></td><td>
+ Possible values are <code>true</code> or <code>false</code>.
+ Set to true if you want the receiver to use direct bytebuffers when writing data
+ to the sockets. Default value is <code>false</code>
+ </td></tr><tr><td><code class="attributeName">keepAliveCount</code></td><td>
+ The number of requests that can go through the socket before the socket is closed, and reopened
+ for the next request. The default value is <code>-1</code>, which is unlimited.
+ </td></tr><tr><td><code class="attributeName">keepAliveTime</code></td><td>
+ The number of milliseconds a connection is kept open after its been opened.
+ The default value is <code>-1</code>, which is unlimited.
+ </td></tr><tr><td><code class="attributeName">timeout</code></td><td>
+ Sets the SO_TIMEOUT option on the socket. The value is in milliseconds and the default value is <code>3000</code>
+ milliseconds.(3 seconds) This timeout starts when a message send attempt is starting, until the transfer has been completed.
+ For the NIO sockets, this will mean, that the caller can guarantee that we will not attempt sending the message
+ longer than this timeout value. For the blocking IO implementation, this translated directly to the soTimeout.<br>
+ A timeout will not spawn a retry attempt, in order to guarantee the return of the application thread.
+ </td></tr><tr><td><code class="attributeName">maxRetryAttempts</code></td><td>
+ How many times do we retry a failed message, that received a IOException at the socket level.
+ The default value is <code>1</code>, meaning we will retry a message that has failed once.
+ In other words, we will attempt a message send no more than twice. One is the original send, and one is the
+ <code>maxRetryAttempts</code>.
+ </td></tr><tr><td><code class="attributeName">ooBInline</code></td><td>
+ Boolean value for the socket OOBINLINE option. Possible values are <code>true</code> or <code>false</code>.
+ </td></tr><tr><td><code class="attributeName">soKeepAlive</code></td><td>
+ Boolean value for the socket SO_KEEPALIVE option. Possible values are <code>true</code> or <code>false</code>.
+ </td></tr><tr><td><code class="attributeName">soLingerOn</code></td><td>
+ Boolean value to determine whether to use the SO_LINGER socket option.
+ Possible values are <code>true</code> or <code>false</code>. Default value is <code>true</code>.
+ </td></tr><tr><td><code class="attributeName">soLingerTime</code></td><td>
+ Sets the SO_LINGER socket option time value. The value is in seconds.
+ The default value is <code>3</code> seconds.
+ </td></tr><tr><td><code class="attributeName">soReuseAddress</code></td><td>
+ Boolean value for the socket SO_REUSEADDR option. Possible values are <code>true</code> or <code>false</code>.
+ </td></tr><tr><td><code class="attributeName">soTrafficClass</code></td><td>
+ Sets the traffic class level for the socket, the value is between 0 and 255.
+ Default value is <code>int soTrafficClass = 0x04 | 0x08 | 0x010;</code>
+ Different values are defined in <a href="http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setTrafficClass(int)">
+ java.net.Socket#setTrafficClass(int)</a>.
+ </td></tr><tr><td><code class="attributeName">tcpNoDelay</code></td><td>
+ Boolean value for the socket TCP_NODELAY option. Possible values are <code>true</code> or <code>false</code>.
+ The default value is <code>true</code>
+ </td></tr><tr><td><code class="attributeName">throwOnFailedAck</code></td><td>
+ Boolean value, default value is <code>true</code>.
+ If set to true, the sender will throw a <code>org.apache.catalina.tribes.RemoteProcessException</code>
+ when we receive a negative ack from the remote member.
+ Set to false, and Tribes will treat a positive ack the same way as a negative ack, that the message was received.
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="Common_PooledSender_Attributes">Common PooledSender Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">poolSize</code></td><td>
+ The maximum number of concurrent connections from A to B.
+ The value is based on a per-destination count.
+ The default value is <code>25</code>
+ </td></tr><tr><td><code class="attributeName">maxWait</code></td><td>
+ The maximum number of milliseconds that the senderPool will wait when
+ there are no available senders. The default value is <code>3000</code>
+ milliseconds.(3 seconds).
+ </td></tr></table>
+ </div></div>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/cluster-valve.html b/web/tomcat/webapps/docs/config/cluster-valve.html
new file mode 100644
index 0000000..f499fe3
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/cluster-valve.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Cluster Valve object</title><meta name="author" content="Filip Hanik"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Cluster Valve object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#org.apache.catalina.ha.tcp.ReplicationValve">org.apache.catalina.ha.tcp.ReplicationValve</a><ol><li><a href="#org.apache.catalina.ha.tcp.ReplicationValve/Attributes">Attributes</a></li></ol></li><li><a href="#org.apache.catalina.ha.session.JvmRouteBinderValve">org.apache.catalina.ha.session.JvmRouteBinderValve</a><ol><li><a href="#org.apache.catalina.ha.session.JvmRouteBinderValve/Attributes">Attributes</a></li></ol></li><li><a href="#org.apache.catalina.ha.authenticator.ClusterSingleSignOn">org.apache.catalina.ha.authenticator.ClusterSingleSignOn</a><ol><li><a href="#org.apache.catalina.ha.authenticator.ClusterSingleSignOn/Attributes">Attributes</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>
+ A cluster valve is no different from any other <a href="valve.html">Tomcat <code>Valve</code></a>.
+ The cluster valves are interceptors in the invocation chain for HTTP requests, and the clustering implementation
+ uses these valves to make intelligent decision around data and when data should be replicated.
+ </p>
+ <p>
+ A cluster valve must implement the <code>org.apache.catalina.ha.ClusterValve</code> interface.
+ This is a simple interface that extends the <code>org.apache.catalina.Valve</code> interface.
+ </p>
+</div><h3 id="org.apache.catalina.ha.tcp.ReplicationValve">org.apache.catalina.ha.tcp.ReplicationValve</h3><div class="text">
+ The <code>ReplicationValve</code> will notify the cluster at the end of an HTTP request
+ so that the cluster can make a decision whether there is data to be replicated or not.
+ <div class="subsection"><h4 id="org.apache.catalina.ha.tcp.ReplicationValve/Attributes">Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ Set value to <code>org.apache.catalina.ha.tcp.ReplicationValve</code>
+ </td></tr><tr><td><code class="attributeName">filter</code></td><td>
+ For known file extensions or urls, you can use this Valve to notify the
+ cluster that the session has not been modified during this request and
+ the cluster doesn't have to probe the session managers for changes. If
+ the request matches this filter pattern, the cluster assumes there has
+ been no session change. An example filter would look like <code>
+ filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"
+ </code>. The filter is a regular expression using
+ <code>java.util.regex</code>.
+ </td></tr><tr><td><code class="attributeName">primaryIndicator</code></td><td>
+ Boolean value, so to true, and the replication valve will insert a request attribute with the name
+ defined by the <code>primaryIndicatorName</code> attribute.
+ The value inserted into the request attribute is either <code>Boolean.TRUE</code> or
+ <code>Boolean.FALSE</code>
+ </td></tr><tr><td><code class="attributeName">primaryIndicatorName</code></td><td>
+ Default value is <code>org.apache.catalina.ha.tcp.isPrimarySession</code>
+ The value defined here is the name of the request attribute that contains the boolean value
+ if the session is primary on this server or not.
+ </td></tr><tr><td><code class="attributeName">statistics</code></td><td>
+ Boolean value. Set to <code>true</code> if you want the valve to collect request statistics.
+ Default value is <code>false</code>
+ </td></tr></table>
+ </div></div>
+</div><h3 id="org.apache.catalina.ha.session.JvmRouteBinderValve">org.apache.catalina.ha.session.JvmRouteBinderValve</h3><div class="text">
+ In case of a mod_jk failover, the <code>JvmRouteBinderValve</code> will replace the
+ <code>jvmWorker</code> attribute in the session Id, to make future requests stick to this
+ node. If you want fallback capability, don't enable this valve, but if you want your failover to stick,
+ and for mod_jk not to have to keep probing the node that went down, you use this valve.
+ <div class="subsection"><h4 id="org.apache.catalina.ha.session.JvmRouteBinderValve/Attributes">Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <code>org.apache.catalina.ha.session.JvmRouteBinderValve</code>
+ </td></tr><tr><td><code class="attributeName">enabled</code></td><td>
+ Default value is <code>true</code>
+ Runtime attribute to turn on and off turn over of the session's jvmRoute value.
+ </td></tr><tr><td><code class="attributeName">sessionIdAttribute</code></td><td>
+ Old sessionid before failover is registered in request attributes with this attribute.
+ Default attribute name is <code>org.apache.catalina.ha.session.JvmRouteOriginalSessionID</code>.
+ </td></tr></table>
+ </div></div>
+</div><h3 id="org.apache.catalina.ha.authenticator.ClusterSingleSignOn">org.apache.catalina.ha.authenticator.ClusterSingleSignOn</h3><div class="text">
+ The <code>ClusterSingleSignOn</code> supports feature of single sign on in cluster.
+ By using <code>ClusterSingleSignOn</code>, the security identity authenticated
+ by one web application is recognized by other web applications on the same virtual host,
+ and it is propagated to other nodes in the cluster.
+
+ <p>See the <a href="host.html#Single_Sign_On">Single Sign On</a> special
+ feature on the <strong>Host</strong> element for more information.</p>
+
+ <p><strong>Note:</strong> ClusterSingleSignOn can be configured at host level cluster only.
+ </p>
+
+ <div class="subsection"><h4 id="org.apache.catalina.ha.authenticator.ClusterSingleSignOn/Attributes">Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.ha.authenticator.ClusterSingleSignOn</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">cookieDomain</code></td><td>
+ <p>Sets the host domain to be used for sso cookies.</p>
+ </td></tr><tr><td><code class="attributeName">mapSendOptions</code></td><td>
+ <p>The Valve uses a replicated map. You can setup the flag for how this
+ map sends messages. The default value is <code>6</code> (synchronous).
+ Note that if you use asynchronous messaging it is possible for update
+ messages to be processed by the receiving node in a different order to
+ the order in which they were sent.</p>
+ </td></tr><tr><td><code class="attributeName">requireReauthentication</code></td><td>
+ <p>Default false. Flag to determine whether each request needs to be
+ reauthenticated to the security <strong>Realm</strong>. If "true", this
+ Valve uses cached security credentials (username and password) to
+ reauthenticate to the <strong>Realm</strong> each request associated
+ with an SSO session. If "false", the Valve can itself authenticate
+ requests based on the presence of a valid SSO cookie, without
+ rechecking with the <strong>Realm</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">rpcTimeout</code></td><td>
+ <p>The Valve uses a replicated map. This is the timeout for messages
+ that transfer state to/from the other nodes in the cluster. If not
+ specified, a default value of <code>15000</code> milliseconds is used.
+ </p>
+ </td></tr><tr><td><code class="attributeName">terminateOnStartFailure</code></td><td>
+ <p>Set to <code>true</code> if you wish this Valve to fail if the
+ underlying replication fails to start. If the Valve fails, then the
+ associated container will fail to start. If you set this attribute to
+ false, and the underlying replications fails to start, the Valve will
+ start and it will attempt to join the cluster and start replication as
+ part of the heartbeat process. If not specified, the default value of
+ <code>false</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">accessTimeout</code></td><td>
+ The timeout for a ping message. If a remote map does not respond within
+ this timeout period, its regarded as disappeared.
+ Default value is <code>5000</code> milliseconds.
+ </td></tr></table>
+ </div></div>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/cluster.html b/web/tomcat/webapps/docs/config/cluster.html
new file mode 100644
index 0000000..3386609
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/cluster.html
@@ -0,0 +1,177 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Cluster object</title><meta name="author" content="Filip Hanik"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Cluster object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Security">Security</a></li><li><a href="#Engine_vs_Host_placement">Engine vs Host placement</a></li><li><a href="#Context_Attribute_Replication">Context Attribute Replication</a></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Deprecated_configuration_options">Deprecated configuration options</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#SimpleTcpCluster_Attributes">SimpleTcpCluster Attributes</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>
+ The tomcat cluster implementation provides session replication, context attribute replication and
+ cluster wide WAR file deployment.
+ While the <code>Cluster</code> configuration is fairly complex, the default configuration will work
+ for most people out of the box. </p><p>
+ The Tomcat Cluster implementation is very extensible, and hence we have exposed a myriad of options,
+ making the configuration seem like a lot, but don't lose faith, instead you have a tremendous control
+ over what is going on.</p>
+</div><h3 id="Security">Security</h3><div class="text">
+
+<p>The cluster implementation is written on the basis that a secure, trusted
+network is used for all of the cluster related network traffic. It is not safe
+to run a cluster on a insecure, untrusted network.</p>
+
+<p>There are many options for providing a secure, trusted network for use by a
+Tomcat cluster. These include:</p>
+<ul>
+ <li><a href="cluster-interceptor.html#org.apache.catalina.tribes.group.interceptors.EncryptInterceptor_Attributes">EncryptInterceptor</a></li>
+ <li>private LAN</li>
+ <li>a Virtual Private Network (VPN)</li>
+ <li>IPSEC</li>
+</ul>
+
+</div><h3 id="Engine_vs_Host_placement">Engine vs Host placement</h3><div class="text">
+ <p>
+ You can place the <code><Cluster></code> element inside either the <code><Engine></code>
+ container or the <code><Host></code> container.<br>
+ Placing it in the engine, means that you will support clustering in all virtual hosts of Tomcat,
+ and share the messaging component. When you place the <code><Cluster></code> inside the <code><Engine></code>
+ element, the cluster will append the host name of each session manager to the managers name so that two contexts with
+ the same name but sitting inside two different hosts will be distinguishable.
+ </p>
+</div><h3 id="Context_Attribute_Replication">Context Attribute Replication</h3><div class="text">
+ <p>To configure context attribute replication, simply do this by swapping out the context implementation
+ used for your application context.</p>
+ <div class="codeBox"><pre><code><Context className="org.apache.catalina.ha.context.ReplicatedContext"/></code></pre></div>
+ <p>
+ This context extends the Tomcat <code><a href="context.html">StandardContext</a></code>
+ so all the options from the <a href="context.html">base implementation</a> are valid.
+ </p>
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+ <p><b><a href="cluster-manager.html">Manager</a>:</b> <br>
+ The session manager element identifies what kind of session manager is used in this cluster implementation.
+ This manager configuration is identical to the one you would use in a regular <code><a href="context.html#Nested_Components"><Context></a></code> configuration.
+ <br>The default value is the <code>org.apache.catalina.ha.session.DeltaManager</code> that is closely coupled with
+ the <code>SimpleTcpCluster</code> implementation. Other managers like the <code>org.apache.catalina.ha.session.BackupManager</code>
+ are/could be loosely coupled and don't rely on the <code>SimpleTcpCluster</code> for its data replication.
+ </p>
+ <p><b><a href="cluster-channel.html">Channel</a>:</b> <br>
+ The Channel and its sub components are all part of the IO layer
+ for the cluster group, and is a module in it's own that we have nick named "Tribes"
+ <br>
+ Any configuring and tuning of the network layer, the messaging and the membership logic
+ will be done in the channel and its nested components.
+ You can always find out more about <a href="../tribes/introduction.html">Apache Tribes</a>
+ </p>
+ <p><b><a href="cluster-valve.html">Valve</a>:</b> <br>
+ The Tomcat Cluster implementation uses <code>Tomcat <a href="valve.html">Valves</a></code> to
+ track when requests enter and exit the servlet container. It uses these valves to be able to make
+ intelligent decisions on when to replicate data, which is always at the end of a request.
+ </p>
+ <p><b><a href="cluster-deployer.html">Deployer</a>:</b> <br>
+ The Deployer component is the Tomcat Farm Deployer. It allows you to deploy and undeploy applications
+ cluster wide.
+ </p>
+ <p><b><a href="cluster-listener.html">ClusterListener</a>:</b> <br>
+ ClusterListener's are used to track messages sent and received using the <code>SimpleTcpCluster</code>.
+ If you wish to track messages, you can add a listener here, or you can add a valve to the channel object.
+ </p>
+</div><h3 id="Deprecated_configuration_options">Deprecated configuration options</h3><div class="text">
+ <p>
+ <b>Deprecated settings:</b> In the previous version of Tomcat you were able to control session
+ manager settings using manager.<property>=value.
+ This has been discontinued, as the way it was written interferes with
+ the ability to support multiple different manager classes under one cluster implementation,
+ as the same properties might have the different effect on different managers.
+ </p>
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+ <div class="subsection"><h4 id="SimpleTcpCluster_Attributes">SimpleTcpCluster Attributes</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>The main cluster class, currently only one is available,
+ <code>org.apache.catalina.ha.tcp.SimpleTcpCluster</code>
+ </p>
+ </td></tr><tr><td><strong><code class="attributeName">channelSendOptions</code></strong></td><td>
+ <p>The Tribes channel send options, default is <code>8</code>.<br>
+ This option is used to set the flag that all messages sent through the
+ SimpleTcpCluster uses. The flag decides how the messages are sent, and is a simple logical OR.</p>
+
+ <div class="codeBox"><pre><code>int options = Channel.SEND_OPTIONS_ASYNCHRONOUS |
+ Channel.SEND_OPTIONS_SYNCHRONIZED_ACK |
+ Channel.SEND_OPTIONS_USE_ACK;</code></pre></div>
+ <p>Some of the values are:<br>
+ <code>Channel.SEND_OPTIONS_SYNCHRONIZED_ACK = 0x0004</code><br>
+ <code>Channel.SEND_OPTIONS_ASYNCHRONOUS = 0x0008</code><br>
+ <code>Channel.SEND_OPTIONS_USE_ACK = 0x0002</code><br>
+ So to use ACK and ASYNC messaging, the flag would be <code>10</code> (8+2)
+ <br>
+ Note that if you use ASYNC messaging it is possible for update messages
+ for a session to be processed by the receiving nodes in a different order
+ to the order in which they were sent.
+ </p>
+ <p>
+ The various <code>channelSendOptions</code> values offer a tradeoff
+ between throughput on the sending node and the reliability of
+ replication should the sending or receiving node(s) fail. Here are
+ some common options. "Message" could be any message sent between nodes,
+ but only session-change messages are considered, here.
+ </p>
+ <p>
+ <code>channelSendOptions="8"</code> / <code>channelSendOptions="async"</code>
+ As far as the sender is concerned, the message is "sent"
+ as soon as it has been placed in the queue on the sender for
+ transmission to the other nodes. The message may not reach any or all
+ of the recipient nodes and may not be successfully processed on any
+ nodes that it does reach. This option offers the highest throughput on
+ the sender but the least reliability, as the triggering request will
+ complete without any knowledge of the success/failure of the session
+ replication.
+ </p>
+ <p>
+ <code>channelSendOptions="2"</code> / <code>channelSendOptions="use_ack"</code>
+ The sender will block the completion of the current request until all
+ of the receiving nodes have acknowledged that they have received the
+ message, but have not necessarily processed that message. This option
+ will result in lower throughput on the sending node, because the message
+ must be transmitted and the acknowledgement received, but the
+ reliability is greater than the asynchronous model.
+ </p>
+ <p>
+ <code>channelSendOptions="6"</code> / <code>channelSendOptions="sync,use_ack"</code>
+ The sender will block the completion of the current request until
+ all of the receiving nodes have acknowledged that they have received
+ <u>and</u> processed the message. This option will have the lowest
+ throughput (of these three) but the greatest reliability.
+ </p>
+ <p>
+ You may also set these options as a comma separated string, e.g. "async, multicast", which
+ will be translated into <code>Channel.SEND_OPTIONS_ASYNCHRONOUS | Channel.SEND_OPTIONS_MULTICAST</code>
+ <br>
+ The valid option names are "asynchronous" (alias "async"), "byte_message" (alias "byte")
+ , "multicast", "secure", "synchronized_ack" (alias "sync"), "udp", "use_ack"
+ </p>
+ </td></tr><tr><td><code class="attributeName">channelStartOptions</code></td><td>
+ <p>Sets the start and stop flags for the <Channel> object used by the cluster.
+ The default is <code>Channel.DEFAULT</code> which starts all the channel services, such as
+ sender, receiver, multicast sender and multicast receiver.
+ The following flags are available today:</p>
+ <div class="codeBox"><pre><code>Channel.DEFAULT = Channel.SND_RX_SEQ (1) |
+ Channel.SND_TX_SEQ (2) |
+ Channel.MBR_RX_SEQ (4) |
+ Channel.MBR_TX_SEQ (8);</code></pre></div>
+ <p>To start a channel without multicasting, you would want to use the value <code>Channel.SND_RX_SEQ | Channel.SND_TX_SEQ</code>
+ that equals to <code>3</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">heartbeatBackgroundEnabled</code></td><td>
+ <p>Flag whether invoke channel heartbeat at container background thread. Default value is false.
+ Enable this flag don't forget to disable the channel heartbeat thread.
+ </p>
+ </td></tr><tr><td><code class="attributeName">notifyLifecycleListenerOnFailure</code></td><td>
+ <p>Flag whether notify LifecycleListeners if all ClusterListener couldn't accept channel message.
+ Default value is false.
+ </p>
+ </td></tr></table>
+ </div></div>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/context.html b/web/tomcat/webapps/docs/config/context.html
new file mode 100644
index 0000000..06717a2
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/context.html
@@ -0,0 +1,1234 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Context Container</title><meta name="author" content="Craig R. McClanahan"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Context Container</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a><ol><li><a href="#Parallel_deployment">Parallel deployment</a></li><li><a href="#Naming">Naming</a></li><li><a href="#Defining_a_context">Defining a context</a></li></ol></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a><ol><li><a href="#Logging">Logging</a></li><li><a href="#Access_Logs">Access Logs</a></li><li><a href="#Automatic_Context_Configuration">Automatic Context Configuration</a></li><li><a href="#Context_Parameters">Context Parameters</a></li><li><a href="#Environment_Entries">Environment Entries</a></li><li><a href="#Lifecycle_Listeners">Lifecycle Listeners</a></li><li><a href="#Request_Filters">Request Filters</a></li><li><a href="#Resource_Definitions">Resource Definitions</a></li><li><a href="#Resource_Links">Resource Links</a></li><li><a href="#Transaction">Transaction</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p><em>
+ The description below uses the variable name $CATALINA_BASE to refer the
+ base directory against which most relative paths are resolved. If you have
+ not configured Tomcat for multiple instances by setting a CATALINA_BASE
+ directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME,
+ the directory into which you have installed Tomcat.
+ </em></p>
+
+ <p>The <strong>Context</strong> element represents a <em>web
+ application</em>, which is run within a particular virtual host.
+ Each web application is based on a <em>Web Application Archive</em>
+ (WAR) file, or a corresponding directory containing the corresponding
+ unpacked contents, as described in the Servlet Specification (version
+ 2.2 or later). For more information about web application archives,
+ you can download the
+ <a href="https://wiki.apache.org/tomcat/Specifications">Servlet
+ Specification</a>, and review the Tomcat
+ <a href="../appdev/index.html">Application Developer's Guide</a>.</p>
+
+ <p>The web application used to process each HTTP request is selected
+ by Catalina based on matching the longest possible prefix of the
+ Request URI against the <em>context path</em> of each defined Context.
+ Once selected, that Context will select an appropriate servlet to
+ process the incoming request, according to the servlet mappings defined
+ by the web application deployment.</p>
+
+ <p>You may define as many <strong>Context</strong> elements as you
+ wish. Each such Context MUST have a unique context name within a virtual
+ host. The context path does not need to be unique (see <em>parallel
+ deployment</em> below). In addition, a Context must be present with a
+ context path equal to
+ a zero-length string. This Context becomes the <em>default</em>
+ web application for this virtual host, and is used to process all
+ requests that do not match any other Context's context path.</p>
+
+ <div class="subsection"><h4 id="Parallel_deployment">Parallel deployment</h4><div class="text">
+ <p><b>You may deploy multiple versions of a web application with the same
+ context path at the same time.</b> The rules used to match requests to a
+ context version are as follows:
+ </p>
+ <ul>
+ <li>If no session information is present in the request, use the latest
+ version.</li>
+ <li>If session information is present in the request, check the session
+ manager of each version for a matching session and if one is found, use that
+ version.</li>
+ <li>If session information is present in the request but no matching session
+ can be found, use the latest version.</li>
+ </ul>
+ <p>The <a href="host.html">Host</a> may be configured (via the
+ <code>undeployOldVersions</code>) to remove old versions deployed in this way
+ once they are no longer in use.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Naming">Naming</h4><div class="text">
+ <p>When <code>autoDeploy</code> or <code>deployOnStartup</code> operations
+ are performed by a Host, the name and context path of the web application are
+ derived from the name(s) of the file(s) that define(s) the web application.
+ Consequently, the context path <strong>may not</strong> be defined in a
+ <code>META-INF/context.xml</code> embedded in the application and there is a
+ close relationship between the <em>context name</em>, <em>context path</em>,
+ <em>context version</em> and the <em>base file name</em> (the name minus any
+ <code>.war</code> or <code>.xml</code> extension) of the file.</p>
+
+ <p>If no version is specified then the <em>context name</em> is always the
+ same as the <em>context path</em>. If the <em>context path</em> is the empty
+ string then the <em>base name</em> will be ROOT (always in upper case)
+ otherwise the <em>base name</em> will be the <em>context path</em> with the
+ leading '/' removed and any remaining '/' characters replaced with '#'.</p>
+
+ <p>If a version is specified then the <em>context path</em> remains unchanged
+ and both the <em>context name</em> and the <em>base name</em> have the string
+ '##' appended to them followed by the version identifier.</p>
+
+ <p>Some examples of these naming conventions are given below.</p>
+
+ <table class="detail-table">
+ <tr>
+ <th>Context Path</th>
+ <th>Context Version</th>
+ <th>Context Name</th>
+ <th>Base File Name</th>
+ <th>Example File Names (.xml, .war & directory)</th>
+ </tr>
+ <tr>
+ <td>/foo</td>
+ <td><i>None</i></td>
+ <td>/foo</td>
+ <td>foo</td>
+ <td>foo.xml, foo.war, foo</td>
+ </tr>
+ <tr>
+ <td>/foo/bar</td>
+ <td><i>None</i></td>
+ <td>/foo/bar</td>
+ <td>foo#bar</td>
+ <td>foo#bar.xml, foo#bar.war, foo#bar</td>
+ </tr>
+ <tr>
+ <td><i>Empty String</i></td>
+ <td><i>None</i></td>
+ <td><i>Empty String</i></td>
+ <td>ROOT</td>
+ <td>ROOT.xml, ROOT.war, ROOT</td>
+ </tr>
+ <tr>
+ <td>/foo</td>
+ <td>42</td>
+ <td>/foo##42</td>
+ <td>foo##42</td>
+ <td>foo##42.xml, foo##42.war, foo##42</td>
+ </tr>
+ <tr>
+ <td>/foo/bar</td>
+ <td>42</td>
+ <td>/foo/bar##42</td>
+ <td>foo#bar##42</td>
+ <td>foo#bar##42.xml, foo#bar##42.war, foo#bar##42</td>
+ </tr>
+ <tr>
+ <td><i>Empty String</i></td>
+ <td>42</td>
+ <td>##42</td>
+ <td>ROOT##42</td>
+ <td>ROOT##42.xml, ROOT##42.war, ROOT##42</td>
+ </tr>
+ </table>
+
+ <p>The version component is treated as a <code>String</code> both for
+ performance reasons and to allow flexibility in versioning schemes. String
+ comparisons are used to determine version order. If version is not specified,
+ it is treated as the empty string.
+ Therefore,
+ <code>foo.war</code> will be treated as an earlier version than
+ <code>foo##11.war</code> and
+ <code>foo##11.war</code> will be treated as an earlier version than
+ <code>foo##2.war</code>. If using a purely numerical versioning scheme it is
+ recommended that zero padding is used so that <code>foo##002.war</code> is
+ treated as an earlier version than <code>foo##011.war</code>.
+ </p>
+
+ <p>If you want to deploy a WAR file or a directory using a context path that
+ is not related to the base file name then one of the following options must
+ be used to prevent double-deployment:
+ </p>
+ <ul>
+ <li>Disable autoDeploy and deployOnStartup and define all
+ <strong>Context</strong>s in server.xml</li>
+ <li>Locate the WAR and/or directory outside of the Host's
+ <code>appBase</code> and use a context.xml file with a
+ <code>docBase</code> attribute to define it.</li>
+ </ul>
+ </div></div>
+
+ <div class="subsection"><h4 id="Defining_a_context">Defining a context</h4><div class="text">
+ <p><b>It is NOT recommended to place <Context> elements directly in the
+ server.xml file.</b> This is because it makes modifying the
+ <strong>Context</strong> configuration more invasive since the main
+ <code>conf/server.xml</code> file cannot be reloaded without restarting
+ Tomcat. Default <strong>Context</strong> elements (see below) will also
+ <strong>overwrite</strong> the configuration of any <Context> elements
+ placed directly in server.xml. To prevent this, the <code>override</code>
+ attribute of the <Context> element defined in server.xml should be set
+ to <code>true</code>.</p>
+
+ <p>Individual <strong>Context</strong> elements may be explicitly defined:
+ </p>
+ <ul>
+ <li>In an individual file at <code>/META-INF/context.xml</code> inside the
+ application files. Optionally (based on the Host's copyXML attribute)
+ this may be copied to
+ <code>$CATALINA_BASE/conf/[enginename]/[hostname]/</code> and renamed to
+ application's base file name plus a ".xml" extension.</li>
+ <li>In individual files (with a ".xml" extension) in the
+ <code>$CATALINA_BASE/conf/[enginename]/[hostname]/</code> directory.
+ The context path and version will be derived from the base name of the file
+ (the file name less the .xml extension). This file will always take precedence
+ over any context.xml file packaged in the web application's META-INF
+ directory.</li>
+ <li>Inside a <a href="host.html">Host</a> element in the main
+ <code>conf/server.xml</code>.</li>
+ </ul>
+
+ <p>Default <strong>Context</strong> elements may be defined that apply to
+ multiple web applications. Configuration for an individual web application
+ will override anything configured in one of these defaults. Any nested
+ elements, e.g. <Resource> elements, that are defined in a default
+ <strong>Context</strong> will be created once for each
+ <strong>Context</strong> to which the default applies. They will <b>not</b> be
+ shared between <strong>Context</strong> elements.
+ </p>
+ <ul>
+ <li>In the <code>$CATALINA_BASE/conf/context.xml</code> file:
+ the Context element information will be loaded by all web applications.</li>
+ <li>In the
+ <code>$CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default</code>
+ file: the Context element information will be loaded by all web applications
+ of that host.</li>
+ </ul>
+
+ <p>With the exception of server.xml, files that define <strong>Context
+ </strong> elements may only define a single <strong>Context</strong> element.
+ </p>
+
+ <p>In addition to explicitly specified Context elements, there are
+ several techniques by which Context elements can be created automatically
+ for you. See <a href="host.html#Automatic_Application_Deployment">
+ Automatic Application Deployment</a> and
+ <a href="host.html#User_Web_Applications">User Web Applications</a>
+ for more information.</p>
+
+ <p>To define multiple contexts that use a single WAR file or directory,
+ use one of the options described in the <a href="#Naming">Naming</a>
+ section above for creating a <strong>Context</strong> that has a path
+ that is not related to the base file name.</p>
+ </div></div>
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>Context</strong>
+ support the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allowCasualMultipartParsing</code></td><td>
+ <p>Set to <code>true</code> if Tomcat should automatically parse
+ multipart/form-data request bodies when HttpServletRequest.getPart*
+ or HttpServletRequest.getParameter* is called, even when the
+ target servlet isn't marked with the @MultipartConfig annotation
+ (See Servlet Specification 3.0, Section 3.2 for details).
+ Note that any setting other than <code>false</code> causes Tomcat
+ to behave in a way that is not technically spec-compliant.
+ The default is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">allowMultipleLeadingForwardSlashInPath</code></td><td>
+ <p>Tomcat normalises sequences of multiple <code>/</code> characters in
+ a URI to a single <code>/</code>. This is for consistency with the
+ behaviour of file systems as URIs are often translated to file system
+ paths. As a result, the return value of
+ <code>HttpServletRequest#getContextPath()</code> is expected to start
+ with multiple <code>/</code> characters for some URIs. This will cause
+ problems if this value is used directly with
+ <code>HttpServletResponse#sendRedirect()</code> as redirect paths that
+ start with <code>//</code> are treated as protocol relative redirects.
+ To avoid potential issues, Tomcat will collapse multiple leading
+ <code>/</code> characters at the start of the return value for
+ <code>HttpServletRequest#getContextPath()</code> to a single
+ <code>/</code>. This attribute has a default value of <code>false</code>
+ which enables the collapsing of multiple <code>/</code> characters. To
+ disable this behaviour, set this attribute to <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">altDDName</code></td><td>
+ <p>The absolute path to the alternative deployment descriptor for this
+ context. This overrides the default deployment descriptor located at
+ <code>/WEB-INF/web.xml</code>.</p>
+ </td></tr><tr><td><code class="attributeName">backgroundProcessorDelay</code></td><td>
+ <p>This value represents the delay in seconds between the
+ invocation of the backgroundProcess method on this context and
+ its child containers, including all wrappers.
+ Child containers will not be invoked if their delay value is not
+ negative (which would mean they are using their own processing
+ thread). Setting this to a positive value will cause
+ a thread to be spawn. After waiting the specified amount of time,
+ the thread will invoke the backgroundProcess method on this host
+ and all its child containers. A context will use background
+ processing to perform session expiration and class monitoring for
+ reloading. If not specified, the default value for this attribute is
+ -1, which means the context will rely on the background processing
+ thread of its parent host.</p>
+ </td></tr><tr><td><code class="attributeName">className</code></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.catalina.Context</code> interface.
+ If not specified, the standard value (defined below) will be used.</p>
+ </td></tr><tr><td><code class="attributeName">containerSciFilter</code></td><td>
+ <p>The regular expression that specifies which container provided SCIs
+ should be filtered out and not used for this context. Matching uses
+ <code>java.util.regex.Matcher.find()</code> so the regular expression
+ only has to match a sub-string of the fully qualified class name of the
+ container provided SCI for it to be filtered out. If not specified,
+ no filtering will be applied.</p>
+ </td></tr><tr><td><code class="attributeName">cookies</code></td><td>
+ <p>Set to <code>true</code> if you want cookies to be used for
+ session identifier communication if supported by the client (this
+ is the default). Set to <code>false</code> if you want to disable
+ the use of cookies for session identifier communication, and rely
+ only on URL rewriting by the application.</p>
+ </td></tr><tr><td><code class="attributeName">createUploadTargets</code></td><td>
+ <p>Set to <code>true</code> if Tomcat should attempt to create the
+ temporary upload location specified in the <code>MultipartConfig</code>
+ for a Servlet if the location does not already exist. If not specified,
+ the default value of <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">crossContext</code></td><td>
+ <p>Set to <code>true</code> if you want calls within this application
+ to <code>ServletContext.getContext()</code> to successfully return a
+ request dispatcher for other web applications running on this virtual
+ host. Set to <code>false</code> (the default) in security
+ conscious environments, to make <code>getContext()</code> always
+ return <code>null</code>.</p>
+ </td></tr><tr><td><strong><code class="attributeName">docBase</code></strong></td><td>
+ <p>The <em>Document Base</em> (also known as the <em>Context
+ Root</em>) directory for this web application, or the pathname
+ to the web application archive file (if this web application is
+ being executed directly from the WAR file). You may specify
+ an absolute pathname for this directory or WAR file, or a pathname
+ that is relative to the <code>appBase</code> directory of the
+ owning <a href="host.html">Host</a>.</p>
+ <p>The value of this field must not be set unless the Context element is
+ defined in server.xml or the <code>docBase</code> is not located under
+ the <a href="host.html">Host</a>'s <code>appBase</code>.</p>
+ <p>If a symbolic link is used for <code>docBase</code> then changes to
+ the symbolic link will only be effective after a Tomcat restart or
+ by undeploying and redeploying the context. A context reload is not
+ sufficient.</p>
+ </td></tr><tr><td><code class="attributeName">dispatchersUseEncodedPaths</code></td><td>
+ <p>Controls whether paths used in calls to obtain a request dispatcher
+ ares expected to be encoded. This affects both how Tomcat handles calls
+ to obtain a request dispatcher as well as how Tomcat generates paths
+ used to obtain request dispatchers internally. If not specified, the
+ default value of <code>true</code> is used. When encoding/decoding paths
+ for a request dispatcher, UTF-8 is always used.</p>
+ </td></tr><tr><td><code class="attributeName">failCtxIfServletStartFails</code></td><td>
+ <p>Set to <code>true</code> to have the context fail its startup if any
+ servlet that has load-on-startup >=0 fails its own startup.</p>
+ <p>If not specified, the attribute of the same name in the parent Host
+ configuration is used if specified. Otherwise the default value of
+ <code>false</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">fireRequestListenersOnForwards</code></td><td>
+ <p>Set to <code>true</code> to fire any configured
+ ServletRequestListeners when Tomcat forwards a request. This is
+ primarily of use to users of CDI frameworks that use
+ ServletRequestListeners to configure the necessary environment for a
+ request. If not specified, the default value of <code>false</code> is
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">logEffectiveWebXml</code></td><td>
+ <p>Set to <code>true</code> if you want the effective web.xml used for a
+ web application to be logged (at INFO level) when the application
+ starts. The effective web.xml is the result of combining the
+ application's web.xml with any defaults configured by Tomcat and any
+ web-fragment.xml files and annotations discovered. If not specified, the
+ default value of <code>false</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">mapperContextRootRedirectEnabled</code></td><td>
+ <p>If enabled, requests for a web application context root will be
+ redirected (adding a trailing slash) if necessary by the Mapper rather
+ than the default Servlet. This is more efficient but has the side effect
+ of confirming that the context path exists. If not specified, the
+ default value of <code>true</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">mapperDirectoryRedirectEnabled</code></td><td>
+ <p>If enabled, requests for a web application directory will be
+ redirected (adding a trailing slash) if necessary by the Mapper rather
+ than the default Servlet. This is more efficient but has the side effect
+ of confirming that the directory is exists. If not specified, the
+ default value of <code>false</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">override</code></td><td>
+ <p>Set to <code>true</code> to ignore any settings in both the global
+ or <a href="host.html">Host</a> default contexts. By default, settings
+ from a default context will be used but may be overridden by a setting
+ the same attribute explicitly for the Context.</p>
+ </td></tr><tr><td><code class="attributeName">path</code></td><td>
+ <p>The <em>context path</em> of this web application, which is
+ matched against the beginning of each request URI to select the
+ appropriate web application for processing. All of the context paths
+ within a particular <a href="host.html">Host</a> must be unique.
+ If you specify a context path of an empty string (""), you are
+ defining the <em>default</em> web application for this Host, which
+ will process all requests not assigned to other Contexts.</p>
+ <p>This attribute must only be used when statically defining a Context
+ in server.xml. In all other circumstances, the path will be inferred
+ from the filenames used for either the .xml context file or the
+ <code>docBase</code>.
+ </p>
+ <p>Even when statically defining a Context in server.xml, this attribute
+ must not be set unless either the <code>docBase</code> is not located
+ under the <a href="host.html">Host</a>'s <code>appBase</code> or
+ both <code>deployOnStartup</code> and <code>autoDeploy</code> are
+ <code>false</code>. If this rule is not followed, double deployment is
+ likely to result.</p>
+ </td></tr><tr><td><code class="attributeName">preemptiveAuthentication</code></td><td>
+ <p>When set to <code>true</code> and the user presents credentials for a
+ resource that is not protected by a security constraint, if the
+ authenticator supports preemptive authentication (the standard
+ authenticators provided with Tomcat do) then the user' credentials
+ will be processed. If not specified, the default of <code>false</code> is
+ used.
+ </p>
+ </td></tr><tr><td><code class="attributeName">privileged</code></td><td>
+ <p>Set to <code>true</code> to allow this context to use container
+ servlets, like the manager servlet. Use of the <code>privileged</code>
+ attribute will change the context's parent class loader to be the
+ <em>Server</em> class loader rather than the <em>Shared</em> class
+ loader. Note that in a default installation, the <em>Common</em> class
+ loader is used for both the <em>Server</em> and the <em>Shared</em>
+ class loaders.</p>
+ </td></tr><tr><td><code class="attributeName">reloadable</code></td><td>
+ <p>Set to <code>true</code> if you want Catalina to monitor classes in
+ <code>/WEB-INF/classes/</code> and <code>/WEB-INF/lib</code> for
+ changes, and automatically reload the web application if a change
+ is detected. This feature is very useful during application
+ development, but it requires significant runtime overhead and is
+ not recommended for use on deployed production applications. That's
+ why the default setting for this attribute is <i>false</i>. You
+ can use the <a href="../manager-howto.html">Manager</a> web
+ application, however, to trigger reloads of deployed applications
+ on demand.</p>
+ </td></tr><tr><td><code class="attributeName">resourceOnlyServlets</code></td><td>
+ <p>Comma separated list of Servlet names (as used in
+ <code>/WEB-INF/web.xml</code>) that expect a resource to be present.
+ Ensures that welcome files associated with Servlets that expect a
+ resource to be present (such as the JSP Servlet) are not used when there
+ is no resource present. This prevents issues caused by the clarification
+ of welcome file mapping in section 10.10 of the Servlet 3.0
+ specification. If the
+ <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code>
+ <a href="systemprops.html">system property</a> is set to
+ <code>true</code>, the default value of this attribute will be the empty
+ string, else the default value will be <code>jsp</code>.</p>
+ </td></tr><tr><td><code class="attributeName">sendRedirectBody</code></td><td>
+ <p>If <code>true</code>, redirect responses will include a short
+ response body that includes details of the redirect as recommended by
+ RFC 2616. This is disabled by default since including a response body
+ may cause problems for some application component such as compression
+ filters.</p>
+ </td></tr><tr><td><code class="attributeName">sessionCookieDomain</code></td><td>
+ <p>The domain to be used for all session cookies created for this
+ context. If set, this overrides any domain set by the web application.
+ If not set, the value specified by the web application, if any, will be
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">sessionCookieName</code></td><td>
+ <p>The name to be used for all session cookies created for this
+ context. If set, this overrides any name set by the web application.
+ If not set, the value specified by the web application, if any, will be
+ used, or the name <code>JSESSIONID</code> if the web application does
+ not explicitly set one.</p>
+ </td></tr><tr><td><code class="attributeName">sessionCookiePath</code></td><td>
+ <p>The path to be used for all session cookies created for this
+ context. If set, this overrides any path set by the web application.
+ If not set, the value specified by the web application will be used, or
+ the context path used if the web application does not explicitly set
+ one. To configure all web application to use an empty path (this can be
+ useful for portlet specification implementations) set this attribute to
+ <code>/</code> in the global <code>CATALINA_BASE/conf/context.xml</code>
+ file.</p>
+ <p>Note: Once one web application using
+ <code>sessionCookiePath="/"</code> obtains a session, all
+ subsequent sessions for any other web application in the same host also
+ configured with <code>sessionCookiePath="/"</code> will always
+ use the same session ID. This holds even if the session is invalidated
+ and a new one created. This makes session fixation protection more
+ difficult and requires custom, Tomcat specific code to change the
+ session ID shared by the multiple applications.</p>
+ </td></tr><tr><td><code class="attributeName">sessionCookiePathUsesTrailingSlash</code></td><td>
+ <p>Some browsers, such as Internet Explorer, Safari and Edge, will send
+ a session cookie for a context with a path of <code>/foo</code> with a
+ request to <code>/foobar</code> in violation of RFC6265. This could
+ expose a session ID from an application deployed at <code>/foo</code> to
+ an application deployed at <code>/foobar</code>. If the application
+ deployed at <code>/foobar</code> is untrusted, this could create a
+ security risk. However, it should be noted that RFC 6265, section 8.5
+ makes clear that path alone should not be view as sufficient to prevent
+ untrusted applications accessing cookies from other applications. To
+ mitigate this risk, this attribute may be set to <code>true</code> and
+ Tomcat will add a trailing slash to the path associated with the session
+ cookie so, in the above example, the cookie path becomes /foo/. However,
+ with a cookie path of /foo/, browsers will no longer send the cookie
+ with a request to /foo. This should not be a problem unless there is a
+ servlet mapped to /*. In this case this attribute will need to be set to
+ <code>false</code> to disable this feature. The default value for this
+ attribute is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">swallowAbortedUploads</code></td><td>
+ <p>Set to <code>false</code> if Tomcat should <b>not</b> read any
+ additional request body data for aborted uploads and instead abort the
+ client connection. This setting is used in the following situations:
+ </p>
+ <ul>
+ <li>the size of the request body is larger than the
+ <code>maxPostSize</code> configured in the connector</li>
+ <li>the size limit of a MultiPart upload is reached</li>
+ <li>the servlet sets the response status to 413 (Request Entity Too
+ Large) </li>
+ </ul>
+ <p>
+ Not reading the additional data will free the request processing thread
+ more quickly. Unfortunately most HTTP clients will not read the response
+ if they cannot write the full request.</p>
+ <p>The default is <code>true</code>, so additional data will be
+ read.</p>
+ <p>Note if an error occurs during the request processing that triggers
+ a 5xx response, any unread request data will always be ignored and the
+ client connection will be closed once the error response has been
+ written.</p>
+ </td></tr><tr><td><code class="attributeName">swallowOutput</code></td><td>
+ <p>If the value of this flag is <code>true</code>, the bytes output to
+ System.out and System.err by the web application will be redirected to
+ the web application logger. If not specified, the default value
+ of the flag is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">tldValidation</code></td><td>
+ <p>If the value of this flag is <code>true</code>, the TLD files
+ will be XML validated on context startup. If the
+ <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code>
+ <a href="systemprops.html">system property</a> is set to
+ <code>true</code>, the default value of this attribute will be
+ <code>true</code>, else the default value will be <code>false</code>.
+ Setting this attribute to <code>true</code> will incur a performance
+ penalty.</p>
+ </td></tr><tr><td><code class="attributeName">useHttpOnly</code></td><td>
+ <p>Should the HttpOnly flag be set on session cookies to prevent client
+ side script from accessing the session ID? Defaults to
+ <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">useRelativeRedirects</code></td><td>
+ <p>Controls whether HTTP 1.1 and later location headers generated by a
+ call to
+ <code>javax.servlet.http.HttpServletResponse#sendRedirect(String)</code>
+ will use relative or absolute redirects. Relative redirects are more
+ efficient but may not work with reverse proxies that change the context
+ path. It should be noted that it is not recommended to use a reverse
+ proxy to change the context path because of the multiple issues it
+ creates. Absolute redirects should work with reverse proxies that change
+ the context path but may cause issues with the
+ <code>org.apache.catalina.filters.RemoteIpFilter</code> if the filter is
+ changing the scheme and/or port. If the
+ <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code>
+ <a href="systemprops.html">system property</a> is set to
+ <code>true</code>, the default value of this attribute will be
+ <code>false</code>, else the default value will be <code>true</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">validateClientProvidedNewSessionId</code></td><td>
+ <p>When a client provides the ID for a new session, this attribute
+ controls whether that ID is validated. The only use case for using a
+ client provided session ID is to have a common session ID across
+ multiple web applications. Therefore, any client provided session ID
+ should already exist in another web application. If this check is
+ enabled, the client provided session ID will only be used if the session
+ ID exists in at least one other web application for the current host.
+ Note that the following additional tests are always applied,
+ irrespective of this setting:</p>
+ <ul>
+ <li>The session ID is provided by a cookie</li>
+ <li>The session cookie has a path of {@code /}</li>
+ </ul>
+ <p>If not specified, the default value of <code>true</code> will be
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">wrapperClass</code></td><td>
+ <p>Java class name of the <code>org.apache.catalina.Wrapper</code>
+ implementation class that will be used for servlets managed by this
+ Context. If not specified, a standard default value will be used.</p>
+ </td></tr><tr><td><code class="attributeName">xmlBlockExternal</code></td><td>
+ <p>If the value of this flag is <code>true</code>, the parsing of
+ <code>web.xml</code>, <code>web-fragment.xml</code>, <code>*.tld</code>,
+ <code>*.jspx</code>, <code>*.tagx</code> and <code>tagPlugins.xml</code>
+ files for this web application will not permit external entities to be
+ loaded. If not specified, the default value of <code>true</code> will
+ be used.</p>
+ </td></tr><tr><td><code class="attributeName">xmlNamespaceAware</code></td><td>
+ <p>If the value of this flag is <code>true</code>, the parsing of
+ <code>web.xml</code> and <code>web-fragment.xml</code> files for this
+ web application will be namespace-aware. Note that <code>*.tld</code>,
+ <code>*.jspx</code> and <code>*.tagx</code> files are always parsed
+ using a namespace-aware parser and that the <code>tagPlugins.xml</code>
+ file (if any) is never parsed using a namespace-aware parser. Note also
+ that if you turn this flag on, you should probably also turn
+ <code>xmlValidation</code> on. If the
+ <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code>
+ <a href="systemprops.html">system property</a> is set to
+ <code>true</code>, the default value of this attribute will be
+ <code>true</code>, else the default value will be <code>false</code>.
+ Setting this attribute to <code>true</code> will incur a performance
+ penalty.</p>
+ </td></tr><tr><td><code class="attributeName">xmlValidation</code></td><td>
+ <p>If the value of this flag is <code>true</code>, the parsing of
+ <code>web.xml</code> and <code>web-fragment.xml</code> files for this
+ web application will use a validating parser. If the
+ <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code>
+ <a href="systemprops.html">system property</a> is set to
+ <code>true</code>, the default value of this attribute will be
+ <code>true</code>, else the default value will be <code>false</code>.
+ Setting this attribute to <code>true</code> will incur a performance
+ penalty.</p>
+ </td></tr></table>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text">
+
+ <p>The standard implementation of <strong>Context</strong> is
+ <strong>org.apache.catalina.core.StandardContext</strong>.
+ It supports the following additional attributes (in addition to the
+ common attributes listed above):</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">addWebinfClassesResources</code></td><td>
+ <p>This attribute controls if, in addition to static resources being
+ served from <code>META-INF/resources</code> inside web application JAR
+ files, static resources are also served from
+ <code>WEB-INF/classes/META-INF/resources</code>. This only applies to
+ web applications with a major version of 3 or higher. Since this is a
+ proprietary extension to the Servlet 3 specification, it is disabled by
+ default. To enable this feature, set the attribute to <code>true</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">antiResourceLocking</code></td><td>
+ <p>If <code>true</code>, Tomcat will prevent any file locking.
+ This will significantly impact startup time of applications,
+ but allows full webapp hot deploy and undeploy on platforms
+ or configurations where file locking can occur.
+ If not specified, the default value is <code>false</code>.</p>
+
+ <p>Please note that setting this to <code>true</code> has some side
+ effects, including the disabling of JSP reloading in a running server:
+ see <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=37668">
+ Bugzilla 37668</a>.</p>
+
+ <p>Please note that setting this flag to <code>true</code> in
+ applications that are outside the <code>appBase</code> for the Host (the
+ <code>webapps</code> directory by default) will cause the application to
+ be <strong>deleted</strong> on Tomcat shutdown. You probably don't want
+ to do this, so think twice before setting antiResourceLocking=true on a
+ webapp that's outside the <code>appBase</code> for its Host.</p>
+ </td></tr><tr><td><code class="attributeName">clearReferencesHttpClientKeepAliveThread</code></td><td>
+ <p>If <code>true</code> and an <code>sun.net.www.http.HttpClient</code>
+ keep-alive timer thread has been started by this web application and is
+ still running, Tomcat will change the context class loader for that
+ thread from the web application class loader to the parent of the web
+ application class loader to prevent a memory leak. Note that the
+ keep-alive timer thread will stop on its own once the keep-alives all
+ expire however, on a busy system that might not happen for some time. If
+ not specified, the default value of <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">clearReferencesObjectStreamClassCaches</code></td><td>
+ <p>If <code>true</code>, when the web application is stopped Tomcat
+ looks for <code>SoftReference</code>s to classes loaded by the web
+ application in the <code>ObjectStreamClass</code> class used for
+ serialization and clears any <code>SoftReference</code>s it finds. This
+ feature uses reflection to identify the <code>SoftReference</code>s and
+ therefore requires that the command line option
+ <code>-XaddExports:java.base/java.io=ALL-UNNAMED</code> is set
+ when running on Java 9 and above. If not specified, the default value of
+ <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">clearReferencesRmiTargets</code></td><td>
+ <p>If <code>true</code>, Tomcat looks for memory leaks associated with
+ RMI Targets and clears any it finds. This feature uses reflection to
+ identify the leaks and therefore requires that the command line option
+ <code>-XaddExports:java.rmi/sun.rmi.transport=ALL-UNNAMED</code> is set
+ when running on Java 9 and above. Applications without memory leaks
+ should operate correctly with this attribute set to <code>false</code>.
+ If not specified, the default value of <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">clearReferencesStopThreads</code></td><td>
+ <p>If <code>true</code>, Tomcat attempts to terminate threads that have
+ been started by the web application. Stopping threads is performed via
+ the deprecated (for good reason) <code>Thread.stop()</code> method and
+ is likely to result in instability. As such, enabling this should be
+ viewed as an option of last resort in a development environment and is
+ not recommended in a production environment. If not specified, the
+ default value of <code>false</code> will be used. If this feature is
+ enabled, web applications may take up to two seconds longer to stop as
+ executor threads are given up to two seconds to stop gracefully before
+ <code>Thread.stop()</code> is called on any remaining threads.</p>
+ </td></tr><tr><td><code class="attributeName">clearReferencesStopTimerThreads</code></td><td>
+ <p>If <code>true</code>, Tomcat attempts to terminate
+ <code>java.util.Timer</code> threads that have been started by the web
+ application. Unlike standard threads, timer threads can be stopped
+ safely although there may still be side-effects for the application. If
+ not specified, the default value of <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">clearReferencesThreadLocals</code></td><td>
+ <p>If <code>true</code>, Tomcat attempts to clear
+ <code>java.lang.ThreadLocal</code> variables that have been populated
+ with classes loaded by the web application. If not specified, the
+ default value of <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">copyXML</code></td><td>
+ <p>Set to <code>true</code> if you want a context XML descriptor
+ embedded inside the application (located at
+ <code>/META-INF/context.xml</code>) to be copied to the owning
+ <a href="host.html">Host</a>'s <code>xmlBase</code> when the application
+ is deployed. On subsequent starts, the copied context XML descriptor
+ will be used in preference to any context XML descriptor embedded inside
+ the application even if the descriptor embedded inside the application
+ is more recent. The default is <code>false</code>. Note if
+ the <strong>deployXML</strong> attribute of the owning
+ <a href="host.html">Host</a> is <code>false</code> or if the
+ <strong>copyXML</strong> attribute of the owning
+ <a href="host.html">Host</a> is <code>true</code>, this attribute will
+ have no effect.</p>
+ </td></tr><tr><td><code class="attributeName">jndiExceptionOnFailedWrite</code></td><td>
+ <p>If <code>true</code>, any attempt by an application to modify the
+ provided JNDI context with a call to bind(), unbind(),
+ createSubContext(), destroySubContext() or close() will trigger a
+ <code>javax.naming.OperationNotSupportedException</code> as required by
+ section EE.5.3.4 of the Java EE specification. This exception can be
+ disabled by setting this attribute to <code>false</code> in which case
+ any calls to modify the JNDI context will return <b>without</b> making
+ any changes and methods that return values will return
+ <code>null</code>. If not specified, the specification compliant default
+ of <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">renewThreadsWhenStoppingContext</code></td><td>
+ <p>If <code>true</code>, when this context is stopped, Tomcat renews all
+ the threads from the thread pool that was used to serve this context.
+ This also requires that the
+ <code>ThreadLocalLeakPreventionListener</code> be configured in
+ <code>server.xml</code> and that the <code>threadRenewalDelay</code>
+ property of the <code>Executor</code> be >=0. If not specified, the
+ default value of <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">skipMemoryLeakChecksOnJvmShutdown</code></td><td>
+ <p>If <code>true</code>, Tomcat will not perform the usual memory leak
+ checks when the web application is stopped if that web application is
+ stopped as part of a JVM shutdown. If not specified, the default value
+ of <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">unloadDelay</code></td><td>
+ <p>Number of ms that the container will wait for servlets to unload.
+ If not specified, the default value is <code>2000</code> ms.</p>
+ </td></tr><tr><td><code class="attributeName">unpackWAR</code></td><td>
+ <p>If <code>false</code>, the <strong>unpackWARs</strong> attribute of
+ the owning <a href="host.html">Host</a> will be overridden and the WAR
+ file will not be unpacked. If <code>true</code>, the value of the owning
+ <a href="host.html">Host</a>'s <strong>unpackWARs</strong>
+ attribute will determine if the WAR is unpacked. If not specified, the
+ default value is <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">useNaming</code></td><td>
+ <p>Set to <code>true</code> (the default) to have Catalina enable a
+ JNDI <code>InitialContext</code> for this web application that is
+ compatible with Java2 Enterprise Edition (J2EE) platform
+ conventions.</p>
+ </td></tr><tr><td><code class="attributeName">workDir</code></td><td>
+ <p>Pathname to a scratch directory to be provided by this Context
+ for temporary read-write use by servlets within the associated web
+ application. This directory will be made visible to servlets in the
+ web application by a servlet context attribute (of type
+ <code>java.io.File</code>) named
+ <code>javax.servlet.context.tempdir</code> as described in the
+ Servlet Specification. If not specified, a suitable directory
+ underneath <code>$CATALINA_BASE/work</code> will be provided.</p>
+ </td></tr></table>
+
+ </div></div>
+
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+ <p>You can nest at most one instance of the following utility components
+ by nesting a corresponding element inside your <strong>Context</strong>
+ element:</p>
+ <ul>
+ <li><a href="cookie-processor.html"><strong>Cookie Processor</strong></a> -
+ Configure parsing and generation of HTTP cookie headers.</li>
+ <li><a href="loader.html"><strong>Loader</strong></a> -
+ Configure the web application class loader that will be used to load
+ servlet and bean classes for this web application. Normally, the
+ default configuration of the class loader will be sufficient.</li>
+ <li><a href="manager.html"><strong>Manager</strong></a> -
+ Configure the session manager that will be used to create, destroy,
+ and persist HTTP sessions for this web application. Normally, the
+ default configuration of the session manager will be sufficient.</li>
+ <li><a href="realm.html"><strong>Realm</strong></a> -
+ Configure a realm that will allow its
+ database of users, and their associated roles, to be utilized solely
+ for this particular web application. If not specified, this web
+ application will utilize the Realm associated with the owning
+ <a href="host.html">Host</a> or <a href="engine.html">Engine</a>.</li>
+ <li><a href="resources.html"><strong>Resources</strong></a> -
+ Configure the resource manager that will be used to access the static
+ resources associated with this web application. Normally, the
+ default configuration of the resource manager will be sufficient.</li>
+ <li><strong>WatchedResource</strong> - The auto deployer will monitor the
+ specified static resource of the web application for updates, and will
+ reload the web application if it is updated. The content of this element
+ must be a string.</li>
+ <li><a href="jar-scanner.html"><strong>JarScanner</strong></a> -
+ Configure the Jar Scanner that will be used to scan the web application
+ for JAR files and directories of class files. It is typically used during
+ web application start to identify configuration files such as TLDs o
+ web-fragment.xml files that must be processed as part of the web
+ application initialisation. Normally, the default Jar Scanner
+ configuration will be sufficient.</li>
+ </ul>
+
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+
+
+ <div class="subsection"><h4 id="Logging">Logging</h4><div class="text">
+
+ <p>A context is associated with the
+ <code>org.apache.catalina.core.ContainerBase.[enginename].[hostname].[path]</code>
+ log category. Note that the brackets are actually part of the name, don't omit them.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Access_Logs">Access Logs</h4><div class="text">
+
+ <p>When you run a web server, one of the output files normally generated
+ is an <em>access log</em>, which generates one line of information for
+ each request processed by the server, in a standard format. Catalina
+ includes an optional <a href="valve.html">Valve</a> implementation that
+ can create access logs in the same standard format created by web servers,
+ or in any number of custom formats.</p>
+
+ <p>You can ask Catalina to create an access log for all requests
+ processed by an <a href="engine.html">Engine</a>,
+ <a href="host.html">Host</a>, or <a href="context.html">Context</a>
+ by nesting a <a href="valve.html">Valve</a> element like this:</p>
+
+<div class="codeBox"><pre><code><Context>
+ ...
+ <Valve className="org.apache.catalina.valves.AccessLogValve"
+ prefix="localhost_access_log" suffix=".txt"
+ pattern="common"/>
+ ...
+</Context></code></pre></div>
+
+ <p>See <a href="valve.html#Access_Logging">Access Logging Valves</a>
+ for more information on the configuration attributes that are
+ supported.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Automatic_Context_Configuration">Automatic Context Configuration</h4><div class="text">
+
+ <p>If you use the standard <strong>Context</strong> implementation,
+ the following configuration steps occur automatically when Catalina
+ is started, or whenever this web application is reloaded. No special
+ configuration is required to enable this feature.</p>
+
+ <ul>
+ <li>If you have not declared your own <a href="loader.html">Loader</a>
+ element, a standard web application class loader will be configured.
+ </li>
+ <li>If you have not declared your own <a href="manager.html">Manager</a>
+ element, a standard session manager will be configured.</li>
+ <li>If you have not declared your own <a href="resources.html">Resources</a>
+ element, a standard resources manager will be configured.</li>
+ <li>The web application properties listed in <code>conf/web.xml</code>
+ will be processed as defaults for this web application. This is used
+ to establish default mappings (such as mapping the <code>*.jsp</code>
+ extension to the corresponding JSP servlet), and other standard
+ features that apply to all web applications.</li>
+ <li>The web application properties listed in the
+ <code>/WEB-INF/web.xml</code> resource for this web application
+ will be processed (if this resource exists).</li>
+ <li>If your web application has specified security constraints that might
+ require user authentication, an appropriate Authenticator that
+ implements the login method you have selected will be configured.</li>
+ </ul>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Context_Parameters">Context Parameters</h4><div class="text">
+
+ <p>You can configure named values that will be made visible to the
+ web application as servlet context initialization parameters by nesting
+ <code><Parameter></code> elements inside this element. For
+ example, you can create an initialization parameter like this:</p>
+<div class="codeBox"><pre><code><Context>
+ ...
+ <Parameter name="companyName" value="My Company, Incorporated"
+ override="false"/>
+ ...
+</Context></code></pre></div>
+
+ <p>This is equivalent to the inclusion of the following element in the
+ web application deployment descriptor (<code>/WEB-INF/web.xml</code>):
+ </p>
+<div class="codeBox"><pre><code><context-param>
+ <param-name>companyName</param-name>
+ <param-value>My Company, Incorporated</param-value>
+</context-param></code></pre></div>
+ <p>but does <em>not</em> require modification of the deployment descriptor
+ to customize this value.</p>
+
+ <p>The valid attributes for a <code><Parameter></code> element
+ are as follows:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">description</code></td><td>
+ <p>Optional, human-readable description of this context
+ initialization parameter.</p>
+ </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td>
+ <p>The name of the context initialization parameter to be created.</p>
+ </td></tr><tr><td><code class="attributeName">override</code></td><td>
+ <p>Set this to <code>false</code> if you do <strong>not</strong> want
+ a <code><context-param></code> for the same parameter name,
+ found in the web application deployment descriptor, to override the
+ value specified here. By default, overrides are allowed.</p>
+ </td></tr><tr><td><strong><code class="attributeName">value</code></strong></td><td>
+ <p>The parameter value that will be presented to the application
+ when requested by calling
+ <code>ServletContext.getInitParameter()</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Environment_Entries">Environment Entries</h4><div class="text">
+
+ <p>You can configure named values that will be made visible to the
+ web application as environment entry resources, by nesting
+ <code><Environment></code> entries inside this element. For
+ example, you can create an environment entry like this:</p>
+<div class="codeBox"><pre><code><Context>
+ ...
+ <Environment name="maxExemptions" value="10"
+ type="java.lang.Integer" override="false"/>
+ ...
+</Context></code></pre></div>
+
+ <p>This is equivalent to the inclusion of the following element in the
+ web application deployment descriptor (<code>/WEB-INF/web.xml</code>):
+ </p>
+<div class="codeBox"><pre><code><env-entry>
+ <env-entry-name>maxExemptions</env-entry-name>
+ <env-entry-value>10</env-entry-value>
+ <env-entry-type>java.lang.Integer</env-entry-type>
+</env-entry></code></pre></div>
+ <p>but does <em>not</em> require modification of the deployment descriptor
+ to customize this value.</p>
+
+ <p>The valid attributes for an <code><Environment></code> element
+ are as follows:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">description</code></td><td>
+ <p>Optional, human-readable description of this environment entry.</p>
+ </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td>
+ <p>The name of the environment entry to be created, relative to the
+ <code>java:comp/env</code> context.</p>
+ </td></tr><tr><td><code class="attributeName">override</code></td><td>
+ <p>Set this to <code>false</code> if you do <strong>not</strong> want
+ an <code><env-entry></code> for the same environment entry name,
+ found in the web application deployment descriptor, to override the
+ value specified here. By default, overrides are allowed.</p>
+ </td></tr><tr><td><strong><code class="attributeName">type</code></strong></td><td>
+ <p>The fully qualified Java class name expected by the web application
+ for this environment entry. Must be a legal value for
+ <code><env-entry-type></code> in the web application deployment
+ descriptor.</p>
+ </td></tr><tr><td><strong><code class="attributeName">value</code></strong></td><td>
+ <p>The parameter value that will be presented to the application
+ when requested from the JNDI context. This value must be convertable
+ to the Java type defined by the <code>type</code> attribute.</p>
+ </td></tr></table>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Lifecycle_Listeners">Lifecycle Listeners</h4><div class="text">
+
+ <p>If you have implemented a Java object that needs to know when this
+ <strong>Context</strong> is started or stopped, you can declare it by
+ nesting a <strong>Listener</strong> element inside this element. The
+ class name you specify must implement the
+ <code>org.apache.catalina.LifecycleListener</code> interface, and
+ the class must be packaged in a jar and placed in the
+ <code>$CATALINA_HOME/lib</code> directory.
+ It will be notified about the occurrence of the corresponding
+ lifecycle events. Configuration of such a listener looks like this:</p>
+
+<div class="codeBox"><pre><code><Context>
+ ...
+ <Listener className="com.mycompany.mypackage.MyListener" ... >
+ ...
+</Context></code></pre></div>
+
+ <p>Note that a Listener can have any number of additional properties
+ that may be configured from this element. Attribute names are matched
+ to corresponding JavaBean property names using the standard property
+ method naming patterns.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Request_Filters">Request Filters</h4><div class="text">
+
+ <p>You can ask Catalina to check the IP address, or host name, on every
+ incoming request directed to the surrounding
+ <a href="engine.html">Engine</a>, <a href="host.html">Host</a>, or
+ <a href="context.html">Context</a> element. The remote address or name
+ will be checked against configured "accept" and/or "deny"
+ filters, which are defined using <code>java.util.regex</code> Regular
+ Expression syntax. Requests that come from locations that are
+ not accepted will be rejected with an HTTP "Forbidden" error.
+ Example filter declarations:</p>
+
+<div class="codeBox"><pre><code><Context>
+ ...
+ <Valve className="org.apache.catalina.valves.RemoteHostValve"
+ allow=".*\.mycompany\.com|www\.yourcompany\.com"/>
+ <Valve className="org.apache.catalina.valves.RemoteAddrValve"
+ deny="192\.168\.1\.\d+"/>
+ ...
+</Context></code></pre></div>
+
+ <p>See <a href="valve.html#Remote_Address_Filter">Remote Address Filter</a>
+ and <a href="valve.html#Remote_Host_Filter">Remote Host Filter</a> for
+ more information about the configuration options that are supported.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Resource_Definitions">Resource Definitions</h4><div class="text">
+
+ <p>You can declare the characteristics of the resource
+ to be returned for JNDI lookups of <code><resource-ref></code> and
+ <code><resource-env-ref></code> elements in the web application
+ deployment descriptor. You <strong>MUST</strong> also define
+ the needed resource parameters as attributes of the <code>Resource</code>
+ element, to configure the object factory to be used (if not known to Tomcat
+ already), and the properties used to configure that object factory.</p>
+
+ <p>For example, you can create a resource definition like this:</p>
+<div class="codeBox"><pre><code><Context>
+ ...
+ <Resource name="jdbc/EmployeeDB" auth="Container"
+ type="javax.sql.DataSource"
+ description="Employees Database for HR Applications"/>
+ ...
+</Context></code></pre></div>
+
+ <p>This is equivalent to the inclusion of the following element in the
+ web application deployment descriptor (<code>/WEB-INF/web.xml</code>):</p>
+<div class="codeBox"><pre><code><resource-ref>
+ <description>Employees Database for HR Applications</description>
+ <res-ref-name>jdbc/EmployeeDB</res-ref-name>
+ <res-ref-type>javax.sql.DataSource</res-ref-type>
+ <res-auth>Container</res-auth>
+</resource-ref></code></pre></div>
+
+ <p>but does <em>not</em> require modification of the deployment
+ descriptor to customize this value.</p>
+
+ <p>The valid attributes for a <code><Resource></code> element
+ are as follows:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">auth</code></td><td>
+ <p>Specify whether the web Application code signs on to the
+ corresponding resource manager programmatically, or whether the
+ Container will sign on to the resource manager on behalf of the
+ application. The value of this attribute must be
+ <code>Application</code> or <code>Container</code>. This
+ attribute is <strong>required</strong> if the web application
+ will use a <code><resource-ref></code> element in the web
+ application deployment descriptor, but is optional if the
+ application uses a <code><resource-env-ref></code> instead.</p>
+ </td></tr><tr><td><code class="attributeName">closeMethod</code></td><td>
+ <p>Name of the zero-argument method to call on a singleton resource when
+ it is no longer required. This is intended to speed up clean-up of
+ resources that would otherwise happen as part of garbage collection.
+ This attribute is ignored if the <code>singleton</code> attribute is
+ <code>false</code>.</p>
+ <p>For <code>javax.sql.DataSource</code> and
+ <code>javax.sql.XADataSource</code> resources that implement
+ <code>AutoCloseable</code> such as Apache Commons DBCP 2 and the default
+ Apache Tomcat connection pool, this attribute is defaults to
+ <code>close</code>. This may be disabled by setting the attribute to the
+ empty string. For all other resource types no default is defined and no
+ close method will be called by default.</p>
+ </td></tr><tr><td><code class="attributeName">description</code></td><td>
+ <p>Optional, human-readable description of this resource.</p>
+ </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td>
+ <p>The name of the resource to be created, relative to the
+ <code>java:comp/env</code> context.</p>
+ </td></tr><tr><td><code class="attributeName">scope</code></td><td>
+ <p>Specify whether connections obtained through this resource
+ manager can be shared. The value of this attribute must be
+ <code>Shareable</code> or <code>Unshareable</code>. By default,
+ connections are assumed to be shareable.</p>
+ </td></tr><tr><td><code class="attributeName">singleton</code></td><td>
+ <p>Specify whether this resource definition is for a singleton resource,
+ i.e. one where there is only a single instance of the resource. If this
+ attribute is <code>true</code>, multiple JNDI lookups for this resource
+ will return the same object. If this attribute is <code>false</code>,
+ multiple JNDI lookups for this resource will return different objects.
+ This attribute must be <code>true</code> for
+ <code>javax.sql.DataSource</code> resources to enable JMX registration
+ of the DataSource. The value of this attribute must be <code>true</code>
+ or <code>false</code>. By default, this attribute is <code>true</code>.
+ </p>
+ </td></tr><tr><td><strong><code class="attributeName">type</code></strong></td><td>
+ <p>The fully qualified Java class name expected by the web
+ application when it performs a lookup for this resource.</p>
+ </td></tr></table>
+
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Resource_Links">Resource Links</h4><div class="text">
+
+ <p>This element is used to create a link to a global JNDI resource. Doing
+ a JNDI lookup on the link name will then return the linked global
+ resource.</p>
+
+ <p>For example, you can create a resource link like this:</p>
+<div class="codeBox"><pre><code><Context>
+ ...
+ <ResourceLink name="linkToGlobalResource"
+ global="simpleValue"
+ type="java.lang.Integer"
+ ...
+</Context></code></pre></div>
+
+ <p>The valid attributes for a <code><ResourceLink></code> element
+ are as follows:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">global</code></strong></td><td>
+ <p>The name of the linked global resource in the
+ global JNDI context.</p>
+ </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td>
+ <p>The name of the resource link to be created, relative to the
+ <code>java:comp/env</code> context.</p>
+ </td></tr><tr><td><strong><code class="attributeName">type</code></strong></td><td>
+ <p>The fully qualified Java class name expected by the web
+ application when it performs a lookup for this resource link.</p>
+ </td></tr><tr><td><code class="attributeName">factory</code></td><td>
+ <p>The fully qualified Java class name for the class creating these objects.
+ This class should implement the <code>javax.naming.spi.ObjectFactory</code> interface.</p>
+ </td></tr></table>
+
+ <p>When the attribute <code>factory="org.apache.naming.factory.DataSourceLinkFactory"</code> the resource link can be used with
+ two additional attributes to allow a shared data source to be used with different credentials.
+ When these two additional attributes are used in combination with the <code>javax.sql.DataSource</code>
+ type, different contexts can share a global data source with different credentials.
+ Under the hood, what happens is that a call to <a href="http://docs.oracle.com/javase/7/docs/api/javax/sql/DataSource.html#getConnection()"><code>getConnection()</code></a>
+ is simply translated to a call <a href="http://docs.oracle.com/javase/7/docs/api/javax/sql/DataSource.html#getConnection(java.lang.String,%20java.lang.String)">
+ <code>getConnection(username, password)</code></a> on the global data source. This is an easy way to get code to be transparent to what schemas are being used,
+ yet be able to control connections (or pools) in the global configuration.
+ </p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">username</code></td><td>
+ <p><code>username</code> value for the <code>getConnection(username, password)</code>
+ call on the linked global DataSource.
+ </p>
+ </td></tr><tr><td><code class="attributeName">password</code></td><td>
+ <p><code>password</code> value for the <code>getConnection(username, password)</code>
+ call on the linked global DataSource.
+ </p>
+ </td></tr></table>
+ <p>Shared Data Source Example:</p>
+ <p><strong>Warning:</strong> This feature works only if the global DataSource
+supports <code>getConnection(username, password)</code> method.
+<a href="https://commons.apache.org/dbcp/">Apache Commons DBCP 2</a> pool that
+Tomcat uses by default does not support it. See its Javadoc for
+<code>BasicDataSource</code> class.
+<a href="../jdbc-pool.html">Apache Tomcat JDBC pool</a> does support it,
+but by default this support is disabled and can be enabled by
+<code>alternateUsernameAllowed</code> attribute. See its documentation
+for details.</p>
+<div class="codeBox"><pre><code><GlobalNamingResources>
+ ...
+ <Resource name="sharedDataSource"
+ global="sharedDataSource"
+ type="javax.sql.DataSource"
+ factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
+ alternateUsernameAllowed="true"
+ username="bar"
+ password="barpass"
+ ...
+ ...
+</GlobalNamingResources>
+
+<Context path="/foo"...>
+ ...
+ <ResourceLink
+ name="appDataSource"
+ global="sharedDataSource"
+ type="javax.sql.DataSource"
+ factory="org.apache.naming.factory.DataSourceLinkFactory"
+ username="foo"
+ password="foopass"
+ ...
+</Context>
+<Context path="/bar"...>
+ ...
+ <ResourceLink
+ name="appDataSource"
+ global="sharedDataSource"
+ type="javax.sql.DataSource"
+ ...
+</Context></code></pre></div>
+ <p>When a request for <code>getConnection()</code> is made in the
+ <code>/foo</code> context, the request is translated into
+ <code>getConnection("foo","foopass")</code>,
+ while a request in the <code>/bar</code> gets passed straight through.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Transaction">Transaction</h4><div class="text">
+
+ <p>You can declare the characteristics of the UserTransaction
+ to be returned for JNDI lookup for <code>java:comp/UserTransaction</code>.
+ You <strong>MUST</strong> define an object factory class to instantiate
+ this object as well as the needed resource parameters as attributes of the
+ <code>Transaction</code>
+ element, and the properties used to configure that object factory.</p>
+
+ <p>The valid attributes for the <code><Transaction></code> element
+ are as follows:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">factory</code></strong></td><td>
+ <p>The class name for the JNDI object factory.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/cookie-processor.html b/web/tomcat/webapps/docs/config/cookie-processor.html
new file mode 100644
index 0000000..1294297
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/cookie-processor.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Cookie Processor Component</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Cookie Processor Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li><li><a href="#Legacy_Cookie_Processor_-_org.apache.tomcat.util.http.LegacyCookieProcessor">Legacy Cookie Processor - org.apache.tomcat.util.http.LegacyCookieProcessor</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The <strong>CookieProcessor</strong> element represents the component that
+ parses received cookie headers into <code>javax.servlet.http.Cookie</code>
+ objects accessible through <code>HttpServletRequest.getCookies()</code> and
+ converts <code>javax.servlet.http.Cookie</code> objects added to the response
+ through <code>HttpServletResponse.addCookie()</code> to the HTTP headers
+ returned to the client.</p>
+
+ <p>A CookieProcessor element MAY be nested inside a
+ <a href="context.html">Context</a> component. If it is not included, a default
+ implementation will be created automatically.</p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>CookieProcessor</strong> support the
+ following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">className</code></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.tomcat.util.http.CookieProcessor</code>
+ interface. If not specified, the standard value (defined below) will be
+ used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text">
+
+ <p>The standard implementation of <strong>CookieProcessor</strong> is
+ <code>org.apache.tomcat.util.http.Rfc6265CookieProcessor</code>.</p>
+
+ <p>This cookie processor is based on RFC6265 with the following changes to
+ support better interoperability:</p>
+
+ <ul>
+ <li>Values 0x80 to 0xFF are permitted in cookie-octet to support the use
+ of UTF-8 in cookie values as used by HTML 5.</li>
+ <li>For cookies without a value, the '=' is not required after the name as
+ some browsers do not sent it.</li>
+ </ul>
+
+ <p>The RFC 6265 cookie processor is generally more lenient than the legacy
+ cookie parser. In particular:</p>
+
+ <ul>
+ <li>The '<code>=</code>' and '<code>/</code>' characters are always
+ permitted in a cookie value.</li>
+ <li>Name only cookies are always permitted.</li>
+ <li>The cookie header is always preserved.</li>
+ </ul>
+
+ <p>The <strong>RFC 6265 Cookie Processor</strong> supports the following
+ additional attributes.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">sameSiteCookies</code></td><td>
+ <p>Enables setting same-site cookie attribute.</p>
+
+ <p>If value is <code>unset</code> then the same-site cookie attribute
+ won't be set. This is the default value.</p>
+
+ <p>If value is <code>none</code> then the same-site cookie attribute
+ will be set and the cookie will always be sent in cross-site requests.</p>
+
+ <p>If value is <code>lax</code> then the browser only sends the cookie
+ in same-site requests and cross-site top level GET requests.</p>
+
+ <p>If value is <code>strict</code> then the browser prevents sending the
+ cookie in any cross-site request.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Legacy_Cookie_Processor_-_org.apache.tomcat.util.http.LegacyCookieProcessor">Legacy Cookie Processor - org.apache.tomcat.util.http.LegacyCookieProcessor</h4><div class="text">
+
+ <p>This is the legacy cookie parser based on RFC6265, RFC2109 and RFC2616.
+ It implements a strict interpretation of the cookie specifications. Due to
+ various interoperability issues with browsers not all strict behaviours
+ are enabled by default and additional options are available to further
+ relax the behaviour of this cookie processor if required.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allowEqualsInValue</code></td><td>
+ <p>If this is <code>true</code> Tomcat will allow '<code>=</code>'
+ characters when parsing unquoted cookie values. If <code>false</code>,
+ cookie values containing '<code>=</code>' will be terminated when the
+ '<code>=</code>' is encountered and the remainder of the cookie value
+ will be dropped.</p>
+ <p>If not set the specification compliant default value of
+ <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">allowHttpSepsInV0</code></td><td>
+ <p>If this is <code>true</code> Tomcat will allow HTTP separators in
+ cookie names and values.</p>
+ <p>If not specified, the default specification compliant value of
+ <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">allowNameOnly</code></td><td>
+ <p>If this is <code>true</code> Tomcat will allow name only cookies
+ (with or without trailing '<code>=</code>') when parsing cookie headers.
+ If <code>false</code>, name only cookies will be dropped.</p>
+ <p>If not set the specification compliant default value of
+ <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">alwaysAddExpires</code></td><td>
+ <p>If this is <code>true</code> Tomcat will always add an expires
+ parameter to a SetCookie header even for cookies with version greater
+ than zero. This is to work around a known IE6 and IE7 bug that causes I
+ to ignore the Max-Age parameter in a SetCookie header.</p>
+ <p>If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> is set
+ to <code>true</code>, the default of this setting will be
+ <code>false</code>, else the default value will be <code>true</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">forwardSlashIsSeparator</code></td><td>
+ <p>If this is <code>true</code> Tomcat will treat the forward slash
+ character ('<code>/</code>') as an HTTP separator when processing cookie
+ headers. If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code>
+ is set to <code>true</code>, the default of this setting will be
+ <code>true</code>, else the default value will be <code>false</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">sameSiteCookies</code></td><td>
+ <p>Enables setting same-site cookie attribute.</p>
+
+ <p>If value is <code>unset</code> then the same-site cookie attribute
+ won't be set. This is the default value.</p>
+
+ <p>If value is <code>none</code> then the same-site cookie attribute
+ will be set and the cookie will always be sent in cross-site requests.</p>
+
+ <p>If value is <code>lax</code> then the browser only sends the cookie
+ in same-site requests and cross-site top level GET requests.</p>
+
+ <p>If value is <code>strict</code> then the browser prevents sending the
+ cookie in any cross-site request.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+ <p>No element may be nested inside a <strong>CookieProcessor</strong>.</p>
+
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+
+ <p>No special features are associated with a <strong>CookieProcessor</strong>
+ element.</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/credentialhandler.html b/web/tomcat/webapps/docs/config/credentialhandler.html
new file mode 100644
index 0000000..0cea6c5
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/credentialhandler.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The CredentialHandler Component</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The CredentialHandler Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#MessageDigestCredentialHandler">MessageDigestCredentialHandler</a></li><li><a href="#NestedCredentialHandler">NestedCredentialHandler</a></li><li><a href="#SecretKeyCredentialHandler">SecretKeyCredentialHandler</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The <strong>CredentialHandler</strong> element represents the component
+ used by a <a href="realm.html">Realm</a> to compare a provided credential such
+ as a password with the version of the credential stored by the
+ <a href="realm.html">Realm</a>. The <strong>CredentialHandler</strong> can
+ also be used to generate a new stored version of a given credential that would
+ be required, for example, when adding a new user to a
+ <a href="realm.html">Realm</a> or when changing a user's password.</p>
+
+ <p>A <strong>CredentialHandler</strong> element MUST be nested inside a
+ <a href="realm.html">Realm</a> component. If it is not included,
+ a default <strong>CredentialHandler</strong> will be created using the
+ <strong>MessageDigestCredentialHandler</strong>.</p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>CredentialHandler</strong> support the
+ following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.catalina.CredentialHandler</code>
+ interface.</p>
+ </td></tr></table>
+
+ <p>Unlike most Catalina components, there are several standard
+ <strong>CredentialHandler</strong> implementations available. As a result,
+ if a <strong>CredentialHandler</strong> element is present then the
+ <code>className</code> attribute MUST be used to select the implementation
+ you wish to use.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="MessageDigestCredentialHandler">MessageDigestCredentialHandler</h4><div class="text">
+
+ <p>The <strong>MessageDigestCredentialHandler</strong> is used when stored
+ passwords are protected by a message digest. This credential handler
+ supports the following forms of stored passwords:</p>
+ <ul>
+ <li><strong>plainText</strong> - the plain text credentials if no
+ algorithm is specified</li>
+ <li><strong>encodedCredential</strong> - a hex encoded digest of the
+ password digested using the configured digest</li>
+ <li><strong>{MD5}encodedCredential</strong> - a Base64 encoded MD5
+ digest of the password</li>
+ <li><strong>{SHA}encodedCredential</strong> - a Base64 encoded SHA1 digest
+ of the password</li>
+ <li><strong>{SSHA}encodedCredential</strong> - 20 character salt followed
+ by the salted SHA1 digest Base64 encoded</li>
+ <li><strong>salt$iterationCount$encodedCredential</strong> - a hex encoded
+ salt, iteration code and a hex encoded credential, each separated by
+ $</li>
+ </ul>
+
+ <p>If the stored password form does not include an iteration count then an
+ iteration count of 1 is used.</p>
+
+ <p>If the stored password form does not include salt then no salt is
+ used.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">algorithm</code></td><td>
+ <p>The name of the <code>java.security.MessageDigest</code> algorithm
+ used to encode user passwords stored in the database. If not specified,
+ user passwords are assumed to be stored in clear-text.</p>
+ </td></tr><tr><td><code class="attributeName">encoding</code></td><td>
+ <p>Digesting the password requires that it is converted to bytes. This
+ attribute determines the character encoding to use for conversions
+ between characters and bytes. If not specified, UTF-8 will be used.</p>
+ </td></tr><tr><td><code class="attributeName">iterations</code></td><td>
+ <p>The number of iterations to use when creating a new stored credential
+ from a clear text credential.</p>
+ </td></tr><tr><td><code class="attributeName">saltLength</code></td><td>
+ <p>The length of the randomly generated salt to use when creating a
+ new stored credential from a clear text credential.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="NestedCredentialHandler">NestedCredentialHandler</h4><div class="text">
+
+ <p>The <strong>NestedCredentialHandler</strong> is an implementation of
+ <strong>CredentialHandler</strong> that delegates to one or more
+ sub-CredentialHandlers.</p>
+
+ <p>Using the <strong>NestedCredentialHandler</strong> gives the developer
+ the ability to combine multiple <strong>CredentialHandler</strong>s of the
+ same or different types.</p>
+
+ <p>Sub-CredentialHandlers are defined by nesting CredentialHandler elements
+ inside the <code>CredentialHandler</code> element that defines the
+ NestedCredentialHandler. Credentials will be matched against each
+ <code>CredentialHandler</code> in the order they are listed. A match against
+ any CredentialHandler will be sufficient for the credentials to be
+ considered matched.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="SecretKeyCredentialHandler">SecretKeyCredentialHandler</h4><div class="text">
+
+ <p>The <strong>SecretKeyCredentialHandler</strong> is used when stored
+ passwords are built using <code>javax.crypto.SecretKeyFactory</code>. This
+ credential handler supports the following forms of stored passwords:</p>
+ <ul>
+ <li><strong>salt$iterationCount$encodedCredential</strong> - a hex encoded
+ salt, iteration code and a hex encoded credential, each separated by
+ $</li>
+ </ul>
+
+ <p>If the stored password form does not include an iteration count then an
+ iteration count of 1 is used.</p>
+
+ <p>If the stored password form does not include salt then no salt is
+ used.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">algorithm</code></td><td>
+ <p>The name of the secret key algorithm used to encode user passwords
+ stored in the database. If not specified, a default of
+ <code>PBKDF2WithHmacSHA1</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">keyLength</code></td><td>
+ <p>The length of key to generate for the stored credential. If not
+ specified, a default of <code>160</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">iterations</code></td><td>
+ <p>The number of iterations to use when creating a new stored credential
+ from a clear text credential.</p>
+ </td></tr><tr><td><code class="attributeName">saltLength</code></td><td>
+ <p>The length of the randomly generated salt to use when creating a
+ new stored credential from a clear text credential.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+ <p>If you are using the <em>NestedCredentialHandler Implementation</em> or a
+ CredentialHandler that extends the NestedCredentialHandler one or more
+ <strong><CredentialHandler></strong> elements may be nested inside it.
+ </p>
+
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+
+ <p>No special features are associated with a
+ <strong>CredentialHandler</strong> element.</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/engine.html b/web/tomcat/webapps/docs/config/engine.html
new file mode 100644
index 0000000..0116ac6
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/engine.html
@@ -0,0 +1,217 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Engine Container</title><meta name="author" content="Craig R. McClanahan"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Engine Container</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a><ol><li><a href="#Logging">Logging</a></li><li><a href="#Access_Logs">Access Logs</a></li><li><a href="#Lifecycle_Listeners">Lifecycle Listeners</a></li><li><a href="#Request_Filters">Request Filters</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The <strong>Engine</strong> element represents the entire request
+ processing machinery associated with a particular Catalina
+ <a href="service.html">Service</a>. It receives and processes
+ <em>all</em> requests from one or more <strong>Connectors</strong>,
+ and returns the completed response to the Connector for ultimate
+ transmission back to the client.</p>
+
+ <p>Exactly one <strong>Engine</strong> element MUST be nested inside
+ a <a href="service.html">Service</a> element, following all of the
+ corresponding Connector elements associated with this Service.</p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>Engine</strong>
+ support the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">backgroundProcessorDelay</code></td><td>
+ <p>This value represents the delay in seconds between the
+ invocation of the backgroundProcess method on this engine and
+ its child containers, including all hosts and contexts.
+ Child containers will not be invoked if their delay value is not
+ negative (which would mean they are using their own processing
+ thread). Setting this to a positive value will cause
+ a thread to be spawn. After waiting the specified amount of time,
+ the thread will invoke the backgroundProcess method on this engine
+ and all its child containers. If not specified, the default value for
+ this attribute is 10, which represent a 10 seconds delay.</p>
+ </td></tr><tr><td><code class="attributeName">className</code></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.catalina.Engine</code> interface.
+ If not specified, the standard value (defined below) will be used.</p>
+ </td></tr><tr><td><strong><code class="attributeName">defaultHost</code></strong></td><td>
+ <p>The default host name, which identifies the
+ <a href="host.html">Host</a> that will process requests directed
+ to host names on this server, but which are not configured in
+ this configuration file. This name MUST match the <code>name</code>
+ attributes of one of the <a href="host.html">Host</a> elements
+ nested immediately inside.</p>
+ </td></tr><tr><td><code class="attributeName">jvmRoute</code></td><td>
+ <p>Identifier which must be used in load balancing scenarios to enable
+ session affinity. The identifier, which must be unique across all
+ Tomcat servers which participate in the cluster, will be appended to
+ the generated session identifier, therefore allowing the front end
+ proxy to always forward a particular session to the same Tomcat
+ instance.</p>
+ <p>
+ Note that the <code>jvmRoute</code> can also be set using the
+ <code>jvmRoute</code> system property. The <code>jvmRoute</code>
+ set in an <code><Engine></code> attribute will override
+ any <code>jvmRoute</code> system property.
+ </p>
+ </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td>
+ <p>Logical name of this Engine, used in log and error messages. <em>When
+ using multiple <a href="service.html">Service</a> elements in the same
+ <a href="server.html">Server</a>, each Engine MUST be assigned a unique
+ name.</em></p>
+ </td></tr><tr><td><code class="attributeName">startStopThreads</code></td><td>
+ <p>The number of threads this <strong>Engine</strong> will use to start
+ child <a href="host.html">Host</a> elements in parallel. The special
+ value of 0 will result in the value of
+ <code>Runtime.getRuntime().availableProcessors()</code> being used.
+ Negative values will result in
+ <code>Runtime.getRuntime().availableProcessors() + value</code> being
+ used unless this is less than 1 in which case 1 thread will be used. If
+ not specified, the default value of 1 will be used. </p>
+ </td></tr></table>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text">
+
+ <p>The standard implementation of <strong>Engine</strong> is
+ <strong>org.apache.catalina.core.StandardEngine</strong>.
+ It supports the following additional attributes (in addition to the
+ common attributes listed above):</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr></table>
+
+ </div></div>
+
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+ <p>You can nest one or more <a href="host.html">Host</a> elements inside
+ this <strong>Engine</strong> element, each representing a different virtual
+ host associated with this server. At least one <a href="host.html">Host</a>
+ is required, and one of the nested <a href="host.html">Hosts</a> MUST
+ have a name that matches the name specified for the
+ <code>defaultHost</code> attribute, listed above.</p>
+
+ <p>You can nest at most one instance of the following utility components
+ by nesting a corresponding element inside your <strong>Engine</strong>
+ element:</p>
+ <ul>
+ <li><a href="realm.html"><strong>Realm</strong></a> -
+ Configure a realm that will allow its
+ database of users, and their associated roles, to be shared across all
+ <a href="host.html">Hosts</a> and <a href="context.html">Contexts</a>
+ nested inside this Engine, unless overridden by a
+ <a href="realm.html">Realm</a> configuration at a lower level.</li>
+ </ul>
+
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+
+
+ <div class="subsection"><h4 id="Logging">Logging</h4><div class="text">
+
+ <p>An engine is associated with the
+ <code>org.apache.catalina.core.ContainerBase.[enginename]</code>
+ log category. Note that the brackets are actually part of the name,
+ don't omit them.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Access_Logs">Access Logs</h4><div class="text">
+
+ <p>When you run a web server, one of the output files normally generated
+ is an <em>access log</em>, which generates one line of information for
+ each request processed by the server, in a standard format. Catalina
+ includes an optional <a href="valve.html">Valve</a> implementation that
+ can create access logs in the same standard format created by web servers,
+ or in any number of custom formats.</p>
+
+ <p>You can ask Catalina to create an access log for all requests
+ processed by an <a href="engine.html">Engine</a>,
+ <a href="host.html">Host</a>, or <a href="context.html">Context</a>
+ by nesting a <a href="valve.html">Valve</a> element like this:</p>
+
+<div class="codeBox"><pre><code><Engine name="Standalone" ...>
+ ...
+ <Valve className="org.apache.catalina.valves.AccessLogValve"
+ prefix="catalina_access_log" suffix=".txt"
+ pattern="common"/>
+ ...
+</Engine></code></pre></div>
+
+ <p>See <a href="valve.html#Access_Logging">Access Logging Valves</a>
+ for more information on the configuration attributes that are
+ supported.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Lifecycle_Listeners">Lifecycle Listeners</h4><div class="text">
+
+ <p>If you have implemented a Java object that needs to know when this
+ <strong>Engine</strong> is started or stopped, you can declare it by
+ nesting a <strong>Listener</strong> element inside this element. The
+ class name you specify must implement the
+ <code>org.apache.catalina.LifecycleListener</code> interface, and
+ it will be notified about the occurrence of the corresponding
+ lifecycle events. Configuration of such a listener looks like this:</p>
+
+<div class="codeBox"><pre><code><Engine name="Standalone" ...>
+ ...
+ <Listener className="com.mycompany.mypackage.MyListener" ... >
+ ...
+</Engine></code></pre></div>
+
+ <p>Note that a Listener can have any number of additional properties
+ that may be configured from this element. Attribute names are matched
+ to corresponding JavaBean property names using the standard property
+ method naming patterns.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Request_Filters">Request Filters</h4><div class="text">
+
+ <p>You can ask Catalina to check the IP address, or host name, on every
+ incoming request directed to the surrounding
+ <a href="engine.html">Engine</a>, <a href="host.html">Host</a>, or
+ <a href="context.html">Context</a> element. The remote address or name
+ will be checked against configured "accept" and/or "deny"
+ filters, which are defined using <code>java.util.regex</code> Regular
+ Expression syntax. Requests that come from locations that are
+ not accepted will be rejected with an HTTP "Forbidden" error.
+ Example filter declarations:</p>
+
+<div class="codeBox"><pre><code><Engine name="Standalone" ...>
+ ...
+ <Valve className="org.apache.catalina.valves.RemoteHostValve"
+ allow=".*\.mycompany\.com|www\.yourcompany\.com"/>
+ <Valve className="org.apache.catalina.valves.RemoteAddrValve"
+ deny="192\.168\.1\.\d+"/>
+ ...
+</Engine></code></pre></div>
+
+ <p>See <a href="valve.html#Remote_Address_Filter">Remote Address Filter</a>
+ and <a href="valve.html#Remote_Host_Filter">Remote Host Filter</a> for
+ more information about the configuration options that are supported.</p>
+
+ </div></div>
+
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/executor.html b/web/tomcat/webapps/docs/config/executor.html
new file mode 100644
index 0000000..a2336e9
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/executor.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Executor (thread pool)</title><meta name="author" content="Filip Hanik"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Executor (thread pool)</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The <strong>Executor</strong> represents a thread pool that can be shared
+ between components in Tomcat. Historically there has been a thread pool per
+ connector created but this allows you to share a thread pool, between (primarily) connector
+ but also other components when those get configured to support executors</p>
+
+
+ <p>The executor has to implement the <code>org.apache.catalina.Executor</code> interface.</p>
+
+ <p>The executor is a nested element to the <a href="service.html">Service</a> element.
+ And in order for it to be picked up by the connectors, the Executor element has to appear
+ prior to the Connector element in server.xml</p>
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>Executor</strong>
+ support the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">className</code></td><td>
+ <p>The class of the implementation. The implementation has to implement the
+ <code>org.apache.catalina.Executor</code> interface.
+ This interface ensures that the object can be referenced through its <code>name</code> attribute
+ and that implements Lifecycle, so that it can be started and stopped with the container.
+ The default value for the className is <code>org.apache.catalina.core.StandardThreadExecutor</code></p>
+ </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td>
+ <p>The name used to reference this pool in other places in server.xml.
+ The name is required and must be unique.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text">
+
+ <p>
+ The default implementation supports the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">threadPriority</code></td><td>
+ <p>(int) The thread priority for threads in the executor, the default is
+ <code>5</code> (the value of the <code>Thread.NORM_PRIORITY</code> constant)</p>
+ </td></tr><tr><td><code class="attributeName">daemon</code></td><td>
+ <p>(boolean) Whether the threads should be daemon threads or not, the default is <code>true</code></p>
+ </td></tr><tr><td><code class="attributeName">namePrefix</code></td><td>
+ <p>(String) The name prefix for each thread created by the executor.
+ The thread name for an individual thread will be <code>namePrefix+threadNumber</code></p>
+ </td></tr><tr><td><code class="attributeName">maxThreads</code></td><td>
+ <p>(int) The max number of active threads in this pool, default is <code>200</code></p>
+ </td></tr><tr><td><code class="attributeName">minSpareThreads</code></td><td>
+ <p>(int) The minimum number of threads (idle and active) always kept alive, default is <code>25</code></p>
+ </td></tr><tr><td><code class="attributeName">maxIdleTime</code></td><td>
+ <p>(int) The number of milliseconds before an idle thread shutsdown, unless the number of active threads are less
+ or equal to minSpareThreads. Default value is <code>60000</code>(1 minute)</p>
+ </td></tr><tr><td><code class="attributeName">maxQueueSize</code></td><td>
+ <p>(int) The maximum number of runnable tasks that can queue up awaiting
+ execution before we reject them. Default value is <code>Integer.MAX_VALUE</code></p>
+ </td></tr><tr><td><code class="attributeName">prestartminSpareThreads</code></td><td>
+ <p>(boolean) Whether minSpareThreads should be started when starting the Executor or not,
+ the default is <code>false</code></p>
+ </td></tr><tr><td><code class="attributeName">threadRenewalDelay</code></td><td>
+ <p>(long) If a <a href="listeners.html">ThreadLocalLeakPreventionListener</a> is configured,
+ it will notify this executor about stopped contexts.
+ After a context is stopped, threads in the pool are renewed. To avoid renewing all threads at the same time,
+ this option sets a delay between renewal of any 2 threads. The value is in ms,
+ default value is <code>1000</code> ms. If value is negative, threads are not renewed.</p>
+ </td></tr></table>
+
+
+ </div></div>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/filter.html b/web/tomcat/webapps/docs/config/filter.html
new file mode 100644
index 0000000..fe95297
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/filter.html
@@ -0,0 +1,1713 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - Container Provided Filters</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Container Provided Filters</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Add_Default_Character_Set_Filter">Add Default Character Set Filter</a><ol><li><a href="#Add_Default_Character_Set_Filter/Introduction">Introduction</a></li><li><a href="#Add_Default_Character_Set_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Add_Default_Character_Set_Filter/Initialisation_parameters">Initialisation parameters</a></li></ol></li><li><a href="#CORS_Filter">CORS Filter</a><ol><li><a href="#CORS_Filter/Introduction">Introduction</a></li><li><a href="#CORS_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#CORS_Filter/Initialisation_parameters">Initialisation parameters</a></li><li><a href="#CORS_Filter_and_HttpServletRequest_attributes">CORS Filter and HttpServletRequest attributes</a></li></ol></li><li><a href="#CSRF_Prevention_Filter">CSRF Prevention Filter</a><ol><li><a href="#CSRF_Prevention_Filter/Introduction">Introduction</a></li><li><a href="#CSRF_Prevention_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#CSRF_Prevention_Filter/Initialisation_parameters">Initialisation parameters</a></li></ol></li><li><a href="#CSRF_Prevention_Filter_for_REST_APIs">CSRF Prevention Filter for REST APIs</a><ol><li><a href="#CSRF_Prevention_Filter_for_REST_APIs/Introduction">Introduction</a></li><li><a href="#CSRF_Prevention_Filter_for_REST_APIs/Basic_configuration_sample">Basic configuration sample</a></li><li><a href="#RestCsrfPreventionFilter_and_HttpServletRequest_parameters">RestCsrfPreventionFilter and HttpServletRequest parameters</a></li><li><a href="#CSRF_Prevention_Filter_for_REST_APIs/Filter_Class_Name">Filter Class Name</a></li><li><a href="#CSRF_Prevention_Filter_for_REST_APIs/Initialisation_parameters">Initialisation parameters</a></li></ol></li><li><a href="#Expires_Filter">Expires Filter</a><ol><li><a href="#Expires_Filter/Introduction">Introduction</a></li><li><a href="#Expires_Filter/Basic_configuration_sample">Basic configuration sample</a></li><li><a href="#Alternate_Syntax">Alternate Syntax</a></li><li><a href="#Expiration_headers_generation_eligibility">Expiration headers generation eligibility</a></li><li><a href="#Expiration_configuration_selection">Expiration configuration selection</a></li><li><a href="#Expires_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Expires_Filter/Initialisation_parameters">Initialisation parameters</a></li><li><a href="#Troubleshooting">Troubleshooting</a></li></ol></li><li><a href="#Failed_Request_Filter">Failed Request Filter</a><ol><li><a href="#Failed_Request_Filter/Introduction">Introduction</a></li><li><a href="#Failed_Request_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Failed_Request_Filter/Initialisation_parameters">Initialisation parameters</a></li></ol></li><li><a href="#HTTP_Header_Security_Filter">HTTP Header Security Filter</a><ol><li><a href="#HTTP_Header_Security_Filter/Introduction">Introduction</a></li><li><a href="#HTTP_Header_Security_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#HTTP_Header_Security_Filter/Initialisation_parameters">Initialisation parameters</a></li></ol></li><li><a href="#Remote_Address_Filter">Remote Address Filter</a><ol><li><a href="#Remote_Address_Filter/Introduction">Introduction</a></li><li><a href="#Remote_Address_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Remote_Address_Filter/Initialisation_parameters">Initialisation parameters</a></li><li><a href="#Remote_Address_Filter/Example">Example</a></li></ol></li><li><a href="#Remote_Host_Filter">Remote Host Filter</a><ol><li><a href="#Remote_Host_Filter/Introduction">Introduction</a></li><li><a href="#Remote_Host_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Remote_Host_Filter/Initialisation_parameters">Initialisation parameters</a></li></ol></li><li><a href="#Remote_CIDR_Filter">Remote CIDR Filter</a><ol><li><a href="#Remote_CIDR_Filter/Introduction">Introduction</a></li><li><a href="#Remote_CIDR_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Remote_CIDR_Filter/Initialisation_parameters">Initialisation parameters</a></li><li><a href="#Remote_CIDR_Filter/Example">Example</a></li></ol></li><li><a href="#Remote_IP_Filter">Remote IP Filter</a><ol><li><a href="#Remote_IP_Filter/Introduction">Introduction</a></li><li><a href="#Remote_IP_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Basic_configuration_to_handle_'x-forwarded-for'">Basic configuration to handle 'x-forwarded-for'</a></li><li><a href="#Basic_configuration_to_handle_'x-forwarded-for'_and_'x-forwarded-proto'">Basic configuration to handle 'x-forwarded-for' and 'x-forwarded-proto'</a></li><li><a href="#Advanced_configuration_with_internal_proxies">Advanced configuration with internal proxies</a></li><li><a href="#Advanced_configuration_with_trusted_proxies">Advanced configuration with trusted proxies</a></li><li><a href="#Advanced_configuration_with_internal_and_trusted_proxies">Advanced configuration with internal and trusted proxies</a></li><li><a href="#Advanced_configuration_with_an_untrusted_proxy">Advanced configuration with an untrusted proxy</a></li><li><a href="#Remote_IP_Filter/Initialisation_parameters">Initialisation parameters</a></li></ol></li><li><a href="#Request_Dumper_Filter">Request Dumper Filter</a><ol><li><a href="#Request_Dumper_Filter/Introduction">Introduction</a></li><li><a href="#Request_Dumper_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Request_Dumper_Filter/Initialisation_parameters">Initialisation parameters</a></li><li><a href="#Request_Dumper_Filter/Sample_Configuration">Sample Configuration</a></li></ol></li><li><a href="#Session_Initializer_Filter">Session Initializer Filter</a><ol><li><a href="#Session_Initializer_Filter/Introduction">Introduction</a></li><li><a href="#Session_Initializer_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Session_Initializer_Filter/Initialisation_parameters">Initialisation parameters</a></li><li><a href="#Session_Initializer_Filter/Sample_Configuration">Sample Configuration</a></li></ol></li><li><a href="#Set_Character_Encoding_Filter">Set Character Encoding Filter</a><ol><li><a href="#Set_Character_Encoding_Filter/Introduction">Introduction</a></li><li><a href="#Set_Character_Encoding_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Set_Character_Encoding_Filter/Initialisation_parameters">Initialisation parameters</a></li></ol></li><li><a href="#WebDAV_Fix_Filter">WebDAV Fix Filter</a><ol><li><a href="#WebDAV_Fix_Filter/Introduction">Introduction</a></li><li><a href="#WebDAV_Fix_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#WebDAV_Fix_Filter/Initialisation_parameters">Initialisation parameters</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>Tomcat provides a number of <strong>Filters</strong> which may be
+ configured for use with all web applications using
+ <code>$CATALINA_BASE/conf/web.xml</code> or may be configured for individual
+ web applications by configuring them in the application's
+ <code>WEB-INF/web.xml</code>. Each filter is described below.</p>
+
+ <p><em>This description uses the variable name $CATALINA_BASE to refer the
+ base directory against which most relative paths are resolved. If you have
+ not configured Tomcat for multiple instances by setting a CATALINA_BASE
+ directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME,
+ the directory into which you have installed Tomcat.</em></p>
+
+</div><h3 id="Add_Default_Character_Set_Filter">Add Default Character Set Filter</h3><div class="text">
+
+ <div class="subsection"><h4 id="Add_Default_Character_Set_Filter/Introduction">Introduction</h4><div class="text">
+
+ <p>The HTTP specification is clear that if no character set is specified for
+ media sub-types of the "text" media type, the ISO-8859-1 character set must
+ be used. However, browsers may attempt to auto-detect the character set.
+ This may be exploited by an attacker to perform an XSS attack. Internet
+ Explorer and other browsers have an option to
+ enable this behavior.</p>
+
+ <p>This filter prevents the attack by explicitly setting a character set.
+ Unless the provided character set is explicitly overridden by the user the
+ browser will adhere to the explicitly set character set, thus preventing the
+ XSS attack.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Add_Default_Character_Set_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text">
+
+ <p>The filter class name for the Add Default Character Set Filter is
+ <strong><code>org.apache.catalina.filters.AddDefaultCharsetFilter</code>
+ </strong>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Add_Default_Character_Set_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text">
+
+ <p>The Add Default Character Set Filter supports the following initialization
+ parameters:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">encoding</code></td><td>
+ <p>Name of the character set which should be set, if no other character set
+ was set explicitly by a Servlet. This parameter has two special values
+ <code>default</code> and <code>system</code>. A value of <code>system</code>
+ uses the JVM wide default character set, which is usually set by locale.
+ A value of <code>default</code> will use <strong>ISO-8859-1</strong>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="CORS_Filter">CORS Filter</h3><div class="text">
+ <div class="subsection"><h4 id="CORS_Filter/Introduction">Introduction</h4><div class="text">
+ <p>This filter is an implementation of W3C's CORS (Cross-Origin Resource
+ Sharing) <a href="https://www.w3.org/TR/cors/">specification</a>, which is a
+ mechanism that enables cross-origin requests.</p>
+ <p>The filter works by adding required <code>Access-Control-*</code> headers
+ to HttpServletResponse object. The filter also protects against HTTP
+ response splitting. If request is invalid, or is not permitted, then request
+ is rejected with HTTP status code 403 (Forbidden). A
+ <a href="../images/cors-flowchart.png">flowchart</a> that
+ demonstrates request processing by this filter is available.</p>
+ <p>The minimal configuration required to use this filter is:</p>
+ <div class="codeBox"><pre><code><filter>
+ <filter-name>CorsFilter</filter-name>
+ <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
+</filter>
+<filter-mapping>
+ <filter-name>CorsFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+</filter-mapping></code></pre></div>
+ <p>The above configuration enables the filter but does not relax the
+ cross-origin policy. As a minimum, you will need to add a
+ <strong>cors.allowed.origins</strong> initialisation parameter as described
+ below to enable cross-origin requests. Depending on your requirements, you
+ may need to provide additional configuration.</p>
+ <p>An instance of this filter can only implement one policy. If you want to
+ apply different policies (e.g. different allowed origins) to different URLs
+ or sets of URLs within your web application you will need to configure a
+ separate instance of this filter for each policy you wish to configure.</p>
+ </div></div>
+ <div class="subsection"><h4 id="CORS_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text">
+ <p>The filter class name for the CORS Filter is
+ <strong><code>org.apache.catalina.filters.CorsFilter</code></strong>.</p>
+ </div></div>
+ <div class="subsection"><h4 id="CORS_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text">
+ <p>The CORS Filter supports following initialisation parameters:</p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">cors.allowed.origins</code></td><td>
+ <p>A list of <a href="https://tools.ietf.org/html/rfc6454">origins</a>
+ that are allowed to access the resource. A <code>*</code> can be
+ specified to enable access to resource from any origin. Otherwise, an
+ allow list of comma separated origins can be provided. Eg: <code>
+ https://www.w3.org, https://www.apache.org</code>.
+ <strong>Defaults:</strong> The empty String. (No origin is allowed to
+ access the resource).</p>
+ </td></tr><tr><td><code class="attributeName">cors.allowed.methods</code></td><td>
+ <p>A comma separated list of HTTP methods that can be used to access the
+ resource, using cross-origin requests. These are the methods which will
+ also be included as part of <code>Access-Control-Allow-Methods</code>
+ header in pre-flight response. Eg: <code>GET, POST</code>.
+ <strong>Defaults:</strong> <code>GET, POST, HEAD, OPTIONS</code></p>
+ </td></tr><tr><td><code class="attributeName">cors.allowed.headers</code></td><td>
+ <p>A comma separated list of request headers that can be used when
+ making an actual request. These headers will also be returned as part
+ of <code>Access-Control-Allow-Headers</code> header in a pre-flight
+ response. Eg: <code>Origin,Accept</code>. <strong>Defaults:</strong>
+ <code>Origin, Accept, X-Requested-With, Content-Type,
+ Access-Control-Request-Method, Access-Control-Request-Headers</code></p>
+ </td></tr><tr><td><code class="attributeName">cors.exposed.headers</code></td><td>
+ <p>A comma separated list of headers other than simple response headers
+ that browsers are allowed to access. These are the headers which will
+ also be included as part of <code>Access-Control-Expose-Headers</code>
+ header in the pre-flight response. Eg:
+ <code>X-CUSTOM-HEADER-PING,X-CUSTOM-HEADER-PONG</code>.
+ <strong>Default:</strong> None. Non-simple headers are not exposed by
+ default.</p>
+ </td></tr><tr><td><code class="attributeName">cors.preflight.maxage</code></td><td>
+ <p>The amount of seconds, browser is allowed to cache the result of the
+ pre-flight request. This will be included as part of
+ <code>Access-Control-Max-Age</code> header in the pre-flight response.
+ A negative value will prevent CORS Filter from adding this response
+ header to pre-flight response. <strong>Defaults:</strong>
+ <code>1800</code></p>
+ </td></tr><tr><td><code class="attributeName">cors.support.credentials</code></td><td>
+ <p>A flag that indicates whether the resource supports user credentials.
+ This flag is exposed as part of
+ <code>Access-Control-Allow-Credentials</code> header in a pre-flight
+ response. It helps browser determine whether or not an actual request
+ can be made using credentials. <strong>Defaults:</strong>
+ <code>false</code></p>
+ </td></tr><tr><td><code class="attributeName">cors.request.decorate</code></td><td>
+ <p>A flag to control if CORS specific attributes should be added to
+ HttpServletRequest object or not. <strong>Defaults:</strong>
+ <code>true</code></p>
+ </td></tr></table>
+ <p>Here's an example of a more advanced configuration, that overrides
+ defaults:</p>
+ <div class="codeBox"><pre><code><filter>
+ <filter-name>CorsFilter</filter-name>
+ <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
+ <init-param>
+ <param-name>cors.allowed.origins</param-name>
+ <param-value>https://www.apache.org</param-value>
+ </init-param>
+ <init-param>
+ <param-name>cors.allowed.methods</param-name>
+ <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
+ </init-param>
+ <init-param>
+ <param-name>cors.allowed.headers</param-name>
+ <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
+ </init-param>
+ <init-param>
+ <param-name>cors.exposed.headers</param-name>
+ <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
+ </init-param>
+ <init-param>
+ <param-name>cors.support.credentials</param-name>
+ <param-value>true</param-value>
+ </init-param>
+ <init-param>
+ <param-name>cors.preflight.maxage</param-name>
+ <param-value>10</param-value>
+ </init-param>
+</filter>
+<filter-mapping>
+ <filter-name>CorsFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+</filter-mapping></code></pre></div>
+ </div></div>
+ <div class="subsection"><h4 id="CORS_Filter_and_HttpServletRequest_attributes">CORS Filter and HttpServletRequest attributes</h4><div class="text">
+ <p>CORS Filter adds information about the request, in HttpServletRequest
+ object, for consumption downstream. Following attributes are set, if
+ <code>cors.request.decorate</code> initialisation parameter is
+ <code>true</code>:</p>
+ <ul>
+ <li><strong>cors.isCorsRequest:</strong> Flag to determine if request is
+ a CORS request.</li>
+ <li><strong>cors.request.origin:</strong> The Origin URL, i.e. the URL of
+ the page from where the request originated.</li>
+ <li><strong>cors.request.type:</strong> Type of CORS request. Possible
+ values:
+ <ul>
+ <li><code>SIMPLE</code>: A request which is not preceded by a
+ pre-flight request.</li>
+ <li><code>ACTUAL</code>: A request which is preceded by a pre-flight
+ request.</li>
+ <li><code>PRE_FLIGHT</code>: A pre-flight request.</li>
+ <li><code>NOT_CORS</code>: A normal same-origin request.</li>
+ <li><code>INVALID_CORS</code>: A cross-origin request, which is
+ invalid.</li>
+ </ul>
+ </li>
+ <li><strong>cors.request.headers:</strong> Request headers sent as
+ <code>Access-Control-Request-Headers</code> header, for a pre-flight
+ request.
+ </li>
+ </ul>
+ </div></div>
+</div><h3 id="CSRF_Prevention_Filter">CSRF Prevention Filter</h3><div class="text">
+
+ <div class="subsection"><h4 id="CSRF_Prevention_Filter/Introduction">Introduction</h4><div class="text">
+
+ <p>This filter provides basic CSRF protection for a web application. The
+ filter assumes that it is mapped to <code>/*</code> and that all URLs
+ returned to the client are encoded via a call to
+ <code>HttpServletResponse#encodeRedirectURL(String)</code> or
+ <code>HttpServletResponse#encodeURL(String)</code>.</p>
+
+ <p>This filter prevents CSRF by generating a nonce and storing it in the
+ session. URLs are also encoded with the same nonce. When the next request is
+ received the nonce in the request is compared to the nonce in the session
+ and only if they are the same is the request allowed to continue.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="CSRF_Prevention_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text">
+
+ <p>The filter class name for the CSRF Prevention Filter is
+ <strong><code>org.apache.catalina.filters.CsrfPreventionFilter</code>
+ </strong>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="CSRF_Prevention_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text">
+
+ <p>The CSRF Prevention Filter supports the following initialisation
+ parameters:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">denyStatus</code></td><td>
+ <p>HTTP response status code that is used when rejecting denied
+ request. The default value is <code>403</code>.</p>
+ </td></tr><tr><td><code class="attributeName">entryPoints</code></td><td>
+ <p>A comma separated list of URLs that will not be tested for the
+ presence of a valid nonce. They are used to provide a way to navigate
+ back to a protected application after having navigated away from it.
+ Entry points will be limited to HTTP GET requests and should not trigger
+ any security sensitive actions.</p>
+ </td></tr><tr><td><code class="attributeName">nonceCacheSize</code></td><td>
+ <p>The number of previously issued nonces that will be cached on a LRU
+ basis to support parallel requests, limited use of the refresh and back
+ in the browser and similar behaviors that may result in the submission
+ of a previous nonce rather than the current one. If not set, the default
+ value of 5 will be used.</p>
+ </td></tr><tr><td><code class="attributeName">randomClass</code></td><td>
+ <p>The name of the class to use to generate nonces. The class must be an
+ instance of <code>java.util.Random</code>. If not set, the default value
+ of <code>java.security.SecureRandom</code> will be used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="CSRF_Prevention_Filter_for_REST_APIs">CSRF Prevention Filter for REST APIs</h3><div class="text">
+
+ <div class="subsection"><h4 id="CSRF_Prevention_Filter_for_REST_APIs/Introduction">Introduction</h4><div class="text">
+
+ <p>This filter provides basic CSRF protection for REST APIs. The CSRF
+ protection is applied only for modifying HTTP requests (different from GET,
+ HEAD, OPTIONS) to protected resources. It is based on a custom header
+ <code>X-CSRF-Token</code> that provides a valid nonce.</p>
+
+ <p>CSRF protection mechanism for REST APIs consists of the following steps:
+ <ul>
+ <li>Client asks for a valid nonce. This is performed with a
+ non-modifying "Fetch" request to protected resource.</li>
+ <li>Server responds with a valid nonce mapped to the current user
+ session.</li>
+ <li>Client provides this nonce in the subsequent modifying requests in
+ the frame of the same user session.</li>
+ <li>Server rejects all modifying requests to protected resources that
+ do not contain a valid nonce.</li>
+ </ul>
+ </p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="CSRF_Prevention_Filter_for_REST_APIs/Basic_configuration_sample">Basic configuration sample</h4><div class="text">
+
+ <p>On the server side</p>
+
+ <ul>
+ <li>All CSRF protected REST APIs should be protected with an authentication
+ mechanism.</li>
+ <li>Protect modifying REST APIs with this filter.</li>
+ <li>Provide at least one non-modifying operation.</li>
+ </ul>
+ <div class="codeBox"><pre><code><filter>
+ <filter-name>RestCSRF</filter-name>
+ <filter-class>org.apache.catalina.filters.RestCsrfPreventionFilter</filter-class>
+</filter>
+<filter-mapping>
+ <filter-name>RestCSRF</filter-name>
+ <!-- Modifying operations -->
+ <url-pattern>/resources/removeResource</url-pattern>
+ <url-pattern>/resources/addResource</url-pattern>
+ <!-- Non-modifying operations -->
+ <url-pattern>/resources/listResources</url-pattern>
+</filter-mapping></code></pre></div>
+
+ <p>On the client side</p>
+
+ <ul>
+ <li>Make a non-modifying "Fetch" request in order to obtain a valid nonce.
+ This can be done with sending additional header
+ <code>X-CSRF-Token: Fetch</code></li>
+ <li>Cache the returned session id and nonce in order to provide them in
+ the subsequent modifying requests to protected resources.</li>
+ <li>Modifying requests can be denied and header
+ <code>X-CSRF-Token: Required</code> will be returned in case of
+ invalid or missing nonce, expired session or in case the session
+ id is changed by the server.</li>
+ </ul>
+ <div class="codeBox"><pre><code>Client Request:
+GET /rest/resources/listResources HTTP/1.1
+X-CSRF-Token: Fetch
+Authorization: Basic ...
+Host: localhost:8080
+...
+
+Server Response:
+HTTP/1.1 200 OK
+Set-Cookie: JSESSIONID=...; Path=/rest; HttpOnly
+X-CSRF-Token: ...
+...
+
+Client Request:
+POST /rest/resources/addResource HTTP/1.1
+Cookie: JSESSIONID=...
+X-CSRF-Token: ...
+Authorization: Basic ...
+Host: localhost:8080
+...
+
+Server Response:
+HTTP/1.1 200 OK
+...</code></pre></div>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="RestCsrfPreventionFilter_and_HttpServletRequest_parameters">RestCsrfPreventionFilter and HttpServletRequest parameters</h4><div class="text">
+
+ <p>When the client is not able to insert custom headers in its calls to
+ REST APIs there is additional capability to configure URLs for which a
+ valid nonce will be accepted as a request parameter.</p>
+
+ <p>Note: If there is a <code>X-CSRF-Token</code> header, it will be taken
+ with preference over any parameter with the same name in the request.
+ Request parameters cannot be used to fetch new nonce, only header can be
+ used to request a new nonce.</p>
+
+ <div class="codeBox"><pre><code><filter>
+ <filter-name>RestCSRF</filter-name>
+ <filter-class>org.apache.catalina.filters.RestCsrfPreventionFilter</filter-class>
+ <init-param>
+ <param-name>pathsAcceptingParams</param-name>
+ <param-value>/resources/removeResource,/resources/addResource</param-value>
+ </init-param>
+</filter>
+<filter-mapping>
+ <filter-name>RestCSRF</filter-name>
+ <url-pattern>/resources/*</url-pattern>
+</filter-mapping></code></pre></div>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="CSRF_Prevention_Filter_for_REST_APIs/Filter_Class_Name">Filter Class Name</h4><div class="text">
+
+ <p>The filter class name for the CSRF Prevention Filter for REST APIs is
+ <strong><code>org.apache.catalina.filters.RestCsrfPreventionFilter</code>
+ </strong>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="CSRF_Prevention_Filter_for_REST_APIs/Initialisation_parameters">Initialisation parameters</h4><div class="text">
+
+ <p>The CSRF Prevention Filter for REST APIs supports the following
+ initialisation parameters:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">denyStatus</code></td><td>
+ <p>HTTP response status code that is used when rejecting denied
+ request. The default value is <code>403</code>.</p>
+ </td></tr><tr><td><code class="attributeName">pathsAcceptingParams</code></td><td>
+ <p>A comma separated list of URLs that can accept nonces via request
+ parameter <code>X-CSRF-Token</code>. For use cases when a nonce information cannot
+ be provided via header, one can provide it via request parameters. If
+ there is a <code>X-CSRF-Token</code> header, it will be taken with preference over
+ any parameter with the same name in the request. Request parameters
+ cannot be used to fetch new nonce, only header can be used to request a
+ new nonce.</p>
+ </td></tr><tr><td><code class="attributeName">randomClass</code></td><td>
+ <p>The name of the class to use to generate nonces. The class must be an
+ instance of <code>java.util.Random</code>. If not set, the default value
+ of <code>java.security.SecureRandom</code> will be used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="Expires_Filter">Expires Filter</h3><div class="text">
+
+ <div class="subsection"><h4 id="Expires_Filter/Introduction">Introduction</h4><div class="text">
+
+ <p>
+ ExpiresFilter is a Java Servlet API port of <a href="https://httpd.apache.org/docs/2.2/mod/mod_expires.html">Apache
+ mod_expires</a>.
+ This filter controls the setting of the <code>Expires</code> HTTP header and the
+ <code>max-age</code> directive of the <code>Cache-Control</code> HTTP header in
+ server responses. The expiration date can set to be relative to either the
+ time the source file was last modified, or to the time of the client access.
+ </p>
+
+ <p>
+ These HTTP headers are an instruction to the client about the document's
+ validity and persistence. If cached, the document may be fetched from the
+ cache rather than from the source until this time has passed. After that, the
+ cache copy is considered "expired" and invalid, and a new copy must
+ be obtained from the source.
+ </p>
+ <p>
+ To modify <code>Cache-Control</code> directives other than <code>max-age</code> (see
+ <a href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9">RFC
+ 2616 section 14.9</a>), you can use other servlet filters or <a href="https://httpd.apache.org/docs/2.2/mod/mod_headers.html">Apache Httpd
+ mod_headers</a> module.
+ </p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Expires_Filter/Basic_configuration_sample">Basic configuration sample</h4><div class="text">
+ <p>
+ Basic configuration to add '<code>Expires</code>' and '<code>Cache-Control: max-age=</code>'
+ headers to images, CSS and JavaScript.
+ </p>
+
+ <div class="codeBox"><pre><code><filter>
+ <filter-name>ExpiresFilter</filter-name>
+ <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
+ <init-param>
+ <param-name>ExpiresByType image</param-name>
+ <param-value>access plus 10 minutes</param-value>
+ </init-param>
+ <init-param>
+ <param-name>ExpiresByType text/css</param-name>
+ <param-value>access plus 10 minutes</param-value>
+ </init-param>
+ <init-param>
+ <param-name>ExpiresByType application/javascript</param-name>
+ <param-value>access plus 10 minutes</param-value>
+ </init-param>
+</filter>
+...
+<filter-mapping>
+ <filter-name>ExpiresFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+ <dispatcher>REQUEST</dispatcher>
+</filter-mapping></code></pre></div>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Alternate_Syntax">Alternate Syntax</h4><div class="text">
+ <p>
+ The <code>ExpiresDefault</code> and <code>ExpiresByType</code> directives can also be
+ defined in a more readable syntax of the form:
+ </p>
+
+ <div class="codeBox"><pre><code><init-param>
+ <param-name>ExpiresDefault</param-name>
+ <param-value><base> [plus] {<num> <type>}*</param-value>
+</init-param>
+
+<init-param>
+ <param-name>ExpiresByType type</param-name>
+ <param-value><base> [plus] {<num> <type>}*</param-value>
+</init-param>
+
+<init-param>
+ <param-name>ExpiresByType type;encoding</param-name>
+ <param-value><base> [plus] {<num> <type>}*</param-value>
+</init-param></code></pre></div>
+ <p>
+ where <code><base></code> is one of:
+ </p>
+ <ul>
+ <li><code>access</code></li>
+ <li><code>now</code> (equivalent to '<code>access</code>')</li>
+ <li><code>modification</code></li>
+ </ul>
+
+ <p>
+ The <code>plus</code> keyword is optional. <code><num></code> should be an
+ integer value (acceptable to <code>Integer.parseInt()</code>), and
+ <code><type></code> is one of:
+ </p>
+ <ul>
+ <li><code>year</code>, <code>years</code></li>
+ <li><code>month</code>, <code>months</code></li>
+ <li><code>week</code>, <code>weeks</code></li>
+ <li><code>day</code>, <code>days</code></li>
+ <li><code>hour</code>, <code>hours</code></li>
+ <li><code>minute</code>, <code>minutes</code></li>
+ <li><code>second</code>, <code>seconds</code></li>
+ </ul>
+ <p>
+ For example, any of the following directives can be used to make documents
+ expire 1 month after being accessed, by default:
+ </p>
+
+ <div class="codeBox"><pre><code><init-param>
+ <param-name>ExpiresDefault</param-name>
+ <param-value>access plus 1 month</param-value>
+</init-param>
+
+<init-param>
+ <param-name>ExpiresDefault</param-name>
+ <param-value>access plus 4 weeks</param-value>
+</init-param>
+
+<init-param>
+ <param-name>ExpiresDefault</param-name>
+ <param-value>access plus 30 days</param-value>
+</init-param></code></pre></div>
+<p>
+The expiry time can be fine-tuned by adding several
+'<code><num> <type></code>' clauses:
+</p>
+
+<div class="codeBox"><pre><code><init-param>
+ <param-name>ExpiresByType text/html</param-name>
+ <param-value>access plus 1 month 15 days 2 hours</param-value>
+</init-param>
+
+<init-param>
+ <param-name>ExpiresByType image/gif</param-name>
+ <param-value>modification plus 5 hours 3 minutes</param-value>
+</init-param></code></pre></div>
+ <p>
+ Note that if you use a modification date based setting, the <code>Expires</code>
+ header will <strong>not</strong> be added to content that does not come from
+ a file on disk. This is due to the fact that there is no modification time
+ for such content.
+ </p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Expiration_headers_generation_eligibility">Expiration headers generation eligibility</h4><div class="text">
+ <p>
+ A response is eligible to be enriched by <code>ExpiresFilter</code> if :
+ </p>
+ <ol>
+ <li>no expiration header is defined (<code>Expires</code> header or the
+ <code>max-age</code> directive of the <code>Cache-Control</code> header),</li>
+ <li>the response status code is not excluded by the directive
+ <code>ExpiresExcludedResponseStatusCodes</code>,</li>
+ <li>the <code>Content-Type</code> of the response matches one of the types
+ defined the in <code>ExpiresByType</code> directives or the
+ <code>ExpiresDefault</code> directive is defined.</li>
+ </ol>
+
+ <p>
+ Note : If <code>Cache-Control</code> header contains other directives than
+ <code>max-age</code>, they are concatenated with the <code>max-age</code> directive
+ that is added by the <code>ExpiresFilter</code>.
+ </p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Expiration_configuration_selection">Expiration configuration selection</h4><div class="text">
+ <p>
+ The expiration configuration if elected according to the following algorithm:
+ </p>
+ <ol>
+ <li><code>ExpiresByType</code> matching the exact content-type returned by
+ <code>HttpServletResponse.getContentType()</code> possibly including the charset
+ (e.g. '<code>text/xml;charset=UTF-8</code>'),</li>
+ <li><code>ExpiresByType</code> matching the content-type without the charset if
+ <code>HttpServletResponse.getContentType()</code> contains a charset (e.g.
+ '<code>text/xml;charset=UTF-8</code>' -> '<code>text/xml</code>'),</li>
+ <li><code>ExpiresByType</code> matching the major type (e.g. substring before
+ '<code>/</code>') of <code>HttpServletResponse.getContentType()</code>
+ (e.g. '<code>text/xml;charset=UTF-8</code>' -> '<code>text</code>'),</li>
+ <li><code>ExpiresDefault</code></li>
+ </ol>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Expires_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text">
+
+ <p>The filter class name for the Expires Filter is
+ <strong><code>org.apache.catalina.filters.ExpiresFilter</code>
+ </strong>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Expires_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text">
+
+ <p>The <strong>Expires Filter</strong> supports the following
+ initialisation parameters:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">ExpiresExcludedResponseStatusCodes</code></td><td>
+ <p>
+ This directive defines the http response status codes for which the
+ <code>ExpiresFilter</code> will not generate expiration headers. By default, the
+ <code>304</code> status code ("<code>Not modified</code>") is skipped. The
+ value is a comma separated list of http status codes.
+ </p>
+ <p>
+ This directive is useful to ease usage of <code>ExpiresDefault</code> directive.
+ Indeed, the behavior of <code>304 Not modified</code> (which does specify a
+ <code>Content-Type</code> header) combined with <code>Expires</code> and
+ <code>Cache-Control:max-age=</code> headers can be unnecessarily tricky to
+ understand.
+ </p>
+ <p><i>See sample below the table</i></p>
+ </td></tr><tr><td><code class="attributeName">ExpiresByType <content-type></code></td><td>
+ <p>
+ This directive defines the value of the <code>Expires</code> header and the
+ <code>max-age</code> directive of the <code>Cache-Control</code> header generated for
+ documents of the specified type (<i>e.g.</i>, <code>text/html</code>). The second
+ argument sets the number of seconds that will be added to a base time to
+ construct the expiration date. The <code>Cache-Control: max-age</code> is
+ calculated by subtracting the request time from the expiration date and
+ expressing the result in seconds.
+ </p>
+ <p>
+ The base time is either the last modification time of the file, or the time
+ of the client's access to the document. Which should be used is
+ specified by the <code><code></code> field; <code>M</code> means that the
+ file's last modification time should be used as the base time, and
+ <code>A</code> means the client's access time should be used. The duration
+ is expressed in seconds. <code>A2592000</code> stands for
+ <code>access plus 30 days</code> in alternate syntax.
+ </p>
+ <p>
+ The difference in effect is subtle. If <code>M</code> (<code>modification</code> in
+ alternate syntax) is used, all current copies of the document in all caches
+ will expire at the same time, which can be good for something like a weekly
+ notice that's always found at the same URL. If <code>A</code> (
+ <code>access</code> or <code>now</code> in alternate syntax) is used, the date of
+ expiration is different for each client; this can be good for image files
+ that don't change very often, particularly for a set of related
+ documents that all refer to the same images (<i>i.e.</i>, the images will be
+ accessed repeatedly within a relatively short timespan).
+ </p>
+ <p>
+ <strong>Note:</strong> When the content type includes a charset (e.g.
+ <code>'ExpiresByType text/xml;charset=utf-8'</code>), Tomcat removes blank chars
+ between the '<code>;</code>' and the '<code>charset</code>' keyword. Due to this,
+ configuration of an expiration with a charset must <strong>not</strong> include
+ such a space character.
+ </p>
+ <p><i>See sample below the table</i></p>
+ <p>
+ It overrides, for the specified MIME type <i>only</i>, any
+ expiration date set by the <code>ExpiresDefault</code> directive.
+ </p>
+ <p>
+ You can also specify the expiration time calculation using an alternate
+ syntax, described earlier in this document.
+ </p>
+ </td></tr><tr><td><code class="attributeName">ExpiresDefault</code></td><td>
+ <p>
+ This directive sets the default algorithm for calculating the
+ expiration time for all documents in the affected realm. It can be
+ overridden on a type-by-type basis by the <code>ExpiresByType</code> directive. See the
+ description of that directive for details about the syntax of the
+ argument, and the "alternate syntax"
+ description as well.
+ </p>
+ </td></tr></table>
+
+ <p><i>Sample: exclude response status codes 302, 500 and 503</i></p>
+
+<div class="codeBox"><pre><code><init-param>
+ <param-name>ExpiresExcludedResponseStatusCodes</param-name>
+ <param-value>302, 500, 503</param-value>
+</init-param></code></pre></div>
+
+ <p><i>Sample for ExpiresByType initialization parameter</i></p>
+
+ <div class="codeBox"><pre><code><init-param>
+ <param-name>ExpiresByType text/html</param-name>
+ <param-value>access plus 1 month 15 days 2 hours</param-value>
+</init-param>
+
+<init-param>
+ <!-- 2592000 seconds = 30 days -->
+ <param-name>ExpiresByType image/gif</param-name>
+ <param-value>A2592000</param-value>
+</init-param></code></pre></div>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Troubleshooting">Troubleshooting</h4><div class="text">
+ <p>
+ To troubleshoot, enable logging on the
+ <code>org.apache.catalina.filters.ExpiresFilter</code>.
+ </p>
+ <p>
+ Extract of logging.properties
+ </p>
+
+ <div class="codeBox"><pre><code>org.apache.catalina.filters.ExpiresFilter.level = FINE </code></pre></div>
+ <p>
+ Sample of initialization log message:
+ </p>
+
+ <div class="codeBox"><pre><code>Mar 26, 2010 2:01:41 PM org.apache.catalina.filters.ExpiresFilter init
+FINE: Filter initialized with configuration ExpiresFilter[
+ excludedResponseStatusCode=[304],
+ default=null,
+ byType={
+ image=ExpiresConfiguration[startingPoint=ACCESS_TIME, duration=[10 MINUTE]],
+ text/css=ExpiresConfiguration[startingPoint=ACCESS_TIME, duration=[10 MINUTE]],
+ text/javascript=ExpiresConfiguration[startingPoint=ACCESS_TIME, duration=[10 MINUTE]]}]</code></pre></div>
+ <p>
+ Sample of per-request log message where <code>ExpiresFilter</code> adds an
+ expiration date is below. The message is on one line and is wrapped here
+ for better readability.
+ </p>
+
+ <div class="codeBox"><pre><code>Mar 26, 2010 2:09:47 PM org.apache.catalina.filters.ExpiresFilter onBeforeWriteResponseBody
+FINE: Request "/tomcat.gif" with response status "200"
+ content-type "image/gif", set expiration date 3/26/10 2:19 PM</code></pre></div>
+ <p>
+ Sample of per-request log message where <code>ExpiresFilter</code> does not add
+ an expiration date:
+ </p>
+
+ <div class="codeBox"><pre><code>Mar 26, 2010 2:10:27 PM org.apache.catalina.filters.ExpiresFilter onBeforeWriteResponseBody
+FINE: Request "/docs/config/manager.html" with response status "200"
+ content-type "text/html", no expiration configured</code></pre></div>
+ </div></div>
+
+</div><h3 id="Failed_Request_Filter">Failed Request Filter</h3><div class="text">
+
+ <div class="subsection"><h4 id="Failed_Request_Filter/Introduction">Introduction</h4><div class="text">
+
+ <p>This filter triggers parameters parsing in a request and rejects the
+ request if some parameters were skipped during parameter parsing because
+ of parsing errors or request size limitations (such as
+ <code>maxParameterCount</code> attribute in a
+ <a href="http.html">Connector</a>).
+ This filter can be used to ensure that none parameter values submitted by
+ client are lost.</p>
+
+ <p>Note that parameter parsing may consume the body of an HTTP request, so
+ caution is needed if the servlet protected by this filter uses
+ <code>request.getInputStream()</code> or <code>request.getReader()</code>
+ calls. In general the risk of breaking a web application by adding this
+ filter is not so high, because parameter parsing does check content type
+ of the request before consuming the request body.</p>
+
+ <p>Note, that for the POST requests to be parsed correctly, a
+ <code>SetCharacterEncodingFilter</code> filter must be configured above
+ this one. See CharacterEncoding page in the FAQ for details.</p>
+
+ <p>The request is rejected with HTTP status code 400 (Bad Request).</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Failed_Request_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text">
+
+ <p>The filter class name for the Failed Request Filter is
+ <strong><code>org.apache.catalina.filters.FailedRequestFilter</code>
+ </strong>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Failed_Request_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text">
+
+ <p>The Failed Request Filter does not support any initialization parameters.</p>
+
+ </div></div>
+
+</div><h3 id="HTTP_Header_Security_Filter">HTTP Header Security Filter</h3><div class="text">
+
+ <div class="subsection"><h4 id="HTTP_Header_Security_Filter/Introduction">Introduction</h4><div class="text">
+
+ <p>There are a number of HTTP headers that can be added to the response to
+ improve the security of the connection. This filter provides a mechanism for
+ adding those headers. Note that security related headers with more complex
+ requirements, like CORS, are implemented as separate Filters.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="HTTP_Header_Security_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text">
+
+ <p>The filter class name for the HTTP Header Security Filter is
+ <strong><code>org.apache.catalina.filters.HttpHeaderSecurityFilter</code>
+ </strong>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="HTTP_Header_Security_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text">
+
+ <p>The HTTP Header Security Filter supports the following initialization
+ parameters:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">hstsEnabled</code></td><td>
+ <p>Will an HTTP Strict Transport Security (HSTS) header
+ (<code>Strict-Transport-Security</code>) be set on the response for
+ secure requests. Any HSTS header already present will be replaced. See
+ <a href="https://tools.ietf.org/html/rfc6797">RFC 6797</a> for further
+ details of HSTS. If not specified, the default value of
+ <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">hstsMaxAgeSeconds</code></td><td>
+ <p>The max age value that should be used in the HSTS header. Negative
+ values will be treated as zero. If not specified, the default value of
+ <code>0</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">hstsIncludeSubDomains</code></td><td>
+ <p>Should the includeSubDomains parameter be included in the HSTS
+ header. If not specified, the default value of <code>false</code> will
+ be used.</p>
+ </td></tr><tr><td><code class="attributeName">hstsPreload</code></td><td>
+ <p>Should the preload parameter be included in the HSTS header. If not
+ specified, the default value of <code>false</code> will be used. See
+ <a href="https://hstspreload.org/">https://hstspreload.org</a> for
+ important information about this parameter.</p>
+ </td></tr><tr><td><code class="attributeName">antiClickJackingEnabled</code></td><td>
+ <p>Should the anti click-jacking header (<code>X-Frame-Options</code>)
+ be set on the response. Any anti click-jacking header already present
+ will be replaced. If not specified, the default value of
+ <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">antiClickJackingOption</code></td><td>
+ <p>What value should be used for the anticlick-jacking header? Must be
+ one of <code>DENY</code>, <code>SAMEORIGIN</code>,
+ <code>ALLOW-FROM </code> (case-insensitive). If not specified, the
+ default value of <code>DENY</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">antiClickJackingUri</code></td><td>
+ <p>If ALLOW-FROM is used for <strong>antiClickJackingOption</strong>,
+ what URI should be allowed? If not specified, the default value of an
+ empty string will be used.</p>
+ </td></tr><tr><td><code class="attributeName">blockContentTypeSniffingEnabled</code></td><td>
+ <p>Should the header that blocks content type sniffing
+ (<code>X-Content-Type-Options</code>) be set on every response. If
+ already present, the header will be replaced. If not specified, the
+ default value of <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">xssProtectionEnabled</code></td><td>
+ <p>Should the header that enables the browser's cross-site scripting
+ filter protection (<code>X-XSS-Protection: 1; mode=block</code>)
+ be set on every response. If already present, the header
+ will be replaced. If not specified, the default value of
+ <code>true</code> will be used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="Remote_Address_Filter">Remote Address Filter</h3><div class="text">
+
+ <div class="subsection"><h4 id="Remote_Address_Filter/Introduction">Introduction</h4><div class="text">
+
+ <p>The <strong>Remote Address Filter</strong> allows you to compare the
+ IP address of the client that submitted this request against one or more
+ <em>regular expressions</em>, and either allow the request to continue
+ or refuse to process the request from this client. </p>
+
+ <p>The syntax for <em>regular expressions</em> is different than that for
+ 'standard' wildcard matching. Tomcat uses the <code>java.util.regex</code>
+ package. Please consult the Java documentation for details of the
+ expressions supported.</p>
+
+ <p><strong>Note:</strong> There is a caveat when using this filter with
+ IPv6 addresses. Format of the IP address that this valve is processing
+ depends on the API that was used to obtain it. If the address was obtained
+ from Java socket using Inet6Address class, its format will be
+ <code>x:x:x:x:x:x:x:x</code>. That is, the IP address for localhost
+ will be <code>0:0:0:0:0:0:0:1</code> instead of the more widely used
+ <code>::1</code>. Consult your access logs for the actual value.</p>
+
+ <p>See also: <a href="#Remote_Host_Filter">Remote Host Filter</a>.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_Address_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text">
+
+ <p>The filter class name for the Remote Address Filter is
+ <strong><code>org.apache.catalina.filters.RemoteAddrFilter</code>
+ </strong>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_Address_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text">
+
+ <p>The <strong>Remote Address Filter</strong> supports the following
+ initialisation parameters:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allow</code></td><td>
+ <p>A regular expression (using <code>java.util.regex</code>) that the
+ remote client's IP address is compared to. If this attribute
+ is specified, the remote address MUST match for this request to be
+ accepted. If this attribute is not specified, all requests will be
+ accepted UNLESS the remote address matches a <code>deny</code>
+ pattern.</p>
+ </td></tr><tr><td><code class="attributeName">deny</code></td><td>
+ <p>A regular expression (using <code>java.util.regex</code>) that the
+ remote client's IP address is compared to. If this attribute
+ is specified, the remote address MUST NOT match for this request to be
+ accepted. If this attribute is not specified, request acceptance is
+ governed solely by the <code>accept</code> attribute.</p>
+ </td></tr><tr><td><code class="attributeName">denyStatus</code></td><td>
+ <p>HTTP response status code that is used when rejecting denied
+ request. The default value is <code>403</code>. For example,
+ it can be set to the value <code>404</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_Address_Filter/Example">Example</h4><div class="text">
+ <p>To allow access only for the clients connecting from localhost:</p>
+<div class="codeBox"><pre><code> <filter>
+ <filter-name>Remote Address Filter</filter-name>
+ <filter-class>org.apache.catalina.filters.RemoteAddrFilter</filter-class>
+ <init-param>
+ <param-name>allow</param-name>
+ <param-value>127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1</param-value>
+ </init-param>
+ </filter>
+ <filter-mapping>
+ <filter-name>Remote Address Filter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping></code></pre></div>
+ </div></div>
+
+</div><h3 id="Remote_Host_Filter">Remote Host Filter</h3><div class="text">
+
+ <div class="subsection"><h4 id="Remote_Host_Filter/Introduction">Introduction</h4><div class="text">
+
+ <p>The <strong>Remote Host Filter</strong> allows you to compare the
+ hostname of the client that submitted this request against one or more
+ <em>regular expressions</em>, and either allow the request to continue
+ or refuse to process the request from this client. </p>
+
+ <p>The syntax for <em>regular expressions</em> is different than that for
+ 'standard' wildcard matching. Tomcat uses the <code>java.util.regex</code>
+ package. Please consult the Java documentation for details of the
+ expressions supported.</p>
+
+ <p><strong>Note:</strong> This filter processes the value returned by
+ method <code>ServletRequest.getRemoteHost()</code>. To allow the method
+ to return proper host names, you have to enable "DNS lookups" feature on
+ a <strong>Connector</strong>.</p>
+
+ <p>See also: <a href="#Remote_Address_Filter">Remote Address Filter</a>,
+ <a href="http.html">HTTP Connector</a> configuration.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_Host_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text">
+
+ <p>The filter class name for the Remote Address Filter is
+ <strong><code>org.apache.catalina.filters.RemoteHostFilter</code>
+ </strong>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_Host_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text">
+
+ <p>The <strong>Remote Host Filter</strong> supports the following
+ initialisation parameters:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allow</code></td><td>
+ <p>A regular expression (using <code>java.util.regex</code>) that the
+ remote client's hostname is compared to. If this attribute
+ is specified, the remote hostname MUST match for this request to be
+ accepted. If this attribute is not specified, all requests will be
+ accepted UNLESS the remote hostname matches a <code>deny</code>
+ pattern.</p>
+ </td></tr><tr><td><code class="attributeName">deny</code></td><td>
+ <p>A regular expression (using <code>java.util.regex</code>) that the
+ remote client's hostname is compared to. If this attribute
+ is specified, the remote hostname MUST NOT match for this request to be
+ accepted. If this attribute is not specified, request acceptance is
+ governed solely by the <code>accept</code> attribute.</p>
+ </td></tr><tr><td><code class="attributeName">denyStatus</code></td><td>
+ <p>HTTP response status code that is used when rejecting denied
+ request. The default value is <code>403</code>. For example,
+ it can be set to the value <code>404</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="Remote_CIDR_Filter">Remote CIDR Filter</h3><div class="text">
+
+ <div class="subsection"><h4 id="Remote_CIDR_Filter/Introduction">Introduction</h4><div class="text">
+
+ <p>The <strong>Remote CIDR Filter</strong> allows you to compare the
+ IP address of the client that submitted this request against one or more
+ netmasks following the CIDR notation, and either allow the request to
+ continue or refuse to process the request from this client. IPv4 and
+ IPv6 are both fully supported.
+ </p>
+
+ <p>This filter mimicks Apache httpd's <code>Order</code>,
+ <code>Allow from</code> and <code>Deny from</code> directives,
+ with the following limitations:
+ </p>
+
+ <ul>
+ <li><code>Order</code> will always be <code>allow, deny</code>;</li>
+ <li>dotted quad notations for netmasks are not supported (that is, you
+ cannot write <code>192.168.1.0/255.255.255.0</code>, you must write
+ <code>192.168.1.0/24</code>;
+ </li>
+ <li>shortcuts, like <code>10.10.</code>, which is equivalent to
+ <code>10.10.0.0/16</code>, are not supported;
+ </li>
+ <li>as the filter name says, this is a CIDR only filter,
+ therefore subdomain notations like <code>.mydomain.com</code> are not
+ supported either.
+ </li>
+ </ul>
+
+ <p>Some more features of this filter are:
+ </p>
+
+ <ul>
+ <li>if you omit the CIDR prefix, this filter becomes a single IP
+ filter;</li>
+ <li>unlike the <a href="#Remote_Host_Filter">Remote Host Filter</a>,
+ it can handle IPv6 addresses in condensed form (<code>::1</code>,
+ <code>fe80::/71</code>, etc).</li>
+ </ul>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_CIDR_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text">
+
+ <p>The filter class name for the Remote Address Filter is
+ <strong><code>org.apache.catalina.filters.RemoteCIDRFilter</code>
+ </strong>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_CIDR_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text">
+
+ <p>The <strong>Remote CIDR Filter</strong> supports the following
+ initialisation parameters:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allow</code></td><td>
+ <p>A comma-separated list of IPv4 or IPv6 netmasks or addresses
+ that the remote client's IP address is matched against.
+ If this attribute is specified, the remote address MUST match
+ for this request to be accepted. If this attribute is not specified,
+ all requests will be accepted UNLESS the remote IP is matched by a
+ netmask in the <code>deny</code> attribute.
+ </p>
+ </td></tr><tr><td><code class="attributeName">deny</code></td><td>
+ <p>A comma-separated list of IPv4 or IPv6 netmasks or addresses
+ that the remote client's IP address is matched against.
+ If this attribute is specified, the remote address MUST NOT match
+ for this request to be accepted. If this attribute is not specified,
+ request acceptance is governed solely by the <code>accept</code>
+ attribute.
+ </p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_CIDR_Filter/Example">Example</h4><div class="text">
+ <p>To allow access only for the clients connecting from localhost:</p>
+ <pre>
+ <filter>
+ <filter-name>Remote CIDR Filter</filter-name>
+ <filter-class>org.apache.catalina.filters.RemoteCIDRFilter</filter-class>
+ <init-param>
+ <param-name>allow</param-name>
+ <param-value>127.0.0.0/8, ::1</param-value>
+ </init-param>
+ </filter>
+ <filter-mapping>
+ <filter-name>Remote CIDR Filter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+ </pre>
+ </div></div>
+
+</div><h3 id="Remote_IP_Filter">Remote IP Filter</h3><div class="text">
+
+ <div class="subsection"><h4 id="Remote_IP_Filter/Introduction">Introduction</h4><div class="text">
+
+ <p>Tomcat port of
+ <a href="https://httpd.apache.org/docs/trunk/mod/mod_remoteip.html">mod_remoteip</a>,
+ this filter replaces the apparent client remote IP address and hostname for
+ the request with the IP address list presented by a proxy or a load balancer
+ via a request headers (e.g. "X-Forwarded-For").</p>
+
+ <p>Another feature of this filter is to replace the apparent scheme
+ (http/https), server port and <code>request.secure</code> with the scheme presented
+ by a proxy or a load balancer via a request header
+ (e.g. "X-Forwarded-Proto").</p>
+
+ <p>If used in conjunction with Remote Address/Host filters then this filter
+ should be defined first to ensure that the correct client IP address is
+ presented to the Remote Address/Host filters.</p>
+
+ <p><strong>Note:</strong> By default this filter has no effect on the
+ values that are written into access log. The original values are restored
+ when request processing leaves the filter and that always happens earlier
+ than access logging. To pass the remote address, remote host, server port
+ and protocol values set by this filter to the access log,
+ they are put into request attributes. Publishing these values here
+ is enabled by default, but <code>AccessLogValve</code> should be explicitly
+ configured to use them. See documentation for
+ <code>requestAttributesEnabled</code> attribute of
+ <code>AccessLogValve</code>.</p>
+
+ <p>The names of request attributes that are set by this filter
+ and can be used by access logging are the following:</p>
+
+ <ul>
+ <li><code>org.apache.catalina.AccessLog.RemoteAddr</code></li>
+ <li><code>org.apache.catalina.AccessLog.RemoteHost</code></li>
+ <li><code>org.apache.catalina.AccessLog.Protocol</code></li>
+ <li><code>org.apache.catalina.AccessLog.ServerPort</code></li>
+ <li><code>org.apache.tomcat.remoteAddr</code></li>
+ </ul>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_IP_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text">
+
+ <p>The filter class name for the Remote IP Filter is
+ <strong><code>org.apache.catalina.filters.RemoteIpFilter</code>
+ </strong>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Basic_configuration_to_handle_'x-forwarded-for'">Basic configuration to handle 'x-forwarded-for'</h4><div class="text">
+ <p>
+ The filter will process the <code>x-forwarded-for</code> http header.
+ </p>
+ <div class="codeBox"><pre><code> <filter>
+ <filter-name>RemoteIpFilter</filter-name>
+ <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
+ </filter>
+
+ <filter-mapping>
+ <filter-name>RemoteIpFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+ <dispatcher>REQUEST</dispatcher>
+ </filter-mapping></code></pre></div>
+ </div></div>
+
+ <div class="subsection"><h4 id="Basic_configuration_to_handle_'x-forwarded-for'_and_'x-forwarded-proto'">Basic configuration to handle 'x-forwarded-for' and 'x-forwarded-proto'</h4><div class="text">
+
+ <p>
+ The filter will process <code>x-forwarded-for</code> and
+ <code>x-forwarded-proto</code> http headers. Expected value for the
+ <code>x-forwarded-proto</code> header in case of SSL connections is
+ <code>https</code> (case insensitive). </p>
+ <div class="codeBox"><pre><code> <filter>
+ <filter-name>RemoteIpFilter</filter-name>
+ <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
+ <init-param>
+ <param-name>protocolHeader</param-name>
+ <param-value>x-forwarded-proto</param-value>
+ </init-param>
+ </filter>
+
+ <filter-mapping>
+ <filter-name>RemoteIpFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+ <dispatcher>REQUEST</dispatcher>
+ </filter-mapping></code></pre></div>
+ </div></div>
+
+ <div class="subsection"><h4 id="Advanced_configuration_with_internal_proxies">Advanced configuration with internal proxies</h4><div class="text">
+ <p>RemoteIpFilter configuration: </p>
+ <div class="codeBox"><pre><code> <filter>
+ <filter-name>RemoteIpFilter</filter-name>
+ <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
+ <init-param>
+ <param-name>allowedInternalProxies</param-name>
+ <param-value>192\.168\.0\.10|192\.168\.0\.11</param-value>
+ </init-param>
+ <init-param>
+ <param-name>remoteIpHeader</param-name>
+ <param-value>x-forwarded-for</param-value>
+ </init-param>
+ <init-param>
+ <param-name>remoteIpProxiesHeader</param-name>
+ <param-value>x-forwarded-by</param-value>
+ </init-param>
+ <init-param>
+ <param-name>protocolHeader</param-name>
+ <param-value>x-forwarded-proto</param-value>
+ </init-param>
+ </filter></code></pre></div>
+ <p>Request values:</p>
+ <table class="defaultTable">
+ <tr>
+ <th>Property</th>
+ <th>Value Before RemoteIpFilter</th>
+ <th>Value After RemoteIpFilter</th>
+ </tr>
+ <tr>
+ <td> request.remoteAddr </td>
+ <td> 192.168.0.10 </td>
+ <td> 140.211.11.130 </td>
+ </tr>
+ <tr>
+ <td> request.header<code>[</code>'x-forwarded-for'<code>]</code> </td>
+ <td> 140.211.11.130, 192.168.0.10 </td>
+ <td> null </td>
+ </tr>
+ <tr>
+ <td> request.header<code>[</code>'x-forwarded-by'<code>]</code> </td>
+ <td> null </td>
+ <td> null </td>
+ </tr>
+ <tr>
+ <td> request.header<code>[</code>'x-forwarded-proto'<code>]</code> </td>
+ <td> https </td>
+ <td> https </td>
+ </tr>
+ <tr>
+ <td> request.scheme </td>
+ <td> http </td>
+ <td> https </td>
+ </tr>
+ <tr>
+ <td> request.secure </td>
+ <td> false </td>
+ <td> true </td>
+ </tr>
+ <tr>
+ <td> request.serverPort </td>
+ <td> 80 </td>
+ <td> 443 </td>
+ </tr>
+ </table>
+
+ <p>
+ Note : <code>x-forwarded-by</code> header is <code>null</code> because only
+ internal proxies has been traversed by the request.
+ <code>x-forwarded-for</code> is <code>null</code> because all the proxies are
+ trusted or internal.
+ </p>
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Advanced_configuration_with_trusted_proxies">Advanced configuration with trusted proxies</h4><div class="text">
+ <p>RemoteIpFilter configuration: </p>
+ <div class="codeBox"><pre><code> <filter>
+ <filter-name>RemoteIpFilter</filter-name>
+ <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
+ <init-param>
+ <param-name>allowedInternalProxies</param-name>
+ <param-value>192\.168\.0\.10|192\.168\.0\.11</param-value>
+ </init-param>
+ <init-param>
+ <param-name>remoteIpHeader</param-name>
+ <param-value>x-forwarded-for</param-value>
+ </init-param>
+ <init-param>
+ <param-name>remoteIpProxiesHeader</param-name>
+ <param-value>x-forwarded-by</param-value>
+ </init-param>
+ <init-param>
+ <param-name>trustedProxies</param-name>
+ <param-value>proxy1|proxy2</param-value>
+ </init-param>
+ </filter></code></pre></div>
+ <p>Request values:</p>
+ <table class="defaultTable">
+ <tr>
+ <th>Property</th>
+ <th>Value Before RemoteIpFilter</th>
+ <th>Value After RemoteIpFilter</th>
+ </tr>
+ <tr>
+ <td> request.remoteAddr </td>
+ <td> 192.168.0.10 </td>
+ <td> 140.211.11.130 </td>
+ </tr>
+ <tr>
+ <td> request.header<code>[</code>'x-forwarded-for'<code>]</code> </td>
+ <td> 140.211.11.130, proxy1, proxy2 </td>
+ <td> null </td>
+ </tr>
+ <tr>
+ <td> request.header<code>[</code>'x-forwarded-by'<code>]</code> </td>
+ <td> null </td>
+ <td> proxy1, proxy2 </td>
+ </tr>
+ </table>
+
+ <p>
+ Note : <code>proxy1</code> and <code>proxy2</code> are both trusted proxies that
+ come in <code>x-forwarded-for</code> header, they both are migrated in
+ <code>x-forwarded-by</code> header. <code>x-forwarded-for</code> is <code>null</code>
+ because all the proxies are trusted or internal.
+ </p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Advanced_configuration_with_internal_and_trusted_proxies">Advanced configuration with internal and trusted proxies</h4><div class="text">
+ <p>RemoteIpFilter configuration: </p>
+ <div class="codeBox"><pre><code> <filter>
+ <filter-name>RemoteIpFilter</filter-name>
+ <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
+ <init-param>
+ <param-name>allowedInternalProxies</param-name>
+ <param-value>192\.168\.0\.10|192\.168\.0\.11</param-value>
+ </init-param>
+ <init-param>
+ <param-name>remoteIpHeader</param-name>
+ <param-value>x-forwarded-for</param-value>
+ </init-param>
+ <init-param>
+ <param-name>remoteIpProxiesHeader</param-name>
+ <param-value>x-forwarded-by</param-value>
+ </init-param>
+ <init-param>
+ <param-name>trustedProxies</param-name>
+ <param-value>proxy1|proxy2</param-value>
+ </init-param>
+ </filter></code></pre></div>
+ <p>Request values:</p>
+ <table class="defaultTable">
+ <tr>
+ <th>Property</th>
+ <th>Value Before RemoteIpFilter</th>
+ <th>Value After RemoteIpFilter</th>
+ </tr>
+ <tr>
+ <td> request.remoteAddr </td>
+ <td> 192.168.0.10 </td>
+ <td> 140.211.11.130 </td>
+ </tr>
+ <tr>
+ <td> request.header<code>[</code>'x-forwarded-for'<code>]</code> </td>
+ <td> 140.211.11.130, proxy1, proxy2, 192.168.0.10 </td>
+ <td> null </td>
+ </tr>
+ <tr>
+ <td> request.header<code>[</code>'x-forwarded-by'<code>]</code> </td>
+ <td> null </td>
+ <td> proxy1, proxy2 </td>
+ </tr>
+ </table>
+
+ <p>
+ Note : <code>proxy1</code> and <code>proxy2</code> are both trusted proxies that
+ come in <code>x-forwarded-for</code> header, they both are migrated in
+ <code>x-forwarded-by</code> header. As <code>192.168.0.10</code> is an internal
+ proxy, it does not appear in <code>x-forwarded-by</code>.
+ <code>x-forwarded-for</code> is <code>null</code> because all the proxies are
+ trusted or internal.
+ </p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Advanced_configuration_with_an_untrusted_proxy">Advanced configuration with an untrusted proxy</h4><div class="text">
+
+ <p>RemoteIpFilter configuration: </p>
+ <div class="codeBox"><pre><code> <filter>
+ <filter-name>RemoteIpFilter</filter-name>
+ <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
+ <init-param>
+ <param-name>allowedInternalProxies</param-name>
+ <param-value>192\.168\.0\.10|192\.168\.0\.11</param-value>
+ </init-param>
+ <init-param>
+ <param-name>remoteIpHeader</param-name>
+ <param-value>x-forwarded-for</param-value>
+ </init-param>
+ <init-param>
+ <param-name>remoteIpProxiesHeader</param-name>
+ <param-value>x-forwarded-by</param-value>
+ </init-param>
+ <init-param>
+ <param-name>trustedProxies</param-name>
+ <param-value>proxy1|proxy2</param-value>
+ </init-param>
+ </filter></code></pre></div>
+ <p>Request values:</p>
+ <table class="defaultTable">
+ <tr>
+ <th>Property</th>
+ <th>Value Before RemoteIpFilter</th>
+ <th>Value After RemoteIpFilter</th>
+ </tr>
+ <tr>
+ <td> request.remoteAddr </td>
+ <td> 192.168.0.10 </td>
+ <td> untrusted-proxy </td>
+ </tr>
+ <tr>
+ <td> request.header<code>[</code>'x-forwarded-for'<code>]</code> </td>
+ <td> 140.211.11.130, untrusted-proxy, proxy1 </td>
+ <td> 140.211.11.130 </td>
+ </tr>
+ <tr>
+ <td> request.header<code>[</code>'x-forwarded-by'<code>]</code> </td>
+ <td> null </td>
+ <td> proxy1 </td>
+ </tr>
+ </table>
+
+ <p>
+ Note : <code>x-forwarded-by</code> holds the trusted proxy <code>proxy1</code>.
+ <code>x-forwarded-by</code> holds <code>140.211.11.130</code> because
+ <code>untrusted-proxy</code> is not trusted and thus, we cannot trust that
+ <code>untrusted-proxy</code> is the actual remote ip.
+ <code>request.remoteAddr</code> is <code>untrusted-proxy</code> that is an IP
+ verified by <code>proxy1</code>.
+ </p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_IP_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text">
+
+ <p>The <strong>Remote IP Filter</strong> supports the
+ following initialisation parameters:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">enableLookups</code></td><td>
+ <p>Should a DNS lookup be performed to provide a host name when calling
+ <code>ServletRequest#getRemoteHost()</code>. If not specified, the
+ default of <code>false</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">remoteIpHeader</code></td><td>
+ <p>Name of the HTTP Header read by this valve that holds the list of
+ traversed IP addresses starting from the requesting client. If not
+ specified, the default of <code>x-forwarded-for</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">internalProxies</code></td><td>
+ <p>Regular expression (using <code>java.util.regex</code>) that a
+ proxy's IP address must match to be considered an internal proxy.
+ Internal proxies that appear in the <strong>remoteIpHeader</strong> will
+ be trusted and will not appear in the <strong>proxiesHeader</strong>
+ value. If not specified the default value of <code>
+ 10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.1[6-9]{1}\.\d{1,3}\.\d{1,3}|172\.2[0-9]{1}\.\d{1,3}\.\d{1,3}|172\.3[0-1]{1}\.\d{1,3}\.\d{1,3}|0:0:0:0:0:0:0:1
+ </code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">proxiesHeader</code></td><td>
+ <p>Name of the HTTP header created by this valve to hold the list of
+ proxies that have been processed in the incoming
+ <strong>remoteIpHeader</strong>. If not specified, the default of
+ <code>x-forwarded-by</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">requestAttributesEnabled</code></td><td>
+ <p>Set to <code>true</code> to set the request attributes used by
+ AccessLog implementations to override the values returned by the
+ request for remote address, remote host, server port and protocol.
+ Request attributes are also used to enable the forwarded remote address
+ to be displayed on the status page of the Manager web application.
+ If not set, the default value of <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">trustedProxies</code></td><td>
+ <p>Regular expression (using <code>java.util.regex</code>) that a
+ proxy's IP address must match to be considered an trusted proxy.
+ Trusted proxies that appear in the <strong>remoteIpHeader</strong> will
+ be trusted and will appear in the <strong>proxiesHeader</strong> value.
+ If not specified, no proxies will be trusted.</p>
+ </td></tr><tr><td><code class="attributeName">protocolHeader</code></td><td>
+ <p>Name of the HTTP Header read by this valve that holds the protocol
+ used by the client to connect to the proxy. If not specified, the
+ default of <code>X-Forwarded-Proto</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">hostHeader</code></td><td>
+ <p>Name of the HTTP Header read by this valve that holds the host
+ used by the client to connect to the proxy. If not specified, the
+ default of <code>null</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">portHeader</code></td><td>
+ <p>Name of the HTTP Header read by this valve that holds the port
+ used by the client to connect to the proxy. If not specified, the
+ default of <code>null</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">protocolHeaderHttpsValue</code></td><td>
+ <p>Value of the <strong>protocolHeader</strong> to indicate that it is
+ an HTTPS request. If not specified, the default of <code>https</code> is
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">httpServerPort</code></td><td>
+ <p>Value returned by <code>ServletRequest.getServerPort()</code>
+ when the <strong>protocolHeader</strong> indicates <code>http</code>
+ protocol and no <strong>portHeader</strong> is present. If not
+ specified, the default of <code>80</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">httpsServerPort</code></td><td>
+ <p>Value returned by <code>ServletRequest.getServerPort()</code>
+ when the <strong>protocolHeader</strong> indicates <code>https</code>
+ protocol and no <strong>portHeader</strong> is present. If not
+ specified, the default of <code>443</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">changeLocalName</code></td><td>
+ <p>If <code>true</code>, the value returned by
+ <code>ServletRequest.getLocalName()</code> and
+ <code>ServletRequest.getServerName()</code> is modified by the this
+ filter. If not specified, the default of <code>false</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">changeLocalPort</code></td><td>
+ <p>If <code>true</code>, the value returned by
+ <code>ServletRequest.getLocalPort()</code> and
+ <code>ServletRequest.getServerPort()</code> is modified by the this
+ filter. If not specified, the default of <code>false</code> is used.</p>
+ </td></tr></table>
+
+
+ </div></div>
+
+</div><h3 id="Request_Dumper_Filter">Request Dumper Filter</h3><div class="text">
+
+ <div class="subsection"><h4 id="Request_Dumper_Filter/Introduction">Introduction</h4><div class="text">
+
+ <p>The Request Dumper Filter logs information from the request and response
+ objects and is intended to be used for debugging purposes. When using this
+ Filter, it is recommended that the
+ <code>org.apache.catalina.filter.RequestDumperFilter</code> logger is
+ directed to a dedicated file and that the
+ <code>org.apache.juli.VerbatimFormatter</code> is used.</p>
+
+ <p><strong>WARNING: Using this filter has side-effects.</strong> The
+ output from this filter includes any parameters included with the request.
+ The parameters will be decoded using the default platform encoding. Any
+ subsequent calls to <code>request.setCharacterEncoding()</code> within
+ the web application will have no effect.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Request_Dumper_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text">
+
+ <p>The filter class name for the Request Dumper Filter is
+ <strong><code>org.apache.catalina.filters.RequestDumperFilter</code>
+ </strong>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Request_Dumper_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text">
+
+ <p>The Request Dumper Filter does not support any initialization
+ parameters.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Request_Dumper_Filter/Sample_Configuration">Sample Configuration</h4><div class="text">
+
+ <p>The following entries in a web application's web.xml would enable the
+ Request Dumper filter for all requests for that web application. If the
+ entries were added to <code>CATALINA_BASE/conf/web.xml</code>, the Request
+ Dumper Filter would be enabled for all web applications.</p>
+ <div class="codeBox"><pre><code><filter>
+ <filter-name>requestdumper</filter-name>
+ <filter-class>
+ org.apache.catalina.filters.RequestDumperFilter
+ </filter-class>
+</filter>
+<filter-mapping>
+ <filter-name>requestdumper</filter-name>
+ <url-pattern>*</url-pattern>
+</filter-mapping></code></pre></div>
+
+ <p>The following entries in CATALINA_BASE/conf/logging.properties would
+ create a separate log file for the Request Dumper Filter output.</p>
+ <div class="codeBox"><pre><code># To this configuration below, 1request-dumper.org.apache.juli.FileHandler
+# also needs to be added to the handlers property near the top of the file
+1request-dumper.org.apache.juli.FileHandler.level = INFO
+1request-dumper.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
+1request-dumper.org.apache.juli.FileHandler.prefix = request-dumper.
+1request-dumper.org.apache.juli.FileHandler.encoding = UTF-8
+1request-dumper.org.apache.juli.FileHandler.formatter = org.apache.juli.VerbatimFormatter
+org.apache.catalina.filters.RequestDumperFilter.level = INFO
+org.apache.catalina.filters.RequestDumperFilter.handlers = \
+ 1request-dumper.org.apache.juli.FileHandler</code></pre></div>
+ </div></div>
+</div><h3 id="Session_Initializer_Filter">Session Initializer Filter</h3><div class="text">
+
+ <div class="subsection"><h4 id="Session_Initializer_Filter/Introduction">Introduction</h4><div class="text">
+ <p>The Session Initializer Filter initializes the <code>javax.servlet.http.HttpSession</code>
+ before the Request is processed. This is required for JSR-356 compliant WebSocket implementations,
+ if the <code>HttpSession</code> is needed during the HandShake phase.</p>
+
+ <p>The Java API for WebSocket does not mandate that an <code>HttpSession</code> would
+ be initialized upon request, and thus <code>javax.servlet.http.HttpServletRequest</code>'s
+ <code>getSession()</code> returns <code>null</code> if the <code>HttpSession</code> was not
+ initialized in advance.</p>
+
+ <p>This filter solves that problem by initializing the HttpSession for any <code>HttpServletRequest</code>
+ that matches its <code>url-pattern</code>.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Session_Initializer_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text">
+ <p>The filter class name for the Session Initializer Filter is
+ <strong><code>org.apache.catalina.filters.SessionInitializerFilter</code></strong>.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Session_Initializer_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text">
+ <p>The Session Initializer Filter does not support any initialization parameters.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Session_Initializer_Filter/Sample_Configuration">Sample Configuration</h4><div class="text">
+ <p>The following entries in the Web Application Deployment Descriptor, <strong>web.xml</strong>,
+ would enable the Session Initializer Filter for requests that match the given URL pattern
+ (in this example, "/ws/*").</p>
+
+ <div class="codeBox"><pre><code><filter>
+ <filter-name>SessionInitializer</filter-name>
+ <filter-class>org.apache.catalina.filters.SessionInitializerFilter</filter-class>
+</filter>
+<filter-mapping>
+ <filter-name>SessionInitializer</filter-name>
+ <url-pattern>/ws/*</url-pattern>
+</filter-mapping></code></pre></div>
+ </div></div>
+</div><h3 id="Set_Character_Encoding_Filter">Set Character Encoding Filter</h3><div class="text">
+
+ <div class="subsection"><h4 id="Set_Character_Encoding_Filter/Introduction">Introduction</h4><div class="text">
+
+ <p>User agents don't always include character encoding information in
+ requests. Depending on the how the request is processed, usually the
+ default encoding of ISO-8859-1 is used. This is not always
+ desirable. This filter provides options for setting that encoding or
+ forcing it to a particular value. Essentially this filter calls
+ <code>ServletRequest.setCharacterEncoding()</code> method.</p>
+
+ <p>Effectively the value set by this filter is used when parsing parameters
+ in a POST request, if parameter parsing occurs later than this filter. Thus
+ the order of filter mappings is important. Note that the encoding for GET
+ requests is not set here, but on a <b>Connector</b>. See
+ CharacterEncoding page in the FAQ for details.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Set_Character_Encoding_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text">
+
+ <p>The filter class name for the Set Character Encoding Filter is
+ <strong><code>org.apache.catalina.filters.SetCharacterEncodingFilter</code>
+ </strong>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Set_Character_Encoding_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text">
+
+ <p>The Set Character Encoding Filter supports the following initialization
+ parameters:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">encoding</code></strong></td><td>
+ <p>Name of the character encoding which should be set.</p>
+ </td></tr><tr><td><code class="attributeName">ignore</code></td><td>
+ <p>Determines if any character encoding specified by the user agent is
+ ignored. If this attribute is <code>true</code>, any value provided by
+ the user agent is ignored. If <code>false</code>, the encoding is only
+ set if the user agent did not specify an encoding. The default value
+ is <code>false</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="WebDAV_Fix_Filter">WebDAV Fix Filter</h3><div class="text">
+
+ <div class="subsection"><h4 id="WebDAV_Fix_Filter/Introduction">Introduction</h4><div class="text">
+
+ <p>Microsoft operating systems have two WebDAV clients. One is used with
+ port 80, the other is used for all other ports. The implementation used with
+ port 80 does not adhere to the WebDAV specification and fails when trying to
+ communicate with the Tomcat WebDAV Servlet. This Filter provides a fix for
+ this by forcing the use of the WebDAV implementation that works, even when
+ connecting via port 80.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="WebDAV_Fix_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text">
+
+ <p>The filter class name for the WebDAV Fix Filter is
+ <strong><code>org.apache.catalina.filters.WebdavFixFilter</code>
+ </strong>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="WebDAV_Fix_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text">
+
+ <p>The WebDAV Fix Filter does not support any initialization parameters.</p>
+
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/globalresources.html b/web/tomcat/webapps/docs/config/globalresources.html
new file mode 100644
index 0000000..a1d5c16
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/globalresources.html
@@ -0,0 +1,220 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The GlobalNamingResources Component</title><meta name="author" content="Remy Maucherat"><meta name="author" content="Yoav Shapira"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The GlobalNamingResources Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a><ol><li><a href="#Environment_Entries">Environment Entries</a></li><li><a href="#Resource_Definitions">Resource Definitions</a></li><li><a href="#Resource_Links">Resource Links</a></li><li><a href="#Transaction">Transaction</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The <strong>GlobalNamingResources</strong> element defines the global
+ JNDI resources for the <a href="server.html">Server</a>.</p>
+
+ <p>These resources are listed in the server's global JNDI resource context.
+ This context is distinct from the per-web-application JNDI contexts
+ described in
+ the <a href="../jndi-resources-howto.html">JNDI Resources How-To</a>.
+ The resources defined in this element are <strong>not</strong> visible in
+ the per-web-application contexts unless you explicitly link them with
+ <a href="context.html#Resource_Links"><ResourceLink></a> elements.
+ </p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+
+
+ <div class="subsection"><h4 id="Environment_Entries">Environment Entries</h4><div class="text">
+
+ <p>You can configure named values that will be made visible to all
+ web applications as environment entry resources by nesting
+ <code><Environment></code> entries inside this element. For
+ example, you can create an environment entry like this:</p>
+<div class="codeBox"><pre><code><GlobalNamingResources ...>
+ ...
+ <Environment name="maxExemptions" value="10"
+ type="java.lang.Integer" override="false"/>
+ ...
+</GlobalNamingResources></code></pre></div>
+
+ <p>This is equivalent to the inclusion of the following element in the
+ web application deployment descriptor (<code>/WEB-INF/web.xml</code>):
+ </p>
+<div class="codeBox"><pre><code><env-entry>
+ <env-entry-name>maxExemptions</env-entry-name>
+ <env-entry-value>10</env-entry-value>
+ <env-entry-type>java.lang.Integer</env-entry-type>
+</env-entry></code></pre></div>
+ <p>but does <em>not</em> require modification of the deployment descriptor
+ to customize this value.</p>
+
+ <p>The valid attributes for an <code><Environment></code> element
+ are as follows:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">description</code></td><td>
+ <p>Optional, human-readable description of this environment entry.</p>
+ </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td>
+ <p>The name of the environment entry to be created, relative to the
+ <code>java:comp/env</code> context.</p>
+ </td></tr><tr><td><code class="attributeName">override</code></td><td>
+ <p>Set this to <code>false</code> if you do <strong>not</strong> want
+ an <code><env-entry></code> for the same environment entry name,
+ found in the web application deployment descriptor, to override the
+ value specified here. By default, overrides are allowed.</p>
+ </td></tr><tr><td><strong><code class="attributeName">type</code></strong></td><td>
+ <p>The fully qualified Java class name expected by the web application
+ for this environment entry. Must be a legal value for
+ <code><env-entry-type></code> in the web application deployment
+ descriptor.</p>
+ </td></tr><tr><td><strong><code class="attributeName">value</code></strong></td><td>
+ <p>The parameter value that will be presented to the application
+ when requested from the JNDI context. This value must be convertable
+ to the Java type defined by the <code>type</code> attribute.</p>
+ </td></tr></table>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Resource_Definitions">Resource Definitions</h4><div class="text">
+
+ <p>You can declare the characteristics of resources
+ to be returned for JNDI lookups of <code><resource-ref></code> and
+ <code><resource-env-ref></code> elements in the web application
+ deployment descriptor by defining them in this element and then linking
+ them with <a href="context.html#Resource_Links"><ResourceLink></a>
+ elements
+ in the <code><strong><Context></strong></code> element.
+
+ You <strong>MUST</strong> also define any other needed parameters using
+ attributes on the Resource element, to configure
+ the object factory to be used (if not known to Tomcat already), and
+ the properties used to configure that object factory.</p>
+
+ <p>For example, you can create a resource definition like this:</p>
+<div class="codeBox"><pre><code><GlobalNamingResources ...>
+ ...
+ <Resource name="jdbc/EmployeeDB" auth="Container"
+ type="javax.sql.DataSource"
+ description="Employees Database for HR Applications"/>
+ ...
+</GlobalNamingResources></code></pre></div>
+
+ <p>This is equivalent to the inclusion of the following element in the
+ web application deployment descriptor (<code>/WEB-INF/web.xml</code>):</p>
+<div class="codeBox"><pre><code><resource-ref>
+ <description>Employees Database for HR Applications</description>
+ <res-ref-name>jdbc/EmployeeDB</res-ref-name>
+ <res-ref-type>javax.sql.DataSource</res-ref-type>
+ <res-auth>Container</res-auth>
+</resource-ref></code></pre></div>
+
+ <p>but does <em>not</em> require modification of the deployment
+ descriptor to customize this value.</p>
+
+ <p>The valid attributes for a <code><Resource></code> element
+ are as follows:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">auth</code></td><td>
+ <p>Specify whether the web Application code signs on to the
+ corresponding resource manager programmatically, or whether the
+ Container will sign on to the resource manager on behalf of the
+ application. The value of this attribute must be
+ <code>Application</code> or <code>Container</code>. This
+ attribute is <strong>required</strong> if the web application
+ will use a <code><resource-ref></code> element in the web
+ application deployment descriptor, but is optional if the
+ application uses a <code><resource-env-ref></code> instead.</p>
+ </td></tr><tr><td><code class="attributeName">closeMethod</code></td><td>
+ <p>Name of the zero-argument method to call on a singleton resource when
+ it is no longer required. This is intended to speed up clean-up of
+ resources that would otherwise happen as part of garbage collection.
+ This attribute is ignored if the <code>singleton</code> attribute is
+ false. If not specified, no default is defined and no close method will
+ be called.</p>
+ <p>For Apache Commons DBCP 2 and Apache Tomcat JDBC connection pools
+ you can use <code>closeMethod="close"</code>. Note that Apache Commons
+ DBCP 2 requires this to be set for a clean shutdown. When using the
+ default Tomcat connection pool (based on DBCP 2) Tomcat will set this
+ attribute automatically unless it is explicitly set to the empty
+ string.</p>
+ </td></tr><tr><td><code class="attributeName">description</code></td><td>
+ <p>Optional, human-readable description of this resource.</p>
+ </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td>
+ <p>The name of the resource to be created, relative to the
+ <code>java:comp/env</code> context.</p>
+ </td></tr><tr><td><code class="attributeName">scope</code></td><td>
+ <p>Specify whether connections obtained through this resource
+ manager can be shared. The value of this attribute must be
+ <code>Shareable</code> or <code>Unshareable</code>. By default,
+ connections are assumed to be shareable.</p>
+ </td></tr><tr><td><code class="attributeName">singleton</code></td><td>
+ <p>Specify whether this resource definition is for a singleton resource,
+ i.e. one where there is only a single instance of the resource. If this
+ attribute is <code>true</code>, multiple JNDI lookups for this resource
+ will return the same object. If this attribute is <code>false</code>,
+ multiple JNDI lookups for this resource will return different objects.
+ This attribute must be <code>true</code> for
+ <code>javax.sql.DataSource</code> resources to enable JMX registration
+ of the DataSource. The value of this attribute must be <code>true</code>
+ or <code>false</code>. By default, this attribute is <code>true</code>.
+ </p>
+ </td></tr><tr><td><strong><code class="attributeName">type</code></strong></td><td>
+ <p>The fully qualified Java class name expected by the web
+ application when it performs a lookup for this resource.</p>
+ </td></tr></table>
+
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Resource_Links">Resource Links</h4><div class="text">
+ <p>Use <a href="context.html#Resource_Links"><code><ResourceLink></code></a>
+ elements to link resources from the global context into
+ per-web-application contexts. Here is an example of making a custom
+ factory available to an application, based on the example definition in the
+ <a href="../jndi-resources-howto.html#Generic_JavaBean_Resources">
+ JNDI Resource How-To</a>:
+ </p>
+
+ <div class="codeBox"><pre><code><Context>
+ <ResourceLink
+ name="bean/MyBeanFactory"
+ global="bean/MyBeanFactory"
+ type="com.mycompany.MyBean"
+ />
+</Context></code></pre></div>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Transaction">Transaction</h4><div class="text">
+
+ <p>You can declare the characteristics of the UserTransaction
+ to be returned for JNDI lookup for <code>java:comp/UserTransaction</code>.
+ You <strong>MUST</strong> define an object factory class to instantiate
+ this object as well as the needed resource parameters as attributes of the
+ <code>Transaction</code>
+ element, and the properties used to configure that object factory.</p>
+
+ <p>The valid attributes for the <code><Transaction></code> element
+ are as follows:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">factory</code></strong></td><td>
+ <p>The class name for the JNDI object factory.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/host.html b/web/tomcat/webapps/docs/config/host.html
new file mode 100644
index 0000000..6abb8f4
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/host.html
@@ -0,0 +1,592 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Host Container</title><meta name="author" content="Craig R. McClanahan"><meta name="author" content="Remy Maucherat"><meta name="author" content="Yoav Shapira"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Host Container</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a><ol><li><a href="#Logging">Logging</a></li><li><a href="#Access_Logs">Access Logs</a></li><li><a href="#Automatic_Application_Deployment">Automatic Application Deployment</a></li><li><a href="#Host_Name_Aliases">Host Name Aliases</a></li><li><a href="#Lifecycle_Listeners">Lifecycle Listeners</a></li><li><a href="#Request_Filters">Request Filters</a></li><li><a href="#Single_Sign_On">Single Sign On</a></li><li><a href="#User_Web_Applications">User Web Applications</a></li><li><a href="#Custom_context.xml_and_web.xml">Custom context.xml and web.xml</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The <strong>Host</strong> element represents a <em>virtual host</em>,
+ which is an association of a network name for a server (such as
+ "www.mycompany.com") with the particular server on which Tomcat is running.
+ For clients to be able to connect to a Tomcat server using its network name,
+ this name must be registered in the <em>Domain Name Service</em> (DNS) server
+ that manages the Internet domain you belong to - contact your Network
+ Administrator for more information.</p>
+
+ <p>In many cases, System Administrators wish to associate more than
+ one network name (such as <code>www.mycompany.com</code> and
+ <code>company.com</code>) with the same virtual host and applications.
+ This can be accomplished using the <a href="#Host_Name_Aliases">Host
+ Name Aliases</a> feature discussed below.</p>
+
+ <p>One or more <strong>Host</strong> elements are nested inside an
+ <a href="engine.html">Engine</a> element. Inside the Host element, you
+ can nest <a href="context.html">Context</a> elements for the web
+ applications associated with this virtual host. Exactly one of the Hosts
+ associated with each Engine MUST have a name matching the
+ <code>defaultHost</code> attribute of that Engine.</p>
+
+ <p>Clients normally use host names to identify the server they wish to connect
+ to. This host name is also included in the HTTP request headers. Tomcat
+ extracts the host name from the HTTP headers and looks for a
+ <strong>Host</strong> with a matching name. If no match is found, the request
+ is routed to the default host. The name of the default host does not have to
+ match a DNS name (although it can) since any request where the DNS name does
+ not match the name of a <strong>Host</strong> element will be routed to the
+ default host.</p>
+
+ <p><em>The description below uses the variable name $CATALINA_BASE to refer the
+ base directory against which most relative paths are resolved. If you have
+ not configured Tomcat for multiple instances by setting a CATALINA_BASE
+ directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME,
+ the directory into which you have installed Tomcat.</em></p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>Host</strong>
+ support the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">appBase</code></strong></td><td>
+ <p>The <em>Application Base</em> directory for this virtual host.
+ This is the pathname of a directory that may contain web applications
+ to be deployed on this virtual host. You may specify an
+ absolute pathname, or a pathname that is relative to the
+ <code>$CATALINA_BASE</code> directory. See
+ <a href="#Automatic_Application_Deployment">Automatic Application
+ Deployment</a> for more information on automatic recognition and
+ deployment of web applications. If not specified, the default of
+ <code>webapps</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">xmlBase</code></td><td>
+ <p>The <em>XML Base</em> directory for this virtual host.
+ This is the pathname of a directory that may contain context XML
+ descriptors to be deployed on this virtual host. You may specify an
+ absolute pathname for this directory, or a pathname that is relative
+ to the <code>$CATALINA_BASE</code> directory. See
+ <a href="#Automatic_Application_Deployment">Automatic Application
+ Deployment</a> for more information on automatic recognition and
+ deployment of web applications. If not specified the default of
+ <code>conf/<engine_name>/<host_name></code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">createDirs</code></td><td>
+ <p>If set to <code>true</code>, Tomcat will attempt to create the
+ directories defined by the attributes <code>appBase</code> and
+ <code>xmlBase</code> during the startup phase. The default value is
+ <code>true</code>. If set to <code>true</code>, and directory creation
+ fails, an error message will be printed out but will not halt the
+ startup sequence.</p>
+ </td></tr><tr><td><code class="attributeName">autoDeploy</code></td><td>
+ <p>This flag value indicates if Tomcat should check periodically for new
+ or updated web applications while Tomcat is running. If
+ <code>true</code>, Tomcat periodically checks the <code>appBase</code>
+ and <code>xmlBase</code> directories and deploys any new web
+ applications or context XML descriptors found. Updated web applications
+ or context XML descriptors will trigger a reload of the web application.
+ The default is <code>true</code>. See
+ <a href="#Automatic_Application_Deployment">Automatic Application
+ Deployment</a> for more information.</p>
+ </td></tr><tr><td><code class="attributeName">backgroundProcessorDelay</code></td><td>
+ <p>This value represents the delay in seconds between the
+ invocation of the backgroundProcess method on this host and
+ its child containers, including all contexts.
+ Child containers will not be invoked if their delay value is not
+ negative (which would mean they are using their own processing
+ thread). Setting this to a positive value will cause
+ a thread to be spawn. After waiting the specified amount of time,
+ the thread will invoke the backgroundProcess method on this host
+ and all its child containers. A host will use background processing to
+ perform live web application deployment related tasks. If not
+ specified, the default value for this attribute is -1, which means
+ the host will rely on the background processing setting of its parent
+ engine.</p>
+ </td></tr><tr><td><code class="attributeName">className</code></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.catalina.Host</code> interface.
+ If not specified, the standard value (defined below) will be used.</p>
+ </td></tr><tr><td><code class="attributeName">deployIgnore</code></td><td>
+ <p>A regular expression defining paths to ignore when
+ <code>autoDeploy</code> and <code>deployOnStartup</code> are set. This
+ allows you to keep your configuration in a version control system, for
+ example, and not deploy a .svn or CVS folder that happens to be in the
+ <code>appBase</code>.</p>
+ <p>This regular expression is relative to <code>appBase</code>. It is
+ also <em>anchored</em>, meaning the match is performed against the
+ entire file/directory name. So, <code>foo</code> matches only a file or
+ directory named <code>foo</code> but not <code>foo.war</code>,
+ <code>foobar</code>, or <code>myfooapp</code>. To match anything with
+ "foo", you could use <code>.*foo.*</code>.</p>
+ <p>See <a href="#Automatic_Application_Deployment">Automatic Application
+ Deployment</a> for more information.</p>
+ </td></tr><tr><td><code class="attributeName">deployOnStartup</code></td><td>
+ <p>This flag value indicates if web applications from this host should
+ be automatically deployed when Tomcat starts. The default is
+ <code>true</code>. See
+ <a href="#Automatic_Application_Deployment">Automatic Application
+ Deployment</a> for more information.</p>
+ </td></tr><tr><td><code class="attributeName">failCtxIfServletStartFails</code></td><td>
+ <p>Set to <code>true</code> to have each child contexts fail its startup
+ if any of its servlet that has load-on-startup >=0 fails its own
+ startup.</p>
+ <p>Each child context may override this attribute.</p>
+ <p>If not specified, the default value of <code>false</code> is
+ used.</p>
+ </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td>
+ <p>Usually the network name of this virtual host, as registered in your
+ <em>Domain Name Service</em> server. Regardless of the case used to
+ specify the host name, Tomcat will convert it to lower case internally.
+ One of the Hosts nested within an <a href="engine.html">Engine</a> MUST
+ have a name that matches the <code>defaultHost</code> setting for that
+ Engine. See <a href="#Host_Name_Aliases">Host Name Aliases</a> for
+ information on how to assign more than one network name to the same
+ virtual host. The name can not contain a wildcard, this is only
+ valid in an Alias.</p>
+ </td></tr><tr><td><code class="attributeName">startStopThreads</code></td><td>
+ <p>The number of threads this <strong>Host</strong> will use to start
+ child <a href="context.html">Context</a> elements in parallel. The same
+ thread pool will be used to deploy new
+ <a href="context.html">Context</a>s if automatic deployment is being
+ used. The special value of 0 will result in the value of
+ <code>Runtime.getRuntime().availableProcessors()</code> being used.
+ Negative values will result in
+ <code>Runtime.getRuntime().availableProcessors() + value</code> being
+ used unless this is less than 1 in which case 1 thread will be used. If
+ not specified, the default value of 1 will be used.</p>
+ </td></tr><tr><td><code class="attributeName">undeployOldVersions</code></td><td>
+ <p>This flag determines if Tomcat, as part of the auto deployment
+ process, will check for old, unused versions of web applications
+ deployed using parallel deployment and, if any are found, remove them.
+ This flag only applies if <code>autoDeploy</code> is <code>true</code>.
+ If not specified the default value of <code>false</code> will be used.
+ </p>
+ </td></tr></table>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text">
+
+ <p>The standard implementation of <strong>Host</strong> is
+ <strong>org.apache.catalina.core.StandardHost</strong>.
+ It supports the following additional attributes (in addition to the
+ common attributes listed above):</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">copyXML</code></td><td>
+ <p>Set to <code>true</code> if you want a context XML descriptor
+ embedded inside the application (located at
+ <code>/META-INF/context.xml</code>) to be copied to <code>xmlBase</code>
+ when the application is deployed. On subsequent starts, the copied
+ context XML descriptor will be used in preference to any context XML
+ descriptor embedded inside the application even if the descriptor
+ embedded inside the application is more recent. The default is
+ <code>false</code>. Note if <strong>deployXML</strong> is
+ <code>false</code>, this attribute will have no effect.</p>
+ </td></tr><tr><td><code class="attributeName">deployXML</code></td><td>
+ <p>Set to <code>false</code> if you want to disable parsing the context
+ XML descriptor embedded inside the application (located at
+ <code>/META-INF/context.xml</code>). Security conscious environments
+ should set this to <code>false</code> to prevent applications from
+ interacting with the container's configuration. The administrator will
+ then be responsible for providing an external context configuration
+ file, and putting it in the location defined by the
+ <strong>xmlBase</strong> attribute. If this flag is <code>false</code>,
+ a descriptor is located at <code>/META-INF/context.xml</code> and no
+ descriptor is present in <strong>xmlBase</strong> then the context will
+ fail to start in case the descriptor contains necessary configuration
+ for secure deployment (such as a RemoteAddrValve) which should not be
+ ignored. The default is <code>true</code> unless a security manager is
+ enabled when the default is <code>false</code>. When running under a
+ security manager this may be enabled on a per web application basis by
+ granting the
+ <code>org.apache.catalina.security.DeployXmlPermission</code> to the web
+ application. The Manager and Host Manager applications are granted this
+ permission by default so that they continue to work when running under a
+ security manager.</p>
+ </td></tr><tr><td><code class="attributeName">errorReportValveClass</code></td><td>
+ <p>Java class name of the error reporting valve which will be used
+ by this Host. The responsibility of this valve is to output error
+ reports. Setting this property allows to customize the look of the
+ error pages which will be generated by Tomcat. This class must
+ implement the
+ <code>org.apache.catalina.Valve</code> interface. If none is specified,
+ the value <code>org.apache.catalina.valves.ErrorReportValve</code>
+ will be used by default.</p>
+ </td></tr><tr><td><code class="attributeName">unpackWARs</code></td><td>
+ <p>Set to <code>true</code> if you want web applications that are
+ placed in the <code>appBase</code> directory as web application
+ archive (WAR) files to be unpacked into a corresponding disk directory
+ structure, <code>false</code> to run such web applications directly
+ from a WAR file. The default is <code>true</code>. See
+ <a href="#Automatic_Application_Deployment">Automatic Application
+ Deployment</a> for more information.</p>
+ <p>Note: If Tomcat expands the WAR file then it will add a file
+ (<code>/META-INF/war-tracking</code>) to the unpacked directory
+ structure which it uses to detect changes in the WAR file while Tomcat
+ is not running. Any such change will trigger the deletion of the
+ expanded directory and the deployment of the updated WAR file when
+ Tomcat next starts.</p>
+ <p>Note: Running with this option set to <code>false</code> will incur
+ a performance penalty. To avoid a significant performance penalty, the
+ web application should be configured such that class scanning for
+ Servlet 3.0+ pluggability features is not required. Users may also wish
+ to consider the <strong>ExtractingRoot</strong>
+ <a href="resources.html">Resources</a> implementation.</p>
+ </td></tr><tr><td><code class="attributeName">workDir</code></td><td>
+ <p>Pathname to a scratch directory to be used by applications for
+ this Host. Each application will have its own sub directory with
+ temporary read-write use. Configuring a Context workDir will override
+ use of the Host workDir configuration. This directory will be made
+ visible to servlets in the web application by a servlet context
+ attribute (of type <code>java.io.File</code>) named
+ <code>javax.servlet.context.tempdir</code> as described in the
+ Servlet Specification. If not specified, a suitable directory
+ underneath <code>$CATALINA_BASE/work</code> will be provided.</p>
+ </td></tr></table>
+
+ </div></div>
+
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+ <p>You can nest one or more <a href="context.html">Context</a> elements
+ inside this <strong>Host</strong> element, each representing a different web
+ application associated with this virtual host.</p>
+
+ <p>You can nest at most one instance of the following utility components
+ by nesting a corresponding element inside your <strong>Host</strong>
+ element:</p>
+ <ul>
+ <li><a href="realm.html"><strong>Realm</strong></a> -
+ Configure a realm that will allow its
+ database of users, and their associated roles, to be shared across all
+ <a href="context.html">Contexts</a> nested inside this Host (unless
+ overridden by a <a href="realm.html">Realm</a> configuration
+ at a lower level).</li>
+ </ul>
+
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+
+
+ <div class="subsection"><h4 id="Logging">Logging</h4><div class="text">
+
+ <p>A host is associated with the
+ <code>org.apache.catalina.core.ContainerBase.[engine_name].[host_name]</code>
+ log category. Note that the brackets are part of the name,
+ don't omit them.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Access_Logs">Access Logs</h4><div class="text">
+
+ <p>When you run a web server, one of the output files normally generated
+ is an <em>access log</em>, which generates one line of information for
+ each request processed by the server, in a standard format. Catalina
+ includes an optional <a href="valve.html">Valve</a> implementation that
+ can create access logs in the same standard format created by web servers,
+ or in any number of custom formats.</p>
+
+ <p>You can ask Catalina to create an access log for all requests
+ processed by an <a href="engine.html">Engine</a>,
+ <a href="host.html">Host</a>, or <a href="context.html">Context</a>
+ by nesting a <a href="valve.html">Valve</a> element like this:</p>
+
+<div class="codeBox"><pre><code><Host name="localhost" ...>
+ ...
+ <Valve className="org.apache.catalina.valves.AccessLogValve"
+ prefix="localhost_access_log" suffix=".txt"
+ pattern="common"/>
+ ...
+</Host></code></pre></div>
+
+ <p>See <a href="valve.html#Access_Logging">Access Logging Valves</a>
+ for more information on the configuration attributes that are
+ supported.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Automatic_Application_Deployment">Automatic Application Deployment</h4><div class="text">
+
+ <p>If you are using the standard <strong>Host</strong> implementation with
+ default settings then applications in the <em>appBase</em> or with context
+ files in the <em>configBase</em> are automatically deployed when Tomcat
+ starts (the <code>deployOnStartup</code> property defaults to
+ <code>true</code>) and reloaded or redeployed (as appropriate) when a change
+ is detected while Tomcat is running (the <code>autoDeploy</code> attribute
+ also defaults to <code>true</code>).</p>
+
+ <p><code>deployOnStartup</code> and <code>autoDeploy</code> trigger
+ execution of exactly the same code so the behaviour is very similar.
+ However, there is one key difference. When Tomcat starts it has no knowledge
+ of which files are the same, which have been changed and which are new. It
+ therefore treats all files as new. While Tomcat is running, it can
+ differentiate between unchanged, modified and new files. This leads to some
+ differences in behaviour between files being modified while Tomcat is
+ running and files being modified while Tomcat is stopped.</p>
+
+ <p>When you use automatic deployment, related files (a web application may
+ have a context.xml file, a WAR and a directory) that exist in the
+ <strong>Host</strong>'s <em>appBase</em> and/or <em>configBase</em>
+ must conform to the expected <a href="context.html#Naming">naming
+ convention</a>. In short, this means files for the same web application must
+ share the same <em>base name</em>.</p>
+
+ <p>The automatic deployment process identifies new and/or modified web
+ applications using the following search order:</p>
+
+ <ol>
+ <li>Web applications with a context.xml file located in the Host's
+ <em>configBase</em>.</li>
+ <li>Web applications with a WAR file located in the Host's
+ <em>appBase</em> that have not already been identified during the scan for
+ context.xml files.</li>
+ <li>Web applications with a directory located in the Host's
+ <em>appBase</em> that have not already been identified during the scans
+ for context.xml and/or WAR files.</li>
+ </ol>
+
+ <p>When <code>autoDeploy</code> is <code>true</code>, the automatic
+ deployment process will monitor the deployed web applications for changes.
+ Depending on exactly what changes, the web application will either be
+ re-deployed or reloaded. Re-deployment involves the creation of a new web
+ application and, if using the standard session manager, user sessions will
+ not be retained. Reloading uses the existing web application but re-parses
+ the web.xml and reloads any classes. If using the standard session manager,
+ user sessions will be persisted.</p>
+
+ <p>Users may add to the files that the automatic deployment process monitors
+ for reloading (i.e. any change to one of these files triggers a reload of
+ the web application) by adding a <em>WatchedResources</em> element to the
+ context.xml file. See the
+ <a href="context.html#Nested_Components">Context</a> documentation for
+ further details.</p>
+
+ <p>When using automatic deployment, the <code>docBase</code> defined by
+ an XML <a href="context.html">Context</a> file should be outside of the
+ <code>appBase</code> directory. If this is not the case, difficulties
+ may be experienced deploying the web application or the application may
+ be deployed twice. The <code>deployIgnore</code> attribute can be used
+ to avoid this situation.</p>
+
+ <p>Note that if you are defining contexts explicitly in server.xml, you
+ should probably turn off automatic application deployment or specify
+ <code>deployIgnore</code> carefully. Otherwise, the web applications
+ will each be deployed twice, and that may cause problems for the
+ applications.</p>
+
+ <p>There are many possible combinations of settings, new files, changed
+ files and deleted files. A separate page describes the
+ <a href="automatic-deployment.html">expected behaviour of the automatic
+ deployment process</a> in many of these scenarios.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Host_Name_Aliases">Host Name Aliases</h4><div class="text">
+
+ <p>In many server environments, Network Administrators have configured
+ more than one network name (in the <em>Domain Name Service</em> (DNS)
+ server), that resolve to the IP address of the same server. Normally,
+ each such network name would be configured as a separate
+ <strong>Host</strong> element in <code>conf/server.xml</code>, each
+ with its own set of web applications.</p>
+
+ <p>However, in some circumstances, it is desirable that two or more
+ network names should resolve to the <strong>same</strong> virtual host,
+ running the same set of applications. A common use case for this
+ scenario is a corporate web site, where it is desirable that users
+ be able to utilize either <code>www.mycompany.com</code> or
+ <code>company.com</code> to access exactly the same content and
+ applications.</p>
+
+ <p>This is accomplished by utilizing one or more <strong>Alias</strong>
+ elements nested inside your <strong>Host</strong> element. For
+ example:</p>
+<div class="codeBox"><pre><code><Host name="www.mycompany.com" ...>
+ ...
+ <Alias>mycompany.com</Alias>
+ ...
+</Host></code></pre></div>
+
+ <p>In order for this strategy to be effective, all of the network names
+ involved must be registered in your DNS server to resolve to the
+ same computer that is running this instance of Catalina.</p>
+
+ <p>Aliases may also use the wildcard form (<code>*.domainname</code>),
+ unlike for the <strong>name</strong> attribute of a <strong>Host</strong>.
+ </p>
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Lifecycle_Listeners">Lifecycle Listeners</h4><div class="text">
+
+ <p>If you have implemented a Java object that needs to know when this
+ <strong>Host</strong> is started or stopped, you can declare it by
+ nesting a <strong>Listener</strong> element inside this element. The
+ class name you specify must implement the
+ <code>org.apache.catalina.LifecycleListener</code> interface, and
+ it will be notified about the occurrence of the corresponding
+ lifecycle events. Configuration of such a listener looks like this:</p>
+
+<div class="codeBox"><pre><code><Host name="localhost" ...>
+ ...
+ <Listener className="com.mycompany.mypackage.MyListener" ... >
+ ...
+</Host></code></pre></div>
+
+ <p>Note that a Listener can have any number of additional properties
+ that may be configured from this element. Attribute names are matched
+ to corresponding JavaBean property names using the standard property
+ method naming patterns.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Request_Filters">Request Filters</h4><div class="text">
+
+ <p>You can ask Catalina to check the IP address, or host name, on every
+ incoming request directed to the surrounding
+ <a href="engine.html">Engine</a>, <a href="host.html">Host</a>, or
+ <a href="context.html">Context</a> element. The remote address or name
+ will be checked against configured "accept" and/or "deny"
+ filters, which are defined using <code>java.util.regex</code> Regular
+ Expression syntax. Requests that come from locations that are
+ not accepted will be rejected with an HTTP "Forbidden" error.
+ Example filter declarations:</p>
+
+<div class="codeBox"><pre><code><Host name="localhost" ...>
+ ...
+ <Valve className="org.apache.catalina.valves.RemoteHostValve"
+ allow=".*\.mycompany\.com|www\.yourcompany\.com"/>
+ <Valve className="org.apache.catalina.valves.RemoteAddrValve"
+ deny="192\.168\.1\.\d+"/>
+ ...
+</Host></code></pre></div>
+
+ <p>See <a href="valve.html#Remote_Address_Filter">Remote Address Filter</a>
+ and <a href="valve.html#Remote_Host_Filter">Remote Host Filter</a> for
+ more information about the configuration options that are supported.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Single_Sign_On">Single Sign On</h4><div class="text">
+
+ <p>In many environments, but particularly in portal environments, it
+ is desirable to have a user challenged to authenticate themselves only
+ once over a set of web applications deployed on a particular virtual
+ host. This can be accomplished by nesting an element like this inside
+ the Host element for this virtual host:</p>
+
+<div class="codeBox"><pre><code><Host name="localhost" ...>
+ ...
+ <Valve className="org.apache.catalina.authenticator.SingleSignOn"/>
+ ...
+</Host></code></pre></div>
+
+ <p>The Single Sign On facility operates according to the following rules:
+ </p>
+ <ul>
+ <li>All web applications configured for this virtual host must share the
+ same <a href="realm.html">Realm</a>. In practice, that means you can
+ nest the Realm element inside this Host element (or the surrounding
+ <a href="engine.html">Engine</a> element), but not inside a
+ <a href="context.html">Context</a> element for one of the involved
+ web applications.</li>
+ <li>As long as the user accesses only unprotected resources in any of the
+ web applications on this virtual host, they will not be challenged
+ to authenticate themselves.</li>
+ <li>As soon as the user accesses a protected resource in
+ <strong>any</strong> web application associated with this virtual
+ host, the user will be challenged to authenticate himself or herself,
+ using the login method defined for the web application currently
+ being accessed.</li>
+ <li>Once authenticated, the roles associated with this user will be
+ utilized for access control decisions across <strong>all</strong>
+ of the associated web applications, without challenging the user
+ to authenticate themselves to each application individually.</li>
+ <li>As soon as the user logs out of one web application (for example,
+ by invalidating the corresponding session if form
+ based login is used), the user's sessions in <strong>all</strong>
+ web applications will be invalidated. Any subsequent attempt to
+ access a protected resource in any application will require the
+ user to authenticate himself or herself again.</li>
+ <li>The Single Sign On feature utilizes HTTP cookies to transmit a token
+ that associates each request with the saved user identity, so it can
+ only be utilized in client environments that support cookies.</li>
+ </ul>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="User_Web_Applications">User Web Applications</h4><div class="text">
+
+ <p>Many web servers can automatically map a request URI starting with
+ a tilde character ("~") and a username to a directory (commonly named
+ <code>public_html</code>) in that user's home directory on the server.
+ You can accomplish the same thing in Catalina by using a special
+ <strong>Listener</strong> element like this (on a Unix system that
+ uses the <code>/etc/passwd</code> file to identify valid users):</p>
+
+<div class="codeBox"><pre><code><Host name="localhost" ...>
+ ...
+ <Listener className="org.apache.catalina.startup.UserConfig"
+ directoryName="public_html"
+ userClass="org.apache.catalina.startup.PasswdUserDatabase"/>
+ ...
+</Host></code></pre></div>
+
+ <p>On a server where <code>/etc/passwd</code> is not in use, you can
+ request Catalina to consider all directories found in a specified base
+ directory (such as <code>c:\Homes</code> in this example) to be
+ considered "user home" directories for the purposes of this directive:</p>
+
+<div class="codeBox"><pre><code><Host name="localhost" ...>
+ ...
+ <Listener className="org.apache.catalina.startup.UserConfig"
+ directoryName="public_html"
+ homeBase="c:\Homes"
+ userClass="org.apache.catalina.startup.HomesUserDatabase"/>
+ ...
+</Host></code></pre></div>
+
+ <p>If a user home directory has been set up for a user named
+ <code>craigmcc</code>, then its contents will be visible from a
+ client browser by making a request to a URL like:</p>
+
+<div class="codeBox"><pre><code>http://www.mycompany.com:8080/~craigmcc</code></pre></div>
+
+ <p>Successful use of this feature requires recognition of the following
+ considerations:</p>
+ <ul>
+ <li>Each user web application will be deployed with characteristics
+ established by the global and host level default context settings.</li>
+ <li>It is legal to include more than one instance of this Listener
+ element. This would only be useful, however, in circumstances
+ where you wanted to configure more than one "homeBase" directory.</li>
+ <li>The operating system username under which Catalina is executed
+ MUST have read access to each user's web application directory,
+ and all of its contents.</li>
+ </ul>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Custom_context.xml_and_web.xml">Custom context.xml and web.xml</h4><div class="text">
+ <p>You can override the default values found in <code>conf/context.xml</code> and
+ <code>conf/web.xml</code> files from <code>$CATALINA_BASE</code> for each virtual host.
+ Tomcat will look for files named <code>context.xml.default</code> and <code>web.xml.default</code>
+ in the directory specified by <code>xmlBase</code> and merge the files into
+ those found in the default ones.</p>
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/http.html b/web/tomcat/webapps/docs/config/http.html
new file mode 100644
index 0000000..a08e566
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/http.html
@@ -0,0 +1,1743 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The HTTP Connector</title><meta name="author" content="Craig R. McClanahan"><meta name="author" content="Yoav Shapira"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The HTTP Connector</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li><li><a href="#Java_TCP_socket_attributes">Java TCP socket attributes</a></li><li><a href="#NIO_specific_configuration">NIO specific configuration</a></li><li><a href="#NIO2_specific_configuration">NIO2 specific configuration</a></li><li><a href="#APR/native_specific_configuration">APR/native specific configuration</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a><ol><li><a href="#HTTP/1.1_and_HTTP/1.0_Support">HTTP/1.1 and HTTP/1.0 Support</a></li><li><a href="#HTTP/2_Support">HTTP/2 Support</a></li><li><a href="#Proxy_Support">Proxy Support</a></li><li><a href="#SSL_Support">SSL Support</a></li><li><a href="#SSL_Support_-_SSLHostConfig">SSL Support - SSLHostConfig</a></li><li><a href="#SSL_Support_-_Certificate">SSL Support - Certificate</a></li><li><a href="#SSL_Support_-_Connector_-_NIO_and_NIO2">SSL Support - Connector - NIO and NIO2</a></li><li><a href="#Key_store_types">Key store types</a></li><li><a href="#SSL_Support_-_Connector_-_NIO_and_NIO2_(deprecated)">SSL Support - Connector - NIO and NIO2 (deprecated)</a></li><li><a href="#SSL_Support_-_Connector_-_APR/Native_(deprecated)">SSL Support - Connector - APR/Native (deprecated)</a></li><li><a href="#Connector_Comparison">Connector Comparison</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The <strong>HTTP Connector</strong> element represents a
+ <strong>Connector</strong> component that supports the HTTP/1.1 protocol.
+ It enables Catalina to function as a stand-alone web server, in addition
+ to its ability to execute servlets and JSP pages. A particular instance
+ of this component listens for connections on a specific TCP port number
+ on the server. One or more such <strong>Connectors</strong> can be
+ configured as part of a single <a href="service.html">Service</a>, each
+ forwarding to the associated <a href="engine.html">Engine</a> to perform
+ request processing and create the response.</p>
+
+ <p>If you wish to configure the <strong>Connector</strong> that is used
+ for connections to web servers using the AJP protocol (such as the
+ <code>mod_jk 1.2.x</code> connector for Apache 1.3), please refer to the
+ <a href="ajp.html">AJP Connector</a> documentation.</p>
+
+ <p>Each incoming, non-asynchronous request requires a thread for the duration
+ of that request. If more simultaneous requests are received than can be
+ handled by the currently available request processing threads, additional
+ threads will be created up to the configured maximum (the value of the
+ <code>maxThreads</code> attribute). If still more simultaneous requests are
+ received, Tomcat will accept new connections until the current number of
+ connections reaches <code>maxConnections</code>. Connections are queued inside
+ the server socket created by the <strong>Connector</strong> until a thread
+ becomes avaialble to process the connection. Once <code>maxConnections</code>
+ has been reached the operating system will queue further connections. The size
+ of the operating system provided connection queue may be controlled by the
+ <code>acceptCount</code> attribute. If the operating system queue fills,
+ further connection requests may be refused or may time out.</p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>Connector</strong>
+ support the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allowTrace</code></td><td>
+ <p>A boolean value which can be used to enable or disable the TRACE
+ HTTP method. If not specified, this attribute is set to false.</p>
+ </td></tr><tr><td><code class="attributeName">asyncTimeout</code></td><td>
+ <p>The default timeout for asynchronous requests in milliseconds. If not
+ specified, this attribute is set to the Servlet specification default of
+ 30000 (30 seconds).</p>
+ </td></tr><tr><td><code class="attributeName">continueResponseTiming</code></td><td>
+ <p>When to respond with a <code>100</code> intermediate response code to a
+ request containing an <code>Expect: 100-continue</code> header.
+ The following values may used:
+ <ul>
+ <li><code>immediately</code> - an intermediate 100 status response
+ will be returned as soon as practical</li>
+ <li><code>onRead</code> - an intermediate 100 status
+ response will be returned only when the Servlet reads the request body,
+ allowing the servlet to inspect the headers and possibly respond
+ before the user agent sends a possibly large request body.</li>
+ </ul>
+ </p>
+ </td></tr><tr><td><code class="attributeName">defaultSSLHostConfigName</code></td><td>
+ <p>The name of the default <strong>SSLHostConfig</strong> that will be
+ used for secure connections (if this connector is configured for secure
+ connections) if the client connection does not provide SNI or if the SNI
+ is provided but does not match any configured
+ <strong>SSLHostConfig</strong>. If not specified the default value of
+ <code>_default_</code> will be used. Provided values are always converted
+ to lower case.</p>
+ </td></tr><tr><td><code class="attributeName">discardFacades</code></td><td>
+ <p>A boolean value which can be used to enable or disable the recycling
+ of the facade objects that isolate the container internal request
+ processing objects. If set to <code>true</code> the facades will be
+ set for garbage collection after every request, otherwise they will be
+ reused. This setting has no effect when the security manager is enabled.
+ If not specified, this attribute is set to the value of the
+ <code>org.apache.catalina.connector.RECYCLE_FACADES</code> system
+ property, or <code>false</code> if not set.</p>
+ </td></tr><tr><td><code class="attributeName">enableLookups</code></td><td>
+ <p>Set to <code>true</code> if you want calls to
+ <code>request.getRemoteHost()</code> to perform DNS lookups in
+ order to return the actual host name of the remote client. Set
+ to <code>false</code> to skip the DNS lookup and return the IP
+ address in String form instead (thereby improving performance).
+ By default, DNS lookups are disabled.</p>
+ </td></tr><tr><td><code class="attributeName">encodedSolidusHandling</code></td><td>
+ <p>When set to <code>reject</code> request paths containing a
+ <code>%2f</code> sequence will be rejected with a 400 response. When set
+ to <code>decode</code> request paths containing a <code>%2f</code>
+ sequence will have that sequence decoded to <code>/</code> at the same
+ time other <code>%nn</code> sequences are decoded. When set to
+ <code>passthrough</code> request paths containing a <code>%2f</code>
+ sequence will be processed with the <code>%2f</code> sequence unchanged.
+ If not specified the default value is <code>reject</code>. This default
+ may be modified if the deprecated <a href="systemprops.html">system
+ property</a>
+ <code>org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH</code> is
+ set.</p>
+ </td></tr><tr><td><code class="attributeName">maxHeaderCount</code></td><td>
+ <p>The maximum number of headers in a request that are allowed by the
+ container. A request that contains more headers than the specified limit
+ will be rejected. A value of less than 0 means no limit.
+ If not specified, a default of 100 is used.</p>
+ </td></tr><tr><td><code class="attributeName">maxParameterCount</code></td><td>
+ <p>The maximum number of parameter and value pairs (GET plus POST) which
+ will be automatically parsed by the container. Parameter and value pairs
+ beyond this limit will be ignored. A value of less than 0 means no limit.
+ If not specified, a default of 10000 is used. Note that
+ <code>FailedRequestFilter</code> <a href="filter.html">filter</a> can be
+ used to reject requests that hit the limit.</p>
+ </td></tr><tr><td><code class="attributeName">maxPostSize</code></td><td>
+ <p>The maximum size in bytes of the POST which will be handled by
+ the container FORM URL parameter parsing. The limit can be disabled by
+ setting this attribute to a value less than zero. If not specified, this
+ attribute is set to 2097152 (2 megabytes). Note that the
+ <a href="filter.html#Failed_Request_Filter"><code>FailedRequestFilter</code></a>
+ can be used to reject requests that exceed this limit.</p>
+ </td></tr><tr><td><code class="attributeName">maxSavePostSize</code></td><td>
+ <p>The maximum size in bytes of the POST which will be saved/buffered by
+ the container during FORM or CLIENT-CERT authentication. For both types
+ of authentication, the POST will be saved/buffered before the user is
+ authenticated. For CLIENT-CERT authentication, the POST is buffered for
+ the duration of the SSL handshake and the buffer emptied when the request
+ is processed. For FORM authentication the POST is saved whilst the user
+ is re-directed to the login form and is retained until the user
+ successfully authenticates or the session associated with the
+ authentication request expires. The limit can be disabled by setting this
+ attribute to -1. Setting the attribute to zero will disable the saving of
+ POST data during authentication. If not specified, this attribute is set
+ to 4096 (4 kilobytes).</p>
+ </td></tr><tr><td><code class="attributeName">parseBodyMethods</code></td><td>
+ <p>A comma-separated list of HTTP methods for which request
+ bodies using <code>application/x-www-form-urlencoded</code> will be parsed
+ for request parameters identically to POST. This is useful in RESTful
+ applications that want to support POST-style semantics for PUT requests.
+ Note that any setting other than <code>POST</code> causes Tomcat
+ to behave in a way that goes against the intent of the servlet
+ specification.
+ The HTTP method TRACE is specifically forbidden here in accordance
+ with the HTTP specification.
+ The default is <code>POST</code></p>
+ </td></tr><tr><td><strong><code class="attributeName">port</code></strong></td><td>
+ <p>The TCP port number on which this <strong>Connector</strong>
+ will create a server socket and await incoming connections. Your
+ operating system will allow only one server application to listen
+ to a particular port number on a particular IP address. If the special
+ value of 0 (zero) is used, then Tomcat will select a free port at random
+ to use for this connector. This is typically only useful in embedded and
+ testing applications.</p>
+ </td></tr><tr><td><code class="attributeName">protocol</code></td><td>
+ <p>Sets the protocol to handle incoming traffic. The default value is
+ <code>HTTP/1.1</code> which uses an auto-switching mechanism to select
+ either a Java NIO based connector or an APR/native based connector.
+ If the <code>PATH</code> (Windows) or <code>LD_LIBRARY_PATH</code> (on
+ most unix systems) environment variables contain the Tomcat native
+ library, and the <code>AprLifecycleListener</code> that is used to
+ initialize APR has its <code>useAprConnector</code> attribute set to
+ <code>true</code>, the APR/native connector will be used. If the native library
+ cannot be found or the attribute is not configured, the Java NIO based
+ connector will be used. Note that the APR/native connector has different
+ settings for HTTPS than the Java connectors.<br>
+ To use an explicit protocol rather than rely on the auto-switching
+ mechanism described above, the following values may be used:<br>
+ <code>org.apache.coyote.http11.Http11NioProtocol</code> -
+ non blocking Java NIO connector<br>
+ <code>org.apache.coyote.http11.Http11Nio2Protocol</code> -
+ non blocking Java NIO2 connector<br>
+ <code>org.apache.coyote.http11.Http11AprProtocol</code> -
+ the APR/native connector.<br>
+ Custom implementations may also be used.<br>
+ Take a look at our <a href="#Connector_Comparison">Connector
+ Comparison</a> chart. The configuration for both Java connectors is
+ identical, for http and https.<br>
+ For more information on the APR connector and APR specific SSL settings
+ please visit the <a href="../apr.html">APR documentation</a>
+ </p>
+ </td></tr><tr><td><code class="attributeName">proxyName</code></td><td>
+ <p>If this <strong>Connector</strong> is being used in a proxy
+ configuration, configure this attribute to specify the server name
+ to be returned for calls to <code>request.getServerName()</code>.
+ See <a href="#Proxy_Support">Proxy Support</a> for more
+ information.</p>
+ </td></tr><tr><td><code class="attributeName">proxyPort</code></td><td>
+ <p>If this <strong>Connector</strong> is being used in a proxy
+ configuration, configure this attribute to specify the server port
+ to be returned for calls to <code>request.getServerPort()</code>.
+ See <a href="#Proxy_Support">Proxy Support</a> for more
+ information.</p>
+ </td></tr><tr><td><code class="attributeName">redirectPort</code></td><td>
+ <p>If this <strong>Connector</strong> is supporting non-SSL
+ requests, and a request is received for which a matching
+ <code><security-constraint></code> requires SSL transport,
+ Catalina will automatically redirect the request to the port
+ number specified here.</p>
+ </td></tr><tr><td><code class="attributeName">scheme</code></td><td>
+ <p>Set this attribute to the name of the protocol you wish to have
+ returned by calls to <code>request.getScheme()</code>. For
+ example, you would set this attribute to "<code>https</code>"
+ for an SSL Connector. The default value is "<code>http</code>".
+ </p>
+ </td></tr><tr><td><code class="attributeName">secure</code></td><td>
+ <p>Set this attribute to <code>true</code> if you wish to have
+ calls to <code>request.isSecure()</code> to return <code>true</code>
+ for requests received by this Connector. You would want this on an
+ SSL Connector or a non SSL connector that is receiving data from a
+ SSL accelerator, like a crypto card, an SSL appliance or even a webserver.
+ The default value is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">sendReasonPhrase</code></td><td>
+ <p>Set this attribute to <code>true</code> if you wish to have
+ a reason phrase in the response.
+ The default value is <code>false</code>.</p>
+ <p><strong>Note:</strong> This option is deprecated and will be removed
+ in Tomcat 9. The reason phrase will not be sent.</p>
+ </td></tr><tr><td><code class="attributeName">URIEncoding</code></td><td>
+ <p>This specifies the character encoding used to decode the URI bytes,
+ after %xx decoding the URL. If not specified, UTF-8 will be used unless
+ the <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code>
+ <a href="systemprops.html">system property</a> is set to <code>true</code>
+ in which case ISO-8859-1 will be used.</p>
+ </td></tr><tr><td><code class="attributeName">useBodyEncodingForURI</code></td><td>
+ <p>This specifies if the encoding specified in contentType should be used
+ for URI query parameters, instead of using the URIEncoding. This
+ setting is present for compatibility with Tomcat 4.1.x, where the
+ encoding specified in the contentType, or explicitly set using
+ Request.setCharacterEncoding method was also used for the parameters from
+ the URL. The default value is <code>false</code>.
+ </p>
+ <p><strong>Notes:</strong> 1) This setting is applied only to the
+ query string of a request. Unlike <code>URIEncoding</code> it does not
+ affect the path portion of a request URI. 2) If request character
+ encoding is not known (is not provided by a browser and is not set by
+ <code>SetCharacterEncodingFilter</code> or a similar filter using
+ Request.setCharacterEncoding method), the default encoding is always
+ "ISO-8859-1". The <code>URIEncoding</code> setting has no effect on
+ this default.
+ </p>
+ </td></tr><tr><td><code class="attributeName">useIPVHosts</code></td><td>
+ <p>Set this attribute to <code>true</code> to cause Tomcat to use
+ the IP address that the request was received on to determine the Host
+ to send the request to. The default value is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">xpoweredBy</code></td><td>
+ <p>Set this attribute to <code>true</code> to cause Tomcat to advertise
+ support for the Servlet specification using the header recommended in the
+ specification. The default value is <code>false</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text">
+
+ <p>The standard HTTP connectors (NIO, NIO2 and APR/native) all support the
+ following attributes in addition to the common Connector attributes listed
+ above.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">acceptCount</code></td><td>
+ <p>The maximum length of the operating system provided queue for incoming
+ connection requests when <code>maxConnections</code> has been reached. The
+ operating system may ignore this setting and use a different size for the
+ queue. When this queue is full, the operating system may actively refuse
+ additional connections or those connections may time out. The default
+ value is 100.</p>
+ </td></tr><tr><td><code class="attributeName">acceptorThreadCount</code></td><td>
+ <p>The number of threads to be used to accept connections. Increase this
+ value on a multi CPU machine, although you would never really need more
+ than <code>2</code>. Also, with a lot of non keep alive connections, you
+ might want to increase this value as well. Default value is
+ <code>1</code>.</p>
+ </td></tr><tr><td><code class="attributeName">acceptorThreadPriority</code></td><td>
+ <p>The priority of the acceptor threads. The threads used to accept
+ new connections. The default value is <code>5</code> (the value of the
+ <code>java.lang.Thread.NORM_PRIORITY</code> constant). See the JavaDoc
+ for the <code>java.lang.Thread</code> class for more details on what
+ this priority means.</p>
+ </td></tr><tr><td><code class="attributeName">address</code></td><td>
+ <p>For servers with more than one IP address, this attribute specifies
+ which address will be used for listening on the specified port. By
+ default, the connector will listen all local addresses. Unless the JVM is
+ configured otherwise using system properties, the Java based connectors
+ (NIO, NIO2) will listen on both IPv4 and IPv6 addresses when configured
+ with either <code>0.0.0.0</code> or <code>::</code>. The APR/native
+ connector will only listen on IPv4 addresses if configured with
+ <code>0.0.0.0</code> and will listen on IPv6 addresses (and optionally
+ IPv4 addresses depending on the setting of <strong>ipv6v6only</strong>) if
+ configured with <code>::</code>.</p>
+ </td></tr><tr><td><code class="attributeName">allowHostHeaderMismatch</code></td><td>
+ <p>By default Tomcat will allow requests that specify a host in the
+ request line but specify a different host in the host header. This
+ check can be enabled by setting this attribute to <code>false</code>. If
+ not specified, the default is <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">allowedTrailerHeaders</code></td><td>
+ <p>By default Tomcat will ignore all trailer headers when processing
+ chunked input. For a header to be processed, it must be added to this
+ comma-separated list of header names.</p>
+ </td></tr><tr><td><code class="attributeName">bindOnInit</code></td><td>
+ <p>Controls when the socket used by the connector is bound. By default it
+ is bound when the connector is initiated and unbound when the connector is
+ destroyed. If set to <code>false</code>, the socket will be bound when the
+ connector is started and unbound when it is stopped.</p>
+ </td></tr><tr><td><code class="attributeName">clientCertProvider</code></td><td>
+ <p>When client certificate information is presented in a form other than
+ instances of <code>java.security.cert.X509Certificate</code> it needs to
+ be converted before it can be used and this property controls which JSSE
+ provider is used to perform the conversion. For example it is used with
+ the <a href="ajp.html">AJP connectors</a>, the HTTP APR connector and
+ with the <a href="valve.html#SSL_Authenticator_Valve">
+ org.apache.catalina.valves.SSLValve</a>. If not specified, the default
+ provider will be used.</p>
+ </td></tr><tr><td><code class="attributeName">compressibleMimeType</code></td><td>
+ <p>The value is a comma separated list of MIME types for which HTTP
+ compression may be used.
+ The default value is
+ <code>
+ text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml
+ </code>.
+ If you specify a type explicitly, the default is over-ridden.</p>
+ </td></tr><tr><td><code class="attributeName">compression</code></td><td>
+ <p>The <strong>Connector</strong> may use HTTP/1.1 GZIP compression in
+ an attempt to save server bandwidth. The acceptable values for the
+ parameter is "off" (disable compression), "on" (allow compression, which
+ causes text data to be compressed), "force" (forces compression in all
+ cases), or a numerical integer value (which is equivalent to "on", but
+ specifies the minimum amount of data before the output is compressed). If
+ the content-length is not known and compression is set to "on" or more
+ aggressive, the output will also be compressed. If not specified, this
+ attribute is set to "off".</p>
+ <p><em>Note</em>: There is a tradeoff between using compression (saving
+ your bandwidth) and using the sendfile feature (saving your CPU cycles).
+ If the connector supports the sendfile feature, e.g. the NIO connector,
+ using sendfile will take precedence over compression. The symptoms will
+ be that static files greater that 48 Kb will be sent uncompressed.
+ You can turn off sendfile by setting <code>useSendfile</code> attribute
+ of the connector, as documented below, or change the sendfile usage
+ threshold in the configuration of the
+ <a href="../default-servlet.html">DefaultServlet</a> in the default
+ <code>conf/web.xml</code> or in the <code>web.xml</code> of your web
+ application.
+ </p>
+ </td></tr><tr><td><code class="attributeName">compressionMinSize</code></td><td>
+ <p>If <strong>compression</strong> is set to "on" then this attribute
+ may be used to specify the minimum amount of data before the output is
+ compressed. If not specified, this attribute is defaults to "2048".
+ Units are in bytes.</p>
+ </td></tr><tr><td><code class="attributeName">connectionLinger</code></td><td>
+ <p>The number of seconds during which the sockets used by this
+ <strong>Connector</strong> will linger when they are closed. The default
+ value is <code>-1</code> which disables socket linger.</p>
+ </td></tr><tr><td><code class="attributeName">connectionTimeout</code></td><td>
+ <p>The number of milliseconds this <strong>Connector</strong> will wait,
+ after accepting a connection, for the request URI line to be
+ presented. Use a value of -1 to indicate no (i.e. infinite) timeout.
+ The default value is 60000 (i.e. 60 seconds) but note that the standard
+ server.xml that ships with Tomcat sets this to 20000 (i.e. 20 seconds).
+ Unless <strong>disableUploadTimeout</strong> is set to <code>false</code>,
+ this timeout will also be used when reading the request body (if any).</p>
+ </td></tr><tr><td><code class="attributeName">connectionUploadTimeout</code></td><td>
+ <p>Specifies the timeout, in milliseconds, to use while a data upload is
+ in progress. This only takes effect if
+ <strong>disableUploadTimeout</strong> is set to <code>false</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">disableUploadTimeout</code></td><td>
+ <p>This flag allows the servlet container to use a different, usually
+ longer connection timeout during data upload. If not specified, this
+ attribute is set to <code>true</code> which disables this longer timeout.
+ </p>
+ </td></tr><tr><td><code class="attributeName">executor</code></td><td>
+ <p>A reference to the name in an <a href="executor.html">Executor</a>
+ element. If this attribute is set, and the named executor exists, the
+ connector will use the executor, and all the other thread attributes will
+ be ignored. Note that if a shared executor is not specified for a
+ connector then the connector will use a private, internal executor to
+ provide the thread pool.</p>
+ </td></tr><tr><td><code class="attributeName">executorTerminationTimeoutMillis</code></td><td>
+ <p>The time that the private internal executor will wait for request
+ processing threads to terminate before continuing with the process of
+ stopping the connector. If not set, the default is <code>5000</code> (5
+ seconds).</p>
+ </td></tr><tr><td><code class="attributeName">keepAliveTimeout</code></td><td>
+ <p>The number of milliseconds this <strong>Connector</strong> will wait
+ for another HTTP request before closing the connection. The default value
+ is to use the value that has been set for the
+ <strong>connectionTimeout</strong> attribute.
+ Use a value of -1 to indicate no (i.e. infinite) timeout.</p>
+ </td></tr><tr><td><code class="attributeName">maxConnections</code></td><td>
+ <p>The maximum number of connections that the server will accept and
+ process at any given time. When this number has been reached, the server
+ will accept, but not process, one further connection. This additional
+ connection be blocked until the number of connections being processed
+ falls below <strong>maxConnections</strong> at which point the server will
+ start accepting and processing new connections again. Note that once the
+ limit has been reached, the operating system may still accept connections
+ based on the <code>acceptCount</code> setting. The default value varies by
+ connector type. For NIO and NIO2 the default is <code>10000</code>.
+ For APR/native, the default is <code>8192</code>.</p>
+ <p>For NIO/NIO2 only, setting the value to -1, will disable the
+ maxConnections feature and connections will not be counted.</p>
+ </td></tr><tr><td><code class="attributeName">maxCookieCount</code></td><td>
+ <p>The maximum number of cookies that are permitted for a request. A value
+ of less than zero means no limit. If not specified, a default value of 200
+ will be used.</p>
+ </td></tr><tr><td><code class="attributeName">maxExtensionSize</code></td><td>
+ <p>Limits the total length of chunk extensions in chunked HTTP requests.
+ If the value is <code>-1</code>, no limit will be imposed. If not
+ specified, the default value of <code>8192</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">maxHttpHeaderSize</code></td><td>
+ <p>The maximum size of the request and response HTTP header, specified
+ in bytes. If not specified, this attribute is set to 8192 (8 KB).</p>
+ </td></tr><tr><td><code class="attributeName">maxKeepAliveRequests</code></td><td>
+ <p>The maximum number of HTTP requests which can be pipelined until
+ the connection is closed by the server. Setting this attribute to 1 will
+ disable HTTP/1.0 keep-alive, as well as HTTP/1.1 keep-alive and
+ pipelining. Setting this to -1 will allow an unlimited amount of
+ pipelined or keep-alive HTTP requests.
+ If not specified, this attribute is set to 100.</p>
+ </td></tr><tr><td><code class="attributeName">maxSwallowSize</code></td><td>
+ <p>The maximum number of request body bytes (excluding transfer encoding
+ overhead) that will be swallowed by Tomcat for an aborted upload. An
+ aborted upload is when Tomcat knows that the request body is going to be
+ ignored but the client still sends it. If Tomcat does not swallow the body
+ the client is unlikely to see the response. If not specified the default
+ of 2097152 (2 megabytes) will be used. A value of less than zero indicates
+ that no limit should be enforced.</p>
+ </td></tr><tr><td><code class="attributeName">maxThreads</code></td><td>
+ <p>The maximum number of request processing threads to be created
+ by this <strong>Connector</strong>, which therefore determines the
+ maximum number of simultaneous requests that can be handled. If
+ not specified, this attribute is set to 200. If an executor is associated
+ with this connector, this attribute is ignored as the connector will
+ execute tasks using the executor rather than an internal thread pool. Note
+ that if an executor is configured any value set for this attribute will be
+ recorded correctly but it will be reported (e.g. via JMX) as
+ <code>-1</code> to make clear that it is not used.</p>
+ </td></tr><tr><td><code class="attributeName">maxTrailerSize</code></td><td>
+ <p>Limits the total length of trailing headers in the last chunk of
+ a chunked HTTP request. If the value is <code>-1</code>, no limit will be
+ imposed. If not specified, the default value of <code>8192</code> will be
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">minSpareThreads</code></td><td>
+ <p>The minimum number of threads always kept running. This includes both
+ active and idle threads. If not specified, the default of <code>10</code>
+ is used. If an executor is associated with this connector, this attribute
+ is ignored as the connector will execute tasks using the executor rather
+ than an internal thread pool. Note that if an executor is configured any
+ value set for this attribute will be recorded correctly but it will be
+ reported (e.g. via JMX) as <code>-1</code> to make clear that it is not
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">noCompressionStrongETag</code></td><td>
+ <p>This flag configures whether resources with a strong ETag will be
+ considered for compression. If <code>true</code>, resources with a strong
+ ETag will not be compressed. The default value is <code>true</code>.</p>
+ <p>This attribute is deprecated. It will be removed in Tomcat 10 onwards
+ where it will be hard-coded to <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">noCompressionUserAgents</code></td><td>
+ <p>The value is a regular expression (using <code>java.util.regex</code>)
+ matching the <code>user-agent</code> header of HTTP clients for which
+ compression should not be used,
+ because these clients, although they do advertise support for the
+ feature, have a broken implementation.
+ The default value is an empty String (regexp matching disabled).</p>
+ </td></tr><tr><td><code class="attributeName">processorCache</code></td><td>
+ <p>The protocol handler caches Processor objects to speed up performance.
+ This setting dictates how many of these objects get cached.
+ <code>-1</code> means unlimited, default is <code>200</code>. If not using
+ Servlet 3.0 asynchronous processing, a good default is to use the same as
+ the maxThreads setting. If using Servlet 3.0 asynchronous processing, a
+ good default is to use the larger of maxThreads and the maximum number of
+ expected concurrent requests (synchronous and asynchronous).</p>
+ </td></tr><tr><td><code class="attributeName">rejectIllegalHeader</code></td><td>
+ <p>If an HTTP request is received that contains an illegal header name or
+ value (e.g. the header name is not a token) this setting determines if the
+ request will be rejected with a 400 response (<code>true</code>) or if the
+ illegal header be ignored (<code>false</code>). The default value is
+ <code>false</code> which will cause the request to be processed but the
+ illegal header will be ignored.</p>
+ </td></tr><tr><td><code class="attributeName">rejectIllegalHeaderName</code></td><td>
+ <p>This attribute is deprecated. It will be removed in Tomcat 10 onwards.
+ It is now an alias for <strong>rejectIllegalHeader</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">relaxedPathChars</code></td><td>
+ <p>The <a href="https://tools.ietf.org/rfc/rfc7230.txt">HTTP/1.1
+ specification</a> requires that certain characters are %nn encoded when
+ used in URI paths. Unfortunately, many user agents including all the major
+ browsers are not compliant with this specification and use these
+ characters in unencoded form. To prevent Tomcat rejecting such requests,
+ this attribute may be used to specify the additional characters to allow.
+ If not specified, no additional characters will be allowed. The value may
+ be any combination of the following characters:
+ <code>" < > [ \ ] ^ ` { | }</code> . Any other characters
+ present in the value will be ignored.</p>
+ </td></tr><tr><td><code class="attributeName">relaxedQueryChars</code></td><td>
+ <p>The <a href="https://tools.ietf.org/rfc/rfc7230.txt">HTTP/1.1
+ specification</a> requires that certain characters are %nn encoded when
+ used in URI query strings. Unfortunately, many user agents including all
+ the major browsers are not compliant with this specification and use these
+ characters in unencoded form. To prevent Tomcat rejecting such requests,
+ this attribute may be used to specify the additional characters to allow.
+ If not specified, no additional characters will be allowed. The value may
+ be any combination of the following characters:
+ <code>" < > [ \ ] ^ ` { | }</code> . Any other characters
+ present in the value will be ignored.</p>
+ </td></tr><tr><td><code class="attributeName">restrictedUserAgents</code></td><td>
+ <p>The value is a regular expression (using <code>java.util.regex</code>)
+ matching the <code>user-agent</code> header of HTTP clients for which
+ HTTP/1.1 or HTTP/1.0 keep alive should not be used, even if the clients
+ advertise support for these features.
+ The default value is an empty String (regexp matching disabled).</p>
+ </td></tr><tr><td><code class="attributeName">server</code></td><td>
+ <p>Overrides the Server header for the http response. If set, the value
+ for this attribute overrides any Server header set by a web application.
+ If not set, any value specified by the application is used. If the
+ application does not specify a value then no Server header is set.</p>
+ </td></tr><tr><td><code class="attributeName">serverRemoveAppProvidedValues</code></td><td>
+ <p>If <code>true</code>, any Server header set by a web
+ application will be removed. Note that if <strong>server</strong> is set,
+ this attribute is effectively ignored. If not set, the default value of
+ <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">SSLEnabled</code></td><td>
+ <p>Use this attribute to enable SSL traffic on a connector.
+ To turn on SSL handshake/encryption/decryption on a connector
+ set this value to <code>true</code>.
+ The default value is <code>false</code>.
+ When turning this value <code>true</code> you will want to set the
+ <code>scheme</code> and the <code>secure</code> attributes as well
+ to pass the correct <code>request.getScheme()</code> and
+ <code>request.isSecure()</code> values to the servlets
+ See <a href="#SSL_Support">SSL Support</a> for more information.
+ </p>
+ </td></tr><tr><td><code class="attributeName">tcpNoDelay</code></td><td>
+ <p>If set to <code>true</code>, the TCP_NO_DELAY option will be
+ set on the server socket, which improves performance under most
+ circumstances. This is set to <code>true</code> by default.</p>
+ </td></tr><tr><td><code class="attributeName">threadPriority</code></td><td>
+ <p>The priority of the request processing threads within the JVM.
+ The default value is <code>5</code> (the value of the
+ <code>java.lang.Thread.NORM_PRIORITY</code> constant). See the JavaDoc
+ for the <code>java.lang.Thread</code> class for more details on what
+ this priority means. If an executor is associated
+ with this connector, this attribute is ignored as the connector will
+ execute tasks using the executor rather than an internal thread pool. Note
+ that if an executor is configured any value set for this attribute will be
+ recorded correctly but it will be reported (e.g. via JMX) as
+ <code>-1</code> to make clear that it is not used.</p>
+ </td></tr><tr><td><code class="attributeName">useKeepAliveResponseHeader</code></td><td>
+ <p>(bool) Use this attribute to enable or disable the addition of the
+ <code>Keep-Alive</code> HTTP response header as described in
+ <a href="https://tools.ietf.org/html/draft-thomson-hybi-http-timeout-03">this
+ Internet-Draft</a>. The default value is <code>true</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Java_TCP_socket_attributes">Java TCP socket attributes</h4><div class="text">
+
+ <p>The NIO and NIO2 implementation support the following Java TCP
+ socket attributes in addition to the common Connector and HTTP attributes
+ listed above.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">socket.rxBufSize</code></td><td>
+ <p>(int)The socket receive buffer (SO_RCVBUF) size in bytes. JVM default
+ used if not set.</p>
+ </td></tr><tr><td><code class="attributeName">socket.txBufSize</code></td><td>
+ <p>(int)The socket send buffer (SO_SNDBUF) size in bytes. JVM default
+ used if not set. Care should be taken if explicitly setting this value.
+ Very poor performance has been observed on some JVMs with values less
+ than ~8k.</p>
+ </td></tr><tr><td><code class="attributeName">socket.tcpNoDelay</code></td><td>
+ <p>(bool)This is equivalent to standard attribute
+ <strong>tcpNoDelay</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">socket.soKeepAlive</code></td><td>
+ <p>(bool)Boolean value for the socket's keep alive setting
+ (SO_KEEPALIVE). JVM default used if not set.</p>
+ </td></tr><tr><td><code class="attributeName">socket.ooBInline</code></td><td>
+ <p>(bool)Boolean value for the socket OOBINLINE setting. JVM default
+ used if not set.</p>
+ </td></tr><tr><td><code class="attributeName">socket.soReuseAddress</code></td><td>
+ <p>(bool)Boolean value for the sockets reuse address option
+ (SO_REUSEADDR). JVM default used if not set.</p>
+ </td></tr><tr><td><code class="attributeName">socket.soLingerOn</code></td><td>
+ <p>(bool)Boolean value for the sockets so linger option (SO_LINGER).
+ A value for the standard attribute <strong>connectionLinger</strong>
+ that is >=0 is equivalent to setting this to <code>true</code>.
+ A value for the standard attribute <strong>connectionLinger</strong>
+ that is <0 is equivalent to setting this to <code>false</code>.
+ Both this attribute and <code>soLingerTime</code> must be set else the
+ JVM defaults will be used for both.</p>
+ </td></tr><tr><td><code class="attributeName">socket.soLingerTime</code></td><td>
+ <p>(int)Value in seconds for the sockets so linger option (SO_LINGER).
+ This is equivalent to standard attribute
+ <strong>connectionLinger</strong>.
+ Both this attribute and <code>soLingerOn</code> must be set else the
+ JVM defaults will be used for both.</p>
+ </td></tr><tr><td><code class="attributeName">socket.soTimeout</code></td><td>
+ <p>This is equivalent to standard attribute
+ <strong>connectionTimeout</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">socket.performanceConnectionTime</code></td><td>
+ <p>(int)The first value for the performance settings. See
+ <a href="http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)">Socket Performance Options</a>.
+ All three performance attributes must be set else the JVM defaults will
+ be used for all three.</p>
+ </td></tr><tr><td><code class="attributeName">socket.performanceLatency</code></td><td>
+ <p>(int)The second value for the performance settings. See
+ <a href="http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)">Socket Performance Options</a>.
+ All three performance attributes must be set else the JVM defaults will
+ be used for all three.</p>
+ </td></tr><tr><td><code class="attributeName">socket.performanceBandwidth</code></td><td>
+ <p>(int)The third value for the performance settings. See
+ <a href="http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)">Socket Performance Options</a>.
+ All three performance attributes must be set else the JVM defaults will
+ be used for all three.</p>
+ </td></tr><tr><td><code class="attributeName">socket.unlockTimeout</code></td><td>
+ <p>(int) The timeout for a socket unlock. When a connector is stopped, it will try to release the acceptor thread by opening a connector to itself.
+ The default value is <code>250</code> and the value is in milliseconds</p>
+ </td></tr></table>
+ </div></div>
+
+ <div class="subsection"><h4 id="NIO_specific_configuration">NIO specific configuration</h4><div class="text">
+
+ <p>The following attributes are specific to the NIO connector.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">pollerThreadCount</code></td><td>
+ <p>(int)The number of threads to be used to run for the polling events.
+ Default value is <code>1</code> per processor but not more than 2.<br>
+ When accepting a socket, the operating system holds a global lock. So the benefit of
+ going above 2 threads diminishes rapidly. Having more than one thread is for
+ system that need to accept connections very rapidly. However usually just
+ increasing <code>acceptCount</code> will solve that problem.
+ Increasing this value may also be beneficial when a large amount of send file
+ operations are going on.
+ </p>
+ </td></tr><tr><td><code class="attributeName">pollerThreadPriority</code></td><td>
+ <p>(int)The priority of the poller threads.
+ The default value is <code>5</code> (the value of the
+ <code>java.lang.Thread.NORM_PRIORITY</code> constant). See the JavaDoc
+ for the <code>java.lang.Thread</code> class for more details on what
+ this priority means.</p>
+ </td></tr><tr><td><code class="attributeName">selectorTimeout</code></td><td>
+ <p>(int)The time in milliseconds to timeout on a select() for the
+ poller. This value is important, since connection clean up is done on
+ the same thread, so do not set this value to an extremely high one. The
+ default value is <code>1000</code> milliseconds.</p>
+ </td></tr><tr><td><code class="attributeName">useSendfile</code></td><td>
+ <p>(bool)Use this attribute to enable or disable sendfile capability.
+ The default value is <code>true</code>. Note that the use of sendfile
+ will disable any compression that Tomcat may otherwise have performed on
+ the response.</p>
+ </td></tr><tr><td><code class="attributeName">socket.directBuffer</code></td><td>
+ <p>(bool)Boolean value, whether to use direct ByteBuffers or java mapped
+ ByteBuffers. If <code>true</code> then
+ <code>java.nio.ByteBuffer.allocateDirect()</code> is used to allocate
+ the buffers, if <code>false</code> then
+ <code>java.nio.ByteBuffer.allocate()</code> is used. The default value
+ is <code>false</code>.<br>
+ When you are using direct buffers, make sure you allocate the
+ appropriate amount of memory for the direct memory space. On Sun's JDK
+ that would be something like <code>-XX:MaxDirectMemorySize=256m</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">socket.directSslBuffer</code></td><td>
+ <p>(bool)Boolean value, whether to use direct ByteBuffers or java mapped
+ ByteBuffers for the SSL buffers. If <code>true</code> then
+ <code>java.nio.ByteBuffer.allocateDirect()</code> is used to allocate
+ the buffers, if <code>false</code> then
+ <code>java.nio.ByteBuffer.allocate()</code> is used. The default value
+ is <code>false</code>.<br>
+ When you are using direct buffers, make sure you allocate the
+ appropriate amount of memory for the direct memory space. On Oracle's JDK
+ that would be something like <code>-XX:MaxDirectMemorySize=256m</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">socket.appReadBufSize</code></td><td>
+ <p>(int)Each connection that is opened up in Tomcat get associated with
+ a read ByteBuffer. This attribute controls the size of this buffer. By
+ default this read buffer is sized at <code>8192</code> bytes. For lower
+ concurrency, you can increase this to buffer more data. For an extreme
+ amount of keep alive connections, decrease this number or increase your
+ heap size.</p>
+ </td></tr><tr><td><code class="attributeName">socket.appWriteBufSize</code></td><td>
+ <p>(int)Each connection that is opened up in Tomcat get associated with
+ a write ByteBuffer. This attribute controls the size of this buffer. By
+ default this write buffer is sized at <code>8192</code> bytes. For low
+ concurrency you can increase this to buffer more response data. For an
+ extreme amount of keep alive connections, decrease this number or
+ increase your heap size.<br>
+ The default value here is pretty low, you should up it if you are not
+ dealing with tens of thousands concurrent connections.</p>
+ </td></tr><tr><td><code class="attributeName">socket.bufferPool</code></td><td>
+ <p>(int)The NIO connector uses a class called NioChannel that holds
+ elements linked to a socket. To reduce garbage collection, the NIO
+ connector caches these channel objects. This value specifies the size of
+ this cache. The default value is <code>500</code>, and represents that
+ the cache will hold 500 NioChannel objects. Other values are
+ <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p>
+ </td></tr><tr><td><code class="attributeName">socket.bufferPoolSize</code></td><td>
+ <p>(int)The NioChannel pool can also be size based, not used object
+ based. The size is calculated as follows:<br>
+ NioChannel
+ <code>buffer size = read buffer size + write buffer size</code><br>
+ SecureNioChannel <code>buffer size = application read buffer size +
+ application write buffer size + network read buffer size +
+ network write buffer size</code><br>
+ The value is in bytes, the default value is <code>1024*1024*100</code>
+ (100MB).</p>
+ </td></tr><tr><td><code class="attributeName">socket.processorCache</code></td><td>
+ <p>(int)Tomcat will cache SocketProcessor objects to reduce garbage
+ collection. The integer value specifies how many objects to keep in the
+ cache at most. The default is <code>500</code>. Other values are
+ <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p>
+ </td></tr><tr><td><code class="attributeName">socket.keyCache</code></td><td>
+ <p>(int)Tomcat will cache KeyAttachment objects to reduce garbage
+ collection. The integer value specifies how many objects to keep in the
+ cache at most. The default is <code>500</code>. Other values are
+ <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p>
+ </td></tr><tr><td><code class="attributeName">socket.eventCache</code></td><td>
+ <p>(int)Tomcat will cache PollerEvent objects to reduce garbage
+ collection. The integer value specifies how many objects to keep in the
+ cache at most. The default is <code>500</code>. Other values are
+ <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p>
+ </td></tr><tr><td><code class="attributeName">selectorPool.maxSelectors</code></td><td>
+ <p>(int)The max selectors to be used in the pool, to reduce selector
+ contention. Use this option when the command line
+ <code>org.apache.tomcat.util.net.NioSelectorShared</code> value is set
+ to false. Default value is <code>200</code>.</p>
+ </td></tr><tr><td><code class="attributeName">selectorPool.maxSpareSelectors</code></td><td>
+ <p>(int)The max spare selectors to be used in the pool, to reduce
+ selector contention. When a selector is returned to the pool, the system
+ can decide to keep it or let it be GC'd. Use this option when the
+ command line <code>org.apache.tomcat.util.net.NioSelectorShared</code>
+ value is set to false. Default value is <code>-1</code> (unlimited).</p>
+ </td></tr><tr><td><code class="attributeName">useInheritedChannel</code></td><td>
+ <p>(bool)Defines if this connector should inherit an inetd/systemd network socket.
+ Only one connector can inherit a network socket. This can option can be
+ used to automatically start Tomcat once a connection request is made to
+ the systemd super daemon's port.
+ The default value is <code>false</code>. See the JavaDoc
+ for the <code>java.nio.channels.spi.SelectorProvider</code> class for
+ more details.</p>
+ </td></tr><tr><td><code class="attributeName">command-line-options</code></td><td>
+ <p>The following command line options are available for the NIO
+ connector:<br>
+ <code>-Dorg.apache.tomcat.util.net.NioSelectorShared=true|false</code>
+ - default is <code>true</code>. Set this value to <code>false</code> if you wish to
+ use a selector for each thread. When you set it to <code>false</code>, you can
+ control the size of the pool of selectors by using the
+ <strong>selectorPool.maxSelectors</strong> attribute.</p>
+ </td></tr></table>
+ </div></div>
+
+ <div class="subsection"><h4 id="NIO2_specific_configuration">NIO2 specific configuration</h4><div class="text">
+
+ <p>The following attributes are specific to the NIO2 connector.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">useSendfile</code></td><td>
+ <p>(bool)Use this attribute to enable or disable sendfile capability.
+ The default value is <code>true</code>. Note that the use of sendfile
+ will disable any compression that Tomcat may otherwise have performed on
+ the response.</p>
+ </td></tr><tr><td><code class="attributeName">socket.directBuffer</code></td><td>
+ <p>(bool)Boolean value, whether to use direct ByteBuffers or java mapped
+ ByteBuffers. If <code>true</code> then
+ <code>java.nio.ByteBuffer.allocateDirect()</code> is used to allocate
+ the buffers, if <code>false</code> then
+ <code>java.nio.ByteBuffer.allocate()</code> is used. The default value
+ is <code>false</code>.<br>
+ When you are using direct buffers, make sure you allocate the
+ appropriate amount of memory for the direct memory space. On Sun's JDK
+ that would be something like <code>-XX:MaxDirectMemorySize=256m</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">socket.directSslBuffer</code></td><td>
+ <p>(bool)Boolean value, whether to use direct ByteBuffers or java mapped
+ ByteBuffers for the SSL buffers. If <code>true</code> then
+ <code>java.nio.ByteBuffer.allocateDirect()</code> is used to allocate
+ the buffers, if <code>false</code> then
+ <code>java.nio.ByteBuffer.allocate()</code> is used. The default value
+ is <code>false</code>.<br>
+ When you are using direct buffers, make sure you allocate the
+ appropriate amount of memory for the direct memory space. On Oracle's JDK
+ that would be something like <code>-XX:MaxDirectMemorySize=256m</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">socket.appReadBufSize</code></td><td>
+ <p>(int)Each connection that is opened up in Tomcat get associated with
+ a read ByteBuffer. This attribute controls the size of this buffer. By
+ default this read buffer is sized at <code>8192</code> bytes. For lower
+ concurrency, you can increase this to buffer more data. For an extreme
+ amount of keep alive connections, decrease this number or increase your
+ heap size.</p>
+ </td></tr><tr><td><code class="attributeName">socket.appWriteBufSize</code></td><td>
+ <p>(int)Each connection that is opened up in Tomcat get associated with
+ a write ByteBuffer. This attribute controls the size of this buffer. By
+ default this write buffer is sized at <code>8192</code> bytes. For low
+ concurrency you can increase this to buffer more response data. For an
+ extreme amount of keep alive connections, decrease this number or
+ increase your heap size.<br>
+ The default value here is pretty low, you should up it if you are not
+ dealing with tens of thousands concurrent connections.</p>
+ </td></tr><tr><td><code class="attributeName">socket.bufferPool</code></td><td>
+ <p>(int)The NIO2 connector uses a class called Nio2Channel that holds
+ elements linked to a socket. To reduce garbage collection, the NIO2
+ connector caches these channel objects. This value specifies the size of
+ this cache. The default value is <code>500</code>, and represents that
+ the cache will hold 500 Nio2Channel objects. Other values are
+ <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p>
+ </td></tr><tr><td><code class="attributeName">socket.processorCache</code></td><td>
+ <p>(int)Tomcat will cache SocketProcessor objects to reduce garbage
+ collection. The integer value specifies how many objects to keep in the
+ cache at most. The default is <code>500</code>. Other values are
+ <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p>
+ </td></tr></table>
+ </div></div>
+
+ <div class="subsection"><h4 id="APR/native_specific_configuration">APR/native specific configuration</h4><div class="text">
+
+ <p>The following attributes are specific to the APR/native connector.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">deferAccept</code></td><td>
+ <p>Sets the <code>TCP_DEFER_ACCEPT</code> flag on the listening socket
+ for this connector. The default value is <code>true</code> where
+ <code>TCP_DEFER_ACCEPT</code> is supported by the operating system,
+ otherwise it is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">ipv6v6only</code></td><td>
+ <p>If listening on an IPv6 address on a dual stack system, should the
+ connector only listen on the IPv6 address? If not specified the default
+ is <code>false</code> and the connector will listen on the IPv6 address
+ and the equivalent IPv4 address if present.</p>
+ </td></tr><tr><td><code class="attributeName">pollerThreadCount</code></td><td>
+ <p>Number of threads used to poll kept alive connections. On Windows the
+ default is chosen so that the sockets managed by each thread is
+ less than 1024. For Linux the default is 1. Changing the default on
+ Windows is likely to have a negative performance impact.</p>
+ </td></tr><tr><td><code class="attributeName">pollTime</code></td><td>
+ <p>Duration of a poll call in microseconds. Lowering this value will
+ slightly decrease latency of connections being kept alive in some cases,
+ but will use more CPU as more poll calls are being made. The default
+ value is 2000 (2ms).</p>
+ </td></tr><tr><td><code class="attributeName">sendfileSize</code></td><td>
+ <p>Amount of sockets that the poller responsible for sending static
+ files asynchronously can hold at a given time. Extra connections will be
+ closed right away without any data being sent (resulting in a zero
+ length file on the client side). Note that in most cases, sendfile is a
+ call that will return right away (being taken care of "synchronously" by
+ the kernel), and the sendfile poller will not be used, so the amount of
+ static files which can be sent concurrently is much larger than the
+ specified amount. The default value is 1024.</p>
+ </td></tr><tr><td><code class="attributeName">threadPriority</code></td><td>
+ <p>(int)The priority of the acceptor and poller threads.
+ The default value is <code>5</code> (the value of the
+ <code>java.lang.Thread.NORM_PRIORITY</code> constant). See the JavaDoc
+ for the <code>java.lang.Thread</code> class for more details on what
+ this priority means.</p>
+ </td></tr><tr><td><code class="attributeName">useSendfile</code></td><td>
+ <p>(bool)Use this attribute to enable or disable sendfile capability.
+ The default value is <code>true</code>. Note that the use of sendfile
+ will disable any compression that Tomcat may otherwise have performed on
+ the response.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+ <p>First implemented in Tomcat 9 and back-ported to 8.5, Tomcat now supports
+ Server Name Indication (SNI). This allows multiple SSL configurations to be
+ associated with a single secure connector with the configuration used for any
+ given connection determined by the host name requested by the client. To
+ facilitate this, the <strong>SSLHostConfig</strong> element was added which
+ can be used to define one of these configurations. Any number of
+ <strong>SSLHostConfig</strong> may be nested in a <strong>Connector</strong>.
+ At the same time, support was added for multiple certificates to be associated
+ with a single <strong>SSLHostConfig</strong>. Each SSL certificate is
+ therefore configured in a <strong>Certificate</strong> element with in an
+ <strong>SSLHostConfig</strong>. For further information, see the SSL Support
+ section below.</p>
+
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+
+
+ <div class="subsection"><h4 id="HTTP/1.1_and_HTTP/1.0_Support">HTTP/1.1 and HTTP/1.0 Support</h4><div class="text">
+
+ <p>This <strong>Connector</strong> supports all of the required features
+ of the HTTP/1.1 protocol, as described in RFCs 7230-7235, including persistent
+ connections, pipelining, expectations and chunked encoding. If the client
+ supports only HTTP/1.0 or HTTP/0.9, the
+ <strong>Connector</strong> will gracefully fall back to supporting this
+ protocol as well. No special configuration is required to enable this
+ support. The <strong>Connector</strong> also supports HTTP/1.0
+ keep-alive.</p>
+
+ <p>RFC 7230 requires that HTTP servers always begin their responses with
+ the highest HTTP version that they claim to support. Therefore, this
+ <strong>Connector</strong> will always return <code>HTTP/1.1</code> at
+ the beginning of its responses.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="HTTP/2_Support">HTTP/2 Support</h4><div class="text">
+
+ <p>HTTP/2 is support is provided for TLS (h2), non-TLS via HTTP upgrade (h2c)
+ and direct HTTP/2 (h2c) connections. To enable HTTP/2 support for an HTTP
+ connector the following <strong>UpgradeProtocol</strong> element must be
+ nested within the <strong>Connector</strong> with a
+ <strong>className</strong> attribute of
+ <code>org.apache.coyote.http2.Http2Protocol</code>.</p>
+
+<div class="codeBox"><pre><code><Connector ... >
+ <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
+</Connector></code></pre></div>
+
+ <p>Because Java 8's TLS implementation does not support ALPN (which is
+ required for HTTP/2 over TLS), you must be using an OpenSSL based TLS
+ implementation to enable HTTP/2 support. See the
+ <code>sslImplementationName</code> attribute of the
+ <strong>Connector</strong>.</p>
+
+ <p>Additional configuration attributes are available. See the
+ <a href="http2.html">HTTP/2 Upgrade Protocol</a> documentation for details.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Proxy_Support">Proxy Support</h4><div class="text">
+
+ <p>The <code>proxyName</code> and <code>proxyPort</code> attributes can
+ be used when Tomcat is run behind a proxy server. These attributes
+ modify the values returned to web applications that call the
+ <code>request.getServerName()</code> and <code>request.getServerPort()</code>
+ methods, which are often used to construct absolute URLs for redirects.
+ Without configuring these attributes, the values returned would reflect
+ the server name and port on which the connection from the proxy server
+ was received, rather than the server name and port to whom the client
+ directed the original request.</p>
+
+ <p>For more information, see the
+ <a href="../proxy-howto.html">Proxy Support How-To</a>.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="SSL_Support">SSL Support</h4><div class="text">
+
+ <p>You can enable SSL support for a particular instance of this
+ <strong>Connector</strong> by setting the <code>SSLEnabled</code> attribute to
+ <code>true</code>.</p>
+
+ <p>You will also need to set the <code>scheme</code> and <code>secure</code>
+ attributes to the values <code>https</code> and <code>true</code>
+ respectively, to pass correct information to the servlets.</p>
+
+ <p>The NIO and NIO2 connectors use either the JSSE Java SSL implementation or
+ an OpenSSL implementation, whereas the APR/native connector uses OpenSSL only.
+ Prior to Tomcat 8.5, different configuration attributes were used for JSSE and
+ OpenSSL. From Tomcat 8.5 onwards, and as far as possible, common configuration
+ attributes are used for both JSSE and OpenSSL. Also if using the JSSE OpenSSL
+ implementation, configuration can be set using either the JSSE or APR
+ attributes (note: but not both types within the same configuration). This is
+ to aid simpler switching between connector implementations for SSL
+ connectors.</p>
+
+ <p>Each secure connector must define at least one
+ <strong>SSLHostConfig</strong>. The names of the
+ <strong>SSLHostConfig</strong> elements must be unique and one of them must
+ match the <code>defaultSSLHostConfigName</code> attribute of the
+ <strong>Connector</strong>.</p>
+
+ <p>Each <strong>SSLHostConfig</strong> must in turn define at least one
+ <strong>Certificate</strong>. The types of the <strong>Certificate</strong>s
+ must be unique.</p>
+
+ <p>As of Tomcat 8.5, the majority of the SSL configuration attributes in the
+ <strong>Connector</strong> are deprecated. If specified, they will be used to
+ configure a <strong>SSLHostConfig</strong> and <strong>Certificate</strong>
+ for the <code>defaultSSLHostConfigName</code>. Note that if an explicit
+ <strong>SSLHostConfig</strong> element also exists for the
+ <code>defaultSSLHostConfigName</code> then that will be treated as a configuration
+ error. It is expected that Tomcat 10 will drop support for the SSL
+ configuration attributes in the <strong>Connector</strong>.</p>
+
+ <p>In addition to the standard TLS related request attributes defined in
+ section 3.10 of the Servlet specification, Tomcat supports a number of
+ additional TLS related attributes. The full list may be found in the <a href="http://tomcat.apache.org/tomcat-10.0-doc/api/index.html">SSLSupport
+ Javadoc</a>.</p>
+
+ <p>For more information, see the
+ <a href="../ssl-howto.html">SSL Configuration How-To</a>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="SSL_Support_-_SSLHostConfig">SSL Support - SSLHostConfig</h4><div class="text">
+
+ <p></p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">certificateRevocationListFile</code></td><td>
+ <p>Name of the file that contains the concatenated certificate revocation
+ lists for the certificate authorities. The format is PEM-encoded. If not
+ defined, client certificates will not be checked against a certificate
+ revocation list (unless an OpenSSL based connector is used and
+ <strong>certificateRevocationListPath</strong> is defined). Relative paths
+ will be resolved against <code>$CATALINA_BASE</code>. JSSE based
+ connectors may also specify a URL for this attribute.</p>
+ </td></tr><tr><td><code class="attributeName">certificateRevocationListPath</code></td><td>
+ <p>OpenSSL only.</p>
+ <p>Name of the directory that contains the certificate revocation lists
+ for the certificate authorities. The format is PEM-encoded. Relative paths
+ will be resolved against <code>$CATALINA_BASE</code>.</p>
+ </td></tr><tr><td><code class="attributeName">certificateVerification</code></td><td>
+ <p>Set to <code>required</code> if you want the SSL stack to require a
+ valid certificate chain from the client before accepting a connection.
+ Set to <code>optional</code> if you want the SSL stack to request a client
+ Certificate, but not fail if one isn't presented. Set to
+ <code>optionalNoCA</code> if you want client certificates to be optional
+ and you don't want Tomcat to check them against the list of trusted CAs.
+ If the TLS provider doesn't support this option (OpenSSL does, JSSE does
+ not) it is treated as if <code>optional</code> was specified. A
+ <code>none</code> value (which is the default) will not require a
+ certificate chain unless the client requests a resource protected by a
+ security constraint that uses <code>CLIENT-CERT</code> authentication.</p>
+ </td></tr><tr><td><code class="attributeName">certificateVerificationDepth</code></td><td>
+ <p>The maximum number of intermediate certificates that will be allowed
+ when validating client certificates. If not specified, the default value
+ of 10 will be used.</p>
+ </td></tr><tr><td><code class="attributeName">caCertificateFile</code></td><td>
+ <p>OpenSSL only.</p>
+ <p>Name of the file that contains the concatenated certificates for the
+ trusted certificate authorities. The format is PEM-encoded.</p>
+ </td></tr><tr><td><code class="attributeName">caCertificatePath</code></td><td>
+ <p>OpenSSL only.</p>
+ <p>Name of the directory that contains the certificates for the trusted
+ certificate authorities. The format is PEM-encoded.</p>
+ </td></tr><tr><td><code class="attributeName">ciphers</code></td><td>
+ <p>The ciphers to enable using the OpenSSL syntax. (See the OpenSSL
+ documentation for the list of ciphers supported and the syntax).
+ Alternatively, a comma separated list of ciphers using the standard
+ OpenSSL cipher names or the standard JSSE cipher names may be used.</p>
+ <p>When converting from OpenSSL syntax to JSSE ciphers for JSSE based
+ connectors, the behaviour of the OpenSSL syntax parsing is kept aligned
+ with the behaviour of the OpenSSL 1.1.0 development branch.</p>
+ <p>Only the ciphers that are supported by the SSL implementation will be
+ used.</p>
+ <p>If not specified, a default (using the OpenSSL notation) of
+ <code>HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!kRSA</code> will be
+ used.</p>
+ <p>Note that, by default, the order in which ciphers are defined is
+ treated as an order of preference. See <code>honorCipherOrder</code>.</p>
+ </td></tr><tr><td><code class="attributeName">disableCompression</code></td><td>
+ <p>OpenSSL only.</p>
+ <p>Configures if compression is disabled. The default is
+ <code>true</code>. If the OpenSSL version used does not support disabling
+ compression then the default for that OpenSSL version will be used.</p>
+ </td></tr><tr><td><code class="attributeName">disableSessionTickets</code></td><td>
+ <p>OpenSSL only.</p>
+ <p>Disables use of TLS session tickets (RFC 5077) if set to
+ <code>true</code>. Default is <code>false</code>. Note that when TLS
+ session tickets are in use, the full peer certificate chain will only be
+ available on the first connection. Subsequent connections (that use a
+ ticket to estrablish the TLS session) will only have the peer certificate,
+ not the full chain.</p>
+ </td></tr><tr><td><code class="attributeName">honorCipherOrder</code></td><td>
+ <p>Set to <code>true</code> to enforce the server's cipher order
+ (from the <code>ciphers</code> setting) instead of allowing
+ the client to choose the cipher. The default is <code>false</code>.
+ Use of this feature requires Java 8 or later.</p>
+ </td></tr><tr><td><code class="attributeName">hostName</code></td><td>
+ <p>The name of the SSL Host. This should either be the fully qualified
+ domain name (e.g. <code>tomcat.apache.org</code>) or a wild card domain
+ name (e.g. <code>*.apache.org</code>). If not specified, the default value
+ of <code>_default_</code> will be used. Provided values are always
+ converted to lower case.</p>
+ </td></tr><tr><td><code class="attributeName">insecureRenegotiation</code></td><td>
+ <p>OpenSSL only.</p>
+ <p>Configures if insecure renegotiation is allowed. The default is
+ <code>false</code>. If the OpenSSL version used does not support
+ configuring if insecure renegotiation is allowed then the default for that
+ OpenSSL version will be used.</p>
+ </td></tr><tr><td><code class="attributeName">keyManagerAlgorithm</code></td><td>
+ <p>JSSE only.</p>
+ <p>The <code>KeyManager</code> algorithm to be used. This defaults to
+ <code>KeyManagerFactory.getDefaultAlgorithm()</code> which returns
+ <code>SunX509</code> for Sun JVMs. IBM JVMs return
+ <code>IbmX509</code>. For other vendors, consult the JVM
+ documentation for the default value.</p>
+ </td></tr><tr><td><code class="attributeName">protocols</code></td><td>
+ <p>The names of the protocols to support when communicating with clients.
+ This should be a list of any combination of the following:
+ </p>
+ <ul><li>SSLv2Hello</li><li>SSLv3</li><li>TLSv1</li><li>TLSv1.1</li>
+ <li>TLSv1.2</li><li>TLSv1.3</li><li>all</li></ul>
+ <p>Each token in the list can be prefixed with a plus sign ("+")
+ or a minus sign ("-"). A plus sign adds the protocol, a minus sign
+ removes it form the current list. The list is built starting from
+ an empty list.</p>
+ <p>The token <code>all</code> is an alias for
+ <code>SSLv2Hello,TLSv1,TLSv1.1,TLSv1.2,TLSv1.3</code>.</p>
+ <p>Note that <code>TLSv1.3</code> is only supported for JSSE when using a
+ JVM that implements <code>TLSv1.3</code>.</p>
+ <p>Note that <code>SSLv2Hello</code> will be ignored for OpenSSL based
+ secure connectors. If more than one protocol is specified for an OpenSSL
+ based secure connector it will always support <code>SSLv2Hello</code>. If a
+ single protocol is specified it will not support
+ <code>SSLv2Hello</code>.</p>
+ <p>Note that <code>SSLv2</code> and <code>SSLv3</code> are inherently
+ unsafe.</p>
+ <p>If not specified, the default value of <code>all</code> will be
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">revocationEnabled</code></td><td>
+ <p>JSSE only.</p>
+ <p>Should the JSSE provider enable certificate revocation checks? If
+ <strong>certificateRevocationListFile</strong> is set then this attribute
+ is ignored and revocation checks are always enabled. This attribute is
+ intended to enable revocation checks that have been configured for the
+ current JSSE provider via other means. If not specified, a default of
+ <code>false</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">sessionCacheSize</code></td><td>
+ <p>The number of SSL sessions to maintain in the session cache. Specify
+ <code>-1</code> to use the implementation default. Values of zero and
+ above are passed to the implementation. Zero is used to specify an
+ unlimited cache size and is not recommended. If not specified, a default
+ of <code>-1</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">sessionTimeout</code></td><td>
+ <p>The time, in seconds, after the creation of an SSL session that it will
+ timeout. Specify <code>-1</code> to use the implementation default. Values
+ of zero and above are passed to the implementation. Zero is used to
+ specify an unlimited timeout and is not recommended. If not specified, a
+ default of 86400 (24 hours) is used.</p>
+ </td></tr><tr><td><code class="attributeName">sslProtocol</code></td><td>
+ <p>JSSE only.</p>
+ <p>The SSL protocol(s) to use (a single value may enable multiple
+ protocols - see the JVM documentation for details). If not specified, the
+ default is <code>TLS</code>. The permitted values may be obtained from the
+ JVM documentation for the allowed values for algorithm when creating an
+ <code>SSLContext</code> instance e.g.
+ <a href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#SSLContext">
+ Oracle Java 7</a>. Note: There is overlap between this attribute and
+ <code>protocols</code>.</p>
+ </td></tr><tr><td><code class="attributeName">trustManagerClassName</code></td><td>
+ <p>JSSE only.</p>
+ <p>The name of a custom trust manager class to use to validate client
+ certificates. The class must have a zero argument constructor and must
+ also implement <code>javax.net.ssl.X509TrustManager</code>. If this
+ attribute is set, the trust store attributes may be ignored.</p>
+ </td></tr><tr><td><code class="attributeName">truststoreAlgorithm</code></td><td>
+ <p>JSSE only.</p>
+ <p>The algorithm to use for truststore. If not specified, the default
+ value returned by
+ <code>javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm()</code> is
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">truststoreFile</code></td><td>
+ <p>JSSE only.</p>
+ <p>The trust store file to use to validate client certificates. The
+ default is the value of the <code>javax.net.ssl.trustStore</code> system
+ property. If neither this attribute nor the default system property is
+ set, no trust store will be configured. Relative paths
+ will be resolved against <code>$CATALINA_BASE</code>. A URL may also be
+ used for this attribute.</p>
+ </td></tr><tr><td><code class="attributeName">truststorePassword</code></td><td>
+ <p>JSSE only.</p>
+ <p>The password to access the trust store. The default is the value of the
+ <code>javax.net.ssl.trustStorePassword</code> system property. If that
+ property is null, no trust store password will be configured. If an
+ invalid trust store password is specified, a warning will be logged and an
+ attempt will be made to access the trust store without a password which
+ will skip validation of the trust store contents.</p>
+ </td></tr><tr><td><code class="attributeName">truststoreProvider</code></td><td>
+ <p>JSSE only.</p>
+ <p>The name of the truststore provider to be used for the server
+ certificate. The default is the value of the
+ <code>javax.net.ssl.trustStoreProvider</code> system property. If
+ that property is null, the value of <code>keystoreProvider</code> is used
+ as the default. If neither this attribute, the default system property nor
+ <code>keystoreProvider</code> is set, the list of registered providers is
+ traversed in preference order and the first provider that supports the
+ <code>truststoreType</code> is used.
+ </p>
+ </td></tr><tr><td><code class="attributeName">truststoreType</code></td><td>
+ <p>JSSE only.</p>
+ <p>The type of key store used for the trust store. The default is the
+ value of the <code>javax.net.ssl.trustStoreType</code> system property. If
+ that property is null, a single certificate has been configured for this
+ TLS virtual host and that certificate has a <code>keystoreType</code> that
+ is not <code>PKCS12</code> then the default will be the
+ <code>keystoreType</code> of the single certificate. If none of these
+ identify a default, the default will be <code>JKS</code>. See the notes on
+ <a href="#Key_store_types">key store types</a> below.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="SSL_Support_-_Certificate">SSL Support - Certificate</h4><div class="text">
+
+ <p></p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">certificateFile</code></strong></td><td>
+ <p>Name of the file that contains the server certificate. The format is
+ PEM-encoded. Relative paths will be resolved against
+ <code>$CATALINA_BASE</code>.</p>
+ <p>In addition to the certificate, the file can also contain as optional
+ elements DH parameters and/or an EC curve name for ephemeral keys, as
+ generated by <code>openssl dhparam</code> and <code>openssl ecparam</code>,
+ respectively. The output of the respective OpenSSL command can simply
+ be concatenated to the certificate file.</p>
+ </td></tr><tr><td><code class="attributeName">certificateChainFile</code></td><td>
+ <p>Name of the file that contains the certificate chain associated with
+ the server certificate used. The format is
+ PEM-encoded. Relative paths will be resolved against
+ <code>$CATALINA_BASE</code>.</p>
+ <p>The certificate chain used for Tomcat should not include the server
+ certificate as its first element.</p>
+ <p>Note that when using more than one certificate for different types,
+ they all must use the same certificate chain.</p>
+ </td></tr><tr><td><code class="attributeName">certificateKeyAlias</code></td><td>
+ <p>JSSE only.</p>
+ <p>The alias used for the server key and certificate in the keystore. If
+ not specified, the first key read from the keystore will be used. The
+ order in which keys are read from the keystore is implementation
+ dependent. It may not be the case that keys are read from the keystore in
+ the same order as they were added. If more than one key is present in the
+ keystore it is strongly recommended that a keyAlias is configured to
+ ensure that the correct key is used.</p>
+ </td></tr><tr><td><code class="attributeName">certificateKeyFile</code></td><td>
+ <p>Name of the file that contains the server private key. The format is
+ PEM-encoded. The default value is the value of
+ <strong>certificateFile</strong> and in this case both certificate and
+ private key have to be in this file (NOT RECOMMENDED). Relative paths will
+ be resolved against <code>$CATALINA_BASE</code>.</p>
+ </td></tr><tr><td><code class="attributeName">certificateKeyPassword</code></td><td>
+ <p>The password used to access the private key associated with the server
+ certificate from the specified file.</p>
+ <p>If not specified, the default behaviour for JSSE is to use the
+ <strong>certificateKeystorePassword</strong>. For OpenSSL the default
+ behaviour is not to use a password.</p>
+ </td></tr><tr><td><code class="attributeName">certificateKeystoreFile</code></td><td>
+ <p>JSSE only.</p>
+ <p>The pathname of the keystore file where you have stored the server
+ certificate and key to be loaded. By default, the pathname is the file
+ <code>.keystore</code> in the operating system home directory of the user
+ that is running Tomcat. If your <code>keystoreType</code> doesn't need a
+ file use <code>""</code> (empty string) or <code>NONE</code> for this
+ parameter. Relative paths will be resolved against
+ <code>$CATALINA_BASE</code>. A URI may also be used for this attribute.
+ When using a domain keystore (<code>keystoreType</code> of
+ <code>DKS</code>), this parameter should be the URI to the domain
+ keystore.</p>
+ </td></tr><tr><td><code class="attributeName">certificateKeystorePassword</code></td><td>
+ <p>JSSE only.</p>
+ <p>The password to use to access the keystore containing the server's
+ private key and certificate. If not specified, a default of
+ <code>changeit</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">certificateKeystoreProvider</code></td><td>
+ <p>JSSE only.</p>
+ <p>The name of the keystore provider to be used for the server
+ certificate. If not specified, the value of the system property
+ <code>javax.net.ssl.keyStoreProvider</code> is used. If neither this
+ attribute nor the system property are set, the list of registered
+ providers is traversed in preference order and the first provider that
+ supports the <code>keystoreType</code> is used.
+ </p>
+ </td></tr><tr><td><code class="attributeName">certificateKeystoreType</code></td><td>
+ <p>JSSE only.</p>
+ <p>The type of keystore file to be used for the server certificate.
+ If not specified, the value of the system property
+ <code>javax.net.ssl.keyStoreType</code> is used. If neither this attribute
+ nor the system property are set, a default value of "<code>JKS</code>". is
+ used. See the notes on <a href="#Key_store_types">key store types</a>
+ below.</p>
+ </td></tr><tr><td><code class="attributeName">type</code></td><td>
+ <p>The type of certificate. This is used to identify the ciphers that are
+ compatible with the certificate. It must be one of <code>UNDEFINED</code>,
+ <code>RSA</code>, <code>DSA</code> or <code>EC</code>. If only one
+ <strong>Certificate</strong> is nested within a <code>SSLHostConfig</code>
+ then this attribute is not required and will default to
+ <code>UNDEFINED</code>. If multiple <strong>Certificate</strong>s are
+ nested within a <code>SSLHostConfig</code> then this attribute is required
+ and each <strong>Certificate</strong> must have a unique type.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="SSL_Support_-_Connector_-_NIO_and_NIO2">SSL Support - Connector - NIO and NIO2</h4><div class="text">
+
+ <p>When APR/native is enabled, the connectors will default to using OpenSSL through JSSE,
+ which may be more optimized than the JSSE Java implementation depending on the processor being used,
+ and can be complemented with many commercial accelerator components.</p>
+
+ <p>The following NIO and NIO2 SSL configuration attributes are not specific to
+ a virtual host and, therefore, must be configured on the connector.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">sniParseLimit</code></td><td>
+ <p>In order to implement SNI support, Tomcat has to parse the first TLS
+ message received on a new TLS connection (the client hello) to extract the
+ requested server name. The message needs to be buffered so it can then be
+ passed to the JSSE implementation for normal TLS processing. In theory,
+ this first message could be very large although in practice it is
+ typically a few hundred bytes. This attribute sets the maximum message
+ size that Tomcat will buffer. If a message exceeds this size, the
+ connection will be configured as if no server name was indicated by the
+ client. If not specified a default of <code>65536</code> (64k) will be
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">sslImplementationName</code></td><td>
+ <p>The class name of the SSL implementation to use. If not specified and
+ the tomcat-native library is not installed, the
+ default of <code>org.apache.tomcat.util.net.jsse.JSSEImplementation</code>
+ will be used which wraps JVM's default JSSE provider. Note that the
+ JVM can be configured to use a different JSSE provider as the default.
+ Tomcat also bundles a special SSL implementation for JSSE that is backed
+ by OpenSSL. To enable it, the native library should be enabled as if
+ intending to use the APR connector, and Tomcat will automatically enable it
+ and the default value of this attribute becomes
+ <code>org.apache.tomcat.util.net.openssl.OpenSSLImplementation</code>.
+ In that case, the attributes from either JSSE and OpenSSL
+ configuration styles can be used, as long as the two types are not mixed
+ (for example, it is not allowed to define use of a Java keystore and
+ specify a separate pem private key using the OpenSSL attribute).</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Key_store_types">Key store types</h4><div class="text">
+
+ <p>In addition to the standard key store types (JKS and PKCS12), most Java
+ runtimes support additional key store types such as Windows-ROOT,
+ Windows-My, DKS as well as hardware security modules. Generally, to use
+ these additional keystore types with a TLS Connector in Tomcat:</p>
+
+ <ul>
+ <li>Set the certificateKeystoreType and/or truststoreType Connector
+ attribute (as appropriate) to the necessary type</li>
+ <li>If a configuration file is required, set the certificateKeystoreFile
+ and/or truststoreFile Connector attribute (as appropriate) to point to
+ the file</li>
+ <li>If no configuration file is required then you will almost certainly
+ need to explicitly set the certificateKeystoreFile and/or
+ truststoreFile Connector attribute (as appropriate) to the empty
+ string ("")</li>
+ <li>If a password is required, set the certificateKeystorePassword and/or
+ truststorePassword Connector attribute (as appropriate) to the
+ required password</li>
+ <li>If no password is required then you will almost certainly need to
+ explicitly set the certificateKeystorePassword and/or
+ truststorePassword Connector attribute (as appropriate) to the empty
+ string ("")</li>
+ </ul>
+
+ <p>Variations in key store implementations, combined with the key store
+ manipulation Tomcat does in the background to allow interoperability between
+ JSSE and OpenSSL configuration styles, means that some keystores may need
+ slightly different configuration. Assistance is always available from the
+ <a href="http://tomcat.apache.org/lists.html#tomcat-users">Apache Tomcat
+ users mailing list</a>. We aim to document any key stores that vary from the
+ above advice here. Currently there are none we are aware of.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="SSL_Support_-_Connector_-_NIO_and_NIO2_(deprecated)">SSL Support - Connector - NIO and NIO2 (deprecated)</h4><div class="text">
+
+ <p>The following NIO and NIO2 SSL configuration attributes have been
+ deprecated in favor of the default
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with
+ the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created..
+ </p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">algorithm</code></td><td>
+ <p>This is an alias for the <code>keyManagerAlgorithm</code> attribute of
+ the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with
+ the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">ciphers</code></td><td>
+ <p>This is an alias for the <code>ciphers</code> attribute of the
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with the
+ <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">clientAuth</code></td><td>
+ <p>This is an alias for the <code>certificateVerification</code> attribute
+ of the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element
+ with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">crlFile</code></td><td>
+ <p>This is an alias for the <code>certificateRevocationListFile</code>
+ attribute of the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a>
+ element with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">keyAlias</code></td><td>
+ <p>This is an alias for the <code>certificateKeyAlias</code> attribute of
+ the first <a href="#SSL_Support_-_Certificate">Certificate</a> element
+ nested in the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a>
+ element with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_Certificate">Certificate</a> and/or
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, they will be created.</p>
+ </td></tr><tr><td><code class="attributeName">keyPass</code></td><td>
+ <p>This is an alias for the <code>certificateKeyPassword</code> attribute
+ of the first <a href="#SSL_Support_-_Certificate">Certificate</a> element
+ nested in the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a>
+ element with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_Certificate">Certificate</a> and/or
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, they will be created.</p>
+ </td></tr><tr><td><code class="attributeName">keystoreFile</code></td><td>
+ <p>This is an alias for the <code>certificateKeystoreFile</code> attribute
+ of the first <a href="#SSL_Support_-_Certificate">Certificate</a> element
+ nested in the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a>
+ element with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_Certificate">Certificate</a> and/or
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, they will be created.</p>
+ </td></tr><tr><td><code class="attributeName">keystorePass</code></td><td>
+ <p>This is an alias for the <code>certificateKeystorePassword</code>
+ attribute of the first
+ <a href="#SSL_Support_-_Certificate">Certificate</a> element nested in the
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a>
+ element with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_Certificate">Certificate</a> and/or
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, they will be created.</p>
+ </td></tr><tr><td><code class="attributeName">keystoreProvider</code></td><td>
+ <p>This is an alias for the <code>certificateKeystoreProvider</code>
+ attribute of the first
+ <a href="#SSL_Support_-_Certificate">Certificate</a> element nested in the
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a>
+ element with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_Certificate">Certificate</a> and/or
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, they will be created.</p>
+ </td></tr><tr><td><code class="attributeName">keystoreType</code></td><td>
+ <p>This is an alias for the <code>certificateKeystoreType</code> attribute
+ of the first <a href="#SSL_Support_-_Certificate">Certificate</a> element
+ nested in the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a>
+ element with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_Certificate">Certificate</a> and/or
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, they will be created.</p>
+ </td></tr><tr><td><code class="attributeName">sessionCacheSize</code></td><td>
+ <p>This is an alias for the <code>sessionCacheSize</code> attribute of the
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with
+ the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">sessionTimeout</code></td><td>
+ <p>This is an alias for the <code>sessionTimeout</code> attribute of the
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with
+ the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">sslEnabledProtocols</code></td><td>
+ <p>This is an alias for the <code>protocols</code> attribute of the
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with
+ the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">sslProtocol</code></td><td>
+ <p>This is an alias for the <code>sslProtocol</code> attribute of the
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with
+ the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">trustManagerClassName</code></td><td>
+ <p>This is an alias for the <code>trustManagerClassName</code> attribute
+ of the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element
+ with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">trustMaxCertLength</code></td><td>
+ <p>This is an alias for the <code>certificateVerificationDepth</code>
+ attribute of the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a>
+ element with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">truststoreAlgorithm</code></td><td>
+ <p>This is an alias for the <code>truststoreAlgorithm</code> attribute of
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with
+ the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">truststoreFile</code></td><td>
+ <p>This is an alias for the <code>truststoreFile</code> attribute of
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with
+ the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">truststorePass</code></td><td>
+ <p>This is an alias for the <code>truststorePassword</code> attribute of
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with
+ the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">truststoreProvider</code></td><td>
+ <p>This is an alias for the <code>truststoreProvider</code> attribute of
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with
+ the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">truststoreType</code></td><td>
+ <p>This is an alias for the <code>truststoreType</code> attribute of
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with
+ the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">useServerCipherSuitesOrder</code></td><td>
+ <p>This is an alias for the <code>honorCipherOrder</code> attribute of the
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with
+ <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="SSL_Support_-_Connector_-_APR/Native_(deprecated)">SSL Support - Connector - APR/Native (deprecated)</h4><div class="text">
+
+ <p>When APR/native is enabled, the HTTPS connector will use a socket poller
+ for keep-alive, increasing scalability of the server. It also uses OpenSSL,
+ which may be more optimized than JSSE depending on the processor being used,
+ and can be complemented with many commercial accelerator components. Unlike
+ the HTTP connector, the HTTPS connector cannot use sendfile to optimize static
+ file processing.</p>
+
+ <p>The HTTPS APR/native connector has the same attributes than the HTTP
+ APR/native connector, but adds OpenSSL specific ones. For the full details on
+ using OpenSSL, please refer to OpenSSL documentations and the many books
+ available for it (see the <a href="http://www.openssl.org">Official OpenSSL
+ website</a>). The SSL specific attributes for the APR/native connector are:
+ </p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">SSLCACertificateFile</code></td><td>
+ <p>This is an alias for the <code>caCertificateFile</code> attribute of
+ the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with
+ the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">SSLCACertificatePath</code></td><td>
+ <p>This is an alias for the <code>caCertificatePath</code> attribute of
+ the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with
+ the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">SSLCARevocationFile</code></td><td>
+ <p>This is an alias for the <code>certificateRevocationListFile</code>
+ attribute of the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a>
+ element with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">SSLCARevocationPath</code></td><td>
+ <p>This is an alias for the <code>certificateRevocationListPath</code>
+ attribute of the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a>
+ element with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><strong><code class="attributeName">SSLCertificateFile</code></strong></td><td>
+ <p>This is an alias for the <code>certificateFile</code> attribute of the
+ first <a href="#SSL_Support_-_Certificate">Certificate</a> element nested
+ in the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element
+ with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_Certificate">Certificate</a> and/or
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, they will be created.</p>
+ </td></tr><tr><td><code class="attributeName">SSLCertificateKeyFile</code></td><td>
+ <p>This is an alias for the <code>certificateKeyFile</code> attribute of
+ the first <a href="#SSL_Support_-_Certificate">Certificate</a> element
+ nested in the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a>
+ element with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_Certificate">Certificate</a> and/or
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, they will be created.</p>
+ </td></tr><tr><td><code class="attributeName">SSLCipherSuite</code></td><td>
+ <p>This is an alias for the <code>ciphers</code> attribute of the
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with the
+ <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">SSLDisableCompression</code></td><td>
+ <p>This is an alias for the <code>disableCompression</code> attribute of
+ the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with
+ the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">SSLHonorCipherOrder</code></td><td>
+ <p>This is an alias for the <code>honorCipherOrder</code> attribute of the
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with the
+ <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">SSLPassword</code></td><td>
+ <p>This is an alias for the <code>certificateKeyPassword</code> attribute
+ of the first <a href="#SSL_Support_-_Certificate">Certificate</a> element
+ nested in the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a>
+ element with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_Certificate">Certificate</a> and/or
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, they will be created.</p>
+ </td></tr><tr><td><code class="attributeName">SSLProtocol</code></td><td>
+ <p>This is an alias for the <code>protocols</code> attribute of the
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element with the
+ <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">SSLVerifyClient</code></td><td>
+ <p>This is an alias for the <code>certificateVerification</code> attribute
+ of the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element
+ with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">SSLVerifyDepth</code></td><td>
+ <p>This is an alias for the <code>certificateVerificationDepth</code>
+ attribute of the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a>
+ element with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr><tr><td><code class="attributeName">SSLDisableSessionTickets</code></td><td>
+ <p>This is an alias for the <code>disableSessionTickets</code> attribute
+ of the <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element
+ with the <code>hostName</code> of <code>_default_</code>. If this
+ <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element is not
+ explicitly defined, it will be created.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Connector_Comparison">Connector Comparison</h4><div class="text">
+
+ <p>Below is a small chart that shows how the connectors differ.</p>
+
+ <table class="defaultTable" style="text-align: center;">
+ <tr>
+ <th></th>
+ <th style="text-align: center;">Java Nio Connector<br>NIO</th>
+ <th style="text-align: center;">Java Nio2 Connector<br>NIO2</th>
+ <th style="text-align: center;">APR/native Connector<br>APR</th>
+ </tr>
+ <tr>
+ <th>Classname</th>
+ <td><code class="noHighlight">Http11NioProtocol</code></td>
+ <td><code class="noHighlight">Http11Nio2Protocol</code></td>
+ <td><code class="noHighlight">Http11AprProtocol</code></td>
+ </tr>
+ <tr>
+ <th>Tomcat Version</th>
+ <td>since 6.0.x</td>
+ <td>since 8.0.x</td>
+ <td>since 5.5.x</td>
+ </tr>
+ <tr>
+ <th>Support Polling</th>
+ <td>YES</td>
+ <td>YES</td>
+ <td>YES</td>
+ </tr>
+ <tr>
+ <th>Polling Size</th>
+ <td><code class="noHighlight">maxConnections</code></td>
+ <td><code class="noHighlight">maxConnections</code></td>
+ <td><code class="noHighlight">maxConnections</code></td>
+ </tr>
+ <tr>
+ <th>Read Request Headers</th>
+ <td>Non Blocking</td>
+ <td>Non Blocking</td>
+ <td>Non Blocking</td>
+ </tr>
+ <tr>
+ <th>Read Request Body</th>
+ <td>Blocking</td>
+ <td>Blocking</td>
+ <td>Blocking</td>
+ </tr>
+ <tr>
+ <th>Write Response Headers and Body</th>
+ <td>Blocking</td>
+ <td>Blocking</td>
+ <td>Blocking</td>
+ </tr>
+ <tr>
+ <th>Wait for next Request</th>
+ <td>Non Blocking</td>
+ <td>Non Blocking</td>
+ <td>Non Blocking</td>
+ </tr>
+ <tr>
+ <th>SSL Support</th>
+ <td>Java SSL or OpenSSL</td>
+ <td>Java SSL or OpenSSL</td>
+ <td>OpenSSL</td>
+ </tr>
+ <tr>
+ <th>SSL Handshake</th>
+ <td>Non blocking</td>
+ <td>Non blocking</td>
+ <td>Blocking</td>
+ </tr>
+ <tr>
+ <th>Max Connections</th>
+ <td><code class="noHighlight">maxConnections</code></td>
+ <td><code class="noHighlight">maxConnections</code></td>
+ <td><code class="noHighlight">maxConnections</code></td>
+ </tr>
+ </table>
+
+ </div></div>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/http2.html b/web/tomcat/webapps/docs/config/http2.html
new file mode 100644
index 0000000..a033592
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/http2.html
@@ -0,0 +1,236 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The HTTP2 Upgrade Protocol</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The HTTP2 Upgrade Protocol</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The <strong>HTTP Upgrade Protocol</strong> element represents an
+ <strong>Upgrade Protocol</strong> component that supports the HTTP/2 protocol.
+ An instance of this component must be associated with an existing
+ <a href="http.html">HTTP/1.1 Connector</a>.</p>
+
+ <p>HTTP/2 connectors use non-blocking I/O, only utilising a container thread
+ from the thread pool when there is data to read and write. However, because
+ the Servlet API is fundamentally blocking, each HTTP/2 stream requires a
+ dedicated container thread for the duration of that stream.</p>
+
+ <p>Requests processed using HTTP/2 will have the following additional request
+ attributes available:</p>
+ <ul>
+ <li><code>org.apache.coyote.connectionID</code> will return the HTTP/2
+ connection ID</li>
+ <li><code>org.apache.coyote.streamID</code> will return the HTTP/2 stream
+ ID</li>
+ </ul>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>Upgrade Protocol</strong> support the
+ following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>This must be <code>org.apache.coyote.http2.Http2Protocol</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text">
+
+ <p>The HTTP/2 <strong>Upgrade Protocol</strong> implementation supports the
+ following attributes in addition to the common attributes listed above.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allowedTrailerHeaders</code></td><td>
+ <p>By default Tomcat will ignore all trailer headers when processing
+ HTTP/2 connections. For a header to be processed, it must be added to this
+ comma-separated list of header names.</p>
+ </td></tr><tr><td><code class="attributeName">compressibleMimeType</code></td><td>
+ <p>The value is a comma separated list of MIME types for which HTTP
+ compression may be used.
+ The default value is
+ <code>
+ text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml
+ </code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">compression</code></td><td>
+ <p>The HTTP/2 protocol may use compression in an attempt to save server
+ bandwidth. The acceptable values for the parameter is "off" (disable
+ compression), "on" (allow compression, which causes text data to be
+ compressed), "force" (forces compression in all cases), or a numerical
+ integer value (which is equivalent to "on", but specifies the minimum
+ amount of data before the output is compressed). If the content-length is
+ not known and compression is set to "on" or more aggressive, the output
+ will also be compressed. If not specified, this attribute is set to
+ "off".</p>
+ <p><em>Note</em>: There is a tradeoff between using compression (saving
+ your bandwidth) and using the sendfile feature (saving your CPU cycles).
+ If the connector supports the sendfile feature, e.g. the NIO2 connector,
+ using sendfile will take precedence over compression. The symptoms will
+ be that static files greater that 48 Kb will be sent uncompressed.
+ You can turn off sendfile by setting <code>useSendfile</code> attribute
+ of the protocol, as documented below, or change the sendfile usage
+ threshold in the configuration of the
+ <a href="../default-servlet.html">DefaultServlet</a> in the default
+ <code>conf/web.xml</code> or in the <code>web.xml</code> of your web
+ application.
+ </p>
+ </td></tr><tr><td><code class="attributeName">compressionMinSize</code></td><td>
+ <p>If <strong>compression</strong> is set to "on" then this attribute
+ may be used to specify the minimum amount of data before the output is
+ compressed. If not specified, this attribute is defaults to "2048".</p>
+ </td></tr><tr><td><code class="attributeName">initialWindowSize</code></td><td>
+ <p>Controls the initial size of the flow control window for streams that
+ Tomcat advertises to clients. If not specified, the default value of
+ <code>65535</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">keepAliveTimeout</code></td><td>
+ <p>The time, in milliseconds, that Tomcat will wait between HTTP/2 frames
+ when there is no active Stream before closing the connection. Negative
+ values will be treated as an infinite timeout. If not specified, a default
+ value of <code>20000</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">maxConcurrentStreamExecution</code></td><td>
+ <p>The controls the maximum number of streams for any one connection that
+ can be allocated threads from the container thread pool. If more streams
+ are active than threads are available, those streams will have to wait
+ for a stream to become available. If not specified, the default value of
+ <code>20</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">maxConcurrentStreams</code></td><td>
+ <p>The controls the maximum number of active streams permitted for any one
+ connection. If a client attempts to open more active streams than this
+ limit, the stream will be reset with a <code>STREAM_REFUSED</code> error.
+ If not specified, the default value of <code>100</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">maxHeaderCount</code></td><td>
+ <p>The maximum number of headers in a request that is allowed by the
+ container. A request that contains more headers than the specified limit
+ will be rejected. A value of less than 0 means no limit.
+ If not specified, a default of 100 is used.</p>
+ </td></tr><tr><td><code class="attributeName">maxHeaderSize</code></td><td>
+ <p>The maximum total size for all headers in a request that is allowed by
+ the container. Total size for a header is calculated as the uncompressed
+ size of the header name in bytes, plus the uncompressed size of the header
+ value in bytes plus an HTTP/2 overhead of 3 bytes per header. A request
+ that contains a set of headers that requires more than the specified limit
+ will be rejected. A value of less than 0 means no limit. If not specified,
+ a default of 8192 is used.</p>
+ </td></tr><tr><td><code class="attributeName">maxTrailerCount</code></td><td>
+ <p>The maximum number of trailer headers in a request that is allowed by
+ the container. A request that contains more trailer headers than the
+ specified limit will be rejected. A value of less than 0 means no limit.
+ If not specified, a default of 100 is used.</p>
+ </td></tr><tr><td><code class="attributeName">maxTrailerSize</code></td><td>
+ <p>The maximum total size for all trailer headers in a request that is
+ allowed by the container. Total size for a header is calculated as the
+ uncompressed size of the header name in bytes, plus the uncompressed size
+ of the header value in bytes plus an HTTP/2 overhead of 3 bytes per
+ header. A request that contains a set of trailer headers that requires
+ more than the specified limit will be rejected. A value of less than 0
+ means no limit. If not specified, a default of 8192 is used.</p>
+ </td></tr><tr><td><code class="attributeName">noCompressionStrongETag</code></td><td>
+ <p>This flag configures whether resources with a stong ETag will be
+ considered for compression. If <code>true</code>, resources with a strong
+ ETag will not be compressed. The default value is <code>true</code>.</p>
+ <p>This attribute is deprecated. It will be removed in Tomcat 10 onwards
+ where it will be hard-coded to <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">noCompressionUserAgents</code></td><td>
+ <p>The value is a regular expression (using <code>java.util.regex</code>)
+ matching the <code>user-agent</code> header of HTTP clients for which
+ compression should not be used,
+ because these clients, although they do advertise support for the
+ feature, have a broken implementation.
+ The default value is an empty String (regexp matching disabled).</p>
+ </td></tr><tr><td><code class="attributeName">overheadContinuationThreshold</code></td><td>
+ <p>The threshold below which the payload size of a non-final
+ <code>CONTINUATION</code> frame will trigger an increase in the overhead
+ count (see <strong>overheadCountFactor</strong>). The overhead count will
+ be increased by <code>overheadContinuationThreshold/payloadSize</code> so
+ that the smaller the <code>CONTINUATION</code> frame, the greater the
+ increase in the overhead count. A value of zero or less disables the
+ checking of non-final <code>CONTINUATION</code> frames. If not specified,
+ a default value of <code>1024</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">overheadCountFactor</code></td><td>
+ <p>The factor to apply when counting overhead frames to determine if a
+ connection has too high an overhead and should be closed. The overhead
+ count starts at <code>-10 * overheadCountFactor</code>. The count is
+ decreased by 20 for each data frame sent or received and each headers frame
+ received. The count is increased by the <code>overheadCountFactor</code>
+ for each setting received, priority frame received and ping received. If
+ the overhead count exceeds zero, the connection is closed. A value of less
+ than <code>1</code> disables this protection. In normal usage a value of
+ approximately <code>20</code> or higher will close the connection before
+ any streams can complete. If not specified, a default value of
+ <code>10</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">overheadDataThreshold</code></td><td>
+ <p>The threshold below which the average payload size of the current and
+ previous non-final <code>DATA</code> frames will trigger an increase in
+ the overhead count (see <strong>overheadCountFactor</strong>). The
+ overhead count will be increased by
+ <code>overheadDataThreshold/average</code> so that the smaller the
+ average, the greater the increase in the overhead count. A value of zero
+ or less disables the checking of non-final <code>DATA</code> frames. If
+ not specified, a default value of <code>1024</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">overheadWindowUpdateThreshold</code></td><td>
+ <p>The threshold below which the average size of current and previous
+ <code>WINDOW_UPDATE</code> frame will trigger an increase in the overhead
+ count (see <strong>overheadCountFactor</strong>). The overhead count will
+ be increased by <code>overheadWindowUpdateThreshold/average</code> so
+ that the smaller the average, the greater the increase in the overhead
+ count. A value of zero or less disables the checking of
+ <code>WINDOW_UPDATE</code> frames. If not specified, a default value of
+ <code>1024</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">readTimeout</code></td><td>
+ <p>The time, in milliseconds, that Tomcat will wait for additional data
+ when a partial HTTP/2 frame has been received. Negative values will be
+ treated as an infinite timeout. If not specified, a default value of
+ <code>5000</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">streamReadTimeout</code></td><td>
+ <p>The time, in milliseconds, that Tomcat will wait for additional data
+ frames to arrive for the stream when an application is performing a
+ blocking I/O read and additional data is required. Negative values will be
+ treated as an infinite timeout. If not specified, a default value of
+ <code>20000</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">streamWriteTimeout</code></td><td>
+ <p>The time, in milliseconds, that Tomcat will wait for additional window
+ update frames to arrive for the stream and/or connection when an
+ application is performing a blocking I/O write and the stream and/or
+ connection flow control window is too small for the write to complete.
+ Negative values will be treated as an infinite timeout. If not specified,
+ a default value of <code>20000</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">writeTimeout</code></td><td>
+ <p>The time, in milliseconds, that Tomcat will wait to write additional
+ data when an HTTP/2 frame has been partially written. Negative values will
+ be treated as an infinite timeout. If not specified, a default value of
+ <code>5000</code> will be used.</p>
+ </td></tr></table>
+
+ <p>The HTTP/2 upgrade protocol will also inherit the following limits from the
+ <a href="http.html">HTTP Connector</a> it is nested with:</p>
+
+ <ul>
+ <li>maxCookieCount</li>
+ <li>maxParameterCount</li>
+ <li>maxPostSize</li>
+ <li>maxSavePostSize</li>
+ </ul>
+
+ </div></div>
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+ <p>This component does not support any nested components.</p>
+
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+
+ <p>This component does not support any special features.</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/index.html b/web/tomcat/webapps/docs/config/index.html
new file mode 100644
index 0000000..b4e1ef8
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/index.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - Overview</title><meta name="author" content="Craig R. McClanahan"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Overview</h2><h3 id="Overview">Overview</h3><div class="text">
+
+<p>This manual contains reference information about all of the configuration
+directives that can be included in a <code>conf/server.xml</code> file to
+configure the behavior of the Tomcat Servlet/JSP container. It does not
+attempt to describe which configuration directives should be used to perform
+specific tasks - for that, see the various <em>How-To</em> documents on the
+main index page.</p>
+
+<p>Tomcat configuration files are formatted as schemaless XML; elements and
+attributes are case-sensitive. Apache Ant-style variable substitution
+is supported; a system property with the name <code>propname</code> may be
+used in a configuration file using the syntax <code>${propname}</code>. All
+system properties are available including those set using the <code>-D</code>
+syntax, those automatically made available by the JVM and those configured in
+the <code>$CATALINA_BASE/conf/catalina.properties</code> file.
+</p>
+
+<p>The configuration element descriptions are organized into the following
+major categories:</p>
+<ul>
+<li><strong>Top Level Elements</strong> - <code><Server></code> is the
+ root element of the entire configuration file, while
+ <code><Service></code> represents a group of Connectors that is
+ associated with an Engine.</li>
+<li><strong>Connectors</strong> - Represent the interface between external
+ clients sending requests to (and receiving responses from) a particular
+ Service.</li>
+<li><strong>Containers</strong> - Represent components whose function is to
+ process incoming requests, and create the corresponding responses.
+ An Engine handles all requests for a Service, a Host handles all requests
+ for a particular virtual host, and a Context handles all requests for a
+ specific web application.</li>
+<li><strong>Nested Components</strong> - Represent elements that can be
+ nested inside the element for a Container. Some elements can be nested
+ inside any Container, while others can only be nested inside a
+ Context.</li>
+</ul>
+
+<p>For each element, the corresponding documentation follows this general
+outline:</p>
+<ul>
+<li><strong>Introduction</strong> - Overall description of this particular
+ component. There will be a corresponding Java <em>interface</em> (in
+ the <code>org.apache.catalina</code> package) that is implemented by one
+ or more standard implementations.</li>
+<li><strong>Attributes</strong> - The set of attributes that are legal for
+ this element. Generally, this will be subdivided into <em>Common</em>
+ attributes that are supported by all implementations of the corresponding
+ Java interface, and <em>Standard Implementation</em> attributes that are
+ specific to a particular Java class that implements this interface.
+ The names of required attributes are <strong>bolded</strong>.</li>
+<li><strong>Nested Components</strong> - Enumerates which of the <em>Nested
+ Components</em> can be legally nested within this element.</li>
+<li><strong>Special Features</strong> - Describes the configuration of a large
+ variety of special features (specific to each element type) that are
+ supported by the standard implementation of this interface.</li>
+</ul>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/jar-scan-filter.html b/web/tomcat/webapps/docs/config/jar-scan-filter.html
new file mode 100644
index 0000000..9528649
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/jar-scan-filter.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Jar Scan Filter Component</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Jar Scan Filter Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The <strong>Jar Scan Filter</strong> element represents the component that
+ filters results from the <a href="jar-scanner.html">Jar Scanner</a> before
+ they are passed back to the application. It is typically used to skip the
+ scanning of JARs that are known not to be relevant to some or all types of
+ scan.</p>
+
+ <p>A Jar Scan Filter element MAY be nested inside a
+ <a href="jar-scanner.html">Jar Scanner</a> component.</p>
+
+ <p>For example you can specify additional jar files when scanning for pluggable
+ features:</p>
+<div class="codeBox"><pre><code><Context>
+ ...
+ <JarScanner>
+ <JarScanFilter
+ pluggabilityScan="${tomcat.util.scan.StandardJarScanFilter.jarsToScan},
+ my_pluggable_feature.jar"/>
+ </JarScanner>
+ ...
+</Context></code></pre></div>
+
+ <p>If a Jar Scan Filter element is not included, a default Jar Scan Filter
+ configuration will be created automatically, which is sufficient for most
+ requirements.</p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>Jar Scan Filter</strong>
+ support the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">className</code></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.tomcat.JarScanFilter</code> interface.
+ If not specified, the standard value (defined below) will be used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text">
+
+ <p>The standard implementation of <strong>Jar Scan Filter</strong> is
+ <strong>org.apache.tomcat.util.scan.StandardJarScanFilter</strong>.
+ Additional attributes that it supports (in addition to the common attributes
+ listed above) are listed in the table.</p>
+
+ <p>The values for <strong>pluggabilitySkip</strong>,
+ <strong>pluggabilityScan</strong>, <strong>tldSkip</strong>,
+ <strong>tldScan</strong> attributes are lists of file name pattern. The
+ patterns are separated by comma (','). The leading and trailing whitespace
+ characters in a pattern are ignored. The patterns are matched
+ case-sensitively. The following two special characters are supported:</p>
+
+ <ul>
+ <li>'*' - means zero or more characters,</li>
+ <li>'?' - means one and only one character.</li>
+ </ul>
+
+ <p>Note that excluding a JAR from the pluggability scan will prevent a
+ ServletContainerInitializer from being loaded from a web application JAR
+ (i.e. one located in <code>/WEB-INF/lib</code>) but it will not prevent
+ a ServletContainerInitializer from being loaded from the container (Tomcat).
+ To prevent a ServletContainerInitializer provided by container from being
+ loaded, use the <code>containerSciFilter</code> property of the
+ <a href="context.html">Context</a>.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">pluggabilitySkip</code></td><td>
+ <p>The comma separated list of JAR file name patterns
+ to skip when scanning for pluggable features introduced by Servlet 3.0
+ specification. If not specified, the default is obtained from the
+ <code>tomcat.util.scan.StandardJarScanFilter.jarsToSkip</code> system
+ property.</p>
+ </td></tr><tr><td><code class="attributeName">pluggabilityScan</code></td><td>
+ <p>The comma separated list of JAR file name patterns
+ to scan when scanning for pluggable features introduced by Servlet 3.0
+ specification. If not specified, the default is obtained from the
+ <code>tomcat.util.scan.StandardJarScanFilter.jarsToScan</code> system
+ property.</p>
+ </td></tr><tr><td><code class="attributeName">defaultPluggabilityScan</code></td><td>
+ <p>Controls if JARs are scanned or skipped by default when scanning
+ for the pluggable features.
+ If <code>true</code>, a JAR is scanned when its name either matches
+ none of <strong>pluggabilitySkip</strong> patterns or
+ any of <strong>pluggabilityScan</strong> patterns.
+ If <code>false</code>, a JAR is scanned when its name matches
+ any of <strong>pluggabilityScan</strong> patterns and
+ none of <strong>pluggabilitySkip</strong> patterns.
+ If not specified, the default value is <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">tldSkip</code></td><td>
+ <p>The comma separated list of JAR file name patterns
+ to skip when scanning for tag libraries (TLDs).
+ If not specified, the default is obtained
+ from the <code>tomcat.util.scan.StandardJarScanFilter.jarsToSkip</code>
+ system property.</p>
+ </td></tr><tr><td><code class="attributeName">tldScan</code></td><td>
+ <p>The comma separated list of JAR file name patterns
+ to scan when scanning for tag libraries (TLDs).
+ If not specified, the default is obtained
+ from the <code>tomcat.util.scan.StandardJarScanFilter.jarsToScan</code>
+ system property.</p>
+ </td></tr><tr><td><code class="attributeName">defaultTldScan</code></td><td>
+ <p>Controls if JARs are scanned or skipped by default when scanning
+ for TLDs.
+ If <code>true</code>, a JAR is scanned when its name either matches
+ none of <strong>tldSkip</strong> patterns or
+ any of <strong>tldScan</strong> patterns.
+ If <code>false</code>, a JAR is scanned when its name matches
+ any of <strong>tldScan</strong> patterns and
+ none of <strong>tldSkip</strong> patterns.
+ If not specified, the default value is <code>true</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+ <p>No components may be nested inside a <strong>Jar Scan Filter</strong> element.
+ </p>
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+ <p>No special features are associated with a <strong>Jar Scan Filter</strong>
+ element.</p>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/jar-scanner.html b/web/tomcat/webapps/docs/config/jar-scanner.html
new file mode 100644
index 0000000..abceb76
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/jar-scanner.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Jar Scanner Component</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Jar Scanner Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The <strong>Jar Scanner</strong> element represents the component that is
+ used to scan the web application for JAR files and directories of class files.
+ It is typically used during web application start to identify configuration
+ files such as TLDs or web-fragment.xml files that must be processed as part of
+ the web application initialisation.</p>
+
+ <p>A Jar Scanner element MAY be nested inside a
+ <a href="context.html">Context</a> component.</p>
+
+ <p>For example you can include the bootstrap classpath when scanning for jar
+ files:</p>
+<div class="codeBox"><pre><code><Context>
+ ...
+ <JarScanner scanBootstrapClassPath="true"/>
+ ...
+</Context></code></pre></div>
+
+ <p>If a Jar Scanner element is not included, a default Jar Scanner configuration
+ will be created automatically, which is sufficient for most requirements.</p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>Jar Scanner</strong>
+ support the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">className</code></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.tomcat.JarScanner</code> interface.
+ If not specified, the standard value (defined below) will be used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text">
+
+ <p>The standard implementation of <strong>Jar Scanner</strong> is
+ <strong>org.apache.tomcat.util.scan.StandardJarScanner</strong>.
+ It supports the following additional attributes (in addition to the
+ common attributes listed above):</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">scanAllDirectories</code></td><td>
+ <p>If <code>true</code>, any directories found on the classpath will be
+ checked to see if they are expanded JAR files.
+ The default is <code>false</code>.</p>
+ <p>Tomcat determines if a directory is an expanded JAR file by looking
+ for a META-INF sub-directory. Only if the META-INF sub-directory exists,
+ the directory is assumed to be an expanded JAR file. Note that for scans
+ for matches to <code>@HandlesTypes</code> annotations, all directories
+ will be scanned irrespective of the presence or not of a META-INF
+ sub-directory.</p>
+ </td></tr><tr><td><code class="attributeName">scanAllFiles</code></td><td>
+ <p>If <code>true</code>, any files found on the classpath will be checked
+ to see if they are Jar files rather than relying on the file extension
+ being <code>.jar</code>. The default is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">scanClassPath</code></td><td>
+ <p>If <code>true</code>, the full web application classpath, including
+ the shared and common classloaders and the system classpath (but not the
+ bootstrap classpath) will be scanned for Jar files in addition to the web
+ application. The default is <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">scanBootstrapClassPath</code></td><td>
+ <p>If <strong>scanClassPath</strong> is <code>true</code> and this is
+ <code>true</code> the bootstrap classpath will also be scanned for Jar
+ files. The default is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">scanManifest</code></td><td>
+ <p>If <code>true</code>, the Manifest files of any JARs found will be
+ scanned for additional class path entries and those entries will be added
+ to the URLs to scan. The default is <code>true</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+ <p>Only a <a href="jar-scan-filter.html">Jar Scan Filter</a> may be nested
+ inside a <strong>Jar Scanner</strong> element.</p>
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+ <p>No special features are associated with a <strong>Jar Scanner</strong>
+ element.</p>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/jaspic.html b/web/tomcat/webapps/docs/config/jaspic.html
new file mode 100644
index 0000000..1d71c5c
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/jaspic.html
@@ -0,0 +1,162 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - JASPIC</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>JASPIC</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Static_configuration">Static configuration</a><ol><li><a href="#AuthConfigProvider">AuthConfigProvider</a></li><li><a href="#ServerAuthModule">ServerAuthModule</a></li></ol></li><li><a href="#Dynamic_configuration">Dynamic configuration</a></li><li><a href="#3rd_party_modules">3rd party modules</a><ol><li><a href="#Philip_Green_II's_module_for_Google_OAuth_2">Philip Green II's module for Google OAuth 2</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>Tomcat implements JASPIC 1.1 Maintenance Release B
+ (<a href="https://www.jcp.org/en/jsr/detail?id=196">JSR 196</a>). The
+ implementation is primarily intended to enable the integration of 3rd party
+ JASPIC authentication implementations with Tomcat.</p>
+
+ <p>JASPIC may be configured in one of two ways:</p>
+ <ul>
+ <li>At the container level via the static configuration file
+ <code>$CATALINA_BASE/conf/jaspic-providers.xml</code>. With this
+ approach all required classes must be visible to Tomcat's Common class
+ loader which normally means placing a JAR in
+ <code>$CATALINA_BASE/lib</code>.</li>
+ <li>At the web application level via dynamic configuration using the JASPIC
+ API. With this approach all required classes must be visible to the web
+ application class loader which normally means placing a JAR in the web
+ application's <code>WEB-INF/lib</code> directory.</li>
+ </ul>
+
+ <p>Users should be aware that if the static JASPIC configuration file
+ configures JASPIC for a given web application then the JASPIC configuration
+ will take precendence over any <code><login-config></code> present in
+ the web application's <code>WEB-INF/web.xml</code> file.</p>
+
+</div><h3 id="Static_configuration">Static configuration</h3><div class="text">
+
+ <div class="subsection"><h4 id="AuthConfigProvider">AuthConfigProvider</h4><div class="text">
+
+ <p>If the 3rd party implementation includes an
+ <code>AuthConfigProvider</code> then a web application can be configured to
+ use it by nesting the following inside the
+ <code><jaspic-providers></code> element in
+ <code>$CATALINA_BASE/conf/jaspic-providers.xml</code>.</p>
+<div class="codeBox"><pre><code><provider name="any"
+ className="fully.qualified.implementation.class.Name"
+ layer="HttpServlet"
+ appContext="Catalina/localhost /contextPath"
+ description="any">
+ <property name="see-provider-documentation"
+ value="see-provider-documentation" />
+</provider></code></pre></div>
+
+ <p>The <code>name</code> and <code>description</code> attributes are not
+ used by Tomcat.</p>
+
+ <p>The <code>className</code> attribute must be the fully qualified class
+ name of the <code>AuthConfigProvider</code>. The implementation may be
+ packaged with the web application or in Tomcat's
+ <code>$CATALINA_BASE/lib</code> directory.</p>
+
+ <p>The <code>layer</code> attribute must be <code>HttpServlet</code>.</p>
+
+ <p>The <code>appContext</code> attribute must be exactly the concatenation
+ of:</p>
+ <ul>
+ <li>The engine name</li>
+ <li>The forward slash character</li>
+ <li>The host name</li>
+ <li>A single space</li>
+ <li>The context path</li>
+ </ul>
+
+ <p>If the <code>AuthConfigProvider</code> supports configuration via
+ properties these may be specified via <code><property></code> elements
+ nesting inside the <code><provide></code> element.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="ServerAuthModule">ServerAuthModule</h4><div class="text">
+
+ <p>If the 3rd party implementation only provides an
+ <code>ServerAuthModule</code> then it will be necessary to provide a number
+ of supporting classes. These may be a custom implementation or,
+ alternatively, Tomcat provides a simple wrapper implementation for
+ <code>ServerAuthModule</code>s.
+ </p>
+
+ <p>Tomcat's wrapper for <code>ServerAuthModule</code> can be configured
+ by nesting the following inside the
+ <code><jaspic-providers></code> element in
+ <code>$CATALINA_BASE/conf/jaspic-providers.xml</code>.</p>
+<div class="codeBox"><pre><code><provider name="any"
+ className="org.apache.catalina.authenticator.jaspic.SimpleAuthConfigProvider"
+ layer="HttpServlet"
+ appContext="Catalina/localhost /contextPath"
+ description="any">
+ <property name="org.apache.catalina.authenticator.jaspic.ServerAuthModule.1"
+ value="fully.qualified.implementation.class.Name" />
+ <property name="see-provider-documentation"
+ value="see-provider-documentation" />
+</provider></code></pre></div>
+
+ <p>The configuration is similar to the <code>AuthConfigProvider</code> in
+ the previous section but with some key differences.</p>
+
+ <p>The <code>className</code> attribute must be
+ <code>org.apache.catalina.authenticator.jaspic.SimpleAuthConfigProvider</code>.</p>
+
+ <p>The <code>ServerAuthModule</code>(s) are specified via properties. The
+ property name must be
+ <code>org.apache.catalina.authenticator.jaspic.ServerAuthModule.n</code>
+ where <code>n</code> is the index of the module. The index must start at 1
+ an increment in steps of 1 until all modules are defined. The value of the
+ property must be the fully qualified class name of the module.</p>
+ </div></div>
+
+</div><h3 id="Dynamic_configuration">Dynamic configuration</h3><div class="text">
+
+ <p>JASPIC modules and configuration can be packaged within a WAR file with the
+ web application. The web application can then register the required JASPIC
+ configuration when it starts using the standard JASPIC APIs.</p>
+
+ <p>If parallel deployment is being used then dynamic configuration should not
+ be used. The JASPIC API assumes that a context path is unique for any given
+ host which is not the case when using parallel deployment. When using parallel
+ deployment, static JASPIC configuration should be used. This will require that
+ all versions of the application use the same JASPIC configuration.</p>
+
+</div><h3 id="3rd_party_modules">3rd party modules</h3><div class="text">
+
+ <p>This is not an exhaustive list. The Tomcat community welcomes contributions
+ that add to this section.</p>
+
+ <div class="subsection"><h4 id="Philip_Green_II's_module_for_Google_OAuth_2">Philip Green II's module for Google OAuth 2</h4><div class="text">
+
+ <p>The source code for this module along with the
+ <a href="https://github.com/phillipgreenii/google-oauth-2.0-serverauthmodule">documentation</a>
+ which includes details of the necessary Google API configuration is
+ available on GitHub.</p>
+
+ <p>A sample configuration for using this module with Tomcat would look like
+ this:</p>
+<div class="codeBox"><pre><code><jaspic-providers xmlns="https://tomcat.apache.org/xml"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="https://tomcat.apache.org/xml jaspic-providers.xsd"
+ version="1.0">
+ <provider name="google-oauth"
+ className="org.apache.catalina.authenticator.jaspic.SimpleAuthConfigProvider"
+ layer="HttpServlet"
+ appContext="Catalina/localhost /contextPath"
+ description="Google OAuth test">
+ <property name="org.apache.catalina.authenticator.jaspic.ServerAuthModule.1"
+ value="com.idmworks.security.google.GoogleOAuthServerAuthModule" />
+ <property name="oauth.clientid"
+ value="obtained-from-Google-console" />
+ <property name="oauth.clientsecret"
+ value="obtained-from-Google-console" />
+ <property name="ignore_missing_login_context"
+ value="true" />
+ </provider>
+</jaspic-providers></code></pre></div>
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/listeners.html b/web/tomcat/webapps/docs/config/listeners.html
new file mode 100644
index 0000000..f1687d2
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/listeners.html
@@ -0,0 +1,566 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The LifeCycle Listener Component</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The LifeCycle Listener Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Standard_Implementations">Standard Implementations</a><ol><li><a href="#APR_Lifecycle_Listener_-_org.apache.catalina.core.AprLifecycleListener">APR Lifecycle Listener - org.apache.catalina.core.AprLifecycleListener</a></li><li><a href="#Global_Resources_Lifecycle_Listener_-_org.apache.catalina.mbeans.GlobalResourcesLifecycleListener">Global Resources Lifecycle Listener - org.apache.catalina.mbeans.GlobalResourcesLifecycleListener</a></li><li><a href="#JNI_Library_Loading_Listener_-_org.apache.catalina.core.JniLifecycleListener">JNI Library Loading Listener - org.apache.catalina.core.JniLifecycleListener</a></li><li><a href="#JRE_Memory_Leak_Prevention_Listener_-_org.apache.catalina.core.JreMemoryLeakPreventionListener">JRE Memory Leak Prevention Listener - org.apache.catalina.core.JreMemoryLeakPreventionListener</a><ol><li><a href="#JreMemoryLeakPreventionListener_Examples">JreMemoryLeakPreventionListener Examples</a></li></ol></li><li><a href="#Security_Lifecycle_Listener_-_org.apache.catalina.security.SecurityListener">Security Lifecycle Listener - org.apache.catalina.security.SecurityListener</a></li><li><a href="#StoreConfig_Lifecycle_Listener_-_org.apache.catalina.storeconfig.StoreConfigLifecycleListener">StoreConfig Lifecycle Listener - org.apache.catalina.storeconfig.StoreConfigLifecycleListener</a></li><li><a href="#ThreadLocal_Leak_Prevention_Listener_-_org.apache.catalina.core.ThreadLocalLeakPreventionListener">ThreadLocal Leak Prevention Listener - org.apache.catalina.core.ThreadLocalLeakPreventionListener</a></li><li><a href="#UserConfig_-_org.apache.catalina.startup.UserConfig">UserConfig - org.apache.catalina.startup.UserConfig</a></li><li><a href="#Version_Logging_Lifecycle_Listener_-_org.apache.catalina.startup.VersionLoggerListener">Version Logging Lifecycle Listener - org.apache.catalina.startup.VersionLoggerListener</a></li></ol></li><li><a href="#Additional_Implementations">Additional Implementations</a><ol><li><a href="#System_property_replacement_-_org.apache.catalina.util.SystemPropertyReplacerListener">System property replacement - org.apache.catalina.util.SystemPropertyReplacerListener</a></li></ol></li><li><a href="#Deprecated_Implementations">Deprecated Implementations</a><ol><li><a href="#JMX_Remote_Lifecycle_Listener_-_org.apache.catalina.mbeans.JmxRemoteLifecycleListener">JMX Remote Lifecycle Listener - org.apache.catalina.mbeans.JmxRemoteLifecycleListener</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>A <strong>Listener</strong> element defines a component that performs
+ actions when specific events occur, usually Tomcat starting or Tomcat
+ stopping.</p>
+
+ <p>Listeners may be nested inside a <a href="server.html">Server</a>,
+ <a href="engine.html">Engine</a>, <a href="host.html">Host</a> or
+ <a href="context.html">Context</a>. Some Listeners are only intended to be
+ nested inside specific elements. These constraints are noted in the
+ documentation below.</p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>Listener</strong>
+ support the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.catalina.LifecycleListener</code>
+ interface.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+ <p>No element may be nested inside a <strong>Listener</strong>.</p>
+
+</div><h3 id="Standard_Implementations">Standard Implementations</h3><div class="text">
+
+ <p>Unlike most Catalina components, there are several standard
+ <strong>Listener</strong> implementations available. As a result,
+ the <code>className</code> attribute MUST be used to select the
+ implementation you wish to use.</p>
+
+ <div class="subsection"><h4 id="APR_Lifecycle_Listener_-_org.apache.catalina.core.AprLifecycleListener">APR Lifecycle Listener - org.apache.catalina.core.AprLifecycleListener</h4><div class="text">
+
+ <p>The <strong>APR Lifecycle Listener</strong> checks for the presence of
+ the APR/native library and loads the library if it is present. For more
+ information see the <a href="../apr.html">APR/native guide</a>.</p>
+
+ <p>This listener must only be nested within <a href="server.html">Server</a>
+ elements.</p>
+
+ <p>The following additional attributes are supported by the <strong>APR
+ Lifecycle Listener</strong>:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">SSLEngine</code></td><td>
+ <p>Name of the SSLEngine to use. <code>off</code>: do not use SSL,
+ <code>on</code>: use SSL but no specific ENGINE.</p>
+ <p>The default value is <b>on</b>. This initializes the
+ native SSL engine, which must be enabled in the APR/native connector by
+ the use of the <code>SSLEnabled</code> attribute.</p>
+ <p>See the <a href="http://www.openssl.org/">Official OpenSSL website</a>
+ for more details on supported SSL hardware engines and manufacturers.
+ </p>
+ </td></tr><tr><td><code class="attributeName">SSLRandomSeed</code></td><td>
+ <p>Entropy source used to seed the SSLEngine's PRNG. The default value
+ is <code>builtin</code>. On development systems, you may want to set
+ this to <code>/dev/urandom</code> to allow quicker start times.</p>
+ </td></tr><tr><td><code class="attributeName">FIPSMode</code></td><td>
+ <p>Set to <code>on</code> to request that OpenSSL be in FIPS mode
+ (if OpenSSL is already in FIPS mode, it will remain in FIPS mode).
+ Set to <code>enter</code> to force OpenSSL to enter FIPS mode (an error
+ will occur if OpenSSL is already in FIPS mode).
+ Set to <code>require</code> to require that OpenSSL <i>already</i> be
+ in FIPS mode (an error will occur if OpenSSL is not already in FIPS
+ mode).</p>
+ <p>FIPS mode <em>requires you to have a FIPS-capable OpenSSL library which
+ you must build yourself</em>.
+ If this attribute is set to any of the above values, the <b>SSLEngine</b>
+ must be enabled as well.</p>
+ <p>The default value is <code>off</code>.</p>
+ </td></tr><tr><td><code class="attributeName">useAprConnector</code></td><td>
+ <p>This attribute controls the auto-selection of the connector
+ implementation. When the <strong>protocol</strong> is specified as
+ <code>HTTP/1.1</code> or <code>AJP/1.3</code> then if this attribute is
+ <code>true</code> the APR/native connector will be used but if this
+ attribute is false the NIO connector will be used.</p>
+ </td></tr><tr><td><code class="attributeName">useOpenSSL</code></td><td>
+ <p>This attribute controls the auto-selection of the OpenSSL JSSE
+ implementation. The default is <code>true</code> which will use OpenSSL
+ if the native library is available and a NIO or NIO2 connector is used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Global_Resources_Lifecycle_Listener_-_org.apache.catalina.mbeans.GlobalResourcesLifecycleListener">Global Resources Lifecycle Listener - org.apache.catalina.mbeans.GlobalResourcesLifecycleListener</h4><div class="text">
+
+ <p>The <strong>Global Resources Lifecycle Listener</strong> initializes the
+ Global JNDI resources defined in server.xml as part of the <a href="globalresources.html">Global Resources</a> element. Without this
+ listener, none of the Global Resources will be available.</p>
+
+ <p>This listener must only be nested within <a href="server.html">Server</a>
+ elements.</p>
+
+ <p>No additional attributes are supported by the <strong>Global Resources
+ Lifecycle Listener</strong>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="JNI_Library_Loading_Listener_-_org.apache.catalina.core.JniLifecycleListener">JNI Library Loading Listener - org.apache.catalina.core.JniLifecycleListener</h4><div class="text">
+
+ <p>The <strong>JNI Library Loading Listener</strong> makes it possible
+ for multiple Webapps to use a native library, by loading the native
+ library using a shared class loader (typically the Common class loader but
+ may vary in some configurations)</p>
+
+ <p>The listener supports two mutually exclusive attributes, so one of them must be used, but you can not use both together:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">libraryName</code></td><td>
+ <p>The name of the native library, as defined in
+ <code>java.lang.System.loadLibrary()</code>
+ </p>
+ </td></tr><tr><td><code class="attributeName">libraryPath</code></td><td>
+ <p>The absolute path of the native library, as defined in
+ <code>java.lang.System.load()</code>
+ </p>
+ </td></tr></table>
+ </div></div>
+
+ <div class="subsection"><h4 id="JRE_Memory_Leak_Prevention_Listener_-_org.apache.catalina.core.JreMemoryLeakPreventionListener">JRE Memory Leak Prevention Listener - org.apache.catalina.core.JreMemoryLeakPreventionListener</h4><div class="text">
+
+ <p>The <strong>JRE Memory Leak Prevention Listener</strong> provides
+ work-arounds for known places where the Java Runtime environment uses
+ the context class loader to load a singleton as this will cause a memory
+ leak if a web application class loader happens to be the context class
+ loader at the time. The work-around is to initialise these singletons when
+ this listener starts as Tomcat's common class loader is the context class
+ loader at that time. It also provides work-arounds for known issues that
+ can result in locked JAR files.</p>
+
+ <p>This listener must only be nested within <a href="server.html">Server</a>
+ elements.</p>
+
+ <p>The following additional attributes are supported by the <strong>JRE
+ Memory Leak Prevention Listener</strong>:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">appContextProtection</code></td><td>
+ <p>Enables protection so that calls to
+ <code>sun.awt.AppContext.getAppContext()</code> triggered by a web
+ application do not result in a memory leak. Note that enabling this
+ protection will trigger a requirement for a graphical environment unless
+ Java is started in head-less mode. The default is <code>false</code>.
+ This protection is disabled if running on Java 8 onwards since the leak
+ has been fixed for Java 8 onwards.
+ </p>
+ </td></tr><tr><td><code class="attributeName">AWTThreadProtection</code></td><td>
+ <p>Enables protection so that calls to
+ <code>java.awt.Toolkit.getDefaultToolkit()</code> triggered by a web
+ application do not result in a memory leak.
+ Defaults to <code>false</code> because an AWT thread is launched. This
+ protection is disabled if running on Java 9 onwards since the leak has
+ been fixed for Java 9 onwards.</p>
+ </td></tr><tr><td><code class="attributeName">classesToInitialize</code></td><td>
+ <p>List of comma-separated fully qualified class names to load and initialize
+ during the startup of this Listener. This allows to pre-load classes that are
+ known to provoke classloader leaks if they are loaded during a request
+ processing. Non-JRE classes may be referenced, like
+ <code>oracle.jdbc.driver.OracleTimeoutThreadPerVM</code>.
+ The default value is empty, but specific JRE classes are loaded by other leak
+ protection features managed by other attributes of this Listener.</p>
+ </td></tr><tr><td><code class="attributeName">driverManagerProtection</code></td><td>
+ <p>The first use of <code>java.sql.DriverManager</code> will trigger the
+ loading of JDBC Drivers visible to the current class loader and its
+ parents. The web application level memory leak protection can take care
+ of this in most cases but triggering the loading here has fewer
+ side-effects. The default is <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">forkJoinCommonPoolProtection</code></td><td>
+ <p>Enables protection so the threads created for
+ <code>ForkJoinPool.commonPool()</code> do not result in a memory leak.
+ The protection is enabled by setting the
+ <code>java.util.concurrent.ForkJoinPool.common.threadFactory</code>
+ system property. If this property is set when Tomcat starts, Tomcat will
+ not over-ride it even if this protection is explicitly enabled. The
+ default is <code>true</code>. This protection is only used when running
+ on Java 8. The common pool does not exist in earlier versions and the
+ leak has been fixed for Java 9 onwards.</p>
+ </td></tr><tr><td><code class="attributeName">gcDaemonProtection</code></td><td>
+ <p>Enables protection so that calls to
+ <code>sun.misc.GC.requestLatency(long)</code> triggered by a web
+ application do not result in a memory leak. Use of RMI is likely to
+ trigger a call to this method. A side effect of enabling this protection
+ is the creation of a thread named "GC Daemon". The protection uses
+ reflection to access internal Sun classes and may generate errors on
+ startup on non-Sun JVMs. The default is <code>true</code>. This
+ protection is disabled if running on Java 9 onwards since the leak has
+ been fixed for Java 9 onwards.</p>
+ </td></tr><tr><td><code class="attributeName">ldapPoolProtection</code></td><td>
+ <p>Enables protection so that the PoolCleaner thread started by
+ <code>com.sun.jndi.ldap.LdapPoolManager</code> does not result in a
+ memory leak. The thread is started the first time the
+ <code>LdapPoolManager</code> class is used if the system property
+ <code>com.sun.jndi.ldap.connect.pool.timeout</code> is set to a value
+ greater than 0. Without this protection, if a web application uses this
+ class the PoolCleaner thread will be configured with the thread's
+ context class loader set to the web application class loader which in
+ turn will trigger a memory leak on reload. Defaults to
+ <code>true</code>. This protection is disabled if running on Java 9
+ onwards since the leak has been fixed for Java 9 onwards.</p>
+ </td></tr><tr><td><code class="attributeName">securityLoginConfigurationProtection</code></td><td>
+ <p>Enables protection so that usage of the
+ <code>javax.security.auth.login.Configuration</code> class by a web
+ application does not provoke a memory leak. The first access of this
+ class will trigger the initializer that will retain a static reference
+ to the context class loader. The protection loads the class with the
+ system class loader to ensure that the static initializer is not
+ triggered by a web application. Defaults to <code>true</code>. This
+ protection is disabled if running on Java 8 onwards since the leak has
+ been fixed for Java 8 onwards.</p>
+ </td></tr><tr><td><code class="attributeName">securityPolicyProtection</code></td><td>
+ <p>Enables protection so that usage of the deprecated
+ <code>javax.security.auth.Policy</code> class by a web application does
+ not result in a memory leak. The first access of this class will trigger
+ the static initializer that will retain a static reference to the
+ context class loader. The protection calls the <code>getPolicy()</code>
+ method of this class to ensure that the static initializer is not
+ triggered by a web application. Defaults to <code>true</code>.</p>
+ <p>Note: The underlying leak has been fixed in Java 7 update 51 onwards
+ and Java 8 onwards. This protection is therefor disabled if running on
+ Java 8 onwards.</p>
+ </td></tr><tr><td><code class="attributeName">tokenPollerProtection</code></td><td>
+ <p>Enables protection so that any token poller thread initialized by
+ <code>sun.security.pkcs11.SunPKCS11.initToken()</code> does not
+ result in a memory leak. The thread is started depending on various
+ conditions as part of the initialization of the Java Cryptography
+ Architecture. Without the protection this can happen during Webapp
+ deployment when the MessageDigest for generating session IDs is
+ initialized. As a result the thread has the Webapp class loader as its
+ thread context class loader. Enabling the protection initializes JCA
+ early during Tomcat startup. Defaults to <code>true</code>. This
+ protection is disabled if running on Java 9 onwards since the leak has
+ been fixed for Java 9 onwards.</p>
+ </td></tr><tr><td><code class="attributeName">urlCacheProtection</code></td><td>
+ <p>Enables protection so that reading resources from JAR files using
+ <code>java.net.URLConnection</code>s does not result in the JAR file
+ being locked. Note that enabling this protection disables caching by
+ default for all resources obtained via
+ <code>java.net.URLConnection</code>s. Caching may be re-enabled on a
+ case by case basis as required. Defaults to <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">xmlParsingProtection</code></td><td>
+ <p>Enables protection so that parsing XML files within a web application
+ does not result in a memory leak. Note that memory profilers may not
+ display the GC root associated with this leak making it particularly
+ hard to diagnose. Defaults to <code>true</code>. This protection is
+ disabled if running on Java 9 onwards since the leak has been fixed for
+ Java 9 onwards.</p>
+ </td></tr></table>
+
+ <div class="subsection"><h4 id="JreMemoryLeakPreventionListener_Examples">JreMemoryLeakPreventionListener Examples</h4><div class="text">
+
+ <p>The following is an example of how to configure the
+ <code>classesToInitialize</code> attribute of this listener.</p>
+
+ <p>If this listener was configured in server.xml as:</p>
+
+ <div class="codeBox"><pre><code> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"
+ classesToInitialize="oracle.jdbc.driver.OracleTimeoutThreadPerVM" /></code></pre></div>
+
+ <p>then the <code>OracleTimeoutThreadPerVM</code> class would be loaded
+ and initialized during listener startup instead of during request
+ processing.</p>
+
+ </div></div>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Security_Lifecycle_Listener_-_org.apache.catalina.security.SecurityListener">Security Lifecycle Listener - org.apache.catalina.security.SecurityListener</h4><div class="text">
+
+ <p>The <strong>Security Lifecycle Listener</strong> performs a number of
+ security checks when Tomcat starts and prevents Tomcat from starting if they
+ fail. The listener is not enabled by default. To enabled it uncomment the
+ listener in $CATALINA_BASE/conf/server.xml. For Tomcat versions before 8.5.30,
+ if the operating system supports umask then the line in
+ $CATALINA_HOME/bin/catalina.sh that obtains the umask also needs to be
+ uncommented. For Tomcat 8.5.30 and later, the umask is automatically
+ passed-into Tomcat.</p>
+
+ <p>This listener must only be nested within <a href="server.html">Server</a>
+ elements.</p>
+
+ <p>The following additional attributes are supported by the <strong>Security
+ Lifecycle Listener</strong>:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">checkedOsUsers</code></td><td>
+ <p>A comma separated list of OS users that must not be used to start
+ Tomcat. If not specified, the default value of <b>root</b> is used. To
+ disable this check, set the attribute to the empty string. Usernames
+ are checked in a case-insensitive manner.</p>
+ </td></tr><tr><td><code class="attributeName">minimumUmask</code></td><td>
+ <p>The least restrictive umask that must be configured before Tomcat
+ will start. If not specified, the default value of <b>0007</b> is used.
+ To disable this check, set the attribute to the empty string. The check
+ is not performed on Windows platforms.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="StoreConfig_Lifecycle_Listener_-_org.apache.catalina.storeconfig.StoreConfigLifecycleListener">StoreConfig Lifecycle Listener - org.apache.catalina.storeconfig.StoreConfigLifecycleListener</h4><div class="text">
+
+ <p>The <strong>StoreConfig Lifecycle Listener</strong> configures a
+ StoreConfig MBean that may be used to save the current server configuration
+ in server.xml or the current configuration for a web application in a
+ context.xml file.</p>
+
+ <p>This listener must only be nested within <a href="server.html">Server</a>
+ elements.</p>
+
+ <p>The following additional attributes are supported by the
+ <strong>StoreConfig Lifecycle Listener</strong>:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">storeConfigClass</code></td><td>
+ <p>The name of the <code>IStoreConfig</code> implementation to use. If
+ not specified the default of
+ <code>org.apache.catalina.storeconfig.StoreConfig</code> will be
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">storeRegistry</code></td><td>
+ <p>The URL of the configuration file that configures how the
+ <code>IStoreConfig</code> is to save the configuration. If not specified
+ the built in resource
+ <code>/org/apache/catalina/storeconfig/server-registry.xml</code> will
+ be used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="ThreadLocal_Leak_Prevention_Listener_-_org.apache.catalina.core.ThreadLocalLeakPreventionListener">ThreadLocal Leak Prevention Listener - org.apache.catalina.core.ThreadLocalLeakPreventionListener</h4><div class="text">
+
+ <p>The <strong>ThreadLocal Leak Prevention Listener</strong> triggers the
+ renewal of threads in <a href="executor.html">Executor</a> pools when a
+ <a href="context.html">Context</a> is being stopped to avoid thread-local
+ related memory leaks. Active threads will be renewed one by one when they
+ come back to the pool after executing their task. The renewal happens
+ only for contexts that have their <code>renewThreadsWhenStoppingContext</code>
+ attribute set to <code>true</code>.</p>
+
+ <p>This listener must only be nested within <a href="server.html">Server</a>
+ elements.</p>
+
+ <p>No additional attributes are supported by the <strong>ThreadLocal Leak
+ Prevention Listener</strong>.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="UserConfig_-_org.apache.catalina.startup.UserConfig">UserConfig - org.apache.catalina.startup.UserConfig</h4><div class="text">
+
+ <p>The <strong>UserConfig</strong> provides feature of User Web Applications.
+ User Web Applications map a request URI starting with a tilde character ("~")
+ and a username to a directory (commonly named public_html) in that user's
+ home directory on the server.</p>
+
+ <p>See the <a href="host.html#User_Web_Applications">User Web Applications</a>
+ special feature on the <strong>Host</strong> element for more information.</p>
+
+ <p>The following additional attributes are supported by the
+ <strong>UserConfig</strong>:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">directoryName</code></td><td>
+ <p>The directory name to be searched for within each user home directory.
+ The default is <code>public_html</code>.</p>
+ </td></tr><tr><td><code class="attributeName">userClass</code></td><td>
+ <p>The class name of the user database class.
+ There are currently two user database, the
+ <code>org.apache.catalina.startup.PasswdUserDatabase</code> is used on a
+ Unix system that uses the /etc/passwd file to identify valid users.
+ The <code>org.apache.catalina.startup.HomesUserDatabase</code> is used on
+ a server where /etc/passwd is not in use. HomesUserDatabase deploy all
+ directories found in a specified base directory.</p>
+ </td></tr><tr><td><code class="attributeName">homeBase</code></td><td>
+ <p>The base directory containing user home directories. This is effective
+ only when <code>org.apache.catalina.startup.HomesUserDatabase</code> is
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">allow</code></td><td>
+ <p>A regular expression defining user who deployment is allowed. If this
+ attribute is specified, the user to deploy must match for this pattern.
+ If this attribute is not specified, all users will be deployed unless the
+ user matches a deny pattern.</p>
+ </td></tr><tr><td><code class="attributeName">deny</code></td><td>
+ <p>A regular expression defining user who deployment is denied. If this
+ attribute is specified, the user to deploy must not match for this
+ pattern. If this attribute is not specified, deployment of user will be
+ governed by a allow attribute.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Version_Logging_Lifecycle_Listener_-_org.apache.catalina.startup.VersionLoggerListener">Version Logging Lifecycle Listener - org.apache.catalina.startup.VersionLoggerListener</h4><div class="text">
+
+ <p>The <strong>Version Logging Lifecycle Listener</strong> logs Tomcat, Java
+ and operating system information when Tomcat starts.</p>
+
+ <p>This listener must only be nested within <a href="server.html">Server</a>
+ elements and should be the first listener defined.</p>
+
+ <p>The following additional attributes are supported by the <strong>Version
+ Logging Lifecycle Listener</strong>:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">logArgs</code></td><td>
+ <p>If <code>true</code>, the command line arguments passed to Java when
+ Tomcat started will be logged. If not specified, the default value of
+ <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">logEnv</code></td><td>
+ <p>If <code>true</code>, the current environment variables when Tomcat
+ starts will be logged. If not specified, the default value of
+ <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">logProps</code></td><td>
+ <p>If <code>true</code>, the current Java system properties will be
+ logged. If not specified, the default value of
+ <code>false</code> will be used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="Additional_Implementations">Additional Implementations</h3><div class="text">
+
+ <div class="subsection"><h4 id="System_property_replacement_-_org.apache.catalina.util.SystemPropertyReplacerListener">System property replacement - org.apache.catalina.util.SystemPropertyReplacerListener</h4><div class="text">
+
+ <p>This listener performs system property replacement using the property
+ source configured on the digester. When <code>${parameter}</code>
+ denoted parameters are found in the values of system properties,
+ the property source will be invoked to attempt to replace it.</p>
+
+ </div></div>
+
+</div><h3 id="Deprecated_Implementations">Deprecated Implementations</h3><div class="text">
+
+ <div class="subsection"><h4 id="JMX_Remote_Lifecycle_Listener_-_org.apache.catalina.mbeans.JmxRemoteLifecycleListener">JMX Remote Lifecycle Listener - org.apache.catalina.mbeans.JmxRemoteLifecycleListener</h4><div class="text">
+
+ <p><strong>This listener is now deprecated as the features it provides are
+ now available in the remote JMX capability included with the JRE. This
+ listener will be removed in Tomcat 10 and may be removed from Tomcat 8 some
+ time after 2020-12-31.</strong></p>
+
+ <p>This listener requires <code>catalina-jmx-remote.jar</code> to be placed
+ in <code>$CATALINA_HOME/lib</code>. This jar may be found in the extras
+ directory of the binary download area.</p>
+
+ <p>The <strong>JMX Remote Lifecycle Listener</strong> fixes the ports used by
+ the JMX/RMI Server making things much simpler if you need to connect
+ jconsole or a similar tool to a remote Tomcat instance that is running
+ behind a firewall. Only these ports are configured via the listener. The
+ remainder of the configuration is via the standard system properties for
+ configuring JMX. For further information on configuring JMX see
+ <a href="http://docs.oracle.com/javase/6/docs/technotes/guides/management/agent.html">
+ Monitoring and Management Using JMX</a> included with the Java SDK
+ documentation.</p>
+
+ <p>This listener must only be nested within a <a href="server.html">Server</a>
+ element.</p>
+
+ <p>The following additional attributes are supported by the <strong>JMX Remote
+ Lifecycle Listener</strong>:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">rmiRegistryPortPlatform</code></strong></td><td>
+ <p>The port to be used by the JMX/RMI registry for the Platform MBeans.
+ This replaces the use of the
+ <code>com.sun.management.jmxremote.port</code> system property that
+ should not be set when using this listener.</p>
+ </td></tr><tr><td><strong><code class="attributeName">rmiServerPortPlatform</code></strong></td><td>
+ <p>The port to be used by the Platform JMX/RMI server.</p>
+ </td></tr><tr><td><code class="attributeName">rmiBindAddress</code></td><td>
+ <p>The address of the interface to be used by JMX/RMI server.</p>
+ </td></tr><tr><td><code class="attributeName">useLocalPorts</code></td><td>
+ <p>Should any clients using these ports be forced to use local ports to
+ connect to the JMX/RMI server. This is useful when tunnelling
+ connections over SSH or similar. Defaults to <code>false</code>.</p>
+ </td></tr></table>
+
+ <h3>Using file-based Authentication and Authorisation</h3>
+
+ <p>If this listener was configured in server.xml as:</p>
+ <div class="codeBox"><pre><code> <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
+ rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" /></code></pre></div>
+ <p>with the following system properties set (e.g. in setenv.sh):</p>
+ <div class="codeBox"><pre><code> -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password
+ -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access
+ -Dcom.sun.management.jmxremote.ssl=false</code></pre></div>
+ <p>$CATALINA_BASE/conf/jmxremote.password containing:</p>
+ <div class="codeBox"><pre><code>admin letmein</code></pre></div>
+ <p>$CATALINA_BASE/conf/jmxremote.access containing:</p>
+ <div class="codeBox"><pre><code>admin readwrite</code></pre></div>
+ <p>then opening ports 10001 (RMI Registry) and 10002 (JMX/RMI Server) in your
+ firewall would enable jconsole to connect to a Tomcat instance running
+ behind a firewall using a connection string of the form:</p>
+ <div class="codeBox"><pre><code>service:jmx:rmi://<hostname>:10002/jndi/rmi://<hostname>:10001/jmxrmi</code></pre></div>
+ <p>
+ with a user name of <code>admin</code> and a password of
+ <code>letmein</code>.
+ </p>
+
+ <h3>Using JAAS</h3>
+
+ <p>If we use the following system properties instead:</p>
+ <div class="codeBox"><pre><code> -Dcom.sun.management.jmxremote.login.config=Tomcat
+ -Djava.security.auth.login.config=$CATALINA_BASE/conf/login.config
+ -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access
+ -Dcom.sun.management.jmxremote.ssl=false</code></pre></div>
+ <p>$CATALINA_BASE/conf/login.config containing your choice of JAAS LoginModule implementation, for example:</p>
+ <div class="codeBox"><pre><code> Tomcat { /* should match to the com.sun.management.jmxremote.login.config property */
+
+ /* for illustration purposes only */
+ com.sun.security.auth.module.LdapLoginModule REQUIRED
+ userProvider="ldap://ldap-svr/ou=people,dc=example,dc=com"
+ userFilter="(&(uid={USERNAME})(objectClass=inetOrgPerson))"
+ authzIdentity="admin"
+ debug=true;
+ };</code></pre></div>
+ <p>$CATALINA_BASE/conf/jmxremote.access containing:</p>
+ <div class="codeBox"><pre><code>admin readwrite</code></pre></div>
+ <p>
+ then we would need to provide LDAP credentials instead.
+ </p>
+
+ <p><strong>Note that the examples above do not use SSL. JMX access should
+ be considered equivalent to administrative access and secured accordingly.
+ </strong></p>
+
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/loader.html b/web/tomcat/webapps/docs/config/loader.html
new file mode 100644
index 0000000..4c8d0f7
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/loader.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Loader Component</title><meta name="author" content="Craig R. McClanahan"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Loader Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a><ol><li><a href="#Logging">Logging</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The <strong>Loader</strong> element represents the <em>web
+ application class loader</em> that will be used to load Java
+ classes and resources for your web application. Such
+ a class loader must follow the requirements of the Servlet
+ Specification, and load classes from the following locations:</p>
+ <ul>
+ <li>From the <code>/WEB-INF/classes</code> directory inside your
+ web application.</li>
+ <li>From JAR files in the <code>/WEB-INF/lib</code> directory
+ inside your web application.</li>
+ <li>From resources made available by Catalina to all web
+ applications globally.</li>
+ </ul>
+
+ <p>A Loader element MAY be nested inside a <a href="context.html">Context</a>
+ component. If it is not included, a default Loader configuration will be
+ created automatically, which is sufficient for most requirements.</p>
+
+ <p>For a more in-depth description of the class loader hierarchy
+ that is implemented by Catalina, see <a href="../class-loader-howto.html">the ClassLoader HowTo</a>.</p>
+
+ <p><em>The description below uses the variable name $CATALINA_BASE to refer the
+ base directory against which most relative paths are resolved. If you have
+ not configured Tomcat for multiple instances by setting a CATALINA_BASE
+ directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME,
+ the directory into which you have installed Tomcat.</em></p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>Loader</strong>
+ support the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">className</code></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.catalina.Loader</code> interface.
+ If not specified, the standard value (defined below) will be used.</p>
+ </td></tr><tr><td><code class="attributeName">delegate</code></td><td>
+ <p>Set to <code>true</code> if you want the class loader to follow
+ the standard Java2 delegation model, and attempt to load classes from
+ parent class loaders <strong>before</strong> looking inside the web
+ application. Set to <code>false</code> (the default) to have the
+ class loader look inside the web application first, before asking
+ parent class loaders to find requested classes or resources.</p>
+ </td></tr><tr><td><code class="attributeName">reloadable</code></td><td>
+ <p>Set to <code>true</code> if you want Catalina to monitor classes in
+ <code>/WEB-INF/classes/</code> and <code>/WEB-INF/lib</code> for
+ changes, and automatically reload the web application if a change
+ is detected. This feature is very useful during application
+ development, but it requires significant runtime overhead and is
+ not recommended for use on deployed production applications. You
+ can use the <a href="../manager-howto.html">Manager</a> web
+ application, however, to trigger reloads of deployed applications
+ on demand.</p>
+
+ <p><strong>NOTE</strong> - The value for this property will be
+ inherited from the <code>reloadable</code> attribute you set on
+ the surrounding <a href="context.html">Context</a> component,
+ and any value you explicitly set here will be replaced.</p>
+ </td></tr></table>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text">
+
+ <p>The standard implementation of <strong>Loader</strong> is
+ <strong>org.apache.catalina.loader.WebappLoader</strong>.
+ It supports the following additional attributes (in addition to the
+ common attributes listed above):</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">loaderClass</code></td><td>
+ <p>Java class name of the <code>java.lang.ClassLoader</code>
+ implementation class to use. Custom implementations must extend
+ <code>org.apache.catalina.loader.WebappClassLoaderBase</code>.
+ </p>
+
+ <p>If not specified, the default value is
+ <code>org.apache.catalina.loader.ParallelWebappClassLoader</code>. The
+ default <strong>loaderClass</strong> is parallel capable, which
+ means that multiple threads may load difference classes in parallel.
+ A non-parallel capable <strong>loaderClass</strong> is available and can
+ be used by specifying
+ <code>org.apache.catalina.loader.WebappClassLoader</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+ <p>No components may be nested inside a <strong>Loader</strong> element.</p>
+
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+
+ <div class="subsection"><h4 id="Logging">Logging</h4><div class="text">
+
+ <p>A loader is associated with the log category based on its classname.</p>
+
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/manager.html b/web/tomcat/webapps/docs/config/manager.html
new file mode 100644
index 0000000..1759b73
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/manager.html
@@ -0,0 +1,466 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Manager Component</title><meta name="author" content="Craig R. McClanahan"><meta name="author" content="Yoav Shapira"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Manager Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a><ol><li><a href="#Persistence_Across_Restarts">Persistence Across Restarts</a></li><li><a href="#Disable_Session_Persistence">Disable Session Persistence</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The <strong>Manager</strong> element represents the <em>session
+ manager</em> that will be used to create and maintain HTTP sessions
+ as requested by the associated web application.</p>
+
+ <p>A Manager element MAY be nested inside a
+ <a href="context.html">Context</a> component. If it is not included,
+ a default Manager configuration will be created automatically, which
+ is sufficient for most requirements, — see
+ <em>Standard Manager Implementation</em> below for the details
+ of this configuration.</p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>Manager</strong>
+ support the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">className</code></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.catalina.Manager</code> interface.
+ If not specified, the standard value (defined below) will be used.</p>
+ </td></tr><tr><td><code class="attributeName">maxActiveSessions</code></td><td>
+ <p>The maximum number of active sessions that will be created by
+ this Manager, or <code>-1</code> (the default) for no limit.</p>
+
+ <p>When the limit is reached, any attempt to create a new session
+ (e.g. with <code>HttpServletRequest.getSession()</code> call)
+ will fail with an <code>IllegalStateException</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text">
+
+ <p>Tomcat provides two standard implementations of <strong>Manager</strong>
+ for use — the default one stores active sessions, while the optional one
+ stores active sessions that have been swapped out (in addition to saving
+ sessions across a restart of Tomcat) in a storage location that is selected
+ via the use of an appropriate <strong>Store</strong> nested element.</p>
+
+ <h3>Standard Manager Implementation</h3>
+
+ <p>The standard implementation of <strong>Manager</strong> is
+ <strong>org.apache.catalina.session.StandardManager</strong>.
+ It supports the following additional attributes (in addition to the
+ common attributes listed above):</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">pathname</code></td><td>
+ <p>Absolute or relative (to the work directory for this Context)
+ pathname of the file in which session state will be preserved
+ across application restarts, if possible. The default is
+ "SESSIONS.ser".<br>See
+ <a href="#Persistence_Across_Restarts">Persistence Across Restarts</a>
+ for more information. This persistence may be
+ disabled by setting this attribute to an empty string.</p>
+ </td></tr><tr><td><code class="attributeName">persistAuthentication</code></td><td>
+ <p>Should authentication information be included when session state is
+ preserved across application restarts? If <code>true</code>, the session's
+ authentication is preserved so that the session remains authenticated
+ after the application has been restarted. If not specified, the default
+ value of <code>false</code> will be used.<br>See
+ <a href="#Persistence_Across_Restarts">Persistence Across Restarts</a>
+ for more information.</p>
+
+ <p>Please note that the session's <code>Principal</code> class as well
+ as its descendant classes are all subject to the
+ <strong>sessionAttributeValueClassNameFilter</strong>. If such a filter
+ is specified or a <code>SecurityManager</code> is enabled, the names of
+ the <code>Principal</code> class and descendant classes must match that
+ filter pattern in order to be restored.</p>
+ </td></tr><tr><td><code class="attributeName">processExpiresFrequency</code></td><td>
+ <p>Frequency of the session expiration, and related manager operations.
+ Manager operations will be done once for the specified amount of
+ backgroundProcess calls (i.e., the lower the amount, the more often the
+ checks will occur). The minimum value is 1, and the default value is 6.
+ </p>
+ </td></tr><tr><td><code class="attributeName">secureRandomClass</code></td><td>
+ <p>Name of the Java class that extends
+ <code>java.security.SecureRandom</code> to use to generate session IDs.
+ If not specified, the default value is
+ <code>java.security.SecureRandom</code>.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomProvider</code></td><td>
+ <p>Name of the provider to use to create the
+ <code>java.security.SecureRandom</code> instances that generate session
+ IDs. If an invalid algorithm and/or provider is specified, the Manager
+ will use the platform default provider and the default algorithm. If not
+ specified, the platform default provider will be used.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomAlgorithm</code></td><td>
+ <p>Name of the algorithm to use to create the
+ <code>java.security.SecureRandom</code> instances that generate session
+ IDs. If an invalid algorithm and/or provider is specified, the Manager
+ will use the platform default provider and the default algorithm. If not
+ specified, the default algorithm of SHA1PRNG will be used. If the
+ default algorithm is not supported, the platform default will be used.
+ To specify that the platform default should be used, do not set the
+ secureRandomProvider attribute and set this attribute to the empty
+ string.</p>
+ </td></tr><tr><td><code class="attributeName">sessionAttributeNameFilter</code></td><td>
+ <p>A regular expression used to filter which session attributes will be
+ distributed. An attribute will only be distributed if its name matches
+ this pattern. If the pattern is zero length or <code>null</code>, all
+ attributes are eligible for distribution. The pattern is anchored so the
+ session attribute name must fully match the pattern. As an example, the
+ value <code>(userName|sessionHistory)</code> will only distribute the
+ two session attributes named <code>userName</code> and
+ <code>sessionHistory</code>. If not specified, the default value of
+ <code>null</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">sessionAttributeValueClassNameFilter</code></td><td>
+ <p>A regular expression used to filter which session attributes will be
+ distributed. An attribute will only be distributed if the implementation
+ class name of the value matches this pattern. If the pattern is zero
+ length or <code>null</code>, all attributes are eligible for
+ distribution. The pattern is anchored so the fully qualified class name
+ must fully match the pattern. If not specified, the default value of
+ <code>null</code> will be used unless a <code>SecurityManager</code> is
+ enabled in which case the default will be
+ <code>java\\.lang\\.(?:Boolean|Integer|Long|Number|String)|org\\.apache\\.catalina\\.realm\\.GenericPrincipal\\$SerializablePrincipal|\\[Ljava.lang.String;</code>.</p>
+ </td></tr><tr><td><code class="attributeName">warnOnSessionAttributeFilterFailure</code></td><td>
+ <p>If <strong>sessionAttributeNameFilter</strong> or
+ <strong>sessionAttributeValueClassNameFilter</strong> blocks an
+ attribute, should this be logged at <code>WARN</code> level? If
+ <code>WARN</code> level logging is disabled then it will be logged at
+ <code>DEBUG</code>. The default value of this attribute is
+ <code>false</code> unless a <code>SecurityManager</code> is enabled in
+ which case the default will be <code>true</code>.</p>
+ </td></tr></table>
+
+ <h3>Persistent Manager Implementation</h3>
+
+ <p><strong>NOTE:</strong> You must set either the
+ <code>org.apache.catalina.session.StandardSession.ACTIVITY_CHECK</code> or
+ <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code>
+ <a href="systemprops.html">system properties</a> to <code>true</code> for
+ the persistent manager to work correctly.</p>
+
+ <p>The persistent implementation of <strong>Manager</strong> is
+ <strong>org.apache.catalina.session.PersistentManager</strong>. In
+ addition to the usual operations of creating and deleting sessions, a
+ <code>PersistentManager</code> has the capability to swap active (but
+ idle) sessions out to a persistent storage mechanism, as well as to save
+ all sessions across a normal restart of Tomcat. The actual persistent
+ storage mechanism used is selected by your choice of a
+ <strong>Store</strong> element nested inside the <strong>Manager</strong>
+ element - this is required for use of <code>PersistentManager</code>.</p>
+
+ <p>This implementation of Manager supports the following attributes in
+ addition to the <a href="#Common_Attributes">Common Attributes</a>
+ described earlier.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>It has the same meaning as described in the
+ <a href="#Common_Attributes">Common Attributes</a> above.
+ You <strong>must</strong> specify
+ <code>org.apache.catalina.session.PersistentManager</code> to use
+ this manager implementation.</p>
+ </td></tr><tr><td><code class="attributeName">maxIdleBackup</code></td><td>
+ <p>The time interval (in seconds) since the last access to a session
+ before it is eligible for being persisted to the session store, or
+ <code>-1</code> to disable this feature. By default, this feature is
+ disabled.</p>
+ </td></tr><tr><td><code class="attributeName">maxIdleSwap</code></td><td>
+ <p>The maximum time a session may be idle before it is eligible to be
+ swapped to disk due to inactivity. Setting this to <code>-1</code> means
+ sessions should not be swapped out just because of inactivity. If this
+ feature is enabled, the time interval specified here should be equal to
+ or longer than the value specified for <code>maxIdleBackup</code>. By
+ default, this feature is disabled.</p>
+ </td></tr><tr><td><code class="attributeName">minIdleSwap</code></td><td>
+ <p>The minimum time in seconds a session must be idle before it is
+ eligible to be swapped to disk to keep the active session count below
+ maxActiveSessions. Setting to <code>-1</code> means sessions will not be
+ swapped out to keep the active session count down. If specified, this
+ value should be less than that specified by <code>maxIdleSwap</code>.
+ By default, this value is set to <code>-1</code>.</p>
+ </td></tr><tr><td><code class="attributeName">persistAuthentication</code></td><td>
+ <p>Should authentication information be included when sessions are
+ swapped out to persistent storage? If <code>true</code>, the session's
+ authentication is preserved so that the session remains authenticated
+ after being reloaded (swapped in) from persistent storage. If not
+ specified, the default value of <code>false</code> will be used.</p>
+
+ <p>Please note that the session's <code>Principal</code> class as well
+ as its descendant classes are all subject to the
+ <strong>sessionAttributeValueClassNameFilter</strong>. If such a filter
+ is specified or a <code>SecurityManager</code> is enabled, the names of
+ the <code>Principal</code> class and descendant classes must match that
+ filter pattern in order to be restored.</p>
+ </td></tr><tr><td><code class="attributeName">processExpiresFrequency</code></td><td>
+ <p>It is the same as described above for the
+ <code>org.apache.catalina.session.StandardManager</code> class.
+ </p>
+ </td></tr><tr><td><code class="attributeName">saveOnRestart</code></td><td>
+ <p>Should all sessions be persisted and reloaded when Tomcat is shut
+ down and restarted (or when this application is reloaded)? By default,
+ this attribute is set to <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomClass</code></td><td>
+ <p>It is the same as described above for the
+ <code>org.apache.catalina.session.StandardManager</code> class.
+ </p>
+ </td></tr><tr><td><code class="attributeName">secureRandomProvider</code></td><td>
+ <p>It is the same as described above for the
+ <code>org.apache.catalina.session.StandardManager</code> class.
+ </p>
+ </td></tr><tr><td><code class="attributeName">secureRandomAlgorithm</code></td><td>
+ <p>It is the same as described above for the
+ <code>org.apache.catalina.session.StandardManager</code> class.
+ </p>
+ </td></tr><tr><td><code class="attributeName">sessionAttributeNameFilter</code></td><td>
+ <p>A regular expression used to filter which session attributes will be
+ distributed. An attribute will only be distributed if its name matches
+ this pattern. If the pattern is zero length or <code>null</code>, all
+ attributes are eligible for distribution. The pattern is anchored so the
+ session attribute name must fully match the pattern. As an example, the
+ value <code>(userName|sessionHistory)</code> will only distribute the
+ two session attributes named <code>userName</code> and
+ <code>sessionHistory</code>. If not specified, the default value of
+ <code>null</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">sessionAttributeValueClassNameFilter</code></td><td>
+ <p>A regular expression used to filter which session attributes will be
+ distributed. An attribute will only be distributed if the implementation
+ class name of the value matches this pattern. If the pattern is zero
+ length or <code>null</code>, all attributes are eligible for
+ distribution. The pattern is anchored so the fully qualified class name
+ must fully match the pattern. If not specified, the default value of
+ <code>null</code> will be used unless a <code>SecurityManager</code> is
+ enabled in which case the default will be
+ <code>java\\.lang\\.(?:Boolean|Integer|Long|Number|String)|org\\.apache\\.catalina\\.realm\\.GenericPrincipal\\$SerializablePrincipal|\\[Ljava.lang.String;</code>.</p>
+ </td></tr><tr><td><code class="attributeName">warnOnSessionAttributeFilterFailure</code></td><td>
+ <p>If <strong>sessionAttributeNameFilter</strong> or
+ <strong>sessionAttributeValueClassNameFilter</strong> blocks an
+ attribute, should this be logged at <code>WARN</code> level? If
+ <code>WARN</code> level logging is disabled then it will be logged at
+ <code>DEBUG</code>. The default value of this attribute is
+ <code>false</code> unless a <code>SecurityManager</code> is enabled in
+ which case the default will be <code>true</code>.</p>
+ </td></tr></table>
+
+ <p>In order to successfully use a PersistentManager, you must nest inside
+ it a <strong><Store></strong> element, as described below.</p>
+
+ </div></div>
+
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+ <h3>All Manager Implementations</h3>
+
+ <p>All Manager implementations allow nesting of a
+ <strong><SessionIdGenerator></strong> element. It defines
+ the behavior of session id generation. All implementations
+ of the <a href="sessionidgenerator.html">SessionIdGenerator</a> allow the
+ following attributes:
+ </p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">sessionIdLength</code></td><td>
+ <p>The length of the session ID may be changed with the
+ <strong>sessionIdLength</strong> attribute.
+ </p>
+ </td></tr></table>
+
+ <h3>Persistent Manager Implementation</h3>
+
+ <p>If you are using the <em>Persistent Manager Implementation</em>
+ as described above, you <strong>MUST</strong> nest a
+ <strong><Store></strong> element inside, which defines the
+ characteristics of the persistent data storage. Two implementations
+ of the <code><Store></code> element are currently available,
+ with different characteristics, as described below.</p>
+
+ <h5>File Based Store</h5>
+
+ <p>The <em>File Based Store</em> implementation saves swapped out
+ sessions in individual files (named based on the session identifier)
+ in a configurable directory. Therefore, you are likely to encounter
+ scalability problems as the number of active sessions increases, and
+ this should primarily be considered a means to easily experiment.</p>
+
+ <p>To configure this, add a <code><Store></code> nested inside
+ your <code><Manager></code> element with the following attributes:
+ </p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.catalina.Store</code> interface. You
+ <strong>must</strong> specify
+ <code>org.apache.catalina.session.FileStore</code>
+ to use this implementation.</p>
+ </td></tr><tr><td><code class="attributeName">directory</code></td><td>
+ <p>Absolute or relative (to the temporary work directory for this web
+ application) pathname of the directory into which individual session
+ files are written. If not specified, the temporary work directory
+ assigned by the container is utilized.</p>
+ </td></tr></table>
+
+
+ <h5>Data source Based Store</h5>
+
+ <p>The <em>Data source Based Store</em> implementation saves swapped out
+ sessions in individual rows of a preconfigured table in a database
+ that is accessed via a data sourcer. With large numbers of swapped out
+ sessions, this implementation will exhibit improved performance over
+ the File Based Store described above.</p>
+
+ <p>To configure this, add a <code><Store></code> nested inside
+ your <code><Manager></code> element with the following attributes:
+ </p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.catalina.Store</code> interface. You
+ <strong>must</strong> specify
+ <code>org.apache.catalina.session.DataSourceStore</code>
+ to use this implementation.</p>
+ </td></tr><tr><td><code class="attributeName">dataSourceName</code></td><td>
+ <p>Name of the JNDI resource for a JDBC DataSource-factory. Since this
+ code uses prepared statements, you might want to configure pooled
+ prepared statements as shown in
+ <a href="../jndi-resources-howto.html">the JNDI resources
+ How-To</a>.</p>
+ </td></tr><tr><td><code class="attributeName">localDataSource</code></td><td>
+ <p>This allows the Store to use a DataSource defined for the Context
+ rather than a global DataSource. If not specified, the default is
+ <code>false</code>: use a global DataSource.</p>
+ </td></tr><tr><td><code class="attributeName">sessionAppCol</code></td><td>
+ <p>Name of the database column, contained in the specified session table,
+ that contains the Engine, Host, and Web Application Context name in the
+ format <code>/Engine/Host/Context</code>. If not specified the default
+ value of <code>app</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">sessionDataCol</code></td><td>
+ <p>Name of the database column, contained in the specified session table,
+ that contains the serialized form of all session attributes for a swapped
+ out session. The column type must accept a binary object (typically called
+ a BLOB). If not specified the default value of <code>data</code> will be
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">sessionIdCol</code></td><td>
+ <p>Name of the database column, contained in the specified session table,
+ that contains the session identifier of the swapped out session. The
+ column type must accept character string data of at least as many
+ characters as are contained in session identifiers created by Tomcat
+ (typically 32). If not specified the default value of <code>id</code> will
+ be used.</p>
+ </td></tr><tr><td><code class="attributeName">sessionLastAccessedCol</code></td><td>
+ <p>Name of the database column, contained in the specified session table,
+ that contains the <code>lastAccessedTime</code> property of this session.
+ The column type must accept a Java <code>long</code> (64 bits). If not
+ specified the default value of <code>maxinactive</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">sessionMaxInactiveCol</code></td><td>
+ <p>Name of the database column, contained in the specified session table,
+ that contains the <code>maxInactiveInterval</code> property of this
+ session. The column type must accept a Java <code>integer</code> (32
+ bits). If not specified, the default value of <code>maxinactive</code>
+ will be used.</p>
+ </td></tr><tr><td><code class="attributeName">sessionTable</code></td><td>
+ <p>Name of the database table to be used for storing swapped out sessions.
+ This table must contain (at least) the database columns that are
+ configured by the other attributes of this element. If not specified the
+ default value of <code>tomcat$sessions</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">sessionValidCol</code></td><td>
+ <p>Name of the database column, contained in the specified session table,
+ that contains a flag indicating whether this swapped out session is still
+ valid or not. The column type must accept a single character. If not
+ specified the default value of <code>valid</code> will be used.</p>
+ </td></tr></table>
+
+ <p>Before attempting to use the data source Store for the first time,
+ you must create the table that will be used to store swapped out sessions.
+ Detailed SQL commands vary depending on the database you are using, but
+ a script like this will generally be required:</p>
+
+<div class="codeBox"><pre><code>create table tomcat_sessions (
+ session_id varchar(100) not null primary key,
+ valid_session char(1) not null,
+ max_inactive int not null,
+ last_access bigint not null,
+ app_name varchar(255),
+ session_data mediumblob,
+ KEY kapp_name(app_name)
+);</code></pre></div>
+
+ <p>Note: The SQL command above does not use the default names for either the
+ table or the columns so the data source Store would need to be configured
+ to reflect this.</p>
+
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+
+
+ <div class="subsection"><h4 id="Persistence_Across_Restarts">Persistence Across Restarts</h4><div class="text">
+
+ <p>Whenever Apache Tomcat is shut down normally and restarted, or when an
+ application reload is triggered, the standard Manager implementation
+ will attempt to serialize all currently active sessions to a disk
+ file located via the <code>pathname</code> attribute. All such saved
+ sessions will then be deserialized and activated (assuming they have
+ not expired in the mean time) when the application reload is completed.</p>
+
+ <p>In order to successfully restore the state of session attributes,
+ all such attributes MUST implement the <code>java.io.Serializable</code>
+ interface. You MAY cause the Manager to enforce this restriction by
+ including the <code><distributable></code> element in your web
+ application deployment descriptor (<code>/WEB-INF/web.xml</code>).</p>
+
+ <p>Note that, if <strong>persistAuthentication</strong> is also set to
+ <code>true</code>, the <code>Principal</code> class present in the session
+ MUST also implement the <code>java.io.Serializable</code> interface in order
+ to make authentication persistence work properly. The actual type of that
+ <code>Principal</code> class is determined by the <a href="realm.html">
+ Realm</a> implementation used with the application. Tomcat's standard
+ <code>Principal</code> class instantiated by most of the Realms (except
+ <code>JAASRealm</code>) implements <code>java.io.Serializable</code>.</p>
+
+ <p>The persistence across restarts provided by the
+ <strong>StandardManager</strong> is a simpler implementation than that
+ provided by the <strong>PersistentManager</strong>. If robust, production
+ quality persistence across restarts is required then the
+ <strong>PersistentManager</strong> should be used with an appropriate
+ configuration.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Disable_Session_Persistence">Disable Session Persistence</h4><div class="text">
+
+ <p>As documented above, every web application by default has
+ standard manager implementation configured, and it performs session
+ persistence across restarts. To disable this persistence feature, create
+ a <a href="context.html">Context</a> configuration file for your web
+ application and add the following element there:</p>
+
+ <div class="codeBox"><pre><code><Manager pathname="" /></code></pre></div>
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/realm.html b/web/tomcat/webapps/docs/config/realm.html
new file mode 100644
index 0000000..50c83b1
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/realm.html
@@ -0,0 +1,994 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Realm Component</title><meta name="author" content="Craig R. McClanahan"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Realm Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#DataSource_Database_Realm_-_org.apache.catalina.realm.DataSourceRealm">DataSource Database Realm - org.apache.catalina.realm.DataSourceRealm</a></li><li><a href="#JNDI_Directory_Realm_-_org.apache.catalina.realm.JNDIRealm">JNDI Directory Realm - org.apache.catalina.realm.JNDIRealm</a></li><li><a href="#UserDatabase_Realm_-_org.apache.catalina.realm.UserDatabaseRealm">UserDatabase Realm - org.apache.catalina.realm.UserDatabaseRealm</a></li><li><a href="#Memory_Based_Realm_-_org.apache.catalina.realm.MemoryRealm">Memory Based Realm - org.apache.catalina.realm.MemoryRealm</a></li><li><a href="#JAAS_Realm_-_org.apache.catalina.realm.JAASRealm">JAAS Realm - org.apache.catalina.realm.JAASRealm</a></li><li><a href="#Combined_Realm_-_org.apache.catalina.realm.CombinedRealm">Combined Realm - org.apache.catalina.realm.CombinedRealm</a></li><li><a href="#LockOut_Realm_-_org.apache.catalina.realm.LockOutRealm">LockOut Realm - org.apache.catalina.realm.LockOutRealm</a></li><li><a href="#Null_Realm_-_org.apache.catalina.realm.NullRealm">Null Realm - org.apache.catalina.realm.NullRealm</a></li><li><a href="#JDBC_Database_Realm_-_org.apache.catalina.realm.JDBCRealm">JDBC Database Realm - org.apache.catalina.realm.JDBCRealm</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>A <strong>Realm</strong> element represents a "database" of usernames,
+ passwords, and <em>roles</em> (similar to Unix <em>groups</em>) assigned
+ to those users. Different implementations of Realm allow Catalina to be
+ integrated into environments where such authentication information is already
+ being created and maintained, and then utilize that information to implement
+ <em>Container Managed Security</em> as described in the Servlet
+ Specification.</p>
+
+ <p>A Catalina container (<a href="engine.html">Engine</a>,
+ <a href="host.html">Host</a>, or <a href="context.html">Context</a>) may
+ contain no more than one Realm element (although if supported by the Realm
+ this one Realm may itself contain multiple nested Realms). In addition, the
+ Realm associated with an Engine or a Host is automatically inherited by
+ lower-level containers unless the lower level container explicitly defines its
+ own Realm. If no Realm is configured for the Engine, an instance of the
+ <a href="#Null_Realm_-_org.apache.catalina.realm.NullRealm">Null Realm</a>
+ will be configured for the Engine automatically.</p>
+
+ <p>For more in-depth information about container managed security in web
+ applications, as well as more information on configuring and using the
+ standard realm component implementations, please see the
+ <a href="../realm-howto.html">Container-Managed Security Guide</a>.
+ </p>
+
+ <p><em>The description below uses the variable name $CATALINA_BASE to refer the
+ base directory against which most relative paths are resolved. If you have
+ not configured Tomcat for multiple instances by setting a CATALINA_BASE
+ directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME,
+ the directory into which you have installed Tomcat.</em></p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>Realm</strong>
+ support the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.catalina.Realm</code> interface.</p>
+ </td></tr></table>
+
+ <p>Unlike most Catalina components, there are several standard
+ <strong>Realm</strong> implementations available. As a result,
+ the <code>className</code> attribute MUST be used to select the
+ implementation you wish to use.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="DataSource_Database_Realm_-_org.apache.catalina.realm.DataSourceRealm">DataSource Database Realm - org.apache.catalina.realm.DataSourceRealm</h4><div class="text">
+
+ <p>The <strong>DataSource Database Realm</strong> connects Tomcat to
+ a relational database, accessed through a JNDI named JDBC DataSource
+ to perform lookups of usernames, passwords, and their associated
+ roles. Because the lookup is done each time that it is required,
+ changes to the database will be immediately reflected in the
+ information used to authenticate new logins.</p>
+
+ <p>The JDBC Realm uses a single db connection. This requires that
+ realm based authentication be synchronized, i.e. only one authentication
+ can be done at a time. This could be a bottleneck for applications
+ with high volumes of realm based authentications.</p>
+
+ <p>The DataSource Database Realm supports simultaneous realm based
+ authentications and allows the underlying JDBC DataSource to
+ handle optimizations like database connection pooling.</p>
+
+ <p>A rich set of additional attributes lets you configure the name
+ of the JNDI JDBC DataSource, as well as the table and
+ column names used to retrieve the required information:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allRolesMode</code></td><td>
+ <p>This attribute controls how the special role name <code>*</code> is
+ handled when processing authorization constraints in web.xml. By
+ default, the specification compliant value of <code>strict</code> is
+ used which means that the user must be assigned one of the roles defined
+ in web.xml. The alternative values are <code>authOnly</code> which means
+ that the user must be authenticated but no check is made for assigned
+ roles and <code>strictAuthOnly</code> which means that the user must be
+ authenticated and no check will be made for assigned roles unless roles
+ are defined in web.xml in which case the user must be assigned at least
+ one of those roles.</p>
+ <p>When this attribute has the value of <code>authOnly</code> or
+ <code>strictAuthOnly</code>, the <strong>roleNameCol</strong> and
+ <strong>userRoleTable</strong> attributes become optional. If those two
+ attributes are omitted, the user's roles will not be loaded by this
+ Realm.</p>
+ </td></tr><tr><td><strong><code class="attributeName">dataSourceName</code></strong></td><td>
+ <p>The name of the JNDI JDBC DataSource for this Realm.</p>
+ </td></tr><tr><td><code class="attributeName">localDataSource</code></td><td>
+ <p>When the realm is nested inside a Context element, this allows the
+ realm to use a DataSource defined for the Context rather than a global
+ DataSource. If not specified, the default is <code>false</code>: use a
+ global DataSource.</p>
+ </td></tr><tr><td><code class="attributeName">roleNameCol</code></td><td>
+ <p>Name of the column, in the "user roles" table, which contains
+ a role name assigned to the corresponding user.</p>
+ <p>This attribute is <strong>required</strong> in majority of
+ configurations. See <strong>allRolesMode</strong> attribute for
+ a rare case when it can be omitted.</p>
+ </td></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td>
+ <p>The HTTP status code to use when the container needs to issue an HTTP
+ redirect to meet the requirements of a configured transport
+ guarantee. The provided status code is not validated. If not
+ specified, the default value of <code>302</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">stripRealmForGss</code></td><td>
+ <p>When processing users authenticated via the GSS-API, this attribute
+ controls if any "@..." is removed from the end of the user
+ name. If not specified, the default is <code>true</code>.</p>
+ </td></tr><tr><td><strong><code class="attributeName">userCredCol</code></strong></td><td>
+ <p>Name of the column, in the "users" table, which contains
+ the user's credentials (i.e. password). If a
+ <code>CredentialHandler</code> is specified, this component
+ will assume that the passwords have been encoded with the
+ specified algorithm. Otherwise, they will be assumed to be
+ in clear text.</p>
+ </td></tr><tr><td><strong><code class="attributeName">userNameCol</code></strong></td><td>
+ <p>Name of the column, in the "users" and "user roles" table,
+ that contains the user's username.</p>
+ </td></tr><tr><td><code class="attributeName">userRoleTable</code></td><td>
+ <p>Name of the "user roles" table, which must contain columns
+ named by the <code>userNameCol</code> and <code>roleNameCol</code>
+ attributes.</p>
+ <p>This attribute is <strong>required</strong> in majority of
+ configurations. See <strong>allRolesMode</strong> attribute for
+ a rare case when it can be omitted.</p>
+ </td></tr><tr><td><strong><code class="attributeName">userTable</code></strong></td><td>
+ <p>Name of the "users" table, which must contain columns named
+ by the <code>userNameCol</code> and <code>userCredCol</code>
+ attributes.</p>
+ </td></tr><tr><td><code class="attributeName">X509UsernameRetrieverClassName</code></td><td>
+ <p>When using X509 client certificates, this specifies the class name
+ that will be used to retrieve the user name from the certificate.
+ The class must implement the
+ <code>org.apache.catalina.realm.X509UsernameRetriever</code>
+ interface. The default is to use the certificate's SubjectDN
+ as the username.</p>
+ </td></tr></table>
+
+ <p>See the <a href="../realm-howto.html#DataSourceRealm">
+ DataSource Realm How-To</a> for more information on setting up container
+ managed security using the DataSource Database Realm component.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="JNDI_Directory_Realm_-_org.apache.catalina.realm.JNDIRealm">JNDI Directory Realm - org.apache.catalina.realm.JNDIRealm</h4><div class="text">
+
+ <p>The <strong>JNDI Directory Realm</strong> connects Tomcat to
+ an LDAP Directory, accessed through an appropriate JNDI driver,
+ that stores usernames, passwords, and their associated
+ roles. Changes to the directory are immediately reflected in the
+ information used to authenticate new logins.</p>
+
+ <p>The directory realm supports a variety of approaches to using
+ LDAP for authentication:</p>
+
+ <ul>
+ <li>The realm can either use a pattern to determine the
+ distinguished name (DN) of the user's directory entry, or search
+ the directory to locate that entry.
+ </li>
+
+ <li>The realm can authenticate the user either by binding to the
+ directory with the DN of the user's entry and the password
+ presented by the user, or by retrieving the password from the
+ user's entry and performing a comparison locally.
+ </li>
+
+ <li>Roles may be represented in the directory as explicit entries
+ found by a directory search (e.g. group entries of which the user
+ is a member), as the values of an attribute in the user's entry,
+ or both.
+ </li>
+ </ul>
+
+ <p> A rich set of additional attributes lets you configure the
+ required behaviour as well as the connection to the underlying
+ directory and the element and attribute names used to retrieve
+ information from the directory:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">adCompat</code></td><td>
+ <p>Microsoft Active Directory often returns referrals.
+ When iterating over NamingEnumerations these lead to
+ PartialResultExceptions. If you want us to ignore those exceptions,
+ set this attribute to "true". Unfortunately there's no stable way
+ to detect, if the Exceptions really come from an AD referral.
+ The default value is "false".</p>
+ </td></tr><tr><td><code class="attributeName">allRolesMode</code></td><td>
+ <p>This attribute controls how the special role name <code>*</code> is
+ handled when processing authorization constraints in web.xml. By
+ default, the specification compliant value of <code>strict</code> is
+ used which means that the user must be assigned one of the roles defined
+ in web.xml. The alternative values are <code>authOnly</code> which means
+ that the user must be authenticated but no check is made for assigned
+ roles and <code>strictAuthOnly</code> which means that the user must be
+ authenticated and no check will be made for assigned roles unless roles
+ are defined in web.xml in which case the user must be assigned at least
+ one of those roles.</p>
+ </td></tr><tr><td><code class="attributeName">alternateURL</code></td><td>
+ <p>If a socket connection cannot be made to the provider at
+ the <code>connectionURL</code> an attempt will be made to use the
+ <code>alternateURL</code>.</p>
+ </td></tr><tr><td><code class="attributeName">authentication</code></td><td>
+ <p>A string specifying the type of authentication to use.
+ "none", "simple", "strong" or a provider specific definition
+ can be used. If no value is given the providers default is used.</p>
+ </td></tr><tr><td><code class="attributeName">cipherSuites</code></td><td>
+ <p>Specify which cipher suites are allowed when trying to open
+ a secured connection using StartTLS. The allowed cipher suites
+ are specified by a comma separated list. The default is to use the
+ cipher suites of the JVM.</p>
+ </td></tr><tr><td><code class="attributeName">commonRole</code></td><td>
+ <p>A role name assigned to each successfully authenticated user in
+ addition to the roles retrieved from LDAP. If not specified, only
+ the roles retrieved via LDAP are used.</p>
+ </td></tr><tr><td><code class="attributeName">connectionName</code></td><td>
+ <p>The directory username to use when establishing a
+ connection to the directory for LDAP search operations. If not
+ specified an anonymous connection is made, which is often
+ sufficient unless you specify the <code>userPassword</code>
+ property.</p>
+ </td></tr><tr><td><code class="attributeName">connectionPassword</code></td><td>
+ <p>The directory password to use when establishing a
+ connection to the directory for LDAP search operations. If not
+ specified an anonymous connection is made, which is often
+ sufficient unless you specify the <code>userPassword</code>
+ property.</p>
+ </td></tr><tr><td><code class="attributeName">connectionPoolSize</code></td><td>
+ <p>The JNDI realm can use a pool of connections to the directory server
+ to avoid blocking on a single connection. This attribute value is the
+ maximum pool size. If not specified, it will use <code>1</code>, which
+ means a single connection will be used.</p>
+ </td></tr><tr><td><code class="attributeName">connectionTimeout</code></td><td>
+ <p>The timeout in milliseconds to use when establishing the connection
+ to the LDAP directory. If not specified, a value of 5000 (5 seconds) is
+ used.</p>
+ </td></tr><tr><td><strong><code class="attributeName">connectionURL</code></strong></td><td>
+ <p>The connection URL to be passed to the JNDI driver when
+ establishing a connection to the directory.</p>
+ </td></tr><tr><td><code class="attributeName">contextFactory</code></td><td>
+ <p>Fully qualified Java class name of the factory class used
+ to acquire our JNDI <code>InitialContext</code>. By default,
+ assumes that the standard JNDI LDAP provider will be utilized.</p>
+ </td></tr><tr><td><code class="attributeName">derefAliases</code></td><td>
+ <p>A string specifying how aliases are to be dereferenced during
+ search operations. The allowed values are "always", "never",
+ "finding" and "searching". If not specified, "always" is used.</p>
+ </td></tr><tr><td><code class="attributeName">forceDnHexEscape</code></td><td>
+ <p>A setting of <code>true</code> forces escaping in the String
+ representation of a distinguished name to use the <code>\nn</code> form.
+ This may avoid issues with realms using Active Directory which appears
+ to be more tolerant of optional escaping when the <code>\nn</code> form
+ is used. If not specified, the default of <code>false</code> will be
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">hostnameVerifierClassName</code></td><td>
+ <p>The name of the class to use for hostname verification when
+ using StartTLS for securing the connection to the ldap server.
+ The default constructor will be used to construct an instance of
+ the verifier class. The default is to accept only those hostnames,
+ that are valid according to the peer certificate of the ldap
+ server.</p>
+ </td></tr><tr><td><code class="attributeName">protocol</code></td><td>
+ <p>A string specifying the security protocol to use. If not given
+ the providers default is used.</p>
+ </td></tr><tr><td><code class="attributeName">readTimeout</code></td><td>
+ <p>The timeout, in milliseconds, to use when trying to read from a
+ connection to the directory. If not specified, the default of 5000
+ (5 seconds) is used.</p>
+ </td></tr><tr><td><code class="attributeName">referrals</code></td><td>
+ <p>How do we handle JNDI referrals? Allowed values are
+ "ignore", "follow", or "throw" (see javax.naming.Context.REFERRAL
+ for more information).
+ Microsoft Active Directory often returns referrals.
+ If you need to follow them set referrals to "follow".
+ Caution: if your DNS is not part of AD, the LDAP client lib might try
+ to resolve your domain name in DNS to find another LDAP server.</p>
+ </td></tr><tr><td><code class="attributeName">roleBase</code></td><td>
+ <p>The base directory entry for performing role searches. If not
+ specified the top-level element in the directory context will be used.
+ If specified it may optionally include pattern replacements
+ "{0}".."{n}" corresponding to the name parts of the
+ user's distinguished name (as returned by
+ <code>javax.naming.Name.get()</code>).</p>
+ </td></tr><tr><td><code class="attributeName">roleName</code></td><td>
+ <p>The name of the attribute that contains role names in the
+ directory entries found by a role search. In addition you can
+ use the <code>userRoleName</code> property to specify the name
+ of an attribute, in the user's entry, containing additional
+ role names.</p>
+ <p>If <code>roleName</code> is not specified a role
+ search does not take place, and roles are taken only from the
+ user's entry.</p>
+ </td></tr><tr><td><code class="attributeName">roleNested</code></td><td>
+ <p>Set to <code>true</code> if you want to nest roles into roles.
+ When a role search is performed and the value of this property is
+ <code>true</code>, the search will be repeated recursively to find
+ all the roles that belong to the user either directly or indirectly.
+ If not specified, the default value of <code>false</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">roleSearch</code></td><td>
+ <p>The LDAP filter expression used for performing role
+ searches.</p>
+
+ <p>Use <code>{0}</code> to substitute the distinguished name (DN)
+ of the user, and/or <code>{1}</code> to substitute the username,
+ and/or <code>{2}</code> for the value of an attribute from the
+ user's directory entry, of the authenticated user.
+ The name of the attribute that provides the value for <code>{2}</code>
+ is configured by the <code>userRoleAttribute</code> property.</p>
+
+ <p>When <code>roleNested</code> property is <code>true</code>,
+ this filter expression will be also used to recursively search for
+ other roles, which indirectly belong to this user. To find the
+ roles that match the newly found role, the following values
+ are used:
+ <code>{0}</code> is substituted by the distinguished name of the newly
+ found role, and both <code>{1}</code> and <code>{2}</code> are
+ substituted by the name of the role (see the <code>roleName</code>
+ property). The <code>userRoleAttribute</code> property is not
+ applicable to this search.</p>
+
+ <p>If this property is not specified, a role search does not take
+ place and roles are taken only from the attribute in the user's entry
+ specified by the <code>userRoleName</code> property.</p>
+ </td></tr><tr><td><code class="attributeName">roleSearchAsUser</code></td><td>
+ <p> When searching for user roles, should the search be performed as the
+ user currently being authenticated? If false,
+ <code>connectionName</code> and <code>connectionPassword</code> will be
+ used if specified, else an anonymous. If not specified, the default
+ value of <code>false</code> is used. Note that when accessing the
+ directory using delegated credentials, this attribute is always ignored
+ and the search is performed using the delegated credentials.</p>
+ </td></tr><tr><td><code class="attributeName">roleSubtree</code></td><td>
+ <p>Set to <code>true</code> if you want to search the entire
+ subtree of the element specified by the <code>roleBase</code>
+ property for role entries associated with the user. The
+ default value of <code>false</code> causes only the top level
+ to be searched.</p>
+ </td></tr><tr><td><code class="attributeName">sizeLimit</code></td><td>
+ <p>Specifies the maximum number of records to return when using the
+ <code>userSearch</code> attribute. If not specified, the default of
+ <code>0</code> is used which indicates no limit.</p>
+ </td></tr><tr><td><code class="attributeName">spnegoDelegationQop</code></td><td>
+ <p>When the JNDI Realm is used with the SPNEGO authenticator and
+ <code>useDelegatedCredential</code> is <code>true</code> this attribute
+ controls the QOP (Quality of Protection) that should be used for
+ the connection to the LDAP
+ server after authentication. This value is used to set the
+ <code>javax.security.sasl.qop</code> environment property for the LDAP
+ connection. This attribute should be a comma-separated list of values
+ selected from <code>auth-conf</code>, <code>auth-int</code> and
+ <code>auth</code>. See <a href="http://docs.oracle.com/javase/7/docs/api/javax/security/sasl/Sasl.html#QOP" rel="nofollow">Java documentation</a> for more details.</p>
+ <p>The default value is <code>auth-conf</code>.</p>
+ </td></tr><tr><td><code class="attributeName">sslProtocol</code></td><td>
+ <p>Specifies which ssl protocol should be used, when connecting with
+ StartTLS. The default is to let the jre decide. If you need even more
+ control, you can specify the <code>SSLSocketFactory</code> to use.</p>
+ </td></tr><tr><td><code class="attributeName">sslSocketFactory</code></td><td>
+ <p>Specifies which <code>SSLSocketFactory</code> to use when connecting
+ to the ldap server using StartTLS. An instance of the class will be
+ constructed using the default constructor. If none class name is given
+ the default jre <code>SSLSocketFactory</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">stripRealmForGss</code></td><td>
+ <p>When processing users authenticated via the GSS-API, this attribute
+ controls if any "@..." is removed from the end of the user
+ name. If not specified, the default is <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">timeLimit</code></td><td>
+ <p>Specifies the time (in milliseconds) to wait for records to be
+ returned when using the <code>userSearch</code> attribute. If not
+ specified, the default of <code>0</code> is used which indicates no
+ limit.</p>
+ </td></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td>
+ <p>The HTTP status code to use when the container needs to issue an HTTP
+ redirect to meet the requirements of a configured transport
+ guarantee. The provided status code is not validated. If not
+ specified, the default value of <code>302</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">useContextClassLoader</code></td><td>
+ <p>Instructs JNDIRealm to use the context class loader when opening the
+ connection for the JNDI provider. The default value is
+ <code>true</code>. To load classes using the container's classloader,
+ specify <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">useDelegatedCredential</code></td><td>
+ <p>When the JNDIRealm is used with the SPNEGO authenticator, delegated
+ credentials for the user may be available. If such credentials are
+ present, this attribute controls whether or not they are used to
+ connect to the directory. If not specified, the default value of
+ <code>true</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">userBase</code></td><td>
+ <p>The base element for user searches performed using the
+ <code>userSearch</code> expression. Not used if you are using
+ the <code>userPattern</code> expression.</p>
+ </td></tr><tr><td><code class="attributeName">userPassword</code></td><td>
+ <p>Name of the attribute in the user's entry containing the
+ user's password. If you specify this value, JNDIRealm will
+ bind to the directory using the values specified by
+ <code>connectionName</code> and
+ <code>connectionPassword</code> properties, and retrieve the
+ corresponding attribute for comparison to the value specified
+ by the user being authenticated. If you do
+ <strong>not</strong> specify this value, JNDIRealm will
+ attempt a simple bind to the directory using the DN of the
+ user's entry and the password presented by the user, with a
+ successful bind being interpreted as an authenticated
+ user.</p>
+ </td></tr><tr><td><code class="attributeName">userPattern</code></td><td>
+ <p>Pattern for the distinguished name (DN) of the user's
+ directory entry, with <code>{0}</code> marking where the
+ actual username should be inserted. You can use this property
+ instead of <code>userSearch</code>, <code>userSubtree</code>
+ and <code>userBase</code> when the distinguished name contains
+ the username and is otherwise the same for all users. Note that
+ when accessing the directory using delegated credentials, this
+ attribute is always ignored and <code>userSearch</code>,
+ <code>userSubtree</code> and <code>userBase</code> are always
+ used instead.</p>
+ </td></tr><tr><td><code class="attributeName">userRoleName</code></td><td>
+ <p>The name of an attribute in the user's directory entry
+ containing zero or more values for the names of roles assigned
+ to this user. In addition you can use the
+ <code>roleName</code> property to specify the name of an
+ attribute to be retrieved from individual role entries found
+ by searching the directory. If <code>userRoleName</code> is
+ not specified all the roles for a user derive from the role
+ search.</p>
+ </td></tr><tr><td><code class="attributeName">userRoleAttribute</code></td><td>
+ <p>The name of an attribute in the user's directory entry
+ containing the value that you wish to use when you search for
+ roles. This is especially useful for RFC 2307 where
+ the role memberUid can be the <code>uid</code> or the
+ <code>uidNumber</code> of the user. This value will be
+ marked as <code>{2}</code> in your role search filter expression.
+ This value will NOT be available for nested role searches.</p>
+ </td></tr><tr><td><code class="attributeName">userSearch</code></td><td>
+ <p>The LDAP filter expression to use when searching for a
+ user's directory entry, with <code>{0}</code> marking where
+ the actual username should be inserted. Use this property
+ (along with the <code>userBase</code> and
+ <code>userSubtree</code> properties) instead of
+ <code>userPattern</code> to search the directory for the
+ user's entry.</p>
+ </td></tr><tr><td><code class="attributeName">userSearchAsUser</code></td><td>
+ <p> When searching for a user's entry, should the search be performed as
+ the user currently being authenticated? If false,
+ <code>connectionName</code> and <code>connectionPassword</code> will be
+ used if specified, else an anonymous. If not specified, the default
+ value of <code>false</code> is used. Note that when accessing the
+ directory using delegated credentials, this attribute is always ignored
+ and the search is performed using the delegated credentials.</p>
+ </td></tr><tr><td><code class="attributeName">userSubtree</code></td><td>
+ <p>Set to <code>true</code> if you want to search the entire
+ subtree of the element specified by the <code>userBase</code>
+ property for the user's entry. The default value of
+ <code>false</code> causes only the top level to be searched.
+ Not used if you are using the <code>userPattern</code>
+ expression.</p>
+ </td></tr><tr><td><code class="attributeName">useStartTls</code></td><td>
+ <p>Set to <code>true</code> if you want to use StartTLS for securing
+ the connection to the ldap server. The default value is <code>false</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">X509UsernameRetrieverClassName</code></td><td>
+ <p>When using X509 client certificates, this specifies the class name
+ that will be used to retrieve the user name from the certificate.
+ The class must implement the
+ <code>org.apache.catalina.realm.X509UsernameRetriever</code>
+ interface. The default is to use the certificate's SubjectDN
+ as the username.</p>
+ </td></tr></table>
+
+ <p>See the <a href="../realm-howto.html">Container-Managed Security Guide</a> for more
+ information on setting up container managed security using the
+ JNDI Directory Realm component.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="UserDatabase_Realm_-_org.apache.catalina.realm.UserDatabaseRealm">UserDatabase Realm - org.apache.catalina.realm.UserDatabaseRealm</h4><div class="text">
+
+ <p>The <strong>UserDatabase Realm</strong> is a Realm implementation
+ that is based on a UserDatabase resource made available through the global
+ JNDI resources configured for this Tomcat instance.</p>
+
+ <p>The UserDatabase Realm implementation supports the following
+ additional attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allRolesMode</code></td><td>
+ <p>This attribute controls how the special role name <code>*</code> is
+ handled when processing authorization constraints in web.xml. By
+ default, the specification compliant value of <code>strict</code> is
+ used which means that the user must be assigned one of the roles defined
+ in web.xml. The alternative values are <code>authOnly</code> which means
+ that the user must be authenticated but no check is made for assigned
+ roles and <code>strictAuthOnly</code> which means that the user must be
+ authenticated and no check will be made for assigned roles unless roles
+ are defined in web.xml in which case the user must be assigned at least
+ one of those roles.</p>
+ </td></tr><tr><td><code class="attributeName">localJndiResource</code></td><td>
+ <p>When the realm is nested inside a Context element, this allows the
+ realm to use a UserDatabase defined for the Context rather than a global
+ UserDatabase. If not specified, the default is <code>false</code>: use a
+ global UserDatabase.</p>
+ </td></tr><tr><td><strong><code class="attributeName">resourceName</code></strong></td><td>
+ <p>The name of the global <code>UserDatabase</code> resource
+ that this realm will use for user, password and role information.</p>
+ </td></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td>
+ <p>The HTTP status code to use when the container needs to issue an HTTP
+ redirect to meet the requirements of a configured transport
+ guarantee. The provided status code is not validated. If not
+ specified, the default value of <code>302</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">X509UsernameRetrieverClassName</code></td><td>
+ <p>When using X509 client certificates, this specifies the class name
+ that will be used to retrieve the user name from the certificate.
+ The class must implement the
+ <code>org.apache.catalina.realm.X509UsernameRetriever</code>
+ interface. The default is to use the certificate's SubjectDN
+ as the username.</p>
+ </td></tr></table>
+
+ <p>See the
+ <a href="../realm-howto.html">Container-Managed Security Guide</a> for more
+ information on setting up container managed security using the UserDatabase
+ Realm component and the
+ <a href="../jndi-resources-howto.html">JNDI resources how-to</a> for more
+ information on how to configure a UserDatabase resource.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Memory_Based_Realm_-_org.apache.catalina.realm.MemoryRealm">Memory Based Realm - org.apache.catalina.realm.MemoryRealm</h4><div class="text">
+
+ <p>The <strong>Memory Based Realm</strong> is a simple Realm implementation
+ that reads user information from an XML format, and represents it as a
+ collection of Java objects in memory. This implementation is intended
+ solely to get up and running with container managed security - it is NOT
+ intended for production use. As such, there are no mechanisms for
+ updating the in-memory collection of users when the content of the
+ underlying data file is changed.</p>
+
+ <p>The Memory Based Realm implementation supports the following
+ additional attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allRolesMode</code></td><td>
+ <p>This attribute controls how the special role name <code>*</code> is
+ handled when processing authorization constraints in web.xml. By
+ default, the specification compliant value of <code>strict</code> is
+ used which means that the user must be assigned one of the roles defined
+ in web.xml. The alternative values are <code>authOnly</code> which means
+ that the user must be authenticated but no check is made for assigned
+ roles and <code>strictAuthOnly</code> which means that the user must be
+ authenticated and no check will be made for assigned roles unless roles
+ are defined in web.xml in which case the user must be assigned at least
+ one of those roles.</p>
+ </td></tr><tr><td><code class="attributeName">pathname</code></td><td>
+ <p>URL, absolute path or relative path (to $CATALINA_BASE) for the XML
+ file containing our user information. See below for details on the
+ XML element format required. If no pathname is specified, the
+ default value is <code>conf/tomcat-users.xml</code>.</p>
+ </td></tr><tr><td><code class="attributeName">stripRealmForGss</code></td><td>
+ <p>When processing users authenticated via the GSS-API, this attribute
+ controls if any "@..." is removed from the end of the user
+ name. If not specified, the default is <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td>
+ <p>The HTTP status code to use when the container needs to issue an HTTP
+ redirect to meet the requirements of a configured transport
+ guarantee. The provided status code is not validated. If not
+ specified, the default value of <code>302</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">X509UsernameRetrieverClassName</code></td><td>
+ <p>When using X509 client certificates, this specifies the class name
+ that will be used to retrieve the user name from the certificate.
+ The class must implement the
+ <code>org.apache.catalina.realm.X509UsernameRetriever</code>
+ interface. The default is to use the certificate's SubjectDN
+ as the username.</p>
+ </td></tr></table>
+
+ <p>The XML document referenced by the <code>pathname</code> attribute must
+ conform to the following requirements:</p>
+ <ul>
+ <li>The root (outer) element must be <code><tomcat-users></code>.
+ </li>
+ <li>Each authorized user must be represented by a single XML element
+ <code><user></code>, nested inside the root element.</li>
+ <li>Each <code><user></code> element must have the following
+ attributes:
+ <ul>
+ <li><strong>username</strong> - Username of this user (must be unique
+ within this file).<br>
+ For compatibility, it is allowed to use <strong>name</strong> as an
+ alternative name for this attribute.</li>
+ <li><strong>password</strong> - Password of this user (in
+ clear text).</li>
+ <li><strong>roles</strong> - Comma-delimited list of the role names
+ assigned to this user.</li>
+ </ul></li>
+ </ul>
+
+ <p>See the <a href="../realm-howto.html">Container-Managed Security Guide</a> for more
+ information on setting up container managed security using the
+ Memory Based Realm component.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="JAAS_Realm_-_org.apache.catalina.realm.JAASRealm">JAAS Realm - org.apache.catalina.realm.JAASRealm</h4><div class="text">
+
+ <p><strong>JAASRealm</strong> is an implementation of the Tomcat
+ <code>Realm</code> interface that authenticates users through the Java
+ Authentication & Authorization Service (JAAS) framework which is now
+ provided as part of the standard J2SE API.</p>
+
+ <p>Using JAASRealm gives the developer the ability to combine practically
+ any conceivable security realm with Tomcat's CMA.</p>
+
+ <p>JAASRealm is prototype for Tomcat of the JAAS-based J2EE authentication
+ framework for J2EE v1.4, based on the <a href="https://www.jcp.org/en/jsr/detail?id=196">JCP Specification Request
+ 196</a> to enhance container-managed security and promote 'pluggable'
+ authentication mechanisms whose implementations would be
+ container-independent.</p>
+
+ <p>Based on the JAAS login module and principal
+ (see <code>javax.security.auth.spi.LoginModule</code> and
+ <code>javax.security.Principal</code>), you can develop your own security
+ mechanism or wrap another third-party mechanism for integration with the CMA
+ as implemented by Tomcat.</p>
+
+ <p>The JAAS Realm implementation supports the following additional
+ attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allRolesMode</code></td><td>
+ <p>This attribute controls how the special role name <code>*</code> is
+ handled when processing authorization constraints in web.xml. By
+ default, the specification compliant value of <code>strict</code> is
+ used which means that the user must be assigned one of the roles defined
+ in web.xml. The alternative values are <code>authOnly</code> which means
+ that the user must be authenticated but no check is made for assigned
+ roles and <code>strictAuthOnly</code> which means that the user must be
+ authenticated and no check will be made for assigned roles unless roles
+ are defined in web.xml in which case the user must be assigned at least
+ one of those roles.</p>
+ </td></tr><tr><td><code class="attributeName">appName</code></td><td>
+ <p>The name of the application as configured in your login configuration
+ file
+ (<a href="http://docs.oracle.com/javase/1.4.2/docs/guide/security/jaas/tutorials/LoginConfigFile.html">JAAS LoginConfig</a>).</p>
+ <p>If not specified <code>appName</code> is derived from the Container's
+ name it is placed in, for example <code>Catalina</code> or <code>ROOT</code>.
+ If the realm is not placed in any Container, the default is <code>Tomcat</code>.
+ </p>
+ </td></tr><tr><td><strong><code class="attributeName">userClassNames</code></strong></td><td>
+ <p>A comma-separated list of the names of the classes that you have made
+ for your user <code>Principals</code>.</p>
+ </td></tr><tr><td><code class="attributeName">configFile</code></td><td>
+ <p>The name of a JAAS configuration file to use with this Realm. It will
+ be searched for using <code>ClassLoader#getResource(String)</code> so it
+ is possible for the configuration to be bundled within a web
+ application. If not specified, the default JVM global JAAS configuration
+ will be used.</p>
+ </td></tr><tr><td><code class="attributeName">roleClassNames</code></td><td>
+ <p>A comma-separated list of the names of the classes that you have made
+ for your role <code>Principals</code>.</p>
+ </td></tr><tr><td><code class="attributeName">stripRealmForGss</code></td><td>
+ <p>When processing users authenticated via the GSS-API, this attribute
+ controls if any "@..." is removed from the end of the user
+ name. If not specified, the default is <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td>
+ <p>The HTTP status code to use when the container needs to issue an HTTP
+ redirect to meet the requirements of a configured transport
+ guarantee. The provided status code is not validated. If not
+ specified, the default value of <code>302</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">useContextClassLoader</code></td><td>
+ <p>Instructs JAASRealm to use the context class loader for loading the
+ user-specified <code>LoginModule</code> class and associated
+ <code>Principal</code> classes. The default value is <code>true</code>,
+ which is backwards-compatible with the way Tomcat 5 works. To load
+ classes using the container's classloader, specify
+ <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">X509UsernameRetrieverClassName</code></td><td>
+ <p>When using X509 client certificates, this specifies the class name
+ that will be used to retrieve the user name from the certificate.
+ The class must implement the
+ <code>org.apache.catalina.realm.X509UsernameRetriever</code>
+ interface. The default is to use the certificate's SubjectDN
+ as the username.</p>
+ </td></tr></table>
+
+ <p>See the <a href="../realm-howto.html">Container-Managed Security
+ Guide</a> for more information on setting up container managed security
+ using the JAAS Realm component.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Combined_Realm_-_org.apache.catalina.realm.CombinedRealm">Combined Realm - org.apache.catalina.realm.CombinedRealm</h4><div class="text">
+
+ <p><strong>CombinedRealm</strong> is an implementation of the Tomcat
+ <code>Realm</code> interface that authenticates users through one or more
+ sub-Realms.</p>
+
+ <p>Using CombinedRealm gives the developer the ability to combine multiple
+ Realms of the same or different types. This can be used to authenticate
+ against different sources, provide fall back in case one Realm fails or for
+ any other purpose that requires multiple Realms.</p>
+
+ <p>Sub-realms are defined by nesting <code>Realm</code> elements inside the
+ <code>Realm</code> element that defines the CombinedRealm. Authentication
+ will be attempted against each <code>Realm</code> in the order they are
+ listed. Authentication against any Realm will be sufficient to authenticate
+ the user. The authenticated user, and their associated roles, will be taken
+ from the first Realm that successfully authenticates the user.</p>
+
+ <p>See the <a href="../realm-howto.html">Container-Managed Security
+ Guide</a> for more information on setting up container managed security
+ using the CombinedRealm component.</p>
+
+ <p>The CombinedRealm implementation supports the following additional
+ attributes.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allRolesMode</code></td><td>
+ <p>This attribute controls how the special role name <code>*</code> is
+ handled when processing authorization constraints in web.xml. By
+ default, the specification compliant value of <code>strict</code> is
+ used which means that the user must be assigned one of the roles defined
+ in web.xml. The alternative values are <code>authOnly</code> which means
+ that the user must be authenticated but no check is made for assigned
+ roles and <code>strictAuthOnly</code> which means that the user must be
+ authenticated and no check will be made for assigned roles unless roles
+ are defined in web.xml in which case the user must be assigned at least
+ one of those roles.</p>
+ </td></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td>
+ <p>The HTTP status code to use when the container needs to issue an HTTP
+ redirect to meet the requirements of a configured transport
+ guarantee. The provided status code is not validated. If not
+ specified, the default value of <code>302</code> is used.</p>
+ </td></tr></table>
+ </div></div>
+
+
+ <div class="subsection"><h4 id="LockOut_Realm_-_org.apache.catalina.realm.LockOutRealm">LockOut Realm - org.apache.catalina.realm.LockOutRealm</h4><div class="text">
+
+ <p><strong>LockOutRealm</strong> is an implementation of the Tomcat
+ <code>Realm</code> interface that extends the CombinedRealm to provide lock
+ out functionality to provide a user lock out mechanism if there are too many
+ failed authentication attempts in a given period of time.</p>
+
+ <p>To ensure correct operation, there is a reasonable degree of
+ synchronization in this Realm.</p>
+
+ <p>This Realm does not require modification to the underlying Realms or the
+ associated user storage mechanisms. It achieves this by recording all failed
+ logins, including those for users that do not exist. To prevent a DOS by
+ deliberating making requests with invalid users (and hence causing this
+ cache to grow) the size of the list of users that have failed authentication
+ is limited.</p>
+
+ <p>Sub-realms are defined by nesting <code>Realm</code> elements inside the
+ <code>Realm</code> element that defines the LockOutRealm. Authentication
+ will be attempted against each <code>Realm</code> in the order they are
+ listed. Authentication against any Realm will be sufficient to authenticate
+ the user.</p>
+
+ <p>The LockOutRealm implementation supports the following additional
+ attributes.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allRolesMode</code></td><td>
+ <p>This attribute controls how the special role name <code>*</code> is
+ handled when processing authorization constraints in web.xml. By
+ default, the specification compliant value of <code>strict</code> is
+ used which means that the user must be assigned one of the roles defined
+ in web.xml. The alternative values are <code>authOnly</code> which means
+ that the user must be authenticated but no check is made for assigned
+ roles and <code>strictAuthOnly</code> which means that the user must be
+ authenticated and no check will be made for assigned roles unless roles
+ are defined in web.xml in which case the user must be assigned at least
+ one of those roles.</p>
+ </td></tr><tr><td><code class="attributeName">cacheRemovalWarningTime</code></td><td>
+ <p>If a failed user is removed from the cache because the cache is too
+ big before it has been in the cache for at least this period of time (in
+ seconds) a warning message will be logged. Defaults to 3600 (1 hour).</p>
+ </td></tr><tr><td><code class="attributeName">cacheSize</code></td><td>
+ <p>Number of users that have failed authentication to keep in cache. Over
+ time the cache will grow to this size and may not shrink. Defaults to
+ 1000.</p>
+ </td></tr><tr><td><code class="attributeName">failureCount</code></td><td>
+ <p>The number of times in a row a user has to fail authentication to be
+ locked out. Defaults to 5.</p>
+ </td></tr><tr><td><code class="attributeName">lockOutTime</code></td><td>
+ <p>The time (in seconds) a user is locked out for after too many
+ authentication failures. Defaults to 300 (5 minutes). Further
+ authentication failures during the lock out time will cause the lock out
+ timer to reset to zero, effectively extending the lock out time. Valid
+ authentication attempts during the lock out period will not succeed but
+ will also not reset the lock out time.</p>
+ </td></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td>
+ <p>The HTTP status code to use when the container needs to issue an HTTP
+ redirect to meet the requirements of a configured transport
+ guarantee. The provided status code is not validated. If not
+ specified, the default value of <code>302</code> is used.</p>
+ </td></tr></table>
+
+ <p>See the <a href="../realm-howto.html">Container-Managed Security
+ Guide</a> for more information on setting up container managed security
+ using the LockOutRealm component.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Null_Realm_-_org.apache.catalina.realm.NullRealm">Null Realm - org.apache.catalina.realm.NullRealm</h4><div class="text">
+
+ <p><strong>NullRealm</strong> is a minimal implementation of the Tomcat
+ <code>Realm</code> interface that always returns null when an attempt is
+ made to validate a user name and associated credentials. It is intended to
+ be used as a default Realm implementation when no other Realm is
+ specified.</p>
+
+ <p>The NullRealm implementation supports the following additional
+ attributes.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td>
+ <p>The HTTP status code to use when the container needs to issue an HTTP
+ redirect to meet the requirements of a configured transport
+ guarantee. The provided status code is not validated. If not
+ specified, the default value of <code>302</code> is used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="JDBC_Database_Realm_-_org.apache.catalina.realm.JDBCRealm">JDBC Database Realm - org.apache.catalina.realm.JDBCRealm</h4><div class="text">
+
+ <p><strong>The JDBC Database Realm has been deprecated and will be removed
+ in Tomcat 10 onwards. Use the DataSourceRealm instead.</strong></p>
+
+ <p>The <strong>JDBC Database Realm</strong> connects Tomcat to
+ a relational database, accessed through an appropriate JDBC driver,
+ to perform lookups of usernames, passwords, and their associated
+ roles. Because the lookup is done each time that it is required,
+ changes to the database will be immediately reflected in the
+ information used to authenticate new logins.</p>
+
+ <p>Note: The <strong>JDBC Database Realm</strong> uses a single connection
+ to the database with synchronisation to prevenbt concurrent usage. It is not
+ recommended for production usage. Use the DataSource Realm instaead.</p>
+
+ <p>A rich set of additional attributes lets you configure the required
+ connection to the underlying database, as well as the table and
+ column names used to retrieve the required information:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allRolesMode</code></td><td>
+ <p>This attribute controls how the special role name <code>*</code> is
+ handled when processing authorization constraints in web.xml. By
+ default, the specification compliant value of <code>strict</code> is
+ used which means that the user must be assigned one of the roles defined
+ in web.xml. The alternative values are <code>authOnly</code> which means
+ that the user must be authenticated but no check is made for assigned
+ roles and <code>strictAuthOnly</code> which means that the user must be
+ authenticated and no check will be made for assigned roles unless roles
+ are defined in web.xml in which case the user must be assigned at least
+ one of those roles.</p>
+ <p>When this attribute has the value of <code>authOnly</code> or
+ <code>strictAuthOnly</code>, the <strong>roleNameCol</strong> and
+ <strong>userRoleTable</strong> attributes become optional. If those two
+ attributes are omitted, the user's roles will not be loaded by this
+ Realm.</p>
+ </td></tr><tr><td><strong><code class="attributeName">connectionName</code></strong></td><td>
+ <p>The database username to use when establishing the JDBC
+ connection.</p>
+ </td></tr><tr><td><strong><code class="attributeName">connectionPassword</code></strong></td><td>
+ <p>The database password to use when establishing the JDBC
+ connection.</p>
+ </td></tr><tr><td><strong><code class="attributeName">connectionURL</code></strong></td><td>
+ <p>The connection URL to be passed to the JDBC driver when
+ establishing a database connection.</p>
+ </td></tr><tr><td><strong><code class="attributeName">driverName</code></strong></td><td>
+ <p>Fully qualified Java class name of the JDBC driver to be
+ used to connect to the authentication database.</p>
+ </td></tr><tr><td><code class="attributeName">roleNameCol</code></td><td>
+ <p>Name of the column, in the "user roles" table, which contains
+ a role name assigned to the corresponding user.</p>
+ <p>This attribute is <strong>required</strong> in majority of
+ configurations. See <strong>allRolesMode</strong> attribute for
+ a rare case when it can be omitted.</p>
+ </td></tr><tr><td><code class="attributeName">stripRealmForGss</code></td><td>
+ <p>When processing users authenticated via the GSS-API, this attribute
+ controls if any "@..." is removed from the end of the user
+ name. If not specified, the default is <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td>
+ <p>The HTTP status code to use when the container needs to issue an HTTP
+ redirect to meet the requirements of a configured transport
+ guarantee. The provided status code is not validated. If not
+ specified, the default value of <code>302</code> is used.</p>
+ </td></tr><tr><td><strong><code class="attributeName">userCredCol</code></strong></td><td>
+ <p>Name of the column, in the "users" table, which contains
+ the user's credentials (i.e. password). If a
+ <code>CredentialHandler</code> is specified, this component
+ will assume that the passwords have been encoded with the
+ specified algorithm. Otherwise, they will be assumed to be
+ in clear text.</p>
+ </td></tr><tr><td><strong><code class="attributeName">userNameCol</code></strong></td><td>
+ <p>Name of the column, in the "users" and "user roles" table,
+ that contains the user's username.</p>
+ </td></tr><tr><td><code class="attributeName">userRoleTable</code></td><td>
+ <p>Name of the "user roles" table, which must contain columns
+ named by the <code>userNameCol</code> and <code>roleNameCol</code>
+ attributes.</p>
+ <p>This attribute is <strong>required</strong> in majority of
+ configurations. See <strong>allRolesMode</strong> attribute for
+ a rare case when it can be omitted.</p>
+ </td></tr><tr><td><strong><code class="attributeName">userTable</code></strong></td><td>
+ <p>Name of the "users" table, which must contain columns named
+ by the <code>userNameCol</code> and <code>userCredCol</code>
+ attributes.</p>
+ </td></tr><tr><td><code class="attributeName">X509UsernameRetrieverClassName</code></td><td>
+ <p>When using X509 client certificates, this specifies the class name
+ that will be used to retrieve the user name from the certificate.
+ The class must implement the
+ <code>org.apache.catalina.realm.X509UsernameRetriever</code>
+ interface. The default is to use the certificate's SubjectDN
+ as the username.</p>
+ </td></tr></table>
+
+ <p>See the <a href="../realm-howto.html">Container-Managed Security Guide</a> for more
+ information on setting up container managed security using the
+ JDBC Database Realm component.</p>
+
+ </div></div>
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+ <p>You can nest the following components by nesting the corresponding element
+ inside your <strong>Realm</strong> element:</p>
+ <ul>
+ <li><strong>CombinedRealm Implementation</strong> - If you are using the
+ <em>CombinedRealm Implementation</em> or a Realm
+ that extends the CombinedRealm, e.g. the LockOutRealm, one or more
+ <strong><Realm></strong> elements may be nested inside it.</li>
+ <li><a href="credentialhandler.html"><strong>CredentialHandler</strong></a> -
+ You may nest at most one instance of this element inside a Realm. This
+ configures the credential handler that will be used to validate provided
+ credentials with those stored by the Realm. If not specified a default
+ <em>MessageDigestCredentialHandler</em> will be configured.</li>
+ </ul>
+
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+
+ <p>See <a href="host.html">Single Sign On</a> for information about
+ configuring Single Sign On support for a virtual host.</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/resources.html b/web/tomcat/webapps/docs/config/resources.html
new file mode 100644
index 0000000..da4b55b
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/resources.html
@@ -0,0 +1,278 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Resources Component</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Resources Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The <strong>Resources</strong> element represents all the resources
+ available to the web application. This includes classes, JAR files, HTML, JSPs
+ and any other files that contribute to the web application. Implementations
+ are provided to use directories, JAR files and WARs as the source of these
+ resources and the resources implementation may be extended to provide support
+ for files stored in other forms such as in a database or a versioned
+ repository.</p>
+
+ <p>Resources are cached by default.</p>
+
+ <p><strong>Note: Running a webapp with non-filesystem based
+ Resources implementations is only possible when the webapp does not
+ rely on direct filesystem access to its own resources, and uses the methods
+ in the ServletContext interface to access them.</strong></p>
+
+ <p>A Resources element MAY be nested inside a
+ <a href="context.html">Context</a> component. If it is not included,
+ a default filesystem based Resources will be created automatically,
+ which is sufficient for most requirements.</p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>Resources</strong> support the following
+ attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allowLinking</code></td><td>
+ <p>If the value of this flag is <code>true</code>, symlinks will be
+ allowed inside the web application, pointing to resources inside or
+ outside the web application base path. If not specified, the default
+ value of the flag is <code>false</code>.</p>
+ <p><b>NOTE: This flag MUST NOT be set to true on the Windows platform
+ (or any other OS which does not have a case sensitive filesystem),
+ as it will disable case sensitivity checks, allowing JSP source code
+ disclosure, among other security problems.</b></p>
+ </td></tr><tr><td><code class="attributeName">cacheMaxSize</code></td><td>
+ <p>The maximum size of the static resource cache in kilobytes.
+ If not specified, the default value is <code>10240</code>
+ (10 megabytes). This value may be changed while the web application is
+ running (e.g. via JMX). If the cache is using more memory than the new
+ limit the cache will attempt to reduce in size over time to meet the
+ new limit. If necessary, <strong>cacheObjectMaxSize</strong> will be
+ reduced to ensure that it is no larger than
+ <code>cacheMaxSize/20</code>.</p>
+ </td></tr><tr><td><code class="attributeName">cacheObjectMaxSize</code></td><td>
+ <p>Maximum size of the static resource that will be placed in the cache.
+ If not specified, the default value is <code>512</code>
+ (512 kilobytes). If this value is greater than
+ <code>cacheMaxSize/20</code> it will be reduced to
+ <code>cacheMaxSize/20</code>. This value may be changed while the web
+ application is running (e.g. via JMX).</p>
+ </td></tr><tr><td><code class="attributeName">cacheTtl</code></td><td>
+ <p>The amount of time in milliseconds between the revalidation of cache
+ entries. If not specified, the default value is <code>5000</code> (5
+ seconds). This value may be changed while the web application is running
+ (e.g. via JMX). When a resource is cached it will inherit the TTL in
+ force at the time it was cached and retain that TTL until the resource
+ is evicted from the cache regardless of any subsequent changes that may
+ be made to this attribute.</p>
+ </td></tr><tr><td><code class="attributeName">cachingAllowed</code></td><td>
+ <p>If the value of this flag is <code>true</code>, the cache for static
+ resources will be used. If not specified, the default value
+ of the flag is <code>true</code>. This value may be changed while the
+ web application is running (e.g. via JMX). When the cache is disabled
+ any resources currently in the cache are cleared from the cache.</p>
+ </td></tr><tr><td><code class="attributeName">className</code></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.catalina.WebResourceRoot</code>
+ interface. If not specified, the standard value (defined below) will be
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">trackLockedFiles</code></td><td>
+ <p>Controls whether the track locked files feature is enabled. If
+ enabled, all calls to methods that return objects that lock a file and
+ need to be closed to release that lock (e.g.
+ <code>ServletContext.getResourceAsStream()</code>) will perform a number
+ of additional tasks.</p>
+ <ul>
+ <li>The stack trace at the point where the method was called will be
+ recorded and associated with the returned object.</li>
+ <li>The returned object will be wrapped so that the point where
+ close() (or equivalent) is called to release the resources can be
+ detected. Tracking of the object will cease once the resources have
+ been released.</li>
+ <li>All remaining locked resources on web application shutdown will be
+ logged and then closed.</li>
+ </ul>
+ <p>If not specified, the default value of <code>false</code> will be
+ used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text">
+
+ <h3>Standard Root Implementation</h3>
+
+ <p>The standard implementation of <strong>Resources</strong> is
+ <strong>org.apache.catalina.webresources.StandardRoot</strong>. It does not
+ support any additional attributes.</p>
+
+ <h3>Extracting Root Implementation</h3>
+
+ <p>The extracting implementation of <strong>Resources</strong> is
+ <strong>org.apache.catalina.webresources.ExtractingRoot</strong>. It does not
+ support any additional attributes.</p>
+
+ <p>When deploying web applications as packed WAR files, the extracting root
+ will extract any JAR files from <code>/WEB-INF/lib</code> to a
+ <code>application-jars</code> directory located in the web
+ application's working directory. These extracted JARs will be removed
+ when the web application stops.</p>
+
+ <p>Extracting JAR files from a packed WAR may provide a performance
+ improvement, particularly at web application start when JAR scanning is
+ required by the application.</p>
+
+ </div></div>
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+ <p>A web application's main resources are defined by the
+ <strong>docBase</strong> defined for the <a href="context.html">Context</a>.
+ Additional resources may be made available to the web application by defining
+ one or more nested components.</p>
+
+ <h3>PreResources</h3>
+
+ <p>PreResources are searched before the main resources. They will be searched
+ in the order they are defined. To configure PreResources, nest a
+ <PreResources> element inside the <Resources> element with the
+ following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">base</code></strong></td><td>
+ <p>Identifies where the resources to be used are located. This attribute
+ is required by the <code>org.apache.catalina.WebResourceSet</code>
+ implementations provided by Tomcat and should specify the absolute path to
+ the file, directory or JAR where the resources are located. Custom
+ implementations may not require it.</p>
+ </td></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.catalina.WebResourceSet</code> interface.
+ Tomcat provides three standard implementations:
+ <code>org.apache.catalina.webresources.DirResourceSet</code>,
+ <code>org.apache.catalina.webresources.FileResourceSet</code> and
+ <code>org.apache.catalina.webresources.JarResourceSet</code>. Custom
+ implementations may also be used.
+ </p>
+ </td></tr><tr><td><code class="attributeName">internalPath</code></td><td>
+ <p>Identifies the path within the <strong>base</strong> where the
+ resources are to be found. This is typically only used with JAR files when
+ the resources are not located at the root of the JAR as is the case with
+ resource JARs. This attribute is required by the
+ <code>org.apache.catalina.WebResourceSet</code> implementations provided
+ by Tomcat and must start with '/'. Custom implementations may not require
+ it. If not specified, the default value '/' will be used.</p>
+ </td></tr><tr><td><code class="attributeName">readOnly</code></td><td>
+ <p>If <code>true</code>, resources within this resource set may not be
+ deleted, created or modified. For instance of
+ <code>org.apache.catalina.webresources.JarResourceSet</code>, this
+ attribute is hard-coded to <code>true</code> and may not be changed. For
+ instances of <code>org.apache.catalina.webresources.DirResourceSet</code>
+ and <code>org.apache.catalina.webresources.FileResourceSet</code> the
+ default value of this attribute is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">webAppMount</code></td><td>
+ <p>Identifies the path within the web application that these resources
+ will be made available. For the
+ <code>org.apache.catalina.WebResourceSet</code> implementations provided
+ by Tomcat, this attribute is required and must start with '/'. Custom
+ implementations may not require it. If not specified, the default value of
+ '/' will be used.</p>
+ </td></tr></table>
+
+ <h3>JAR resources</h3>
+
+ <p>JarResources are searched after the main resources but before the
+ PostResources. They will be searched in the order they are defined. To
+ configure JarResources, nest a <JarResources> element inside the
+ <Resources> element. The configuration attributes are the same as for
+ <strong>PreResources</strong>.
+ </p>
+
+ <p>During web application start, the JAR scanning process checks scanned JARs
+ for content under <code>/META-INF/resources</code>. Where found, this static
+ content is added to the JarResources.
+ </p>
+
+ <h3>Post-resources</h3>
+
+ <p>PostResources are searched after the resource JARs. They will be searched
+ in the order they are defined. To configure PostResources, nest a
+ <PostResources> element inside the <Resources> element. The
+ configuration attributes are the same as for <strong>PreResources</strong>.
+ </p>
+
+ <h3>Ordering</h3>
+
+ <p>In addition to the sets of resources described above, the standard
+ implementation also maintains ClassResources which represent the classes
+ contained in the JAR files mapped to <code>/WEB-INF/classes</code>. This
+ allows other components to search for classes with a single call rather than
+ one call to search <code>/WEB-INF/classes</code> followed by another to search
+ the JARs in <code>/WEB-INF/lib</code>. The ClassResources are populated
+ from the JARs mapped to <code>/WEB-INF/lib</code> when the web application
+ starts.</p>
+
+ <p>Therefore, the complete search order is:</p>
+ <ul>
+ <li>PreResources</li>
+ <li>MainResources</li>
+ <li>ClassResources</li>
+ <li>JarResources</li>
+ <li>PostResources</li>
+ </ul>
+
+ <p>The population of ClassResources and JarResources at web application start
+ means that care needs to be taken to add JAR based resources correctly to
+ obtain the desired behaviour. Consider the following example:</p>
+
+ <div class="codeBox"><pre><code><Resources>
+ <PostResources base="D:\Projects\external\classes"
+ className="org.apache.catalina.webresources.DirResourceSet"
+ webAppMount="/WEB-INF/classes"/>
+ <PostResources base="D:\Projects\lib\library1.jar"
+ className="org.apache.catalina.webresources.FileResourceSet"
+ webAppMount="/WEB-INF/lib/library1.jar"/>
+</Resources></code></pre></div>
+
+ <p>Since both resources are PostResources, it might be expected that
+ <code>D:\Projects\external\classes</code> will be searched for classes before
+ <code>D:\Projects\lib\library1.jar</code>. However, by adding the JAR using a
+ <code>FileResourceSet</code>, the JAR is mapped to <code>/WEB-INF/lib</code>
+ and will be processed at application start along with the other JARs in
+ <code>/WEB-INF/lib</code>. The classes from the JAR file will be added to the
+ ClassResources which means they will be searched before the classes from
+ <code>D:\Projects\external\classes</code>. If the desired behaviour is that
+ <code>D:\Projects\external\classes</code> is searched before
+ <code>D:\Projects\lib\library1.jar</code> then a slightly different
+ configuration is required:</p>
+
+ <div class="codeBox"><pre><code><Resources>
+ <PostResources base="D:\Projects\external\classes"
+ className="org.apache.catalina.webresources.DirResourceSet"
+ webAppMount="/WEB-INF/classes"/>
+ <PostResources base="D:\Projects\lib\library1.jar"
+ className="org.apache.catalina.webresources.JarResourceSet"
+ webAppMount="/WEB-INF/classes"/>
+</Resources></code></pre></div>
+
+ <p>In short, the JAR file should be added as a <code>JarResourceSet</code>
+ mapped to <code>/WEB-INF/classes</code> rather than using a
+ <code>FileResourceSet</code> mapped to <code>/WEB-INF/lib</code>.
+ </p>
+
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+
+ <p>No special features are associated with a <strong>Resources</strong>
+ element.</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/server.html b/web/tomcat/webapps/docs/config/server.html
new file mode 100644
index 0000000..d4c0b76
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/server.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Server Component</title><meta name="author" content="Craig R. McClanahan"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Server Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>A <strong>Server</strong> element represents the entire Catalina
+ servlet container. Therefore, it must be the single outermost element
+ in the <code>conf/server.xml</code> configuration file. Its attributes
+ represent the characteristics of the servlet container as a whole.</p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>Server</strong>
+ support the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">className</code></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.catalina.Server</code> interface.
+ If no class name is specified, the standard implementation will
+ be used.</p>
+ </td></tr><tr><td><code class="attributeName">address</code></td><td>
+ <p>The TCP/IP address on which this server waits for a shutdown
+ command. If no address is specified, <code>localhost</code> is used.</p>
+ </td></tr><tr><td><strong><code class="attributeName">port</code></strong></td><td>
+ <p>The TCP/IP port number on which this server waits for a shutdown
+ command. Set to <code>-1</code> to disable the shutdown port.</p>
+ <p>Note: Disabling the shutdown port works well when Tomcat is started
+ using <a href="https://commons.apache.org/daemon/">Apache Commons Daemon</a>
+ (running as a service on Windows or with jsvc on un*xes). It cannot be
+ used when running Tomcat with the standard shell scripts though, as it
+ will prevent shutdown.bat|.sh and catalina.bat|.sh from stopping it
+ gracefully.</p>
+ </td></tr><tr><td><strong><code class="attributeName">shutdown</code></strong></td><td>
+ <p>The command string that must be received via a TCP/IP connection
+ to the specified port number, in order to shut down Tomcat.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text">
+
+ <p>The standard implementation of <strong>Server</strong> is
+ <strong>org.apache.catalina.core.StandardServer</strong>.
+ It supports the following additional attributes (in addition to the
+ common attributes listed above):</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr></table>
+
+ </div></div>
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+ <p>The following components may be nested inside a <strong>Server</strong>
+ element:</p>
+ <ul>
+ <li><a href="service.html"><strong>Service</strong></a> -
+ One or more service element.</li>
+ <li><a href="globalresources.html"><strong>GlobalNamingResources</strong></a> -
+ Configure the JNDI global resources for the server.</li>
+ </ul>
+
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+
+ <p>There are no special features associated with a <strong>Server</strong>.
+ </p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/service.html b/web/tomcat/webapps/docs/config/service.html
new file mode 100644
index 0000000..d168c80
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/service.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Service Component</title><meta name="author" content="Craig R. McClanahan"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Service Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>A <strong>Service</strong> element represents the combination of one or
+ more <strong>Connector</strong> components that share a single
+ <a href="engine.html">Engine</a> component for processing incoming
+ requests. One or more <strong>Service</strong> elements may be nested
+ inside a <a href="server.html">Server</a> element.</p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>Service</strong>
+ support the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">className</code></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.catalina.Service</code> interface.
+ If no class name is specified, the standard implementation will
+ be used.</p>
+ </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td>
+ <p>The display name of this <strong>Service</strong>, which will
+ be included in log messages if you utilize standard Catalina
+ components. The name of each <strong>Service</strong> that is
+ associated with a particular <a href="server.html">Server</a>
+ must be unique.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text">
+
+ <p>The standard implementation of <strong>Service</strong> is
+ <strong>org.apache.catalina.core.StandardService</strong>.
+ It supports the following additional attributes (in addition to the
+ common attributes listed above):</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr></table>
+
+ </div></div>
+
+</div><h3 id="Nested_Components">Nested Components</h3><div class="text">
+
+ <p>The only components that may be nested inside a <strong>Service</strong>
+ element are one or more <strong>Connector</strong> elements,
+ followed by exactly one <a href="engine.html">Engine</a> element.</p>
+
+</div><h3 id="Special_Features">Special Features</h3><div class="text">
+
+ <p>There are no special features associated with a <strong>Service</strong>.
+ </p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/sessionidgenerator.html b/web/tomcat/webapps/docs/config/sessionidgenerator.html
new file mode 100644
index 0000000..6fec0c1
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/sessionidgenerator.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The SessionIdGenerator Component</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The SessionIdGenerator Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The <strong>SessionIdGenerator</strong> element represents the <em>session
+ id generator</em> that will be used to create session ids used by
+ web application HTTP sessions.</p>
+
+ <p>A SessionIdGenerator element MAY be nested inside a
+ <a href="manager.html">Manager</a> component. If it is not included,
+ a default SessionIdGenerator configuration will be created automatically, which
+ is sufficient for most requirements, — see
+ <em>Standard SessionIdGenerator Implementation</em> below for the details
+ of this configuration.</p>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+
+ <p>All implementations of <strong>SessionIdGenerator</strong>
+ support the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">className</code></td><td>
+ <p>Java class name of the implementation to use. This class must
+ implement the <code>org.apache.catalina.SessionIdGenerator</code> interface.
+ If not specified, the standard value (defined below) will be used.</p>
+ </td></tr><tr><td><code class="attributeName">jvmRoute</code></td><td>
+ <p>A routing identifier for this Tomcat instance. It will be added
+ to the session id to allow for stateless stickyness routing by
+ load balancers. The details on how the <code>jvmRoute</code>
+ will be included in the id are implementation dependent.
+ See <a href="#Standard_Implementation">Standard Implementation</a>
+ for the default behavior.</p>
+
+ <p><strong>NOTE</strong> - The value for this property is inherited
+ automatically from the <code>jvmRoute</code> attribute of the
+ <a href="engine.html">Engine</a> element.</p>
+ </td></tr><tr><td><code class="attributeName">sessionIdLength</code></td><td>
+ <p>The length of session ids created by this SessionIdGenerator.
+ The details on how the <code>sessionIdLength</code>
+ influences the session id length are implementation dependent.
+ See <a href="#Standard_Implementation">Standard Implementation</a>
+ for the default behavior.</p>
+ </td></tr></table>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text">
+
+ <p>Tomcat provides a standard implementations of <strong>SessionIdGenerator</strong>
+ for use.</p>
+
+ <h3>Standard SessionIdGenerator Implementation</h3>
+
+ <p>The standard implementation of <strong>SessionIdGenerator</strong> is
+ <strong>org.apache.catalina.util.StandardSessionIdGenerator</strong>.
+ It supports the following attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">jvmRoute</code></td><td>
+ <p>A routing identifier for this Tomcat instance. It will be added
+ to the end of the session id separated by a ".".</p>
+ </td></tr><tr><td><code class="attributeName">sessionIdLength</code></td><td>
+ <p>The length of session ids created by this SessionIdGenerator.
+ More precisely the session id length is twice the value of
+ <code>sessionIdLength</code> plus the length of the trailing
+ <code>jvmRoute</code> if given. The factor 2 is because
+ the session id is constructed using <code>sessionIdLength</code>
+ random bytes, each byte being encoded in two hex characters
+ in the actual id. The default value is 16.</p>
+ </td></tr></table>
+
+ </div></div>
+
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/systemprops.html b/web/tomcat/webapps/docs/config/systemprops.html
new file mode 100644
index 0000000..06c5eb3
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/systemprops.html
@@ -0,0 +1,533 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - System Properties</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>System Properties</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Property_replacements">Property replacements</a></li><li><a href="#Clustering">Clustering</a></li><li><a href="#Expression_Language">Expression Language</a></li><li><a href="#Jasper">Jasper</a></li><li><a href="#Security">Security</a></li><li><a href="#Specifications">Specifications</a></li><li><a href="#Sessions">Sessions</a></li><li><a href="#Logging">Logging</a></li><li><a href="#JAR_Scanning">JAR Scanning</a></li><li><a href="#Websockets">Websockets</a></li><li><a href="#Other">Other</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>The following sections list the system properties that may be set to modify
+ the default Tomcat behaviour.</p>
+</div><h3 id="Property_replacements">Property replacements</h3><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Property
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="propertyName">org.apache.tomcat.util.digester. PROPERTY_SOURCE</code></td><td>
+ <p>Set this to a comma separated list of fully qualified name of classes
+ that implement
+ <code>org.apache.tomcat.util.IntrospectionUtils.PropertySource</code>.
+ Required to have a public constructor with no arguments.</p>
+ <p>Use this to add a property source, that will be invoked when
+ <code>${parameter:-default-value}</code> denoted parameters (with
+ optional default values) are found in the XML files that Tomcat
+ parses.</p>
+ <p>Property replacement from the specified property source on the JVM
+ system properties can also be done using the
+ <code>REPLACE_SYSTEM_PROPERTIES</code> system property.</p>
+ <p><code>org.apache.tomcat.util.digester.EnvironmentPropertySource</code>
+ can be used to replace parameters from the process' environment
+ variables, e.g. injected ConfigMaps or Secret objects in container
+ based systems like OpenShift or Kubernetes.</p>
+ <p><code>org.apache.tomcat.util.digester.SystemPropertySource</code>
+ does replacement with system properties. It is always enabled,
+ but can also be spefied as part of the property value.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.tomcat.util.digester. REPLACE_SYSTEM_PROPERTIES</code></td><td>
+ <p>Set this boolean system property to <code>true</code> to cause
+ property replacement from the digester property source on the JVM
+ system properties.</p>
+ </td></tr></table>
+
+</div><h3 id="Clustering">Clustering</h3><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Property
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="propertyName">org.apache.catalina. tribes.dns_lookups</code></td><td>
+ <p>This system property is deprecated and will be removed without
+ replacement in Apache Tomcat 10 onwards.</p>
+ <p>If <code>true</code>, the clustering module will attempt to use DNS to
+ resolve any host names provided in the cluster configuration.</p>
+ <p>If not specified, the default value of <code>false</code> will be used.</p>
+ </td></tr></table>
+
+</div><h3 id="Expression_Language">Expression Language</h3><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Property
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="propertyName">org.apache.el.BeanELResolver. CACHE_SIZE</code></td><td>
+ <p>The number of javax.el.BeanELResolver.BeanProperties objects that will
+ be cached by the EL Parser.</p>
+ <p>If not specified, the default of <code>1000</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.el.ExpressionBuilder. CACHE_SIZE</code></td><td>
+ <p>The number of parsed EL expressions that will be cached by the EL
+ Parser.</p>
+ <p>If not specified, the default of <code>5000</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.el.parser. COERCE_TO_ZERO</code></td><td>
+ <p>If <code>true</code>, when coercing <code>null</code>s to objects of
+ type Number, Character or Boolean the result will be <code>0</code> for
+ Number and Character types and <code>false</code> for Boolean as required
+ by the EL 2.2 and earlier specifications. If this property is
+ <code>false</code> the result of the coercion will be <code>null</code> as
+ required by the EL 3.0 specification.</p>
+ <p>If not specified, the default value of <code>false</code> will be
+ used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.el.parser. SKIP_IDENTIFIER_CHECK</code></td><td>
+ <p>If <code>true</code>, when parsing expressions, identifiers will not be
+ checked to ensure that they conform to the Java Language Specification for
+ Java identifiers.</p>
+ <p>If not specified, the default value of <code>false</code> will be used.</p>
+ </td></tr></table>
+</div><h3 id="Jasper">Jasper</h3><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Property
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="propertyName">org.apache.jasper.compiler. Generator.POOL_TAGS_WITH_EXTENDS</code></td><td>
+ <p>By default, JSPs that use their own base class via the extends
+ attribute of the page directive, will have Tag pooling disabled since
+ Jasper cannot guarantee that the necessary initialisation will have taken
+ place. This can have a negative impact on performance. Providing the
+ alternative base class calls _jspInit() from Servlet.init(), setting this
+ property to <code>true</code> will enable pooling with an alternative base
+ class. If the alternative base class does not call _jspInit() and this
+ property is <code>true</code>, NPEs will occur when attempting to use
+ tags.</p>
+ <p>If not specified, the default value of <code>false</code> will be used.
+ </p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.compiler. Generator.STRICT_GET_PROPERTY</code></td><td>
+ <p>If <code>true</code>, the requirement to have the object referenced in
+ <code>jsp:getProperty</code> action to be previously "introduced"
+ to the JSP processor, as specified in the chapter JSP.5.3 of JSP 2.0 and
+ later specifications, is enforced.</p>
+ <p>If not specified, the specification compliant default of
+ <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.compiler. Generator.VAR_EXPRESSIONFACTORY</code></td><td>
+ <p>The name of the variable to use for the expression language expression
+ factory.</p>
+ <p>If not specified, the default value of <code>_el_expressionfactory</code>
+ will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.compiler. Generator.VAR_INSTANCEMANAGER</code></td><td>
+ <p>The name of the variable to use for the instance manager factory.</p>
+ <p>If not specified, the default value of <code>_jsp_instancemanager</code>
+ will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.compiler. Parser.STRICT_WHITESPACE</code></td><td>
+ <p>If <code>false</code> the requirements for whitespace before an
+ attribute name will be relaxed so that the lack of whitespace will not
+ cause an error.</p>
+ <p>If not specified, the specification compliant default of
+ <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.runtime. BodyContentImpl.BUFFER_SIZE</code></td><td>
+ <p>The size (in characters) to use when creating a tag buffer.</p>
+ <p>If not specified, the default value of
+ <code>org.apache.jasper.Constants.DEFAULT_TAG_BUFFER_SIZE</code> (512)
+ will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.runtime. BodyContentImpl.LIMIT_BUFFER</code></td><td>
+ <p>If <code>true</code>, any tag buffer that expands beyond
+ <code>org.apache.jasper.runtime.BodyContentImpl.BUFFER_SIZE</code> will be
+ destroyed and a new buffer created.</p>
+ <p>If not specified, the default value of <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.runtime. JspFactoryImpl.USE_POOL</code></td><td>
+ <p>If <code>true</code>, a ThreadLocal <code>PageContext</code> pool will
+ be used.</p>
+ <p>If not specified, the default value of <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.runtime. JspFactoryImpl.POOL_SIZE</code></td><td>
+ <p>The size of the ThreadLocal <code>PageContext</code>.</p>
+ <p>If not specified, the default value of <code>8</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. JSP_SERVLET_BASE</code></td><td>
+ <p>The base class of the Servlets generated from the JSPs.</p>
+ <p>If not specified, the default value of
+ <code>org.apache.jasper.runtime.HttpJspBase</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. SERVICE_METHOD_NAME</code></td><td>
+ <p>The name of the service method called by the base class.</p>
+ <p>If not specified, the default value of <code>_jspService</code>
+ will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. SERVLET_CLASSPATH</code></td><td>
+ <p>The name of the ServletContext attribute that provides the classpath
+ for the JSP.</p>
+ <p>If not specified, the default value of
+ <code>org.apache.catalina.jsp_classpath</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. JSP_FILE</code></td><td>
+ <p>The name of the request attribute for <code><jsp-file></code>
+ element of a servlet definition. If present on a request, this overrides
+ the value returned by <code>request.getServletPath()</code> to select the
+ JSP page to be executed.</p>
+ <p>If not specified, the default value of
+ <code>org.apache.catalina.jsp_file</code> will be used.</p>
+ <p><strong>Deprecated:</strong> This will be removed in Tomcat 9.0.x
+ onwards. It is replaced by the use of the jspFile servlet initialisation
+ parameter</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. PRECOMPILE</code></td><td>
+ <p>The name of the query parameter that causes the JSP engine to just
+ pregenerate the servlet but not invoke it.</p>
+ <p>If not specified, the default value of <code>jsp_precompile</code>
+ will be used, as defined by JSP specification (JSP.11.4.2).</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. JSP_PACKAGE_NAME</code></td><td>
+ <p>The default package name for compiled JSPs.</p>
+ <p>If not specified, the default value of <code>org.apache.jsp</code>
+ will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. TAG_FILE_PACKAGE_NAME</code></td><td>
+ <p>The default package name for tag handlers generated from tag files.</p>
+ <p>If not specified, the default value of <code>org.apache.jsp.tag</code>
+ will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. ALT_DD_ATTR</code></td><td>
+ <p>The servlet context attribute under which the alternate deployment
+ descriptor for this web application is stored.</p>
+ <p>If not specified, the default value of
+ <code>org.apache.catalina.deploy.alt_dd</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. TEMP_VARIABLE_NAME_PREFIX</code></td><td>
+ <p>Prefix to use for generated temporary variable names.</p>
+ <p>If not specified, the default value of <code>_jspx_temp</code>
+ will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. USE_INSTANCE_MANAGER_FOR_TAGS</code></td><td>
+ <p>If <code>true</code>, the instance manager is used to obtain tag
+ handler instances.</p>
+ <p>If not specified, the default value of <code>false</code> will be used.</p>
+ </td></tr></table>
+
+</div><h3 id="Security">Security</h3><div class="text">
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Property
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="propertyName">org.apache.catalina.connector. RECYCLE_FACADES</code></td><td>
+ <p>If this is <code>true</code> or if a security manager is in use a new
+ facade object will be created for each request.</p>
+ <p>If not specified, the default value of <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.catalina.connector. CoyoteAdapter.ALLOW_BACKSLASH</code></td><td>
+ <p>If this is <code>true</code> the '\' character will be permitted as a
+ path delimiter.</p>
+ <p>If not specified, the default value of <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.tomcat.util.buf. UDecoder.ALLOW_ENCODED_SLASH</code></td><td>
+ <p>Use of this system property is deprecated. It will be removed from
+ Tomcat 10 onwards.</p>
+ <p>If this system property is set to <code>true</code>, the default for
+ the <code>encodedSolidusHandling</code> attribute of all Connectors will
+ be changed from <code>reject</code> to <code>decode</code>. If decoded, it
+ will be treated a path delimiter.</p>
+ </td></tr></table>
+
+</div><h3 id="Specifications">Specifications</h3><div class="text">
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Property
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="propertyName">org.apache.catalina. STRICT_SERVLET_COMPLIANCE</code></td><td>
+ <p>The default value of this system property is <code>false</code>.</p>
+ <p>If this is <code>true</code> the default values will be changed for:</p>
+ <ul>
+ <li><code>org.apache.catalina.core.<br>ApplicationContext.GET_RESOURCE_REQUIRE_SLASH</code></li>
+ <li><code>org.apache.catalina.core.<br>ApplicationDispatcher.WRAP_SAME_OBJECT</code></li>
+ <li><code>org.apache.catalina.core.<br>StandardHostValve.ACCESS_SESSION</code></li>
+ <li><code>org.apache.catalina.session.<br>StandardSession.ACTIVITY_CHECK</code></li>
+ <li><code>org.apache.catalina.session.<br>StandardSession.LAST_ACCESS_AT_START</code></li>
+ <li><code>org.apache.tomcat.util.http.<br>ServerCookie.STRICT_NAMING</code></li>
+ <li>The <code>URIEncoding</code> attribute of any
+ <a href="http.html">HTTP connector</a> or
+ <a href="ajp.html">AJP connector</a> element.</li>
+ <li>The <code>resourceOnlyServlets</code> attribute of any
+ <a href="context.html">Context</a> element.</li>
+ <li>The <code>tldValidation</code> attribute of any
+ <a href="context.html">Context</a> element.</li>
+ <li>The <code>useRelativeRedirects</code> attribute of any
+ <a href="context.html">Context</a> element.</li>
+ <li>The <code>xmlNamespaceAware</code> attribute of any
+ <a href="context.html">Context</a> element.</li>
+ <li>The <code>xmlValidation</code> attribute of any
+ <a href="context.html">Context</a> element.</li>
+ </ul>
+ </td></tr><tr><td><code class="propertyName">org.apache.catalina.connector. Response.ENFORCE_ENCODING_IN_GET_WRITER</code></td><td>
+ <p>If this is <code>true</code> then
+ a call to <code>Response.getWriter()</code> if no character encoding
+ has been specified will result in subsequent calls to
+ <code>Response.getCharacterEncoding()</code> returning
+ <code>ISO-8859-1</code> and the <code>Content-Type</code> response header
+ will include a <code>charset=ISO-8859-1</code> component. (SRV.15.2.22.1)</p>
+ <p>If not specified, the default specification compliant value of
+ <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.catalina.core.ApplicationContext .GET_RESOURCE_REQUIRE_SLASH</code></td><td>
+ <p>If this is <code>true</code> then the path passed to
+ <code>ServletContext.getResource()</code> or
+ <code>ServletContext.getResourceAsStream()</code> must start with
+ "/". If <code>false</code>, code like
+ <code>getResource("myfolder/myresource.txt")</code> will work as Tomcat
+ will prepend "/" to the provided path.</p>
+ <p>If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> is set to
+ <code>true</code>, the default of this setting will be <code>true</code>,
+ else the default value will be <code>false</code>.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.catalina.core. ApplicationDispatcher.WRAP_SAME_OBJECT</code></td><td>
+ <p>If this is <code>true</code> then any wrapped request or response
+ object passed to an application dispatcher will be checked to ensure that
+ it has wrapped the original request or response.</p>
+ <p>If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> is set to
+ <code>true</code>, the default of this setting will be <code>true</code>,
+ else the default value will be <code>false</code>.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.tomcat.websocket. STRICT_SPEC_COMPLIANCE</code></td><td>
+ <p>The default value of this system property is <code>false</code>.</p>
+ <p>If this is <code>true</code> the default values will be changed for:</p>
+ <ul>
+ <li><code>org.apache.tomcat.websocket.server#isEnforceNoAddAfterHandshake</code>
+ (default changes from <code>false</code> to <code>true</code>)</li>
+ </ul>
+ </td></tr><tr><td><code class="propertyName">org.apache.tomcat.util.http. ServerCookie.STRICT_NAMING</code></td><td>
+ <p> If this is <code>true</code> then the requirements of the Servlet specification
+ that Cookie names must adhere to RFC2109 will be enforced. If this is
+ <code>false</code> the naming rules specified in RFC6265 (allow the leading "$")
+ will be used.</p>
+ <p>If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> is set to
+ <code>true</code>, the default of this setting will be <code>true</code>,
+ else the default value will be <code>false</code>.</p>
+ </td></tr></table>
+
+</div><h3 id="Sessions">Sessions</h3><div class="text">
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Property
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="propertyName">org.apache.catalina.authenticator. Constants.SSO_SESSION_COOKIE_NAME</code></td><td>
+ <p>An alternative name for the single sign on session cookie. Defaults to
+ <code>JSESSIONIDSSO</code>.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.catalina.core. StandardHostValve.ACCESS_SESSION</code></td><td>
+ <p>If this is <code>true</code>, every request that is associated with a
+ session will cause the session's last accessed time to be updated
+ regardless of whether or not the request explicitly accesses the session.</p>
+ <p>If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> is set to
+ <code>true</code>, the default of this setting will be <code>true</code>,
+ else the default value will be <code>false</code>.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.catalina.session. StandardSession.ACTIVITY_CHECK</code></td><td>
+ <p>If this is <code>true</code>, Tomcat will track the number of active
+ requests for each session. When determining if a session is valid, any
+ session with at least one active request will always be considered valid.</p>
+ <p>If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> is set to
+ <code>true</code>, the default of this setting will be <code>true</code>,
+ else the default value will be <code>false</code>.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.catalina.session. StandardSession.LAST_ACCESS_AT_START</code></td><td>
+ <p>If this is <code>true</code>, the last accessed time for sessions will
+ be calculated from the beginning of the previous request. If
+ <code>false</code>, the last accessed time for sessions will be calculated
+ from the end of the previous request. This also affects how the idle time
+ is calculated.</p>
+ <p>If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> is set to
+ <code>true</code>, the default of this setting will be <code>true</code>,
+ else the default value will be <code>false</code>.</p>
+ </td></tr></table>
+
+</div><h3 id="Logging">Logging</h3><div class="text">
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Property
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="propertyName">org.apache.juli.formatter</code></td><td>
+ <p>If no logging configuration file is specified and no logging configuration class is specified
+ using the <code>java.util.logging.config.class</code> and <code>java.util.logging.config.file</code>
+ properties the default logging framework <code>org.apache.juli</code> will use the default
+ <code>java.util.logging.SimpleFormatter</code> for all console output.
+ To simply override the console output formatter, one can use the described property. Example:
+ <code>-Dorg.apache.juli.formatter=org.apache.juli.OneLineFormatter</code></p>
+ </td></tr><tr><td><code class="propertyName">org.apache.juli. AsyncMaxRecordCount</code></td><td>
+ <p>The maximum number of log records that the JULI AsyncFileHandler will queue in memory.
+ New records are added to the queue and get asynchronously removed from the queue
+ and written to the files by a single writer thread.
+ When the queue is full and a new record is being logged
+ the log record will be handled based on the <code>org.apache.juli.AsyncOverflowDropType</code> setting.</p>
+ <p>The default value is <code>10000</code> records.
+ This number represents the global number of records, not on a per handler basis.
+ </p>
+ </td></tr><tr><td><code class="propertyName">org.apache.juli. AsyncOverflowDropType</code></td><td>
+ <p>When the queue of log records of the JULI AsyncFileHandler is full,
+ new log records are handled according to the following setting:
+ </p>
+ <ul>
+ <li><code>1</code> - the newest record in the queue will be dropped and not logged</li>
+ <li><code>2</code> - the oldest record in the queue will be dropped and not logged</li>
+ <li><code>3</code> - suspend the logging thread until older records got written to the log file and the queue is no longer full.
+ This is the only setting that ensures that no messages get lost.</li>
+ <li><code>4</code> - drop the current log record</li>
+ </ul>
+ <p>The default value is <code>1</code> (drop the newest record in the queue).</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.juli. AsyncLoggerPollInterval</code></td><td>
+ <p>The poll interval in milliseconds for the asynchronous logger thread.
+ If the log queue is empty, the async thread will issue a poll(poll interval)
+ in order to not wake up too often.</p>
+ <p>The default value is <code>1000</code> milliseconds.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.juli.logging. UserDataHelper.CONFIG</code></td><td>
+ <p>The type of logging to use for errors generated by invalid input data.
+ The options are: <code>DEBUG_ALL</code>, <code>INFO_THEN_DEBUG</code>,
+ <code>INFO_ALL</code> and <code>NONE</code>. When
+ <code>INFO_THEN_DEBUG</code> is used, the period for which errors are
+ logged at DEBUG rather than INFO is controlled by the system property
+ <code>org.apache.juli.logging.UserDataHelper.SUPPRESSION_TIME</code>.
+ </p>
+ <p>The default value is <code>INFO_THEN_DEBUG</code>.</p>
+ <p>The errors currently logged using this system are:</p>
+ <ul>
+ <li>invalid cookies;</li>
+ <li>invalid parameters;</li>
+ <li>too many headers, too many parameters (hitting
+ <code>maxHeaderCount</code> or <code>maxParameterCount</code> limits
+ of a <a href="http.html">connector</a>).</li>
+ <li>invalid host names</li>
+ </ul>
+ <p>Other errors triggered by invalid input data may be added to this
+ system in later versions.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.juli.logging. UserDataHelper.SUPPRESSION_TIME</code></td><td>
+ <p>When using <code>INFO_THEN_DEBUG</code> for
+ <code>org.apache.juli.logging.UserDataHelper.CONFIG</code> this system
+ property controls how long messages are logged at DEBUG after a message
+ has been logged at INFO. Once this period has elapsed, the next message
+ will be logged at INFO followed by a new suppression period where
+ messages are logged at DEBUG and so on. The value is measured
+ in seconds.</p>
+ <p>A value of <code>0</code> is equivalent to using <code>INFO_ALL</code>
+ for <code>org.apache.juli.logging.UserDataHelper.CONFIG</code>.</p>
+ <p>A negative value means an infinite suppression period.</p>
+ <p>The default value is <code>86400</code> (24 hours).</p>
+ </td></tr></table>
+
+</div><h3 id="JAR_Scanning">JAR Scanning</h3><div class="text">
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Property
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="propertyName">tomcat.util.scan. StandardJarScanFilter.jarsToSkip</code></td><td>
+ <p>A list of comma-separated file name patters that is used as the default
+ value for <code>pluggabilitySkip</code> and <code>tldSkip</code>
+ attributes of the standard
+ <a href="jar-scan-filter.html">JarScanFilter</a> implementation.</p>
+ <p>The coded default is empty, however the system property is set in
+ a default Tomcat installation via the
+ <code>$CATALINA_BASE/conf/catalina.properties</code> file.</p>
+ </td></tr><tr><td><code class="propertyName">tomcat.util.scan. StandardJarScanFilter.jarsToScan</code></td><td>
+ <p>A list of comma-separated file name patters that is used as the default
+ value for <code>pluggabilityScan</code> and <code>tldScan</code>
+ attributes of the standard
+ <a href="jar-scan-filter.html">JarScanFilter</a> implementation.</p>
+ <p>The coded default is empty, however the system property is set in
+ a default Tomcat installation via the
+ <code>$CATALINA_BASE/conf/catalina.properties</code> file.</p>
+ </td></tr></table>
+
+</div><h3 id="Websockets">Websockets</h3><div class="text">
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Property
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="propertyName">org.apache.tomcat. websocket.ALLOW_UNSUPPORTED_EXTENSIONS</code></td><td>
+ <p>If <code>true</code>, allow unknown extensions to be declared by
+ the user.</p>
+ <p>The default value is <code>false</code>.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.tomcat. websocket.DEFAULT_BUFFER_SIZE</code></td><td>
+ <p>The default size for buffers used in the Websockets container.</p>
+ <p>The default value is <code>8192</code> which corresponds to 8KB.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.tomcat. websocket.DEFAULT_ORIGIN_HEADER_VALUE</code></td><td>
+ <p>Default value of the origin header that will be sent by the client
+ during the upgrade handshake.</p>
+ <p>The default is null so that no origin header is sent.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.tomcat. websocket.DEFAULT_PROCESS_PERIOD</code></td><td>
+ <p>The number of periodic ticks between periodic processing which
+ involves in particular session expiration checks.</p>
+ <p>The default value is <code>10</code> which corresponds to 10
+ seconds.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.tomcat. websocket.DISABLE_BUILTIN_EXTENSIONS</code></td><td>
+ <p>If <code>true</code>, disable all built-in extensions provided by the
+ server, such as message compression.</p>
+ <p>The default value is <code>false</code>.</p>
+ </td></tr></table>
+
+</div><h3 id="Other">Other</h3><div class="text">
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Property
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="propertyName">org.apache.coyote. USE_CUSTOM_STATUS_MSG_IN_HEADER</code></td><td><p>If this is
+ <code>true</code>, custom HTTP status messages will be used within HTTP
+ headers. If a custom message is specified that is not valid for use in an
+ HTTP header (as defined by RFC2616) then the custom message will be
+ ignored and the default message used.</p>
+ <p>If not specified, the default value of <code>false</code> will be used.</p>
+ <p><strong>Note:</strong> This option is deprecated and will be removed
+ in Tomcat 9. The reason phrase will not be sent.</p>
+ </td></tr><tr><td><code class="propertyName">catalina.useNaming</code></td><td>
+ <p>If this is <code>false</code> it will override the
+ <code>useNaming</code> attribute for all <a href="context.html">
+ Context</a> elements.</p>
+ </td></tr><tr><td><code class="propertyName">javax.sql.DataSource.Factory</code></td><td>
+ <p>The class name of the factory to use to create resources of type
+ <code>javax.sql.DataSource</code>. If not specified the default of
+ <code>org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory</code> is used
+ which is a package renamed (to avoid conflicts) copy of
+ <a href="https://commons.apache.org/dbcp">Apache Commons DBCP 2</a>.</p>
+ </td></tr><tr><td><code class="propertyName">javax.mail.Session.Factory</code></td><td>
+ <p>The class name of the factory to use to create resources of type
+ <code>javax.mail.Session</code>. If not specified the default of
+ <code>org.apache.naming.factory.MailSessionFactory</code> is used.</p>
+ </td></tr><tr><td><code class="propertyName">jvmRoute</code></td><td>
+ <p>Provides a default value for the <code>jvmRoute</code> attribute of the
+ <a href="engine.html">Engine</a> element. It does not override the value
+ configured on the <a href="engine.html">Engine</a> element.</p>
+ </td></tr><tr><td><code class="propertyName">catalina.config</code></td><td>
+ <p>The URL for the catalina.properties configuration file.</p>
+ </td></tr><tr><td><code class="propertyName">tomcat.util.buf.StringCache.byte.enabled</code></td><td>
+ <p>If <code>true</code>, the String cache is enabled for
+ <code>ByteChunk</code>.</p>
+ <p>If not specified, the default value of <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">tomcat.util.buf.StringCache.char.enabled</code></td><td>
+ <p>If <code>true</code>, the String cache is enabled for
+ <code>CharChunk</code>.</p>
+ <p>If not specified, the default value of <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">tomcat.util.buf.StringCache.trainThreshold</code></td><td>
+ <p>The number of times <code>toString()</code> must be called before the
+ cache is activated.</p>
+ <p>If not specified, the default value of <code>20000</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">tomcat.util.buf.StringCache.cacheSize</code></td><td>
+ <p>The size of the String cache.</p>
+ <p>If not specified, the default value of <code>200</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.tomcat.util.buf.UriUtil. WAR_SEPARATOR</code></td><td>
+ <p>The character to use to separate the WAR file and WAR content parts of
+ a WAR URL using the custom WAR scheme provided by Tomcat. This is
+ equivalent to how <code>!</code> is used in JAR URLs.</p>
+ <p>If not specified, the default value of <code>*</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">tomcat.util.buf.StringCache.maxStringSize</code></td><td>
+ <p>The maximum length of String that will be cached.</p>
+ <p>If not specified, the default value of <code>128</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.tomcat.util. http.FastHttpDateFormat.CACHE_SIZE</code></td><td>
+ <p>The size of the cache to use parsed and formatted date value.</p>
+ <p>If not specified, the default value of <code>1000</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.tomcat.util. net.NioSelectorShared</code></td><td>
+ <p>If <code>true</code>, use a shared selector for servlet write/read.</p>
+ <p>If not specified, the default value of <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.catalina.startup. EXIT_ON_INIT_FAILURE</code></td><td>
+ <p>If <code>true</code>, the server will exit if an exception happens
+ during the server initialization phase.</p>
+ <p>If not specified, the default value of <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.catalina.startup. RealmRuleSet.MAX_NESTED_REALM_LEVELS</code></td><td>
+ <p>The CombinedRealm allows nested Realms. This property controls the
+ maximum permitted number of levels of nesting.</p>
+ <p>If not specified, the default value of <code>3</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">org.apache.catalina.startup. CredentialHandlerRuleSet.MAX_NESTED_LEVELS</code></td><td>
+ <p>The NestedCredentialHandler allows nested CredentialHandlers. This
+ property controls the maximum permitted number of levels of nesting.</p>
+ <p>If not specified, the default value of <code>3</code> will be used.</p>
+ </td></tr><tr><td><code class="propertyName">tomcat.util.http.parser.HttpParser. requestTargetAllow</code></td><td>
+ <p><i>This system property is deprecated. Use the
+ <code>relaxedPathChars</code> and <code>relaxedQueryChars</code>
+ attributes of the Connector instead. These attributes permit a wider range
+ of characters to be configured as valid.</i></p>
+ <p>A string comprised of characters the server should allow even when they are not encoded.
+ These characters would normally result in a 400 status.</p>
+ <p>The acceptable characters for this property are: <code>|</code>, <code>{</code>
+ , and <code>}</code></p>
+ <p><strong>WARNING</strong>: Use of this option may expose the server to CVE-2016-6816.
+ </p>
+ <p>If not specified, the default value of <code>null</code> will be used.</p>
+ </td></tr></table>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/config/valve.html b/web/tomcat/webapps/docs/config/valve.html
new file mode 100644
index 0000000..07b361e
--- /dev/null
+++ b/web/tomcat/webapps/docs/config/valve.html
@@ -0,0 +1,2040 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 Configuration Reference (8.5.73) - The Valve Component</title><meta name="author" content="Craig R. McClanahan"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8 Configuration Reference</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Valve Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Access_Logging">Access Logging</a><ol><li><a href="#Access_Log_Valve">Access Log Valve</a><ol><li><a href="#Access_Log_Valve/Introduction">Introduction</a></li><li><a href="#Access_Log_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Extended_Access_Log_Valve">Extended Access Log Valve</a><ol><li><a href="#Extended_Access_Log_Valve/Introduction">Introduction</a></li><li><a href="#Extended_Access_Log_Valve/Attributes">Attributes</a></li></ol></li></ol></li><li><a href="#Access_Control">Access Control</a><ol><li><a href="#Remote_Address_Valve">Remote Address Valve</a><ol><li><a href="#Remote_Address_Valve/Introduction">Introduction</a></li><li><a href="#Remote_Address_Valve/Attributes">Attributes</a></li><li><a href="#Remote_Address_Valve/Example_localhost">Example 1</a></li><li><a href="#Remote_Address_Valve/Example_localhost_port">Example 2</a></li><li><a href="#Remote_Address_Valve/Example_port_auth">Example 3</a></li></ol></li><li><a href="#Remote_Host_Valve">Remote Host Valve</a><ol><li><a href="#Remote_Host_Valve/Introduction">Introduction</a></li><li><a href="#Remote_Host_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Remote_CIDR_Valve">Remote CIDR Valve</a><ol><li><a href="#Remote_CIDR_Valve/Introduction">Introduction</a></li><li><a href="#Remote_CIDR_Valve/Attributes">Attributes</a></li><li><a href="#Remote_CIDR_Valve/Example_localhost">Example 1</a></li><li><a href="#Remote_CIDR_Valve/Example_localhost_port">Example 2</a></li><li><a href="#Remote_CIDR_Valve/Example_port_auth">Example 3</a></li></ol></li></ol></li><li><a href="#Proxies_Support">Proxies Support</a><ol><li><a href="#Load_Balancer_Draining_Valve">Load Balancer Draining Valve</a><ol><li><a href="#Load_Balancer_Draining_Valve/Introduction">Introduction</a></li><li><a href="#Load_Balancer_Draining_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Remote_IP_Valve">Remote IP Valve</a><ol><li><a href="#Remote_IP_Valve/Introduction">Introduction</a></li><li><a href="#Remote_IP_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#SSL_Valve">SSL Valve</a><ol><li><a href="#SSL_Valve/Introduction">Introduction</a></li><li><a href="#SSL_Valve/Attributes">Attributes</a></li></ol></li></ol></li><li><a href="#Single_Sign_On_Valve">Single Sign On Valve</a><ol><li><a href="#Single_Sign_On_Valve/Introduction">Introduction</a></li><li><a href="#Single_Sign_On_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Authentication">Authentication</a><ol><li><a href="#Basic_Authenticator_Valve">Basic Authenticator Valve</a><ol><li><a href="#Basic_Authenticator_Valve/Introduction">Introduction</a></li><li><a href="#Basic_Authenticator_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Digest_Authenticator_Valve">Digest Authenticator Valve</a><ol><li><a href="#Digest_Authenticator_Valve/Introduction">Introduction</a></li><li><a href="#Digest_Authenticator_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Form_Authenticator_Valve">Form Authenticator Valve</a><ol><li><a href="#Form_Authenticator_Valve/Introduction">Introduction</a></li><li><a href="#Form_Authenticator_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#SSL_Authenticator_Valve">SSL Authenticator Valve</a><ol><li><a href="#SSL_Authenticator_Valve/Introduction">Introduction</a></li><li><a href="#SSL_Authenticator_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#SPNEGO_Valve">SPNEGO Valve</a><ol><li><a href="#SPNEGO_Valve/Introduction">Introduction</a></li><li><a href="#SPNEGO_Valve/Attributes">Attributes</a></li></ol></li></ol></li><li><a href="#Error_Report_Valve">Error Report Valve</a><ol><li><a href="#Error_Report_Valve/Introduction">Introduction</a></li><li><a href="#Error_Report_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Crawler_Session_Manager_Valve">Crawler Session Manager Valve</a><ol><li><a href="#Crawler_Session_Manager_Valve/Introduction">Introduction</a></li><li><a href="#Crawler_Session_Manager_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Stuck_Thread_Detection_Valve">Stuck Thread Detection Valve</a><ol><li><a href="#Stuck_Thread_Detection_Valve/Introduction">Introduction</a></li><li><a href="#Stuck_Thread_Detection_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Semaphore_Valve">Semaphore Valve</a><ol><li><a href="#Semaphore_Valve/Introduction">Introduction</a></li><li><a href="#Semaphore_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Persistent_Valve">Persistent Valve</a><ol><li><a href="#Persistent_Valve/Introduction">Introduction</a></li><li><a href="#Persistent_Valve/Attributes">Attributes</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>A <strong>Valve</strong> element represents a component that will be
+ inserted into the request processing pipeline for the associated
+ Catalina container (<a href="engine.html">Engine</a>,
+ <a href="host.html">Host</a>, or <a href="context.html">Context</a>).
+ Individual Valves have distinct processing capabilities, and are
+ described individually below.</p>
+
+ <p><em>The description below uses the variable name $CATALINA_BASE to refer the
+ base directory against which most relative paths are resolved. If you have
+ not configured Tomcat for multiple instances by setting a CATALINA_BASE
+ directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME,
+ the directory into which you have installed Tomcat.</em></p>
+
+</div><h3 id="Access_Logging">Access Logging</h3><div class="text">
+
+<p>Access logging is performed by valves that implement
+<strong>org.apache.catalina.AccessLog</strong> interface.</p>
+
+<div class="subsection"><h4 id="Access_Log_Valve">Access Log Valve</h4><div class="text">
+
+ <div class="subsection"><h4 id="Access_Log_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>The <strong>Access Log Valve</strong> creates log files in the
+ same format as those created by standard web servers. These logs
+ can later be analyzed by standard log analysis tools to track page
+ hit counts, user session activity, and so on. This <code>Valve</code>
+ uses self-contained logic to write its log files, which can be
+ automatically rolled over at midnight each day. (The essential
+ requirement for access logging is to handle a large continuous
+ stream of data with low overhead. This <code>Valve</code> does not
+ use Apache Commons Logging, thus avoiding additional overhead and
+ potentially complex configuration).</p>
+
+ <p>This <code>Valve</code> may be associated with any Catalina container
+ (<code>Context</code>, <code>Host</code>, or <code>Engine</code>), and
+ will record ALL requests processed by that container.</p>
+
+ <p>Some requests may be handled by Tomcat before they are passed to a
+ container. These include redirects from /foo to /foo/ and the rejection of
+ invalid requests. Where Tomcat can identify the <code>Context</code> that
+ would have handled the request, the request/response will be logged in the
+ <code>AccessLog</code>(s) associated <code>Context</code>, <code>Host</code>
+ and <code>Engine</code>. Where Tomcat cannot identify the
+ <code>Context</code> that would have handled the request, e.g. in cases
+ where the URL is invalid, Tomcat will look first in the <code>Engine</code>,
+ then the default <code>Host</code> for the <code>Engine</code> and finally
+ the ROOT (or default) <code>Context</code> for the default <code>Host</code>
+ for an <code>AccessLog</code> implementation. Tomcat will use the first
+ <code>AccessLog</code> implementation found to log those requests that are
+ rejected before they are passed to a container.</p>
+
+ <p>The output file will be placed in the directory given by the
+ <code>directory</code> attribute. The name of the file is composed
+ by concatenation of the configured <code>prefix</code>, timestamp and
+ <code>suffix</code>. The format of the timestamp in the file name can be
+ set using the <code>fileDateFormat</code> attribute. This timestamp will
+ be omitted if the file rotation is switched off by setting
+ <code>rotatable</code> to <code>false</code>.</p>
+
+ <p><strong>Warning:</strong> If multiple AccessLogValve instances
+ are used, they should be configured to use different output files.</p>
+
+ <p>If sendfile is used, the response bytes will be written asynchronously
+ in a separate thread and the access log valve will not know how many bytes
+ were actually written. In this case, the number of bytes that was passed to
+ the sendfile thread for writing will be recorded in the access log valve.
+ </p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Access_Log_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>Access Log Valve</strong> supports the following
+ configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">buffered</code></td><td>
+ <p>Flag to determine if logging will be buffered.
+ If set to <code>false</code>, then access logging will be written after each
+ request. Default value: <code>true</code>
+ </p>
+ </td></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.valves.AccessLogValve</strong> to use the
+ default access log valve.</p>
+ </td></tr><tr><td><code class="attributeName">condition</code></td><td>
+ <p>The same as <code>conditionUnless</code>. This attribute is
+ provided for backwards compatibility.
+ </p>
+ </td></tr><tr><td><code class="attributeName">conditionIf</code></td><td>
+ <p>Turns on conditional logging. If set, requests will be
+ logged only if <code>ServletRequest.getAttribute()</code> is
+ not null. For example, if this value is set to
+ <code>important</code>, then a particular request will only be logged
+ if <code>ServletRequest.getAttribute("important") != null</code>.
+ The use of Filters is an easy way to set/unset the attribute
+ in the ServletRequest on many different requests.
+ </p>
+ </td></tr><tr><td><code class="attributeName">conditionUnless</code></td><td>
+ <p>Turns on conditional logging. If set, requests will be
+ logged only if <code>ServletRequest.getAttribute()</code> is
+ null. For example, if this value is set to
+ <code>junk</code>, then a particular request will only be logged
+ if <code>ServletRequest.getAttribute("junk") == null</code>.
+ The use of Filters is an easy way to set/unset the attribute
+ in the ServletRequest on many different requests.
+ </p>
+ </td></tr><tr><td><code class="attributeName">directory</code></td><td>
+ <p>Absolute or relative pathname of a directory in which log files
+ created by this valve will be placed. If a relative path is
+ specified, it is interpreted as relative to $CATALINA_BASE. If
+ no directory attribute is specified, the default value is "logs"
+ (relative to $CATALINA_BASE).</p>
+ </td></tr><tr><td><code class="attributeName">encoding</code></td><td>
+ <p>Character set used to write the log file. An empty string means
+ to use the system default character set. Default value: use the
+ system default character set.
+ </p>
+ </td></tr><tr><td><code class="attributeName">fileDateFormat</code></td><td>
+ <p>Allows a customized timestamp in the access log file name.
+ The file is rotated whenever the formatted timestamp changes.
+ The default value is <code>.yyyy-MM-dd</code>.
+ If you wish to rotate every hour, then set this value
+ to <code>.yyyy-MM-dd.HH</code>.
+ The date format will always be localized
+ using the locale <code>en_US</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">ipv6Canonical</code></td><td>
+ <p>Flag to determine if IPv6 addresses should be represented in canonical
+ representation format as defined by RFC 5952. If set to <code>true</code>,
+ then IPv6 addresses will be written in canonical format (e.g.
+ <code>2001:db8::1:0:0:1</code>, <code>::1</code>), otherwise it will be
+ represented in full form (e.g. <code>2001:db8:0:0:1:0:0:1</code>,
+ <code>0:0:0:0:0:0:0:1</code>). Default value: <code>false</code>
+ </p>
+ </td></tr><tr><td><code class="attributeName">locale</code></td><td>
+ <p>The locale used to format timestamps in the access log
+ lines. Any timestamps configured using an
+ explicit SimpleDateFormat pattern (<code>%{xxx}t</code>)
+ are formatted in this locale. By default the
+ default locale of the Java process is used. Switching the
+ locale after the AccessLogValve is initialized is not supported.
+ Any timestamps using the common log format
+ (<code>CLF</code>) are always formatted in the locale
+ <code>en_US</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">maxDays</code></td><td>
+ <p>The maximum number of days rotated access logs will be retained for
+ before being deleted. If not specified, the default value of
+ <code>-1</code> will be used which means never delete old files.</p>
+ </td></tr><tr><td><code class="attributeName">maxLogMessageBufferSize</code></td><td>
+ <p>Log message buffers are usually recycled and re-used. To prevent
+ excessive memory usage, if a buffer grows beyond this size it will be
+ discarded. The default is <code>256</code> characters. This should be
+ set to larger than the typical access log message size.</p>
+ </td></tr><tr><td><code class="attributeName">pattern</code></td><td>
+ <p>A formatting layout identifying the various information fields
+ from the request and response to be logged, or the word
+ <code>common</code> or <code>combined</code> to select a
+ standard format. See below for more information on configuring
+ this attribute.</p>
+ </td></tr><tr><td><code class="attributeName">prefix</code></td><td>
+ <p>The prefix added to the start of each log file's name. If not
+ specified, the default value is "access_log".</p>
+ </td></tr><tr><td><code class="attributeName">renameOnRotate</code></td><td>
+ <p>By default for a rotatable log the active access log file name
+ will contain the current timestamp in <code>fileDateFormat</code>.
+ During rotation the file is closed and a new file with the next
+ timestamp in the name is created and used. When setting
+ <code>renameOnRotate</code> to <code>true</code>, the timestamp
+ is no longer part of the active log file name. Only during rotation
+ the file is closed and then renamed to include the timestamp.
+ This is similar to the behavior of most log frameworks when
+ doing time based rotation.
+ Default value: <code>false</code>
+ </p>
+ </td></tr><tr><td><code class="attributeName">requestAttributesEnabled</code></td><td>
+ <p>Set to <code>true</code> to check for the existence of request
+ attributes (typically set by the RemoteIpValve and similar) that should
+ be used to override the values returned by the request for remote
+ address, remote host, server port and protocol. If the attributes are
+ not set, or this attribute is set to <code>false</code> then the values
+ from the request will be used. If not set, the default value of
+ <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">resolveHosts</code></td><td>
+ <p>This attribute is no longer supported. Use the connector
+ attribute <code>enableLookups</code> instead.</p>
+ <p>If you have <code>enableLookups</code> on the connector set to
+ <code>true</code> and want to ignore it, use <b>%a</b> instead of
+ <b>%h</b> in the value of <code>pattern</code>.</p>
+ </td></tr><tr><td><code class="attributeName">rotatable</code></td><td>
+ <p>Flag to determine if log rotation should occur.
+ If set to <code>false</code>, then this file is never rotated and
+ <code>fileDateFormat</code> is ignored.
+ Default value: <code>true</code>
+ </p>
+ </td></tr><tr><td><code class="attributeName">suffix</code></td><td>
+ <p>The suffix added to the end of each log file's name. If not
+ specified, the default value is "" (a zero-length string),
+ meaning that no suffix will be added.</p>
+ </td></tr></table>
+
+ <p>Values for the <code>pattern</code> attribute are made up of literal
+ text strings, combined with pattern identifiers prefixed by the "%"
+ character to cause replacement by the corresponding variable value from
+ the current request and response. The following pattern codes are
+ supported:</p>
+ <ul>
+ <li><b><code>%a</code></b> - Remote IP address.
+ See also <code>%{xxx}a</code> below.</li>
+ <li><b><code>%A</code></b> - Local IP address</li>
+ <li><b><code>%b</code></b> - Bytes sent, excluding HTTP headers, or '-' if zero</li>
+ <li><b><code>%B</code></b> - Bytes sent, excluding HTTP headers</li>
+ <li><b><code>%h</code></b> - Remote host name (or IP address if
+ <code>enableLookups</code> for the connector is false)</li>
+ <li><b><code>%H</code></b> - Request protocol</li>
+ <li><b><code>%l</code></b> - Remote logical username from identd (always returns
+ '-')</li>
+ <li><b><code>%m</code></b> - Request method (GET, POST, etc.)</li>
+ <li><b><code>%p</code></b> - Local port on which this request was received.
+ See also <code>%{xxx}p</code> below.</li>
+ <li><b><code>%q</code></b> - Query string (prepended with a '?' if it exists)</li>
+ <li><b><code>%r</code></b> - First line of the request (method and request URI)</li>
+ <li><b><code>%s</code></b> - HTTP status code of the response</li>
+ <li><b><code>%S</code></b> - User session ID</li>
+ <li><b><code>%t</code></b> - Date and time, in Common Log Format</li>
+ <li><b><code>%u</code></b> - Remote user that was authenticated (if any), else '-' (escaped if required)</li>
+ <li><b><code>%U</code></b> - Requested URL path</li>
+ <li><b><code>%v</code></b> - Local server name</li>
+ <li><b><code>%D</code></b> - Time taken to process the request in millis. Note: In
+ httpd %D is microseconds. Behaviour will be aligned to httpd
+ in Tomcat 10 onwards.</li>
+ <li><b><code>%T</code></b> - Time taken to process the request, in seconds. Note: This
+ value has millisecond resolution whereas in httpd it has
+ second resolution. Behaviour will be align to httpd
+ in Tomcat 10 onwards.</li>
+ <li><b><code>%F</code></b> - Time taken to commit the response, in milliseconds</li>
+ <li><b><code>%I</code></b> - Current request thread name (can compare later with stacktraces)</li>
+ <li><b><code>%X</code></b> - Connection status when response is completed:
+ <ul>
+ <li><code>X</code> = Connection aborted before the response completed.</li>
+ <li><code>+</code> = Connection may be kept alive after the response is sent.</li>
+ <li><code>-</code> = Connection will be closed after the response is sent.</li>
+ </ul>
+ </li>
+ </ul>
+
+ <p>
+ There is also support to write information incoming or outgoing
+ headers, cookies, session or request attributes and special
+ timestamp formats.
+ It is modeled after the
+ <a href="https://httpd.apache.org/">Apache HTTP Server</a> log configuration
+ syntax. Each of them can be used multiple times with different <code>xxx</code> keys:
+ </p>
+ <ul>
+ <li><b><code>%{xxx}a</code></b> write remote address (client) (<code>xxx==remote</code>) or
+ connection peer address (<code>xxx=peer</code>)</li>
+ <li><b><code>%{xxx}i</code></b> write value of incoming header with name <code>xxx</code> (escaped if required)</li>
+ <li><b><code>%{xxx}o</code></b> write value of outgoing header with name <code>xxx</code> (escaped if required)</li>
+ <li><b><code>%{xxx}c</code></b> write value of cookie with name <code>xxx</code> (escaped if required)</li>
+ <li><b><code>%{xxx}r</code></b> write value of ServletRequest attribute with name <code>xxx</code> (escaped if required)</li>
+ <li><b><code>%{xxx}s</code></b> write value of HttpSession attribute with name <code>xxx</code> (escaped if required)</li>
+ <li><b><code>%{xxx}p</code></b> write local (server) port (<code>xxx==local</code>) or
+ remote (client) port (<code>xxx=remote</code>)</li>
+ <li><b><code>%{xxx}t</code></b> write timestamp at the end of the request formatted using the
+ enhanced SimpleDateFormat pattern <code>xxx</code></li>
+ </ul>
+
+ <p>All formats supported by SimpleDateFormat are allowed in <code>%{xxx}t</code>.
+ In addition the following extensions have been added:</p>
+ <ul>
+ <li><b><code>sec</code></b> - number of seconds since the epoch</li>
+ <li><b><code>msec</code></b> - number of milliseconds since the epoch</li>
+ <li><b><code>msec_frac</code></b> - millisecond fraction</li>
+ </ul>
+ <p>These formats cannot be mixed with SimpleDateFormat formats in the same format
+ token.</p>
+
+ <p>Furthermore one can define whether to log the timestamp for the request start
+ time or the response finish time:</p>
+ <ul>
+ <li><b><code>begin</code></b> or prefix <b><code>begin:</code></b> chooses
+ the request start time</li>
+ <li><b><code>end</code></b> or prefix <b><code>end:</code></b> chooses
+ the response finish time</li>
+ </ul>
+ <p>By adding multiple <code>%{xxx}t</code> tokens to the pattern, one can
+ also log both timestamps.</p>
+
+ <p>Escaping is applied as follows:</p>
+ <ul>
+ <li><code>"</code> is escaped as <code>\"</code></li>
+ <li><code>\</code> is escaped as <code>\\</code></li>
+ <li>Standard C escaping are used for <code>\f</code>, <code>\n</code>,
+ <code>\r</code>, <code>\t</code> and <code>\v</code></li>
+ <li>Any other control characters or characters with code points above 127
+ are encoded using the standard Java unicode escaping
+ (<code>\uXXXX</code>)</li>
+ </ul>
+
+ <p>The shorthand pattern <code>pattern="common"</code>
+ corresponds to the Common Log Format defined by
+ <strong>'%h %l %u %t "%r" %s %b'</strong>.</p>
+
+ <p>The shorthand pattern <code>pattern="combined"</code>
+ appends the values of the <code>Referer</code> and <code>User-Agent</code>
+ headers, each in double quotes, to the <code>common</code> pattern.</p>
+
+ <p>When Tomcat is operating behind a reverse proxy, the client information
+ logged by the Access Log Valve may represent the reverse proxy, the browser
+ or some combination of the two depending on the configuration of Tomcat and
+ the reverse proxy. For Tomcat configuration options see
+ <a href="#Proxies_Support">Proxies Support</a> and the
+ <a href="../proxy-howto.html">Proxy How-To</a>. For reverse proxies that
+ use mod_jk, see the <a href="https://tomcat.apache.org/connectors-doc/generic_howto/proxy.html">generic
+ proxy</a> documentation. For other reverse proxies, consult their
+ documentation.</p>
+ </div></div>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="Extended_Access_Log_Valve">Extended Access Log Valve</h4><div class="text">
+
+ <div class="subsection"><h4 id="Extended_Access_Log_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>The <strong>Extended Access Log Valve</strong> extends the
+ <a href="#Access_Log_Valve">Access Log Valve</a> class, and so
+ uses the same self-contained logging logic. This means it
+ implements many of the same file handling attributes. The main
+ difference to the standard <code>AccessLogValve</code> is that
+ <code>ExtendedAccessLogValve</code> creates log files which
+ conform to the Working Draft for the
+ <a href="https://www.w3.org/TR/WD-logfile.html">Extended Log File Format</a>
+ defined by the W3C.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Extended_Access_Log_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>Extended Access Log Valve</strong> supports all
+ configuration attributes of the standard
+ <a href="#Access_Log_Valve">Access Log Valve.</a> Only the
+ values used for <code>className</code> and <code>pattern</code> differ.</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.valves.ExtendedAccessLogValve</strong> to
+ use the extended access log valve.</p>
+ </td></tr><tr><td><code class="attributeName">pattern</code></td><td>
+ <p>A formatting layout identifying the various information fields
+ from the request and response to be logged.
+ See below for more information on configuring this attribute.</p>
+ </td></tr></table>
+
+ <p>Values for the <code>pattern</code> attribute are made up of
+ format tokens. Some of the tokens need an additional prefix. Possible
+ prefixes are <code>c</code> for "client", <code>s</code> for "server",
+ <code>cs</code> for "client to server", <code>sc</code> for
+ "server to client" or <code>x</code> for "application specific".
+ Furthermore some tokens are completed by an additional selector.
+ See the <a href="https://www.w3.org/TR/WD-logfile.html">W3C specification</a>
+ for more information about the format.</p>
+
+ <p>The following format tokens are supported:</p>
+ <ul>
+ <li><b>bytes</b> - Bytes sent, excluding HTTP headers, or '-' if zero</li>
+ <li><b>c-dns</b> - Remote host name (or IP address if
+ <code>enableLookups</code> for the connector is false)</li>
+ <li><b>c-ip</b> - Remote IP address</li>
+ <li><b>cs-method</b> - Request method (GET, POST, etc.)</li>
+ <li><b>cs-uri</b> - Request URI</li>
+ <li><b>cs-uri-query</b> - Query string (prepended with a '?' if it exists)</li>
+ <li><b>cs-uri-stem</b> - Requested URL path</li>
+ <li><b>date</b> - The date in yyyy-mm-dd format for GMT</li>
+ <li><b>s-dns</b> - Local host name</li>
+ <li><b>s-ip</b> - Local IP address</li>
+ <li><b>sc-status</b> - HTTP status code of the response</li>
+ <li><b>time</b> - Time the request was served in HH:mm:ss format for GMT</li>
+ <li><b>time-taken</b> - Time (in seconds as floating point) taken to serve the request</li>
+ <li><b>x-threadname</b> - Current request thread name (can compare later with stacktraces)</li>
+ </ul>
+
+ <p>For any of the <code>x-H(XXX)</code> the following method will be called from the
+ HttpServletRequest object:</p>
+ <ul>
+ <li><b><code>x-H(authType)</code></b>: getAuthType </li>
+ <li><b><code>x-H(characterEncoding)</code></b>: getCharacterEncoding </li>
+ <li><b><code>x-H(contentLength)</code></b>: getContentLength </li>
+ <li><b><code>x-H(locale)</code></b>: getLocale</li>
+ <li><b><code>x-H(protocol)</code></b>: getProtocol </li>
+ <li><b><code>x-H(remoteUser)</code></b>: getRemoteUser</li>
+ <li><b><code>x-H(requestedSessionId)</code></b>: getRequestedSessionId</li>
+ <li><b><code>x-H(requestedSessionIdFromCookie)</code></b>:
+ isRequestedSessionIdFromCookie </li>
+ <li><b><code>x-H(requestedSessionIdValid)</code></b>:
+ isRequestedSessionIdValid</li>
+ <li><b><code>x-H(scheme)</code></b>: getScheme</li>
+ <li><b><code>x-H(secure)</code></b>: isSecure</li>
+ </ul>
+
+ <p>
+ There is also support to write information about headers
+ cookies, context, request or session attributes and request
+ parameters.
+ </p>
+ <ul>
+ <li><b><code>cs(XXX)</code></b> for incoming request headers with name XXX</li>
+ <li><b><code>sc(XXX)</code></b> for outgoing response headers with name XXX</li>
+ <li><b><code>x-A(XXX)</code></b> for the servlet context attribute with name XXX</li>
+ <li><b><code>x-C(XXX)</code></b> for the first cookie with name XXX</li>
+ <li><b><code>x-O(XXX)</code></b> for a concatenation of all outgoing response headers with name XXX</li>
+ <li><b><code>x-P(XXX)</code></b> for the URL encoded (using UTF-8) request parameter with name XXX</li>
+ <li><b><code>x-R(XXX)</code></b> for the request attribute with name XXX</li>
+ <li><b><code>x-S(XXX)</code></b> for the session attribute with name XXX</li>
+ </ul>
+
+ </div></div>
+
+</div></div>
+
+</div><h3 id="Access_Control">Access Control</h3><div class="text">
+
+
+<div class="subsection"><h4 id="Remote_Address_Valve">Remote Address Valve</h4><div class="text">
+
+ <div class="subsection"><h4 id="Remote_Address_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>The <strong>Remote Address Valve</strong> allows you to compare the
+ IP address of the client that submitted this request against one or more
+ <em>regular expressions</em>, and either allow the request to continue
+ or refuse to process the request from this client. A Remote Address
+ Valve can be associated with any Catalina container
+ (<a href="engine.html">Engine</a>, <a href="host.html">Host</a>, or
+ <a href="context.html">Context</a>), and must accept any request
+ presented to this container for processing before it will be passed on.</p>
+
+ <p>The syntax for <em>regular expressions</em> is different than that for
+ 'standard' wildcard matching. Tomcat uses the <code>java.util.regex</code>
+ package. Please consult the Java documentation for details of the
+ expressions supported.</p>
+
+ <p>After setting the attribute <code>addConnectorPort</code> to
+ <code>true</code>, one can append the server connector port separated with a
+ semicolon (";") to allow different expressions for each connector.</p>
+
+ <p>By setting the attribute <code>usePeerAddress</code> to
+ <code>true</code>, the valve will use the connection peer address in its
+ checks. This will differ from the client IP, if a reverse proxy is used
+ in front of Tomcat in combination with either the AJP protocol, or the
+ HTTP protocol plus the <code>RemoteIp(Valve|Filter)</code>.</p>
+
+ <p>A refused request will be answered a response with status code
+ <code>403</code>. This status code can be overwritten using the attribute
+ <code>denyStatus</code>.</p>
+
+ <p>By setting the attribute <code>invalidAuthenticationWhenDeny</code> to
+ <code>true</code>, the behavior when a request is refused can be changed
+ to not deny but instead set an invalid <code>authentication</code>
+ header. This is useful in combination with the context attribute
+ <code>preemptiveAuthentication="true"</code>.</p>
+
+ <p><strong>Note:</strong> There is a caveat when using this valve with
+ IPv6 addresses. Format of the IP address that this valve is processing
+ depends on the API that was used to obtain it. If the address was obtained
+ from Java socket using Inet6Address class, its format will be
+ <code>x:x:x:x:x:x:x:x</code>. That is, the IP address for localhost
+ will be <code>0:0:0:0:0:0:0:1</code> instead of the more widely used
+ <code>::1</code>. Consult your access logs for the actual value.</p>
+
+ <p>See also: <a href="#Remote_Host_Valve">Remote Host Valve</a>,
+ <a href="#Remote_CIDR_Valve">Remote CIDR Valve</a>,
+ <a href="#Remote_IP_Valve">Remote IP Valve</a>,
+ <a href="http.html">HTTP Connector</a> configuration.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_Address_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>Remote Address Valve</strong> supports the following
+ configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.valves.RemoteAddrValve</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">allow</code></td><td>
+ <p>A regular expression (using <code>java.util.regex</code>) that the
+ remote client's IP address is compared to. If this attribute
+ is specified, the remote address MUST match for this request to be
+ accepted. If this attribute is not specified, all requests will be
+ accepted UNLESS the remote address matches a <code>deny</code>
+ pattern.</p>
+ </td></tr><tr><td><code class="attributeName">deny</code></td><td>
+ <p>A regular expression (using <code>java.util.regex</code>) that the
+ remote client's IP address is compared to. If this attribute
+ is specified, the remote address MUST NOT match for this request to be
+ accepted. If this attribute is not specified, request acceptance is
+ governed solely by the <code>allow</code> attribute.</p>
+ </td></tr><tr><td><code class="attributeName">denyStatus</code></td><td>
+ <p>HTTP response status code that is used when rejecting denied
+ request. The default value is <code>403</code>. For example,
+ it can be set to the value <code>404</code>.</p>
+ </td></tr><tr><td><code class="attributeName">addConnectorPort</code></td><td>
+ <p>Append the server connector port to the client IP address separated
+ with a semicolon (";"). If this is set to <code>true</code>, the
+ expressions configured with <code>allow</code> and
+ <code>deny</code> is compared against <code>ADDRESS;PORT</code>
+ where <code>ADDRESS</code> is the client IP address and
+ <code>PORT</code> is the Tomcat connector port which received the
+ request. The default value is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">invalidAuthenticationWhenDeny</code></td><td>
+ <p>When a request should be denied, do not deny but instead
+ set an invalid <code>authentication</code> header. This only works
+ if the context has the attribute <code>preemptiveAuthentication="true"</code>
+ set. An already existing <code>authentication</code> header will not be
+ overwritten. In effect this will trigger authentication instead of deny
+ even if the application does not have a security constraint configured.</p>
+ <p>This can be combined with <code>addConnectorPort</code> to trigger authentication
+ depending on the client and the connector that is used to access an application.</p>
+ </td></tr><tr><td><code class="attributeName">usePeerAddress</code></td><td>
+ <p>Use the connection peer address instead of the client IP address.
+ They will differ, if a reverse proxy is used in front of Tomcat in
+ combination with either the AJP protocol, or the HTTP protocol plus
+ the <code>RemoteIp(Valve|Filter)</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_Address_Valve/Example_localhost">Example 1</h4><div class="text">
+ <p>To allow access only for the clients connecting from localhost:</p>
+ <div class="codeBox"><pre><code><Valve className="org.apache.catalina.valves.RemoteAddrValve"
+ allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"/></code></pre></div>
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_Address_Valve/Example_localhost_port">Example 2</h4><div class="text">
+ <p>To allow unrestricted access for the clients connecting from localhost
+ but for all other clients only to port 8443:</p>
+ <div class="codeBox"><pre><code><Valve className="org.apache.catalina.valves.RemoteAddrValve"
+ addConnectorPort="true"
+ allow="127\.\d+\.\d+\.\d+;\d*|::1;\d*|0:0:0:0:0:0:0:1;\d*|.*;8443"/></code></pre></div>
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_Address_Valve/Example_port_auth">Example 3</h4><div class="text">
+ <p>To allow unrestricted access to port 8009, but trigger basic
+ authentication if the application is accessed on another port:</p>
+<div class="codeBox"><pre><code><Context>
+ ...
+ <Valve className="org.apache.catalina.valves.RemoteAddrValve"
+ addConnectorPort="true"
+ invalidAuthenticationWhenDeny="true"
+ allow=".*;8009"/>
+ <Valve className="org.apache.catalina.authenticator.BasicAuthenticator" />
+ ...
+</Context></code></pre></div>
+ </div></div>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="Remote_Host_Valve">Remote Host Valve</h4><div class="text">
+
+ <div class="subsection"><h4 id="Remote_Host_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>The <strong>Remote Host Valve</strong> allows you to compare the
+ hostname of the client that submitted this request against one or more
+ <em>regular expressions</em>, and either allow the request to continue
+ or refuse to process the request from this client. A Remote Host
+ Valve can be associated with any Catalina container
+ (<a href="engine.html">Engine</a>, <a href="host.html">Host</a>, or
+ <a href="context.html">Context</a>), and must accept any request
+ presented to this container for processing before it will be passed on.</p>
+
+ <p>The syntax for <em>regular expressions</em> is different than that for
+ 'standard' wildcard matching. Tomcat uses the <code>java.util.regex</code>
+ package. Please consult the Java documentation for details of the
+ expressions supported.</p>
+
+ <p>After setting the attribute <code>addConnectorPort</code> to
+ <code>true</code>, one can append the server connector port separated with a
+ semicolon (";") to allow different expressions for each connector.</p>
+
+ <p>A refused request will be answered a response with status code
+ <code>403</code>. This status code can be overwritten using the attribute
+ <code>denyStatus</code>.</p>
+
+ <p>By setting the attribute <code>invalidAuthenticationWhenDeny</code> to
+ <code>true</code>, the behavior when a request is refused can be changed
+ to not deny but instead set an invalid <code>authentication</code>
+ header. This is useful in combination with the context attribute
+ <code>preemptiveAuthentication="true"</code>.</p>
+
+ <p><strong>Note:</strong> This valve processes the value returned by
+ method <code>ServletRequest.getRemoteHost()</code>. To allow the method
+ to return proper host names, you have to enable "DNS lookups" feature on
+ a <strong>Connector</strong>.</p>
+
+ <p>See also: <a href="#Remote_Address_Valve">Remote Address Valve</a>,
+ <a href="#Remote_CIDR_Valve">Remote CIDR Valve</a>,
+ <a href="#Remote_IP_Valve">Remote IP Valve</a>,
+ <a href="http.html">HTTP Connector</a> configuration.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_Host_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>Remote Host Valve</strong> supports the following
+ configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.valves.RemoteHostValve</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">allow</code></td><td>
+ <p>A regular expression (using <code>java.util.regex</code>) that the
+ remote client's hostname is compared to. If this attribute
+ is specified, the remote hostname MUST match for this request to be
+ accepted. If this attribute is not specified, all requests will be
+ accepted UNLESS the remote hostname matches a <code>deny</code>
+ pattern.</p>
+ </td></tr><tr><td><code class="attributeName">deny</code></td><td>
+ <p>A regular expression (using <code>java.util.regex</code>) that the
+ remote client's hostname is compared to. If this attribute
+ is specified, the remote hostname MUST NOT match for this request to be
+ accepted. If this attribute is not specified, request acceptance is
+ governed solely by the <code>allow</code> attribute.</p>
+ </td></tr><tr><td><code class="attributeName">denyStatus</code></td><td>
+ <p>HTTP response status code that is used when rejecting denied
+ request. The default value is <code>403</code>. For example,
+ it can be set to the value <code>404</code>.</p>
+ </td></tr><tr><td><code class="attributeName">addConnectorPort</code></td><td>
+ <p>Append the server connector port to the client hostname separated
+ with a semicolon (";"). If this is set to <code>true</code>, the
+ expressions configured with <code>allow</code> and
+ <code>deny</code> is compared against <code>HOSTNAME;PORT</code>
+ where <code>HOSTNAME</code> is the client hostname and
+ <code>PORT</code> is the Tomcat connector port which received the
+ request. The default value is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">invalidAuthenticationWhenDeny</code></td><td>
+ <p>When a request should be denied, do not deny but instead
+ set an invalid <code>authentication</code> header. This only works
+ if the context has the attribute <code>preemptiveAuthentication="true"</code>
+ set. An already existing <code>authentication</code> header will not be
+ overwritten. In effect this will trigger authentication instead of deny
+ even if the application does not have a security constraint configured.</p>
+ <p>This can be combined with <code>addConnectorPort</code> to trigger authentication
+ depending on the client and the connector that is used to access an application.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="Remote_CIDR_Valve">Remote CIDR Valve</h4><div class="text">
+
+ <div class="subsection"><h4 id="Remote_CIDR_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>The <strong>Remote CIDR Valve</strong> allows you to compare the
+ IP address of the client that submitted this request against one or more
+ netmasks following the CIDR notation, and either allow the request to
+ continue or refuse to process the request from this client. IPv4 and
+ IPv6 are both fully supported. A Remote CIDR Valve can be associated
+ with any Catalina container (<a href="engine.html">Engine</a>,
+ <a href="host.html">Host</a>, or <a href="context.html">Context</a>), and
+ must accept any request presented to this container for processing before
+ it will be passed on.
+ </p>
+
+ <p>This valve mimicks Apache's <code>Order</code>,
+ <code>Allow from</code> and <code>Deny from</code> directives,
+ with the following limitations:
+ </p>
+
+ <ul>
+ <li><code>Order</code> will always be <code>allow, deny</code>;</li>
+ <li>dotted quad notations for netmasks are not supported (that is, you
+ cannot write <code>192.168.1.0/255.255.255.0</code>, you must write
+ <code>192.168.1.0/24</code>;
+ </li>
+ <li>shortcuts, like <code>10.10.</code>, which is equivalent to
+ <code>10.10.0.0/16</code>, are not supported;
+ </li>
+ <li>as the valve name says, this is a CIDR only valve,
+ therefore subdomain notations like <code>.mydomain.com</code> are not
+ supported either.
+ </li>
+ </ul>
+
+ <p>After setting the attribute <code>addConnectorPort</code> to
+ <code>true</code>, one can append the server connector port separated with a
+ semicolon (";") to allow different expressions for each connector.</p>
+
+ <p>By setting the attribute <code>usePeerAddress</code> to
+ <code>true</code>, the valve will use the connection peer address in its
+ checks. This will differ from the client IP, if a reverse proxy is used
+ in front of Tomcat in combination with either the AJP protocol, or the
+ HTTP protocol plus the <code>RemoteIp(Valve|Filter)</code>.</p>
+
+ <p>A refused request will be answered a response with status code
+ <code>403</code>. This status code can be overwritten using the attribute
+ <code>denyStatus</code>.</p>
+
+ <p>By setting the attribute <code>invalidAuthenticationWhenDeny</code> to
+ <code>true</code>, the behavior when a request is refused can be changed
+ to not deny but instead set an invalid <code>authentication</code>
+ header. This is useful in combination with the context attribute
+ <code>preemptiveAuthentication="true"</code>.</p>
+
+ <p>Some more features of this valve are:
+ </p>
+
+ <ul>
+ <li>if you omit the CIDR prefix, this valve becomes a single IP
+ valve;</li>
+ <li>unlike the <a href="#Remote_Host_Valve">Remote Host Valve</a>,
+ it can handle IPv6 addresses in condensed form (<code>::1</code>,
+ <code>fe80::/71</code>, etc).</li>
+ </ul>
+
+ <p>See also: <a href="#Remote_Address_Valve">Remote Address Valve</a>,
+ <a href="#Remote_Host_Valve">Remote Host Valve</a>,
+ <a href="#Remote_IP_Valve">Remote IP Valve</a>,
+ <a href="http.html">HTTP Connector</a> configuration.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_CIDR_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>Remote CIDR Valve</strong> supports the following
+ configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.valves.RemoteCIDRValve</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">allow</code></td><td>
+ <p>A comma-separated list of IPv4 or IPv6 netmasks or addresses
+ that the remote client's IP address is matched against.
+ If this attribute is specified, the remote address MUST match
+ for this request to be accepted. If this attribute is not specified,
+ all requests will be accepted UNLESS the remote IP is matched by a
+ netmask in the <code>deny</code> attribute.
+ </p>
+ </td></tr><tr><td><code class="attributeName">deny</code></td><td>
+ <p>A comma-separated list of IPv4 or IPv6 netmasks or addresses
+ that the remote client's IP address is matched against.
+ If this attribute is specified, the remote address MUST NOT match
+ for this request to be accepted. If this attribute is not specified,
+ request acceptance is governed solely by the <code>accept</code>
+ attribute.
+ </p>
+ </td></tr><tr><td><code class="attributeName">denyStatus</code></td><td>
+ <p>HTTP response status code that is used when rejecting denied
+ request. The default value is <code>403</code>. For example,
+ it can be set to the value <code>404</code>.</p>
+ </td></tr><tr><td><code class="attributeName">addConnectorPort</code></td><td>
+ <p>Append the server connector port to the client IP address separated
+ with a semicolon (";"). If this is set to <code>true</code>, the
+ expressions configured with <code>allow</code> and
+ <code>deny</code> is compared against <code>ADDRESS;PORT</code>
+ where <code>ADDRESS</code> is the client IP address and
+ <code>PORT</code> is the Tomcat connector port which received the
+ request. The default value is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">invalidAuthenticationWhenDeny</code></td><td>
+ <p>When a request should be denied, do not deny but instead
+ set an invalid <code>authentication</code> header. This only works
+ if the context has the attribute <code>preemptiveAuthentication="true"</code>
+ set. An already existing <code>authentication</code> header will not be
+ overwritten. In effect this will trigger authentication instead of deny
+ even if the application does not have a security constraint configured.</p>
+ <p>This can be combined with <code>addConnectorPort</code> to trigger authentication
+ depending on the client and the connector that is used to access an application.</p>
+ </td></tr><tr><td><code class="attributeName">usePeerAddress</code></td><td>
+ <p>Use the connection peer address instead of the client IP address.
+ They will differ, if a reverse proxy is used in front of Tomcat in
+ combination with either the AJP protocol, or the HTTP protocol plus
+ the <code>RemoteIp(Valve|Filter)</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_CIDR_Valve/Example_localhost">Example 1</h4><div class="text">
+ <p>To allow access only for the clients connecting from localhost:</p>
+ <div class="codeBox"><pre><code><Valve className="org.apache.catalina.valves.RemoteCIDRValve"
+ allow="127.0.0.1, ::1"/></code></pre></div>
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_CIDR_Valve/Example_localhost_port">Example 2</h4><div class="text">
+ <p>To allow unrestricted access for the clients connecting from the local network
+ but for all clients in network 10. only to port 8443:</p>
+ <div class="codeBox"><pre><code><Valve className="org.apache.catalina.valves.RemoteCIDRValve"
+ addConnectorPort="true"
+ allow="127.0.0.1;\d*|::1;\d*|10.0.0.0/8;8443"/></code></pre></div>
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_CIDR_Valve/Example_port_auth">Example 3</h4><div class="text">
+ <p>To allow access to port 8009 from network 10., but trigger basic
+ authentication if the application is accessed on another port:</p>
+<div class="codeBox"><pre><code><Context>
+ ...
+ <Valve className="org.apache.catalina.valves.RemoteCIDRValve"
+ addConnectorPort="true"
+ invalidAuthenticationWhenDeny="true"
+ allow="10.0.0.0/8;8009"/>
+ <Valve className="org.apache.catalina.authenticator.BasicAuthenticator" />
+ ...
+</Context></code></pre></div>
+ </div></div>
+
+</div></div>
+
+</div><h3 id="Proxies_Support">Proxies Support</h3><div class="text">
+ <div class="subsection"><h4 id="Load_Balancer_Draining_Valve">Load Balancer Draining Valve</h4><div class="text">
+ <div class="subsection"><h4 id="Load_Balancer_Draining_Valve/Introduction">Introduction</h4><div class="text">
+ <p>
+ When using mod_jk or mod_proxy_ajp, the client's session id is used to
+ determine which back-end server will be used to serve the request. If the
+ target node is being "drained" (in mod_jk, this is the <i>DISABLED</i>
+ state; in mod_proxy_ajp, this is the <i>Drain (N)</i> state), requests
+ for expired sessions can actually cause the draining node to fail to
+ drain.
+ </p>
+ <p>
+ Unfortunately, AJP-based load-balancers cannot prove whether the
+ client-provided session id is valid or not and therefore will send any
+ requests for a session that appears to be targeted to that node to the
+ disabled (or "draining") node, causing the "draining" process to take
+ longer than necessary.
+ </p>
+ <p>
+ This Valve detects requests for invalid sessions, strips the session
+ information from the request, and redirects back to the same URL, where
+ the load-balancer should choose a different (active) node to handle the
+ request. This will accelerate the "draining" process for the disabled
+ node(s).
+ </p>
+
+ <p>
+ The activation state of the node is sent by the load-balancer in the
+ request, so no state change on the node being disabled is necessary. Simply
+ configure this Valve in your valve pipeline and it will take action when
+ the activation state is set to "disabled".
+ </p>
+
+ <p>
+ You should take care to register this Valve earlier in the Valve pipeline
+ than any authentication Valves, because this Valve should be able to
+ redirect a request before any authentication Valve saves a request to a
+ protected resource. If this happens, a new session will be created and
+ the draining process will stall because a new, valid session will be
+ established.
+ </p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Load_Balancer_Draining_Valve/Attributes">Attributes</h4><div class="text">
+ <p>The <strong>Load Balancer Draining Valve</strong> supports the
+ following configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.valves.LoadBalancerDrainingValve</strong>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">redirectStatusCode</code></td><td>
+ <p>Allows setting a custom redirect code to be used when the client
+ is redirected to be re-balanced by the load-balancer. The default is
+ 307 TEMPORARY_REDIRECT.</p>
+ </td></tr><tr><td><code class="attributeName">ignoreCookieName</code></td><td>
+ <p>When used with <code>ignoreCookieValue</code>, a client can present
+ this cookie (and accompanying value) that will cause this Valve to
+ do nothing. This will allow you to probe your <i>disabled</i> node
+ before re-enabling it to make sure that it is working as expected.</p>
+ </td></tr><tr><td><code class="attributeName">ignoreCookieValue</code></td><td>
+ <p>When used with <code>ignoreCookieName</code>, a client can present
+ a cookie (and accompanying value) that will cause this Valve to
+ do nothing. This will allow you to probe your <i>disabled</i> node
+ before re-enabling it to make sure that it is working as expected.</p>
+ </td></tr></table>
+ </div></div>
+ </div></div>
+
+<div class="subsection"><h4 id="Remote_IP_Valve">Remote IP Valve</h4><div class="text">
+
+ <div class="subsection"><h4 id="Remote_IP_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>Tomcat port of
+ <a href="https://httpd.apache.org/docs/trunk/mod/mod_remoteip.html">mod_remoteip</a>,
+ this valve replaces the apparent client remote IP address and hostname for
+ the request with the IP address list presented by a proxy or a load balancer
+ via a request headers (e.g. "X-Forwarded-For").</p>
+
+ <p>Another feature of this valve is to replace the apparent scheme
+ (http/https), server port and <code>request.secure</code> with the scheme presented
+ by a proxy or a load balancer via a request header
+ (e.g. "X-Forwarded-Proto").</p>
+
+ <p>This Valve may be used at the <code>Engine</code>, <code>Host</code> or
+ <code>Context</code> level as required. Normally, this Valve would be used
+ at the <code>Engine</code> level.</p>
+
+ <p>If used in conjunction with Remote Address/Host valves then this valve
+ should be defined first to ensure that the correct client IP address is
+ presented to the Remote Address/Host valves.</p>
+
+ <p><strong>Note:</strong> By default this valve has no effect on the
+ values that are written into access log. The original values are restored
+ when request processing leaves the valve and that always happens earlier
+ than access logging. To pass the remote address, remote host, server port
+ and protocol values set by this valve to the access log,
+ they are put into request attributes. Publishing these values here
+ is enabled by default, but <code>AccessLogValve</code> should be explicitly
+ configured to use them. See documentation for
+ <code>requestAttributesEnabled</code> attribute of
+ <code>AccessLogValve</code>.</p>
+
+ <p>The names of request attributes that are set by this valve
+ and can be used by access logging are the following:</p>
+
+ <ul>
+ <li><code>org.apache.catalina.AccessLog.RemoteAddr</code></li>
+ <li><code>org.apache.catalina.AccessLog.RemoteHost</code></li>
+ <li><code>org.apache.catalina.AccessLog.Protocol</code></li>
+ <li><code>org.apache.catalina.AccessLog.ServerPort</code></li>
+ <li><code>org.apache.tomcat.remoteAddr</code></li>
+ </ul>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Remote_IP_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>Remote IP Valve</strong> supports the
+ following configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.valves.RemoteIpValve</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">remoteIpHeader</code></td><td>
+ <p>Name of the HTTP Header read by this valve that holds the list of
+ traversed IP addresses starting from the requesting client. If not
+ specified, the default of <code>x-forwarded-for</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">internalProxies</code></td><td>
+ <p>Regular expression (using <code>java.util.regex</code>) that a
+ proxy's IP address must match to be considered an internal proxy.
+ Internal proxies that appear in the <strong>remoteIpHeader</strong> will
+ be trusted and will not appear in the <strong>proxiesHeader</strong>
+ value. If not specified the default value of <code>
+ 10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.1[6-9]{1}\.\d{1,3}\.\d{1,3}|172\.2[0-9]{1}\.\d{1,3}\.\d{1,3}|172\.3[0-1]{1}\.\d{1,3}\.\d{1,3}|0:0:0:0:0:0:0:1
+ </code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">proxiesHeader</code></td><td>
+ <p>Name of the HTTP header created by this valve to hold the list of
+ proxies that have been processed in the incoming
+ <strong>remoteIpHeader</strong>. If not specified, the default of
+ <code>x-forwarded-by</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">requestAttributesEnabled</code></td><td>
+ <p>Set to <code>true</code> to set the request attributes used by
+ AccessLog implementations to override the values returned by the
+ request for remote address, remote host, server port and protocol.
+ Request attributes are also used to enable the forwarded remote address
+ to be displayed on the status page of the Manager web application.
+ If not set, the default value of <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">trustedProxies</code></td><td>
+ <p>Regular expression (using <code>java.util.regex</code>) that a
+ proxy's IP address must match to be considered an trusted proxy.
+ Trusted proxies that appear in the <strong>remoteIpHeader</strong> will
+ be trusted and will appear in the <strong>proxiesHeader</strong> value.
+ If not specified, no proxies will be trusted.</p>
+ </td></tr><tr><td><code class="attributeName">protocolHeader</code></td><td>
+ <p>Name of the HTTP Header read by this valve that holds the protocol
+ used by the client to connect to the proxy. If not specified, the
+ default of <code>X-Forwarded-Proto</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">hostHeader</code></td><td>
+ <p>Name of the HTTP Header read by this valve that holds the host
+ used by the client to connect to the proxy. If not specified, the
+ default of <code>null</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">portHeader</code></td><td>
+ <p>Name of the HTTP Header read by this valve that holds the port
+ used by the client to connect to the proxy. If not specified, the
+ default of <code>null</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">protocolHeaderHttpsValue</code></td><td>
+ <p>Value of the <strong>protocolHeader</strong> to indicate that it is
+ an HTTPS request. If not specified, the default of <code>https</code> is
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">httpServerPort</code></td><td>
+ <p>Value returned by <code>ServletRequest.getServerPort()</code>
+ when the <strong>protocolHeader</strong> indicates <code>http</code>
+ protocol and no <strong>portHeader</strong> is present. If not
+ specified, the default of <code>80</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">httpsServerPort</code></td><td>
+ <p>Value returned by <code>ServletRequest.getServerPort()</code>
+ when the <strong>protocolHeader</strong> indicates <code>https</code>
+ protocol and no <strong>portHeader</strong> is present. If not
+ specified, the default of <code>443</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">changeLocalName</code></td><td>
+ <p>If <code>true</code>, the value returned by
+ <code>ServletRequest.getLocalHost()</code> and
+ <code>ServletRequest.getServerHost()</code> is modified by the this
+ valve. If not specified, the default of <code>false</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">changeLocalPort</code></td><td>
+ <p>If <code>true</code>, the value returned by
+ <code>ServletRequest.getLocalPort()</code> and
+ <code>ServletRequest.getServerPort()</code> is modified by the this
+ valve. If not specified, the default of <code>false</code> is used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="SSL_Valve">SSL Valve</h4><div class="text">
+
+ <div class="subsection"><h4 id="SSL_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>When using mod_proxy_http, the client SSL information is not included in
+ the protocol (unlike mod_jk and mod_proxy_ajp). To make the client SSL
+ information available to Tomcat, some additional configuration is required.
+ In httpd, mod_headers is used to add the SSL information as HTTP headers. In
+ Tomcat, this valve is used to read the information from the HTTP headers and
+ insert it into the request.</p>
+
+ <p>Note: Ensure that the headers are always set by httpd for all requests to
+ prevent a client spoofing SSL information by sending fake headers.</p>
+
+ <p>To configure httpd to set the necessary headers, add the following:</p>
+<div class="codeBox"><pre><code><IfModule ssl_module>
+ RequestHeader set SSL_CLIENT_CERT "%{SSL_CLIENT_CERT}s"
+ RequestHeader set SSL_CIPHER "%{SSL_CIPHER}s"
+ RequestHeader set SSL_SESSION_ID "%{SSL_SESSION_ID}s"
+ RequestHeader set SSL_CIPHER_USEKEYSIZE "%{SSL_CIPHER_USEKEYSIZE}s"
+</IfModule></code></pre></div>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="SSL_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>SSL Valve</strong> supports the following configuration
+ attribute:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.valves.SSLValve</strong>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">sslClientCertHeader</code></td><td>
+ <p>Allows setting a custom name for the ssl_client_cert header.
+ If not specified, the default of <code>ssl_client_cert</code> is
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">sslClientEscapedCertHeader</code></td><td>
+ <p>Allows setting a custom name for the ssl_client_escaped_cert header.
+ If not specified, the default of <code>ssl_client_escaped_cert</code> is
+ used.</p>
+ <p>This header is useful for Nginx proxying, and takes precedence over
+ the ssl_client_cert header.</p>
+ </td></tr><tr><td><code class="attributeName">sslCipherHeader</code></td><td>
+ <p>Allows setting a custom name for the ssl_cipher header.
+ If not specified, the default of <code>ssl_cipher</code> is
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">sslSessionIdHeader</code></td><td>
+ <p>Allows setting a custom name for the ssl_session_id header.
+ If not specified, the default of <code>ssl_session_id</code> is
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">sslCipherUserKeySizeHeader</code></td><td>
+ <p>Allows setting a custom name for the ssl_cipher_usekeysize header.
+ If not specified, the default of <code>ssl_cipher_usekeysize</code> is
+ used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div></div>
+
+
+</div><h3 id="Single_Sign_On_Valve">Single Sign On Valve</h3><div class="text">
+
+ <div class="subsection"><h4 id="Single_Sign_On_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>The <em>Single Sign On Valve</em> is utilized when you wish to give users
+ the ability to sign on to any one of the web applications associated with
+ your virtual host, and then have their identity recognized by all other
+ web applications on the same virtual host.</p>
+
+ <p>See the <a href="host.html#Single_Sign_On">Single Sign On</a> special
+ feature on the <strong>Host</strong> element for more information.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="Single_Sign_On_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>Single Sign On</strong> Valve supports the following
+ configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.authenticator.SingleSignOn</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">requireReauthentication</code></td><td>
+ <p>Default false. Flag to determine whether each request needs to be
+ reauthenticated to the security <strong>Realm</strong>. If "true", this
+ Valve uses cached security credentials (username and password) to
+ reauthenticate to the <strong>Realm</strong> each request associated
+ with an SSO session. If "false", the Valve can itself authenticate
+ requests based on the presence of a valid SSO cookie, without
+ rechecking with the <strong>Realm</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">cookieDomain</code></td><td>
+ <p>Sets the host domain to be used for sso cookies.</p>
+ </td></tr><tr><td><code class="attributeName">cookieName</code></td><td>
+ <p>Sets the cookie name to be used for sso cookies. The default value
+ is <code>JSESSIONIDSSO</code></p>
+ </td></tr></table>
+
+ </div></div>
+
+
+</div><h3 id="Authentication">Authentication</h3><div class="text">
+
+<p>The valves in this section implement
+<strong>org.apache.catalina.Authenticator</strong> interface.</p>
+
+<div class="subsection"><h4 id="Basic_Authenticator_Valve">Basic Authenticator Valve</h4><div class="text">
+
+ <div class="subsection"><h4 id="Basic_Authenticator_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>The <strong>Basic Authenticator Valve</strong> is automatically added to
+ any <a href="context.html">Context</a> that is configured to use BASIC
+ authentication.</p>
+
+ <p>If any non-default settings are required, the valve may be configured
+ within <a href="context.html">Context</a> element with the required
+ values.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Basic_Authenticator_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>Basic Authenticator Valve</strong> supports the following
+ configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allowCorsPreflight</code></td><td>
+ <p>Are requests that appear to be CORS preflight requests allowed to
+ bypass the authenticator as required by the CORS specification. The
+ allowed values are <code>never</code>, <code>filter</code> and
+ <code>always</code>. <code>never</code> means that a request will never
+ bypass authentication even if it appears to be a CORS preflight request.
+ <code>filter</code> means that a request will bypass authentication if
+ it appears to be a CORS preflight request; it is mapped to a web
+ application that has the <a href="filter.html#CORS_Filter">CORS
+ Filter</a> enabled; and the CORS Filter is mapped to <code>/*</code>.
+ <code>always</code> means that all requests that appear to be CORS
+ preflight requests will bypass authentication. If not set, the default
+ value is <code>never</code>.</p>
+ </td></tr><tr><td><code class="attributeName">alwaysUseSession</code></td><td>
+ <p>Should a session always be used once a user is authenticated? This
+ may offer some performance benefits since the session can then be used
+ to cache the authenticated Principal, hence removing the need to
+ authenticate the user via the Realm on every request. This may be of
+ help for combinations such as BASIC authentication used with the
+ JNDIRealm or DataSourceRealms. However there will also be the
+ performance cost of creating and GC'ing the session. If not set, the
+ default value of <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">cache</code></td><td>
+ <p>Should we cache authenticated Principals if the request is part of an
+ HTTP session? If not specified, the default value of <code>true</code>
+ will be used.</p>
+ </td></tr><tr><td><code class="attributeName">changeSessionIdOnAuthentication</code></td><td>
+ <p>Controls if the session ID is changed if a session exists at the
+ point where users are authenticated. This is to prevent session fixation
+ attacks. If not set, the default value of <code>true</code> will be
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">charset</code></td><td>
+ <p>Controls if the <code>WWW-Authenticate</code> HTTP header includes a
+ <code>charset</code> authentication parameter as per RFC 7617. The only
+ permitted options are <code>null</code>, the empty string and
+ <code>UTF-8</code>. If <code>UTF-8</code> is specified then the
+ <code>charset</code> authentication parameter will be sent with that
+ value and the provided user name and optional password will be converted
+ from bytes to characters using UTF-8. Otherwise, no <code>charset</code>
+ authentication parameter will be sent and the provided user name and
+ optional password will be converted from bytes to characters using
+ ISO-8859-1. The default value is <code>null</code></p>
+ </td></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.authenticator.BasicAuthenticator</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">disableProxyCaching</code></td><td>
+ <p>Controls the caching of pages that are protected by security
+ constraints. Setting this to <code>false</code> may help work around
+ caching issues in some browsers but will also cause secured pages to be
+ cached by proxies which will almost certainly be a security issue.
+ <code>securePagesWithPragma</code> offers an alternative, secure,
+ workaround for browser caching issues. If not set, the default value of
+ <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">securePagesWithPragma</code></td><td>
+ <p>Controls the caching of pages that are protected by security
+ constraints. Setting this to <code>false</code> may help work around
+ caching issues in some browsers by using
+ <code>Cache-Control: private</code> rather than the default of
+ <code>Pragma: No-cache</code> and <code>Cache-control: No-cache</code>.
+ If not set, the default value of <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomAlgorithm</code></td><td>
+ <p>Name of the algorithm to use to create the
+ <code>java.security.SecureRandom</code> instances that generate session
+ IDs. If an invalid algorithm and/or provider is specified, the platform
+ default provider and the default algorithm will be used. If not
+ specified, the default algorithm of SHA1PRNG will be used. If the
+ default algorithm is not supported, the platform default will be used.
+ To specify that the platform default should be used, do not set the
+ secureRandomProvider attribute and set this attribute to the empty
+ string.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomClass</code></td><td>
+ <p>Name of the Java class that extends
+ <code>java.security.SecureRandom</code> to use to generate SSO session
+ IDs. If not specified, the default value is
+ <code>java.security.SecureRandom</code>.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomProvider</code></td><td>
+ <p>Name of the provider to use to create the
+ <code>java.security.SecureRandom</code> instances that generate SSO
+ session IDs. If an invalid algorithm and/or provider is specified, the
+ platform default provider and the default algorithm will be used. If not
+ specified, the platform default provider will be used.</p>
+ </td></tr><tr><td><code class="attributeName">sendAuthInfoResponseHeaders</code></td><td>
+ <p>Controls whether the auth information (remote user and auth type)
+ shall be returned as response headers for a forwarded/proxied request.
+ When the <code>RemoteIpValve</code> or <code>RemoteIpFilter</code> mark
+ a forwarded request with the <code>Globals.REQUEST_FORWARDED_ATTRIBUTE</code>
+ this authenticator can return the values of
+ <code>HttpServletRequest.getRemoteUser()</code> and
+ <code>HttpServletRequest.getAuthType()</code> as response headers
+ <code>remote-user</code> and <code>auth-type</code> to a reverse proxy.
+ This is useful, e.g., for access log consistency or other decisions to make.
+ If not specified, the default value is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">trimCredentials</code></td><td>
+ <p>Controls whether leading and/or trailing whitespace is removed from
+ the parsed credentials. If not specified, the default value is
+ <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">jaspicCallbackHandlerClass</code></td><td>
+ <p>Name of the Java class of the
+ <code>javax.security.auth.callback.CallbackHandler</code> implementation
+ which should be used by JASPIC. If none is specified the default
+ <code>org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl</code>
+ will be used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="Digest_Authenticator_Valve">Digest Authenticator Valve</h4><div class="text">
+
+ <div class="subsection"><h4 id="Digest_Authenticator_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>The <strong>Digest Authenticator Valve</strong> is automatically added to
+ any <a href="context.html">Context</a> that is configured to use DIGEST
+ authentication.</p>
+
+ <p>If any non-default settings are required, the valve may be configured
+ within <a href="context.html">Context</a> element with the required
+ values.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Digest_Authenticator_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>Digest Authenticator Valve</strong> supports the following
+ configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allowCorsPreflight</code></td><td>
+ <p>Are requests that appear to be CORS preflight requests allowed to
+ bypass the authenticator as required by the CORS specification. The
+ allowed values are <code>never</code>, <code>filter</code> and
+ <code>always</code>. <code>never</code> means that a request will never
+ bypass authentication even if it appears to be a CORS preflight request.
+ <code>filter</code> means that a request will bypass authentication if
+ it appears to be a CORS preflight request; it is mapped to a web
+ application that has the <a href="filter.html#CORS_Filter">CORS
+ Filter</a> enabled; and the CORS Filter is mapped to <code>/*</code>.
+ <code>always</code> means that all requests that appear to be CORS
+ preflight requests will bypass authentication. If not set, the default
+ value is <code>never</code>.</p>
+ </td></tr><tr><td><code class="attributeName">alwaysUseSession</code></td><td>
+ <p>Should a session always be used once a user is authenticated? This
+ may offer some performance benefits since the session can then be used
+ to cache the authenticated Principal, hence removing the need to
+ authenticate the user via the Realm on every request. This may be of
+ help for combinations such as BASIC authentication used with the
+ JNDIRealm or DataSourceRealms. However there will also be the
+ performance cost of creating and GC'ing the session. If not set, the
+ default value of <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">cache</code></td><td>
+ <p>Should we cache authenticated Principals if the request is part of an
+ HTTP session? If not specified, the default value of <code>false</code>
+ will be used.</p>
+ </td></tr><tr><td><code class="attributeName">changeSessionIdOnAuthentication</code></td><td>
+ <p>Controls if the session ID is changed if a session exists at the
+ point where users are authenticated. This is to prevent session fixation
+ attacks. If not set, the default value of <code>true</code> will be
+ used.</p>
+ </td></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.authenticator.DigestAuthenticator</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">disableProxyCaching</code></td><td>
+ <p>Controls the caching of pages that are protected by security
+ constraints. Setting this to <code>false</code> may help work around
+ caching issues in some browsers but will also cause secured pages to be
+ cached by proxies which will almost certainly be a security issue.
+ <code>securePagesWithPragma</code> offers an alternative, secure,
+ workaround for browser caching issues. If not set, the default value of
+ <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">key</code></td><td>
+ <p>The secret key used by digest authentication. If not set, a secure
+ random value is generated. This should normally only be set when it is
+ necessary to keep key values constant either across server restarts
+ and/or across a cluster.</p>
+ </td></tr><tr><td><code class="attributeName">nonceCacheSize</code></td><td>
+ <p>To protect against replay attacks, the DIGEST authenticator tracks
+ server nonce and nonce count values. This attribute controls the size
+ of that cache. If not specified, the default value of 1000 is used.</p>
+ </td></tr><tr><td><code class="attributeName">nonceCountWindowSize</code></td><td>
+ <p>Client requests may be processed out of order which in turn means
+ that the nonce count values may be processed out of order. To prevent
+ authentication failures when nonce counts are presented out of order
+ the authenticator tracks a window of nonce count values. This attribute
+ controls how big that window is. If not specified, the default value of
+ 100 is used.</p>
+ </td></tr><tr><td><code class="attributeName">nonceValidity</code></td><td>
+ <p>The time, in milliseconds, that a server generated nonce will be
+ considered valid for use in authentication. If not specified, the
+ default value of 300000 (5 minutes) will be used.</p>
+ </td></tr><tr><td><code class="attributeName">opaque</code></td><td>
+ <p>The opaque server string used by digest authentication. If not set, a
+ random value is generated. This should normally only be set when it is
+ necessary to keep opaque values constant either across server restarts
+ and/or across a cluster.</p>
+ </td></tr><tr><td><code class="attributeName">securePagesWithPragma</code></td><td>
+ <p>Controls the caching of pages that are protected by security
+ constraints. Setting this to <code>false</code> may help work around
+ caching issues in some browsers by using
+ <code>Cache-Control: private</code> rather than the default of
+ <code>Pragma: No-cache</code> and <code>Cache-control: No-cache</code>.
+ If not set, the default value of <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomAlgorithm</code></td><td>
+ <p>Name of the algorithm to use to create the
+ <code>java.security.SecureRandom</code> instances that generate session
+ IDs. If an invalid algorithm and/or provider is specified, the platform
+ default provider and the default algorithm will be used. If not
+ specified, the default algorithm of SHA1PRNG will be used. If the
+ default algorithm is not supported, the platform default will be used.
+ To specify that the platform default should be used, do not set the
+ secureRandomProvider attribute and set this attribute to the empty
+ string.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomClass</code></td><td>
+ <p>Name of the Java class that extends
+ <code>java.security.SecureRandom</code> to use to generate SSO session
+ IDs. If not specified, the default value is
+ <code>java.security.SecureRandom</code>.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomProvider</code></td><td>
+ <p>Name of the provider to use to create the
+ <code>java.security.SecureRandom</code> instances that generate SSO
+ session IDs. If an invalid algorithm and/or provider is specified, the
+ platform default provider and the default algorithm will be used. If not
+ specified, the platform default provider will be used.</p>
+ </td></tr><tr><td><code class="attributeName">sendAuthInfoResponseHeaders</code></td><td>
+ <p>Controls whether the auth information (remote user and auth type)
+ shall be returned as response headers for a forwarded/proxied request.
+ When the <code>RemoteIpValve</code> or <code>RemoteIpFilter</code> mark
+ a forwarded request with the <code>Globals.REQUEST_FORWARDED_ATTRIBUTE</code>
+ this authenticator can return the values of
+ <code>HttpServletRequest.getRemoteUser()</code> and
+ <code>HttpServletRequest.getAuthType()</code> as response headers
+ <code>remote-user</code> and <code>auth-type</code> to a reverse proxy.
+ This is useful, e.g., for access log consistency or other decisions to make.
+ If not specified, the default value is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">validateUri</code></td><td>
+ <p>Should the URI be validated as required by RFC2617? If not specified,
+ the default value of <code>true</code> will be used. This should
+ normally only be set when Tomcat is located behind a reverse proxy and
+ the proxy is modifying the URI passed to Tomcat such that DIGEST
+ authentication always fails.</p>
+ </td></tr><tr><td><code class="attributeName">jaspicCallbackHandlerClass</code></td><td>
+ <p>Name of the Java class of the
+ <code>javax.security.auth.callback.CallbackHandler</code> implementation
+ which should be used by JASPIC. If none is specified the default
+ <code>org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl</code>
+ will be used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="Form_Authenticator_Valve">Form Authenticator Valve</h4><div class="text">
+
+ <div class="subsection"><h4 id="Form_Authenticator_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>The <strong>Form Authenticator Valve</strong> is automatically added to
+ any <a href="context.html">Context</a> that is configured to use FORM
+ authentication.</p>
+
+ <p>If any non-default settings are required, the valve may be configured
+ within <a href="context.html">Context</a> element with the required
+ values.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Form_Authenticator_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>Form Authenticator Valve</strong> supports the following
+ configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allowCorsPreflight</code></td><td>
+ <p>Are requests that appear to be CORS preflight requests allowed to
+ bypass the authenticator as required by the CORS specification. The
+ allowed values are <code>never</code>, <code>filter</code> and
+ <code>always</code>. <code>never</code> means that a request will never
+ bypass authentication even if it appears to be a CORS preflight request.
+ <code>filter</code> means that a request will bypass authentication if
+ it appears to be a CORS preflight request; it is mapped to a web
+ application that has the <a href="filter.html#CORS_Filter">CORS
+ Filter</a> enabled; and the CORS Filter is mapped to <code>/*</code>.
+ <code>always</code> means that all requests that appear to be CORS
+ preflight requests will bypass authentication. If not set, the default
+ value is <code>never</code>.</p>
+ </td></tr><tr><td><code class="attributeName">changeSessionIdOnAuthentication</code></td><td>
+ <p>Controls if the session ID is changed if a session exists at the
+ point where users are authenticated. This is to prevent session fixation
+ attacks. If not set, the default value of <code>true</code> will be
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">characterEncoding</code></td><td>
+ <p>Character encoding to use to read the username and password parameters
+ from the request. If not set, the encoding of the request body will be
+ used.</p>
+ </td></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.authenticator.FormAuthenticator</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">disableProxyCaching</code></td><td>
+ <p>Controls the caching of pages that are protected by security
+ constraints. Setting this to <code>false</code> may help work around
+ caching issues in some browsers but will also cause secured pages to be
+ cached by proxies which will almost certainly be a security issue.
+ <code>securePagesWithPragma</code> offers an alternative, secure,
+ workaround for browser caching issues. If not set, the default value of
+ <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">landingPage</code></td><td>
+ <p>Controls the behavior of the FORM authentication process if the
+ process is misused, for example by directly requesting the login page
+ or delaying logging in for so long that the session expires. If this
+ attribute is set, rather than returning an error response code, Tomcat
+ will redirect the user to the specified landing page if the login form
+ is submitted with valid credentials. For the login to be processed, the
+ landing page must be a protected resource (i.e. one that requires
+ authentication). If the landing page does not require authentication
+ then the user will not be logged in and will be prompted for their
+ credentials again when they access a protected page.</p>
+ </td></tr><tr><td><code class="attributeName">securePagesWithPragma</code></td><td>
+ <p>Controls the caching of pages that are protected by security
+ constraints. Setting this to <code>false</code> may help work around
+ caching issues in some browsers by using
+ <code>Cache-Control: private</code> rather than the default of
+ <code>Pragma: No-cache</code> and <code>Cache-control: No-cache</code>.
+ If not set, the default value of <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomAlgorithm</code></td><td>
+ <p>Name of the algorithm to use to create the
+ <code>java.security.SecureRandom</code> instances that generate session
+ IDs. If an invalid algorithm and/or provider is specified, the platform
+ default provider and the default algorithm will be used. If not
+ specified, the default algorithm of SHA1PRNG will be used. If the
+ default algorithm is not supported, the platform default will be used.
+ To specify that the platform default should be used, do not set the
+ secureRandomProvider attribute and set this attribute to the empty
+ string.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomClass</code></td><td>
+ <p>Name of the Java class that extends
+ <code>java.security.SecureRandom</code> to use to generate SSO session
+ IDs. If not specified, the default value is
+ <code>java.security.SecureRandom</code>.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomProvider</code></td><td>
+ <p>Name of the provider to use to create the
+ <code>java.security.SecureRandom</code> instances that generate SSO
+ session IDs. If an invalid algorithm and/or provider is specified, the
+ platform default provider and the default algorithm will be used. If not
+ specified, the platform default provider will be used.</p>
+ </td></tr><tr><td><code class="attributeName">sendAuthInfoResponseHeaders</code></td><td>
+ <p>Controls whether the auth information (remote user and auth type)
+ shall be returned as response headers for a forwarded/proxied request.
+ When the <code>RemoteIpValve</code> or <code>RemoteIpFilter</code> mark
+ a forwarded request with the <code>Globals.REQUEST_FORWARDED_ATTRIBUTE</code>
+ this authenticator can return the values of
+ <code>HttpServletRequest.getRemoteUser()</code> and
+ <code>HttpServletRequest.getAuthType()</code> as response headers
+ <code>remote-user</code> and <code>auth-type</code> to a reverse proxy.
+ This is useful, e.g., for access log consistency or other decisions to make.
+ If not specified, the default value is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">jaspicCallbackHandlerClass</code></td><td>
+ <p>Name of the Java class of the
+ <code>javax.security.auth.callback.CallbackHandler</code> implementation
+ which should be used by JASPIC. If none is specified the default
+ <code>org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl</code>
+ will be used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="SSL_Authenticator_Valve">SSL Authenticator Valve</h4><div class="text">
+
+ <div class="subsection"><h4 id="SSL_Authenticator_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>The <strong>SSL Authenticator Valve</strong> is automatically added to
+ any <a href="context.html">Context</a> that is configured to use SSL
+ authentication.</p>
+
+ <p>If any non-default settings are required, the valve may be configured
+ within <a href="context.html">Context</a> element with the required
+ values.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="SSL_Authenticator_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>SSL Authenticator Valve</strong> supports the following
+ configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allowCorsPreflight</code></td><td>
+ <p>Are requests that appear to be CORS preflight requests allowed to
+ bypass the authenticator as required by the CORS specification. The
+ allowed values are <code>never</code>, <code>filter</code> and
+ <code>always</code>. <code>never</code> means that a request will never
+ bypass authentication even if it appears to be a CORS preflight request.
+ <code>filter</code> means that a request will bypass authentication if
+ it appears to be a CORS preflight request; it is mapped to a web
+ application that has the <a href="filter.html#CORS_Filter">CORS
+ Filter</a> enabled; and the CORS Filter is mapped to <code>/*</code>.
+ <code>always</code> means that all requests that appear to be CORS
+ preflight requests will bypass authentication. If not set, the default
+ value is <code>never</code>.</p>
+ </td></tr><tr><td><code class="attributeName">cache</code></td><td>
+ <p>Should we cache authenticated Principals if the request is part of an
+ HTTP session? If not specified, the default value of <code>true</code>
+ will be used.</p>
+ </td></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.authenticator.SSLAuthenticator</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">changeSessionIdOnAuthentication</code></td><td>
+ <p>Controls if the session ID is changed if a session exists at the
+ point where users are authenticated. This is to prevent session fixation
+ attacks. If not set, the default value of <code>true</code> will be
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">disableProxyCaching</code></td><td>
+ <p>Controls the caching of pages that are protected by security
+ constraints. Setting this to <code>false</code> may help work around
+ caching issues in some browsers but will also cause secured pages to be
+ cached by proxies which will almost certainly be a security issue.
+ <code>securePagesWithPragma</code> offers an alternative, secure,
+ workaround for browser caching issues. If not set, the default value of
+ <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">securePagesWithPragma</code></td><td>
+ <p>Controls the caching of pages that are protected by security
+ constraints. Setting this to <code>false</code> may help work around
+ caching issues in some browsers by using
+ <code>Cache-Control: private</code> rather than the default of
+ <code>Pragma: No-cache</code> and <code>Cache-control: No-cache</code>.
+ If not set, the default value of <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomAlgorithm</code></td><td>
+ <p>Name of the algorithm to use to create the
+ <code>java.security.SecureRandom</code> instances that generate session
+ IDs. If an invalid algorithm and/or provider is specified, the platform
+ default provider and the default algorithm will be used. If not
+ specified, the default algorithm of SHA1PRNG will be used. If the
+ default algorithm is not supported, the platform default will be used.
+ To specify that the platform default should be used, do not set the
+ secureRandomProvider attribute and set this attribute to the empty
+ string.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomClass</code></td><td>
+ <p>Name of the Java class that extends
+ <code>java.security.SecureRandom</code> to use to generate SSO session
+ IDs. If not specified, the default value is
+ <code>java.security.SecureRandom</code>.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomProvider</code></td><td>
+ <p>Name of the provider to use to create the
+ <code>java.security.SecureRandom</code> instances that generate SSO
+ session IDs. If an invalid algorithm and/or provider is specified, the
+ platform default provider and the default algorithm will be used. If not
+ specified, the platform default provider will be used.</p>
+ </td></tr><tr><td><code class="attributeName">jaspicCallbackHandlerClass</code></td><td>
+ <p>Name of the Java class of the
+ <code>javax.security.auth.callback.CallbackHandler</code> implementation
+ which should be used by JASPIC. If none is specified the default
+ <code>org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl</code>
+ will be used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="SPNEGO_Valve">SPNEGO Valve</h4><div class="text">
+
+ <div class="subsection"><h4 id="SPNEGO_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>The <strong>SPNEGO Authenticator Valve</strong> is automatically added to
+ any <a href="context.html">Context</a> that is configured to use SPNEGO
+ authentication.</p>
+
+ <p>If any non-default settings are required, the valve may be configured
+ within <a href="context.html">Context</a> element with the required
+ values.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="SPNEGO_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>SPNEGO Authenticator Valve</strong> supports the following
+ configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">allowCorsPreflight</code></td><td>
+ <p>Are requests that appear to be CORS preflight requests allowed to
+ bypass the authenticator as required by the CORS specification. The
+ allowed values are <code>never</code>, <code>filter</code> and
+ <code>always</code>. <code>never</code> means that a request will never
+ bypass authentication even if it appears to be a CORS preflight request.
+ <code>filter</code> means that a request will bypass authentication if
+ it appears to be a CORS preflight request and the web application the
+ request maps to has the <a href="filter.html#CORS_Filter">CORS
+ Filter</a> enabled and mapped to <code>/*</code>. <code>always</code>
+ means that all requests that appear to be CORS preflight requests will
+ bypass authentication. If not set, the default value is
+ <code>never</code>.</p>
+ </td></tr><tr><td><code class="attributeName">alwaysUseSession</code></td><td>
+ <p>Should a session always be used once a user is authenticated? This
+ may offer some performance benefits since the session can then be used
+ to cache the authenticated Principal, hence removing the need to
+ authenticate the user on every request. This will also help with clients
+ that assume that the server will cache the authenticated user. However
+ there will also be the performance cost of creating and GC'ing the
+ session. For an alternative solution see
+ <code>noKeepAliveUserAgents</code>. If not set, the default value of
+ <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">applyJava8u40Fix</code></td><td>
+ <p>A fix introduced in Java 8 update 40 (
+ <a href="https://bugs.openjdk.java.net/browse/JDK-8048194">JDK-8048194</a>)
+ onwards broke SPNEGO authentication for IE with Tomcat running on
+ Windows 2008 R2 servers. This option enables a work-around that allows
+ SPNEGO authentication to continue working. The work-around should not
+ impact other configurations so it is enabled by default. If necessary,
+ the workaround can be disabled by setting this attribute to
+ <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">cache</code></td><td>
+ <p>Should we cache authenticated Principals if the request is part of an
+ HTTP session? If not specified, the default value of <code>true</code>
+ will be used.</p>
+ </td></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.authenticator.SpnegoAuthenticator</strong>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">changeSessionIdOnAuthentication</code></td><td>
+ <p>Controls if the session ID is changed if a session exists at the
+ point where users are authenticated. This is to prevent session fixation
+ attacks. If not set, the default value of <code>true</code> will be
+ used.</p>
+ </td></tr><tr><td><code class="attributeName">disableProxyCaching</code></td><td>
+ <p>Controls the caching of pages that are protected by security
+ constraints. Setting this to <code>false</code> may help work around
+ caching issues in some browsers but will also cause secured pages to be
+ cached by proxies which will almost certainly be a security issue.
+ <code>securePagesWithPragma</code> offers an alternative, secure,
+ workaround for browser caching issues. If not set, the default value of
+ <code>true</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">loginConfigName</code></td><td>
+ <p>The name of the JAAS login configuration to be used to login as the
+ service. If not specified, the default of
+ <code>com.sun.security.jgss.krb5.accept</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">noKeepAliveUserAgents</code></td><td>
+ <p>Some clients (not most browsers) expect the server to cache the
+ authenticated user information for a connection and do not resend the
+ credentials with every request. Tomcat will not do this unless an HTTP
+ session is available. A session will be available if either the
+ application creates one or if <code>alwaysUseSession</code> is enabled
+ for this Authenticator.</p>
+ <p>As an alternative to creating a session, this attribute may be used
+ to define the user agents for which HTTP keep-alive is disabled. This
+ means that a connection will only used for a single request and hence
+ there is no ability to cache authenticated user information per
+ connection. There will be a performance cost in disabling HTTP
+ keep-alive.</p>
+ <p>The attribute should be a regular expression that matches the entire
+ user-agent string, e.g. <code>.*Chrome.*</code>. If not specified, no
+ regular expression will be defined and no user agents will have HTTP
+ keep-alive disabled.</p>
+ </td></tr><tr><td><code class="attributeName">securePagesWithPragma</code></td><td>
+ <p>Controls the caching of pages that are protected by security
+ constraints. Setting this to <code>false</code> may help work around
+ caching issues in some browsers by using
+ <code>Cache-Control: private</code> rather than the default of
+ <code>Pragma: No-cache</code> and <code>Cache-control: No-cache</code>.
+ If not set, the default value of <code>false</code> will be used.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomAlgorithm</code></td><td>
+ <p>Name of the algorithm to use to create the
+ <code>java.security.SecureRandom</code> instances that generate session
+ IDs. If an invalid algorithm and/or provider is specified, the platform
+ default provider and the default algorithm will be used. If not
+ specified, the default algorithm of SHA1PRNG will be used. If the
+ default algorithm is not supported, the platform default will be used.
+ To specify that the platform default should be used, do not set the
+ secureRandomProvider attribute and set this attribute to the empty
+ string.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomClass</code></td><td>
+ <p>Name of the Java class that extends
+ <code>java.security.SecureRandom</code> to use to generate SSO session
+ IDs. If not specified, the default value is
+ <code>java.security.SecureRandom</code>.</p>
+ </td></tr><tr><td><code class="attributeName">secureRandomProvider</code></td><td>
+ <p>Name of the provider to use to create the
+ <code>java.security.SecureRandom</code> instances that generate SSO
+ session IDs. If an invalid algorithm and/or provider is specified, the
+ platform default provider and the default algorithm will be used. If not
+ specified, the platform default provider will be used.</p>
+ </td></tr><tr><td><code class="attributeName">sendAuthInfoResponseHeaders</code></td><td>
+ <p>Controls whether the auth information (remote user and auth type)
+ shall be returned as response headers for a forwarded/proxied request.
+ When the <code>RemoteIpValve</code> or <code>RemoteIpFilter</code> mark
+ a forwarded request with the <code>Globals.REQUEST_FORWARDED_ATTRIBUTE</code>
+ this authenticator can return the values of
+ <code>HttpServletRequest.getRemoteUser()</code> and
+ <code>HttpServletRequest.getAuthType()</code> as response headers
+ <code>remote-user</code> and <code>auth-type</code> to a reverse proxy.
+ This is useful, e.g., for access log consistency or other decisions to make.
+ If not specified, the default value is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">storeDelegatedCredential</code></td><td>
+ <p>Controls if the user' delegated credential will be stored in
+ the user Principal. If available, the delegated credential will be
+ available to applications (e.g. for onward authentication to external
+ services) via the <code>org.apache.catalina.realm.GSS_CREDENTIAL</code>
+ request attribute. If not set, the default value of <code>true</code>
+ will be used.</p>
+ </td></tr><tr><td><code class="attributeName">jaspicCallbackHandlerClass</code></td><td>
+ <p>Name of the Java class of the
+ <code>javax.security.auth.callback.CallbackHandler</code> implementation
+ which should be used by JASPIC. If none is specified the default
+ <code>org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl</code>
+ will be used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div></div>
+
+
+</div><h3 id="Error_Report_Valve">Error Report Valve</h3><div class="text">
+
+ <div class="subsection"><h4 id="Error_Report_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>The <strong>Error Report Valve</strong> is a simple error handler
+ for HTTP status codes that will generate and return HTML error pages.</p>
+
+ <p><strong>NOTE:</strong> Disabling both showServerInfo and showReport will
+ only return the HTTP status code.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Error_Report_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>Error Report Valve</strong> supports the following
+ configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.valves.ErrorReportValve</strong> to use the
+ default error report valve.</p>
+ </td></tr><tr><td><code class="attributeName">showReport</code></td><td>
+ <p>Flag to determine if the error report (custom error message and/or
+ stack trace) is presented when an error occurs. If set to
+ <code>false</code>, then the error report is not returned in the HTML
+ response.
+ Default value: <code>true</code>
+ </p>
+ </td></tr><tr><td><code class="attributeName">showServerInfo</code></td><td>
+ <p>Flag to determine if server information is presented when an error
+ occurs. If set to <code>false</code>, then the server version is not
+ returned in the HTML response.
+ Default value: <code>true</code>
+ </p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="Crawler_Session_Manager_Valve">Crawler Session Manager Valve</h3><div class="text">
+
+ <div class="subsection"><h4 id="Crawler_Session_Manager_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>Web crawlers can trigger the creation of many thousands of sessions as
+ they crawl a site which may result in significant memory consumption. This
+ Valve ensures that crawlers are associated with a single session - just like
+ normal users - regardless of whether or not they provide a session token
+ with their requests.</p>
+
+ <p>This Valve may be used at the <code>Engine</code>, <code>Host</code> or
+ <code>Context</code> level as required. Normally, this Valve would be used
+ at the <code>Engine</code> level.</p>
+
+ <p>If used in conjunction with Remote IP valve then the Remote IP valve
+ should be defined before this valve to ensure that the correct client IP
+ address is presented to this valve.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Crawler_Session_Manager_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>Crawler Session Manager Valve</strong> supports the
+ following configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.valves.CrawlerSessionManagerValve</strong>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">contextAware</code></td><td>
+ <p>Flag to use the context name together with the client IP to
+ identify the session to re-use. Can be combined with <code>hostAware</code>.
+ Default value: <code>true</code>
+ </p>
+ </td></tr><tr><td><code class="attributeName">crawlerIps</code></td><td>
+ <p>Regular expression (using <code>java.util.regex</code>) that client
+ IP is matched against to determine if a request is from a web crawler.
+ By default such regular expression is not set.</p>
+ </td></tr><tr><td><code class="attributeName">crawlerUserAgents</code></td><td>
+ <p>Regular expression (using <code>java.util.regex</code>) that the user
+ agent HTTP request header is matched against to determine if a request
+ is from a web crawler. If not set, the default of
+ <code>.*[bB]ot.*|.*Yahoo! Slurp.*|.*Feedfetcher-Google.*</code> is used.</p>
+ </td></tr><tr><td><code class="attributeName">hostAware</code></td><td>
+ <p>Flag to use the configured host together with the client IP to
+ identify the session to re-use. Can be combined with <code>contextAware</code>.
+ Default value: <code>true</code>
+ </p>
+ </td></tr><tr><td><code class="attributeName">sessionInactiveInterval</code></td><td>
+ <p>The minimum time in seconds that the Crawler Session Manager Valve
+ should keep the mapping of client IP to session ID in memory without any
+ activity from the client. The client IP / session cache will be
+ periodically purged of mappings that have been inactive for longer than
+ this interval. If not specified the default value of <code>60</code>
+ will be used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="Stuck_Thread_Detection_Valve">Stuck Thread Detection Valve</h3><div class="text">
+
+ <div class="subsection"><h4 id="Stuck_Thread_Detection_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>This valve allows to detect requests that take a long time to process,
+ which might indicate that the thread that is processing it is stuck.
+ Additionally it can optionally interrupt such threads to try and unblock
+ them.</p>
+ <p>When such a request is detected, the current stack trace of its thread is
+ written to Tomcat log with a WARN level.</p>
+ <p>The IDs and names of the stuck threads are available through JMX in the
+ <code>stuckThreadIds</code> and <code>stuckThreadNames</code> attributes.
+ The IDs can be used with the standard Threading JVM MBean
+ (<code>java.lang:type=Threading</code>) to retrieve other information
+ about each stuck thread.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Stuck_Thread_Detection_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>Stuck Thread Detection Valve</strong> supports the
+ following configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.valves.StuckThreadDetectionValve</strong>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">threshold</code></td><td>
+ <p>Minimum duration in seconds after which a thread is considered stuck.
+ Default is 600 seconds. If set to 0, the detection is disabled.</p>
+ <p>Note: since the detection (and optional interruption) is done in the
+ background thread of the Container (Engine, Host or Context) declaring
+ this Valve, the threshold should be higher than the
+ <code>backgroundProcessorDelay</code> of this Container.</p>
+ </td></tr><tr><td><code class="attributeName">interruptThreadThreshold</code></td><td>
+ <p>Minimum duration in seconds after which a stuck thread should be
+ interrupted to attempt to "free" it.</p>
+ <p>Note that there's no guarantee that the thread will get unstuck.
+ This usually works well for threads stuck on I/O or locks, but is
+ probably useless in case of infinite loops.</p>
+ <p>Default is -1 which disables the feature. To enable it, the value
+ must be greater or equal to <code>threshold</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="Semaphore_Valve">Semaphore Valve</h3><div class="text">
+
+ <div class="subsection"><h4 id="Semaphore_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>The <strong>Semaphore Valve</strong> is able to limit the number of
+ concurrent request processing threads.</p>
+ <p><strong>org.apache.catalina.valves.SemaphoreValve</strong> provides
+ methods which may be overridden by a subclass to customize behavior:</p>
+ <ul>
+ <li><b><code>controlConcurrency</code></b> may be overridden to add
+ conditions;</li>
+ <li><b><code>permitDenied</code></b> may be overridden to add error handling
+ when a permit isn't granted.</li>
+ </ul>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Semaphore_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>Semaphore Valve</strong> supports the following
+ configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">block</code></td><td>
+ <p>Flag to determine if a thread is blocked until a permit is available.
+ The default value is <strong>true</strong>.</p>
+ </td></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.valves.SemaphoreValve</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">concurrency</code></td><td>
+ <p>Concurrency level of the semaphore. The default value is
+ <strong>10</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">fairness</code></td><td>
+ <p>Fairness of the semaphore. The default value is
+ <strong>false</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">interruptible</code></td><td>
+ <p>Flag to determine if a thread may be interrupted until a permit is
+ available. The default value is <strong>false</strong>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div><h3 id="Persistent_Valve">Persistent Valve</h3><div class="text">
+
+ <div class="subsection"><h4 id="Persistent_Valve/Introduction">Introduction</h4><div class="text">
+
+ <p>The <strong>PersistentValve</strong> that implements per-request session
+ persistence. It is intended to be used with non-sticky load-balancers.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Persistent_Valve/Attributes">Attributes</h4><div class="text">
+
+ <p>The <strong>PersistentValve Valve</strong> supports the
+ following configuration attributes:</p>
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td>
+ <p>Java class name of the implementation to use. This MUST be set to
+ <strong>org.apache.catalina.valves.PersistentValve</strong>.</p>
+ </td></tr><tr><td><code class="attributeName">filter</code></td><td>
+ <p>For known file extensions or urls, you can use this filter pattern to
+ notify the valve that no session required during this request. If the
+ request matches this filter pattern, the valve assumes there has been no
+ need to restore session. An example filter would look like <code>
+ filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|
+ .*\.css|.*\.txt"</code>. The filter is a regular expression using
+ <code>java.util.regex</code>.</p>
+ </td></tr></table>
+
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/connectors.html b/web/tomcat/webapps/docs/connectors.html
new file mode 100644
index 0000000..c8bcf5d
--- /dev/null
+++ b/web/tomcat/webapps/docs/connectors.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Connectors How To</title><meta name="author" content="Remy Maucherat"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Connectors How To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#HTTP">HTTP</a></li><li><a href="#AJP">AJP</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+<p>Choosing a connector to use with Tomcat can be difficult. This page will
+list the connectors which are supported with this Tomcat release, and will
+hopefully help you make the right choice according to your needs.</p>
+
+</div><h3 id="HTTP">HTTP</h3><div class="text">
+
+<p>The HTTP connector is setup by default with Tomcat, and is ready to use. This
+connector features the lowest latency and best overall performance.</p>
+
+<p>For clustering, an HTTP load balancer <b>with support for web sessions stickiness</b>
+must be installed to direct the traffic to the Tomcat servers. Tomcat supports mod_proxy
+(on Apache HTTP Server 2.x, and included by default in Apache HTTP Server 2.2) as the load balancer.
+It should be noted that the performance of HTTP proxying is usually lower than the
+performance of AJP, so AJP clustering is often preferable.</p>
+
+</div><h3 id="AJP">AJP</h3><div class="text">
+
+<p>When using a single server, the performance when using a native webserver in
+front of the Tomcat instance is most of the time significantly worse than a
+standalone Tomcat with its default HTTP connector, even if a large part of the web
+application is made of static files. If integration with the native webserver is
+needed for any reason, an AJP connector will provide faster performance than
+proxied HTTP. AJP clustering is the most efficient from the Tomcat perspective.
+It is otherwise functionally equivalent to HTTP clustering.</p>
+
+<p>The native connectors supported with this Tomcat release are:</p>
+<ul>
+<li>JK 1.2.x with any of the supported servers</li>
+<li>mod_proxy on Apache HTTP Server 2.x (included by default in Apache HTTP Server 2.2),
+with AJP enabled</li>
+</ul>
+
+<p><b>Other native connectors supporting AJP may work, but are no longer supported.</b></p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/default-servlet.html b/web/tomcat/webapps/docs/default-servlet.html
new file mode 100644
index 0000000..5cc48fe
--- /dev/null
+++ b/web/tomcat/webapps/docs/default-servlet.html
@@ -0,0 +1,271 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Default Servlet Reference</title><meta name="author" content="Tim Funk"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Default Servlet Reference</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#what">What is the DefaultServlet</a></li><li><a href="#where">Where is it declared?</a></li><li><a href="#change">What can I change?</a></li><li><a href="#dir">How do I customize directory listings?</a></li><li><a href="#secure">How do I secure directory listings?</a></li></ul>
+</div><h3 id="what">What is the DefaultServlet</h3><div class="text">
+<p>
+The default servlet is the servlet which serves static resources as well
+as serves the directory listings (if directory listings are enabled).
+</p>
+</div><h3 id="where">Where is it declared?</h3><div class="text">
+<p>
+It is declared globally in <i>$CATALINA_BASE/conf/web.xml</i>.
+By default here is it's declaration:
+</p>
+<div class="codeBox"><pre><code> <servlet>
+ <servlet-name>default</servlet-name>
+ <servlet-class>
+ org.apache.catalina.servlets.DefaultServlet
+ </servlet-class>
+ <init-param>
+ <param-name>debug</param-name>
+ <param-value>0</param-value>
+ </init-param>
+ <init-param>
+ <param-name>listings</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+...
+
+ <servlet-mapping>
+ <servlet-name>default</servlet-name>
+ <url-pattern>/</url-pattern>
+ </servlet-mapping></code></pre></div>
+
+So by default, the default servlet is loaded at webapp startup and
+directory listings are disabled and debugging is turned off.
+</div><h3 id="change">What can I change?</h3><div class="text">
+<p>
+ The DefaultServlet allows the following initParameters:
+</p>
+
+<table class="defaultTable"><tr><th style="width: 15%;">
+ Property
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="propertyName">debug</code></td><td>
+ Debugging level. It is not very useful unless you are a tomcat
+ developer. As
+ of this writing, useful values are 0, 1, 11. [0]
+ </td></tr><tr><td><code class="propertyName">listings</code></td><td>
+ If no welcome file is present, can a directory listing be
+ shown?
+ value may be <b>true</b> or <b>false</b> [false]
+ <br>
+ Welcome files are part of the servlet api.
+ <br>
+ <b>WARNING:</b> Listings of directories containing many entries are
+ expensive. Multiple requests for large directory listings can consume
+ significant proportions of server resources.
+ </td></tr><tr><td><code class="propertyName">precompressed</code></td><td>
+ If a precompressed version of a file exists (a file with <code>.br</code>
+ or <code>.gz</code> appended to the file name located alongside the
+ original file), Tomcat will serve the precompressed file if the user
+ agent supports the matching content encoding (br or gzip) and this
+ option is enabled. [false]
+ <br>
+ The precompressed file with the with <code>.br</code> or <code>.gz</code>
+ extension will be accessible if requested directly so if the original
+ resource is protected with a security constraint, the precompressed
+ versions must be similarly protected.
+ <br>
+ It is also possible to configure the list of precompressed formats.
+ The syntax is comma separated list of
+ <code>[content-encoding]=[file-extension]</code> pairs. For example:
+ <code>br=.br,gzip=.gz,bzip2=.bz2</code>. If multiple formats are
+ specified, the client supports more than one and the client does not
+ express a preference, the order of the list of formats will be treated
+ as the server preference order and used to select the format returned.
+ </td></tr><tr><td><code class="propertyName">readmeFile</code></td><td>
+ If a directory listing is presented, a readme file may also
+ be presented with the listing. This file is inserted as is
+ so it may contain HTML.
+ </td></tr><tr><td><code class="propertyName">globalXsltFile</code></td><td>
+ If you wish to customize your directory listing, you
+ can use an XSL transformation. This value is a relative file name (to
+ either $CATALINA_BASE/conf/ or $CATALINA_HOME/conf/) which will be used
+ for all directory listings. This can be overridden per context and/or
+ per directory. See <strong>contextXsltFile</strong> and
+ <strong>localXsltFile</strong> below. The format of the xml is shown
+ below.
+ </td></tr><tr><td><code class="propertyName">contextXsltFile</code></td><td>
+ You may also customize your directory listing by context by
+ configuring <code>contextXsltFile</code>. This must be a context
+ relative path (e.g.: <code>/path/to/context.xslt</code>) to a file with
+ a <code>.xsl</code> or <code>.xslt</code> extension. This overrides
+ <code>globalXsltFile</code>. If this value is present but a file does
+ not exist, then <code>globalXsltFile</code> will be used. If
+ <code>globalXsltFile</code> does not exist, then the default
+ directory listing will be shown.
+ </td></tr><tr><td><code class="propertyName">localXsltFile</code></td><td>
+ You may also customize your directory listing by directory by
+ configuring <code>localXsltFile</code>. This must be a file in the
+ directory where the listing will take place to with a
+ <code>.xsl</code> or <code>.xslt</code> extension. This overrides
+ <code>globalXsltFile</code> and <code>contextXsltFile</code>. If this
+ value is present but a file does not exist, then
+ <code>contextXsltFile</code> will be used. If
+ <code>contextXsltFile</code> does not exist, then
+ <code>globalXsltFile</code> will be used. If
+ <code>globalXsltFile</code> does not exist, then the default
+ directory listing will be shown.
+ </td></tr><tr><td><code class="propertyName">input</code></td><td>
+ Input buffer size (in bytes) when reading
+ resources to be served. [2048]
+ </td></tr><tr><td><code class="propertyName">output</code></td><td>
+ Output buffer size (in bytes) when writing
+ resources to be served. [2048]
+ </td></tr><tr><td><code class="propertyName">readonly</code></td><td>
+ Is this context "read only", so HTTP commands like PUT and
+ DELETE are rejected? [true]
+ </td></tr><tr><td><code class="propertyName">fileEncoding</code></td><td>
+ File encoding to be used when reading static resources.
+ [platform default]
+ </td></tr><tr><td><code class="propertyName">useBomIfPresent</code></td><td>
+ If a static file contains a byte order mark (BOM), should this be used
+ to determine the file encoding in preference to fileEncoding. This
+ setting must be one of <code>true</code> (remove the BOM and use it in
+ preference to fileEncoding), <code>false</code> (remove the BOM but do
+ not use it) or <code>pass-through</code> (do not use the BOM and do not
+ remove it). [true]
+ </td></tr><tr><td><code class="propertyName">sendfileSize</code></td><td>
+ If the connector used supports sendfile, this represents the minimal
+ file size in KB for which sendfile will be used. Use a negative value
+ to always disable sendfile. [48]
+ </td></tr><tr><td><code class="propertyName">useAcceptRanges</code></td><td>
+ If true, the Accept-Ranges header will be set when appropriate for the
+ response. [true]
+ </td></tr><tr><td><code class="propertyName">showServerInfo</code></td><td>
+ Should server information be presented in the response sent to clients
+ when directory listing is enabled. [true]
+ </td></tr><tr><td><code class="propertyName">sortListings</code></td><td>
+ Should the server sort the listings in a directory. [false]
+ </td></tr><tr><td><code class="propertyName">sortDirectoriesFirst</code></td><td>
+ Should the server list all directories before all files. [false]
+ </td></tr></table>
+</div><h3 id="dir">How do I customize directory listings?</h3><div class="text">
+<p>You can override DefaultServlet with you own implementation and use that
+in your web.xml declaration. If you
+can understand what was just said, we will assume you can read the code
+to DefaultServlet servlet and make the appropriate adjustments. (If not,
+then that method isn't for you)
+</p>
+<p>
+You can use either <code>localXsltFile</code> or
+<code>globalXsltFile</code> and DefaultServlet will create
+an xml document and run it through an xsl transformation based
+on the values provided in <code>localXsltFile</code> and
+<code>globalXsltFile</code>. <code>localXsltFile</code> is first
+checked, followed by <code>globalXsltFile</code>, then default
+behaviors takes place.
+</p>
+
+<p>
+Format:
+</p>
+<div class="codeBox"><pre><code> <listing>
+ <entries>
+ <entry type='file|dir' urlPath='aPath' size='###' date='gmt date'>
+ fileName1
+ </entry>
+ <entry type='file|dir' urlPath='aPath' size='###' date='gmt date'>
+ fileName2
+ </entry>
+ ...
+ </entries>
+ <readme></readme>
+ </listing></code></pre></div>
+<ul>
+ <li>size will be missing if <code>type='dir'</code></li>
+ <li>Readme is a CDATA entry</li>
+</ul>
+
+<p>
+ The following is a sample xsl file which mimics the default tomcat behavior:
+</p>
+<div class="codeBox"><pre><code><?xml version="1.0" encoding="UTF-8"?>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="3.0">
+
+ <xsl:output method="html" html-version="5.0"
+ encoding="UTF-8" indent="no"
+ doctype-system="about:legacy-compat"/>
+
+ <xsl:template match="listing">
+ <html>
+ <head>
+ <title>
+ Sample Directory Listing For
+ <xsl:value-of select="@directory"/>
+ </title>
+ <style>
+ h1 {color : white;background-color : #0086b2;}
+ h3 {color : white;background-color : #0086b2;}
+ body {font-family : sans-serif,Arial,Tahoma;
+ color : black;background-color : white;}
+ b {color : white;background-color : #0086b2;}
+ a {color : black;} HR{color : #0086b2;}
+ table td { padding: 5px; }
+ </style>
+ </head>
+ <body>
+ <h1>Sample Directory Listing For
+ <xsl:value-of select="@directory"/>
+ </h1>
+ <hr style="height: 1px;" />
+ <table style="width: 100%;">
+ <tr>
+ <th style="text-align: left;">Filename</th>
+ <th style="text-align: center;">Size</th>
+ <th style="text-align: right;">Last Modified</th>
+ </tr>
+ <xsl:apply-templates select="entries"/>
+ </table>
+ <xsl:apply-templates select="readme"/>
+ <hr style="height: 1px;" />
+ <h3>Apache Tomcat/8.5</h3>
+ </body>
+ </html>
+ </xsl:template>
+
+
+ <xsl:template match="entries">
+ <xsl:apply-templates select="entry"/>
+ </xsl:template>
+
+ <xsl:template match="readme">
+ <hr style="height: 1px;" />
+ <pre><xsl:apply-templates/></pre>
+ </xsl:template>
+
+ <xsl:template match="entry">
+ <tr>
+ <td style="text-align: left;">
+ <xsl:variable name="urlPath" select="@urlPath"/>
+ <a href="{$urlPath}">
+ <pre><xsl:apply-templates/></pre>
+ </a>
+ </td>
+ <td style="text-align: right;">
+ <pre><xsl:value-of select="@size"/></pre>
+ </td>
+ <td style="text-align: right;">
+ <pre><xsl:value-of select="@date"/></pre>
+ </td>
+ </tr>
+ </xsl:template>
+
+</xsl:stylesheet></code></pre></div>
+
+</div><h3 id="secure">How do I secure directory listings?</h3><div class="text">
+Use web.xml in each individual webapp. See the security section of the
+Servlet specification.
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/deployer-howto.html b/web/tomcat/webapps/docs/deployer-howto.html
new file mode 100644
index 0000000..2671e4c
--- /dev/null
+++ b/web/tomcat/webapps/docs/deployer-howto.html
@@ -0,0 +1,309 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Tomcat Web Application Deployment</title><meta name="author" content="Allistair Crossley"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Tomcat Web Application Deployment</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Installation">Installation</a></li><li><a href="#A_word_on_Contexts">A word on Contexts</a></li><li><a href="#Deployment_on_Tomcat_startup">Deployment on Tomcat startup</a></li><li><a href="#Deploying_on_a_running_Tomcat_server">Deploying on a running Tomcat server</a></li><li><a href="#Deploying_using_the_Tomcat_Manager">Deploying using the Tomcat Manager</a></li><li><a href="#Deploying_using_the_Client_Deployer_Package">Deploying using the Client Deployer Package</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>
+ Deployment is the term used for the process of installing a web
+ application (either a 3rd party WAR or your own custom web application)
+ into the Tomcat server.
+ </p>
+ <p>
+ Web application deployment may be accomplished in a number of ways
+ within the Tomcat server.
+ </p>
+ <ul>
+ <li>Statically; the web application is setup before Tomcat is started</li>
+ <li>
+ Dynamically; by directly manipulating already deployed web
+ applications (relying on <em>auto-deployment</em>
+ feature) or remotely by using the Tomcat Manager web
+ application
+ </li>
+ </ul>
+ <p>
+ The <a href="manager-howto.html">Tomcat Manager</a> is a web
+ application that can be used interactively (via HTML GUI) or
+ programmatically (via URL-based API) to deploy and manage web
+ applications.
+ </p>
+ <p>
+ There are a number of ways to perform deployment that rely on
+ the Manager web application. Apache Tomcat provides tasks
+ for Apache Ant build tool.
+ <a href="https://tomcat.apache.org/maven-plugin.html">Apache Tomcat Maven Plugin</a>
+ project provides integration with Apache Maven.
+ There is also a tool called the Client Deployer, which can be
+ used from a command line and provides additional functionality
+ such as compiling and validating web applications as well as
+ packaging web application into web application resource (WAR)
+ files.
+ </p>
+ </div><h3 id="Installation">Installation</h3><div class="text">
+ <p>
+ There is no installation required for static deployment of web
+ applications as this is provided out of the box by Tomcat. Nor is any
+ installation required for deployment functions with the Tomcat Manager,
+ although some configuration is required as detailed in the
+ <a href="manager-howto.html">Tomcat Manager manual</a>.
+ An installation is however required if you wish
+ to use the Tomcat Client Deployer (TCD).
+ </p>
+ <p>
+ The TCD is not packaged with the Tomcat core
+ distribution, and must therefore be downloaded separately from
+ the Downloads area. The download is usually labelled
+ <i>apache-tomcat-8.5.x-deployer</i>.
+ </p>
+ <p>
+ TCD has prerequisites of Apache Ant 1.6.2+ and a Java installation.
+ Your environment should define an ANT_HOME environment value pointing to
+ the root of your Ant installation, and a JAVA_HOME value pointing to
+ your Java installation. Additionally, you should ensure Ant's ant
+ command, and the Java javac compiler command run from the command shell
+ that your operating system provides.
+ </p>
+ <ol>
+ <li>Download the TCD distribution</li>
+ <li>
+ The TCD package need not be extracted into any existing Tomcat
+ installation, it can be extracted to any location.
+ </li>
+ <li>Read Using the <a href="#Deploying_using_the_Client_Deployer_Package">
+ Tomcat Client Deployer</a></li>
+ </ol>
+ </div><h3 id="A_word_on_Contexts">A word on Contexts</h3><div class="text">
+ <p>
+ In talking about deployment of web applications, the concept of a
+ <i>Context</i> is required to be understood. A Context is what Tomcat
+ calls a web application.
+ </p>
+ <p>
+ In order to configure a Context within Tomcat a <i>Context Descriptor</i>
+ is required. A Context Descriptor is simply an XML file that contains
+ Tomcat related configuration for a Context, e.g naming resources or
+ session manager configuration. In earlier versions of
+ Tomcat the content of a Context Descriptor configuration was often stored within
+ Tomcat's primary configuration file <i>server.xml</i> but this is now
+ discouraged (although it currently still works).
+ </p>
+ <p>
+ Context Descriptors not only help Tomcat to know how to configure
+ Contexts but other tools such as the Tomcat Manager and TCD often use
+ these Context Descriptors to perform their roles properly.
+ </p>
+ <p>
+ The locations for Context Descriptors are:
+ </p>
+ <ol>
+ <li>$CATALINA_BASE/conf/[enginename]/[hostname]/[webappname].xml</li>
+ <li>$CATALINA_BASE/webapps/[webappname]/META-INF/context.xml</li>
+ </ol>
+ <p>
+ Files in (1) are named [webappname].xml but files in (2) are named
+ context.xml. If a Context Descriptor is not provided for a Context,
+ Tomcat configures the Context using default values.
+ </p>
+ </div><h3 id="Deployment_on_Tomcat_startup">Deployment on Tomcat startup</h3><div class="text">
+ <p>
+ If you are not interested in using the Tomcat Manager, or TCD,
+ then you'll need to deploy your web applications
+ statically to Tomcat, followed by a Tomcat startup. The location you
+ deploy web applications to for this type of deployment is called the
+ <code>appBase</code> which is specified per Host. You either copy a
+ so-called <i>exploded web application</i>, i.e non-compressed, to this
+ location, or a compressed web application resource .WAR file.
+ </p>
+ <p>
+ The web applications present in the location specified by the Host's
+ (default Host is "localhost") <code>appBase</code> attribute (default
+ appBase is "$CATALINA_BASE/webapps") will be deployed on Tomcat startup
+ only if the Host's <code>deployOnStartup</code> attribute is "true".
+ </p>
+ <p>
+ The following deployment sequence will occur on Tomcat startup in that
+ case:
+ </p>
+ <ol>
+ <li>Any Context Descriptors will be deployed first.</li>
+ <li>
+ Exploded web applications not referenced by any Context
+ Descriptor will then be deployed. If they have an associated
+ .WAR file in the appBase and it is newer than the exploded web application,
+ the exploded directory will be removed and the webapp will be
+ redeployed from the .WAR
+ </li>
+ <li>.WAR files will be deployed</li>
+ </ol>
+ </div><h3 id="Deploying_on_a_running_Tomcat_server">Deploying on a running Tomcat server</h3><div class="text">
+ <p>
+ It is possible to deploy web applications to a running Tomcat server.
+ </p>
+ <p>
+ If the Host <code>autoDeploy</code> attribute is "true", the Host will
+ attempt to deploy and update web applications dynamically, as needed,
+ for example if a new .WAR is dropped into the <code>appBase</code>.
+ For this to work, the Host needs to have background processing
+ enabled which is the default configuration.
+ </p>
+
+ <p>
+ <code>autoDeploy</code> set to "true" and a running Tomcat allows for:
+ </p>
+ <ul>
+ <li>Deployment of .WAR files copied into the Host <code>appBase</code>.</li>
+ <li>
+ Deployment of exploded web applications which are
+ copied into the Host <code>appBase</code>.
+ </li>
+ <li>
+ Re-deployment of a web application which has already been deployed from
+ a .WAR when the new .WAR is provided. In this case the exploded
+ web application is removed, and the .WAR is expanded again.
+ Note that the explosion will not occur if the Host is configured
+ so that .WARs are not exploded with a <code>unpackWARs</code>
+ attribute set to "false", in which case the web application
+ will be simply redeployed as a compressed archive.
+ </li>
+ <li>
+ Re-loading of a web application if the /WEB-INF/web.xml file (or
+ any other resource defined as a WatchedResource) is updated.
+ </li>
+ <li>
+ Re-deployment of a web application if the Context Descriptor
+ file from which the web application has been deployed is
+ updated.
+ </li>
+ <li>
+ Re-deployment of dependent web applications if the global or
+ per-host Context Descriptor file used by the web application is
+ updated.
+ </li>
+ <li>
+ Re-deployment of a web application if a Context Descriptor file (with a
+ filename corresponding to the Context path of the previously deployed
+ web application) is added to the
+ <code>$CATALINA_BASE/conf/[enginename]/[hostname]/</code>
+ directory.
+ </li>
+ <li>
+ Undeployment of a web application if its document base (docBase)
+ is deleted. Note that on Windows, this assumes that anti-locking
+ features (see Context configuration) are enabled, otherwise it is not
+ possible to delete the resources of a running web application.
+ </li>
+ </ul>
+ <p>
+ Note that web application reloading can also be configured in the loader, in which
+ case loaded classes will be tracked for changes.
+ </p>
+ </div><h3 id="Deploying_using_the_Tomcat_Manager">Deploying using the Tomcat Manager</h3><div class="text">
+ <p>
+ The Tomcat Manager is covered in its <a href="manager-howto.html">own manual page</a>.
+ </p>
+ </div><h3 id="Deploying_using_the_Client_Deployer_Package">Deploying using the Client Deployer Package</h3><div class="text">
+ <p>
+ Finally, deployment of web application may be achieved using the
+ Tomcat Client Deployer. This is a package which can be used to
+ validate, compile, compress to .WAR, and deploy web applications to
+ production or development Tomcat servers. It should be noted that this feature
+ uses the Tomcat Manager and as such the target Tomcat server should be
+ running.
+ </p>
+
+ <p>
+ It is assumed the user will be familiar with Apache Ant for using the TCD.
+ Apache Ant is a scripted build tool. The TCD comes pre-packaged with a
+ build script to use. Only a modest understanding of Apache Ant is
+ required (installation as listed earlier in this page, and familiarity
+ with using the operating system command shell and configuring
+ environment variables).
+ </p>
+
+ <p>
+ The TCD includes Ant tasks, the Jasper page compiler for JSP compilation
+ before deployment, as well as a task which
+ validates the web application Context Descriptor. The validator task (class
+ <code>org.apache.catalina.ant.ValidatorTask</code>) allows only one parameter:
+ the base path of an exploded web application.
+ </p>
+
+ <p>
+ The TCD uses an exploded web application as input (see the list of the
+ properties used below). A web application that is programmatically
+ deployed with the deployer may include a Context Descriptor in
+ <code>/META-INF/context.xml</code>.
+ </p>
+
+ <p>
+ The TCD includes a ready-to-use Ant script, with the following targets:
+ </p>
+ <ul>
+ <li>
+ <code>compile</code> (default): Compile and validate the web
+ application. This can be used standalone, and does not need a running
+ Tomcat server. The compiled application will only run on the associated
+ <em>Tomcat X.Y.Z</em> server release, and is not guaranteed to work
+ on another Tomcat release, as the code generated by Jasper depends on its runtime
+ component. It should also be noted that this target will also compile
+ automatically any Java source file located in the
+ <code>/WEB-INF/classes</code> folder of the web application.</li>
+ <li>
+ <code>deploy</code>: Deploy a web application (compiled or not) to
+ a Tomcat server.
+ </li>
+ <li><code>undeploy</code>: Undeploy a web application</li>
+ <li><code>start</code>: Start web application</li>
+ <li><code>reload</code>: Reload web application</li>
+ <li><code>stop</code>: Stop web application</li>
+ </ul>
+
+ <p>
+ In order for the deployment to be configured, create a file
+ called <code>deployer.properties</code> in the TCD installation
+ directory root. In this file, add the following name=value pairs per
+ line:
+ </p>
+
+ <p>
+ Additionally, you will need to ensure that a user has been
+ setup for the target Tomcat Manager (which TCD uses) otherwise the TCD
+ will not authenticate with the Tomcat Manager and the deployment will
+ fail. To do this, see the Tomcat Manager page.
+ </p>
+
+ <ul>
+ <li>
+ <code>build</code>: The build folder used will be, by default,
+ <code>${build}/webapp/${path}</code> (<code>${build}</code>, by
+ default, points to <code>${basedir}/build</code>). After the end
+ of the execution of the <code>compile</code> target, the web
+ application .WAR will be located at
+ <code>${build}/webapp/${path}.war</code>.
+ </li>
+ <li>
+ <code>webapp</code>: The directory containing the exploded web application
+ which will be compiled and validated. By default, the folder is
+ <code>myapp</code>.
+ </li>
+ <li>
+ <code>path</code>: Deployed context path of the web application,
+ by default <code>/myapp</code>.
+ </li>
+ <li>
+ <code>url</code>: Absolute URL to the Tomcat Manager web application of a
+ running Tomcat server, which will be used to deploy and undeploy the
+ web application. By default, the deployer will attempt to access
+ a Tomcat instance running on localhost, at
+ <code>http://localhost:8080/manager/text</code>.
+ </li>
+ <li>
+ <code>username</code>: Tomcat Manager username (user should have a role of
+ manager-script)
+ </li>
+ <li><code>password</code>: Tomcat Manager password.</li>
+ </ul>
+ </div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/developers.html b/web/tomcat/webapps/docs/developers.html
new file mode 100644
index 0000000..35089d1
--- /dev/null
+++ b/web/tomcat/webapps/docs/developers.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Tomcat Developers</title><meta name="author" content="Remy Maucherat"><meta name="author" content="Yoav Shapira"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Tomcat Developers</h2><h3 id="Active_Developers">Active Developers</h3><div class="text">
+
+ <p>
+ The list indicates the developers' main areas of interest. Feel free to
+ add to the list :) The developers email addresses are
+ <code>[login]@apache.org</code>. Please <strong>do not</strong> contact
+ developers directly for any support issues (please post to the
+ tomcat-users mailing list instead, or one of the other support
+ resources; some organizations and individual consultants also offer
+ for pay Tomcat support, as listed on the
+ <a href="https://wiki.apache.org/tomcat/SupportAndTraining">support and
+ training</a> page on the Tomcat Wiki).
+ </p>
+
+ <ul>
+ <li>Bill Barker (billbarker): Connectors</li>
+ <li>Costin Manolache (costin): Catalina, Connectors</li>
+ <li>Filip Hanik (fhanik): Clustering, Release Manager</li>
+ <li>Jean-Frederic Clere (jfclere): Connectors</li>
+ <li>Jim Jagielski (jim): Connectors</li>
+ <li>Konstantin Kolinko (kkolinko): Catalina</li>
+ <li>Mark Thomas (markt): CGI, SSI, WebDAV, bug fixing</li>
+ <li>Mladen Turk (mturk): Connectors</li>
+ <li>Peter Rossbach (pero): Catalina, Clustering, JMX</li>
+ <li>Rainer Jung (rjung): Catalina, Clustering, Connectors</li>
+ <li>Remy Maucherat (remm): Catalina, Connectors, Docs</li>
+ <li>Tim Funk (funkman): Catalina, Docs</li>
+ <li>Tim Whittington (timw): Connectors</li>
+ </ul>
+
+ </div><h3 id="Retired_Developers">Retired Developers</h3><div class="text">
+
+ <ul>
+ <li>Amy Roh (amyroh): Catalina</li>
+ <li>Glenn Nielsen (glenn): Catalina, Connectors</li>
+ <li>Henri Gomez (hgomez): Connectors</li>
+ <li>Jan Luehe (luehe): Jasper</li>
+ <li>Jean-Francois Arcand (jfarcand): Catalina</li>
+ <li>Kin-Man Chung (kinman): Jasper</li>
+ <li>Yoav Shapira (yoavs): Docs, JMX, Catalina, balancer</li>
+ </ul>
+ </div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/elapi/index.html b/web/tomcat/webapps/docs/elapi/index.html
new file mode 100644
index 0000000..695de9d
--- /dev/null
+++ b/web/tomcat/webapps/docs/elapi/index.html
@@ -0,0 +1,34 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8" />
+ <title>API docs</title>
+</head>
+
+<body>
+
+The EL Javadoc is not installed by default. Download and install
+the "fulldocs" package to get it.
+
+You can also access the javadoc online in the Tomcat
+<a href="https://tomcat.apache.org/tomcat-8.5-doc/">
+documentation bundle</a>.
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/docs/extras.html b/web/tomcat/webapps/docs/extras.html
new file mode 100644
index 0000000..d633cff
--- /dev/null
+++ b/web/tomcat/webapps/docs/extras.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Additional Components</title><meta name="author" content="Remy Maucherat"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Additional Components</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Downloading">Downloading</a></li><li><a href="#Building">Building</a></li><li><a href="#Components_list">Components list</a><ol><li><a href="#Full_commons-logging_implementation">Full commons-logging implementation</a></li><li><a href="#Web_Services_support_(JSR_109)">Web Services support (JSR 109)</a></li><li><a href="#JMX_Remote_Lifecycle_Listener">JMX Remote Lifecycle Listener</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>
+ A number of additional components may be used with Apache Tomcat. These
+ components may be built by users should they need them or they can be
+ downloaded from one of the mirrors.
+ </p>
+
+ </div><h3 id="Downloading">Downloading</h3><div class="text">
+ <p>
+ To download the extras components open the
+ <a href="https://tomcat.apache.org/download-80.cgi">Tomcat download page</a>
+ and select "Browse" from the Quick Navigation Links. The extras components
+ can be found in bin/extras.
+ </p>
+ </div><h3 id="Building">Building</h3><div class="text">
+
+ <p>
+ The additional components are built using the <code>extras</code> target
+ of the standard Tomcat Ant script which is present in the source bundle of
+ Tomcat.
+ </p>
+
+ <p>The build process is the following:</p>
+
+ <ul>
+ <li>Follow the <a href="building.html">build instructions</a> to build a
+ Tomcat binary from the source bundle (note: it will be used by the build
+ process of the additional components, but does not need to be actually
+ used later on)</li>
+ <li>Execute the command <code>ant extras</code> to run the build
+ script</li>
+ <li>The additional components JARs will be placed in the
+ <code>output/extras</code> folder</li>
+ <li>Refer to the documentation below about the usage of these JARs</li>
+ </ul>
+
+ </div><h3 id="Components_list">Components list</h3><div class="text">
+
+ <div class="subsection"><h4 id="Full_commons-logging_implementation">Full commons-logging implementation</h4><div class="text">
+
+ <p>
+ Tomcat uses a package renamed commons-logging API implementation which is
+ hardcoded to use the java.util.logging API. The commons-logging additional
+ component builds a full fledged package renamed commons-logging
+ implementation which can be used to replace the implementation provided with
+ Tomcat. See the <a href="logging.html">logging</a> page for usage
+ instructions.
+ </p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Web_Services_support_(JSR_109)">Web Services support (JSR 109)</h4><div class="text">
+
+ <p>
+ Tomcat provides factories for JSR 109 which may be used to resolve web
+ services references. Place the generated catalina-ws.jar as well as
+ jaxrpc.jar and wsdl4j.jar (or another implementation of JSR 109) in the
+ Tomcat lib folder.
+ </p>
+
+ <p>
+ Users should be aware that wsdl4j.jar is licensed under CPL 1.0 and not the
+ Apache License version 2.0.
+ </p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="JMX_Remote_Lifecycle_Listener">JMX Remote Lifecycle Listener</h4><div class="text">
+
+ <p>
+ The JMX protocol requires the JMX server (Tomcat in this instance) to listen
+ on two network ports. One of these ports can be fixed via configuration but
+ the second is selected randomly. This makes it difficult to use JMX through
+ a firewall. The JMX Remote Lifecycle Listener allows both ports to be fixed,
+ simplifying the process of connecting to JMX through a firewall. See the <a href="config/listeners.html">listeners</a> page for usage instructions.
+ </p>
+
+ </div></div>
+ </div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/host-manager-howto.html b/web/tomcat/webapps/docs/host-manager-howto.html
new file mode 100644
index 0000000..f01027a
--- /dev/null
+++ b/web/tomcat/webapps/docs/host-manager-howto.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Host Manager App -- Text Interface</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Host Manager App -- Text Interface</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+ <ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Configuring_Manager_Application_Access">Configuring Manager Application Access</a></li><li><a href="#List_of_Commands">List of Commands</a><ol><li><a href="#List_command">List command</a></li><li><a href="#Add_command">Add command</a></li><li><a href="#Remove_command">Remove command</a></li><li><a href="#Start_command">Start command</a></li><li><a href="#Stop_command">Stop command</a></li><li><a href="#Persist_command">Persist command</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>
+ The <strong>Tomcat Host Manager</strong> application enables you to create,
+ delete, and otherwise manage virtual hosts within Tomcat. This how-to guide
+ is best accompanied by the following pieces of documentation:
+ </p>
+ <ul>
+ <li>
+ <a href="virtual-hosting-howto.html">Virtual Hosting How-To</a> for more
+ information about virtual hosting.
+ </li>
+ <li>
+ <a href="config/host.html">The Host Container</a> for more information
+ about the underlying xml configuration of virtual hosts and description
+ of attributes.
+ </li>
+ </ul>
+
+ <p>
+ The <strong>Tomcat Host Manager</strong> application is a part of
+ Tomcat installation, by default available using the following
+ context: <code>/host-manager</code>. You can use the host manager in the
+ following ways:
+ </p>
+
+ <ul>
+ <li>
+ Utilizing the graphical user interface, accessible at:
+ <code>{server}:{port}/host-manager/html</code>.
+ </li>
+ <li>
+ Utilizing a set of minimal HTTP requests suitable for scripting.
+ You can access this mode at:
+ <code>{server}:{port}/host-manager/text</code>.
+ </li>
+ </ul>
+ <p>
+ Both ways enable you to add, remove, start, and stop virtual hosts. Changes
+ may be persisted by using the <code>persist</code> command. This document
+ focuses on the text interface. For further information about the graphical
+ interface, see
+ <a href="html-host-manager-howto.html">Host Manager App -- HTML Interface</a>.
+ </p>
+</div><h3 id="Configuring_Manager_Application_Access">Configuring Manager Application Access</h3><div class="text">
+ <p><em>The description below uses <code>$CATALINA_HOME</code> to refer the
+ base Tomcat directory. It is the directory in which you installed
+ Tomcat, for example <code>C:\tomcat8</code>, or
+ <code>/usr/share/tomcat8</code>.</em></p>
+
+ <p>
+ The Host Manager application requires a user with one of the following
+ roles:
+ </p>
+
+ <ul>
+ <li>
+ <code>admin-gui</code> - use this role for the graphical web interface.
+ </li>
+ <li>
+ <code>admin-script</code> - use this role for the scripting web interface.
+ </li>
+ </ul>
+
+ <p>
+ To enable access to the text interface of the Host Manager application,
+ either grant your Tomcat user the appropriate role, or create a new one with
+ the correct role. For example, open
+ <code>${CATALINA_BASE}/conf/tomcat-users.xml</code> and enter the following:
+ </p>
+ <div class="codeBox"><pre><code><user username="test" password="chang3m3N#w" roles="admin-script"/></code></pre></div>
+ <p>
+ No further settings is needed. When you now access
+ <code>{server}:{port}/host-manager/text/${COMMAND}</code>,you are able to
+ log in with the created credentials. For example:
+ <div class="codeBox"><pre><code>$ curl -u ${USERNAME}:${PASSWORD} http://localhost:8080/host-manager/text/list
+OK - Listed hosts
+localhost:</code></pre></div>
+ </p>
+ <p>
+ If you are using a different realm you will need to add the necessary role
+ to the appropriate user(s) using the standard user management tools for that
+ realm.
+ </p>
+</div><h3 id="List_of_Commands">List of Commands</h3><div class="text">
+ <p>The following commands are supported:</p>
+ <ul>
+ <li>list</li>
+ <li>add</li>
+ <li>remove</li>
+ <li>start</li>
+ <li>stop</li>
+ <li>persist</li>
+ </ul>
+ <p>
+ In the following subsections, the username and password is assumed to be
+ <b>test:test</b>. For your environment, use credentials created in the
+ previous sections.
+ </p>
+ <div class="subsection"><h4 id="List_command">List command</h4><div class="text">
+ <p>
+ Use the <b>list</b> command to see the available virtual hosts on your
+ Tomcat instance.
+ </p>
+ <p><i>Example command</i>:</p>
+ <code>curl -u test:test http://localhost:8080/host-manager/text/list</code>
+ <p><i>Example response</i>:</p>
+ <div class="codeBox"><pre><code>OK - Listed hosts
+localhost:</code></pre></div>
+ </div></div>
+ <div class="subsection"><h4 id="Add_command">Add command</h4><div class="text">
+ <p>
+ Use the <b>add</b> command to add a new virtual host. Parameters used
+ for the <b>add</b> command:
+ </p>
+ <ul>
+ <li>String <b>name</b>: Name of the virtual host. <b>REQUIRED</b></li>
+ <li>String <b>aliases</b>: Aliases for your virtual host.</li>
+ <li>String <b>appBase</b>: Base path for the application that will be
+ served by this virtual host. Provide relative or absolute path.</li>
+ <li>Boolean <b>manager</b>: If true, the Manager app is added to the
+ virtual host. You can access it with the <i>/manager</i> context.</li>
+ <li>Boolean <b>autoDeploy</b>: If true, Tomcat automatically redeploys
+ applications placed in the appBase directory.</li>
+ <li>Boolean <b>deployOnStartup</b>: If true, Tomcat automatically deploys
+ applications placed in the appBase directory on startup.</li>
+ <li>Boolean <b>deployXML</b>: If true, the <i>/META-INF/context.xml</i>
+ file is read and used by Tomcat.</li>
+ <li>Boolean <b>copyXML</b>: If true, Tomcat copies <i>/META-INF/context.xml</i>
+ file and uses the original copy regardless of updates to the application's
+ <i>/META-INF/context.xml</i> file.</li>
+ </ul>
+ <p><i>Example command</i>:</p>
+ <div class="codeBox"><pre><code>curl -u test:test http://localhost:8080/host-manager/text/add?name=www.awesomeserver.com&aliases=awesomeserver.com&appBase/mnt/appDir&deployOnStartup=true</code></pre></div>
+ <p><i>Example response</i>:</p>
+ <div class="codeBox"><pre><code>add: Adding host [www.awesomeserver.com]</code></pre></div>
+ </div></div>
+ <div class="subsection"><h4 id="Remove_command">Remove command</h4><div class="text">
+ <p>
+ Use the <b>remove</b> command to remove a virtual host. Parameters used
+ for the <b>remove</b> command:
+ </p>
+ <ul>
+ <li>String <b>name</b>: Name of the virtual host to be removed.
+ <b>REQUIRED</b></li>
+ </ul>
+ <p><i>Example command</i>:</p>
+ <div class="codeBox"><pre><code>curl -u test:test http://localhost:8080/host-manager/text/remove?name=www.awesomeserver.com</code></pre></div>
+ <p><i>Example response</i>:</p>
+ <div class="codeBox"><pre><code>remove: Removing host [www.awesomeserver.com]</code></pre></div>
+ </div></div>
+ <div class="subsection"><h4 id="Start_command">Start command</h4><div class="text">
+ <p>
+ Use the <b>start</b> command to start a virtual host. Parameters used
+ for the <b>start</b> command:
+ </p>
+ <ul>
+ <li>String <b>name</b>: Name of the virtual host to be started.
+ <b>REQUIRED</b></li>
+ </ul>
+ <p><i>Example command</i>:</p>
+ <div class="codeBox"><pre><code>curl -u test:test http://localhost:8080/host-manager/text/start?name=www.awesomeserver.com</code></pre></div>
+ <p><i>Example response</i>:</p>
+ <div class="codeBox"><pre><code>OK - Host www.awesomeserver.com started</code></pre></div>
+ </div></div>
+ <div class="subsection"><h4 id="Stop_command">Stop command</h4><div class="text">
+ <p>
+ Use the <b>stop</b> command to stop a virtual host. Parameters used
+ for the <b>stop</b> command:
+ </p>
+ <ul>
+ <li>String <b>name</b>: Name of the virtual host to be stopped.
+ <b>REQUIRED</b></li>
+ </ul>
+ <p><i>Example command</i>:</p>
+ <div class="codeBox"><pre><code>curl -u test:test http://localhost:8080/host-manager/text/stop?name=www.awesomeserver.com</code></pre></div>
+ <p><i>Example response</i>:</p>
+ <div class="codeBox"><pre><code>OK - Host www.awesomeserver.com stopped</code></pre></div>
+ </div></div>
+ <div class="subsection"><h4 id="Persist_command">Persist command</h4><div class="text">
+ <p>
+ Use the <b>persist</b> command to persist a virtual host into
+ <b>server.xml</b>. Parameters used for the <b>persist</b> command:
+ </p>
+ <ul>
+ <li>String <b>name</b>: Name of the virtual host to be persist.
+ <b>REQUIRED</b></li>
+ </ul>
+ <p>
+ This functionality is disabled by default. To enable this option, you must
+ configure the <code>StoreConfigLifecycleListener</code> listener first.
+ To do so, add the following listener to your <i>server.xml</i>:
+ </p>
+ <div class="codeBox"><pre><code><Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/></code></pre></div>
+ <p><i>Example command</i>:</p>
+ <div class="codeBox"><pre><code>curl -u test:test http://localhost:8080/host-manager/text/persist?name=www.awesomeserver.com</code></pre></div>
+ <p><i>Example response</i>:</p>
+ <div class="codeBox"><pre><code>OK - Configuration persisted</code></pre></div>
+ <p><i>Example manual entry</i>:</p>
+ <div class="codeBox"><pre><code><Host appBase="www.awesomeserver.com" name="www.awesomeserver.com" deployXML="false" unpackWARs="false">
+</Host></code></pre></div>
+ </div></div>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/html-host-manager-howto.html b/web/tomcat/webapps/docs/html-host-manager-howto.html
new file mode 100644
index 0000000..8c17ab5
--- /dev/null
+++ b/web/tomcat/webapps/docs/html-host-manager-howto.html
@@ -0,0 +1,169 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Host Manager App -- HTML Interface</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Host Manager App -- HTML Interface</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+ <ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Configuring_Manager_Application_Access">Configuring Manager Application Access</a></li><li><a href="#Interface_Description">Interface Description</a></li><li><a href="#Message">Message</a></li><li><a href="#Host_Manager">Host Manager</a></li><li><a href="#Host_Name">Host Name</a></li><li><a href="#Add_Virtual_Host">Add Virtual Host</a></li><li><a href="#Persist_Configuration">Persist Configuration</a></li><li><a href="#Server_Information">Server Information</a></li></ul>
+ </div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>
+ The <strong>Tomcat Host Manager</strong> application enables you to create,
+ delete, and otherwise manage virtual hosts within Tomcat. This how-to guide
+ is best accompanied by the following pieces of documentation:
+ </p>
+ <ul>
+ <li>
+ <a href="virtual-hosting-howto.html">Virtual Hosting How-To</a> for more
+ information about virtual hosting.
+ </li>
+ <li>
+ <a href="config/host.html">The Host Container</a> for more information
+ about the underlying xml configuration of virtual hosts and description
+ of attributes.
+ </li>
+ <li>
+ <a href="host-manager-howto.html">Host Manager App -- Text Interface</a>
+ for full description of the commands.
+ </li>
+ </ul>
+
+ <p>
+ The <strong>Tomcat Host Manager</strong> application is a part of
+ Tomcat installation, by default available using the following
+ context: <code>/host-manager</code>. You can use the host manager in the
+ following ways:
+ </p>
+
+ <ul>
+ <li>
+ Utilizing the graphical user interface, accessible at:
+ <code>{server}:{port}/host-manager/html</code>.
+ </li>
+ <li>
+ Utilizing a set of minimal HTTP requests suitable for scripting.
+ You can access this mode at:
+ <code>{server}:{port}/host-manager/text</code>.
+ </li>
+ </ul>
+ <p>
+ Both ways enable you to add, remove, start, and stop virtual hosts.
+ Changes may be persisted by using the <code>persist</code> command. This
+ document focuses on the HTML interface. For further information about the
+ graphical interface, see
+ <a href="host-manager-howto.html">Host Manager App -- Text Interface</a>.
+ </p>
+ </div><h3 id="Configuring_Manager_Application_Access">Configuring Manager Application Access</h3><div class="text">
+ <p><em>The description below uses <code>$CATALINA_HOME</code> to refer the
+ base Tomcat directory. It is the directory in which you installed
+ Tomcat, for example <code>C:\tomcat8</code>, or
+ <code>/usr/share/tomcat8</code>.</em></p>
+
+ <p>
+ The Host Manager application requires a user with one of the following
+ roles:
+ </p>
+
+ <ul>
+ <li>
+ <code>admin-gui</code> - use this role for the graphical web interface.
+ </li>
+ <li>
+ <code>admin-script</code> - use this role for the scripting web interface.
+ </li>
+ </ul>
+
+ <p>
+ To enable access to the HTML interface of the Host Manager application,
+ either grant your Tomcat user the appropriate role, or create a new one with
+ the correct role. For example, open
+ <code>${CATALINA_BASE}/conf/tomcat-users.xml</code> and enter the following:
+ </p>
+ <div class="codeBox"><pre><code><user username="test" password="chang3m3N#w" roles="admin-gui"/></code></pre></div>
+ <p>
+ No further settings is needed. When you now access
+ <code>{server}:{port}/host-manager/html</code>,you are able to
+ log in with the created credentials.
+ </p>
+ <p>
+ If you are using a different realm you will need to add the necessary role
+ to the appropriate user(s) using the standard user management tools for
+ that realm.
+ </p>
+ </div><h3 id="Interface_Description">Interface Description</h3><div class="text">
+ <p>The interface is divided into six sections:</p>
+ <ul>
+ <li><strong>Message</strong> - Displays success and failure messages.</li>
+ <li><strong>Host Manager</strong> - Provides basic Host Manager operations
+ , like list and help.</li>
+ <li><strong>Host name</strong> - Provides a list of virtual Host Names and
+ enables you to operate them. </li>
+ <li><strong>Add Virtual Host</strong> - Enables you to add a new Virtual
+ Host.</li>
+ <li><strong>Persist configuration</strong> - Enables you to persist your
+ current Virtual Hosts.</li>
+ <li><strong>Server Information</strong> - Information about the Tomcat
+ server.</li>
+ </ul>
+ </div><h3 id="Message">Message</h3><div class="text">
+
+ <p>
+ Displays information about the success or failure of the last Host Manager
+ command you performed:
+ </p>
+ <ul>
+ <li>Success: <strong>OK</strong> is displayed
+ and may be followed by a success message.</li>
+ <li>Failure: <strong>FAIL</strong>
+ is displayed followed by an error message.</li>
+ </ul>
+ <p>
+ Note that the console of your Tomcat server may reveal more information
+ about each command.
+ </p>
+ </div><h3 id="Host_Manager">Host Manager</h3><div class="text">
+
+ <p>The Host Manager section enables you to:</p>
+ <ul>
+ <li><strong>List Virtual Hosts</strong> - Refresh a list of
+ currently-configured virtual hosts.</li>
+ <li><strong>HTML Host Manager Help</strong> - A documentation link.</li>
+ <li><strong>Host Manager Help</strong> - A documentation link.</li>
+ <li><strong>Server Status</strong> - A link to the <strong>Manager</strong>
+ application. Note that you user must have sufficient permissions to access
+ the application.</li>
+ </ul>
+ </div><h3 id="Host_Name">Host Name</h3><div class="text">
+
+ <p>The Host name section contains a list of currently-configured virtual host
+ names. It enables you to:</p>
+ <ul>
+ <li>View the host names</li>
+ <li>View the host name aliases</li>
+ <li>Perform basic commands, that is <strong>start</strong>,
+ <strong>stop</strong>, and <strong>remove</strong>.</li>
+ </ul>
+ </div><h3 id="Add_Virtual_Host">Add Virtual Host</h3><div class="text">
+
+ <p>The Add Virtual Host section enables you to add a virtual host using a
+ graphical interface. For a description of each property, see the
+ <a href="host-manager-howto.html">Host Manager App -- Text Interface</a>
+ documentation. Note that any configuration added via this interface is
+ non-persistent.</p>
+ </div><h3 id="Persist_Configuration">Persist Configuration</h3><div class="text">
+
+ <p>The Persist Configuration section enables you to persist your current
+ configuration into the <i>server.xml</i> file.</p>
+
+ <p> This functionality is disabled by default. To enable this option, you must
+ configure the <code>StoreConfigLifecycleListener</code> listener first.
+ To do so, add the following listener to your <i>server.xml</i>:</p>
+ <div class="codeBox"><pre><code><Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/></code></pre></div>
+
+ <p>After you configure the listener, click <strong>All</strong> to make your
+ configuration persistent.</p>
+ </div><h3 id="Server_Information">Server Information</h3><div class="text">
+ <p>
+ Provides a basic information about the currently-running Tomcat instance,
+ the JVM, and the underlying operating system.
+ </p>
+ </div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/html-manager-howto.html b/web/tomcat/webapps/docs/html-manager-howto.html
new file mode 100644
index 0000000..8af554a
--- /dev/null
+++ b/web/tomcat/webapps/docs/html-manager-howto.html
@@ -0,0 +1,495 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Tomcat Web Application Manager How To</title><meta name="author" content="Glenn L. Nielsen"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Tomcat Web Application Manager How To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Message">Message</a></li><li><a href="#Manager">Manager</a></li><li><a href="#Applications">Applications</a><ol><li><a href="#Start">Start</a></li><li><a href="#Stop">Stop</a></li><li><a href="#Reload">Reload</a></li><li><a href="#Undeploy">Undeploy</a></li></ol></li><li><a href="#Deploy">Deploy</a><ol><li><a href="#Deploy_directory_or_WAR_file_located_on_server">Deploy directory or WAR file located on server</a><ol><li><a href="#Deploy_a_Directory_or_WAR_by_URL">Deploy a Directory or WAR by URL</a></li><li><a href="#Deploy_a_Directory_or_War_from_the_Host_appBase">Deploy a Directory or War from the Host appBase</a></li><li><a href="#Deploy_using_a_Context_configuration_%22.xml%22_file">Deploy using a Context configuration ".xml" file</a></li></ol></li><li><a href="#Upload_a_WAR_file_to_install">Upload a WAR file to install</a></li><li><a href="#Deployment_Notes">Deployment Notes</a></li><li><a href="#Deploy_Message">Deploy Message</a></li></ol></li><li><a href="#Diagnostics">Diagnostics</a><ol><li><a href="#Finding_memory_leaks">Finding memory leaks</a></li></ol></li><li><a href="#Server_Information">Server Information</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+<p>In many production environments it is very useful to have the capability
+to manage your web applications without having to shut down and restart
+Tomcat. This document is for the HTML web interface to the web application
+<a href="manager-howto.html">manager</a>.</p>
+
+<p>The interface is divided into six sections:</p>
+<ul>
+ <li><strong>Message</strong> - Displays success and failure messages.</li>
+ <li><strong>Manager</strong> - General manager operations like list and
+ help.</li>
+ <li><strong>Applications</strong> - List of web applications and
+ commands.</li>
+ <li><strong>Deploy</strong> - Deploying web applications.</li>
+ <li><strong>Diagnostics</strong> - Identifying potential problems.</li>
+ <li><strong>Server Information</strong> - Information about the Tomcat
+ server.</li>
+</ul>
+
+</div><h3 id="Message">Message</h3><div class="text">
+
+<p>
+Displays information about the success or failure of the last web application
+manager command you performed. If it succeeded <strong>OK</strong> is displayed
+and may be followed by a success message. If it failed <strong>FAIL</strong>
+is displayed followed by an error message. Common failure messages are
+documented below for each command. The complete list of failure messages for
+each command can be found in the <a href="manager-howto.html">manager</a> web
+application documentation.
+</p>
+
+</div><h3 id="Manager">Manager</h3><div class="text">
+
+<p>The Manager section has three links:</p>
+<ul>
+ <li><strong>List Applications</strong> - Redisplay a list of web
+ applications.</li>
+ <li><strong>HTML Manager Help</strong> - A link to this document.</li>
+ <li><strong>Manager Help</strong> - A link to the comprehensive Manager
+ App HOW TO.</li>
+</ul>
+
+</div><h3 id="Applications">Applications</h3><div class="text">
+
+<p>The Applications section lists information about all the installed web
+applications and provides links for managing them. For each web application
+the following is displayed:</p>
+<ul>
+ <li><strong>Path</strong> - The web application context path.</li>
+ <li><strong>Display Name</strong> - The display name for the web application
+ if it has one configured in its "web.xml" file.</li>
+ <li><strong>Running</strong> - Whether the web application is running and
+ available (true), or not running and unavailable (false).</li>
+ <li><strong>Sessions</strong> - The number of active sessions for remote
+ users of this web application. The number of sessions is a link which
+ when submitted displays more details about session usage by the web
+ application in the Message box.</li>
+ <li><strong>Commands</strong> - Lists all commands which can be performed on
+ the web application. Only those commands which can be performed will be
+ listed as a link which can be submitted. No commands can be performed on
+ the manager web application itself. The following commands can be
+ performed:
+ <ul>
+ <li><strong>Start</strong> - Start a web application which had been
+ stopped.</li>
+ <li><strong>Stop</strong> - Stop a web application which is currently
+ running and make it unavailable.</li>
+ <li><strong>Reload</strong> - Reload the web application so that new
+ ".jar" files in <code>/WEB-INF/lib/</code> or new classes in
+ <code>/WEB-INF/classes/</code> can be used.</li>
+ <li><strong>Undeploy</strong> - Stop and then remove this web
+ application from the server.</li>
+ </ul>
+ </li>
+</ul>
+
+<div class="subsection"><h4 id="Start">Start</h4><div class="text">
+
+<p>Signal a stopped application to restart, and make itself available again.
+Stopping and starting is useful, for example, if the database required by
+your application becomes temporarily unavailable. It is usually better to
+stop the web application that relies on this database rather than letting
+users continuously encounter database exceptions.</p>
+
+<p>If this command succeeds, you will see a Message like this:</p>
+<div class="codeBox"><pre><code>OK - Started application at context path /examples</code></pre></div>
+
+<p>Otherwise, the Message will start with <code>FAIL</code> and include an
+error message. Possible causes for problems include:</p>
+<ul>
+<li><em>Encountered exception</em>
+ <p>An exception was encountered trying to start the web application.
+ Check the Tomcat logs for the details.</p>
+ </li>
+<li><em>Invalid context path was specified</em>
+ <p>The context path must start with a slash character, unless you are
+ referencing the ROOT web application -- in which case the context path
+ must be a zero-length string.</p>
+ </li>
+<li><em>No context exists for path /foo</em>
+ <p>There is no deployed application on the context path
+ that you specified.</p>
+ </li>
+<li><em>No context path was specified</em>
+ <p>
+ The <code>path</code> parameter is required.
+ </p>
+</li>
+</ul>
+
+</div></div>
+
+<div class="subsection"><h4 id="Stop">Stop</h4><div class="text">
+
+<p>Signal an existing application to make itself unavailable, but leave it
+deployed. Any request that comes in while an application is
+stopped will see an HTTP error 404, and this application will show as
+"stopped" on a list applications command.</p>
+
+<p>If this command succeeds, you will see a Message like this:</p>
+<div class="codeBox"><pre><code>OK - Stopped application at context path /examples</code></pre></div>
+
+<p>Otherwise, the Message will start with <code>FAIL</code> and include an
+error message. Possible causes for problems include:</p>
+<ul>
+<li><em>Encountered exception</em>
+ <p>An exception was encountered trying to stop the web application.
+ Check the Tomcat logs for the details.</p>
+ </li>
+<li><em>Invalid context path was specified</em>
+ <p>The context path must start with a slash character, unless you are
+ referencing the ROOT web application -- in which case the context path
+ must be a zero-length string.</p>
+ </li>
+<li><em>No context exists for path /foo</em>
+ <p>There is no deployed application on the context path
+ that you specified.</p>
+ </li>
+<li><em>No context path was specified</em>
+ <p>
+ The <code>path</code> parameter is required.
+ </p>
+</li>
+</ul>
+
+</div></div>
+
+<div class="subsection"><h4 id="Reload">Reload</h4><div class="text">
+
+<p>Signal an existing application to shut itself down and reload. This can
+be useful when the web application context is not reloadable and you have
+updated classes or property files in the <code>/WEB-INF/classes</code>
+directory or when you have added or updated jar files in the
+<code>/WEB-INF/lib</code> directory.
+</p>
+<p><strong>NOTE:</strong> The <code>/WEB-INF/web.xml</code>
+web application configuration file is not checked on a reload;
+the previous web.xml configuration is used.
+If you have made changes to your web.xml file you must stop
+then start the web application.
+</p>
+
+<p>If this command succeeds, you will see a Message like this:</p>
+<div class="codeBox"><pre><code>
+OK - Reloaded application at context path /examples
+</code></pre></div>
+
+<p>Otherwise, the Message will start with <code>FAIL</code> and include an
+error message. Possible causes for problems include:</p>
+<ul>
+<li><em>Encountered exception</em>
+ <p>An exception was encountered trying to restart the web application.
+ Check the Tomcat logs for the details.</p>
+ </li>
+<li><em>Invalid context path was specified</em>
+ <p>The context path must start with a slash character, unless you are
+ referencing the ROOT web application -- in which case the context path
+ must be a zero-length string.</p>
+ </li>
+<li><em>No context exists for path /foo</em>
+ <p>There is no deployed application on the context path
+ that you specified.</p>
+ </li>
+<li><em>No context path was specified</em>
+ <p>The <code>path</code> parameter is required.</p>
+ </li>
+<li><em>Reload not supported on WAR deployed at path /foo</em>
+ <p>Currently, application reloading (to pick up changes to the classes or
+ <code>web.xml</code> file) is not supported when a web application is
+ installed directly from a WAR file, which happens when the host is
+ configured to not unpack WAR files. As it only works when the web
+ application is installed from an unpacked directory, if you are using
+ a WAR file, you should <code>undeploy</code> and then <code>deploy</code>
+ the application again to pick up your changes.</p>
+ </li>
+</ul>
+
+</div></div>
+
+<div class="subsection"><h4 id="Undeploy">Undeploy</h4><div class="text">
+
+<p><strong><span style="color: red;">WARNING</span> - This command will delete the
+contents of the web application directory and/or ".war" file if it exists within
+the <code>appBase</code> directory (typically "webapps") for this virtual host
+</strong>. The web application temporary work directory is also deleted. If
+you simply want to take an application out of service, you should use the
+<code>/stop</code> command instead.</p>
+
+<p>Signal an existing application to gracefully shut itself down, and then
+remove it from Tomcat (which also makes this context path available for
+reuse later). This command is the logical opposite of the
+<code>/deploy</code> Ant command, and the related deploy features available
+in the HTML manager.</p>
+
+<p>If this command succeeds, you will see a Message like this:</p>
+<div class="codeBox"><pre><code>OK - Undeployed application at context path /examples</code></pre></div>
+
+<p>Otherwise, the Message will start with <code>FAIL</code> and include an
+error message. Possible causes for problems include:</p>
+<ul>
+<li><em>Encountered exception</em>
+ <p>An exception was encountered trying to undeploy the web application.
+ Check the Tomcat logs for the details.</p>
+ </li>
+<li><em>Invalid context path was specified</em>
+ <p>The context path must start with a slash character, unless you are
+ referencing the ROOT web application -- in which case the context path
+ must be a zero-length string.</p>
+ </li>
+<li><em>No context exists for path /foo</em>
+ <p>There is no deployed application on the context path
+ that you specified.</p>
+ </li>
+<li><em>No context path was specified</em>
+ The <code>path</code> parameter is required.
+ </li>
+</ul>
+
+</div></div>
+
+</div><h3 id="Deploy">Deploy</h3><div class="text">
+
+<p>Web applications can be deployed using files or directories located
+on the Tomcat server or you can upload a web application archive (WAR)
+file to the server.</p>
+
+<p>To install an application, fill in the appropriate fields for the type
+of install you want to do and then submit it using the <i>Install</i>
+button.</p>
+
+<div class="subsection"><h4 id="Deploy_directory_or_WAR_file_located_on_server">Deploy directory or WAR file located on server</h4><div class="text">
+
+<p>Deploy and start a new web application, attached to the specified <i>Context
+Path:</i> (which must not be in use by any other web application).
+This command is the logical opposite of the <em>Undeploy</em> command.</p>
+
+<p>There are a number of different ways the deploy command can be used.</p>
+
+<div class="subsection"><h4 id="Deploy_a_Directory_or_WAR_by_URL">Deploy a Directory or WAR by URL</h4><div class="text">
+
+<p>Install a web application directory or ".war" file located on the Tomcat
+server. If no <i>Context Path</i> is specified, the directory name or the
+war file name without the ".war" extension is used as the path. The
+<i>WAR or Directory URL</i> specifies a URL (including the <code>file:</code>
+scheme) for either a directory or a web application archive (WAR) file. The
+supported syntax for a URL referring to a WAR file is described on the Javadocs
+page for the <code>java.net.JarURLConnection</code> class. Use only URLs that
+refer to the entire WAR file.</p>
+
+<p>In this example the web application located in the directory
+<code>C:\path\to\foo</code> on the Tomcat server (running on Windows)
+is deployed as the web application context named <code>/footoo</code>.</p>
+<div class="codeBox"><pre><code>Context Path: /footoo
+WAR or Directory URL: file:C:/path/to/foo
+</code></pre></div>
+
+
+<p>In this example the ".war" file <code>/path/to/bar.war</code> on the
+Tomcat server (running on Unix) is deployed as the web application
+context named <code>/bar</code>. Notice that there is no <code>path</code>
+parameter so the context path defaults to the name of the web application
+archive file without the ".war" extension.</p>
+<div class="codeBox"><pre><code>WAR or Directory URL: jar:file:/path/to/bar.war!/</code></pre></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="Deploy_a_Directory_or_War_from_the_Host_appBase">Deploy a Directory or War from the Host appBase</h4><div class="text">
+
+<p>Install a web application directory or ".war" file located in your Host
+appBase directory. If no <i>Context Path</i> is specified the directory name
+or the war file name without the ".war" extension is used as the path.</p>
+
+<p>In this example the web application located in a subdirectory named
+<code>foo</code> in the Host appBase directory of the Tomcat server is
+deployed as the web application context named <code>/foo</code>. Notice
+that there is no <code>path</code> parameter so the context path defaults
+to the name of the web application directory.</p>
+<div class="codeBox"><pre><code>WAR or Directory URL: foo</code></pre></div>
+
+
+<p>In this example the ".war" file <code>bar.war</code> located in your
+Host appBase directory on the Tomcat server is deployed as the web
+application context named <code>/bartoo</code>.</p>
+<div class="codeBox"><pre><code>Context Path: /bartoo
+WAR or Directory URL: bar.war</code></pre></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="Deploy_using_a_Context_configuration_".xml"_file">Deploy using a Context configuration ".xml" file</h4><div class="text">
+
+<p>If the Host deployXML flag is set to true, you can install a web
+application using a Context configuration ".xml" file and an optional
+".war" file or web application directory. The <i>Context Path</i>
+is not used when installing a web application using a context ".xml"
+configuration file.</p>
+
+<p>A Context configuration ".xml" file can contain valid XML for a
+web application Context just as if it were configured in your
+Tomcat <code>server.xml</code> configuration file. Here is an
+example for Tomcat running on Windows:</p>
+<div class="codeBox"><pre><code><Context path="/foobar" docBase="C:\path\to\application\foobar">
+</Context></code></pre></div>
+
+
+<p>Use of the <i>WAR or Directory URL</i> is optional. When used
+to select a web application ".war" file or directory it overrides any
+docBase configured in the context configuration ".xml" file.</p>
+
+<p>Here is an example of installing an application using a Context
+configuration ".xml" file for Tomcat running on Windows.</p>
+<div class="codeBox"><pre><code>XML Configuration file URL: file:C:/path/to/context.xml</code></pre></div>
+
+
+<p>Here is an example of installing an application using a Context
+configuration ".xml" file and a web application ".war" file located
+on the server (Tomcat running on Unix).</p>
+<div class="codeBox"><pre><code>XML Configuration file URL: file:/path/to/context.xml
+WAR or Directory URL: jar:file:/path/to/bar.war!/</code></pre></div>
+
+</div></div>
+</div></div>
+
+<div class="subsection"><h4 id="Upload_a_WAR_file_to_install">Upload a WAR file to install</h4><div class="text">
+
+<p>Upload a WAR file from your local system and install it into the
+appBase for your Host. The name of the WAR file without the ".war"
+extension is used as the context path name.</p>
+
+<p>Use the <i>Browse</i> button to select a WAR file to upload to the
+server from your local desktop system.</p>
+
+<p>The .WAR file may include Tomcat specific deployment configuration, by
+including a Context configuration XML file in
+<code>/META-INF/context.xml</code>.</p>
+
+<p>Upload of a WAR file could fail for the following reasons:</p>
+<ul>
+<li><em>File uploaded must be a .war</em>
+ <p>The upload install will only accept files which have the filename
+ extension of ".war".</p>
+ </li>
+<li><em>War file already exists on server</em>
+ <p>If a war file of the same name already exists in your Host's
+ appBase the upload will fail. Either undeploy the existing war file
+ from your Host's appBase or upload the new war file using a different
+ name.</p>
+ </li>
+<li><em>File upload failed, no file</em>
+ <p>The file upload failed, no file was received by the server.</p>
+ </li>
+<li><em>Install Upload Failed, Exception:</em>
+ <p>The war file upload or install failed with a Java Exception.
+ The exception message will be listed.</p>
+ </li>
+</ul>
+
+</div></div>
+
+<div class="subsection"><h4 id="Deployment_Notes">Deployment Notes</h4><div class="text">
+
+<p>If the Host is configured with unpackWARs=true and you install a war
+file, the war will be unpacked into a directory in your Host appBase
+directory.</p>
+
+<p>If the application war or directory is deployed in your Host appBase
+directory and either the Host is configured with autoDeploy=true the Context
+path must match the directory name or war file name without the ".war"
+extension.</p>
+
+<p>For security when untrusted users can manage web applications, the
+Host deployXML flag can be set to false. This prevents untrusted users
+from installing web applications using a configuration XML file and
+also prevents them from installing application directories or ".war"
+files located outside of their Host appBase.</p>
+
+</div></div>
+
+<div class="subsection"><h4 id="Deploy_Message">Deploy Message</h4><div class="text">
+
+<p>If deployment and startup is successful, you will receive a Message
+like this:</p>
+<div class="codeBox"><pre><code>OK - Deployed application at context path /foo</code></pre></div>
+
+<p>Otherwise, the Message will start with <code>FAIL</code> and include an
+error message. Possible causes for problems include:</p>
+<ul>
+<li><em>Application already exists at path /foo</em>
+ <p>The context paths for all currently running web applications must be
+ unique. Therefore, you must either undeploy the existing web
+ application using this context path, or choose a different context path
+ for the new one.</p>
+ </li>
+<li><em>Document base does not exist or is not a readable directory</em>
+ <p>The URL specified by the <i>WAR or Directory URL:</i> field must
+ identify a directory on this server that contains the "unpacked" version
+ of a web application, or the absolute URL of a web application archive
+ (WAR) file that contains this application. Correct the value entered for
+ the <i>WAR or Directory URL:</i> field.</p>
+ </li>
+<li><em>Encountered exception</em>
+ <p>An exception was encountered trying to start the new web application.
+ Check the Tomcat logs for the details, but likely explanations include
+ problems parsing your <code>/WEB-INF/web.xml</code> file, or missing
+ classes encountered when initializing application event listeners and
+ filters.</p>
+ </li>
+<li><em>Invalid application URL was specified</em>
+ <p>The URL for the <i>WAR or Directory URL:</i> field that you specified
+ was not valid. Such URLs must start with <code>file:</code>, and URLs
+ for a WAR file must end in ".war".</p>
+ </li>
+<li><em>Invalid context path was specified</em>
+ <p>The context path must start with a slash character, unless you are
+ referencing the ROOT web application -- in which case the context path
+ must be a "/" string.</p>
+ </li>
+<li><em>Context path must match the directory or WAR file name:</em>
+ <p>If the application war or directory is deployed in your Host appBase
+ directory and either the Host is configured with autoDeploy=true the Context
+ path must match the directory name or war file name without the ".war"
+ extension.</p>
+ </li>
+<li><em>Only web applications in the Host web application directory can
+ be deployed</em>
+ <p>
+ If the Host deployXML flag is set to false this error will happen
+ if an attempt is made to install a web application directory or
+ ".war" file outside of the Host appBase directory.
+ </p></li>
+</ul>
+
+</div></div>
+</div><h3 id="Diagnostics">Diagnostics</h3><div class="text">
+
+<div class="subsection"><h4 id="Finding_memory_leaks">Finding memory leaks</h4><div class="text">
+
+<p><strong>The find leaks diagnostic triggers a full garbage collection. It
+should be used with extreme caution on production systems.</strong></p>
+
+<p>The find leaks diagnostic attempts to identify web applications that have
+caused memory leaks when they were stopped, reloaded or undeployed. Results
+should always be confirmed
+with a profiler. The diagnostic uses additional functionality provided by the
+StandardHost implementation. It will not work if a custom host is used that
+does not extend StandardHost.</p>
+
+<p>This diagnostic will list context paths for the web applications that were
+stopped, reloaded or undeployed, but which classes from the previous runs
+are still present in memory, thus being a memory leak. If an application
+has been reloaded several times, it may be listed several times.</p>
+
+<p>Explicitly triggering a full garbage collection from Java code is documented
+to be unreliable. Furthermore, depending on the JVM used, there are options to
+disable explicit GC triggering, like <code>-XX:+DisableExplicitGC</code>.
+If you want to make sure, that the diagnostics were successfully running a full GC,
+you will need to check using tools like GC logging, JConsole or similar.</p>
+
+</div></div>
+</div><h3 id="Server_Information">Server Information</h3><div class="text">
+
+<p>This section displays information about Tomcat, the operating system of the
+server Tomcat is hosted on, the Java Virtual Machine Tomcat is running in, the
+primary host name of the server (may not be the host name used to access Tomcat)
+and the primary IP address of the server (may not be the IP address used to
+access Tomcat).</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/images/add.gif b/web/tomcat/webapps/docs/images/add.gif
new file mode 100644
index 0000000..0774d07
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/add.gif
Binary files differ
diff --git a/web/tomcat/webapps/docs/images/asf-logo.svg b/web/tomcat/webapps/docs/images/asf-logo.svg
new file mode 100644
index 0000000..e24cbe5
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/asf-logo.svg
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 7127.6 2890" enable-background="new 0 0 7127.6 2890" xml:space="preserve">
+<path fill="#6D6E71" d="M7104.7,847.8c15.3,15.3,22.9,33.7,22.9,55.2c0,21.5-7.6,39.9-22.9,55.4c-15.3,15.4-33.8,23.1-55.6,23.1
+ c-21.8,0-40.2-7.6-55.4-22.9c-15.1-15.3-22.7-33.7-22.7-55.2c0-21.5,7.6-39.9,22.9-55.4c15.3-15.4,33.7-23.1,55.4-23.1
+ C7070.9,824.9,7089.4,832.5,7104.7,847.8z M7098.1,951.9c13.3-13.6,20-29.8,20-48.7s-6.6-35-19.8-48.5
+ c-13.2-13.4-29.4-20.1-48.6-20.1c-19.2,0-35.4,6.7-48.7,20.2c-13.3,13.5-19.9,29.7-19.9,48.7c0,19,6.6,35.2,19.7,48.6
+ c13.1,13.4,29.3,20.1,48.5,20.1S7084.7,965.4,7098.1,951.9z M7087.1,888.1c0,14-6.1,22.8-18.4,26.4l22.5,30.5h-18.2l-20.3-28.3
+ h-18.6v28.3h-14.7v-84.6h31.8c12.8,0,22,2.2,27.6,6.6C7084.4,871.4,7087.1,878.4,7087.1,888.1z M7068.2,900c3-2.4,4.4-6.5,4.4-12
+ c0-5.5-1.5-9.4-4.5-11.6c-3-2.2-8.4-3.2-16-3.2h-18v30.5h17.5C7059.7,903.6,7065.3,902.4,7068.2,900z"/>
+<path fill="#6D6E71" d="M1803.6,499.8v155.4h-20V499.8h-56.8v-19.2h133.9v19.2H1803.6z"/>
+<path fill="#6D6E71" d="M2082.2,655.2v-76.9h-105.2v76.9h-20V480.5h20v78.9h105.2v-78.9h20v174.7H2082.2z"/>
+<path fill="#6D6E71" d="M2241.4,499.8v57.4h88.1v19.2h-88.1v59.8h101.8v19h-121.8V480.5H2340v19.2H2241.4z"/>
+<path fill="#D22128" d="M1574.5,1852.4l417.3-997.6h80.1l417.3,997.6h-105.4l-129.3-311.9h-448.2l-127.9,311.9H1574.5z M2032.6,970
+ l-205.1,493.2h404.7L2032.6,970z"/>
+<path fill="#D22128" d="M2596.9,1852.4V854.8H3010c171.4,0,295.1,158.8,295.1,313.3c0,163-115.2,316.1-286.6,316.1h-324.6v368.1
+ H2596.9z M2693.9,1397.1h318.9c118,0,193.9-108.2,193.9-229c0-125.1-92.7-226.2-202.3-226.2h-310.5V1397.1z"/>
+<path fill="#D22128" d="M3250.5,1852.4l417.3-997.6h80.1l417.3,997.6h-105.4l-129.3-311.9h-448.2l-127.9,311.9H3250.5z M3708.6,970
+ l-205.1,493.2h404.7L3708.6,970z"/>
+<path fill="#D22128" d="M4637.3,849.1c177,0,306.3,89.9,368.1,217.8l-78.7,47.8c-63.2-132.1-186.9-177-295.1-177
+ c-238.9,0-369.5,213.6-369.5,414.5c0,220.6,161.6,420.1,373.7,420.1c112.4,0,244.5-56.2,307.7-185.5l81.5,42.1
+ c-64.6,148.9-241.7,231.8-394.8,231.8c-274,0-466.5-261.3-466.5-514.2C4163.8,1106.3,4336.6,849.1,4637.3,849.1z"/>
+<path fill="#D22128" d="M5949.1,854.8v997.6h-98.4v-466.5h-591.5v466.5h-96.9V854.8h96.9v444h591.5v-444H5949.1z"/>
+<path fill="#D22128" d="M6844.6,1765.2v87.1h-670.2V854.8H6832v87.1h-560.6v359.7h489v82.9h-489v380.8H6844.6z"/>
+<path fill="#6D6E71" d="M1667.6,2063.6c11.8,3.5,22.2,8.3,31,14.2l-10.3,22.6c-9-6-18.6-10.4-28.9-13.4c-10.2-2.9-20-4.4-29.2-4.4
+ c-13.6,0-24.5,2.4-32.6,7.3c-8.1,4.9-12.2,11.8-12.2,20.7c0,7.6,2.3,14,6.8,19c4.5,5,10.2,8.9,17,11.7c6.8,2.8,16.1,6,28,9.6
+ c14.4,4.6,26,8.9,34.7,12.9c8.8,4,16.3,9.9,22.5,17.8c6.2,7.8,9.3,18.2,9.3,31c0,11.7-3.2,21.8-9.5,30.6
+ c-6.3,8.7-15.3,15.5-26.8,20.3c-11.6,4.8-24.9,7.2-40,7.2c-15.1,0-29.7-2.9-43.9-8.7c-14.2-5.8-26.4-13.6-36.6-23.4l10.7-21.6
+ c9.6,9.4,20.7,16.7,33.3,21.9c12.6,5.2,24.8,7.8,36.8,7.8c15.3,0,27.3-3,36.1-8.9c8.8-5.9,13.2-13.9,13.2-23.9
+ c0-7.8-2.3-14.3-6.9-19.4c-4.6-5.1-10.3-9-17.1-11.9c-6.8-2.8-16.1-6-28-9.6c-14.2-4.2-25.7-8.3-34.6-12.2
+ c-8.9-3.9-16.4-9.7-22.5-17.5c-6.1-7.7-9.2-17.9-9.2-30.6c0-10.9,3-20.4,9-28.6c6-8.2,14.6-14.6,25.6-19.1
+ c11.1-4.5,23.8-6.8,38.2-6.8C1643.8,2058.3,1655.7,2060.1,1667.6,2063.6z"/>
+<path fill="#6D6E71" d="M1980.1,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6
+ c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6
+ c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14
+ C1944.8,2058.6,1963.2,2063.3,1980.1,2072.8z M1881.9,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7
+ c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1
+ c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30
+ c-13-7.4-27.2-11.2-42.6-11.2C1909.4,2081.5,1895.1,2085.2,1881.9,2092.7z"/>
+<path fill="#6D6E71" d="M2186.5,2082.4v74h98.4v23.2h-98.4v90.2h-24.1v-210.6h133.8v23.2H2186.5z"/>
+<path fill="#6D6E71" d="M2491.6,2082.4v187.4h-24.1v-187.4h-68.4v-23.2h161.4v23.2H2491.6z"/>
+<path fill="#6D6E71" d="M2871.8,2269.8l-56.8-177.4l-57.6,177.4h-24.5l-70.5-210.6h25.9l57.9,182.7l57.1-182.4l24.1-0.3l57.7,182.7
+ l57.1-182.7h25l-70.6,210.6H2871.8z"/>
+<path fill="#6D6E71" d="M3087.3,2216.6l-23.5,53.2h-25.6l94.4-210.6h25l94.1,210.6h-26.1l-23.5-53.2H3087.3z M3144.5,2086.6
+ l-46.9,106.8h94.4L3144.5,2086.6z"/>
+<path fill="#6D6E71" d="M3461.1,2202.7c-6,0.4-10.7,0.6-14.1,0.6h-56v66.5H3367v-210.6h80c26.2,0,46.6,6.2,61.2,18.5
+ c14.5,12.3,21.8,29.8,21.8,52.3c0,17.2-4.1,31.7-12.2,43.3c-8.1,11.6-19.8,20-35,25l49.2,71.5h-27.3L3461.1,2202.7z M3491.3,2167.6
+ c10.3-8.4,15.5-20.8,15.5-37c0-15.9-5.2-27.9-15.5-36c-10.3-8.1-25.1-12.2-44.3-12.2h-56v97.8h56
+ C3466.2,2180.2,3481,2176,3491.3,2167.6z"/>
+<path fill="#6D6E71" d="M3688.3,2082.4v69.2h106.2v23.2h-106.2v72.1h122.8v22.9h-146.9v-210.6h142.9v23.2H3688.3z"/>
+<path fill="#6D6E71" d="M4147,2082.4v74h98.4v23.2H4147v90.2h-24.1v-210.6h133.8v23.2H4147z"/>
+<path fill="#6D6E71" d="M4523.3,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6
+ c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6
+ c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14
+ C4488.1,2058.6,4506.5,2063.3,4523.3,2072.8z M4425.2,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7
+ c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1
+ c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30
+ c-13-7.4-27.2-11.2-42.6-11.2C4452.6,2081.5,4438.3,2085.2,4425.2,2092.7z"/>
+<path fill="#6D6E71" d="M4854.7,2247.7c-15.7,15.5-37.3,23.3-64.8,23.3c-27.7,0-49.4-7.8-65.1-23.3c-15.7-15.5-23.6-37-23.6-64.6
+ v-124h24.1v124c0,20.3,5.8,36.1,17.3,47.5c11.6,11.4,27.3,17.1,47.3,17.1c20.1,0,35.8-5.7,47.1-17c11.4-11.3,17-27.2,17-47.7v-124
+ h24.1v124C4878.2,2210.7,4870.4,2232.2,4854.7,2247.7z"/>
+<path fill="#6D6E71" d="M5169.5,2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3,169.3v-169.3h23.8v210.6H5169.5z"/>
+<path fill="#6D6E71" d="M5478.4,2073.1c16.4,9.3,29.4,21.9,38.9,37.9c9.6,16,14.3,33.9,14.3,53.5s-4.8,37.6-14.3,53.6
+ c-9.5,16.1-22.6,28.7-39.3,37.9c-16.6,9.2-35.2,13.8-55.5,13.8h-84.3v-210.6h85.2C5443.7,2059.2,5462,2063.8,5478.4,2073.1z
+ M5362.3,2246.9h61.4c15.5,0,29.6-3.5,42.3-10.6c12.7-7.1,22.8-16.9,30.2-29.5c7.4-12.5,11.1-26.5,11.1-42
+ c0-15.5-3.8-29.4-11.3-41.9c-7.5-12.5-17.7-22.3-30.6-29.6c-12.8-7.2-27-10.9-42.6-10.9h-60.5V2246.9z"/>
+<path fill="#6D6E71" d="M5668.6,2216.6l-23.5,53.2h-25.6l94.4-210.6h25l94.1,210.6H5807l-23.5-53.2H5668.6z M5725.8,2086.6
+ l-46.9,106.8h94.4L5725.8,2086.6z"/>
+<path fill="#6D6E71" d="M5991,2082.4v187.4H5967v-187.4h-68.4v-23.2h161.4v23.2H5991z"/>
+<path fill="#6D6E71" d="M6175.9,2269.8v-210.6h24.1v210.6H6175.9z"/>
+<path fill="#6D6E71" d="M6493.7,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6
+ c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6
+ c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14
+ C6458.5,2058.6,6476.9,2063.3,6493.7,2072.8z M6395.6,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7
+ c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1
+ c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30
+ c-13-7.4-27.2-11.2-42.6-11.2C6423,2081.5,6408.8,2085.2,6395.6,2092.7z"/>
+<path fill="#6D6E71" d="M6826.5,2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3,169.3v-169.3h23.8v210.6H6826.5z"/>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-4516.6152" y1="-2338.7222" x2="-4108.4111" y2="-1861.3982" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0" style="stop-color:#F69923"/>
+ <stop offset="0.3123" style="stop-color:#F79A23"/>
+ <stop offset="0.8383" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_1_)" d="M1230.1,13.7c-45.3,26.8-120.6,102.5-210.5,212.3l82.6,155.9c58-82.9,116.9-157.5,176.3-221.2
+ c4.6-5.1,7-7.5,7-7.5c-2.3,2.5-4.6,5-7,7.5c-19.2,21.2-77.5,89.2-165.5,224.4c84.7-4.2,214.9-21.6,321.1-39.7
+ c31.6-177-31-258-31-258S1323.4-41.4,1230.1,13.7z"/>
+<path fill="none" d="M1090.2,903.1c0.6-0.1,1.2-0.2,1.8-0.3l-11.9,1.3c-0.7,0.3-1.4,0.7-2.1,1
+ C1082.1,904.4,1086.2,903.7,1090.2,903.1z"/>
+<path fill="none" d="M1005.9,1182.3c-6.7,1.5-13.7,2.7-20.7,3.7C992.3,1185,999.2,1183.8,1005.9,1182.3z"/>
+<path fill="none" d="M432.9,1808.8c0.9-2.3,1.8-4.7,2.6-7c18.2-48,36.2-94.7,54-140.1c20-51,39.8-100.4,59.3-148.3
+ c20.6-50.4,40.9-99.2,60.9-146.3c21-49.4,41.7-97,62-142.8c16.5-37.3,32.8-73.4,48.9-108.3c5.4-11.7,10.7-23.2,16-34.6
+ c10.5-22.7,21-44.8,31.3-66.5c9.5-20,19-39.6,28.3-58.8c3.1-6.4,6.2-12.8,9.3-19.1c0.5-1,1-2,1.5-3.1l-10.2,1.1l-8-15.9
+ c-0.8,1.6-1.6,3.1-2.4,4.6c-14.5,28.8-28.9,57.9-43.1,87.2c-8.2,16.9-16.4,34-24.6,51c-22.6,47.4-44.8,95.2-66.6,143.3
+ c-22.1,48.6-43.7,97.5-64.9,146.5c-20.8,48.1-41.3,96.2-61.2,144.2c-20,48-39.5,95.7-58.5,143.2c-19.9,49.5-39.2,98.7-58,147.2
+ c-4.2,10.9-8.5,21.9-12.7,32.8c-15,39.2-29.7,77.8-44,116l12.7,25.1l11.4-1.2c0.4-1.1,0.8-2.3,1.3-3.4
+ C396.7,1905.4,414.9,1856.4,432.9,1808.8z"/>
+<path fill="none" d="M980,1186.8L980,1186.8c0.1,0,0.1,0,0.1-0.1C980.1,1186.8,980.1,1186.8,980,1186.8z"/>
+<path fill="#BE202E" d="M952.6,1323c-10.6,1.9-21.4,3.8-32.5,5.7c-0.1,0-0.1,0.1-0.2,0.1c5.6-0.8,11.2-1.7,16.6-2.6
+ C942,1325.2,947.3,1324.1,952.6,1323z"/>
+<path opacity="0.35" fill="#BE202E" d="M952.6,1323c-10.6,1.9-21.4,3.8-32.5,5.7c-0.1,0-0.1,0.1-0.2,0.1c5.6-0.8,11.2-1.7,16.6-2.6
+ C942,1325.2,947.3,1324.1,952.6,1323z"/>
+<path fill="#BE202E" d="M980.3,1186.7C980.2,1186.7,980.2,1186.7,980.3,1186.7c-0.1,0.1-0.2,0.1-0.2,0.1c1.8-0.2,3.5-0.5,5.2-0.8
+ c7-1,13.9-2.2,20.7-3.7C997.5,1183.8,989,1185.2,980.3,1186.7L980.3,1186.7L980.3,1186.7z"/>
+<path opacity="0.35" fill="#BE202E" d="M980.3,1186.7C980.2,1186.7,980.2,1186.7,980.3,1186.7c-0.1,0.1-0.2,0.1-0.2,0.1
+ c1.8-0.2,3.5-0.5,5.2-0.8c7-1,13.9-2.2,20.7-3.7C997.5,1183.8,989,1185.2,980.3,1186.7L980.3,1186.7L980.3,1186.7z"/>
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-7537.7339" y1="-2391.4075" x2="-4625.4141" y2="-2391.4075" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_2_)" d="M858.6,784.7c25.1-46.9,50.5-92.8,76.2-137.4c26.7-46.4,53.7-91.3,80.9-134.7
+ c1.6-2.6,3.2-5.2,4.8-7.7c27-42.7,54.2-83.7,81.6-122.9L1019.5,226c-6.2,7.6-12.5,15.3-18.8,23.2c-23.8,29.7-48.6,61.6-73.9,95.5
+ c-28.6,38.2-58,78.9-87.8,121.7c-27.6,39.5-55.5,80.9-83.5,123.7c-23.8,36.5-47.7,74-71.4,112.5c-0.9,1.4-1.8,2.9-2.6,4.3
+ l107.5,212.3C811.8,873.6,835.1,828.7,858.6,784.7z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-7186.1777" y1="-2099.3059" x2="-5450.7183" y2="-2099.3059" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0" style="stop-color:#282662"/>
+ <stop offset="9.548390e-02" style="stop-color:#662E8D"/>
+ <stop offset="0.7882" style="stop-color:#9F2064"/>
+ <stop offset="0.9487" style="stop-color:#CD2032"/>
+</linearGradient>
+<path fill="url(#SVGID_3_)" d="M369,1981c-14.2,39.1-28.5,78.9-42.9,119.6c-0.2,0.6-0.4,1.2-0.6,1.8c-2,5.7-4.1,11.5-6.1,17.2
+ c-9.7,27.4-18,52.1-37.3,108.2c31.7,14.5,57.1,52.5,81.1,95.6c-2.6-44.7-21-86.6-56.2-119.1c156.1,7,290.6-32.4,360.1-146.6
+ c6.2-10.2,11.9-20.9,17-32.2c-31.6,40.1-70.8,57.1-144.5,53c-0.2,0.1-0.3,0.1-0.5,0.2c0.2-0.1,0.3-0.1,0.5-0.2
+ c108.6-48.6,163.1-95.3,211.2-172.6c11.4-18.3,22.5-38.4,33.8-60.6c-94.9,97.5-205,125.3-320.9,104.2l-86.9,9.5
+ C374.4,1966.3,371.7,1973.6,369,1981z"/>
+<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2418.5454" x2="-4461.8428" y2="-2418.5454" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_4_)" d="M409.6,1786.3c18.8-48.5,38.1-97.7,58-147.2c19-47.4,38.5-95.2,58.5-143.2
+ c20-48,40.4-96.1,61.2-144.2c21.2-49,42.9-97.8,64.9-146.5c21.8-48.1,44-95.9,66.6-143.3c8.1-17.1,16.3-34.1,24.6-51
+ c14.2-29.3,28.6-58.4,43.1-87.2c0.8-1.6,1.6-3.1,2.4-4.6L681.4,706.8c-1.8,2.9-3.5,5.8-5.3,8.6c-25.1,40.9-50,82.7-74.4,125.4
+ c-24.7,43.1-49,87.1-72.7,131.7c-20,37.6-39.6,75.6-58.6,113.9c-3.8,7.8-7.6,15.5-11.3,23.2c-23.4,48.2-44.6,94.8-63.7,139.5
+ c-21.7,50.7-40.7,99.2-57.5,145.1c-11,30.2-21,59.4-30.1,87.4c-7.5,24-14.7,47.9-21.5,71.8c-16,56.3-29.9,112.4-41.2,168.3
+ L353,1935.1c14.3-38.1,28.9-76.8,44-116C401.1,1808.2,405.4,1797.3,409.6,1786.3z"/>
+<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-7161.7642" y1="-2379.1431" x2="-5631.2524" y2="-2379.1431" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0" style="stop-color:#282662"/>
+ <stop offset="9.548390e-02" style="stop-color:#662E8D"/>
+ <stop offset="0.7882" style="stop-color:#9F2064"/>
+ <stop offset="0.9487" style="stop-color:#CD2032"/>
+</linearGradient>
+<path fill="url(#SVGID_5_)" d="M243.5,1729.4c-13.6,68.2-23.2,136.2-28,203.8c-0.2,2.4-0.4,4.7-0.5,7.1
+ c-33.7-54-124-106.8-123.8-106.2c64.6,93.7,113.7,186.7,120.9,278c-34.6,7.1-82-3.2-136.8-23.3c57.1,52.5,100,67,116.7,70.9
+ c-52.5,3.3-107.1,39.3-162.1,80.8c80.5-32.8,145.5-45.8,192.1-35.3C148.1,2414.2,74.1,2645,0,2890c22.7-6.7,36.2-21.9,43.9-42.6
+ c13.2-44.4,100.8-335.6,238-718.2c3.9-10.9,7.8-21.8,11.8-32.9c1.1-3,2.2-6.1,3.3-9.2c14.5-40.1,29.5-81.1,45.1-122.9
+ c3.5-9.5,7.1-19,10.7-28.6c0.1-0.2,0.1-0.4,0.2-0.6l-107.9-213.2C244.6,1724.4,244,1726.9,243.5,1729.4z"/>
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2117.1309" x2="-4461.8428" y2="-2117.1309" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_6_)" d="M805.6,937c-3.1,6.3-6.2,12.7-9.3,19.1c-9.3,19.2-18.8,38.8-28.3,58.8
+ c-10.3,21.7-20.7,43.9-31.3,66.5c-5.3,11.4-10.6,22.9-16,34.6c-16.1,35-32.4,71.1-48.9,108.3c-20.3,45.8-41,93.4-62,142.8
+ c-20,47.1-40.3,95.9-60.9,146.3c-19.5,47.9-39.3,97.3-59.3,148.3c-17.8,45.4-35.9,92.1-54,140.1c-0.9,2.3-1.8,4.7-2.6,7
+ c-18,47.6-36.2,96.6-54.6,146.8c-0.4,1.1-0.8,2.3-1.3,3.4l86.9-9.5c-1.7-0.3-3.5-0.5-5.2-0.9c103.9-13,242.1-90.6,331.4-186.5
+ c41.1-44.2,78.5-96.3,113-157.3c25.7-45.4,49.8-95.8,72.8-151.5c20.1-48.7,39.4-101.4,58-158.6c-23.9,12.6-51.2,21.8-81.4,28.2
+ c-5.3,1.1-10.7,2.2-16.1,3.1c-5.5,1-11,1.8-16.6,2.6l0,0l0,0c0.1,0,0.1-0.1,0.2-0.1c96.9-37.3,158-109.2,202.4-197.4
+ c-25.5,17.4-66.9,40.1-116.6,51.1c-6.7,1.5-13.7,2.7-20.7,3.7c-1.7,0.3-3.5,0.6-5.2,0.8l0,0l0,0c0.1,0,0.1,0,0.1-0.1
+ c0,0,0.1,0,0.1,0l0,0c33.6-14.1,62-29.8,86.6-48.4c5.3-4,10.4-8.1,15.3-12.3c7.5-6.5,14.7-13.3,21.5-20.5c4.4-4.6,8.6-9.3,12.7-14.2
+ c9.6-11.5,18.7-23.9,27.1-37.3c2.6-4.1,5.1-8.3,7.6-12.6c3.2-6.2,6.3-12.3,9.3-18.3c13.5-27.2,24.4-51.5,33-72.8
+ c4.3-10.6,8.1-20.5,11.3-29.7c1.3-3.7,2.5-7.2,3.7-10.6c3.4-10.2,6.2-19.3,8.4-27.3c3.3-12,5.3-21.5,6.4-28.4l0,0l0,0
+ c-3.3,2.6-7.1,5.2-11.3,7.7c-29.3,17.5-79.5,33.4-119.9,40.8l79.8-8.8l-79.8,8.8c-0.6,0.1-1.2,0.2-1.8,0.3c-4,0.7-8.1,1.3-12.2,2
+ c0.7-0.3,1.4-0.7,2.1-1l-273,29.9C806.6,935,806.1,936,805.6,937z"/>
+<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-7554.8232" y1="-2132.0981" x2="-4642.5034" y2="-2132.0981" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_7_)" d="M1112.9,385.1c-24.3,37.3-50.8,79.6-79.4,127.5c-1.5,2.5-3,5.1-4.5,7.6
+ c-24.6,41.5-50.8,87.1-78.3,137c-23.8,43.1-48.5,89.3-74.3,139c-22.4,43.3-45.6,89.2-69.4,137.8l273-29.9
+ c79.5-36.6,115.1-69.7,149.6-117.6c9.2-13.2,18.4-27,27.5-41.3c28-43.8,55.6-92,80.1-139.9c23.7-46.3,44.7-92.2,60.7-133.5
+ c10.2-26.3,18.4-50.8,24.1-72.3c5-19,8.9-36.9,11.9-54.1C1327.9,363.5,1197.6,380.9,1112.9,385.1z"/>
+<path fill="#BE202E" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/>
+<path opacity="0.35" fill="#BE202E" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/>
+<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2027.484" x2="-4461.8433" y2="-2027.484" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_8_)" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/>
+<path fill="#BE202E" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/>
+<path opacity="0.35" fill="#BE202E" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/>
+<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2037.7417" x2="-4461.8433" y2="-2037.7417" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_9_)" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/>
+<path fill="#BE202E" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7L980.2,1186.7
+ C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/>
+<path opacity="0.35" fill="#BE202E" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7
+ L980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/>
+<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-5738.0635" y1="-2039.799" x2="-5094.3457" y2="-2039.799" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_10_)" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7L980.2,1186.7
+ C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/>
+</svg>
diff --git a/web/tomcat/webapps/docs/images/code.gif b/web/tomcat/webapps/docs/images/code.gif
new file mode 100644
index 0000000..d27307b
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/code.gif
Binary files differ
diff --git a/web/tomcat/webapps/docs/images/cors-flowchart.png b/web/tomcat/webapps/docs/images/cors-flowchart.png
new file mode 100644
index 0000000..9abb09d
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/cors-flowchart.png
Binary files differ
diff --git a/web/tomcat/webapps/docs/images/design.gif b/web/tomcat/webapps/docs/images/design.gif
new file mode 100644
index 0000000..f5db0a9
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/design.gif
Binary files differ
diff --git a/web/tomcat/webapps/docs/images/docs-stylesheet.css b/web/tomcat/webapps/docs/images/docs-stylesheet.css
new file mode 100644
index 0000000..768e2ed
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/docs-stylesheet.css
@@ -0,0 +1,303 @@
+@charset "utf-8";
+/*
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/* Fonts */
+@import url("fonts/fonts.css");
+
+/* General style */
+
+h1, h2, h3, h4, h5, h6, th {
+ font-weight: 600;
+}
+
+body {
+ margin: 0;
+}
+
+body, input {
+ font-family: 'Open Sans', sans-serif;
+ font-size: 10.5pt;
+}
+
+code, pre {
+ font-family: Consolas, monospace;
+}
+
+img {
+ border: 0;
+}
+
+table {
+ border-collapse: collapse;
+ text-align: left;
+}
+table *:not(table) {
+ /* Prevent border-collapsing for table child elements like <div> */
+ border-collapse: separate;
+}
+
+th {
+ text-align: left;
+}
+
+main {
+ /* Remove this once all IEs support <main> element */
+ display: block;
+}
+
+
+/* Layout */
+
+#wrapper {
+ min-width: 400px;
+}
+
+#header {
+ border-bottom: 1px solid #bbb;
+}
+
+@media not print {
+ #header {
+ box-shadow: 0 0 7px #aaa;
+ }
+}
+
+#header > div {
+ padding-left: 15px;
+ padding-right: 15px;
+
+ /* Work-around for old browsers: */
+ background-color: #F8F3E4;
+ background: linear-gradient(to bottom, #ffffff -10%, #F8F3E4 100%);
+ position: relative;
+}
+
+#header .logo {
+ float: left;
+ padding-top: 10px;
+ min-width: 190px;
+}
+
+#header .logo img{
+ /* To avoid that the Font Descender being added to the parent div's height */
+ vertical-align: middle;
+}
+
+#header .asfLogo {
+ float: right;
+ position: relative;
+ top: 8px;
+}
+
+#header h1 {
+ margin-top: 0.6em;
+ margin-bottom: 0;
+}
+
+#header .versionInfo {
+ font-size: 13pt;
+ margin-bottom: 1em;
+}
+
+#middle {
+ display: table;
+ table-layout: fixed;
+ margin: 0;
+ width: 100%;
+}
+#middle > div { display: table-row; }
+#middle > div > div { display: table-cell; vertical-align: top; }
+
+
+
+#mainLeft {
+ width: 190px;
+}
+
+#mainLeft > div {
+ margin-top: -1px; /* to overwrite border of element above */
+ padding-left: 16px;
+ padding-right: 14px;
+ padding-top: 6px;
+ padding-bottom: 15px;
+ background-color: #F8F3E4;
+ border-right: 1px solid #bbb;
+ border-bottom: 1px solid #bbb;
+ font-size: 10pt;
+ border-bottom-right-radius: 20px;
+ box-shadow: 0 0 5px #aaa;
+}
+
+#mainLeft h2 {
+ margin-bottom: 0.2em;
+ font-size: 1.2em;
+}
+
+#mainLeft ul {
+ padding: 0;
+ margin: 0;
+ list-style-type: none;
+}
+
+#mainLeft ul a {
+ text-indent: -0.6em;
+ padding-left: 1.4em;
+ display: block;
+ text-decoration: none;
+ color: #444;
+}
+#mainLeft ul a:hover {
+ color: #000;
+ background-color: #D1c9b9;
+}
+
+#mainRight {
+ padding-left: 14px;
+ padding-right: 20px;
+
+}
+
+#footer {
+ margin-top: 30px;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ padding-left: 20px;
+ padding-right: 20px;
+ border-top: 1px solid #ccc;
+ color: #444;
+ text-align: center;
+ /* font-style: italic; */
+ font-size: 9pt;
+}
+
+
+/* Content */
+
+#content div.text {
+ padding-left: 1em;
+ padding-left: 1em;
+}
+
+#content h3, #content h4, #content h5, #content h6 {
+ padding-left: 5px;
+ padding-right: 5px;
+ background-color: #eaeaea;
+}
+
+@media not print {
+ #content h3, #content h4, #content h5, #content h6 {
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ }
+}
+
+#content h4, #content h5, #content h6 {
+ background-color: #f6f6f6;
+}
+
+code {
+ background-color: rgb(224,255,255);
+}
+
+div.codeBox pre code, code.attributeName, code.propertyName, code.noHighlight, .noHighlight code {
+ background-color: transparent;
+}
+div.codeBox {
+ overflow: auto;
+ margin: 1em 0;
+}
+div.codeBox pre {
+ margin: 0;
+ padding: 4px;
+ border: 1px solid #999;
+ border-radius: 5px;
+ background-color: #eff8ff;
+ display: table; /* To prevent <pre>s from taking the complete available width. */
+ /*
+ When it is officially supported, use the following CSS instead of display: table
+ to prevent big <pre>s from exceeding the browser window:
+ max-width: available;
+ width: min-content;
+ */
+}
+
+div.codeBox pre.wrap {
+ white-space: pre-wrap;
+}
+
+
+table.defaultTable tr, table.detail-table tr {
+ border: 1px solid #CCC;
+}
+
+table.defaultTable tr:nth-child(even), table.detail-table tr:nth-child(even) {
+ background-color: #FAFBFF;
+}
+
+table.defaultTable tr:nth-child(odd), table.detail-table tr:nth-child(odd) {
+ background-color: #EEEFFF;
+}
+
+table.defaultTable th, table.detail-table th {
+ background-color: #88b;
+ color: #fff;
+}
+
+table.defaultTable th, table.defaultTable td, table.detail-table th, table.detail-table td {
+ padding: 5px 8px;
+}
+
+
+p.notice {
+ border: 1px solid rgb(255, 0, 0);
+ background-color: rgb(238, 238, 238);
+ color: rgb(0, 51, 102);
+ padding: 0.5em;
+ margin: 1em 2em 1em 1em;
+}
+
+
+/* Changelog-Styles */
+
+ul.changelog {
+ padding-left: 1em;
+ list-style-type: none;
+}
+
+ul.changelog li{
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+
+ul.changelog img {
+ vertical-align: middle
+}
+
+
+/* Printer-only Styles */
+@media print {
+ .noPrint { display: none; }
+ #middle > div > div#mainLeft { display: none; }
+ a { color: inherit; text-decoration: none; }
+}
+
+/* Fix for Comments section which contains a <h4> */
+#comments_thread h1, #comments_thread h2, #comments_thread h3, #comments_thread h4, #comments_thread h5, #comments_thread h6 {
+ border: none;
+ background-color: transparent;
+}
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/images/docs.gif b/web/tomcat/webapps/docs/images/docs.gif
new file mode 100644
index 0000000..d64a4a1
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/docs.gif
Binary files differ
diff --git a/web/tomcat/webapps/docs/images/fix.gif b/web/tomcat/webapps/docs/images/fix.gif
new file mode 100644
index 0000000..d59ad64
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/fix.gif
Binary files differ
diff --git a/web/tomcat/webapps/docs/images/fonts/OpenSans400.woff b/web/tomcat/webapps/docs/images/fonts/OpenSans400.woff
new file mode 100644
index 0000000..55b25f8
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/fonts/OpenSans400.woff
Binary files differ
diff --git a/web/tomcat/webapps/docs/images/fonts/OpenSans400italic.woff b/web/tomcat/webapps/docs/images/fonts/OpenSans400italic.woff
new file mode 100644
index 0000000..cedefb8
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/fonts/OpenSans400italic.woff
Binary files differ
diff --git a/web/tomcat/webapps/docs/images/fonts/OpenSans600.woff b/web/tomcat/webapps/docs/images/fonts/OpenSans600.woff
new file mode 100644
index 0000000..e83bb33
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/fonts/OpenSans600.woff
Binary files differ
diff --git a/web/tomcat/webapps/docs/images/fonts/OpenSans600italic.woff b/web/tomcat/webapps/docs/images/fonts/OpenSans600italic.woff
new file mode 100644
index 0000000..983bb33
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/fonts/OpenSans600italic.woff
Binary files differ
diff --git a/web/tomcat/webapps/docs/images/fonts/OpenSans700.woff b/web/tomcat/webapps/docs/images/fonts/OpenSans700.woff
new file mode 100644
index 0000000..27619e7
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/fonts/OpenSans700.woff
Binary files differ
diff --git a/web/tomcat/webapps/docs/images/fonts/OpenSans700italic.woff b/web/tomcat/webapps/docs/images/fonts/OpenSans700italic.woff
new file mode 100644
index 0000000..e12c3a9
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/fonts/OpenSans700italic.woff
Binary files differ
diff --git a/web/tomcat/webapps/docs/images/fonts/fonts.css b/web/tomcat/webapps/docs/images/fonts/fonts.css
new file mode 100644
index 0000000..fa306fc
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/fonts/fonts.css
@@ -0,0 +1,54 @@
+@charset "utf-8";
+/*
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+@font-face {
+ font-family: 'Open Sans';
+ font-style: normal;
+ font-weight: 400;
+ src: local('Open Sans'), local('OpenSans'), url('OpenSans400.woff') format('woff');
+}
+@font-face {
+ font-family: 'Open Sans';
+ font-style: italic;
+ font-weight: 400;
+ src: local('Open Sans Italic'), local('OpenSans-Italic'), url('OpenSans400italic.woff') format('woff');
+}
+@font-face {
+ font-family: 'Open Sans';
+ font-style: normal;
+ font-weight: 600;
+ src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url('OpenSans600.woff') format('woff');
+}
+@font-face {
+ font-family: 'Open Sans';
+ font-style: italic;
+ font-weight: 600;
+ src: local('Open Sans Semibold Italic'), local('OpenSans-SemiboldItalic'), url('OpenSans600italic.woff') format('woff');
+}
+@font-face {
+ font-family: 'Open Sans';
+ font-style: normal;
+ font-weight: 700;
+ src: local('Open Sans Bold'), local('OpenSans-Bold'), url('OpenSans700.woff') format('woff');
+}
+@font-face {
+ font-family: 'Open Sans';
+ font-style: italic;
+ font-weight: 700;
+ src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'), url('OpenSans700italic.woff') format('woff');
+}
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/images/tomcat.gif b/web/tomcat/webapps/docs/images/tomcat.gif
new file mode 100644
index 0000000..f2aa6f8
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/tomcat.gif
Binary files differ
diff --git a/web/tomcat/webapps/docs/images/tomcat.png b/web/tomcat/webapps/docs/images/tomcat.png
new file mode 100644
index 0000000..209b07f
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/tomcat.png
Binary files differ
diff --git a/web/tomcat/webapps/docs/images/update.gif b/web/tomcat/webapps/docs/images/update.gif
new file mode 100644
index 0000000..31e22ab
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/update.gif
Binary files differ
diff --git a/web/tomcat/webapps/docs/images/void.gif b/web/tomcat/webapps/docs/images/void.gif
new file mode 100644
index 0000000..e565824
--- /dev/null
+++ b/web/tomcat/webapps/docs/images/void.gif
Binary files differ
diff --git a/web/tomcat/webapps/docs/index.html b/web/tomcat/webapps/docs/index.html
new file mode 100644
index 0000000..a6a2519
--- /dev/null
+++ b/web/tomcat/webapps/docs/index.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Documentation Index</title><meta name="author" content="Craig R. McClanahan"><meta name="author" content="Remy Maucherat"><meta name="author" content="Yoav Shapira"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Documentation Index</h2><h3 id="Introduction">Introduction</h3><div class="text">
+
+<p>This is the top-level entry point of the documentation bundle for the
+<strong>Apache Tomcat</strong> Servlet/JSP container. Apache Tomcat version
+8.5 implements the Servlet 3.1 and JavaServer Pages 2.3
+<a href="https://wiki.apache.org/tomcat/Specifications">specifications</a> from the
+<a href="https://www.jcp.org">Java Community Process</a>, and includes many
+additional features that make it a useful platform for developing and deploying
+web applications and web services.</p>
+
+<p>Select one of the links from the navigation menu (to the left) to drill
+down to the more detailed documentation that is available. Each available
+manual is described in more detail below.</p>
+
+</div><h3 id="Apache_Tomcat_User_Guide">Apache Tomcat User Guide</h3><div class="text">
+
+<p>The following documents will assist you in downloading and installing
+Apache Tomcat, and using many of the Apache Tomcat features.</p>
+
+<ol>
+<li><a href="introduction.html"><strong>Introduction</strong></a> - A
+ brief, high level, overview of Apache Tomcat.</li>
+<li><a href="setup.html"><strong>Setup</strong></a> - How to install and run
+ Apache Tomcat on a variety of platforms.</li>
+<li><a href="appdev/index.html"><strong>First web application</strong></a>
+ - An introduction to the concepts of a <em>web application</em> as defined
+ in the Servlet Specification. Covers basic organization of your web application
+ source tree, the structure of a web application archive, and an
+ introduction to the web application deployment descriptor
+ (<code>/WEB-INF/web.xml</code>).</li>
+<li><a href="deployer-howto.html"><strong>Deployer</strong></a> -
+ Operating the Apache Tomcat Deployer to deploy, precompile, and validate web
+ applications.</li>
+<li><a href="manager-howto.html"><strong>Manager</strong></a> -
+ Operating the <strong>Manager</strong> web app to deploy, undeploy, and
+ redeploy applications while Apache Tomcat is running.</li>
+<li><a href="host-manager-howto.html"><strong>Host Manager</strong></a> -
+ Operating the <strong>Host Manager</strong> web app to add and remove
+ virtual hosts while Apache Tomcat is running.</li>
+<li><a href="realm-howto.html"><strong>Realms and Access Control</strong></a>
+ - Description of how to configure <em>Realms</em> (databases of users,
+ passwords, and their associated roles) for use in web applications that
+ utilize <em>Container Managed Security</em>.</li>
+<li><a href="security-manager-howto.html"><strong>Security Manager</strong></a>
+ - Configuring and using a Java Security Manager to
+ support fine-grained control over the behavior of your web applications.
+ </li>
+<li><a href="jndi-resources-howto.html"><strong>JNDI Resources</strong></a>
+ - Configuring standard and custom resources in the JNDI naming context
+ that is provided to each web application.</li>
+<li><a href="jndi-datasource-examples-howto.html">
+ <strong>JDBC DataSource</strong></a>
+ - Configuring a JNDI DataSource with a DB connection pool.
+ Examples for many popular databases.</li>
+<li><a href="class-loader-howto.html"><strong>Classloading</strong></a>
+ - Information about class loading in Apache Tomcat, including where to place
+ your application classes so that they are visible.</li>
+<li><a href="jasper-howto.html"><strong>JSPs</strong></a>
+ - Information about Jasper configuration, as well as the JSP compiler
+ usage.</li>
+<li><a href="ssl-howto.html"><strong>SSL/TLS</strong></a> -
+ Installing and configuring SSL/TLS support so that your Apache Tomcat will
+ serve requests using the <code>https</code> protocol.</li>
+<li><a href="ssi-howto.html"><strong>SSI</strong></a> -
+ Using Server Side Includes in Apache Tomcat.</li>
+<li><a href="cgi-howto.html"><strong>CGI</strong></a> -
+ Using CGIs with Apache Tomcat.</li>
+<li><a href="proxy-howto.html"><strong>Proxy Support</strong></a> -
+ Configuring Apache Tomcat to run behind a proxy server (or a web server
+ functioning as a proxy server).</li>
+<li><a href="mbeans-descriptors-howto.html"><strong>MBeans Descriptors</strong></a> -
+ Configuring MBean descriptors files for custom components.</li>
+<li><a href="default-servlet.html"><strong>Default Servlet</strong></a> -
+ Configuring the default servlet and customizing directory listings.</li>
+<li><a href="cluster-howto.html"><strong>Apache Tomcat Clustering</strong></a> -
+ Enable session replication in a Apache Tomcat environment.</li>
+<li><a href="balancer-howto.html"><strong>Balancer</strong></a> -
+ Configuring, using, and extending the load balancer application.</li>
+<li><a href="connectors.html"><strong>Connectors</strong></a> -
+ Connectors available in Apache Tomcat, and native web server integration.</li>
+<li><a href="monitoring.html"><strong>Monitoring and Management</strong></a> -
+ Enabling JMX Remote support, and using tools to monitor and manage Apache Tomcat.</li>
+<li><a href="logging.html"><strong>Logging</strong></a> -
+ Configuring logging in Apache Tomcat.</li>
+<li><a href="apr.html"><strong>Apache Portable Runtime</strong></a> -
+ Using APR to provide superior performance, scalability and better
+ integration with native server technologies.</li>
+<li><a href="virtual-hosting-howto.html"><strong>Virtual Hosting</strong></a> -
+ Configuring virtual hosting in Apache Tomcat.</li>
+<li><a href="aio.html"><strong>Advanced IO</strong></a> -
+ Extensions available over regular, blocking IO.</li>
+<li><a href="extras.html"><strong>Additional Components</strong></a> -
+ Obtaining additional, optional components.</li>
+<li><a href="maven-jars.html"><strong>Using Tomcat libraries with Maven</strong></a> -
+ Obtaining Tomcat jars through Maven.</li>
+<li><a href="security-howto.html"><strong>Security Considerations</strong></a> -
+ Options to consider when securing an Apache Tomcat installation.</li>
+<li><a href="windows-service-howto.html"><strong>Windows Service</strong></a> -
+ Running Tomcat as a service on Microsoft Windows.</li>
+<li><a href="windows-auth-howto.html"><strong>Windows Authentication</strong></a> -
+ Configuring Tomcat to use integrated Windows authentication.</li>
+<li><a href="jdbc-pool.html"><strong>High Concurrency JDBC Pool</strong></a> -
+ Configuring Tomcat to use an alternative JDBC pool.</li>
+<li><a href="web-socket-howto.html"><strong>WebSocket support</strong></a> -
+ Developing WebSocket applications for Apache Tomcat.</li>
+<li><a href="rewrite.html"><strong>URL rewrite</strong></a> -
+ Using the regexp based rewrite valve for conditional URL and host rewrite.</li>
+
+</ol>
+
+</div><h3 id="Reference">Reference</h3><div class="text">
+
+<p>The following documents are aimed at <em>System Administrators</em> who
+are responsible for installing, configuring, and operating an Apache Tomcat server.
+</p>
+<ul>
+<li><a href="RELEASE-NOTES.txt"><strong>Release notes</strong></a>
+ - Known issues in this Apache Tomcat release.
+ </li>
+<li><a href="config/index.html"><strong>Apache Tomcat Server Configuration Reference</strong></a>
+ - Reference manual that documents all available elements and attributes
+ that may be placed into the Apache Tomcat <code>conf/server.xml</code> file.
+ </li>
+<li><a href="https://tomcat.apache.org/connectors-doc/index.html"><strong>JK Documentation</strong></a>
+ - Complete documentation and HOWTOs on the JK native webserver connector,
+ used to interface Apache Tomcat with servers like Apache HTTPd, IIS
+ and others.</li>
+<li>Servlet 3.1
+ <a href="http://jcp.org/aboutJava/communityprocess/final/jsr340/index.html">
+ <strong>Specification</strong></a> and
+ <a href="http://docs.oracle.com/javaee/7/api/javax/servlet/package-summary.html">
+ <strong>Javadoc</strong></a>
+ </li>
+<li>JSP 2.3
+ <a href="https://jcp.org/aboutJava/communityprocess/mrel/jsr245/index2.html">
+ <strong>Specification</strong></a> and
+ <a href="http://docs.oracle.com/javaee/7/api/javax/servlet/jsp/package-summary.html">
+ <strong>Javadoc</strong></a>
+ </li>
+<li>EL 3.0
+ <a href="https://jcp.org/aboutJava/communityprocess/final/jsr341/index.html">
+ <strong>Specification</strong></a> and
+ <a href="http://docs.oracle.com/javaee/7/api/javax/el/package-summary.html">
+ <strong>Javadoc</strong></a>
+ </li>
+<li>WebSocket 1.1
+ <a href="https://jcp.org/aboutJava/communityprocess/mrel/jsr356/index.html">
+ <strong>Specification</strong></a> and
+ <a href="http://docs.oracle.com/javaee/7/api/javax/websocket/package-summary.html">
+ <strong>Javadoc</strong></a>
+ </li>
+<li>JASPIC 1.1
+ <a href="https://jcp.org/aboutJava/communityprocess/mrel/jsr196/index.html">
+ <strong>Specification</strong></a> and
+ <a href="http://docs.oracle.com/javaee/7/api/javax/security/auth/message/package-summary.html">
+ <strong>Javadoc</strong></a>
+ </li>
+</ul>
+
+</div><h3 id="Apache_Tomcat_Developers">Apache Tomcat Developers</h3><div class="text">
+
+<p>The following documents are for Java developers who wish to contribute to
+the development of the <em>Apache Tomcat</em> project.</p>
+<ul>
+<li><a href="building.html"><strong>Building from Source</strong></a> -
+ Details the steps necessary to download Apache Tomcat source code (and the
+ other packages that it depends on), and build a binary distribution from
+ those sources.
+ </li>
+<li><a href="changelog.html"><strong>Changelog</strong></a> - Details the
+ changes made to Apache Tomcat.
+ </li>
+<li><a href="https://wiki.apache.org/tomcat/TomcatVersions"><strong>Status</strong></a> -
+ Apache Tomcat development status.
+ </li>
+<li><a href="developers.html"><strong>Developers</strong></a> - List of active
+ Apache Tomcat contributors.
+ </li>
+<li><a href="api/index.html"><strong>Javadocs</strong></a>
+ - Javadoc API documentation for Apache Tomcat's internals.</li>
+<li><a href="architecture/index.html"><strong>Apache Tomcat Architecture</strong></a>
+ - Documentation of the Apache Tomcat Server Architecture.</li>
+</ul>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/introduction.html b/web/tomcat/webapps/docs/introduction.html
new file mode 100644
index 0000000..166c0f3
--- /dev/null
+++ b/web/tomcat/webapps/docs/introduction.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Introduction</title><meta name="author" content="Robert Slifka"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Introduction</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Terminology">Terminology</a></li><li><a href="#Directories_and_Files">Directories and Files</a></li><li><a href="#CATALINA_HOME_and_CATALINA_BASE">CATALINA_HOME and CATALINA_BASE</a><ol><li><a href="#Why_Use_CATALINA_BASE">Why Use CATALINA_BASE</a></li><li><a href="#Contents_of_CATALINA_BASE">Contents of CATALINA_BASE</a></li><li><a href="#How_to_Use_CATALINA_BASE">How to Use CATALINA_BASE</a></li></ol></li><li><a href="#Configuring_Tomcat">Configuring Tomcat</a></li><li><a href="#Where_to_Go_for_Help">Where to Go for Help</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+<p>For administrators and web developers alike, there are some important bits
+of information you should familiarize yourself with before starting out. This
+document serves as a brief introduction to some of the concepts and
+terminology behind the Tomcat container. As well, where to go when you need
+help.</p>
+
+</div><h3 id="Terminology">Terminology</h3><div class="text">
+
+<p>In the course of reading these documents, you will run across a number of
+terms; some specific to Tomcat, and others defined by the
+<a href="https://wiki.apache.org/tomcat/Specifications">Servlet and
+JSP specifications</a>.</p>
+
+<ul>
+<li><strong>Context</strong> - In a nutshell, a Context is a
+ web application.</li>
+</ul>
+<p>That is it. If you find any more terms we need to add to this section, please
+do let us know.</p>
+
+</div><h3 id="Directories_and_Files">Directories and Files</h3><div class="text">
+
+<p>These are some of the key tomcat directories:</p>
+
+<ul>
+<li><strong>/bin</strong> - Startup, shutdown, and other scripts. The
+ <code>*.sh</code> files (for Unix systems) are functional duplicates of
+ the <code>*.bat</code> files (for Windows systems). Since the Win32
+ command-line lacks certain functionality, there are some additional
+ files in here.</li>
+<li><strong>/conf</strong> - Configuration files and related DTDs. The most
+ important file in here is server.xml. It is the main configuration file
+ for the container.</li>
+<li><strong>/logs</strong> - Log files are here by default.</li>
+<li><strong>/webapps</strong> - This is where your webapps go.</li>
+</ul>
+
+</div><h3 id="CATALINA_HOME_and_CATALINA_BASE">CATALINA_HOME and CATALINA_BASE</h3><div class="text">
+ <p>Throughout the documentation, there are references to the two following
+ properties:
+ <ul>
+ <li>
+ <strong>CATALINA_HOME</strong>: Represents the root of your Tomcat
+ installation, for example <code>/home/tomcat/apache-tomcat-9.0.10</code>
+ or <code>C:\Program Files\apache-tomcat-9.0.10</code>.
+ </li>
+ <li>
+ <strong>CATALINA_BASE</strong>: Represents the root of a runtime
+ configuration of a specific Tomcat instance. If you want to have
+ multiple Tomcat instances on one machine, use the <code>CATALINA_BASE</code>
+ property.
+ </li>
+ </ul>
+ </p>
+ <p>
+ If you set the properties to different locations, the CATALINA_HOME location
+ contains static sources, such as <code>.jar</code> files, or binary files.
+ The CATALINA_BASE location contains configuration files, log files, deployed
+ applications, and other runtime requirements.
+ </p>
+ <div class="subsection"><h4 id="Why_Use_CATALINA_BASE">Why Use CATALINA_BASE</h4><div class="text">
+ <p>
+ By default, CATALINA_HOME and CATALINA_BASE point to the same directory.
+ Set CATALINA_BASE manually when you require running multiple Tomcat
+ instances on one machine. Doing so provides the following benefits:
+ </p>
+ <ul>
+ <li>
+ Easier management of upgrading to a newer version of Tomcat. Because all
+ instances with single CATALINA_HOME location share one set of
+ <code>.jar</code> files and binary files, you can easily upgrade the files
+ to newer version and have the change propagated to all Tomcat instances
+ using the same CATALIA_HOME directory.
+ </li>
+ <li>
+ Avoiding duplication of the same static <code>.jar</code> files.
+ </li>
+ <li>
+ The possibility to share certain settings, for example the <code>setenv</code> shell
+ or bat script file (depending on your operating system).
+ </li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Contents_of_CATALINA_BASE">Contents of CATALINA_BASE</h4><div class="text">
+ <p>
+ Before you start using CATALINA_BASE, first consider and create the
+ directory tree used by CATALINA_BASE. Note that if you do not create
+ all the recommended directories, Tomcat creates the directories
+ automatically. If it fails to create the necessary directory, for example
+ due to permission issues, Tomcat will either fail to start, or may not
+ function correctly.
+ </p>
+ <p>
+ Consider the following list of directories:
+ <ul>
+ <li>
+ <p>
+ The <code>bin</code> directory with the <code>setenv.sh</code>,
+ <code>setenv.bat</code>, and <code>tomcat-juli.jar</code> files.
+ </p>
+ <p>
+ <i>Recommended:</i> No.
+ </p>
+ <p>
+ <i>Order of lookup:</i> CATALINA_BASE is checked first; fallback is provided
+ to CATALINA_HOME.
+ </p>
+ </li>
+ <li>
+ <p>
+ The <code>lib</code> directory with further resources to be added on
+ classpath.
+ </p>
+ <p>
+ <i>Recommended:</i> Yes, if your application depends on external libraries.
+ </p>
+ <p>
+ <i>Order of lookup:</i> CATALINA_BASE is checked first; CATALINA_HOME is
+ loaded second.
+ </p>
+ </li>
+ <li>
+ <p>
+ The <code>logs</code> directory for instance-specific log files.
+ </p>
+ <p>
+ <i>Recommended:</i> Yes.
+ </p>
+ </li>
+ <li>
+ <p>
+ The <code>webapps</code> directory for automatically loaded web
+ applications.
+ </p>
+ <p>
+ <i>Recommended:</i> Yes, if you want to deploy applications.
+ </p>
+ <p>
+ <i>Order of lookup:</i> CATALINA_BASE only.
+ </p>
+ </li>
+ <li>
+ <p>
+ The <code>work</code> directory that contains temporary working
+ directories for the deployed web applications.
+ </p>
+ <p>
+ <i>Recommended:</i> Yes.
+ </p>
+ </li>
+ <li>
+ <p>
+ The <code>temp</code> directory used by the JVM for temporary files.
+ </p>
+ <p>
+ <i>Recommended:</i> Yes.
+ </p>
+ </li>
+ </ul>
+ </p>
+ <p>
+ We recommend you not to change the <code>tomcat-juli.jar</code> file.
+ However, in case you require your own logging implementation, you can
+ replace the <code>tomcat-juli.jar</code> file in a CATALINA_BASE location
+ for the specific Tomcat instance.
+ </p>
+ <p>
+ We also recommend you copy all configuration files from the
+ <code>CATALINA_HOME/conf</code> directory into the
+ <code>CATALINA_BASE/conf/</code> directory. In case a configuration file
+ is missing in CATALINA_BASE, there is no fallback to CATALINA_HOME.
+ Consequently, this may cause failure.
+ </p>
+ <p>
+ At minimum, CATALINA_BASE must contain:
+ <ul>
+ <li>conf/server.xml</li>
+ <li>conf/web.xml</li>
+ </ul>
+ That includes the <code>conf</code> directory. Otherwise, Tomcat fails
+ to start, or fails to function properly.
+ </p>
+ <p>
+ For advanced configuration information, see the
+ <a href="https://tomcat.apache.org/tomcat-9.0-doc/RUNNING.txt">
+ RUNNING.txt
+ </a> file.
+ </p>
+ </div></div>
+ <div class="subsection"><h4 id="How_to_Use_CATALINA_BASE">How to Use CATALINA_BASE</h4><div class="text">
+ <p>
+ The CATALINA_BASE property is an environment variable. You can set it
+ before you execute the Tomcat start script, for example:
+ <ul>
+ <li>On Unix: <code>CATALINA_BASE=/tmp/tomcat_base1 bin/catalina.sh start</code></li>
+ <li>On Windows: <code>CATALINA_BASE=C:\tomcat_base1 bin/catalina.bat start</code></li>
+ </ul>
+ </p>
+ </div></div>
+</div><h3 id="Configuring_Tomcat">Configuring Tomcat</h3><div class="text">
+
+<p>This section will acquaint you with the basic information used during
+the configuration of the container.</p>
+
+<p>All of the information in the configuration files is read at startup,
+meaning that any change to the files necessitates a restart of the container.
+</p>
+
+</div><h3 id="Where_to_Go_for_Help">Where to Go for Help</h3><div class="text">
+
+<p>While we've done our best to ensure that these documents are clearly
+written and easy to understand, we may have missed something. Provided
+below are various web sites and mailing lists in case you get stuck.</p>
+
+<p>Keep in mind that some of the issues and solutions vary between the
+major versions of Tomcat. As you search around the web, there will be
+some documentation that is not relevant to Tomcat 8, but
+only to earlier versions.</p>
+
+<ul>
+<li>Current document - most documents will list potential hangups. Be sure
+ to fully read the relevant documentation as it will save you much time
+ and effort. There's nothing like scouring the web only to find out that
+ the answer was right in front of you all along!</li>
+<li><a href="https://wiki.apache.org/tomcat/FAQ">Tomcat FAQ</a></li>
+<li><a href="https://wiki.apache.org/tomcat/">Tomcat WIKI</a></li>
+<li>Tomcat FAQ at <a href="http://www.jguru.com/faq/home.jsp?topic=Tomcat">jGuru</a></li>
+<li>Tomcat mailing list archives - numerous sites archive the Tomcat mailing
+ lists. Since the links change over time, clicking here will search
+ <a href="https://www.google.com/search?q=tomcat+mailing+list+archives">Google</a>.
+ </li>
+<li>The TOMCAT-USER mailing list, which you can subscribe to
+ <a href="https://tomcat.apache.org/lists.html">here</a>. If you don't
+ get a reply, then there's a good chance that your question was probably
+ answered in the list archives or one of the FAQs. Although questions
+ about web application development in general are sometimes asked and
+ answered, please focus your questions on Tomcat-specific issues.</li>
+<li>The TOMCAT-DEV mailing list, which you can subscribe to
+ <a href="https://tomcat.apache.org/lists.html">here</a>. This list is
+ <strong>reserved</strong> for discussions about the development of Tomcat
+ itself. Questions about Tomcat configuration, and the problems you run
+ into while developing and running applications, will normally be more
+ appropriate on the TOMCAT-USER list instead.</li>
+</ul>
+
+<p>And, if you think something should be in the docs, by all means let us know
+on the TOMCAT-DEV list.</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/jasper-howto.html b/web/tomcat/webapps/docs/jasper-howto.html
new file mode 100644
index 0000000..d3a8608
--- /dev/null
+++ b/web/tomcat/webapps/docs/jasper-howto.html
@@ -0,0 +1,385 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Jasper 2 JSP Engine How To</title><meta name="author" content="Glenn L. Nielsen"><meta name="author" content="Peter Rossbach"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Jasper 2 JSP Engine How To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Configuration">Configuration</a></li><li><a href="#Known_issues">Known issues</a></li><li><a href="#Production_Configuration">Production Configuration</a></li><li><a href="#Web_Application_Compilation">Web Application Compilation</a></li><li><a href="#Optimisation">Optimisation</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+<p>Tomcat 8.5 uses the Jasper 2 JSP Engine to implement
+the <a href="https://wiki.apache.org/tomcat/Specifications">JavaServer Pages 2.3</a>
+specification.</p>
+
+<p>Jasper 2 has been redesigned to significantly improve performance over
+the original Jasper. In addition to general code improvements the following
+changes were made:</p>
+<ul>
+<li><strong>JSP Custom Tag Pooling</strong> - The java objects instantiated
+for JSP Custom Tags can now be pooled and reused. This significantly boosts
+the performance of JSP pages which use custom tags.</li>
+<li><strong>Background JSP compilation</strong> - If you make a change to
+a JSP page which had already been compiled Jasper 2 can recompile that
+page in the background. The previously compiled JSP page will still be
+available to serve requests. Once the new page has been compiled
+successfully it will replace the old page. This helps improve availability
+of your JSP pages on a production server.</li>
+<li><strong>Recompile JSP when included page changes</strong> - Jasper 2
+can now detect when a page included at compile time from a JSP has changed
+and then recompile the parent JSP.</li>
+<li><strong>JDT used to compile JSP pages</strong> - The
+Eclipse JDT Java compiler is now used to perform JSP java source code
+compilation. This compiler loads source dependencies from the container
+classloader. Ant and javac can still be used.</li>
+</ul>
+
+
+<p>Jasper is implemented using the servlet class
+<code>org.apache.jasper.servlet.JspServlet</code>.</p>
+
+</div><h3 id="Configuration">Configuration</h3><div class="text">
+
+<p>By default Jasper is configured for use when doing web application
+development. See the section <a href="#Production_Configuration">
+Production Configuration</a> for information on configuring Jasper
+for use on a production Tomcat server.</p>
+
+<p>The servlet which implements Jasper is configured using init parameters
+in your global <code>$CATALINA_BASE/conf/web.xml</code>.
+</p>
+<ul>
+<li><strong>checkInterval</strong> - If development is false and checkInterval
+is greater than zero, background compiles are enabled. checkInterval is the time
+in seconds between checks to see if a JSP page (and its dependent files) needs
+to be recompiled. Default <code>0</code> seconds.</li>
+
+<li><strong>classdebuginfo</strong> - Should the class file be compiled with
+debugging information? <code>true</code> or <code>false</code>, default
+<code>true</code>.
+</li>
+
+<li><strong>classpath</strong> - Defines the class path to be used to compile
+the generated servlets. This parameter only has an effect if the ServletContext
+attribute org.apache.jasper.Constants.SERVLET_CLASSPATH is not set. This
+attribute is always set when Jasper is used within Tomcat. By default the
+classpath is created dynamically based on the current web application.</li>
+
+<li><strong>compiler</strong> - Which compiler Ant should use to compile JSP
+pages. The valid values for this are the same as for the compiler attribute of
+Ant's
+<a href="https://ant.apache.org/manual/Tasks/javac.html#compilervalues">javac</a>
+task. If the value is not set, then the default Eclipse JDT Java compiler will
+be used instead of using Ant. There is no default value. If this attribute is
+set then <code>setenv.[sh|bat]</code> should be used to add
+<code>ant.jar</code>, <code>ant-launcher.jar</code> and <code>tools.jar</code>
+to the <code>CLASSPATH</code> environment variable.</li>
+
+<li><strong>compilerSourceVM</strong> - What JDK version are the source files
+compatible with? (Default value: <code>1.7</code>)</li>
+
+<li><strong>compilerTargetVM</strong> - What JDK version are the generated files
+compatible with? (Default value: <code>1.7</code>)</li>
+
+<li><strong>development</strong> - Is Jasper used in development mode? If true,
+the frequency at which JSPs are checked for modification may be specified via
+the modificationTestInterval parameter.<code>true</code> or <code>false</code>,
+default <code>true</code>.</li>
+
+<li><strong>displaySourceFragment</strong> - Should a source fragment be
+included in exception messages? <code>true</code> or <code>false</code>,
+default <code>true</code>.</li>
+
+<li><strong>dumpSmap</strong> - Should the SMAP info for JSR45 debugging be
+dumped to a file? <code>true</code> or <code>false</code>, default
+<code>false</code>. <code>false</code> if suppressSmap is true.</li>
+
+<li><strong>enablePooling</strong> - Determines whether tag handler pooling is
+enabled. This is a compilation option. It will not alter the behaviour of JSPs
+that have already been compiled. <code>true</code> or <code>false</code>,
+default <code>true</code>.
+</li>
+
+<li><strong>engineOptionsClass</strong> - Allows specifying the Options class
+used to configure Jasper. If not present, the default EmbeddedServletOptions
+will be used. This option is ignored if running under a SecurityManager.
+</li>
+
+<li><strong>errorOnUseBeanInvalidClassAttribute</strong> - Should Jasper issue
+an error when the value of the class attribute in an useBean action is not a
+valid bean class? <code>true</code> or <code>false</code>, default
+<code>true</code>.</li>
+
+<li><strong>fork</strong> - Have Ant fork JSP page compiles so they are
+performed in a separate JVM from Tomcat? <code>true</code> or
+<code>false</code>, default <code>true</code>.</li>
+
+<li><strong>genStringAsCharArray</strong> - Should text strings be generated as char
+arrays, to improve performance in some cases? Default <code>false</code>.</li>
+
+<li><strong>ieClassId</strong> - The class-id value to be sent to Internet
+Explorer when using <jsp:plugin> tags. Default
+<code>clsid:8AD9C840-044E-11D1-B3E9-00805F499D93</code>.</li>
+
+<li><strong>javaEncoding</strong> - Java file encoding to use for generating
+java source files. Default <code>UTF8</code>.</li>
+
+<li><strong>keepgenerated</strong> - Should we keep the generated Java source
+code for each page instead of deleting it? <code>true</code> or
+<code>false</code>, default <code>true</code>.</li>
+
+<li><strong>mappedfile</strong> - Should we generate static content with one
+print statement per input line, to ease debugging?
+<code>true</code> or <code>false</code>, default <code>true</code>.</li>
+
+<li><strong>maxLoadedJsps</strong> - The maximum number of JSPs that will be
+loaded for a web application. If more than this number of JSPs are loaded, the
+least recently used JSPs will be unloaded so that the number of JSPs loaded at
+any one time does not exceed this limit. A value of zero or less indicates no
+limit. Default <code>-1</code></li>
+
+<li><strong>jspIdleTimeout</strong> - The amount of time in seconds a JSP can be
+idle before it is unloaded. A value of zero or less indicates never unload.
+Default <code>-1</code></li>
+
+<li><strong>modificationTestInterval</strong> - Causes a JSP (and its dependent
+files) to not be checked for modification during the specified time interval
+(in seconds) from the last time the JSP was checked for modification. A value of
+0 will cause the JSP to be checked on every access. Used in development mode
+only. Default is <code>4</code> seconds.</li>
+
+<li><strong>recompileOnFail</strong> - If a JSP compilation fails should the
+modificationTestInterval be ignored and the next access trigger a re-compilation
+attempt? Used in development mode only and is disabled by default as compilation
+may be expensive and could lead to excessive resource usage.</li>
+
+<li><strong>scratchdir</strong> - What scratch directory should we use when
+compiling JSP pages? Default is the work directory for the current web
+application. This option is ignored if running under a SecurityManager.</li>
+
+<li><strong>suppressSmap</strong> - Should the generation of SMAP info for JSR45
+debugging be suppressed? <code>true</code> or <code>false</code>, default
+<code>false</code>.</li>
+
+<li><strong>trimSpaces</strong> - Should template text that consists entirely of
+whitespace be removed? <code>true</code> or <code>false</code>, default
+<code>false</code>.</li>
+
+<li><strong>xpoweredBy</strong> - Determines whether X-Powered-By response
+header is added by generated servlet. <code>true</code> or <code>false</code>,
+default <code>false</code>.</li>
+
+<li><strong>strictQuoteEscaping</strong> - When scriptlet expressions are used
+for attribute values, should the rules in JSP.1.6 for the escaping of quote
+characters be strictly applied? <code>true</code> or <code>false</code>, default
+<code>true</code>.</li>
+
+<li><strong>quoteAttributeEL</strong> - When EL is used in an attribute value
+on a JSP page, should the rules for quoting of attributes described in JSP.1.6
+be applied to the expression? <code>true</code> or <code>false</code>, default
+<code>true</code>.</li>
+</ul>
+
+<p>The Java compiler from Eclipse JDT in included as the default compiler. It is
+an advanced Java compiler which will load all dependencies from the Tomcat class
+loader, which will help tremendously when compiling on large installations with
+tens of JARs. On fast servers, this will allow sub-second recompilation cycles
+for even large JSP pages.</p>
+
+<p>Apache Ant, which was used in previous Tomcat releases, can be used instead
+of the new compiler by configuring the compiler attribute as explained above.
+</p>
+
+</div><h3 id="Known_issues">Known issues</h3><div class="text">
+
+<p>As described in
+<a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=39089">
+bug 39089</a>, a known JVM issue,
+<a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6294277">
+bug 6294277</a>, may cause a
+<code>java.lang.InternalError: name is too long to represent</code> exception
+when compiling very large JSPs. If this is observed then it may be worked around
+by using one of the following:
+</p>
+<ul>
+<li>reduce the size of the JSP</li>
+<li>disable SMAP generation and JSR-045 support by setting
+<code>suppressSmap</code> to <code>true</code>.</li>
+</ul>
+
+</div><h3 id="Production_Configuration">Production Configuration</h3><div class="text">
+
+<p>The main JSP optimization which can be done is precompilation of JSPs.
+However, this might not be possible (for example, when using the
+jsp-property-group feature) or practical, in which case the configuration of the
+Jasper servlet becomes critical.</p>
+
+<p>When using Jasper 2 in a production Tomcat server you should consider making
+the following changes from the default configuration.</p>
+<ul>
+<li><strong>development</strong> - To disable on access checks for JSP
+pages compilation set this to <code>false</code>.</li>
+<li><strong>genStringAsCharArray</strong> - To generate slightly more efficient
+char arrays, set this to <code>true</code>.</li>
+<li><strong>modificationTestInterval</strong> - If development has to be set to
+<code>true</code> for any reason (such as dynamic generation of JSPs), setting
+this to a high value will improve performance a lot.</li>
+<li><strong>trimSpaces</strong> - To remove useless bytes from the response,
+set this to <code>true</code>.</li>
+</ul>
+
+</div><h3 id="Web_Application_Compilation">Web Application Compilation</h3><div class="text">
+
+<p>Using Ant is the preferred way to compile web applications using JSPC. Note
+that when pre-compiling JSPs, SMAP information will only be included in the
+final classes if suppressSmap is false and compile is true.
+Use the script given below (a similar script is included in the "deployer"
+download) to precompile a webapp:
+</p>
+
+<div class="codeBox"><pre><code><project name="Webapp Precompilation" default="all" basedir=".">
+
+ <import file="${tomcat.home}/bin/catalina-tasks.xml"/>
+
+ <target name="jspc">
+
+ <jasper
+ validateXml="false"
+ uriroot="${webapp.path}"
+ webXmlInclude="${webapp.path}/WEB-INF/generated_web.xml"
+ outputDir="${webapp.path}/WEB-INF/src" />
+
+ </target>
+
+ <target name="compile">
+
+ <mkdir dir="${webapp.path}/WEB-INF/classes"/>
+ <mkdir dir="${webapp.path}/WEB-INF/lib"/>
+
+ <javac destdir="${webapp.path}/WEB-INF/classes"
+ debug="on" failonerror="false"
+ srcdir="${webapp.path}/WEB-INF/src"
+ excludes="**/*.smap">
+ <classpath>
+ <pathelement location="${webapp.path}/WEB-INF/classes"/>
+ <fileset dir="${webapp.path}/WEB-INF/lib">
+ <include name="*.jar"/>
+ </fileset>
+ <pathelement location="${tomcat.home}/lib"/>
+ <fileset dir="${tomcat.home}/lib">
+ <include name="*.jar"/>
+ </fileset>
+ <fileset dir="${tomcat.home}/bin">
+ <include name="*.jar"/>
+ </fileset>
+ </classpath>
+ <include name="**" />
+ <exclude name="tags/**" />
+ </javac>
+
+ </target>
+
+ <target name="all" depends="jspc,compile">
+ </target>
+
+ <target name="cleanup">
+ <delete>
+ <fileset dir="${webapp.path}/WEB-INF/src"/>
+ <fileset dir="${webapp.path}/WEB-INF/classes/org/apache/jsp"/>
+ </delete>
+ </target>
+
+</project></code></pre></div>
+
+<p>
+The following command line can be used to run the script
+(replacing the tokens with the Tomcat base path and the path to the webapp
+which should be precompiled):
+</p>
+<div class="codeBox"><pre><code>$ANT_HOME/bin/ant -Dtomcat.home=<$TOMCAT_HOME> -Dwebapp.path=<$WEBAPP_PATH></code></pre></div>
+
+
+<p>
+Then, the declarations and mappings for the servlets which were generated
+during the precompilation must be added to the web application deployment
+descriptor. Insert the <code>${webapp.path}/WEB-INF/generated_web.xml</code>
+at the right place inside the <code>${webapp.path}/WEB-INF/web.xml</code> file.
+Restart the web application (using the manager) and test it to verify it is
+running fine with precompiled servlets. An appropriate token placed in the
+web application deployment descriptor may also be used to automatically
+insert the generated servlet declarations and mappings using Ant filtering
+capabilities. This is actually how all the webapps distributed with Tomcat
+are automatically compiled as part of the build process.
+</p>
+
+<p>
+At the jasper task you can use the option <code>addWebXmlMappings</code> for
+automatic merge the <code>${webapp.path}/WEB-INF/generated_web.xml</code>
+with the current web application deployment descriptor at
+<code>${webapp.path}/WEB-INF/web.xml</code>.
+</p>
+
+<p>
+When you want to use a specific version of Java for your JSP's, add the
+javac compiler task attributes <code>source</code> and <code>target</code> with
+appropriate values. For example, <code>16</code> to compile JSPs for Java 16.
+</p>
+
+<p>
+For production you may wish to disable debug info with
+<code>debug="off"</code>.
+</p>
+
+<p>
+When you don't want to stop the JSP generation at first JSP syntax error, use
+<code>failOnError="false"</code> and with
+<code>showSuccess="true"</code> all successful <i>JSP to Java</i>
+generation are printed out. Sometimes it is very helpful, when you cleanup the
+generate java source files at <code>${webapp.path}/WEB-INF/src</code>
+and the compile JSP servlet classes at
+<code>${webapp.path}/WEB-INF/classes/org/apache/jsp</code>.
+</p>
+
+<p><strong>Hints:</strong></p>
+<ul>
+<li> When you switch to another Tomcat release, then regenerate and recompile
+your JSP's with the new Tomcat version.</li>
+<li>Use java system property at server runtime to disable PageContext pooling
+<code>org.apache.jasper.runtime.JspFactoryImpl.USE_POOL=false</code>.
+and limit the buffering with
+<code>org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true</code>. Note
+that changing from the defaults may affect performance, but it will vary
+depending on the application.</li>
+</ul>
+</div><h3 id="Optimisation">Optimisation</h3><div class="text">
+<p>
+There are a number of extension points provided within Jasper that enable the
+user to optimise the behaviour for their environment.
+</p>
+
+<p>
+The first of these extension points is the tag plug-in mechanism. This allows
+alternative implementations of tag handlers to be provided for a web application
+to use. Tag plug-ins are registered via a <code>tagPlugins.xml</code> file
+located under <code>WEB-INF</code>. A sample plug-in for the JSTL is included
+with Jasper.
+</p>
+
+<p>
+The second extension point is the Expression Language interpreter. Alternative
+interpreters may be configured through the <code>ServletContext</code>. See the
+<code>ELInterpreterFactory</code> javadoc for details of how to configure an
+alternative EL interpreter. A alternative interpreter primarily targetting tag
+settings is provided at
+<code>org.apache.jasper.optimizations.ELInterpreterTagSetters</code>. See the
+javadoc for details of the optimisations and the impact they have on
+specification compliance.
+</p>
+
+<p>
+An extension point is also provided for coercion of String values to Enums. It
+is provided at
+<code>org.apache.jasper.optimizations.StringInterpreterEnum</code>. See the
+javadoc for details of the optimisations and the impact they have on
+specification compliance.
+</p>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/jaspicapi/index.html b/web/tomcat/webapps/docs/jaspicapi/index.html
new file mode 100644
index 0000000..a844943
--- /dev/null
+++ b/web/tomcat/webapps/docs/jaspicapi/index.html
@@ -0,0 +1,34 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="UTF-8" />
+ <title>API docs</title>
+</head>
+
+<body>
+
+The JASPIC Javadoc is not installed by default. Download and install
+the "fulldocs" package to get it.
+
+You can also access the javadoc online in the Tomcat
+<a href="https://tomcat.apache.org/tomcat-8.5-doc/">
+ documentation bundle</a>.
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/docs/jdbc-pool.html b/web/tomcat/webapps/docs/jdbc-pool.html
new file mode 100644
index 0000000..22fb7ec
--- /dev/null
+++ b/web/tomcat/webapps/docs/jdbc-pool.html
@@ -0,0 +1,887 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - The Tomcat JDBC Connection Pool</title><meta name="author" content="Filip Hanik"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Tomcat JDBC Connection Pool</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#How_to_use">How to use</a><ol><li><a href="#Additional_features">Additional features</a></li><li><a href="#Inside_the_Apache_Tomcat_Container">Inside the Apache Tomcat Container</a></li><li><a href="#Standalone">Standalone</a></li><li><a href="#JMX">JMX</a></li></ol></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#JNDI_Factory_and_Type">JNDI Factory and Type</a></li><li><a href="#System_Properties">System Properties</a></li><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Tomcat_JDBC_Enhanced_Attributes">Tomcat JDBC Enhanced Attributes</a></li></ol></li><li><a href="#Advanced_usage">Advanced usage</a><ol><li><a href="#JDBC_interceptors">JDBC interceptors</a></li><li><a href="#Configuring_JDBC_interceptors">Configuring JDBC interceptors</a></li><li><a href="#org.apache.tomcat.jdbc.pool.JdbcInterceptor">org.apache.tomcat.jdbc.pool.JdbcInterceptor</a></li><li><a href="#org.apache.tomcat.jdbc.pool.interceptor.ConnectionState">org.apache.tomcat.jdbc.pool.interceptor.ConnectionState</a></li><li><a href="#org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer">org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer</a></li><li><a href="#org.apache.tomcat.jdbc.pool.interceptor.StatementCache">org.apache.tomcat.jdbc.pool.interceptor.StatementCache</a></li><li><a href="#org.apache.tomcat.jdbc.pool.interceptor.StatementDecoratorInterceptor">org.apache.tomcat.jdbc.pool.interceptor.StatementDecoratorInterceptor</a></li><li><a href="#org.apache.tomcat.jdbc.pool.interceptor.QueryTimeoutInterceptor">org.apache.tomcat.jdbc.pool.interceptor.QueryTimeoutInterceptor</a></li><li><a href="#org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport">org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport</a></li><li><a href="#org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx">org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx</a></li><li><a href="#org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer">org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer</a></li></ol></li><li><a href="#Code_Example">Code Example</a><ol><li><a href="#Plain_Ol'_Java">Plain Ol' Java</a></li><li><a href="#As_a_Resource">As a Resource</a></li><li><a href="#Asynchronous_Connection_Retrieval">Asynchronous Connection Retrieval</a></li><li><a href="#Interceptors">Interceptors</a></li><li><a href="#Getting_the_actual_JDBC_connection">Getting the actual JDBC connection</a></li></ol></li><li><a href="#Building">Building</a><ol><li><a href="#Building_from_source">Building from source</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The <strong>JDBC Connection Pool <code>org.apache.tomcat.jdbc.pool</code></strong>
+ is a replacement or an alternative to the <a href="https://commons.apache.org/dbcp/">Apache Commons DBCP</a>
+ connection pool.</p>
+
+ <p>So why do we need a new connection pool?</p>
+
+ <p>Here are a few of the reasons:</p>
+ <ol>
+ <li>Commons DBCP 1.x is single threaded. In order to be thread safe
+ Commons locks the entire pool for short periods during both object
+ allocation and object return. Note that this does not apply to
+ Commons DBCP 2.x.</li>
+ <li>Commons DBCP 1.x can be slow. As the number of logical CPUs grows and
+ the number of concurrent threads attempting to borrow or return
+ objects increases, the performance suffers. For highly concurrent
+ systems the impact can be significant. Note that this does not apply
+ to Commons DBCP 2.x.</li>
+ <li>Commons DBCP is over 60 classes. tomcat-jdbc-pool core is 8 classes,
+ hence modifications for future requirement will require much less
+ changes. This is all you need to run the connection pool itself, the
+ rest is gravy.</li>
+ <li>Commons DBCP uses static interfaces. This means you have to use the
+ right version for a given JRE version or you may see
+ <code>NoSuchMethodException</code> exceptions.</li>
+ <li>It's not worth rewriting over 60 classes, when a connection pool can
+ be accomplished with a much simpler implementation.</li>
+ <li>Tomcat jdbc pool implements the ability retrieve a connection
+ asynchronously, without adding additional threads to the library
+ itself.</li>
+ <li>Tomcat jdbc pool is a Tomcat module, it depends on Tomcat JULI, a
+ simplified logging framework used in Tomcat.</li>
+ <li>Retrieve the underlying connection using the
+ <code>javax.sql.PooledConnection</code> interface.</li>
+ <li>Starvation proof. If a pool is empty, and threads are waiting for a
+ connection, when a connection is returned, the pool will awake the
+ correct thread waiting. Most pools will simply starve.</li>
+ </ol>
+
+ <p>Features added over other connection pool implementations</p>
+ <ol>
+ <li>Support for highly concurrent environments and multi core/cpu systems.</li>
+ <li>Dynamic implementation of interface, will support <code>java.sql</code> and <code>javax.sql</code> interfaces for
+ your runtime environment (as long as your JDBC driver does the same), even when compiled with a lower version of the JDK.</li>
+ <li>Validation intervals - we don't have to validate every single time we use the connection, we can do this
+ when we borrow or return the connection, just not more frequent than an interval we can configure.</li>
+ <li>Run-Once query, a configurable query that will be run only once, when the connection to the database is established.
+ Very useful to setup session settings, that you want to exist during the entire time the connection is established.</li>
+ <li>Ability to configure custom interceptors.
+ This allows you to write custom interceptors to enhance the functionality. You can use interceptors to gather query stats,
+ cache session states, reconnect the connection upon failures, retry queries, cache query results, and so on.
+ Your options are endless and the interceptors are dynamic, not tied to a JDK version of a
+ <code>java.sql</code>/<code>javax.sql</code> interface.</li>
+ <li>High performance - we will show some differences in performance later on</li>
+ <li>Extremely simple, due to the very simplified implementation, the line count and source file count are very low, compare with c3p0
+ that has over 200 source files(last time we checked), Tomcat jdbc has a core of 8 files, the connection pool itself is about half
+ that. As bugs may occur, they will be faster to track down, and easier to fix. Complexity reduction has been a focus from inception.</li>
+ <li>Asynchronous connection retrieval - you can queue your request for a connection and receive a <code>Future<Connection></code> back.</li>
+ <li>Better idle connection handling. Instead of closing connections directly, it can still pool connections and sizes the idle pool with a smarter algorithm.</li>
+ <li>You can decide at what moment connections are considered abandoned, is it when the pool is full, or directly at a timeout
+ by specifying a pool usage threshold.
+ </li>
+ <li>The abandon connection timer will reset upon a statement/query activity. Allowing a connections that is in use for a long time to not timeout.
+ This is achieved using the <code>ResetAbandonedTimer</code>
+ </li>
+ <li>Close connections after they have been connected for a certain time. Age based close upon return to the pool.
+ </li>
+ <li>Get JMX notifications and log entries when connections are suspected for being abandoned. This is similar to
+ the <code>removeAbandonedTimeout</code> but it doesn't take any action, only reports the information.
+ This is achieved using the <code>suspectTimeout</code> attribute.</li>
+ <li>Connections can be retrieved from a <code>java.sql.Driver</code>, <code>javax.sql.DataSource</code> or <code>javax.sql.XADataSource</code>
+ This is achieved using the <code>dataSource</code> and <code>dataSourceJNDI</code> attributes.</li>
+ <li>XA connection support</li>
+ </ol>
+
+
+</div><h3 id="How_to_use">How to use</h3><div class="text">
+ <p>
+ Usage of the Tomcat connection pool has been made to be as simple as possible, for those of you that are familiar with commons-dbcp, the
+ transition will be very simple. Moving from other connection pools is also fairly straight forward.
+ </p>
+ <div class="subsection"><h4 id="Additional_features">Additional features</h4><div class="text">
+ <p>The Tomcat connection pool offers a few additional features over what most other pools let you do:</p>
+ <ul>
+ <li><code>initSQL</code> - the ability to run an SQL statement exactly once, when the connection is created</li>
+ <li><code>validationInterval</code> - in addition to running validations on connections, avoid running them too frequently.</li>
+ <li><code>jdbcInterceptors</code> - flexible and pluggable interceptors to create any customizations around the pool,
+ the query execution and the result set handling. More on this in the advanced section.</li>
+ <li><code>fairQueue</code> - Set the fair flag to true to achieve thread fairness or to use asynchronous connection retrieval</li>
+ </ul>
+ </div></div>
+ <div class="subsection"><h4 id="Inside_the_Apache_Tomcat_Container">Inside the Apache Tomcat Container</h4><div class="text">
+ <p>
+ The Tomcat Connection pool is configured as a resource described in <a href="http://tomcat.apache.org/tomcat-8.5-doc/jndi-datasource-examples-howto.html" target="_blank">The Tomcat JDBC documentation</a>
+ With the only difference being that you have to specify the <code>factory</code> attribute and set the value to
+ <code>org.apache.tomcat.jdbc.pool.DataSourceFactory</code>
+ </p>
+ </div></div>
+ <div class="subsection"><h4 id="Standalone">Standalone</h4><div class="text">
+ <p>
+ The connection pool only has another dependency, and that is on tomcat-juli.jar.
+ To configure the pool in a stand alone project using bean instantiation, the bean to instantiate is
+ <code>org.apache.tomcat.jdbc.pool.DataSource</code>. The same attributes (documented below) as you use to configure a connection
+ pool as a JNDI resource, are used to configure a data source as a bean.
+ </p>
+ </div></div>
+ <div class="subsection"><h4 id="JMX">JMX</h4><div class="text">
+ <p>
+ The connection pool object exposes an MBean that can be registered.
+ In order for the connection pool object to create the MBean, the flag <code>jmxEnabled</code> has to be set to true.
+ This doesn't imply that the pool will be registered with an MBean server, merely that the MBean is created.
+ In a container like Tomcat, Tomcat itself registers the DataSource with the MBean server, the
+ <code>org.apache.tomcat.jdbc.pool.DataSource</code> object will then register the actual
+ connection pool MBean.
+ If you're running outside of a container, you can register the DataSource yourself under any object name you specify,
+ and it propagates the registration to the underlying pool. To do this you would call <code>mBeanServer.registerMBean(dataSource.getPool().getJmxPool(),objectname)</code>.
+ Prior to this call, ensure that the pool has been created by calling <code>dataSource.createPool()</code>.
+ </p>
+ </div></div>
+
+</div><h3 id="Attributes">Attributes</h3><div class="text">
+ <p>To provide a very simple switch to and from commons-dbcp and tomcat-jdbc-pool,
+ Most attributes are the same and have the same meaning.</p>
+ <div class="subsection"><h4 id="JNDI_Factory_and_Type">JNDI Factory and Type</h4><div class="text">
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">factory</code></strong></td><td>
+ <p>factory is required, and the value should be <code>org.apache.tomcat.jdbc.pool.DataSourceFactory</code></p>
+ </td></tr><tr><td><strong><code class="attributeName">type</code></strong></td><td>
+ <p>Type should always be <code>javax.sql.DataSource</code> or <code>javax.sql.XADataSource</code></p>
+ <p>Depending on the type a <code>org.apache.tomcat.jdbc.pool.DataSource</code> or a <code>org.apache.tomcat.jdbc.pool.XADataSource</code> will be created.</p>
+ </td></tr></table>
+ </div></div>
+
+ <div class="subsection"><h4 id="System_Properties">System Properties</h4><div class="text">
+ <p>System properties are JVM wide, affect all pools created in the JVM</p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">org.apache.tomcat.jdbc.pool.onlyAttemptCurrentClassLoader</code></td><td>
+ <p>(boolean) Controls classloading of dynamic classes, such as
+ JDBC drivers, interceptors and validators. If set to
+ <code>false</code>, default value, the pool will first attempt
+ to load using the current loader (i.e. the class loader that
+ loaded the pool classes) and if class loading fails attempt to
+ load using the thread context loader. Set this value to
+ <code>true</code>, if you wish to remain backwards compatible
+ with Apache Tomcat 8.0.8 and earlier, and only attempt the
+ current loader.
+ If not set then the default value is <code>false</code>.
+ </p>
+ </td></tr></table>
+ </div></div>
+
+ <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text">
+ <p>These attributes are shared between commons-dbcp and tomcat-jdbc-pool, in some cases default values are different.</p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">defaultAutoCommit</code></td><td>
+ <p>(boolean) The default auto-commit state of connections created by this pool. If not set, default is JDBC driver default (If not set then the <code>setAutoCommit</code> method will not be called.)</p>
+ </td></tr><tr><td><code class="attributeName">defaultReadOnly</code></td><td>
+ <p>(boolean) The default read-only state of connections created by this pool. If not set then the <code>setReadOnly</code> method will not be called. (Some drivers don't support read only mode, ex: Informix)</p>
+ </td></tr><tr><td><code class="attributeName">defaultTransactionIsolation</code></td><td>
+ <p>(String) The default TransactionIsolation state of connections created by this pool. One of the following: (see javadoc )</p>
+ <ul>
+ <li><code>NONE</code></li>
+ <li><code>READ_COMMITTED</code></li>
+ <li><code>READ_UNCOMMITTED</code></li>
+ <li><code>REPEATABLE_READ</code></li>
+ <li><code>SERIALIZABLE</code></li>
+ </ul>
+ <p>If not set, the method will not be called and it defaults to the JDBC driver.</p>
+ </td></tr><tr><td><code class="attributeName">defaultCatalog</code></td><td>
+ <p>(String) The default catalog of connections created by this pool.</p>
+ </td></tr><tr><td><strong><code class="attributeName">driverClassName</code></strong></td><td>
+ <p>(String) The fully qualified Java class name of the JDBC driver to be used. The driver has to be accessible
+ from the same classloader as tomcat-jdbc.jar
+ </p>
+ </td></tr><tr><td><strong><code class="attributeName">username</code></strong></td><td>
+ <p>(String) The connection username to be passed to our JDBC driver to establish a connection.
+ Note that method <code>DataSource.getConnection(username,password)</code>
+ by default will not use credentials passed into the method,
+ but will use the ones configured here. See <code>alternateUsernameAllowed</code>
+ property for more details.
+ </p>
+ </td></tr><tr><td><strong><code class="attributeName">password</code></strong></td><td>
+ <p>(String) The connection password to be passed to our JDBC driver to establish a connection.
+ Note that method <code>DataSource.getConnection(username,password)</code>
+ by default will not use credentials passed into the method,
+ but will use the ones configured here. See <code>alternateUsernameAllowed</code>
+ property for more details.
+ </p>
+ </td></tr><tr><td><code class="attributeName">maxActive</code></td><td>
+ <p>(int) The maximum number of active connections that can be allocated from this pool at the same time.
+ The default value is <code>100</code></p>
+ </td></tr><tr><td><code class="attributeName">maxIdle</code></td><td>
+ <p>(int) The maximum number of connections that should be kept in the pool at all times.
+ Default value is <code>maxActive</code>:<code>100</code>
+ Idle connections are checked periodically (if enabled) and
+ connections that been idle for longer than <code>minEvictableIdleTimeMillis</code>
+ will be released. (also see <code>testWhileIdle</code>)</p>
+ </td></tr><tr><td><code class="attributeName">minIdle</code></td><td>
+ <p>
+ (int) The minimum number of established connections that should be kept in the pool at all times.
+ The connection pool can shrink below this number if validation queries fail.
+ Default value is derived from <code>initialSize</code>:<code>10</code> (also see <code>testWhileIdle</code>)
+ </p>
+ </td></tr><tr><td><code class="attributeName">initialSize</code></td><td>
+ <p>(int)The initial number of connections that are created when the pool is started.
+ Default value is <code>10</code></p>
+ </td></tr><tr><td><code class="attributeName">maxWait</code></td><td>
+ <p>(int) The maximum number of milliseconds that the pool will wait (when there are no available connections)
+ for a connection to be returned before throwing an exception.
+ Default value is <code>30000</code> (30 seconds)</p>
+ </td></tr><tr><td><code class="attributeName">testOnBorrow</code></td><td>
+ <p>(boolean) The indication of whether objects will be validated before being borrowed from the pool.
+ If the object fails to validate, it will be dropped from the pool, and we will attempt to borrow another.
+ In order to have a more efficient validation, see <code>validationInterval</code>.
+ Default value is <code>false</code>
+ </p>
+ </td></tr><tr><td><code class="attributeName">testOnConnect</code></td><td>
+ <p>(boolean) The indication of whether objects will be validated when a connection is first created.
+ If an object fails to validate, it will be throw <code>SQLException</code>.
+ Default value is <code>false</code>
+ </p>
+ </td></tr><tr><td><code class="attributeName">testOnReturn</code></td><td>
+ <p>(boolean) The indication of whether objects will be validated before being returned to the pool.
+ The default value is <code>false</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">testWhileIdle</code></td><td>
+ <p>(boolean) The indication of whether objects will be validated by the idle object evictor (if any).
+ If an object fails to validate, it will be dropped from the pool.
+ The default value is <code>false</code> and this property has to be set in order for the
+ pool cleaner/test thread is to run (also see <code>timeBetweenEvictionRunsMillis</code>)
+ </p>
+ </td></tr><tr><td><code class="attributeName">validationQuery</code></td><td>
+ <p>(String) The SQL query that will be used to validate connections from this pool before returning them to the caller.
+ If specified, this query does not have to return any data, it just can't throw a <code>SQLException</code>.
+ The default value is <code>null</code>.
+ If not specified, connections will be validation by the isValid() method.
+ Example values are <code>SELECT 1</code>(mysql), <code>select 1 from dual</code>(oracle), <code>SELECT 1</code>(MS Sql Server)
+ </p>
+ </td></tr><tr><td><code class="attributeName">validationQueryTimeout</code></td><td>
+ <p>(int) The timeout in seconds before a connection validation queries fail. This works by calling
+ <code>java.sql.Statement.setQueryTimeout(seconds)</code> on the statement that executes the <code>validationQuery</code>.
+ The pool itself doesn't timeout the query, it is still up to the JDBC driver to enforce query timeouts.
+ A value less than or equal to zero will disable this feature.
+ The default value is <code>-1</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">validatorClassName</code></td><td>
+ <p>(String) The name of a class which implements the
+ <code>org.apache.tomcat.jdbc.pool.Validator</code> interface and
+ provides a no-arg constructor (may be implicit). If specified, the
+ class will be used to create a Validator instance which is then used
+ instead of any validation query to validate connections. The default
+ value is <code>null</code>. An example value is
+ <code>com.mycompany.project.SimpleValidator</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">timeBetweenEvictionRunsMillis</code></td><td>
+ <p>(int) The number of milliseconds to sleep between runs of the idle connection validation/cleaner thread.
+ This value should not be set under 1 second. It dictates how often we check for idle, abandoned connections, and how often
+ we validate idle connections.
+ The default value is <code>5000</code> (5 seconds). <br>
+ </p>
+ </td></tr><tr><td><code class="attributeName">numTestsPerEvictionRun</code></td><td>
+ <p>(int) Property not used in tomcat-jdbc-pool.</p>
+ </td></tr><tr><td><code class="attributeName">minEvictableIdleTimeMillis</code></td><td>
+ <p>(int) The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.
+ The default value is <code>60000</code> (60 seconds).</p>
+ </td></tr><tr><td><code class="attributeName">accessToUnderlyingConnectionAllowed</code></td><td>
+ <p>(boolean) Property not used. Access can be achieved by calling <code>unwrap</code> on the pooled connection.
+ see <code>javax.sql.DataSource</code> interface, or call <code>getConnection</code> through reflection or
+ cast the object as <code>javax.sql.PooledConnection</code></p>
+ </td></tr><tr><td><code class="attributeName">removeAbandoned</code></td><td>
+ <p>(boolean) Flag to remove abandoned connections if they exceed the <code>removeAbandonedTimeout</code>.
+ If set to true a connection is considered abandoned and eligible for removal if it has been in use
+ longer than the <code>removeAbandonedTimeout</code> Setting this to <code>true</code> can recover db connections from
+ applications that fail to close a connection. See also <code>logAbandoned</code>
+ The default value is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">removeAbandonedTimeout</code></td><td>
+ <p>(int) Timeout in seconds before an abandoned(in use) connection can be removed.
+ The default value is <code>60</code> (60 seconds). The value should be set to the longest running query your applications
+ might have.</p>
+ </td></tr><tr><td><code class="attributeName">logAbandoned</code></td><td>
+ <p>(boolean) Flag to log stack traces for application code which abandoned a Connection.
+ Logging of abandoned Connections adds overhead for every Connection borrow because a stack trace has to be generated.
+ The default value is <code>false</code>.</p>
+ </td></tr><tr><td><code class="attributeName">connectionProperties</code></td><td>
+ <p>(String) The connection properties that will be sent to our JDBC driver when establishing new connections.
+ Format of the string must be [propertyName=property;]*
+ NOTE - The "user" and "password" properties will be passed explicitly, so they do not need to be included here.
+ The default value is <code>null</code>.</p>
+ </td></tr><tr><td><code class="attributeName">poolPreparedStatements</code></td><td>
+ <p>(boolean) Property not used.</p>
+ </td></tr><tr><td><code class="attributeName">maxOpenPreparedStatements</code></td><td>
+ <p>(int) Property not used.</p>
+ </td></tr></table>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Tomcat_JDBC_Enhanced_Attributes">Tomcat JDBC Enhanced Attributes</h4><div class="text">
+
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">initSQL</code></td><td>
+ <p>(String) A custom query to be run when a connection is first created.
+ The default value is <code>null</code>.</p>
+ </td></tr><tr><td><code class="attributeName">jdbcInterceptors</code></td><td>
+ <p>(String) A semicolon separated list of classnames extending
+ <code>org.apache.tomcat.jdbc.pool.JdbcInterceptor</code> class.
+ See <a href="#Configuring_JDBC_interceptors">Configuring JDBC interceptors</a>
+ below for more detailed description of syntax and examples.
+ </p>
+ <p>
+ These interceptors will be inserted as an interceptor into the chain
+ of operations on a <code>java.sql.Connection</code> object.
+ The default value is <code>null</code>.
+ </p>
+ <p>
+ Predefined interceptors:<br>
+ <code>org.apache.tomcat.jdbc.pool.interceptor.<br>ConnectionState</code>
+ - keeps track of auto commit, read only, catalog and transaction isolation level.<br>
+ <code>org.apache.tomcat.jdbc.pool.interceptor.<br>StatementFinalizer</code>
+ - keeps track of opened statements, and closes them when the connection is returned to the pool.
+ </p>
+ <p>
+ More predefined interceptors are described in detail in the
+ <a href="#JDBC_interceptors">JDBC Interceptors section</a>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">validationInterval</code></td><td>
+ <p>(long) avoid excess validation, only run validation at most at this frequency - time in milliseconds.
+ If a connection is due for validation, but has been validated previously within this interval, it will not be validated again.
+ The default value is <code>3000</code> (3 seconds).</p>
+ </td></tr><tr><td><code class="attributeName">jmxEnabled</code></td><td>
+ <p>(boolean) Register the pool with JMX or not.
+ The default value is <code>true</code>.</p>
+ </td></tr><tr><td><code class="attributeName">fairQueue</code></td><td>
+ <p>(boolean) Set to true if you wish that calls to getConnection should be treated
+ fairly in a true FIFO fashion. This uses the <code>org.apache.tomcat.jdbc.pool.FairBlockingQueue</code>
+ implementation for the list of the idle connections. The default value is <code>true</code>.
+ This flag is required when you want to use asynchronous connection retrieval.<br>
+ Setting this flag ensures that threads receive connections in the order they arrive.<br>
+ During performance tests, there is a very large difference in how locks
+ and lock waiting is implemented. When <code>fairQueue=true</code>
+ there is a decision making process based on what operating system the system is running.
+ If the system is running on Linux (property <code>os.name=Linux</code>.
+ To disable this Linux specific behavior and still use the fair queue, simply add the property
+ <code>org.apache.tomcat.jdbc.pool.FairBlockingQueue.ignoreOS=true</code> to your system properties
+ before the connection pool classes are loaded.
+ </p>
+ </td></tr><tr><td><code class="attributeName">abandonWhenPercentageFull</code></td><td>
+ <p>(int) Connections that have been abandoned (timed out) wont get closed and reported up unless
+ the number of connections in use are above the percentage defined by <code>abandonWhenPercentageFull</code>.
+ The value should be between 0-100.
+ The default value is <code>0</code>, which implies that connections are eligible for closure as soon
+ as <code>removeAbandonedTimeout</code> has been reached.</p>
+ </td></tr><tr><td><code class="attributeName">maxAge</code></td><td>
+ <p>(long) Time in milliseconds to keep this connection. This attribute
+ works both when returning connection and when borrowing connection.
+ When a connection is borrowed from the pool, the pool will check to see
+ if the <code>now - time-when-connected > maxAge</code> has been reached
+ , and if so, it reconnects before borrow it. When a connection is
+ returned to the pool, the pool will check to see if the
+ <code>now - time-when-connected > maxAge</code> has been reached, and
+ if so, it closes the connection rather than returning it to the pool.
+ The default value is <code>0</code>, which implies that connections
+ will be left open and no age check will be done upon borrowing from the
+ pool and returning the connection to the pool.</p>
+ </td></tr><tr><td><code class="attributeName">useEquals</code></td><td>
+ <p>(boolean) Set to true if you wish the <code>ProxyConnection</code> class to use <code>String.equals</code> and set to <code>false</code>
+ when you wish to use <code>==</code> when comparing method names. This property does not apply to added interceptors as those are configured individually.
+ The default value is <code>true</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">suspectTimeout</code></td><td>
+ <p>(int) Timeout value in seconds. Default value is <code>0</code>.<br>
+ Similar to to the <code>removeAbandonedTimeout</code> value but instead of treating the connection
+ as abandoned, and potentially closing the connection, this simply logs the warning if
+ <code>logAbandoned</code> is set to true. If this value is equal or less than 0, no suspect
+ checking will be performed. Suspect checking only takes place if the timeout value is larger than 0 and
+ the connection was not abandoned or if abandon check is disabled. If a connection is suspect a WARN message gets
+ logged and a JMX notification gets sent once.
+ </p>
+ </td></tr><tr><td><code class="attributeName">rollbackOnReturn</code></td><td>
+ <p>(boolean) If <code>autoCommit==false</code> then the pool can terminate the transaction by calling rollback on the connection as it is returned to the pool
+ Default value is <code>false</code>.<br>
+ </p>
+ </td></tr><tr><td><code class="attributeName">commitOnReturn</code></td><td>
+ <p>(boolean) If <code>autoCommit==false</code> then the pool can complete the transaction by calling commit on the connection as it is returned to the pool
+ If <code>rollbackOnReturn==true</code> then this attribute is ignored.
+ Default value is <code>false</code>.<br>
+ </p>
+ </td></tr><tr><td><code class="attributeName">alternateUsernameAllowed</code></td><td>
+ <p>(boolean) By default, the jdbc-pool will ignore the
+ <a href="http://docs.oracle.com/javase/6/docs/api/javax/sql/DataSource.html#getConnection(java.lang.String,%20java.lang.String)"><code>DataSource.getConnection(username,password)</code></a>
+ call, and simply return a previously pooled connection under the globally configured properties <code>username</code> and <code>password</code>, for performance reasons.
+ </p>
+ <p>
+ The pool can however be configured to allow use of different credentials
+ each time a connection is requested. To enable the functionality described in the
+ <a href="http://docs.oracle.com/javase/6/docs/api/javax/sql/DataSource.html#getConnection(java.lang.String,%20java.lang.String)"><code>DataSource.getConnection(username,password)</code></a>
+ call, simply set the property <code>alternateUsernameAllowed</code>
+ to <code>true</code>.<br>
+ Should you request a connection with the credentials user1/password1 and the connection
+ was previously connected using different user2/password2, the connection will be closed,
+ and reopened with the requested credentials. This way, the pool size is still managed
+ on a global level, and not on a per schema level. <br>
+ The default value is <code>false</code>.<br>
+ This property was added as an enhancement to <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=50025">bug 50025</a>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">dataSource</code></td><td>
+ <p>(javax.sql.DataSource) Inject a data source to the connection pool, and the pool will use the data source to retrieve connections instead of establishing them using the <code>java.sql.Driver</code> interface.
+ This is useful when you wish to pool XA connections or connections established using a data source instead of a connection string. Default value is <code>null</code>
+ </p>
+ </td></tr><tr><td><code class="attributeName">dataSourceJNDI</code></td><td>
+ <p>(String) The JNDI name for a data source to be looked up in JNDI and then used to establish connections to the database. See the <code>dataSource</code> attribute. Default value is <code>null</code>
+ </p>
+ </td></tr><tr><td><code class="attributeName">useDisposableConnectionFacade</code></td><td>
+ <p>(boolean) Set this to true if you wish to put a facade on your connection so that it cannot be reused after it has been closed. This prevents a thread holding on to a
+ reference of a connection it has already called closed on, to execute queries on it. Default value is <code>true</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">logValidationErrors</code></td><td>
+ <p>(boolean) Set this to true to log errors during the validation phase to the log file. If set to true, errors will be logged as SEVERE. Default value is <code>false</code> for backwards compatibility.
+ </p>
+ </td></tr><tr><td><code class="attributeName">propagateInterruptState</code></td><td>
+ <p>(boolean) Set this to true to propagate the interrupt state for a thread that has been interrupted (not clearing the interrupt state). Default value is <code>false</code> for backwards compatibility.
+ </p>
+ </td></tr><tr><td><code class="attributeName">ignoreExceptionOnPreLoad</code></td><td>
+ <p>(boolean) Flag whether ignore error of connection creation while initializing the pool.
+ Set to true if you want to ignore error of connection creation while initializing the pool.
+ Set to false if you want to fail the initialization of the pool by throwing exception.
+ The default value is <code>false</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">useStatementFacade</code></td><td>
+ <p>(boolean) Set this to true if you wish to wrap statements in order to
+ enable <code>equals()</code> and <code>hashCode()</code> methods to be
+ called on the closed statements if any statement proxy is set.
+ Default value is <code>true</code>.
+ </p>
+ </td></tr></table>
+ </div></div>
+</div><h3 id="Advanced_usage">Advanced usage</h3><div class="text">
+ <div class="subsection"><h4 id="JDBC_interceptors">JDBC interceptors</h4><div class="text">
+ <p>To see an example of how to use an interceptor, take a look at
+ <code>org.apache.tomcat.jdbc.pool.interceptor.ConnectionState</code>.
+ This simple interceptor is a cache of three attributes, transaction isolation level, auto commit and read only state,
+ in order for the system to avoid not needed roundtrips to the database.
+ </p>
+ <p>Further interceptors will be added to the core of the pool as the need arises. Contributions are always welcome!</p>
+ <p>Interceptors are of course not limited to just <code>java.sql.Connection</code> but can be used to wrap any
+ of the results from a method invocation as well. You could build query performance analyzer that provides JMX notifications when a
+ query is running longer than the expected time.</p>
+ </div></div>
+ <div class="subsection"><h4 id="Configuring_JDBC_interceptors">Configuring JDBC interceptors</h4><div class="text">
+ <p>Configuring JDBC interceptors is done using the <b>jdbcInterceptors</b> property.
+ The property contains a list of semicolon separated class names. If the
+ classname is not fully qualified it will be prefixed with the
+ <code>org.apache.tomcat.jdbc.pool.interceptor.</code> prefix.
+ </p>
+ <p>Example:<br>
+ <code>
+ jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
+ org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
+ </code>
+ <br>
+ is the same as
+ <br>
+ <code> jdbcInterceptors="ConnectionState;StatementFinalizer"</code>
+ </p>
+ <p>
+ Interceptors can have properties as well. Properties for an interceptor
+ are specified within parentheses after the class name. Several properties
+ are separated by commas.
+ </p>
+ <p>Example:<br>
+ <code>
+ jdbcInterceptors="ConnectionState;StatementFinalizer(useEquals=true)"
+ </code>
+ </p>
+ <p>
+ Extra whitespace characters around class names, property names and values
+ are ignored.
+ </p>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.JdbcInterceptor">org.apache.tomcat.jdbc.pool.JdbcInterceptor</h4><div class="text">
+ <p>Abstract base class for all interceptors, cannot be instantiated.</p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">useEquals</code></td><td>
+ <p>(boolean) Set to true if you wish the <code>ProxyConnection</code> class to use <code>String.equals</code> and set to <code>false</code>
+ when you wish to use <code>==</code> when comparing method names.
+ The default value is <code>true</code>.
+ </p>
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState">org.apache.tomcat.jdbc.pool.interceptor.ConnectionState</h4><div class="text">
+ <p>Caches the connection for the following attributes <code>autoCommit</code>, <code>readOnly</code>,
+ <code>transactionIsolation</code> and <code>catalog</code>.
+ It is a performance enhancement to avoid roundtrip to the database when getters are called or setters are called with an already set value.
+ </p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer">org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer</h4><div class="text">
+ <p>Keeps track of all statements created using <code>createStatement</code>, <code>prepareStatement</code> or <code>prepareCall</code>
+ and closes these statements when the connection is returned to the pool.
+ </p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">trace</code></td><td>
+ <p>(boolean as String) Enable tracing of unclosed statements.
+ When enabled and a connection is closed, and statements are not closed,
+ the interceptor will log all stack traces.
+ The default value is <code>false</code>.
+ </p>
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.interceptor.StatementCache">org.apache.tomcat.jdbc.pool.interceptor.StatementCache</h4><div class="text">
+ <p>Caches <code>PreparedStatement</code> and/or <code>CallableStatement</code>
+ instances on a connection.
+ </p>
+ <p>The statements are cached per connection.
+ The count limit is counted globally for all connections that belong to
+ the same pool. Once the count reaches <code>max</code>, subsequent
+ statements are not returned to the cache and are closed immediately.
+ </p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">prepared</code></td><td>
+ <p>(boolean as String) Enable caching of <code>PreparedStatement</code>
+ instances created using <code>prepareStatement</code> calls.
+ The default value is <code>true</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">callable</code></td><td>
+ <p>(boolean as String) Enable caching of <code>CallableStatement</code>
+ instances created using <code>prepareCall</code> calls.
+ The default value is <code>false</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">max</code></td><td>
+ <p>(int as String) Limit on the count of cached statements across
+ the connection pool.
+ The default value is <code>50</code>.
+ </p>
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.interceptor.StatementDecoratorInterceptor">org.apache.tomcat.jdbc.pool.interceptor.StatementDecoratorInterceptor</h4><div class="text">
+ <p>See <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=48392">48392</a>. Interceptor to wrap statements and result sets in order to prevent access to the actual connection
+ using the methods <code>ResultSet.getStatement().getConnection()</code> and <code>Statement.getConnection()</code>
+ </p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.interceptor.QueryTimeoutInterceptor">org.apache.tomcat.jdbc.pool.interceptor.QueryTimeoutInterceptor</h4><div class="text">
+ <p>Automatically calls <code>java.sql.Statement.setQueryTimeout(seconds)</code> when a new statement is created.
+ The pool itself doesn't timeout the query, it is still up to the JDBC driver to enforce query timeouts.
+ </p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><strong><code class="attributeName">queryTimeout</code></strong></td><td>
+ <p>(int as String) The number of seconds to set for the query timeout.
+ A value less than or equal to zero will disable this feature.
+ The default value is <code>1</code> seconds.
+ </p>
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport">org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport</h4><div class="text">
+ <p>Keeps track of query performance and issues log entries when queries exceed a time threshold of fail.
+ The log level used is <code>WARN</code>
+ </p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">threshold</code></td><td>
+ <p>(int as String) The number of milliseconds a query has to exceed before issuing a log alert.
+ The default value is <code>1000</code> milliseconds.
+ </p>
+ </td></tr><tr><td><code class="attributeName">maxQueries</code></td><td>
+ <p>(int as String) The maximum number of queries to keep track of in order to preserve memory space.
+ A value less than or equal to 0 will disable this feature.
+ The default value is <code>1000</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">logSlow</code></td><td>
+ <p>(boolean as String) Set to <code>true</code> if you wish to log slow queries.
+ The default value is <code>true</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">logFailed</code></td><td>
+ <p>(boolean as String) Set to <code>true</code> if you wish to log failed queries.
+ The default value is <code>false</code>.
+ </p>
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx">org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx</h4><div class="text">
+ <p>Extends the <code>SlowQueryReport</code> and in addition to log entries it issues JMX notification
+ for monitoring tools to react to. Inherits all the attributes from its parent class.
+ This class uses Tomcat's JMX engine so it wont work outside of the Tomcat container.
+ By default, JMX notifications are sent through the ConnectionPool mbean if it is enabled.
+ The <code>SlowQueryReportJmx</code> can also register an MBean if <code>notifyPool=false</code>
+ </p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr><tr><td><code class="attributeName">notifyPool</code></td><td>
+ <p>(boolean as String) Set to false if you want JMX notifications to go to the <code>SlowQueryReportJmx</code> MBean
+ The default value is <code>true</code>.
+ </p>
+ </td></tr><tr><td><code class="attributeName">objectName</code></td><td>
+ <p>(String) Define a valid <code>javax.management.ObjectName</code> string that will be used to register this object with the platform mbean server
+ The default value is <code>null</code> and the object will be registered using
+ tomcat.jdbc:type=org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx,name=the-name-of-the-pool
+ </p>
+ </td></tr></table>
+ </div></div>
+ <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer">org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer</h4><div class="text">
+ <p>
+ The abandoned timer starts when a connection is checked out from the pool.
+ This means if you have a 30second timeout and run 10x10second queries using the connection
+ it will be marked abandoned and potentially reclaimed depending on the <code>abandonWhenPercentageFull</code>
+ attribute.
+ Using this interceptor it will reset the checkout timer every time you perform an operation on the connection or execute a
+ query successfully.
+ </p>
+ <table class="defaultTable"><tr><th style="width: 15%;">
+ Attribute
+ </th><th style="width: 85%;">
+ Description
+ </th></tr></table>
+ </div></div>
+</div><h3 id="Code_Example">Code Example</h3><div class="text">
+ <p>Other examples of Tomcat configuration for JDBC usage can be found <a href="https://tomcat.apache.org/tomcat-8.5-doc/jndi-datasource-examples-howto.html">in the Tomcat documentation</a>. </p>
+ <div class="subsection"><h4 id="Plain_Ol'_Java">Plain Ol' Java</h4><div class="text">
+ <p>Here is a simple example of how to create and use a data source.</p>
+<div class="codeBox"><pre><code> import java.sql.Connection;
+ import java.sql.ResultSet;
+ import java.sql.Statement;
+
+ import org.apache.tomcat.jdbc.pool.DataSource;
+ import org.apache.tomcat.jdbc.pool.PoolProperties;
+
+ public class SimplePOJOExample {
+
+ public static void main(String[] args) throws Exception {
+ PoolProperties p = new PoolProperties();
+ p.setUrl("jdbc:mysql://localhost:3306/mysql");
+ p.setDriverClassName("com.mysql.jdbc.Driver");
+ p.setUsername("root");
+ p.setPassword("password");
+ p.setJmxEnabled(true);
+ p.setTestWhileIdle(false);
+ p.setTestOnBorrow(true);
+ p.setValidationQuery("SELECT 1");
+ p.setTestOnReturn(false);
+ p.setValidationInterval(30000);
+ p.setTimeBetweenEvictionRunsMillis(30000);
+ p.setMaxActive(100);
+ p.setInitialSize(10);
+ p.setMaxWait(10000);
+ p.setRemoveAbandonedTimeout(60);
+ p.setMinEvictableIdleTimeMillis(30000);
+ p.setMinIdle(10);
+ p.setLogAbandoned(true);
+ p.setRemoveAbandoned(true);
+ p.setJdbcInterceptors(
+ "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
+ "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
+ DataSource datasource = new DataSource();
+ datasource.setPoolProperties(p);
+
+ Connection con = null;
+ try {
+ con = datasource.getConnection();
+ Statement st = con.createStatement();
+ ResultSet rs = st.executeQuery("select * from user");
+ int cnt = 1;
+ while (rs.next()) {
+ System.out.println((cnt++)+". Host:" +rs.getString("Host")+
+ " User:"+rs.getString("User")+" Password:"+rs.getString("Password"));
+ }
+ rs.close();
+ st.close();
+ } finally {
+ if (con!=null) try {con.close();}catch (Exception ignore) {}
+ }
+ }
+
+ }</code></pre></div>
+ </div></div>
+ <div class="subsection"><h4 id="As_a_Resource">As a Resource</h4><div class="text">
+ <p>And here is an example on how to configure a resource for JNDI lookups</p>
+<div class="codeBox"><pre><code><Resource name="jdbc/TestDB"
+ auth="Container"
+ type="javax.sql.DataSource"
+ factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
+ testWhileIdle="true"
+ testOnBorrow="true"
+ testOnReturn="false"
+ validationQuery="SELECT 1"
+ validationInterval="30000"
+ timeBetweenEvictionRunsMillis="30000"
+ maxActive="100"
+ minIdle="10"
+ maxWait="10000"
+ initialSize="10"
+ removeAbandonedTimeout="60"
+ removeAbandoned="true"
+ logAbandoned="true"
+ minEvictableIdleTimeMillis="30000"
+ jmxEnabled="true"
+ jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
+ org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
+ username="root"
+ password="password"
+ driverClassName="com.mysql.jdbc.Driver"
+ url="jdbc:mysql://localhost:3306/mysql"/></code></pre></div>
+
+ </div></div>
+ <div class="subsection"><h4 id="Asynchronous_Connection_Retrieval">Asynchronous Connection Retrieval</h4><div class="text">
+ <p> The Tomcat JDBC connection pool supports asynchronous connection retrieval without adding additional threads to the
+ pool library. It does this by adding a method to the data source called <code>Future<Connection> getConnectionAsync()</code>.
+ In order to use the async retrieval, two conditions must be met:
+ </p>
+ <ol>
+ <li>You must configure the <code>fairQueue</code> property to be <code>true</code>.</li>
+ <li>You will have to cast the data source to <code>org.apache.tomcat.jdbc.pool.DataSource</code></li>
+ </ol>
+ An example of using the async feature is show below.
+<div class="codeBox"><pre><code> Connection con = null;
+ try {
+ Future<Connection> future = datasource.getConnectionAsync();
+ while (!future.isDone()) {
+ System.out.println("Connection is not yet available. Do some background work");
+ try {
+ Thread.sleep(100); //simulate work
+ }catch (InterruptedException x) {
+ Thread.currentThread().interrupt();
+ }
+ }
+ con = future.get(); //should return instantly
+ Statement st = con.createStatement();
+ ResultSet rs = st.executeQuery("select * from user");</code></pre></div>
+
+ </div></div>
+ <div class="subsection"><h4 id="Interceptors">Interceptors</h4><div class="text">
+ <p>Interceptors are a powerful way to enable, disable or modify functionality on a specific connection or its sub components.
+ There are many different use cases for when interceptors are useful. By default, and for performance reasons, the connection pool is stateless.
+ The only state the pool itself inserts are <code>defaultAutoCommit</code>, <code>defaultReadOnly</code>, <code>defaultTransactionIsolation</code>, <code>defaultCatalog</code> if
+ these are set. These 4 properties are only set upon connection creation. Should these properties be modified during the usage of the connection,
+ the pool itself will not reset them.</p>
+ <p>An interceptor has to extend the <code>org.apache.tomcat.jdbc.pool.JdbcInterceptor</code> class. This class is fairly simple,
+ You will need to have a no arg constructor</p>
+<div class="codeBox"><pre><code> public JdbcInterceptor() {
+ }</code></pre></div>
+ <p>
+ When a connection is borrowed from the pool, the interceptor can initialize or in some other way react to the event by implementing the
+ </p>
+<div class="codeBox"><pre><code> public abstract void reset(ConnectionPool parent, PooledConnection con);</code></pre></div>
+ <p>
+ method. This method gets called with two parameters, a reference to the connection pool itself <code>ConnectionPool parent</code>
+ and a reference to the underlying connection <code>PooledConnection con</code>.
+ </p>
+ <p>
+ When a method on the <code>java.sql.Connection</code> object is invoked, it will cause the
+ </p>
+<div class="codeBox"><pre><code> public Object invoke(Object proxy, Method method, Object[] args) throws Throwable</code></pre></div>
+ <p>
+ method to get invoked. The <code>Method method</code> is the actual method invoked, and <code>Object[] args</code> are the arguments.
+ To look at a very simple example, where we demonstrate how to make the invocation to <code>java.sql.Connection.close()</code> a noop
+ if the connection has been closed
+ </p>
+<div class="codeBox"><pre><code> if (CLOSE_VAL==method.getName()) {
+ if (isClosed()) return null; //noop for already closed.
+ }
+ return super.invoke(proxy,method,args);</code></pre></div>
+ <p>
+ There is an observation being made. It is the comparison of the method name. One way to do this would be to do
+ <code>"close".equals(method.getName())</code>.
+ Above we see a direct reference comparison between the method name and <code>static final String</code> reference.
+ According to the JVM spec, method names and static final String end up in a shared constant pool, so the reference comparison should work.
+ One could of course do this as well:
+ </p>
+<div class="codeBox"><pre><code> if (compare(CLOSE_VAL,method)) {
+ if (isClosed()) return null; //noop for already closed.
+ }
+ return super.invoke(proxy,method,args);</code></pre></div>
+ <p>
+ The <code>compare(String,Method)</code> will use the <code>useEquals</code> flag on an interceptor and do either reference comparison or
+ a string value comparison when the <code>useEquals=true</code> flag is set.
+ </p>
+ <p>Pool start/stop<br>
+ When the connection pool is started or closed, you can be notified. You will only be notified once per interceptor class
+ even though it is an instance method. and you will be notified using an interceptor currently not attached to a pool.
+ </p>
+<div class="codeBox"><pre><code> public void poolStarted(ConnectionPool pool) {
+ }
+
+ public void poolClosed(ConnectionPool pool) {
+ }</code></pre></div>
+ <p>
+ When overriding these methods, don't forget to call super if you are extending a class other than <code>JdbcInterceptor</code>
+ </p>
+ <p>Configuring interceptors<br>
+ Interceptors are configured using the <code>jdbcInterceptors</code> property or the <code>setJdbcInterceptors</code> method.
+ An interceptor can have properties, and would be configured like this
+ </p>
+<div class="codeBox"><pre><code> String jdbcInterceptors=
+ "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState(useEquals=true,fast=yes)"</code></pre></div>
+
+ <p>Interceptor properties<br>
+ Since interceptors can have properties, you need to be able to read the values of these properties within your
+ interceptor. Taking an example like the one above, you can override the <code>setProperties</code> method.
+ </p>
+<div class="codeBox"><pre><code> public void setProperties(Map<String, InterceptorProperty> properties) {
+ super.setProperties(properties);
+ final String myprop = "myprop";
+ InterceptorProperty p1 = properties.get(myprop);
+ if (p1!=null) {
+ setMyprop(Long.parseLong(p1.getValue()));
+ }
+ }</code></pre></div>
+
+ </div></div>
+ <div class="subsection"><h4 id="Getting_the_actual_JDBC_connection">Getting the actual JDBC connection</h4><div class="text">
+ <p>Connection pools create wrappers around the actual connection in order to properly pool them.
+ We also create interceptors in these wrappers to be able to perform certain functions.
+ If there is a need to retrieve the actual connection, one can do so using the <code>javax.sql.PooledConnection</code>
+ interface.
+ </p>
+<div class="codeBox"><pre><code> Connection con = datasource.getConnection();
+ Connection actual = ((javax.sql.PooledConnection)con).getConnection();</code></pre></div>
+
+ </div></div>
+
+</div><h3 id="Building">Building</h3><div class="text">
+ <p>We build the JDBC pool code with 1.6, but it is backwards compatible down to 1.5 for runtime environment. For unit test, we use 1.6 and higher</p>
+ <p>Other examples of Tomcat configuration for JDBC usage can be found <a href="https://tomcat.apache.org/tomcat-8.5-doc/jndi-datasource-examples-howto.html">in the Tomcat documentation</a>. </p>
+ <div class="subsection"><h4 id="Building_from_source">Building from source</h4><div class="text">
+ <p>Building is pretty simple. The pool has a dependency on <code>tomcat-juli.jar</code> and in case you want the <code>SlowQueryReportJmx</code></p>
+<div class="codeBox"><pre><code> javac -classpath tomcat-juli.jar \
+ -d . \
+ org/apache/tomcat/jdbc/pool/*.java \
+ org/apache/tomcat/jdbc/pool/interceptor/*.java \
+ org/apache/tomcat/jdbc/pool/jmx/*.java</code></pre></div>
+ <p>
+ A build file can be found in the Tomcat <a href="https://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/">source repository</a>.
+ </p>
+ <p>
+ As a convenience, a build file is also included where a simple build command will generate all files needed.
+ </p>
+<div class="codeBox"><pre><code> ant download (downloads dependencies)
+ ant build (compiles and generates .jar files)
+ ant dist (creates a release package)
+ ant test (runs tests, expects a test database to be setup)</code></pre></div>
+
+ <p>
+ The system is structured for a Maven build, but does generate release artifacts. Just the library itself.
+ </p>
+ </div></div>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/jndi-datasource-examples-howto.html b/web/tomcat/webapps/docs/jndi-datasource-examples-howto.html
new file mode 100644
index 0000000..5ff238a
--- /dev/null
+++ b/web/tomcat/webapps/docs/jndi-datasource-examples-howto.html
@@ -0,0 +1,637 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - JNDI Datasource How-To</title><meta name="author" content="Les Hughes"><meta name="author" content="David Haraburda"><meta name="author" content="Glenn Nielsen"><meta name="author" content="Yoav Shapira"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>JNDI Datasource How-To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#DriverManager,_the_service_provider_mechanism_and_memory_leaks">DriverManager, the service provider mechanism and memory leaks</a></li><li><a href="#Database_Connection_Pool_(DBCP_2)_Configurations">Database Connection Pool (DBCP 2) Configurations</a><ol><li><a href="#Installation">Installation</a></li><li><a href="#Preventing_database_connection_pool_leaks">Preventing database connection pool leaks</a></li><li><a href="#MySQL_DBCP_2_Example">MySQL DBCP 2 Example</a></li><li><a href="#Oracle_8i,_9i_&_10g">Oracle 8i, 9i & 10g</a></li><li><a href="#PostgreSQL">PostgreSQL</a></li></ol></li><li><a href="#Non-DBCP_Solutions">Non-DBCP Solutions</a></li><li><a href="#Oracle_8i_with_OCI_client">Oracle 8i with OCI client</a><ol><li><a href="#Oracle_8i_with_OCI_client/Introduction">Introduction</a></li><li><a href="#Putting_it_all_together">Putting it all together</a></li></ol></li><li><a href="#Common_Problems">Common Problems</a><ol><li><a href="#Intermittent_Database_Connection_Failures">Intermittent Database Connection Failures</a></li><li><a href="#Random_Connection_Closed_Exceptions">Random Connection Closed Exceptions</a></li><li><a href="#Context_versus_GlobalNamingResources">Context versus GlobalNamingResources</a></li><li><a href="#JNDI_Resource_Naming_and_Realm_Interaction">JNDI Resource Naming and Realm Interaction</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+<p>JNDI Datasource configuration is covered extensively in the
+JNDI-Resources-HOWTO. However, feedback from <code>tomcat-user</code> has
+shown that specifics for individual configurations can be rather tricky.</p>
+
+<p>Here then are some example configurations that have been posted to
+tomcat-user for popular databases and some general tips for db usage.</p>
+
+<p>You should be aware that since these notes are derived from configuration
+and/or feedback posted to <code>tomcat-user</code> YMMV :-). Please let us
+know if you have any other tested configurations that you feel may be of use
+to the wider audience, or if you feel we can improve this section in anyway.</p>
+
+<p>
+<b>Please note that JNDI resource configuration changed somewhat between
+Tomcat 7.x and Tomcat 8.x as they are using different versions of
+Apache Commons DBCP library.</b> You will most likely need to modify older
+JNDI resource configurations to match the syntax in the example below in order
+to make them work in Tomcat 8.
+See <a href="https://tomcat.apache.org/migration.html">Tomcat Migration Guide</a>
+for details.
+</p>
+
+<p>
+Also, please note that JNDI DataSource configuration in general, and this
+tutorial in particular, assumes that you have read and understood the
+<a href="config/context.html">Context</a> and
+<a href="config/host.html">Host</a> configuration references, including
+the section about Automatic Application Deployment in the latter reference.
+</p>
+</div><h3 id="DriverManager,_the_service_provider_mechanism_and_memory_leaks">DriverManager, the service provider mechanism and memory leaks</h3><div class="text">
+
+<p><code>java.sql.DriverManager</code> supports the
+<a href="http://docs.oracle.com/javase/6/docs/api/index.html?java/sql/DriverManager.html">service
+provider</a> mechanism. This feature is that all the available JDBC drivers
+that announce themselves by providing a <code>META-INF/services/java.sql.Driver</code>
+file are automatically discovered, loaded and registered,
+relieving you from the need to load the database driver explicitly before
+you create a JDBC connection.
+However, the implementation is fundamentally broken in all Java versions for
+a servlet container environment. The problem is that
+<code>java.sql.DriverManager</code> will scan for the drivers only once.</p>
+
+<p>The <a href="config/listeners.html">JRE Memory Leak Prevention Listener</a>
+that is included with Apache Tomcat solves this by triggering the driver scan
+during Tomcat startup. This is enabled by default. It means that only
+libraries visible to the common class loader and its parents will be scanned for
+database drivers. This include drivers in <code>$CATALINA_HOME/lib</code>,
+<code>$CATALINA_BASE/lib</code>, the class path and (where the JRE supports it)
+the endorsed directory. Drivers packaged in web applications (in
+<code>WEB-INF/lib</code>) and in the shared class loader (where configured) will
+not be visible and will not be loaded automatically. If you are considering
+disabling this feature, note that the scan would be triggered by the first web
+application that is using JDBC, leading to failures when this web application is
+reloaded and for other web applications that rely on this feature.
+</p>
+
+<p>Thus, the web applications that have database drivers in their
+<code>WEB-INF/lib</code> directory cannot rely on the service provider
+mechanism and should register the drivers explicitly.</p>
+
+<p>The list of drivers in <code>java.sql.DriverManager</code> is also
+a known source of memory leaks. Any Drivers registered
+by a web application must be deregistered when the web application stops.
+Tomcat will attempt to automatically discover and deregister any
+JDBC drivers loaded by the web application class loader when the web
+application stops.
+However, it is expected that applications do this for themselves via
+a <code>ServletContextListener</code>.
+</p>
+
+</div><h3 id="Database_Connection_Pool_(DBCP_2)_Configurations">Database Connection Pool (DBCP 2) Configurations</h3><div class="text">
+
+<p>The default database connection pool implementation in Apache Tomcat
+relies on the libraries from the
+<a href="https://commons.apache.org/">Apache Commons</a> project.
+The following libraries are used:
+</p>
+
+<ul>
+<li>Commons DBCP 2</li>
+<li>Commons Pool 2</li>
+</ul>
+
+<p>
+These libraries are located in a single JAR at
+<code>$CATALINA_HOME/lib/tomcat-dbcp.jar</code>. However,
+only the classes needed for connection pooling have been included, and the
+packages have been renamed to avoid interfering with applications.
+</p>
+
+<p>DBCP 2 provides support for JDBC 4.1.</p>
+
+<div class="subsection"><h4 id="Installation">Installation</h4><div class="text">
+
+<p>See the <a href="https://commons.apache.org/dbcp/configuration.html">
+DBCP 2 documentation</a> for a complete list of configuration parameters.
+</p>
+
+</div></div>
+
+<div class="subsection"><h4 id="Preventing_database_connection_pool_leaks">Preventing database connection pool leaks</h4><div class="text">
+
+<p>
+A database connection pool creates and manages a pool of connections
+to a database. Recycling and reusing already existing connections
+to a database is more efficient than opening a new connection.
+</p>
+
+<p>
+There is one problem with connection pooling. A web application has
+to explicitly close ResultSet's, Statement's, and Connection's.
+Failure of a web application to close these resources can result in
+them never being available again for reuse, a database connection pool "leak".
+This can eventually result in your web application database connections failing
+if there are no more available connections.</p>
+
+<p>
+There is a solution to this problem. The Apache Commons DBCP 2 can be
+configured to track and recover these abandoned database connections. Not
+only can it recover them, but also generate a stack trace for the code
+which opened these resources and never closed them.</p>
+
+<p>
+To configure a DBCP 2 DataSource so that abandoned database connections are
+removed and recycled, add one or both of the following attributes to the
+<code>Resource</code> configuration for your DBCP 2 DataSource:
+</p>
+<div class="codeBox"><pre><code>removeAbandonedOnBorrow=true</code></pre></div>
+<div class="codeBox"><pre><code>removeAbandonedOnMaintenance=true</code></pre></div>
+<p> The default for both of these attributes is <code>false</code>. Note that
+<code>removeAbandonedOnMaintenance</code> has no effect unless pool
+maintenance is enabled by setting <code>timeBetweenEvictionRunsMillis</code>
+to a positive value. See the
+<a href="https://commons.apache.org/dbcp/configuration.html">
+DBCP 2 documentation</a> for full documentation on these attributes.
+</p>
+
+<p>
+Use the <code>removeAbandonedTimeout</code> attribute to set the number
+of seconds a database connection has been idle before it is considered abandoned.
+</p>
+
+<div class="codeBox"><pre><code>removeAbandonedTimeout="60"</code></pre></div>
+
+<p>
+The default timeout for removing abandoned connections is 300 seconds.
+</p>
+
+<p>
+The <code>logAbandoned</code> attribute can be set to <code>true</code>
+if you want DBCP 2 to log a stack trace of the code which abandoned the
+database connection resources.
+</p>
+<div class="codeBox"><pre><code>logAbandoned="true"</code></pre></div>
+<p>
+The default is <code>false</code>.
+</p>
+
+</div></div>
+
+<div class="subsection"><h4 id="MySQL_DBCP_2_Example">MySQL DBCP 2 Example</h4><div class="text">
+
+<h5>0. Introduction</h5>
+<p>Versions of <a href="https://www.mysql.com/products/mysql/index.html">MySQL</a> and JDBC
+drivers that have been reported to work:
+</p>
+<ul>
+<li>MySQL 3.23.47, MySQL 3.23.47 using InnoDB,, MySQL 3.23.58, MySQL 4.0.1alpha</li>
+<li><a href="https://www.mysql.com/products/connector-j">Connector/J</a> 3.0.11-stable (the official JDBC Driver)</li>
+<li><a href="http://mmmysql.sourceforge.net">mm.mysql</a> 2.0.14 (an old 3rd party JDBC Driver)</li>
+</ul>
+
+<p>Before you proceed, don't forget to copy the JDBC Driver's jar into <code>$CATALINA_HOME/lib</code>.</p>
+
+<h5>1. MySQL configuration</h5>
+<p>
+Ensure that you follow these instructions as variations can cause problems.
+</p>
+
+<p>Create a new test user, a new database and a single test table.
+Your MySQL user <strong>must</strong> have a password assigned. The driver
+will fail if you try to connect with an empty password.
+</p>
+<div class="codeBox"><pre><code>mysql> GRANT ALL PRIVILEGES ON *.* TO javauser@localhost
+ -> IDENTIFIED BY 'javadude' WITH GRANT OPTION;
+mysql> create database javatest;
+mysql> use javatest;
+mysql> create table testdata (
+ -> id int not null auto_increment primary key,
+ -> foo varchar(25),
+ -> bar int);</code></pre></div>
+<blockquote>
+<strong>Note:</strong> the above user should be removed once testing is
+complete!
+</blockquote>
+
+<p>Next insert some test data into the testdata table.
+</p>
+<div class="codeBox"><pre><code>mysql> insert into testdata values(null, 'hello', 12345);
+Query OK, 1 row affected (0.00 sec)
+
+mysql> select * from testdata;
++----+-------+-------+
+| ID | FOO | BAR |
++----+-------+-------+
+| 1 | hello | 12345 |
++----+-------+-------+
+1 row in set (0.00 sec)
+
+mysql></code></pre></div>
+
+<h5>2. Context configuration</h5>
+<p>Configure the JNDI DataSource in Tomcat by adding a declaration for your
+resource to your <a href="config/context.html">Context</a>.</p>
+<p>For example:</p>
+<div class="codeBox"><pre><code><Context>
+
+ <!-- maxTotal: Maximum number of database connections in pool. Make sure you
+ configure your mysqld max_connections large enough to handle
+ all of your db connections. Set to -1 for no limit.
+ -->
+
+ <!-- maxIdle: Maximum number of idle database connections to retain in pool.
+ Set to -1 for no limit. See also the DBCP 2 documentation on this
+ and the minEvictableIdleTimeMillis configuration parameter.
+ -->
+
+ <!-- maxWaitMillis: Maximum time to wait for a database connection to become available
+ in ms, in this example 10 seconds. An Exception is thrown if
+ this timeout is exceeded. Set to -1 to wait indefinitely.
+ -->
+
+ <!-- username and password: MySQL username and password for database connections -->
+
+ <!-- driverClassName: Class name for the old mm.mysql JDBC driver is
+ org.gjt.mm.mysql.Driver - we recommend using Connector/J though.
+ Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver.
+ -->
+
+ <!-- url: The JDBC connection url for connecting to your MySQL database.
+ -->
+
+ <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
+ maxTotal="100" maxIdle="30" maxWaitMillis="10000"
+ username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
+ url="jdbc:mysql://localhost:3306/javatest"/>
+
+</Context></code></pre></div>
+
+<h5>3. web.xml configuration</h5>
+
+<p>Now create a <code>WEB-INF/web.xml</code> for this test application.</p>
+<div class="codeBox"><pre><code><web-app xmlns="http://java.sun.com/xml/ns/j2ee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
+http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
+ version="2.4">
+ <description>MySQL Test App</description>
+ <resource-ref>
+ <description>DB Connection</description>
+ <res-ref-name>jdbc/TestDB</res-ref-name>
+ <res-type>javax.sql.DataSource</res-type>
+ <res-auth>Container</res-auth>
+ </resource-ref>
+</web-app></code></pre></div>
+
+<h5>4. Test code</h5>
+<p>Now create a simple <code>test.jsp</code> page for use later.</p>
+<div class="codeBox"><pre><code><%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<sql:query var="rs" dataSource="jdbc/TestDB">
+select id, foo, bar from testdata
+</sql:query>
+
+<html>
+ <head>
+ <title>DB Test</title>
+ </head>
+ <body>
+
+ <h2>Results</h2>
+
+<c:forEach var="row" items="${rs.rows}">
+ Foo ${row.foo}<br/>
+ Bar ${row.bar}<br/>
+</c:forEach>
+
+ </body>
+</html></code></pre></div>
+
+<p>That JSP page makes use of
+<a href="http://www.oracle.com/technetwork/java/index-jsp-135995.html">JSTL</a>'s
+SQL and Core taglibs. You can get it from
+<a href="https://tomcat.apache.org/taglibs/standard/">Apache Tomcat Taglibs - Standard Tag Library</a>
+project — just make sure you get a 1.1.x or later release. Once you have
+JSTL, copy <code>jstl.jar</code> and <code>standard.jar</code> to your web app's
+<code>WEB-INF/lib</code> directory.
+
+</p>
+
+<p>Finally deploy your web app into <code>$CATALINA_BASE/webapps</code> either
+as a warfile called <code>DBTest.war</code> or into a sub-directory called
+<code>DBTest</code></p>
+<p>Once deployed, point a browser at
+<code>http://localhost:8080/DBTest/test.jsp</code> to view the fruits of
+your hard work.</p>
+
+</div></div>
+
+<div class="subsection"><h4 id="Oracle_8i,_9i_&_10g">Oracle 8i, 9i & 10g</h4><div class="text">
+<h5>0. Introduction</h5>
+
+<p>Oracle requires minimal changes from the MySQL configuration except for the
+usual gotchas :-)</p>
+<p>Drivers for older Oracle versions may be distributed as *.zip files rather
+than *.jar files. Tomcat will only use <code>*.jar</code> files installed in
+<code>$CATALINA_HOME/lib</code>. Therefore <code>classes111.zip</code>
+or <code>classes12.zip</code> will need to be renamed with a <code>.jar</code>
+extension. Since jarfiles are zipfiles, there is no need to unzip and jar these
+files - a simple rename will suffice.</p>
+
+<p>For Oracle 9i onwards you should use <code>oracle.jdbc.OracleDriver</code>
+rather than <code>oracle.jdbc.driver.OracleDriver</code> as Oracle have stated
+that <code>oracle.jdbc.driver.OracleDriver</code> is deprecated and support
+for this driver class will be discontinued in the next major release.
+</p>
+
+<h5>1. Context configuration</h5>
+<p>In a similar manner to the mysql config above, you will need to define your
+Datasource in your <a href="config/context.html">Context</a>. Here we define a
+Datasource called myoracle using the thin driver to connect as user scott,
+password tiger to the sid called mysid. (Note: with the thin driver this sid is
+not the same as the tnsname). The schema used will be the default schema for the
+user scott.</p>
+
+<p>Use of the OCI driver should simply involve a changing thin to oci in the URL string.
+</p>
+<div class="codeBox"><pre><code><Resource name="jdbc/myoracle" auth="Container"
+ type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
+ url="jdbc:oracle:thin:@127.0.0.1:1521:mysid"
+ username="scott" password="tiger" maxTotal="20" maxIdle="10"
+ maxWaitMillis="-1"/></code></pre></div>
+
+<h5>2. web.xml configuration</h5>
+<p>You should ensure that you respect the element ordering defined by the DTD when you
+create you applications web.xml file.</p>
+<div class="codeBox"><pre><code><resource-ref>
+ <description>Oracle Datasource example</description>
+ <res-ref-name>jdbc/myoracle</res-ref-name>
+ <res-type>javax.sql.DataSource</res-type>
+ <res-auth>Container</res-auth>
+</resource-ref></code></pre></div>
+<h5>3. Code example</h5>
+<p>You can use the same example application as above (assuming you create the required DB
+instance, tables etc.) replacing the Datasource code with something like</p>
+<div class="codeBox"><pre><code>Context initContext = new InitialContext();
+Context envContext = (Context)initContext.lookup("java:/comp/env");
+DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
+Connection conn = ds.getConnection();
+//etc.</code></pre></div>
+</div></div>
+
+
+<div class="subsection"><h4 id="PostgreSQL">PostgreSQL</h4><div class="text">
+<h5>0. Introduction</h5>
+<p>PostgreSQL is configured in a similar manner to Oracle.</p>
+
+<h5>1. Required files </h5>
+<p>
+Copy the Postgres JDBC jar to $CATALINA_HOME/lib. As with Oracle, the
+jars need to be in this directory in order for DBCP 2's Classloader to find
+them. This has to be done regardless of which configuration step you take next.
+</p>
+
+<h5>2. Resource configuration</h5>
+
+<p>
+You have two choices here: define a datasource that is shared across all Tomcat
+applications, or define a datasource specifically for one application.
+</p>
+
+<h6>2a. Shared resource configuration</h6>
+<p>
+Use this option if you wish to define a datasource that is shared across
+multiple Tomcat applications, or if you just prefer defining your datasource
+in this file.
+</p>
+<p><i>This author has not had success here, although others have reported so.
+Clarification would be appreciated here.</i></p>
+
+<div class="codeBox"><pre><code><Resource name="jdbc/postgres" auth="Container"
+ type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
+ url="jdbc:postgresql://127.0.0.1:5432/mydb"
+ username="myuser" password="mypasswd" maxTotal="20" maxIdle="10" maxWaitMillis="-1"/></code></pre></div>
+<h6>2b. Application-specific resource configuration</h6>
+
+<p>
+Use this option if you wish to define a datasource specific to your application,
+not visible to other Tomcat applications. This method is less invasive to your
+Tomcat installation.
+</p>
+
+<p>
+Create a resource definition for your <a href="config/context.html">Context</a>.
+The Context element should look something like the following.
+</p>
+
+<div class="codeBox"><pre><code><Context>
+
+<Resource name="jdbc/postgres" auth="Container"
+ type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
+ url="jdbc:postgresql://127.0.0.1:5432/mydb"
+ username="myuser" password="mypasswd" maxTotal="20" maxIdle="10"
+maxWaitMillis="-1"/>
+</Context></code></pre></div>
+
+<h5>3. web.xml configuration</h5>
+<div class="codeBox"><pre><code><resource-ref>
+ <description>postgreSQL Datasource example</description>
+ <res-ref-name>jdbc/postgres</res-ref-name>
+ <res-type>javax.sql.DataSource</res-type>
+ <res-auth>Container</res-auth>
+</resource-ref></code></pre></div>
+
+<h5>4. Accessing the datasource</h5>
+<p>
+When accessing the datasource programmatically, remember to prepend
+<code>java:/comp/env</code> to your JNDI lookup, as in the following snippet of
+code. Note also that "jdbc/postgres" can be replaced with any value you prefer, provided
+you change it in the above resource definition file as well.
+</p>
+
+<div class="codeBox"><pre><code>InitialContext cxt = new InitialContext();
+if ( cxt == null ) {
+ throw new Exception("Uh oh -- no context!");
+}
+
+DataSource ds = (DataSource) cxt.lookup( "java:/comp/env/jdbc/postgres" );
+
+if ( ds == null ) {
+ throw new Exception("Data source not found!");
+}</code></pre></div>
+
+</div></div>
+</div><h3 id="Non-DBCP_Solutions">Non-DBCP Solutions</h3><div class="text">
+<p>
+These solutions either utilise a single connection to the database (not recommended for anything other
+than testing!) or some other pooling technology.
+</p>
+</div><h3 id="Oracle_8i_with_OCI_client">Oracle 8i with OCI client</h3><div class="text">
+<div class="subsection"><h4 id="Oracle_8i_with_OCI_client/Introduction">Introduction</h4><div class="text">
+<p>Whilst not strictly addressing the creation of a JNDI DataSource using the OCI client, these notes can be combined with the
+Oracle and DBCP 2 solution above.</p>
+<p>
+In order to use OCI driver, you should have an Oracle client installed. You should have installed
+Oracle8i(8.1.7) client from cd, and download the suitable JDBC/OCI
+driver(Oracle8i 8.1.7.1 JDBC/OCI Driver) from <a href="http://otn.oracle.com/">otn.oracle.com</a>.
+</p>
+<p>
+After renaming <code>classes12.zip</code> file to <code>classes12.jar</code>
+for Tomcat, copy it into <code>$CATALINA_HOME/lib</code>.
+You may also have to remove the <code>javax.sql.*</code> classes
+from this file depending upon the version of Tomcat and JDK you are using.
+</p>
+</div></div>
+
+<div class="subsection"><h4 id="Putting_it_all_together">Putting it all together</h4><div class="text">
+<p>
+Ensure that you have the <code>ocijdbc8.dll</code> or <code>.so</code> in your <code>$PATH</code> or <code>LD_LIBRARY_PATH</code>
+ (possibly in <code>$ORAHOME\bin</code>) and also confirm that the native library can be loaded by a simple test program
+using <code>System.loadLibrary("ocijdbc8");</code>
+</p>
+<p>
+You should next create a simple test servlet or JSP that has these
+<strong>critical lines</strong>:
+</p>
+<div class="codeBox"><pre><code>DriverManager.registerDriver(new
+oracle.jdbc.driver.OracleDriver());
+conn =
+DriverManager.getConnection("jdbc:oracle:oci8:@database","username","password");</code></pre></div>
+<p>
+where database is of the form <code>host:port:SID</code> Now if you try to access the URL of your
+test servlet/JSP and what you get is a
+<code>ServletException</code> with a root cause of <code>java.lang.UnsatisfiedLinkError:get_env_handle</code>.
+</p>
+<p>
+First, the <code>UnsatisfiedLinkError</code> indicates that you have
+</p>
+<ul>
+<li>a mismatch between your JDBC classes file and
+your Oracle client version. The giveaway here is the message stating that a needed library file cannot be
+found. For example, you may be using a classes12.zip file from Oracle Version 8.1.6 with a Version 8.1.5
+Oracle client. The classesXXX.zip file and Oracle client software versions must match.
+</li>
+<li>A <code>$PATH</code>, <code>LD_LIBRARY_PATH</code> problem.</li>
+<li>It has been reported that ignoring the driver you have downloaded from otn and using
+the classes12.zip file from the directory <code>$ORAHOME\jdbc\lib</code> will also work.
+</li>
+</ul>
+<p>
+Next you may experience the error <code>ORA-06401 NETCMN: invalid driver designator</code>
+</p>
+<p>
+The Oracle documentation says : "Cause: The login (connect) string contains an invalid
+driver designator. Action: Correct the string and re-submit."
+
+Change the database connect string (of the form <code>host:port:SID</code>) with this one:
+<code>(description=(address=(host=myhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))</code>
+</p>
+<p>
+<i>Ed. Hmm, I don't think this is really needed if you sort out your TNSNames - but I'm not an Oracle DBA :-)</i>
+</p>
+</div></div>
+</div><h3 id="Common_Problems">Common Problems</h3><div class="text">
+<p>Here are some common problems encountered with a web application which
+uses a database and tips for how to solve them.</p>
+
+<div class="subsection"><h4 id="Intermittent_Database_Connection_Failures">Intermittent Database Connection Failures</h4><div class="text">
+<p>
+Tomcat runs within a JVM. The JVM periodically performs garbage collection
+(GC) to remove java objects which are no longer being used. When the JVM
+performs GC execution of code within Tomcat freezes. If the maximum time
+configured for establishment of a database connection is less than the amount
+of time garbage collection took you can get a database connection failure.
+</p>
+
+<p>To collect data on how long garbage collection is taking add the
+<code>-verbose:gc</code> argument to your <code>CATALINA_OPTS</code>
+environment variable when starting Tomcat. When verbose gc is enabled
+your <code>$CATALINA_BASE/logs/catalina.out</code> log file will include
+data for every garbage collection including how long it took.</p>
+
+<p>When your JVM is tuned correctly 99% of the time a GC will take less
+than one second. The remainder will only take a few seconds. Rarely,
+if ever should a GC take more than 10 seconds.</p>
+
+<p>Make sure that the db connection timeout is set to 10-15 seconds.
+For DBCP 2 you set this using the parameter <code>maxWaitMillis</code>.</p>
+
+</div></div>
+
+<div class="subsection"><h4 id="Random_Connection_Closed_Exceptions">Random Connection Closed Exceptions</h4><div class="text">
+<p>
+These can occur when one request gets a db connection from the connection
+pool and closes it twice. When using a connection pool, closing the
+connection just returns it to the pool for reuse by another request,
+it doesn't close the connection. And Tomcat uses multiple threads to
+handle concurrent requests. Here is an example of the sequence
+of events which could cause this error in Tomcat:
+</p>
+<pre>
+ Request 1 running in Thread 1 gets a db connection.
+
+ Request 1 closes the db connection.
+
+ The JVM switches the running thread to Thread 2
+
+ Request 2 running in Thread 2 gets a db connection
+ (the same db connection just closed by Request 1).
+
+ The JVM switches the running thread back to Thread 1
+
+ Request 1 closes the db connection a second time in a finally block.
+
+ The JVM switches the running thread back to Thread 2
+
+ Request 2 Thread 2 tries to use the db connection but fails
+ because Request 1 closed it.
+</pre>
+<p>
+Here is an example of properly written code to use a database connection
+obtained from a connection pool:
+</p>
+<div class="codeBox"><pre><code> Connection conn = null;
+ Statement stmt = null; // Or PreparedStatement if needed
+ ResultSet rs = null;
+ try {
+ conn = ... get connection from connection pool ...
+ stmt = conn.createStatement("select ...");
+ rs = stmt.executeQuery();
+ ... iterate through the result set ...
+ rs.close();
+ rs = null;
+ stmt.close();
+ stmt = null;
+ conn.close(); // Return to connection pool
+ conn = null; // Make sure we don't close it twice
+ } catch (SQLException e) {
+ ... deal with errors ...
+ } finally {
+ // Always make sure result sets and statements are closed,
+ // and the connection is returned to the pool
+ if (rs != null) {
+ try { rs.close(); } catch (SQLException e) { ; }
+ rs = null;
+ }
+ if (stmt != null) {
+ try { stmt.close(); } catch (SQLException e) { ; }
+ stmt = null;
+ }
+ if (conn != null) {
+ try { conn.close(); } catch (SQLException e) { ; }
+ conn = null;
+ }
+ }</code></pre></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="Context_versus_GlobalNamingResources">Context versus GlobalNamingResources</h4><div class="text">
+<p>
+ Please note that although the above instructions place the JNDI declarations in a Context
+ element, it is possible and sometimes desirable to place these declarations in the
+ <a href="config/globalresources.html">GlobalNamingResources</a> section of the server
+ configuration file. A resource placed in the GlobalNamingResources section will be shared
+ among the Contexts of the server.
+</p>
+</div></div>
+
+<div class="subsection"><h4 id="JNDI_Resource_Naming_and_Realm_Interaction">JNDI Resource Naming and Realm Interaction</h4><div class="text">
+<p>
+ In order to get Realms to work, the realm must refer to the datasource as
+ defined in the <GlobalNamingResources> or <Context> section, not a datasource as renamed
+ using <ResourceLink>.
+</p>
+</div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/jndi-resources-howto.html b/web/tomcat/webapps/docs/jndi-resources-howto.html
new file mode 100644
index 0000000..fc97462
--- /dev/null
+++ b/web/tomcat/webapps/docs/jndi-resources-howto.html
@@ -0,0 +1,1024 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - JNDI Resources How-To</title><meta name="author" content="Craig R. McClanahan"><meta name="author" content="Yoav Shapira"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>JNDI Resources How-To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#web.xml_configuration">web.xml configuration</a></li><li><a href="#context.xml_configuration">context.xml configuration</a></li><li><a href="#Global_configuration">Global configuration</a></li><li><a href="#Using_resources">Using resources</a></li><li><a href="#Tomcat_Standard_Resource_Factories">Tomcat Standard Resource Factories</a><ol><li><a href="#Generic_JavaBean_Resources">Generic JavaBean Resources</a></li><li><a href="#UserDatabase_Resources">UserDatabase Resources</a></li><li><a href="#JavaMail_Sessions">JavaMail Sessions</a></li><li><a href="#JDBC_Data_Sources">JDBC Data Sources</a></li></ol></li><li><a href="#Adding_Custom_Resource_Factories">Adding Custom Resource Factories</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+<p>Tomcat provides a JNDI <strong>InitialContext</strong> implementation
+instance for each web application running under it, in a manner that is
+compatible with those provided by a
+<a href="http://www.oracle.com/technetwork/java/javaee/overview/index.html">
+Java Enterprise Edition</a> application server. The Java EE standard provides
+a standard set of elements in the <code>/WEB-INF/web.xml</code> file to
+reference/define resources.</p>
+
+<p>See the following Specifications for more information about programming APIs
+for JNDI, and for the features supported by Java Enterprise Edition (Java EE)
+servers, which Tomcat emulates for the services that it provides:</p>
+<ul>
+<li><a href="http://docs.oracle.com/javase/7/docs/technotes/guides/jndi/index.html">
+ Java Naming and Directory Interface</a> (included in JDK 1.4 onwards)</li>
+<li><a href="http://www.oracle.com/technetwork/java/javaee/documentation/index.html">
+ Java EE Platform Specification</a> (in particular, see Chapter 5 on <em>Naming</em>)</li>
+</ul>
+
+</div><h3 id="web.xml_configuration">web.xml configuration</h3><div class="text">
+
+<p>The following elements may be used in the web application deployment
+descriptor (<code>/WEB-INF/web.xml</code>) of your web application to define
+resources:</p>
+<ul>
+<li><code><strong><env-entry></strong></code> - Environment entry, a
+ single-value parameter that can be used to configure how the application
+ will operate.</li>
+<li><code><strong><resource-ref></strong></code> - Resource reference,
+ which is typically to an object factory for resources such as a JDBC
+ <code>DataSource</code>, a JavaMail <code>Session</code>, or custom
+ object factories configured into Tomcat.</li>
+<li><code><strong><resource-env-ref></strong></code> - Resource
+ environment reference, a new variation of <code>resource-ref</code>
+ added in Servlet 2.4 that is simpler to configure for resources
+ that do not require authentication information.</li>
+</ul>
+
+<p>Providing that Tomcat is able to identify an appropriate resource factory to
+use to create the resource and that no further configuration information is
+required, Tomcat will use the information in <code>/WEB-INF/web.xml</code> to
+create the resource.</p>
+
+<p>Tomcat provides a number of Tomcat specific options for JNDI resources that
+cannot be specified in web.xml. These include <code>closeMethod</code> that
+enables faster cleaning-up of JNDI resources when a web application stops and
+<code>singleton</code> that controls whether or not a new instance of the
+resource is created for every JNDI lookup. To use these configuration options
+the resource must be specified in a web application's
+<a href="config/context.html"><code><Context></code></a> element or in the
+<a href="config/globalresources.html">
+<code><strong><GlobalNamingResources></strong></code></a> element of
+<code>$CATALINA_BASE/conf/server.xml</code>.</p>
+
+</div><h3 id="context.xml_configuration">context.xml configuration</h3><div class="text">
+
+<p>If Tomcat is unable to identify the appropriate resource factory and/or
+additional configuration information is required, additional Tomcat specific
+configuration must be specified before Tomcat can create the resource.
+Tomcat specific resource configuration is entered in
+the <a href="config/context.html"><code><Context></code></a> elements that
+can be specified in either <code>$CATALINA_BASE/conf/server.xml</code> or,
+preferably, the per-web-application context XML file
+(<code>META-INF/context.xml</code>).</p>
+
+<p>Tomcat specific resource configuration is performed using the following
+elements in the <a href="config/context.html"><code><Context></code></a>
+element:</p>
+
+<ul>
+<li><a href="config/context.html#Environment_Entries"><Environment></a> -
+ Configure names and values for scalar environment entries that will be
+ exposed to the web application through the JNDI
+ <code>InitialContext</code> (equivalent to the inclusion of an
+ <code><env-entry></code> element in the web application
+ deployment descriptor).</li>
+<li><a href="config/context.html#Resource_Definitions"><Resource></a> -
+ Configure the name and data type of a resource made available to the
+ application (equivalent to the inclusion of a
+ <code><resource-ref></code> element in the web application
+ deployment descriptor).</li>
+<li><a href="config/context.html#Resource_Links"><ResourceLink></a> -
+ Add a link to a resource defined in the global JNDI context. Use resource
+ links to give a web application access to a resource defined in
+ the <a href="config/globalresources.html"><GlobalNamingResources></a>
+ child element of the <a href="config/server.html"><Server></a>
+ element.</li>
+<li><a href="config/context.html#Transaction"><Transaction></a> -
+ Add a resource factory for instantiating the UserTransaction object
+ instance that is available at <code>java:comp/UserTransaction</code>.</li>
+
+</ul>
+
+<p>Any number of these elements may be nested inside a
+<a href="config/context.html"><code><Context></code></a> element and will
+be associated only with that particular web application.</p>
+
+<p>If a resource has been defined in a
+<a href="config/context.html"><code><Context></code></a> element it is not
+necessary for that resource to be defined in <code>/WEB-INF/web.xml</code>.
+However, it is recommended to keep the entry in <code>/WEB-INF/web.xml</code>
+to document the resource requirements for the web application.</p>
+
+<p>Where the same resource name has been defined for a
+<code><env-entry></code> element included in the web application
+deployment descriptor (<code>/WEB-INF/web.xml</code>) and in an
+<code><Environment></code> element as part of the
+<a href="config/context.html"><code><Context></code></a> element for the
+web application, the values in the deployment descriptor will take precedence
+<strong>only</strong> if allowed by the corresponding
+<code><Environment></code> element (by setting the <code>override</code>
+attribute to "true").</p>
+
+</div><h3 id="Global_configuration">Global configuration</h3><div class="text">
+
+<p>Tomcat maintains a separate namespace of global resources for the
+entire server. These are configured in the
+<a href="config/globalresources.html">
+<code><strong><GlobalNamingResources></strong></code></a> element of
+<code>$CATALINA_BASE/conf/server.xml</code>. You may expose these resources to
+web applications by using a
+<a href="config/context.html#Resource_Links"><ResourceLink></a> to
+include it in the per-web-application context.</p>
+
+<p>If a resource has been defined using a
+<a href="config/context.html#Resource_Links"><ResourceLink></a>, it is not
+necessary for that resource to be defined in <code>/WEB-INF/web.xml</code>.
+However, it is recommended to keep the entry in <code>/WEB-INF/web.xml</code>
+to document the resource requirements for the web application.</p>
+
+</div><h3 id="Using_resources">Using resources</h3><div class="text">
+
+<p>The <code>InitialContext</code> is configured as a web application is
+initially deployed, and is made available to web application components (for
+read-only access). All configured entries and resources are placed in
+the <code>java:comp/env</code> portion of the JNDI namespace, so a typical
+access to a resource - in this case, to a JDBC <code>DataSource</code> -
+would look something like this:</p>
+
+<div class="codeBox"><pre><code>// Obtain our environment naming context
+Context initCtx = new InitialContext();
+Context envCtx = (Context) initCtx.lookup("java:comp/env");
+
+// Look up our data source
+DataSource ds = (DataSource)
+ envCtx.lookup("jdbc/EmployeeDB");
+
+// Allocate and use a connection from the pool
+Connection conn = ds.getConnection();
+... use this connection to access the database ...
+conn.close();</code></pre></div>
+
+</div><h3 id="Tomcat_Standard_Resource_Factories">Tomcat Standard Resource Factories</h3><div class="text">
+
+ <p>Tomcat includes a series of standard resource factories that can
+ provide services to your web applications, but give you configuration
+ flexibility (via the
+ <a href="config/context.html"><code><Context></code></a> element)
+ without modifying the web application or the deployment descriptor. Each
+ subsection below details the configuration and usage of the standard resource
+ factories.</p>
+
+ <p>See <a href="#Adding_Custom_Resource_Factories">Adding Custom
+ Resource Factories</a> for information about how to create, install,
+ configure, and use your own custom resource factory classes with
+ Tomcat.</p>
+
+ <p><em>NOTE</em> - Of the standard resource factories, only the
+ "JDBC Data Source" and "User Transaction" factories are mandated to
+ be available on other platforms, and then they are required only if
+ the platform implements the Java Enterprise Edition (Java EE) specs.
+ All other standard resource factories, plus custom resource factories
+ that you write yourself, are specific to Tomcat and cannot be assumed
+ to be available on other containers.</p>
+
+ <div class="subsection"><h4 id="Generic_JavaBean_Resources">Generic JavaBean Resources</h4><div class="text">
+
+ <h5>0. Introduction</h5>
+
+ <p>This resource factory can be used to create objects of <em>any</em>
+ Java class that conforms to standard JavaBeans naming conventions (i.e.
+ it has a zero-arguments constructor, and has property setters that
+ conform to the setFoo() naming pattern. The resource factory will
+ only create a new instance of the appropriate bean class every time a
+ <code>lookup()</code> for this entry is made if the <code>singleton</code>
+ attribute of the factory is set to <code>false</code>.</p>
+
+ <p>The steps required to use this facility are described below.</p>
+
+ <h5>1. Create Your JavaBean Class</h5>
+
+ <p>Create the JavaBean class which will be instantiated each time
+ that the resource factory is looked up. For this example, assume
+ you create a class <code>com.mycompany.MyBean</code>, which looks
+ like this:</p>
+
+<div class="codeBox"><pre><code>package com.mycompany;
+
+public class MyBean {
+
+ private String foo = "Default Foo";
+
+ public String getFoo() {
+ return (this.foo);
+ }
+
+ public void setFoo(String foo) {
+ this.foo = foo;
+ }
+
+ private int bar = 0;
+
+ public int getBar() {
+ return (this.bar);
+ }
+
+ public void setBar(int bar) {
+ this.bar = bar;
+ }
+
+
+}</code></pre></div>
+
+ <h5>2. Declare Your Resource Requirements</h5>
+
+ <p>Next, modify your web application deployment descriptor
+ (<code>/WEB-INF/web.xml</code>) to declare the JNDI name under which
+ you will request new instances of this bean. The simplest approach is
+ to use a <code><resource-env-ref></code> element, like this:</p>
+
+<div class="codeBox"><pre><code><resource-env-ref>
+ <description>
+ Object factory for MyBean instances.
+ </description>
+ <resource-env-ref-name>
+ bean/MyBeanFactory
+ </resource-env-ref-name>
+ <resource-env-ref-type>
+ com.mycompany.MyBean
+ </resource-env-ref-type>
+</resource-env-ref></code></pre></div>
+
+ <p><strong>WARNING</strong> - Be sure you respect the element ordering
+ that is required by the DTD for web application deployment descriptors!
+ See the
+ <a href="https://wiki.apache.org/tomcat/Specifications">Servlet
+ Specification</a> for details.</p>
+
+ <h5>3. Code Your Application's Use Of This Resource</h5>
+
+ <p>A typical use of this resource environment reference might look
+ like this:</p>
+
+<div class="codeBox"><pre><code>Context initCtx = new InitialContext();
+Context envCtx = (Context) initCtx.lookup("java:comp/env");
+MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory");
+
+writer.println("foo = " + bean.getFoo() + ", bar = " +
+ bean.getBar());</code></pre></div>
+
+ <h5>4. Configure Tomcat's Resource Factory</h5>
+
+ <p>To configure Tomcat's resource factory, add an element like this to the
+ <a href="config/context.html"><code><Context></code></a> element for
+ this web application.</p>
+
+<div class="codeBox"><pre><code><Context ...>
+ ...
+ <Resource name="bean/MyBeanFactory" auth="Container"
+ type="com.mycompany.MyBean"
+ factory="org.apache.naming.factory.BeanFactory"
+ bar="23"/>
+ ...
+</Context></code></pre></div>
+
+ <p>Note that the resource name (here, <code>bean/MyBeanFactory</code>
+ must match the value specified in the web application deployment
+ descriptor. We are also initializing the value of the <code>bar</code>
+ property, which will cause <code>setBar(23)</code> to be called before
+ the new bean is returned. Because we are not initializing the
+ <code>foo</code> property (although we could have), the bean will
+ contain whatever default value is set up by its constructor.</p>
+
+ <p>Some beans have properties with types that cannot automatically be
+ converted from a string value. Setting such properties using the Tomcat
+ BeanFactory will fail with a NamingException. In cases were those beans
+ provide methods to set the properties from a string value, the Tomcat
+ BeanFactory can be configured to use these methods. The configuration is
+ done with the <code>forceString</code> attribute.</p>
+
+ <p>Assume our bean looks like this:</p>
+
+<div class="codeBox"><pre><code>package com.mycompany;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+public class MyBean2 {
+
+ private InetAddress local = null;
+
+ public InetAddress getLocal() {
+ return local;
+ }
+
+ public void setLocal(InetAddress ip) {
+ local = ip;
+ }
+
+ public void setLocal(String localHost) {
+ try {
+ local = InetAddress.getByName(localHost);
+ } catch (UnknownHostException ex) {
+ }
+ }
+
+ private InetAddress remote = null;
+
+ public InetAddress getRemote() {
+ return remote;
+ }
+
+ public void setRemote(InetAddress ip) {
+ remote = ip;
+ }
+
+ public void host(String remoteHost) {
+ try {
+ remote = InetAddress.getByName(remoteHost);
+ } catch (UnknownHostException ex) {
+ }
+ }
+
+}</code></pre></div>
+
+ <p>The bean has two properties, both are of type <code>InetAddress</code>.
+ The first property <code>local</code> has an additional setter taking a
+ string argument. By default the Tomcat BeanFactory would try to use the
+ automatically detected setter with the same argument type as the property
+ type and then throw a NamingException, because it is not prepared to convert
+ the given string attribute value to <code>InetAddress</code>.
+ We can tell the Tomcat BeanFactory to use the other setter like that:</p>
+
+<div class="codeBox"><pre><code><Context ...>
+ ...
+ <Resource name="bean/MyBeanFactory" auth="Container"
+ type="com.mycompany.MyBean2"
+ factory="org.apache.naming.factory.BeanFactory"
+ forceString="local"
+ local="localhost"/>
+ ...
+</Context></code></pre></div>
+
+ <p>The bean property <code>remote</code> can also be set from a string,
+ but one has to use the non-standard method name <code>host</code>.
+ To set <code>local</code> and <code>remote</code> use the following
+ configuration:</p>
+
+<div class="codeBox"><pre><code><Context ...>
+ ...
+ <Resource name="bean/MyBeanFactory" auth="Container"
+ type="com.mycompany.MyBean2"
+ factory="org.apache.naming.factory.BeanFactory"
+ forceString="local,remote=host"
+ local="localhost"
+ remote="tomcat.apache.org"/>
+ ...
+</Context></code></pre></div>
+
+ <p>Multiple property descriptions can be combined in
+ <code>forceString</code> by concatenation with comma as a separator.
+ Each property description consists of either only the property name
+ in which case the BeanFactory calls the setter method. Or it consist
+ of <code>name=method</code> in which case the property named
+ <code>name</code> is set by calling method <code>method</code>.
+ For properties of types <code>String</code> or of primitive type
+ or of their associated primitive wrapper classes using
+ <code>forceString</code> is not needed. The correct setter will be
+ automatically detected and argument conversion will be applied.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="UserDatabase_Resources">UserDatabase Resources</h4><div class="text">
+
+ <h5>0. Introduction</h5>
+
+ <p>UserDatabase resources are typically configured as global resources for
+ use by a UserDatabase realm. Tomcat includes a UserDatabaseFactory that
+ creates UserDatabase resources backed by an XML file - usually
+ <code>tomcat-users.xml</code></p>
+
+ <p>The steps required to set up a global UserDatabase resource are described
+ below.</p>
+
+ <h5>1. Create/edit the XML file</h5>
+
+ <p>The XML file is typically located at
+ <code>$CATALINA_BASE/conf/tomcat-users.xml</code> however, you are free to
+ locate the file anywhere on the file system. It is recommended that the XML
+ files are placed in <code>$CATALINA_BASE/conf</code>. A typical XML would
+ look like:</p>
+
+<div class="codeBox"><pre><code><?xml version="1.0" encoding="UTF-8"?>
+<tomcat-users>
+ <role rolename="tomcat"/>
+ <role rolename="role1"/>
+ <user username="tomcat" password="tomcat" roles="tomcat"/>
+ <user username="both" password="tomcat" roles="tomcat,role1"/>
+ <user username="role1" password="tomcat" roles="role1"/>
+</tomcat-users></code></pre></div>
+
+ <h5>2. Declare Your Resource</h5>
+
+ <p>Next, modify <code>$CATALINA_BASE/conf/server.xml</code> to create the
+ UserDatabase resource based on your XML file. It should look something like
+ this:</p>
+
+<div class="codeBox"><pre><code><Resource name="UserDatabase"
+ auth="Container"
+ type="org.apache.catalina.UserDatabase"
+ description="User database that can be updated and saved"
+ factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
+ pathname="conf/tomcat-users.xml"
+ readonly="false" /></code></pre></div>
+
+ <p>The <code>pathname</code> attribute can be a URL, an absolute path or a
+ relative path. If relative, it is relative to <code>$CATALINA_BASE</code>.
+ </p>
+
+ <p>The <code>readonly</code> attribute is optional and defaults to
+ <code>true</code> if not supplied. If the XML is writeable then it will be
+ written to when Tomcat starts. <strong>WARNING:</strong> When the file is
+ written it will inherit the default file permissions for the user Tomcat
+ is running as. Ensure that these are appropriate to maintain the security
+ of your installation.</p>
+
+ <p>If referenced in a Realm, the UserDatabase will, by default, monitor
+ <code>pathname</code> for changes and reload the file if a change in the
+ last modified time is observed. This can be disabled by setting the
+ <code>watchSource</code> attribute to <code>false</code>.
+ </p>
+
+ <h5>3. Configure the Realm</h5>
+
+ <p>Configure a UserDatabase Realm to use this resource as described in the
+ <a href="config/realm.html">Realm configuration documentation</a>.</p>
+
+ </div></div>
+
+
+ <div class="subsection"><h4 id="JavaMail_Sessions">JavaMail Sessions</h4><div class="text">
+
+ <h5>0. Introduction</h5>
+
+ <p>In many web applications, sending electronic mail messages is a
+ required part of the system's functionality. The
+ <a href="http://www.oracle.com/technetwork/java/javamail/index.html">Java Mail</a> API
+ makes this process relatively straightforward, but requires many
+ configuration details that the client application must be aware of
+ (including the name of the SMTP host to be used for message sending).</p>
+
+ <p>Tomcat includes a standard resource factory that will create
+ <code>javax.mail.Session</code> session instances for you, already
+ configured to connect to an SMTP server.
+ In this way, the application is totally insulated from changes in the
+ email server configuration environment - it simply asks for, and receives,
+ a preconfigured session whenever needed.</p>
+
+ <p>The steps required for this are outlined below.</p>
+
+ <h5>1. Declare Your Resource Requirements</h5>
+
+ <p>The first thing you should do is modify the web application deployment
+ descriptor (<code>/WEB-INF/web.xml</code>) to declare the JNDI name under
+ which you will look up preconfigured sessions. By convention, all such
+ names should resolve to the <code>mail</code> subcontext (relative to the
+ standard <code>java:comp/env</code> naming context that is the root of
+ all provided resource factories. A typical <code>web.xml</code> entry
+ might look like this:</p>
+<div class="codeBox"><pre><code><resource-ref>
+ <description>
+ Resource reference to a factory for javax.mail.Session
+ instances that may be used for sending electronic mail
+ messages, preconfigured to connect to the appropriate
+ SMTP server.
+ </description>
+ <res-ref-name>
+ mail/Session
+ </res-ref-name>
+ <res-type>
+ javax.mail.Session
+ </res-type>
+ <res-auth>
+ Container
+ </res-auth>
+</resource-ref></code></pre></div>
+
+ <p><strong>WARNING</strong> - Be sure you respect the element ordering
+ that is required by the DTD for web application deployment descriptors!
+ See the
+ <a href="https://wiki.apache.org/tomcat/Specifications">Servlet
+ Specification</a> for details.</p>
+
+ <h5>2. Code Your Application's Use Of This Resource</h5>
+
+ <p>A typical use of this resource reference might look like this:</p>
+<div class="codeBox"><pre><code>Context initCtx = new InitialContext();
+Context envCtx = (Context) initCtx.lookup("java:comp/env");
+Session session = (Session) envCtx.lookup("mail/Session");
+
+Message message = new MimeMessage(session);
+message.setFrom(new InternetAddress(request.getParameter("from")));
+InternetAddress to[] = new InternetAddress[1];
+to[0] = new InternetAddress(request.getParameter("to"));
+message.setRecipients(Message.RecipientType.TO, to);
+message.setSubject(request.getParameter("subject"));
+message.setContent(request.getParameter("content"), "text/plain");
+Transport.send(message);</code></pre></div>
+
+ <p>Note that the application uses the same resource reference name
+ that was declared in the web application deployment descriptor. This
+ is matched up against the resource factory that is configured in the
+ <a href="config/context.html"><code><Context></code></a> element
+ for the web application as described below.</p>
+
+ <h5>3. Configure Tomcat's Resource Factory</h5>
+
+ <p>To configure Tomcat's resource factory, add an elements like this to the
+ <a href="config/context.html"><code><Context></code></a> element for
+ this web application.</p>
+
+<div class="codeBox"><pre><code><Context ...>
+ ...
+ <Resource name="mail/Session" auth="Container"
+ type="javax.mail.Session"
+ mail.smtp.host="localhost"/>
+ ...
+</Context></code></pre></div>
+
+ <p>Note that the resource name (here, <code>mail/Session</code>) must
+ match the value specified in the web application deployment descriptor.
+ Customize the value of the <code>mail.smtp.host</code> parameter to
+ point at the server that provides SMTP service for your network.</p>
+
+ <p>Additional resource attributes and values will be converted to properties
+ and values and passed to
+ <code>javax.mail.Session.getInstance(java.util.Properties)</code> as part of
+ the <code>java.util.Properties</code> collection. In addition to the
+ properties defined in Annex A of the JavaMail specification, individual
+ providers may also support additional properties.
+ </p>
+
+ <p>If the resource is configured with a <code>password</code> attribute and
+ either a <code>mail.smtp.user</code> or <code>mail.user</code> attribute
+ then Tomcat's resource factory will configure and add a
+ <code>javax.mail.Authenticator</code> to the mail session.</p>
+
+ <h5>4. Install the JavaMail libraries</h5>
+
+ <p><a href="http://javamail.java.net/">
+ Download the JavaMail API</a>.</p>
+
+ <p>Unpackage the distribution and place mail.jar into $CATALINA_HOME/lib so
+ that it is available to Tomcat during the initialization of the mail Session
+ Resource. <strong>Note:</strong> placing this jar in both $CATALINA_HOME/lib
+ and a web application's lib folder will cause an error, so ensure you have
+ it in the $CATALINA_HOME/lib location only.
+ </p>
+
+ <h5>5. Restart Tomcat</h5>
+
+ <p>For the additional JAR to be visible to Tomcat, it is necessary for the
+ Tomcat instance to be restarted.</p>
+
+
+ <h5>Example Application</h5>
+
+ <p>The <code>/examples</code> application included with Tomcat contains
+ an example of utilizing this resource factory. It is accessed via the
+ "JSP Examples" link. The source code for the servlet that actually
+ sends the mail message is in
+ <code>/WEB-INF/classes/SendMailServlet.java</code>.</p>
+
+ <p><strong>WARNING</strong> - The default configuration assumes that there
+ is an SMTP server listing on port 25 on <code>localhost</code>. If this is
+ not the case, edit the
+ <a href="config/context.html"><code><Context></code></a> element for
+ this web application and modify the parameter value for the
+ <code>mail.smtp.host</code> parameter to be the host name of an SMTP server
+ on your network.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="JDBC_Data_Sources">JDBC Data Sources</h4><div class="text">
+
+ <h5>0. Introduction</h5>
+
+ <p>Many web applications need to access a database via a JDBC driver,
+ to support the functionality required by that application. The Java EE
+ Platform Specification requires Java EE Application Servers to make
+ available a <em>DataSource</em> implementation (that is, a connection
+ pool for JDBC connections) for this purpose. Tomcat offers exactly
+ the same support, so that database-based applications you develop on
+ Tomcat using this service will run unchanged on any Java EE server.</p>
+
+ <p>For information about JDBC, you should consult the following:</p>
+ <ul>
+ <li><a href="http://www.oracle.com/technetwork/java/javase/jdbc/index.html">
+ http://www.oracle.com/technetwork/java/javase/jdbc/index.html</a> -
+ Home page for information about Java Database Connectivity.</li>
+ <li><a href="http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame.html">http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame.html</a> -
+ The JDBC 2.1 API Specification.</li>
+ <li><a href="http://java.sun.com/products/jdbc/jdbc20.stdext.pdf">http://java.sun.com/products/jdbc/jdbc20.stdext.pdf</a> -
+ The JDBC 2.0 Standard Extension API (including the
+ <code>javax.sql.DataSource</code> API). This package is now known
+ as the "JDBC Optional Package".</li>
+ <li><a href="http://www.oracle.com/technetwork/java/javaee/overview/index.htm">
+ http://www.oracle.com/technetwork/java/javaee/overview/index.htm</a> -
+ The Java EE Platform Specification (covers the JDBC facilities that
+ all Java EE platforms must provide to applications).</li>
+ </ul>
+
+ <p><strong>NOTE</strong> - The default data source support in Tomcat
+ is based on the <strong>DBCP 2</strong> connection pool from the
+ <a href="https://commons.apache.org/">Commons</a>
+ project. However, it is possible to use any other connection pool
+ that implements <code>javax.sql.DataSource</code>, by writing your
+ own custom resource factory, as described
+ <a href="#Adding_Custom_Resource_Factories">below</a>.</p>
+
+ <h5>1. Install Your JDBC Driver</h5>
+
+ <p>Use of the <em>JDBC Data Sources</em> JNDI Resource Factory requires
+ that you make an appropriate JDBC driver available to both Tomcat internal
+ classes and to your web application. This is most easily accomplished by
+ installing the driver's JAR file(s) into the
+ <code>$CATALINA_HOME/lib</code> directory, which makes the driver
+ available both to the resource factory and to your application.</p>
+
+ <h5>2. Declare Your Resource Requirements</h5>
+
+ <p>Next, modify the web application deployment descriptor
+ (<code>/WEB-INF/web.xml</code>) to declare the JNDI name under
+ which you will look up preconfigured data source. By convention, all such
+ names should resolve to the <code>jdbc</code> subcontext (relative to the
+ standard <code>java:comp/env</code> naming context that is the root of
+ all provided resource factories. A typical <code>web.xml</code> entry
+ might look like this:</p>
+<div class="codeBox"><pre><code><resource-ref>
+ <description>
+ Resource reference to a factory for java.sql.Connection
+ instances that may be used for talking to a particular
+ database that is configured in the <Context>
+ configuration for the web application.
+ </description>
+ <res-ref-name>
+ jdbc/EmployeeDB
+ </res-ref-name>
+ <res-type>
+ javax.sql.DataSource
+ </res-type>
+ <res-auth>
+ Container
+ </res-auth>
+</resource-ref></code></pre></div>
+
+ <p><strong>WARNING</strong> - Be sure you respect the element ordering
+ that is required by the DTD for web application deployment descriptors!
+ See the
+ <a href="https://wiki.apache.org/tomcat/Specifications">Servlet
+ Specification</a> for details.</p>
+
+ <h5>3. Code Your Application's Use Of This Resource</h5>
+
+ <p>A typical use of this resource reference might look like this:</p>
+<div class="codeBox"><pre><code>Context initCtx = new InitialContext();
+Context envCtx = (Context) initCtx.lookup("java:comp/env");
+DataSource ds = (DataSource)
+ envCtx.lookup("jdbc/EmployeeDB");
+
+Connection conn = ds.getConnection();
+... use this connection to access the database ...
+conn.close();</code></pre></div>
+
+ <p>Note that the application uses the same resource reference name that was
+ declared in the web application deployment descriptor. This is matched up
+ against the resource factory that is configured in the
+ <a href="config/context.html"><code><Context></code></a> element for
+ the web application as described below.</p>
+
+ <h5>4. Configure Tomcat's Resource Factory</h5>
+
+ <p>To configure Tomcat's resource factory, add an element like this to the
+ <a href="config/context.html"><code><Context></code></a> element for
+ the web application.</p>
+
+<div class="codeBox"><pre><code><Context ...>
+ ...
+ <Resource name="jdbc/EmployeeDB"
+ auth="Container"
+ type="javax.sql.DataSource"
+ username="dbusername"
+ password="dbpassword"
+ driverClassName="org.hsql.jdbcDriver"
+ url="jdbc:HypersonicSQL:database"
+ maxTotal="8"
+ maxIdle="4"/>
+ ...
+</Context></code></pre></div>
+
+ <p>Note that the resource name (here, <code>jdbc/EmployeeDB</code>) must
+ match the value specified in the web application deployment descriptor.</p>
+
+ <p>This example assumes that you are using the HypersonicSQL database
+ JDBC driver. Customize the <code>driverClassName</code> and
+ <code>driverName</code> parameters to match your actual database's
+ JDBC driver and connection URL.</p>
+
+ <p>The configuration properties for Tomcat's standard data source
+ resource factory
+ (<code>org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory</code>) are
+ as follows:</p>
+ <ul>
+ <li><strong>driverClassName</strong> - Fully qualified Java class name
+ of the JDBC driver to be used.</li>
+ <li><strong>username</strong> - Database username to be passed to our
+ JDBC driver.</li>
+ <li><strong>password</strong> - Database password to be passed to our
+ JDBC driver.</li>
+ <li><strong>url</strong> - Connection URL to be passed to our JDBC driver.
+ (For backwards compatibility, the property <code>driverName</code>
+ is also recognized.)</li>
+ <li><strong>initialSize</strong> - The initial number of connections
+ that will be created in the pool during pool initialization. Default: 0</li>
+ <li><strong>maxTotal</strong> - The maximum number of connections
+ that can be allocated from this pool at the same time. Default: 8</li>
+ <li><strong>minIdle</strong> - The minimum number of connections that
+ will sit idle in this pool at the same time. Default: 0</li>
+ <li><strong>maxIdle</strong> - The maximum number of connections that
+ can sit idle in this pool at the same time. Default: 8</li>
+ <li><strong>maxWaitMillis</strong> - The maximum number of milliseconds that the
+ pool will wait (when there are no available connections) for a
+ connection to be returned before throwing an exception. Default: -1 (infinite)</li>
+ </ul>
+ <p>Some additional properties handle connection validation:</p>
+ <ul>
+ <li><strong>validationQuery</strong> - SQL query that can be used by the
+ pool to validate connections before they are returned to the
+ application. If specified, this query MUST be an SQL SELECT
+ statement that returns at least one row.</li>
+ <li><strong>validationQueryTimeout</strong> - Timeout in seconds
+ for the validation query to return. Default: -1 (infinite)</li>
+ <li><strong>testOnBorrow</strong> - true or false: whether a connection
+ should be validated using the validation query each time it is
+ borrowed from the pool. Default: true</li>
+ <li><strong>testOnReturn</strong> - true or false: whether a connection
+ should be validated using the validation query each time it is
+ returned to the pool. Default: false</li>
+ </ul>
+ <p>The optional evictor thread is responsible for shrinking the pool
+ by removing any connections which are idle for a long time. The evictor
+ does not respect <code>minIdle</code>. Note that you do not need to
+ activate the evictor thread if you only want the pool to shrink according
+ to the configured <code>maxIdle</code> property.</p>
+ <p>The evictor is disabled by default and can be configured using
+ the following properties:</p>
+ <ul>
+ <li><strong>timeBetweenEvictionRunsMillis</strong> - The number of
+ milliseconds between consecutive runs of the evictor.
+ Default: -1 (disabled)</li>
+ <li><strong>numTestsPerEvictionRun</strong> - The number of connections
+ that will be checked for idleness by the evictor during each
+ run of the evictor. Default: 3</li>
+ <li><strong>minEvictableIdleTimeMillis</strong> - The idle time in
+ milliseconds after which a connection can be removed from the pool
+ by the evictor. Default: 30*60*1000 (30 minutes)</li>
+ <li><strong>testWhileIdle</strong> - true or false: whether a connection
+ should be validated by the evictor thread using the validation query
+ while sitting idle in the pool. Default: false</li>
+ </ul>
+ <p>Another optional feature is the removal of abandoned connections.
+ A connection is called abandoned if the application does not return it
+ to the pool for a long time. The pool can close such connections
+ automatically and remove them from the pool. This is a workaround
+ for applications leaking connections.</p>
+ <p>The abandoning feature is disabled by default and can be configured
+ using the following properties:</p>
+ <ul>
+ <li><strong>removeAbandonedOnBorrow</strong> - true or false: whether to
+ remove abandoned connections from the pool when a connection is
+ borrowed. Default: false</li>
+ <li><strong>removeAbandonedOnMaintenance</strong> - true or false: whether
+ to remove abandoned connections from the pool during pool maintenance.
+ Default: false</li>
+ <li><strong>removeAbandonedTimeout</strong> - The number of
+ seconds after which a borrowed connection is assumed to be abandoned.
+ Default: 300</li>
+ <li><strong>logAbandoned</strong> - true or false: whether to log
+ stack traces for application code which abandoned a statement
+ or connection. This adds serious overhead. Default: false</li>
+ </ul>
+ <p>Finally there are various properties that allow further fine tuning
+ of the pool behaviour:</p>
+ <ul>
+ <li><strong>defaultAutoCommit</strong> - true or false: default
+ auto-commit state of the connections created by this pool.
+ Default: true</li>
+ <li><strong>defaultReadOnly</strong> - true or false: default
+ read-only state of the connections created by this pool.
+ Default: false</li>
+ <li><strong>defaultTransactionIsolation</strong> - This sets the
+ default transaction isolation level. Can be one of
+ <code>NONE</code>, <code>READ_COMMITTED</code>,
+ <code>READ_UNCOMMITTED</code>, <code>REPEATABLE_READ</code>,
+ <code>SERIALIZABLE</code>. Default: no default set</li>
+ <li><strong>poolPreparedStatements</strong> - true or false: whether to
+ pool PreparedStatements and CallableStatements. Default: false</li>
+ <li><strong>maxOpenPreparedStatements</strong> - The maximum number of open
+ statements that can be allocated from the statement pool at the same time.
+ Default: -1 (unlimited)</li>
+ <li><strong>defaultCatalog</strong> - The name of the default catalog.
+ Default: not set</li>
+ <li><strong>connectionInitSqls</strong> - A list of SQL statements
+ run once after a Connection is created. Separate multiple statements
+ by semicolons (<code>;</code>). Default: no statement</li>
+ <li><strong>connectionProperties</strong> - A list of driver specific
+ properties passed to the driver for creating connections. Each
+ property is given as <code>name=value</code>, multiple properties
+ are separated by semicolons (<code>;</code>). Default: no properties</li>
+ <li><strong>accessToUnderlyingConnectionAllowed</strong> - true or false: whether
+ accessing the underlying connections is allowed. Default: false</li>
+ </ul>
+ <p>For more details, please refer to the Commons DBCP 2 documentation.</p>
+
+ </div></div>
+
+</div><h3 id="Adding_Custom_Resource_Factories">Adding Custom Resource Factories</h3><div class="text">
+
+ <p>If none of the standard resource factories meet your needs, you can write
+ your own factory and integrate it into Tomcat, and then configure the use
+ of this factory in the
+ <a href="config/context.html"><code><Context></code></a> element for
+ the web application. In the example below, we will create a factory that only
+ knows how to create <code>com.mycompany.MyBean</code> beans from the
+ <a href="#Generic_JavaBean_Resources">Generic JavaBean Resources</a> example
+ above.</p>
+
+ <h4>1. Write A Resource Factory Class</h4>
+
+ <p>You must write a class that implements the JNDI service provider
+ <code>javax.naming.spi.ObjectFactory</code> interface. Every time your
+ web application calls <code>lookup()</code> on a context entry that is
+ bound to this factory (assuming that the factory is configured with
+ <code>singleton="false"</code>), the
+ <code>getObjectInstance()</code> method is called, with the following
+ arguments:</p>
+ <ul>
+ <li><strong>Object obj</strong> - The (possibly null) object containing
+ location or reference information that can be used in creating an object.
+ For Tomcat, this will always be an object of type
+ <code>javax.naming.Reference</code>, which contains the class name of
+ this factory class, as well as the configuration properties (from the
+ <a href="config/context.html"><code><Context></code></a> for the
+ web application) to use in creating objects to be returned.</li>
+ <li><strong>Name name</strong> - The name to which this factory is bound
+ relative to <code>nameCtx</code>, or <code>null</code> if no name
+ is specified.</li>
+ <li><strong>Context nameCtx</strong> - The context relative to which the
+ <code>name</code> parameter is specified, or <code>null</code> if
+ <code>name</code> is relative to the default initial context.</li>
+ <li><strong>Hashtable environment</strong> - The (possibly null)
+ environment that is used in creating this object. This is generally
+ ignored in Tomcat object factories.</li>
+ </ul>
+
+ <p>To create a resource factory that knows how to produce <code>MyBean</code>
+ instances, you might create a class like this:</p>
+
+<div class="codeBox"><pre><code>package com.mycompany;
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+import javax.naming.Context;
+import javax.naming.Name;
+import javax.naming.NamingException;
+import javax.naming.RefAddr;
+import javax.naming.Reference;
+import javax.naming.spi.ObjectFactory;
+
+public class MyBeanFactory implements ObjectFactory {
+
+ public Object getObjectInstance(Object obj,
+ Name name2, Context nameCtx, Hashtable environment)
+ throws NamingException {
+
+ // Acquire an instance of our specified bean class
+ MyBean bean = new MyBean();
+
+ // Customize the bean properties from our attributes
+ Reference ref = (Reference) obj;
+ Enumeration addrs = ref.getAll();
+ while (addrs.hasMoreElements()) {
+ RefAddr addr = (RefAddr) addrs.nextElement();
+ String name = addr.getType();
+ String value = (String) addr.getContent();
+ if (name.equals("foo")) {
+ bean.setFoo(value);
+ } else if (name.equals("bar")) {
+ try {
+ bean.setBar(Integer.parseInt(value));
+ } catch (NumberFormatException e) {
+ throw new NamingException("Invalid 'bar' value " + value);
+ }
+ }
+ }
+
+ // Return the customized instance
+ return (bean);
+
+ }
+
+}</code></pre></div>
+
+ <p>In this example, we are unconditionally creating a new instance of
+ the <code>com.mycompany.MyBean</code> class, and populating its properties
+ based on the parameters included in the <code><ResourceParams></code>
+ element that configures this factory (see below). You should note that any
+ parameter named <code>factory</code> should be skipped - that parameter is
+ used to specify the name of the factory class itself (in this case,
+ <code>com.mycompany.MyBeanFactory</code>) rather than a property of the
+ bean being configured.</p>
+
+ <p>For more information about <code>ObjectFactory</code>, see the
+ <a href="http://docs.oracle.com/javase/7/docs/technotes/guides/jndi/index.html">
+ JNDI Service Provider Interface (SPI) Specification</a>.</p>
+
+ <p>You will need to compile this class against a class path that includes
+ all of the JAR files in the <code>$CATALINA_HOME/lib</code> directory. When you are through,
+ place the factory class (and the corresponding bean class) unpacked under
+ <code>$CATALINA_HOME/lib</code>, or in a JAR file inside
+ <code>$CATALINA_HOME/lib</code>. In this way, the required class
+ files are visible to both Catalina internal resources and your web
+ application.</p>
+
+ <h4>2. Declare Your Resource Requirements</h4>
+
+ <p>Next, modify your web application deployment descriptor
+ (<code>/WEB-INF/web.xml</code>) to declare the JNDI name under which
+ you will request new instances of this bean. The simplest approach is
+ to use a <code><resource-env-ref></code> element, like this:</p>
+
+<div class="codeBox"><pre><code><resource-env-ref>
+ <description>
+ Object factory for MyBean instances.
+ </description>
+ <resource-env-ref-name>
+ bean/MyBeanFactory
+ </resource-env-ref-name>
+ <resource-env-ref-type>
+ com.mycompany.MyBean
+ </resource-env-ref-type>
+</resource-env-ref></code></pre></div>
+
+ <p><strong>WARNING</strong> - Be sure you respect the element ordering
+ that is required by the DTD for web application deployment descriptors!
+ See the
+ <a href="https://wiki.apache.org/tomcat/Specifications">Servlet
+ Specification</a> for details.</p>
+
+ <h4>3. Code Your Application's Use Of This Resource</h4>
+
+ <p>A typical use of this resource environment reference might look
+ like this:</p>
+
+<div class="codeBox"><pre><code>Context initCtx = new InitialContext();
+Context envCtx = (Context) initCtx.lookup("java:comp/env");
+MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory");
+
+writer.println("foo = " + bean.getFoo() + ", bar = " +
+ bean.getBar());</code></pre></div>
+
+ <h4>4. Configure Tomcat's Resource Factory</h4>
+
+ <p>To configure Tomcat's resource factory, add an elements like this to the
+ <a href="config/context.html"><code><Context></code></a> element for
+ this web application.</p>
+
+<div class="codeBox"><pre><code><Context ...>
+ ...
+ <Resource name="bean/MyBeanFactory" auth="Container"
+ type="com.mycompany.MyBean"
+ factory="com.mycompany.MyBeanFactory"
+ singleton="false"
+ bar="23"/>
+ ...
+</Context></code></pre></div>
+
+ <p>Note that the resource name (here, <code>bean/MyBeanFactory</code>
+ must match the value specified in the web application deployment
+ descriptor. We are also initializing the value of the <code>bar</code>
+ property, which will cause <code>setBar(23)</code> to be called before
+ the new bean is returned. Because we are not initializing the
+ <code>foo</code> property (although we could have), the bean will
+ contain whatever default value is set up by its constructor.</p>
+
+ <p>You will also note that, from the application developer's perspective,
+ the declaration of the resource environment reference, and the programming
+ used to request new instances, is identical to the approach used for the
+ <em>Generic JavaBean Resources</em> example. This illustrates one of the
+ advantages of using JNDI resources to encapsulate functionality - you can
+ change the underlying implementation without necessarily having to
+ modify applications using the resources, as long as you maintain
+ compatible APIs.</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/jspapi/index.html b/web/tomcat/webapps/docs/jspapi/index.html
new file mode 100644
index 0000000..958a657
--- /dev/null
+++ b/web/tomcat/webapps/docs/jspapi/index.html
@@ -0,0 +1,34 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8" />
+ <title>API docs</title>
+</head>
+
+<body>
+
+The JSP Javadoc is not installed by default. Download and install
+the "fulldocs" package to get it.
+
+You can also access the javadoc online in the Tomcat
+<a href="https://tomcat.apache.org/tomcat-8.5-doc/">
+documentation bundle</a>.
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/docs/logging.html b/web/tomcat/webapps/docs/logging.html
new file mode 100644
index 0000000..a6b0f25
--- /dev/null
+++ b/web/tomcat/webapps/docs/logging.html
@@ -0,0 +1,395 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Logging in Tomcat</title><meta name="author" content="Allistair Crossley"><meta name="author" content="Yoav Shapira"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Logging in Tomcat</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a><ol><li><a href="#Java_logging_API_%E2%80%94_java.util.logging">Java logging API — java.util.logging</a></li><li><a href="#Servlets_logging_API">Servlets logging API</a></li><li><a href="#Console">Console</a></li><li><a href="#Access_logging">Access logging</a></li></ol></li><li><a href="#Using_java.util.logging_(default)">Using java.util.logging (default)</a><ol><li><a href="#Documentation_references">Documentation references</a></li><li><a href="#Considerations_for_production_usage">Considerations for production usage</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>
+ The internal logging for Apache Tomcat uses JULI, a packaged renamed fork
+ of <a href="https://commons.apache.org/logging">Apache Commons Logging</a>
+ that is hard-coded to use the <code>java.util.logging</code> framework.
+ This ensures that Tomcat's internal logging and any web application
+ logging will remain independent, even if a web application uses Apache
+ Commons Logging.
+ </p>
+
+ <p>
+ To configure Tomcat to use an alternative logging framework for its
+ internal logging, follow the instructions provided by the alternative
+ logging framework for redirecting logging for applications that use
+ <code>java.util.logging</code>. Keep in mind that the alternative logging
+ framework will need to be capable of working in an environment where
+ different loggers with the same name may exist in different class loaders.
+ </p>
+
+ <p>
+ A web application running on Apache Tomcat can:
+ </p>
+ <ul>
+ <li>
+ Use any logging framework of its choice.
+ </li>
+ <li>
+ Use system logging API, <code>java.util.logging</code>.
+ </li>
+ <li>
+ Use the logging API provided by the Java Servlets specification,
+ <code>javax.servlet.ServletContext.log(...)</code>
+ </li>
+ </ul>
+
+ <p>
+ The logging frameworks used by different web applications are independent.
+ See <a href="class-loader-howto.html">class loading</a> for more details.
+ The exception to this rule is <code>java.util.logging</code>. If it is
+ used directly or indirectly by your logging library then elements of it
+ will be shared across web applications because it is loaded by the system
+ class loader.
+ </p>
+
+ <div class="subsection"><h4 id="Java_logging_API_—_java.util.logging">Java logging API — java.util.logging</h4><div class="text">
+
+ <p>
+ Apache Tomcat has its own implementation of several key elements of
+ <code>java.util.logging</code> API. This implementation is called JULI.
+ The key component there is a custom LogManager implementation,
+ that is aware of different web applications running on Tomcat (and
+ their different class loaders). It supports private per-application
+ logging configurations. It is also notified by Tomcat when a web application
+ is unloaded from memory, so that the references to its classes can be
+ cleared, preventing memory leaks.
+ </p>
+
+ <p>
+ This <code>java.util.logging</code> implementation is enabled by providing
+ certain system properties when starting Java. The Apache Tomcat startup
+ scripts do this for you, but if you are using different tools to run
+ Tomcat (such as jsvc, or running Tomcat from within an IDE), you should
+ take care of them by yourself.
+ </p>
+
+ <p>
+ More details about java.util.logging may be found in the documentation
+ for your JDK and on its Javadoc pages for the <code>java.util.logging</code>
+ package.
+ </p>
+
+ <p>
+ More details about Tomcat JULI may be found below.
+ </p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Servlets_logging_API">Servlets logging API</h4><div class="text">
+
+ <p>
+ The calls to <code>javax.servlet.ServletContext.log(...)</code> to write
+ log messages are handled by internal Tomcat logging. Such messages are
+ logged to the category named
+ </p>
+ <div class="codeBox"><pre><code>org.apache.catalina.core.ContainerBase.[${engine}].[${host}].[${context}]</code></pre></div>
+ <p>
+ This logging is performed according to the Tomcat logging configuration. You
+ cannot overwrite it in a web application.
+ </p>
+
+ <p>
+ The Servlets logging API predates the <code>java.util.logging</code> API
+ that is now provided by Java. As such, it does not offer you much options.
+ E.g., you cannot control the log levels. It can be noted, though, that
+ in Apache Tomcat implementation the calls to <code>ServletContext.log(String)</code>
+ or <code>GenericServlet.log(String)</code> are logged at the INFO level.
+ The calls to <code>ServletContext.log(String, Throwable)</code> or
+ <code>GenericServlet.log(String, Throwable)</code>
+ are logged at the SEVERE level.
+ </p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Console">Console</h4><div class="text">
+
+ <p>
+ When running Tomcat on unixes, the console output is usually redirected
+ to the file named <code>catalina.out</code>. The name is configurable
+ using an environment variable. (See the startup scripts).
+ Whatever is written to <code>System.err/out</code> will be caught into
+ that file. That may include:
+ </p>
+
+ <ul>
+ <li>Uncaught exceptions printed by <code>java.lang.ThreadGroup.uncaughtException(..)</code></li>
+ <li>Thread dumps, if you requested them via a system signal</li>
+ </ul>
+
+ <p>
+ When running as a service on Windows, the console output is also caught
+ and redirected, but the file names are different.
+ </p>
+
+ <p>
+ The default logging configuration in Apache Tomcat writes the same
+ messages to the console and to a log file. This is great when using
+ Tomcat for development, but usually is not needed in production.
+ </p>
+
+ <p>
+ Old applications that still use <code>System.out</code> or <code>System.err</code>
+ can be tricked by setting <code>swallowOutput</code> attribute on a
+ <a href="config/context.html">Context</a>. If the attribute is set to
+ <code>true</code>, the calls to <code>System.out/err</code> during request
+ processing will be intercepted, and their output will be fed to the
+ logging subsystem using the
+ <code>javax.servlet.ServletContext.log(...)</code> calls.<br>
+ <strong>Note</strong>, that the <code>swallowOutput</code> feature is
+ actually a trick, and it has its limitations.
+ It works only with direct calls to <code>System.out/err</code>,
+ and only during request processing cycle. It may not work in other
+ threads that might be created by the application. It cannot be used to
+ intercept logging frameworks that themselves write to the system streams,
+ as those start early and may obtain a direct reference to the streams
+ before the redirection takes place.
+ </p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="Access_logging">Access logging</h4><div class="text">
+
+ <p>
+ Access logging is a related but different feature, which is
+ implemented as a <code>Valve</code>. It uses self-contained
+ logic to write its log files. The essential requirement for
+ access logging is to handle a large continuous stream of data
+ with low overhead, so it only uses Apache Commons Logging for
+ its own debug messages. This implementation approach avoids
+ additional overhead and potentially complex configuration.
+ Please refer to the <a href="config/valve.html#Access_Logging">Valves</a>
+ documentation for more details on its configuration, including
+ the various report formats.
+ </p>
+
+ </div></div>
+
+ </div><h3 id="Using_java.util.logging_(default)">Using java.util.logging (default)</h3><div class="text">
+
+ <p>
+ The default implementation of java.util.logging provided in the JDK is too
+ limited to be useful. The key limitation is the inability to have per-web
+ application logging, as the configuration is per-VM. As a result, Tomcat
+ will, in the default configuration, replace the default LogManager
+ implementation with a container friendly implementation called JULI, which
+ addresses these shortcomings.
+ </p>
+ <p>
+ JULI supports the same configuration mechanisms as the standard JDK
+ <code>java.util.logging</code>, using either a programmatic approach, or
+ properties files. The main difference is that per-classloader properties
+ files can be set (which enables easy redeployment friendly webapp
+ configuration), and the properties files support extended constructs which
+ allows more freedom for defining handlers and assigning them to loggers.
+ </p>
+ <p>
+ JULI is enabled by default, and supports per classloader configuration, in
+ addition to the regular global java.util.logging configuration. This means
+ that logging can be configured at the following layers:
+ </p>
+ <ul>
+ <li>Globally. That is usually done in the
+ <code>${catalina.base}/conf/logging.properties</code> file.
+ The file is specified by the <code>java.util.logging.config.file</code>
+ System property which is set by the startup scripts.
+ If it is not readable or is not configured, the default is to use the
+ <code>${java.home}/lib/logging.properties</code> file in the JRE.
+ </li>
+ <li>In the web application. The file will be
+ <code>WEB-INF/classes/logging.properties</code>
+ </li>
+ </ul>
+ <p>
+ The default <code>logging.properties</code> in the JRE specifies a
+ <code>ConsoleHandler</code> that routes logging to System.err.
+ The default <code>conf/logging.properties</code> in Apache Tomcat also
+ adds several <code>AsyncFileHandler</code>s that write to files.
+ </p>
+ <p>
+ A handler's log level threshold is <code>INFO</code> by default and can be set using
+ <code>SEVERE</code>, <code>WARNING</code>, <code>INFO</code>, <code>CONFIG</code>,
+ <code>FINE</code>, <code>FINER</code>, <code>FINEST</code> or <code>ALL</code>.
+ You can also target specific packages to collect logging from and specify
+ a level.
+ </p>
+ <p>
+ To enable debug logging for part of Tomcat's internals, you should
+ configure both the appropriate logger(s) and the appropriate handler(s) to
+ use the <code>FINEST</code> or <code>ALL</code> level. e.g.:
+ </p>
+ <div class="codeBox"><pre><code>org.apache.catalina.session.level=ALL
+java.util.logging.ConsoleHandler.level=ALL</code></pre></div>
+ <p>
+ When enabling debug logging it is recommended that it is enabled for the
+ narrowest possible scope as debug logging can generate large amounts of
+ information.
+ </p>
+ <p>
+ The configuration used by JULI is the same as the one supported by plain
+ <code>java.util.logging</code>, but uses a few extensions to allow better
+ flexibility in configuring loggers and handlers. The main differences are:
+ </p>
+ <ul>
+ <li>A prefix may be added to handler names, so that multiple handlers of a
+ single class may be instantiated. A prefix is a String which starts with a
+ digit, and ends with '.'. For example, <code>22foobar.</code> is a valid
+ prefix.</li>
+ <li>System property replacement is performed for property values which
+ contain <code>${systemPropertyName}</code>.</li>
+ <li>If using a class loader that implements the
+ <code>org.apache.juli.WebappProperties</code> interface (Tomcat's
+ web application class loader does) then property replacement is also
+ performed for <code>${classloader.webappName}</code>,
+ <code>${classloader.hostName}</code> and
+ <code>${classloader.serviceName}</code> which are replaced with the
+ web application name, the host name and the service name respectively.
+ </li>
+ <li>By default, loggers will not delegate to their parent if they have
+ associated handlers. This may be changed per logger using the
+ <code>loggerName.useParentHandlers</code> property, which accepts a
+ boolean value.</li>
+ <li>The root logger can define its set of handlers using the
+ <code>.handlers</code> property.</li>
+ <li> By default the log files will be kept on the file system forever.
+ This may be changed per handler using the
+ <code>handlerName.maxDays</code> property. If the specified value for the
+ property is <code>≤0</code> then the log files will be kept on the
+ file system forever, otherwise they will be kept the specified maximum
+ days.</li>
+ </ul>
+ <p>
+ There are several additional implementation classes, that can be used
+ together with the ones provided by Java. The notable ones are
+ <code>org.apache.juli.FileHandler</code> and <code>org.apache.juli.AsyncFileHandler</code>.
+ </p>
+ <p>
+ <code>org.apache.juli.FileHandler</code> supports buffering of the
+ logs. The buffering is not enabled by default. To configure it, use the
+ <code>bufferSize</code> property of a handler. The value of <code>0</code>
+ uses system default buffering (typically an 8K buffer will be used). A
+ value of <code><0</code> forces a writer flush upon each log write. A
+ value <code>>0</code> uses a BufferedOutputStream with the defined
+ value but note that the system default buffering will also be
+ applied.
+ </p>
+ <p>
+ <code>org.apache.juli.AsyncFileHandler</code> is a subclass of <code>FileHandler</code>
+ that queues the log messages and writes them asynchronously to the log files.
+ Its additional behaviour can be configured by setting some
+ <a href="config/systemprops.html#Logging">system properties</a>.
+ </p>
+ <p>
+ Example logging.properties file to be placed in $CATALINA_BASE/conf:
+ </p>
+ <div class="codeBox"><pre><code>handlers = 1catalina.org.apache.juli.FileHandler, \
+ 2localhost.org.apache.juli.FileHandler, \
+ 3manager.org.apache.juli.FileHandler, \
+ java.util.logging.ConsoleHandler
+
+.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
+
+############################################################
+# Handler specific properties.
+# Describes specific configuration info for Handlers.
+############################################################
+
+1catalina.org.apache.juli.FileHandler.level = FINE
+1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
+1catalina.org.apache.juli.FileHandler.prefix = catalina.
+1catalina.org.apache.juli.FileHandler.maxDays = 90
+1catalina.org.apache.juli.FileHandler.encoding = UTF-8
+
+2localhost.org.apache.juli.FileHandler.level = FINE
+2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
+2localhost.org.apache.juli.FileHandler.prefix = localhost.
+2localhost.org.apache.juli.FileHandler.maxDays = 90
+2localhost.org.apache.juli.FileHandler.encoding = UTF-8
+
+3manager.org.apache.juli.FileHandler.level = FINE
+3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
+3manager.org.apache.juli.FileHandler.prefix = manager.
+3manager.org.apache.juli.FileHandler.bufferSize = 16384
+3manager.org.apache.juli.FileHandler.maxDays = 90
+3manager.org.apache.juli.FileHandler.encoding = UTF-8
+
+java.util.logging.ConsoleHandler.level = FINE
+java.util.logging.ConsoleHandler.formatter = java.util.logging.OneLineFormatter
+java.util.logging.ConsoleHandler.encoding = UTF-8
+
+############################################################
+# Facility specific properties.
+# Provides extra control for each logger.
+############################################################
+
+org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
+org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = \
+ 2localhost.org.apache.juli.FileHandler
+
+org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
+org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = \
+ 3manager.org.apache.juli.FileHandler
+
+# For example, set the org.apache.catalina.util.LifecycleBase logger to log
+# each component that extends LifecycleBase changing state:
+#org.apache.catalina.util.LifecycleBase.level = FINE</code></pre></div>
+
+ <p>
+ Example logging.properties for the servlet-examples web application to be
+ placed in WEB-INF/classes inside the web application:
+ </p>
+ <div class="codeBox"><pre><code>handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
+
+############################################################
+# Handler specific properties.
+# Describes specific configuration info for Handlers.
+############################################################
+
+org.apache.juli.FileHandler.level = FINE
+org.apache.juli.FileHandler.directory = ${catalina.base}/logs
+org.apache.juli.FileHandler.prefix = ${classloader.webappName}.
+
+java.util.logging.ConsoleHandler.level = FINE
+java.util.logging.ConsoleHandler.formatter = java.util.logging.OneLineFormatter</code></pre></div>
+
+
+ <div class="subsection"><h4 id="Documentation_references">Documentation references</h4><div class="text">
+ <p>See the following resources for additional information:</p>
+ <ul>
+ <li>Apache Tomcat Javadoc for the
+ <a href="api/org/apache/juli/package-summary.html"><code>org.apache.juli</code></a>
+ package.
+ </li>
+ <li>Oracle Java 7 Javadoc for the
+ <a href="https://docs.oracle.com/javase/7/docs/api/java/util/logging/package-summary.html"><code>java.util.logging</code></a>
+ package.
+ </li>
+ </ul>
+ </div></div>
+
+ <div class="subsection"><h4 id="Considerations_for_production_usage">Considerations for production usage</h4><div class="text">
+ <p>You may want to take note of the following:</p>
+ <ul>
+ <li>Consider removing <code>ConsoleHandler</code> from configuration. By
+ default (thanks to the <code>.handlers</code> setting) logging goes both
+ to a <code>FileHandler</code> and to a <code>ConsoleHandler</code>. The
+ output of the latter one is usually captured into a file, such as
+ <code>catalina.out</code>. Thus you end up with two copies of the same
+ messages.</li>
+ <li>Consider removing <code>FileHandler</code>s for the applications
+ that you do not use. E.g., the one for <code>host-manager</code>.</li>
+ <li>The handlers by default use the system default encoding to write
+ the log files. It can be configured with <code>encoding</code> property.
+ See Javadoc for details.</li>
+ <li>Consider configuring an
+ <a href="config/valve.html#Access_Logging">Access log</a>.</li>
+ </ul>
+ </div></div>
+
+ </div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/manager-howto.html b/web/tomcat/webapps/docs/manager-howto.html
new file mode 100644
index 0000000..e72f353
--- /dev/null
+++ b/web/tomcat/webapps/docs/manager-howto.html
@@ -0,0 +1,1419 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Manager App How-To</title><meta name="author" content="Craig R. McClanahan"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Manager App How-To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Configuring_Manager_Application_Access">Configuring Manager Application Access</a></li><li><a href="#HTML_User-friendly_Interface">HTML User-friendly Interface</a></li><li><a href="#Supported_Manager_Commands">Supported Manager Commands</a><ol><li><a href="#Common_Parameters">Common Parameters</a></li><li><a href="#Deploy_A_New_Application_Archive_(WAR)_Remotely">Deploy A New Application Archive (WAR) Remotely</a></li><li><a href="#Deploy_A_New_Application_from_a_Local_Path">Deploy A New Application from a Local Path</a><ol><li><a href="#Deploy_a_previously_deployed_webapp">Deploy a previously deployed webapp</a></li><li><a href="#Deploy_a_Directory_or_WAR_by_URL">Deploy a Directory or WAR by URL</a></li><li><a href="#Deploy_a_Directory_or_War_from_the_Host_appBase">Deploy a Directory or War from the Host appBase</a></li><li><a href="#Deploy_using_a_Context_configuration_%22.xml%22_file">Deploy using a Context configuration ".xml" file</a></li><li><a href="#Deployment_Notes">Deployment Notes</a></li><li><a href="#Deploy_Response">Deploy Response</a></li></ol></li><li><a href="#List_Currently_Deployed_Applications">List Currently Deployed Applications</a></li><li><a href="#Reload_An_Existing_Application">Reload An Existing Application</a></li><li><a href="#List_OS_and_JVM_Properties">List OS and JVM Properties</a></li><li><a href="#List_Available_Global_JNDI_Resources">List Available Global JNDI Resources</a></li><li><a href="#Session_Statistics">Session Statistics</a></li><li><a href="#Expire_Sessions">Expire Sessions</a></li><li><a href="#Start_an_Existing_Application">Start an Existing Application</a></li><li><a href="#Stop_an_Existing_Application">Stop an Existing Application</a></li><li><a href="#Undeploy_an_Existing_Application">Undeploy an Existing Application</a></li><li><a href="#Finding_memory_leaks">Finding memory leaks</a></li><li><a href="#Connector_SSL/TLS_cipher_information">Connector SSL/TLS cipher information</a></li><li><a href="#Connector_SSL/TLS_certificate_chain_information">Connector SSL/TLS certificate chain information</a></li><li><a href="#Connector_SSL/TLS_trusted_certificate_information">Connector SSL/TLS trusted certificate information</a></li><li><a href="#Reload_TLS_configuration">Reload TLS configuration</a></li><li><a href="#Thread_Dump">Thread Dump</a></li><li><a href="#VM_Info">VM Info</a></li><li><a href="#Save_Configuration">Save Configuration</a></li></ol></li><li><a href="#Server_Status">Server Status</a></li><li><a href="#Using_the_JMX_Proxy_Servlet">Using the JMX Proxy Servlet</a><ol><li><a href="#What_is_JMX_Proxy_Servlet">What is JMX Proxy Servlet</a></li><li><a href="#JMX_Query_command">JMX Query command</a></li><li><a href="#JMX_Get_command">JMX Get command</a></li><li><a href="#JMX_Set_command">JMX Set command</a></li><li><a href="#JMX_Invoke_command">JMX Invoke command</a></li></ol></li><li><a href="#Executing_Manager_Commands_With_Ant">Executing Manager Commands With Ant</a><ol><li><a href="#Tasks_output_capture">Tasks output capture</a></li></ol></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+<p>In many production environments, it is very useful to have the capability
+to deploy a new web application, or undeploy an existing one, without having
+to shut down and restart the entire container. In addition, you can request
+an existing application to reload itself, even if you have not declared it
+to be <code>reloadable</code> in the Tomcat server
+configuration file.</p>
+
+<p>To support these capabilities, Tomcat includes a web application
+(installed by default on context path <code>/manager</code>) that supports
+the following functions:</p>
+<ul>
+<li>Deploy a new web application from the uploaded contents of a WAR file.</li>
+<li>Deploy a new web application, on a specified context path, from the
+ server file system.</li>
+<li>List the currently deployed web applications, as well as the
+ sessions that are currently active for those web apps.</li>
+<li>Reload an existing web application, to reflect changes in the
+ contents of <code>/WEB-INF/classes</code> or <code>/WEB-INF/lib</code>.
+ </li>
+<li>List the OS and JVM property values.</li>
+<li>List the available global JNDI resources, for use in deployment
+ tools that are preparing <code><ResourceLink></code> elements
+ nested in a <code><Context></code> deployment description.</li>
+<li>Start a stopped application (thus making it available again).</li>
+<li>Stop an existing application (so that it becomes unavailable), but
+ do not undeploy it.</li>
+<li>Undeploy a deployed web application and delete its document base
+ directory (unless it was deployed from file system).</li>
+</ul>
+
+<p>A default Tomcat installation includes an instance of the Manager application
+configured for the default virtual host. If you create additional virtual hosts,
+you may wish to add an instance of the Manager application to one or more of
+those Hosts. To add an instance of the Manager web application
+<code>Context</code> to a new host install the <code>manager.xml</code> context
+configuration file in the
+<code>$CATALINA_BASE/conf/[enginename]/[hostname]</code> folder. Here is an
+example:</p>
+<div class="codeBox"><pre><code><Context privileged="true" antiResourceLocking="false"
+ docBase="${catalina.home}/webapps/manager">
+ <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
+ sameSiteCookies="strict" />
+ <Valve className="org.apache.catalina.valves.RemoteAddrValve"
+ allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
+ <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
+</Context></code></pre></div>
+
+<p>There are three ways to use the <strong>Manager</strong> web application.</p>
+<ul>
+<li>As an application with a user interface you use in your browser.
+Here is an example URL where you can replace <code>localhost</code> with
+your website host name: <code>http://localhost:8080/manager/html</code> .</li>
+<li>A minimal version using HTTP requests only which is suitable for use
+by scripts setup by system administrators. Commands are given as part of the
+request URI, and responses are in the form of simple text that can be easily
+parsed and processed. See <a href="#Supported_Manager_Commands">
+Supported Manager Commands</a> for more information.</li>
+<li>A convenient set of task definitions for the <em>Ant</em>
+(version 1.4 or later) build tool. See
+<a href="#Executing_Manager_Commands_With_Ant">Executing Manager Commands
+With Ant</a> for more information.</li>
+</ul>
+
+</div><h3 id="Configuring_Manager_Application_Access">Configuring Manager Application Access</h3><div class="text">
+
+
+ <p><em>The description below uses the variable name $CATALINA_BASE to refer the
+ base directory against which most relative paths are resolved. If you have
+ not configured Tomcat for multiple instances by setting a CATALINA_BASE
+ directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME,
+ the directory into which you have installed Tomcat.</em></p>
+
+
+<p>It would be quite unsafe to ship Tomcat with default settings that allowed
+anyone on the Internet to execute the Manager application on your server.
+Therefore, the Manager application is shipped with the requirement that anyone
+who attempts to use it must authenticate themselves, using a username and
+password that have one of <strong>manager-xxx</strong> roles associated with
+them (the role name depends on what functionality is required).
+Further, there is no username in the default users file
+(<code>$CATALINA_BASE/conf/tomcat-users.xml</code>) that is assigned to those
+roles. Therefore, access to the Manager application is completely disabled
+by default.</p>
+
+<p>You can find the role names in the <code>web.xml</code> file of the Manager
+web application. The available roles are:</p>
+
+<ul>
+ <li><strong>manager-gui</strong> — Access to the HTML interface.</li>
+ <li><strong>manager-status</strong> — Access to the "Server Status"
+ page only.</li>
+ <li><strong>manager-script</strong> — Access to the tools-friendly
+ plain text interface that is described in this document,
+ and to the "Server Status" page.</li>
+ <li><strong>manager-jmx</strong> — Access to JMX proxy interface
+ and to the "Server Status" page.</li>
+</ul>
+
+<p>The HTML interface is protected against CSRF (Cross-Site Request Forgery)
+attacks, but the text and JMX interfaces cannot be protected. It means that
+users who are allowed access to the text and JMX interfaces have to be cautious
+when accessing the Manager application with a web browser.
+To maintain the CSRF protection:</p>
+
+<ul>
+ <li>If you use web browser to access the Manager application using
+ a user that has either <strong>manager-script</strong> or
+ <strong>manager-jmx</strong> roles (for example for testing
+ the plain text or JMX interfaces), you MUST close all windows
+ of the browser afterwards to terminate the session.
+ If you do not close the browser and visit other sites, you may become
+ victim of a CSRF attack.</li>
+ <li>It is recommended to never grant
+ the <strong>manager-script</strong> or <strong>manager-jmx</strong>
+ roles to users that have the <strong>manager-gui</strong> role.</li>
+</ul>
+
+<p><strong>Note</strong> that JMX proxy interface is effectively low-level root-like
+administrative interface of Tomcat. One can do a lot, if one knows
+what commands to call. You should be cautious when enabling the
+<strong>manager-jmx</strong> role.</p>
+
+<p>To enable access to the Manager web application, you must either create
+a new username/password combination and associate one of the
+<strong>manager-xxx</strong> roles with it, or add a
+<strong>manager-xxx</strong> role
+to some existing username/password combination.
+As the majority of this document describes the using the text interface, this
+example will use the role name <strong>manager-script</strong>.
+Exactly how the usernames/passwords are configured depends on which
+<a href="config/realm.html">Realm implementation</a> you are using:</p>
+<ul>
+<li><em>UserDatabaseRealm</em> plus <em>MemoryUserDatabase</em>, or <em>MemoryRealm</em>
+ — The <em>UserDatabaseRealm</em> and <em>MemoryUserDatabase</em> are
+ configured in the default <code>$CATALINA_BASE/conf/server.xml</code>.
+ Both <em>MemoryUserDatabase</em> and <em>MemoryRealm</em> read an
+ XML-format file by default stored at
+ <code>$CATALINA_BASE/conf/tomcat-users.xml</code>, which can be
+ edited with any text editor. This file contains an XML
+ <code><user></code> for each individual user, which might
+ look something like this:
+<div class="codeBox"><pre><code><user username="craigmcc" password="secret" roles="standard,manager-script" /></code></pre></div>
+ which defines the username and password used by this individual to
+ log on, and the role names they are associated with. You can
+ add the <strong>manager-script</strong> role to the comma-delimited
+ <code>roles</code> attribute for one or more existing users, and/or
+ create new users with that assigned role.</li>
+<li><em>DataSourceRealm</em> or <em>JDBCRealm</em>
+ — Your user and role information is stored in
+ a database accessed via JDBC. Add the <strong>manager-script</strong> role
+ to one or more existing users, and/or create one or more new users
+ with this role assigned, following the standard procedures for your
+ environment.</li>
+<li><em>JNDIRealm</em> — Your user and role information is stored in
+ a directory server accessed via LDAP. Add the
+ <strong>manager-script</strong> role to one or more existing users,
+ and/or create one or more new users with this role assigned, following
+ the standard procedures for your environment.</li>
+</ul>
+
+<p>The first time you attempt to issue one of the Manager commands
+described in the next section, you will be challenged to log on using
+BASIC authentication. The username and password you enter do not matter,
+as long as they identify a valid user in the users database who possesses
+the role <strong>manager-script</strong>.</p>
+
+<p>In addition to the password restrictions, access to the Manager web
+application can be restricted by the <strong>remote IP address</strong> or host
+by adding a <code>RemoteAddrValve</code> or <code>RemoteHostValve</code>.
+See <a href="config/valve.html#Remote_Address_Filter">valves documentation</a>
+for details. Here is
+an example of restricting access to the localhost by IP address:</p>
+<div class="codeBox"><pre><code><Context privileged="true">
+ <Valve className="org.apache.catalina.valves.RemoteAddrValve"
+ allow="127\.0\.0\.1"/>
+</Context></code></pre></div>
+
+</div><h3 id="HTML_User-friendly_Interface">HTML User-friendly Interface</h3><div class="text">
+
+<p>The user-friendly HTML interface of Manager web application is located at</p>
+
+<div class="codeBox"><pre><code>http://{host}:{port}/manager/html</code></pre></div>
+
+<p>As has already been mentioned above, you need <strong>manager-gui</strong>
+role to be allowed to access it. There is a separate document that provides
+help on this interface. See:</p>
+
+<ul>
+ <li><a href="html-manager-howto.html">HTML Manager documentation</a></li>
+</ul>
+
+<p>The HTML interface is protected against CSRF (Cross-Site Request Forgery)
+attacks. Each access to the HTML pages generates a random token, which is
+stored in your session and is included in all links on the page. If your next
+action does not have correct value of the token, the action will be denied.
+If the token has expired you can start again from the main page or
+<em>List Applications</em> page of Manager.</p>
+
+</div><h3 id="Supported_Manager_Commands">Supported Manager Commands</h3><div class="text">
+
+<p>All commands that the Manager application knows how to process are
+specified in a single request URI like this:</p>
+<div class="codeBox"><pre><code>http://{host}:{port}/manager/text/{command}?{parameters}</code></pre></div>
+<p>where <code>{host}</code> and <code>{port}</code> represent the hostname
+and port number on which Tomcat is running, <code>{command}</code>
+represents the Manager command you wish to execute, and
+<code>{parameters}</code> represents the query parameters
+that are specific to that command. In the illustrations below, customize
+the host and port appropriately for your installation.</p>
+
+<p>The commands are usually executed by HTTP GET requests. The
+<code>/deploy</code> command has a form that is executed by an HTTP PUT request.</p>
+
+<div class="subsection"><h4 id="Common_Parameters">Common Parameters</h4><div class="text">
+
+<p>Most commands accept one or more of the following query parameters:</p>
+<ul>
+<li><strong>path</strong> - The context path (including the leading slash)
+ of the web application you are dealing with. To select the ROOT web
+ application, specify "/". <strong>NOTE</strong>:
+ It is not possible to perform administrative commands on the
+ Manager application itself.</li>
+<li><strong>version</strong> - The version of this web application as used by
+ the <a href="config/context.html">parallel deployment</a> feature. If you
+ use parallel deployment wherever a path is required you must specify a
+ version in addition to the path and it is the combination of path and
+ version that must be unique rather than just the path.</li>
+<li><strong>war</strong> - URL of a web application archive (WAR) file, or
+ pathname of a directory which contains the web application, or a
+ Context configuration ".xml" file. You can use URLs in any of the
+ following formats:
+ <ul>
+ <li><strong>file:/absolute/path/to/a/directory</strong> - The absolute
+ path of a directory that contains the unpacked version of a web
+ application. This directory will be attached to the context path
+ you specify without any changes.</li>
+ <li><strong>file:/absolute/path/to/a/webapp.war</strong> - The absolute
+ path of a web application archive (WAR) file. This is valid
+ <strong>only</strong> for the <code>/deploy</code> command, and is
+ the only acceptable format to that command.</li>
+ <li><strong>file:/absolute/path/to/a/context.xml</strong> - The
+ absolute path of a web application Context configuration ".xml"
+ file which contains the Context configuration element.</li>
+ <li><strong>directory</strong> - The directory name for the web
+ application context in the Host's application base directory.</li>
+ <li><strong>webapp.war</strong> - The name of a web application war file
+ located in the Host's application base directory.</li>
+ </ul></li>
+</ul>
+
+<p>Each command will return a response in <code>text/plain</code> format
+(i.e. plain ASCII with no HTML markup), making it easy for both humans and
+programs to read). The first line of the response will begin with either
+<code>OK</code> or <code>FAIL</code>, indicating whether the requested
+command was successful or not. In the case of failure, the rest of the first
+line will contain a description of the problem that was encountered. Some
+commands include additional lines of information as described below.</p>
+
+<p><em>Internationalization Note</em> - The Manager application looks up
+its message strings in resource bundles, so it is possible that the strings
+have been translated for your platform. The examples below show the English
+version of the messages.</p>
+
+</div></div>
+
+<div class="subsection"><h4 id="Deploy_A_New_Application_Archive_(WAR)_Remotely">Deploy A New Application Archive (WAR) Remotely</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/deploy?path=/foo</code></pre></div>
+
+<p>Upload the web application archive (WAR) file that is specified as the
+request data in this HTTP PUT request, install it into the <code>appBase</code>
+directory of our corresponding virtual host, and start, deriving the name for
+the WAR file added to the <code>appBase</code> from the specified path. The
+application can later be undeployed (and the corresponding WAR file removed) by
+use of the <code>/undeploy</code> command.</p>
+
+<p>This command is executed by an HTTP PUT request.</p>
+
+<p>The .WAR file may include Tomcat specific deployment configuration, by
+including a Context configuration XML file in
+<code>/META-INF/context.xml</code>.</p>
+
+<p>URL parameters include:</p>
+<ul>
+<li><code>update</code>: When set to true, any existing update will be
+ undeployed first. The default value is set to false.</li>
+<li><code>tag</code>: Specifying a tag name, this allows associating the
+ deployed webapp with a tag or label. If the web application is undeployed,
+ it can be later redeployed when needed using only the tag.</li>
+</ul>
+
+<p><strong>NOTE</strong> - This command is the logical
+opposite of the <code>/undeploy</code> command.</p>
+
+<p>If installation and startup is successful, you will receive a response
+like this:</p>
+<div class="codeBox"><pre><code>OK - Deployed application at context path /foo</code></pre></div>
+
+<p>Otherwise, the response will start with <code>FAIL</code> and include an
+error message. Possible causes for problems include:</p>
+<ul>
+<li><em>Application already exists at path /foo</em>
+ <p>The context paths for all currently running web applications must be
+ unique. Therefore, you must undeploy the existing web
+ application using this context path, or choose a different context path
+ for the new one. The <code>update</code> parameter may be specified as
+ a parameter on the URL, with a value of <code>true</code> to avoid this
+ error. In that case, an undeploy will be performed on an existing
+ application before performing the deployment.</p>
+ </li>
+<li><em>Encountered exception</em>
+ <p>An exception was encountered trying to start the new web application.
+ Check the Tomcat logs for the details, but likely explanations include
+ problems parsing your <code>/WEB-INF/web.xml</code> file, or missing
+ classes encountered when initializing application event listeners and
+ filters.</p>
+ </li>
+</ul>
+
+</div></div>
+
+<div class="subsection"><h4 id="Deploy_A_New_Application_from_a_Local_Path">Deploy A New Application from a Local Path</h4><div class="text">
+
+<p>Deploy and start a new web application, attached to the specified context
+<code>path</code> (which must not be in use by any other web application).
+This command is the logical opposite of the <code>/undeploy</code> command.</p>
+
+<p>This command is executed by an HTTP GET request.
+There are a number of different ways the deploy command can be used.</p>
+
+<div class="subsection"><h4 id="Deploy_a_previously_deployed_webapp">Deploy a previously deployed webapp</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/deploy?path=/footoo&tag=footag</code></pre></div>
+
+<p>This can be used to deploy a previously deployed web application, which
+has been deployed using the <code>tag</code> attribute. Note that the work
+directory of the Manager webapp will contain the previously deployed WARs;
+removing it would make the deployment fail.</p>
+
+</div></div>
+
+<div class="subsection"><h4 id="Deploy_a_Directory_or_WAR_by_URL">Deploy a Directory or WAR by URL</h4><div class="text">
+
+<p>Deploy a web application directory or ".war" file located on the Tomcat
+server. If no <code>path</code> is specified, the path and version are derived
+from the directory name or the war file name. The <code>war</code> parameter
+specifies a URL (including the <code>file:</code> scheme) for either
+a directory or a web application archive (WAR) file. The supported syntax for
+a URL referring to a WAR file is described on the Javadocs page for the
+<code>java.net.JarURLConnection</code> class. Use only URLs that refer to
+the entire WAR file.</p>
+
+<p>In this example the web application located in the directory
+<code>/path/to/foo</code> on the Tomcat server is deployed as the
+web application context named <code>/footoo</code>.</p>
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/deploy?path=/footoo&war=file:/path/to/foo</code></pre></div>
+
+
+<p>In this example the ".war" file <code>/path/to/bar.war</code> on the
+Tomcat server is deployed as the web application context named
+<code>/bar</code>. Notice that there is no <code>path</code> parameter
+so the context path defaults to the name of the web application archive
+file without the ".war" extension.</p>
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/deploy?war=file:/path/to/bar.war</code></pre></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="Deploy_a_Directory_or_War_from_the_Host_appBase">Deploy a Directory or War from the Host appBase</h4><div class="text">
+
+<p>Deploy a web application directory or ".war" file located in your Host
+appBase directory. The path and optional version are derived from the directory
+or war file name.</p>
+
+<p>In this example the web application located in a sub directory named
+<code>foo</code> in the Host appBase directory of the Tomcat server is
+deployed as the web application context named <code>/foo</code>. Notice
+that the context path used is the name of the web application directory.</p>
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/deploy?war=foo</code></pre></div>
+
+
+<p>In this example the ".war" file <code>bar.war</code> located in your
+Host appBase directory on the Tomcat server is deployed as the web
+application context named <code>/bar</code>.</p>
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/deploy?war=bar.war</code></pre></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="Deploy_using_a_Context_configuration_".xml"_file">Deploy using a Context configuration ".xml" file</h4><div class="text">
+
+<p>If the Host deployXML flag is set to true you can deploy a web
+application using a Context configuration ".xml" file and an optional
+".war" file or web application directory. The context <code>path</code>
+is not used when deploying a web application using a context ".xml"
+configuration file.</p>
+
+<p>A Context configuration ".xml" file can contain valid XML for a
+web application Context just as if it were configured in your
+Tomcat <code>server.xml</code> configuration file. Here is an
+example:</p>
+<div class="codeBox"><pre><code><Context path="/foobar" docBase="/path/to/application/foobar">
+</Context></code></pre></div>
+
+
+<p>When the optional <code>war</code> parameter is set to the URL
+for a web application ".war" file or directory it overrides any
+docBase configured in the context configuration ".xml" file.</p>
+
+<p>Here is an example of deploying an application using a Context
+configuration ".xml" file.</p>
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/deploy?config=file:/path/context.xml</code></pre></div>
+
+
+<p>Here is an example of deploying an application using a Context
+configuration ".xml" file and a web application ".war" file located
+on the server.</p>
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/deploy
+ ?config=file:/path/context.xml&war=file:/path/bar.war</code></pre></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="Deployment_Notes">Deployment Notes</h4><div class="text">
+
+<p>If the Host is configured with unpackWARs=true and you deploy a war
+file, the war will be unpacked into a directory in your Host appBase
+directory.</p>
+
+<p>If the application war or directory is installed in your Host appBase
+directory and either the Host is configured with autoDeploy=true or the
+Context path must match the directory name or war file name without the
+".war" extension.</p>
+
+<p>For security when untrusted users can manage web applications, the
+Host deployXML flag can be set to false. This prevents untrusted users
+from deploying web applications using a configuration XML file and
+also prevents them from deploying application directories or ".war"
+files located outside of their Host appBase.</p>
+
+</div></div>
+
+<div class="subsection"><h4 id="Deploy_Response">Deploy Response</h4><div class="text">
+
+<p>If installation and startup is successful, you will receive a response
+like this:</p>
+<div class="codeBox"><pre><code>OK - Deployed application at context path /foo</code></pre></div>
+
+<p>Otherwise, the response will start with <code>FAIL</code> and include an
+error message. Possible causes for problems include:</p>
+<ul>
+<li><em>Application already exists at path /foo</em>
+ <p>The context paths for all currently running web applications must be
+ unique. Therefore, you must undeploy the existing web
+ application using this context path, or choose a different context path
+ for the new one. The <code>update</code> parameter may be specified as
+ a parameter on the URL, with a value of <code>true</code> to avoid this
+ error. In that case, an undeploy will be performed on an existing
+ application before performing the deployment.</p>
+ </li>
+<li><em>Document base does not exist or is not a readable directory</em>
+ <p>The URL specified by the <code>war</code> parameter must identify a
+ directory on this server that contains the "unpacked" version of a
+ web application, or the absolute URL of a web application archive (WAR)
+ file that contains this application. Correct the value specified by
+ the <code>war</code> parameter.</p>
+ </li>
+<li><em>Encountered exception</em>
+ <p>An exception was encountered trying to start the new web application.
+ Check the Tomcat logs for the details, but likely explanations include
+ problems parsing your <code>/WEB-INF/web.xml</code> file, or missing
+ classes encountered when initializing application event listeners and
+ filters.</p>
+ </li>
+<li><em>Invalid application URL was specified</em>
+ <p>The URL for the directory or web application that you specified
+ was not valid. Such URLs must start with <code>file:</code>, and URLs
+ for a WAR file must end in ".war".</p>
+ </li>
+<li><em>Invalid context path was specified</em>
+ <p>The context path must start with a slash character. To reference the
+ ROOT web application use "/".</p>
+ </li>
+<li><em>Context path must match the directory or WAR file name:</em>
+ <p>If the application war or directory is installed in your Host appBase
+ directory and either the Host is configured with autoDeploy=true the
+ Context path must match the directory name or war file name without
+ the ".war" extension.</p>
+ </li>
+<li><em>Only web applications in the Host web application directory can
+ be installed</em>
+ <p>
+ If the Host deployXML flag is set to false this error will happen
+ if an attempt is made to deploy a web application directory or
+ ".war" file outside of the Host appBase directory.
+ </p></li>
+</ul>
+
+</div></div>
+</div></div>
+
+<div class="subsection"><h4 id="List_Currently_Deployed_Applications">List Currently Deployed Applications</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/list</code></pre></div>
+
+<p>List the context paths, current status (<code>running</code> or
+<code>stopped</code>), and number of active sessions for all currently
+deployed web applications. A typical response immediately
+after starting Tomcat might look like this:</p>
+<div class="codeBox"><pre><code>OK - Listed applications for virtual host localhost
+/webdav:running:0:webdav
+/examples:running:0:examples
+/manager:running:0:manager
+/:running:0:ROOT
+/test:running:0:test##2
+/test:running:0:test##1</code></pre></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="Reload_An_Existing_Application">Reload An Existing Application</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/reload?path=/examples</code></pre></div>
+
+<p>Signal an existing application to shut itself down and reload. This can
+be useful when the web application context is not reloadable and you have
+updated classes or property files in the <code>/WEB-INF/classes</code>
+directory or when you have added or updated jar files in the
+<code>/WEB-INF/lib</code> directory.
+</p>
+
+<p>If this command succeeds, you will see a response like this:</p>
+<div class="codeBox"><pre><code>OK - Reloaded application at context path /examples</code></pre></div>
+
+<p>Otherwise, the response will start with <code>FAIL</code> and include an
+error message. Possible causes for problems include:</p>
+<ul>
+<li><em>Encountered exception</em>
+ <p>An exception was encountered trying to restart the web application.
+ Check the Tomcat logs for the details.</p>
+ </li>
+<li><em>Invalid context path was specified</em>
+ <p>The context path must start with a slash character. To reference the
+ ROOT web application use "/".</p>
+ </li>
+<li><em>No context exists for path /foo</em>
+ <p>There is no deployed application on the context path
+ that you specified.</p>
+ </li>
+<li><em>No context path was specified</em>
+ <p>
+ The <code>path</code> parameter is required.
+ </p></li>
+<li><em>Reload not supported on WAR deployed at path /foo</em>
+ <p>
+ Currently, application reloading (to pick up changes to the classes or
+ <code>web.xml</code> file) is not supported when a web application is
+ deployed directly from a WAR file. It only works when the web application
+ is deployed from an unpacked directory. If you are using a WAR file,
+ you should <code>undeploy</code> and then <code>deploy</code> or
+ <code>deploy</code> with the <code>update</code> parameter the
+ application again to pick up your changes.
+ </p></li>
+</ul>
+
+</div></div>
+
+<div class="subsection"><h4 id="List_OS_and_JVM_Properties">List OS and JVM Properties</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/serverinfo</code></pre></div>
+
+<p>Lists information about the Tomcat version, OS, and JVM properties.</p>
+
+<p>If an error occurs, the response will start with <code>FAIL</code> and
+include an error message. Possible causes for problems include:</p>
+<ul>
+<li><em>Encountered exception</em>
+ <p>An exception was encountered trying to enumerate the system properties.
+ Check the Tomcat logs for the details.</p>
+ </li>
+</ul>
+
+</div></div>
+
+<div class="subsection"><h4 id="List_Available_Global_JNDI_Resources">List Available Global JNDI Resources</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/resources[?type=xxxxx]</code></pre></div>
+
+<p>List the global JNDI resources that are available for use in resource
+links for context configuration files. If you specify the <code>type</code>
+request parameter, the value must be the fully qualified Java class name of
+the resource type you are interested in (for example, you would specify
+<code>javax.sql.DataSource</code> to acquire the names of all available
+JDBC data sources). If you do not specify the <code>type</code> request
+parameter, resources of all types will be returned.</p>
+
+<p>Depending on whether the <code>type</code> request parameter is specified
+or not, the first line of a normal response will be:</p>
+<div class="codeBox"><pre><code>OK - Listed global resources of all types</code></pre></div>
+<p>or</p>
+<div class="codeBox"><pre><code>OK - Listed global resources of type xxxxx</code></pre></div>
+<p>followed by one line for each resource. Each line is composed of fields
+delimited by colon characters (":"), as follows:</p>
+<ul>
+<li><em>Global Resource Name</em> - The name of this global JNDI resource,
+ which would be used in the <code>global</code> attribute of a
+ <code><ResourceLink></code> element.</li>
+<li><em>Global Resource Type</em> - The fully qualified Java class name of
+ this global JNDI resource.</li>
+</ul>
+
+<p>If an error occurs, the response will start with <code>FAIL</code> and
+include an error message. Possible causes for problems include:</p>
+<ul>
+<li><em>Encountered exception</em>
+ <p>An exception was encountered trying to enumerate the global JNDI
+ resources. Check the Tomcat logs for the details.</p>
+ </li>
+<li><em>No global JNDI resources are available</em>
+ <p>The Tomcat server you are running has been configured without
+ global JNDI resources.</p>
+ </li>
+</ul>
+
+
+</div></div>
+
+<div class="subsection"><h4 id="Session_Statistics">Session Statistics</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/sessions?path=/examples</code></pre></div>
+
+<p>Display the default session timeout for a web application, and the
+number of currently active sessions that fall within one-minute ranges of
+their actual timeout times. For example, after restarting Tomcat and then
+executing one of the JSP samples in the <code>/examples</code> web app,
+you might get something like this:</p>
+
+<div class="codeBox"><pre><code>OK - Session information for application at context path /examples
+Default maximum session inactive interval 30 minutes
+<1 minutes: 1 sessions
+1 - <2 minutes: 1 sessions</code></pre></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="Expire_Sessions">Expire Sessions</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/expire?path=/examples&idle=num</code></pre></div>
+
+<p>Display the session statistics (like the above <code>/sessions</code>
+command) and expire sessions that are idle for longer than <code>num</code>
+minutes. To expire all sessions, use <code>&idle=0</code> .</p>
+
+<div class="codeBox"><pre><code>OK - Session information for application at context path /examples
+Default maximum session inactive interval 30 minutes
+1 - <2 minutes: 1 sessions
+3 - <4 minutes: 1 sessions
+>0 minutes: 2 sessions were expired</code></pre></div>
+
+<p>Actually <code>/sessions</code> and <code>/expire</code> are synonyms for
+the same command. The difference is in the presence of <code>idle</code>
+parameter.</p>
+
+</div></div>
+
+<div class="subsection"><h4 id="Start_an_Existing_Application">Start an Existing Application</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/start?path=/examples</code></pre></div>
+
+<p>Signal a stopped application to restart, and make itself available again.
+Stopping and starting is useful, for example, if the database required by
+your application becomes temporarily unavailable. It is usually better to
+stop the web application that relies on this database rather than letting
+users continuously encounter database exceptions.</p>
+
+<p>If this command succeeds, you will see a response like this:</p>
+<div class="codeBox"><pre><code>OK - Started application at context path /examples</code></pre></div>
+
+<p>Otherwise, the response will start with <code>FAIL</code> and include an
+error message. Possible causes for problems include:</p>
+<ul>
+<li><em>Encountered exception</em>
+ <p>An exception was encountered trying to start the web application.
+ Check the Tomcat logs for the details.</p>
+ </li>
+<li><em>Invalid context path was specified</em>
+ <p>The context path must start with a slash character. To reference the
+ ROOT web application use "/".</p>
+ </li>
+<li><em>No context exists for path /foo</em>
+ <p>There is no deployed application on the context path
+ that you specified.</p>
+ </li>
+<li><em>No context path was specified</em>
+ <p>
+ The <code>path</code> parameter is required.
+ </p></li>
+</ul>
+
+</div></div>
+
+<div class="subsection"><h4 id="Stop_an_Existing_Application">Stop an Existing Application</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/stop?path=/examples</code></pre></div>
+
+<p>Signal an existing application to make itself unavailable, but leave it
+deployed. Any request that comes in while an application is
+stopped will see an HTTP error 404, and this application will show as
+"stopped" on a list applications command.</p>
+
+<p>If this command succeeds, you will see a response like this:</p>
+<div class="codeBox"><pre><code>OK - Stopped application at context path /examples</code></pre></div>
+
+<p>Otherwise, the response will start with <code>FAIL</code> and include an
+error message. Possible causes for problems include:</p>
+<ul>
+<li><em>Encountered exception</em>
+ <p>An exception was encountered trying to stop the web application.
+ Check the Tomcat logs for the details.</p>
+ </li>
+<li><em>Invalid context path was specified</em>
+ <p>The context path must start with a slash character. To reference the
+ ROOT web application use "/".</p>
+ </li>
+<li><em>No context exists for path /foo</em>
+ <p>There is no deployed application on the context path
+ that you specified.</p>
+ </li>
+<li><em>No context path was specified</em>
+ The <code>path</code> parameter is required.
+ </li>
+</ul>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="Undeploy_an_Existing_Application">Undeploy an Existing Application</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/undeploy?path=/examples</code></pre></div>
+
+<p><strong><span style="color: red;">WARNING</span> - This command will delete any web
+application artifacts that exist within <code>appBase</code> directory
+(typically "webapps") for this virtual host</strong>.
+This will delete the application .WAR, if present,
+the application directory resulting either from a deploy in unpacked form
+or from .WAR expansion as well as the XML Context definition from
+<code>$CATALINA_BASE/conf/[enginename]/[hostname]/</code> directory.
+If you simply want to take an application
+out of service, you should use the <code>/stop</code> command instead.</p>
+
+<p>Signal an existing application to gracefully shut itself down, and
+remove it from Tomcat (which also makes this context path available for
+reuse later). In addition, the document root directory is removed, if it
+exists in the <code>appBase</code> directory (typically "webapps") for
+this virtual host. This command is the logical opposite of the
+<code>/deploy</code> command.</p>
+
+<p>If this command succeeds, you will see a response like this:</p>
+<div class="codeBox"><pre><code>OK - Undeployed application at context path /examples</code></pre></div>
+
+<p>Otherwise, the response will start with <code>FAIL</code> and include an
+error message. Possible causes for problems include:</p>
+<ul>
+<li><em>Encountered exception</em>
+ <p>An exception was encountered trying to undeploy the web application.
+ Check the Tomcat logs for the details.</p>
+ </li>
+<li><em>Invalid context path was specified</em>
+ <p>The context path must start with a slash character. To reference the
+ ROOT web application use "/".</p>
+ </li>
+<li><em>No context exists named /foo</em>
+ <p>There is no deployed application with the name that you specified.</p>
+ </li>
+<li><em>No context path was specified</em>
+ The <code>path</code> parameter is required.
+ </li>
+</ul>
+
+</div></div>
+
+<div class="subsection"><h4 id="Finding_memory_leaks">Finding memory leaks</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/findleaks[?statusLine=[true|false]]</code></pre></div>
+
+<p><strong>The find leaks diagnostic triggers a full garbage collection. It
+should be used with extreme caution on production systems.</strong></p>
+
+<p>The find leaks diagnostic attempts to identify web applications that have
+caused memory leaks when they were stopped, reloaded or undeployed. Results
+should always be confirmed
+with a profiler. The diagnostic uses additional functionality provided by the
+StandardHost implementation. It will not work if a custom host is used that
+does not extend StandardHost.</p>
+
+<p>Explicitly triggering a full garbage collection from Java code is documented
+to be unreliable. Furthermore, depending on the JVM used, there are options to
+disable explicit GC triggering, like <code>-XX:+DisableExplicitGC</code>.
+If you want to make sure, that the diagnostics were successfully running a full
+GC, you will need to check using tools like GC logging, JConsole or similar.</p>
+
+<p>If this command succeeds, you will see a response like this:</p>
+<div class="codeBox"><pre><code>/leaking-webapp</code></pre></div>
+
+<p>If you wish to see a status line included in the response then include the
+<code>statusLine</code> query parameter in the request with a value of
+<code>true</code>.</p>
+
+<p>Each context path for a web application that was stopped, reloaded or
+undeployed, but which classes from the previous runs are still loaded in memory,
+thus causing a memory leak, will be listed on a new line. If an application
+has been reloaded several times, it may be listed several times.</p>
+
+<p>If the command does not succeed, the response will start with
+<code>FAIL</code> and include an error message.</p>
+
+</div></div>
+
+<div class="subsection"><h4 id="Connector_SSL/TLS_cipher_information">Connector SSL/TLS cipher information</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/sslConnectorCiphers</code></pre></div>
+
+<p>The SSL Connector/Ciphers diagnostic lists the SSL/TLS ciphers that are currently
+configured for each connector. For NIO and NIO2, the names of the individual
+cipher suites are listed. For APR, the value of SSLCipherSuite is returned.</p>
+
+<p>The response will look something like this:</p>
+<div class="codeBox"><pre><code>OK - Connector / SSL Cipher information
+Connector[HTTP/1.1-8080]
+ SSL is not enabled for this connector
+Connector[HTTP/1.1-8443]
+ TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
+ TLS_DHE_RSA_WITH_AES_128_CBC_SHA
+ TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
+ TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
+ ...</code></pre></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="Connector_SSL/TLS_certificate_chain_information">Connector SSL/TLS certificate chain information</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/sslConnectorCerts</code></pre></div>
+
+<p>The SSL Connector/Certs diagnostic lists the certificate chain that is
+currently configured for each virtual host.</p>
+
+<p>The response will look something like this:</p>
+<div class="codeBox"><pre><code>OK - Connector / Certificate Chain information
+Connector[HTTP/1.1-8080]
+SSL is not enabled for this connector
+Connector[HTTP/1.1-8443]-_default_-RSA
+[
+[
+ Version: V3
+ Subject: CN=localhost, OU=Apache Tomcat PMC, O=The Apache Software Foundation, L=Wakefield, ST=MA, C=US
+ Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11
+ ...</code></pre></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="Connector_SSL/TLS_trusted_certificate_information">Connector SSL/TLS trusted certificate information</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/sslConnectorTrustedCerts</code></pre></div>
+
+<p>The SSL Connector/Certs diagnostic lists the trusted certificates that are
+currently configured for each virtual host.</p>
+
+<p>The response will look something like this:</p>
+<div class="codeBox"><pre><code>OK - Connector / Trusted Certificate information
+Connector[HTTP/1.1-8080]
+SSL is not enabled for this connector
+Connector[HTTP/1.1-8443]-_default_
+[
+[
+ Version: V3
+ Subject: CN=Apache Tomcat Test CA, OU=Apache Tomcat PMC, O=The Apache Software Foundation, L=Wakefield, ST=MA, C=US
+ ...</code></pre></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="Reload_TLS_configuration">Reload TLS configuration</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/sslReload?tlsHostName=name</code></pre></div>
+
+<p>Reload the TLS configuration files (the certificate and key files, this does
+not trigger a re-parsing of server.xml). To reload the files for all hosts don't
+specify the <code>tlsHostName</code> parameter.</p>
+
+<div class="codeBox"><pre><code>OK - Reloaded TLS configuration for [_default_]</code></pre></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="Thread_Dump">Thread Dump</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/threaddump</code></pre></div>
+
+<p>Write a JVM thread dump.</p>
+
+<p>The response will look something like this:</p>
+<div class="codeBox"><pre><code>OK - JVM thread dump
+2014-12-08 07:24:40.080
+Full thread dump Java HotSpot(TM) Client VM (25.25-b02 mixed mode):
+
+"http-nio-8080-exec-2" Id=26 cpu=46800300 ns usr=46800300 ns blocked 0 for -1 ms waited 0 for -1 ms
+ java.lang.Thread.State: RUNNABLE
+ locks java.util.concurrent.ThreadPoolExecutor$Worker@1738ad4
+ at sun.management.ThreadImpl.dumpThreads0(Native Method)
+ at sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:446)
+ at org.apache.tomcat.util.Diagnostics.getThreadDump(Diagnostics.java:440)
+ at org.apache.tomcat.util.Diagnostics.getThreadDump(Diagnostics.java:409)
+ at org.apache.catalina.manager.ManagerServlet.threadDump(ManagerServlet.java:557)
+ at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:371)
+ at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
+ at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
+...
+</code></pre></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="VM_Info">VM Info</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/vminfo</code></pre></div>
+
+<p>Write some diagnostic information about Java Virtual Machine.</p>
+
+<p>The response will look something like this:</p>
+<div class="codeBox"><pre><code>OK - VM info
+2014-12-08 07:27:32.578
+Runtime information:
+ vmName: Java HotSpot(TM) Client VM
+ vmVersion: 25.25-b02
+ vmVendor: Oracle Corporation
+ specName: Java Virtual Machine Specification
+ specVersion: 1.8
+ specVendor: Oracle Corporation
+ managementSpecVersion: 1.2
+ name: ...
+ startTime: 1418012458849
+ uptime: 393855
+ isBootClassPathSupported: true
+
+OS information:
+...
+</code></pre></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="Save_Configuration">Save Configuration</h4><div class="text">
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/text/save</code></pre></div>
+
+<p>If specified without any parameters, this command saves the current
+configuration of the server to server.xml. The existing file will be renamed as
+a backup if required.</p>
+
+<p>If specified with a <code>path</code> parameter that matches the path of
+a deployed web application then the configuration for that web application will
+be saved to an appropriately named context.xml file in the <code>xmlBase</code>
+for the current Host.</p>
+
+<p>To use the command a StoreConfig MBean must be present. Typically this is
+configured using the <a href="config/listeners.html#StoreConfig_Lifecycle_Listener_-_org.apache.catalina.storeconfig.StoreConfigLifecycleListener">StoreConfigLifecycleListener</a>.
+</p>
+
+<p>If the command does not succeed, the response will start with
+<code>FAIL</code> and include an error message.</p>
+
+</div></div>
+
+</div><h3 id="Server_Status">Server Status</h3><div class="text">
+
+<p>From the following links you can view Status information about the server.
+Any one of <strong>manager-xxx</strong> roles allows access to this page.</p>
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/status
+http://localhost:8080/manager/status/all</code></pre></div>
+
+<p>Displays server status information in HTML format.</p>
+
+<div class="codeBox"><pre><code>http://localhost:8080/manager/status?XML=true
+http://localhost:8080/manager/status/all?XML=true</code></pre></div>
+
+<p>Displays server status information in XML format.</p>
+
+<p>First, you have the server and JVM version number, JVM provider, OS name
+and number followed by the architecture type.</p>
+
+<p>Second, there is information about the memory usage of the JVM.</p>
+
+<p>Then, there is information about the Tomcat AJP and HTTP connectors.
+The same information is available for both of them :
+</p>
+<ul>
+ <li><p>Threads information : Max threads, min and max spare threads,
+ current thread count and current thread busy.</p></li>
+ <li><p>Request information : Max processing time and processing time,
+ request and error count, bytes received and sent.</p></li>
+ <li><p>A table showing Stage, Time, Bytes Sent, Bytes Receive, Client,
+ VHost and Request. All existing threads are listed in the table.
+ Here is the list of the possible thread stages :</p>
+ <ul>
+ <li><p><em>"Parse and Prepare Request"</em> : The request headers are
+ being parsed or the necessary preparation to read the request body (if
+ a transfer encoding has been specified) is taking place.</p></li>
+ <li><p><em>"Service"</em> : The thread is processing a request and
+ generating the response. This stage follows the "Parse and Prepare
+ Request" stage and precedes the "Finishing" stage. There is always at
+ least one thread in this stage (the server-status page).</p></li>
+ <li><p><em>"Finishing"</em> : The end of the request processing. Any
+ remainder of the response still in the output buffers is sent to the
+ client. This stage is followed by "Keep-Alive" if it is appropriate to
+ keep the connection alive or "Ready" if "Keep-Alive" is not
+ appropriate.</p></li>
+ <li><p><em>"Keep-Alive"</em> : The thread keeps the connection open to
+ the client in case the client sends another request. If another request
+ is received, the next stage will be "Parse and Prepare Request". If no
+ request is received before the keep alive times out, the connection will
+ be closed and the next stage will be "Ready".</p></li>
+ <li><p><em>"Ready"</em> : The thread is at rest and ready to be
+ used.</p></li>
+ </ul>
+ </li>
+</ul>
+
+<p>If you are using <code>/status/all</code> command, additional information
+on each of deployed web applications will be available.</p>
+
+</div><h3 id="Using_the_JMX_Proxy_Servlet">Using the JMX Proxy Servlet</h3><div class="text">
+
+ <div class="subsection"><h4 id="What_is_JMX_Proxy_Servlet">What is JMX Proxy Servlet</h4><div class="text">
+ The JMX Proxy Servlet is a lightweight proxy to get and set the
+ tomcat internals. (Or any class that has been exposed via an MBean)
+ Its usage is not very user friendly but the UI is
+ extremely helpful for integrating command line scripts for monitoring
+ and changing the internals of tomcat. You can do two things with the proxy:
+ get information and set information. For you to really understand the
+ JMX Proxy Servlet, you should have a general understanding of JMX.
+ If you don't know what JMX is, then prepare to be confused.
+ </div></div>
+
+ <div class="subsection"><h4 id="JMX_Query_command">JMX Query command</h4><div class="text">
+ <p>This takes the form:</p>
+<div class="codeBox"><pre><code>http://webserver/manager/jmxproxy/?qry=STUFF</code></pre></div>
+ <p>Where <code>STUFF</code> is the JMX query you wish to perform. For example,
+ here are some queries you might wish to run:</p>
+ <ul>
+ <li>
+ <code>qry=*%3Atype%3DRequestProcessor%2C* -->
+ type=RequestProcessor</code> which will locate all
+ workers which can process requests and report
+ their state.
+ </li>
+ <li>
+ <code>qry=*%3Aj2eeType=Servlet%2c* -->
+ j2eeType=Servlet</code> which return all loaded servlets.
+ </li>
+ <li>
+ <code>qry=Catalina%3Atype%3DEnvironment%2Cresourcetype%3DGlobal%2Cname%3DsimpleValue -->
+ Catalina:type=Environment,resourcetype=Global,name=simpleValue</code>
+ which look for a specific MBean by the given name.
+ </li>
+ </ul>
+ <p>
+ You'll need to experiment with this to really understand its capabilities
+ If you provide no <code>qry</code> parameter, then all of the MBeans will
+ be displayed. We really recommend looking at the tomcat source code and
+ understand the JMX spec to get a better understanding of all the queries
+ you may run.
+ </p>
+ </div></div>
+
+ <div class="subsection"><h4 id="JMX_Get_command">JMX Get command</h4><div class="text">
+ <p>
+ The JMXProxyServlet also supports a "get" command that you can use to
+ fetch the value of a specific MBean's attribute. The general form of
+ the <code>get</code> command is:
+ </p>
+
+<div class="codeBox"><pre><code>http://webserver/manager/jmxproxy/?get=BEANNAME&att=MYATTRIBUTE&key=MYKEY</code></pre></div>
+
+ <p>You must provide the following parameters:</p>
+ <ol>
+ <li><code>get</code>: The full bean name</li>
+ <li><code>att</code>: The attribute you wish to fetch</li>
+ <li><code>key</code>: (optional) The key into a CompositeData MBean attribute</li>
+ </ol>
+ <p>
+ If all goes well, then it will say OK, otherwise an error message will
+ be shown. For example, let's say we wish to fetch the current heap memory
+ data:
+ </p>
+
+<div class="codeBox"><pre><code>http://webserver/manager/jmxproxy/?get=java.lang:type=Memory&att=HeapMemoryUsage</code></pre></div>
+
+ <p>Or, if you only want the "used" key:</p>
+
+<div class="codeBox"><pre><code>http://webserver/manager/jmxproxy/
+ ?get=java.lang:type=Memory&att=HeapMemoryUsage&key=used</code></pre></div>
+ </div></div>
+
+ <div class="subsection"><h4 id="JMX_Set_command">JMX Set command</h4><div class="text">
+ <p>
+ Now that you can query an MBean, its time to muck with Tomcat's internals!
+ The general form of the set command is :
+ </p>
+<div class="codeBox"><pre><code>http://webserver/manager/jmxproxy/?set=BEANNAME&att=MYATTRIBUTE&val=NEWVALUE</code></pre></div>
+ <p>So you need to provide 3 request parameters:</p>
+ <ol>
+ <li><code>set</code>: The full bean name</li>
+ <li><code>att</code>: The attribute you wish to alter</li>
+ <li><code>val</code>: The new value </li>
+ </ol>
+ <p>
+ If all goes ok, then it will say OK, otherwise an error message will be
+ shown. For example, lets say we wish to turn up debugging on the fly for the
+ <code>ErrorReportValve</code>. The following will set debugging to 10.
+ </p>
+<div class="codeBox"><pre><code>http://localhost:8080/manager/jmxproxy/
+ ?set=Catalina%3Atype%3DValve%2Cname%3DErrorReportValve%2Chost%3Dlocalhost
+ &att=debug&val=10</code></pre></div>
+ <p>and my result is (YMMV):</p>
+<div class="codeBox"><pre><code>Result: ok</code></pre></div>
+
+ <p>Here is what I see if I pass in a bad value. Here is the URL I used,
+ I try set debugging equal to 'cow':</p>
+<div class="codeBox"><pre><code>http://localhost:8080/manager/jmxproxy/
+ ?set=Catalina%3Atype%3DValve%2Cname%3DErrorReportValve%2Chost%3Dlocalhost
+ &att=debug&val=cow</code></pre></div>
+ <p>When I try that, my result is</p>
+<div class="codeBox"><pre><code>Error: java.lang.NumberFormatException: For input string: "cow"</code></pre></div>
+ </div></div>
+
+ <div class="subsection"><h4 id="JMX_Invoke_command">JMX Invoke command</h4><div class="text">
+ <p>The <code>invoke</code> command enables methods to be called on MBeans. The
+ general form of the command is:</p>
+<div class="codeBox"><pre><code>http://webserver/manager/jmxproxy/
+ ?invoke=BEANNAME&op=METHODNAME&ps=COMMASEPARATEDPARAMETERS</code></pre></div>
+ <p>For example, to call the <code>findConnectors()</code> method of the
+ <strong>Service</strong> use:</p>
+<div class="codeBox"><pre><code>http://localhost:8080/manager/jmxproxy/
+ ?invoke=Catalina%3Atype%3DService&op=findConnectors&ps=</code></pre></div>
+ </div></div>
+</div><h3 id="Executing_Manager_Commands_With_Ant">Executing Manager Commands With Ant</h3><div class="text">
+
+<p>In addition to the ability to execute Manager commands via HTTP requests,
+as documented above, Tomcat includes a convenient set of Task definitions
+for the <em>Ant</em> (version 1.4 or later) build tool. In order to use these
+commands, you must perform the following setup operations:</p>
+<ul>
+<li>Download the binary distribution of Ant from
+ <a href="https://ant.apache.org">https://ant.apache.org</a>.
+ You must use version <strong>1.4</strong> or later.</li>
+<li>Install the Ant distribution in a convenient directory (called
+ ANT_HOME in the remainder of these instructions).</li>
+<li>Add the <code>$ANT_HOME/bin</code> directory to your <code>PATH</code>
+ environment variable.</li>
+<li>Configure at least one username/password combination in your Tomcat
+ user database that includes the <code>manager-script</code> role.</li>
+</ul>
+
+<p>To use custom tasks within Ant, you must declare them first with an
+<code><import></code> element. Therefore, your <code>build.xml</code>
+file might look something like this:</p>
+
+<div class="codeBox"><pre><code><project name="My Application" default="compile" basedir=".">
+
+ <!-- Configure the directory into which the web application is built -->
+ <property name="build" value="${basedir}/build"/>
+
+ <!-- Configure the context path for this application -->
+ <property name="path" value="/myapp"/>
+
+ <!-- Configure properties to access the Manager application -->
+ <property name="url" value="http://localhost:8080/manager/text"/>
+ <property name="username" value="myusername"/>
+ <property name="password" value="mypassword"/>
+
+ <!-- Configure the path to the Tomcat installation -->
+ <property name="catalina.home" value="/usr/local/apache-tomcat"/>
+
+ <!-- Configure the custom Ant tasks for the Manager application -->
+ <import file="${catalina.home}/bin/catalina-tasks.xml"/>
+
+ <!-- Executable Targets -->
+ <target name="compile" description="Compile web application">
+ <!-- ... construct web application in ${build} subdirectory, and
+ generated a ${path}.war ... -->
+ </target>
+
+ <target name="deploy" description="Install web application"
+ depends="compile">
+ <deploy url="${url}" username="${username}" password="${password}"
+ path="${path}" war="file:${build}${path}.war"/>
+ </target>
+
+ <target name="reload" description="Reload web application"
+ depends="compile">
+ <reload url="${url}" username="${username}" password="${password}"
+ path="${path}"/>
+ </target>
+
+ <target name="undeploy" description="Remove web application">
+ <undeploy url="${url}" username="${username}" password="${password}"
+ path="${path}"/>
+ </target>
+
+</project></code></pre></div>
+
+<p>Note: The definition of the resources task via the import above will override
+the resources datatype added in Ant 1.7. If you wish to use the resources
+datatype you will need to use Ant's namespace support to modify
+<code>catalina-tasks.xml</code> to assign the Tomcat tasks to their own
+namespace.</p>
+
+<p>Now, you can execute commands like <code>ant deploy</code> to deploy the
+application to a running instance of Tomcat, or <code>ant reload</code> to
+tell Tomcat to reload it. Note also that most of the interesting values in
+this <code>build.xml</code> file are defined as replaceable properties, so
+you can override their values from the command line. For example, you might
+consider it a security risk to include the real manager password in your
+<code>build.xml</code> file's source code. To avoid this, omit the password
+property, and specify it from the command line:</p>
+<div class="codeBox"><pre><code>ant -Dpassword=secret deploy</code></pre></div>
+
+<div class="subsection"><h4 id="Tasks_output_capture">Tasks output capture</h4><div class="text">
+
+<p>Using <em>Ant</em> version <strong>1.6.2</strong> or later,
+the Catalina tasks offer the option to capture their output in
+properties or external files. They support directly the following subset of the
+<code><redirector></code> type attributes:
+</p>
+
+<table class="defaultTable">
+<tr>
+<th>Attribute</th>
+<th>Description</th>
+<th style="text-align: center;">Required</th>
+</tr>
+<tr>
+<td>output</td>
+<td>Name of a file to which to write the output. If
+the error stream is not also redirected to a file or property, it will
+appear in this output.</td>
+<td style="text-align: center;">No</td>
+</tr>
+<tr>
+<td>error</td>
+<td>The file to which the standard error of the
+command should be redirected.</td>
+<td style="text-align: center;">No</td>
+</tr>
+<tr>
+<td>logError</td>
+<td>This attribute is used when you wish to see
+error output in Ant's log and you are redirecting output to a
+file/property. The error output will not be included in the output
+file/property. If you redirect error with the <i>error</i> or <i>errorProperty</i>
+attributes, this will have no effect.</td>
+<td style="text-align: center;">No</td>
+</tr>
+<tr>
+<td>append</td>
+<td>Whether output and error files should be
+appended to or overwritten. Defaults to <code>false</code>.</td>
+<td style="text-align: center;">No</td>
+</tr>
+<tr>
+<td>createemptyfiles</td>
+<td>Whether output and error files should be created
+even when empty. Defaults to <code>true</code>.</td>
+<td style="text-align: center;">No</td>
+</tr>
+<tr>
+<td>outputproperty</td>
+<td>The name of a property in which the output of
+the command should be stored. Unless the error stream is redirected to
+a separate file or stream, this property will include the error output.</td>
+<td style="text-align: center;">No</td>
+</tr>
+<tr>
+<td>errorproperty</td>
+<td>The name of a property in which the standard
+error of the command should be stored.</td>
+<td style="text-align: center;">No</td>
+</tr>
+</table>
+
+<p>A couple of additional attributes can also be specified:
+</p>
+<table class="defaultTable">
+<tr>
+<th>Attribute</th>
+<th>Description</th>
+<th style="text-align: center;">Required</th>
+</tr>
+<tr>
+<td>alwaysLog</td>
+<td>This attribute is used when you wish to see the
+output you are capturing, appearing also in the Ant's log. It must not be
+used unless you are capturing task output.
+Defaults to <code>false</code>.
+<em>This attribute will be supported directly by <code><redirector></code>
+in Ant 1.6.3</em></td>
+<td style="text-align: center;">No</td>
+</tr>
+<tr>
+<td>failonerror</td>
+<td>This attribute is used when you wish to avoid that
+any manager command processing error terminates the ant execution. Defaults to <code>true</code>.
+It must be set to <code>false</code>, if you want to capture error output,
+otherwise execution will terminate before anything can be captured.
+<br>
+This attribute acts only on manager command execution,
+any wrong or missing command attribute will still cause Ant execution termination.
+</td>
+<td style="text-align: center;">No</td>
+</tr>
+</table>
+
+<p>They also support the embedded <code><redirector></code> element
+in which you can specify
+its full set of attributes, but <code>input</code>, <code>inputstring</code> and
+<code>inputencoding</code> that, even if accepted, are not used because they have
+no meaning in this context.
+Refer to <a href="https://ant.apache.org">ant manual</a> for details on
+<code><redirector></code> element attributes.
+</p>
+
+<p>
+Here is a sample build file extract that shows how this output redirection support
+can be used:
+</p>
+
+<div class="codeBox"><pre><code> <target name="manager.deploy"
+ depends="context.status"
+ if="context.notInstalled">
+ <deploy url="${mgr.url}"
+ username="${mgr.username}"
+ password="${mgr.password}"
+ path="${mgr.context.path}"
+ config="${mgr.context.descriptor}"/>
+ </target>
+
+ <target name="manager.deploy.war"
+ depends="context.status"
+ if="context.deployable">
+ <deploy url="${mgr.url}"
+ username="${mgr.username}"
+ password="${mgr.password}"
+ update="${mgr.update}"
+ path="${mgr.context.path}"
+ war="${mgr.war.file}"/>
+ </target>
+
+ <target name="context.status">
+ <property name="running" value="${mgr.context.path}:running"/>
+ <property name="stopped" value="${mgr.context.path}:stopped"/>
+
+ <list url="${mgr.url}"
+ outputproperty="ctx.status"
+ username="${mgr.username}"
+ password="${mgr.password}">
+ </list>
+
+ <condition property="context.running">
+ <contains string="${ctx.status}" substring="${running}"/>
+ </condition>
+ <condition property="context.stopped">
+ <contains string="${ctx.status}" substring="${stopped}"/>
+ </condition>
+ <condition property="context.notInstalled">
+ <and>
+ <isfalse value="${context.running}"/>
+ <isfalse value="${context.stopped}"/>
+ </and>
+ </condition>
+ <condition property="context.deployable">
+ <or>
+ <istrue value="${context.notInstalled}"/>
+ <and>
+ <istrue value="${context.running}"/>
+ <istrue value="${mgr.update}"/>
+ </and>
+ <and>
+ <istrue value="${context.stopped}"/>
+ <istrue value="${mgr.update}"/>
+ </and>
+ </or>
+ </condition>
+ <condition property="context.undeployable">
+ <or>
+ <istrue value="${context.running}"/>
+ <istrue value="${context.stopped}"/>
+ </or>
+ </condition>
+ </target></code></pre></div>
+
+<p><strong>WARNING:</strong> even if it doesn't make many sense, and is always a bad idea,
+calling a Catalina task more than once,
+badly set Ant tasks depends chains may cause that a task be called
+more than once in the same Ant run, even if not intended to. A bit of caution should be exercised when you are
+capturing output from that task, because this could lead to something unexpected:</p>
+<ul>
+<li>when capturing in a property you will find in it only the output from the <em>first</em> call, because
+Ant properties are immutable and once set they cannot be changed,
+</li>
+<li>when capturing in a file, each run will overwrite it and you will find in it only the <em>last</em> call
+output, unless you are using the <code>append="true"</code> attribute, in which case you will
+see the output of each task call appended to the file.
+</li>
+</ul>
+
+</div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/maven-jars.html b/web/tomcat/webapps/docs/maven-jars.html
new file mode 100644
index 0000000..98677f8
--- /dev/null
+++ b/web/tomcat/webapps/docs/maven-jars.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Apache Tomcat - Using Tomcat libraries with Maven</title><meta name="author" content="Filip Hanik"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tomcat - Using Tomcat libraries with Maven</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Using_Tomcat_libraries_With_Maven">Using Tomcat libraries With Maven</a><ol><li><a href="#Tomcat_Snapshots">Tomcat Snapshots</a></li><li><a href="#Tomcat_Releases">Tomcat Releases</a></li></ol></li></ul>
+</div><h3 id="Using_Tomcat_libraries_With_Maven">Using Tomcat libraries With Maven</h3><div class="text">
+ <div class="subsection"><h4 id="Tomcat_Snapshots">Tomcat Snapshots</h4><div class="text">
+ Tomcat snapshots are located in the
+ <a href="https://repository.apache.org/content/repositories/snapshots/org/apache/tomcat/">Apache Snapshot Repository</a>.
+ The official URL is <div class="codeBox"><pre><code>https://repository.apache.org/content/repositories/snapshots/org/apache/tomcat/</code></pre></div>
+ <p>
+ Snapshots are done periodically, not on a regular basis, but when changes happen and the Tomcat team deems a new snapshot might
+ useful.
+ </p>
+ </div></div>
+ <div class="subsection"><h4 id="Tomcat_Releases">Tomcat Releases</h4><div class="text">
+ <p>
+ Stable releases are published to the
+ <a href="https://repo.maven.apache.org/maven2/org/apache/tomcat/">Maven
+ Central Repository</a>. The URL for this is
+ </p>
+ <div class="codeBox"><pre><code>https://repo.maven.apache.org/maven2/org/apache/tomcat/</code></pre></div>
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/mbeans-descriptors-howto.html b/web/tomcat/webapps/docs/mbeans-descriptors-howto.html
new file mode 100644
index 0000000..c3879bc
--- /dev/null
+++ b/web/tomcat/webapps/docs/mbeans-descriptors-howto.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - MBeans Descriptors How To</title><meta name="author" content="Amy Roh"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>MBeans Descriptors How To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Adding_MBean_descriptions">Adding MBean descriptions</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+<p>Tomcat uses JMX MBeans as the technology for implementing
+manageability of Tomcat.</p>
+
+<p>The descriptions of JMX MBeans for Catalina are in the mbeans-descriptors.xml
+file in each package.</p>
+
+<p>You will need to add MBean descriptions for your custom components
+in order to avoid a "ManagedBean is not found" exception.</p>
+
+</div><h3 id="Adding_MBean_descriptions">Adding MBean descriptions</h3><div class="text">
+
+<p>You may also add MBean descriptions for custom components in
+an mbeans-descriptors.xml file, located in the same package as the class files
+it describes.</p>
+
+<p>The permitted syntax for the mbeans-descriptors.xml is defined by
+the <a href="mbeans-descriptors.dtd">DTD</a> file.</p>
+
+<p>The entries for a custom LDAP authentication Realm may look like this:</p>
+
+<div class="codeBox"><pre><code> <mbean name="LDAPRealm"
+ className="org.apache.catalina.mbeans.ClassNameMBean"
+ description="Custom LDAPRealm"
+ domain="Catalina"
+ group="Realm"
+ type="com.myfirm.mypackage.LDAPRealm">
+
+ <attribute name="className"
+ description="Fully qualified class name of the managed object"
+ type="java.lang.String"
+ writeable="false"/>
+
+ <attribute name="debug"
+ description="The debugging detail level for this component"
+ type="int"/>
+ .
+ .
+ .
+
+ </mbean></code></pre></div>
+
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/mbeans-descriptors.dtd b/web/tomcat/webapps/docs/mbeans-descriptors.dtd
new file mode 100644
index 0000000..28c4d12
--- /dev/null
+++ b/web/tomcat/webapps/docs/mbeans-descriptors.dtd
@@ -0,0 +1,247 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+
+<!--
+ DTD for the Model MBeans Configuration File
+
+ To support validation of your configuration file, include the following
+ DOCTYPE element at the beginning (after the "xml" declaration):
+
+ <!DOCTYPE mbeans-descriptors PUBLIC
+ "-//Apache Software Foundation//DTD Model MBeans Configuration File"
+ "http://jakarta.apache.org/commons/dtds/mbeans-descriptors.dtd">
+-->
+
+
+<!-- ========== Defined Types ============================================= -->
+<!-- This DTD has been modified not to use these entities as their use can -->
+<!-- trigger errors when entity expansion is limited or disabled. -->
+<!-- See https://bz.apache.org/bugzilla/show_bug.cgi?id=64541 -->
+
+<!-- A "Boolean" is the string representation of a boolean (true or false)
+ variable.
+-->
+<!ENTITY % Boolean "(true|false|yes|no)">
+
+
+<!-- A "ClassName" is the fully qualified name of a Java class that is
+ instantiated to provide the functionality of the enclosing element.
+-->
+<!ENTITY % ClassName "CDATA">
+
+
+<!-- A "MethodName" is the name of a constructor or method, which must
+ be legal according to the syntax requirements of the Java language.
+-->
+<!ENTITY % MethodName "CDATA">
+
+
+<!-- A "VariableName" is the name of a variable or parameter, which must
+ be legal according to the syntax requirements of the Java language.
+-->
+<!ENTITY % VariableName "CDATA">
+
+
+<!-- ========== Element Definitions ======================================= -->
+
+
+<!-- The "mbeans-descriptors" element is the root of the configuration file
+ hierarchy, and contains nested elements for all of the other
+ configuration settings. Remaining element definitions are listed
+ in alphabetical order.
+-->
+<!ELEMENT mbeans-descriptors (mbean*)>
+<!ATTLIST mbeans-descriptors id ID #IMPLIED>
+
+
+<!-- The "attribute" element describes a JavaBeans property of an MBean.
+ The following attributes are supported:
+
+ description Human-readable description of this attribute.
+
+ displayName Display name of this attribute.
+
+ getMethod Name of the property getter method, if it does
+ not follow standard JavaBeans naming patterns.
+
+ is Boolean value indicating whether or not this
+ attribute is a boolean with an "is" getter method.
+ By default, this is set to "false".
+
+ name Name of this JavaBeans property, conforming to
+ standard naming design patterns.
+
+ readable Boolean value indicating whether or not this
+ attribute is readable by management applications.
+ By default, this is set to "true".
+
+ setMethod Name of the property setter method, if it does
+ not follow standard JavaBeans naming patterns.
+
+ type Fully qualified Java class name of this attribute.
+
+ writeable Boolean value indicating whether or not this
+ attribute is writeable by management applications.
+ By default, this is set to "true".
+-->
+<!ELEMENT attribute (descriptor?)>
+<!ATTLIST attribute id ID #IMPLIED>
+<!ATTLIST attribute description CDATA #IMPLIED>
+<!ATTLIST attribute displayName CDATA #IMPLIED>
+<!ATTLIST attribute getMethod CDATA #IMPLIED> <!-- %MethodName; -->
+<!ATTLIST attribute is (true|false|yes|no) #IMPLIED> <!-- %Boolean; -->
+<!ATTLIST attribute name CDATA #IMPLIED> <!-- %VariableName; -->
+<!ATTLIST attribute readable (true|false|yes|no) #IMPLIED> <!-- %Boolean; -->
+<!ATTLIST attribute setMethod CDATA #IMPLIED> <!-- %MethodName; -->
+<!ATTLIST attribute type CDATA #IMPLIED> <!-- %ClassName; -->
+<!ATTLIST attribute writeable (true|false|yes|no) #IMPLIED> <!-- %Boolean; -->
+
+
+<!-- The "constructor" element describes a public constructor for the
+ underlying actual class. It may contain nested "parameter" elements
+ for the various arguments to this constructor. The following attributes
+ are supported:
+
+ displayName Display name of this constructor.
+
+ name Name of this constructor (by Java convention, this must
+ be the same as the base class name).
+-->
+<!ELEMENT constructor (descriptor?, parameter*)>
+<!ATTLIST constructor id ID #IMPLIED>
+<!ATTLIST constructor displayName CDATA #IMPLIED>
+<!ATTLIST constructor name CDATA #IMPLIED> <!-- %VariableName; -->
+
+
+<!-- The "descriptor" element groups a set of descriptor fields whose
+ values will be included in the Descriptor for the corresponding
+ metadata info classes.
+-->
+<!ELEMENT descriptor (field*)>
+<!ATTLIST descriptor id ID #IMPLIED>
+
+
+<!-- The "field" element represents a single name/value pair that will
+ be included in the Descriptor corresponding to our enclosing
+ "descriptor" element. The following attributes are supported:
+
+ name Field name of the field to be included
+
+ value Field value of the field to be included
+ (will be stored as a String)
+-->
+<!ELEMENT field EMPTY>
+<!ATTLIST field id ID #IMPLIED>
+<!ATTLIST field name CDATA #REQUIRED>
+<!ATTLIST field value CDATA #REQUIRED>
+
+
+
+<!-- The "mbean" element describes a particular JMX ModelMBean implementation,
+ including the information necessary to construct the corresponding
+ ModelMBeanInfo structures. The following attributes are supported:
+
+ className Fully qualified Java class name of the ModelMBean
+ implementation class. If not specified, the standard
+ implementation provided by JMX will be utilized.
+
+ description Human-readable description of this managed bean.
+
+ domain The JMX MBeanServer domain in which the ModelMBean
+ created by this managed bean should be registered,
+ when creating its ObjectName.
+
+ group Optional name of a "grouping classification" that can
+ be used to select groups of similar MBean implementation
+ classes.
+
+ name Unique name of this MBean (normally corresponds to the
+ base class name of the corresponding server component).
+
+ type Fully qualified Java class name of the underlying
+ managed resource implementation class.
+-->
+<!ELEMENT mbean (descriptor?, attribute*, constructor*, notification*, operation*)>
+<!ATTLIST mbean id ID #IMPLIED>
+<!ATTLIST mbean className CDATA #IMPLIED> <!-- %ClassName; -->
+<!ATTLIST mbean description CDATA #IMPLIED>
+<!ATTLIST mbean domain CDATA #IMPLIED>
+<!ATTLIST mbean group CDATA #IMPLIED>
+<!ATTLIST mbean name CDATA #IMPLIED> <!-- %MethodName; -->
+<!ATTLIST mbean type CDATA #IMPLIED> <!-- %ClassName; -->
+
+
+<!-- The "notification" element describes the notification types that are
+ generated by a particular managed bean. The following attributes
+ are supported:
+
+ description Human-readable description of these notification events.
+
+ name Name of this set of notification event types.
+-->
+<!ELEMENT notification (descriptor?, notification-type*)>
+<!ATTLIST notification id ID #IMPLIED>
+<!ATTLIST notification description CDATA #IMPLIED>
+<!ATTLIST notification name CDATA #IMPLIED> <!-- %VariableName; -->
+
+
+<!-- The nested content of the "notification-type" element is the event string
+ of an event that can be emitted by this MBean.
+-->
+<!ELEMENT notification-type (#PCDATA)>
+<!ATTLIST notification-type id ID #IMPLIED>
+
+
+<!-- The "operation" element describes a the signature of a public method
+ that is accessible to management applications. The following attributes
+ are supported:
+
+ description Human-readable description of this operation.
+
+ impact Indication of the impact of this method:
+ ACTION (write like), ACTION-INFO (write+read like)
+ INFO (read like), or UNKNOWN.
+
+ name Name of this public method.
+
+ returnType Fully qualified Java class name of the return
+ type of this method.
+-->
+<!ELEMENT operation (descriptor?, parameter*)>
+<!ATTLIST operation id ID #IMPLIED>
+<!ATTLIST operation description CDATA #IMPLIED>
+<!ATTLIST operation impact CDATA #IMPLIED>
+<!ATTLIST operation name CDATA #IMPLIED> <!-- %VariableName; -->
+<!ATTLIST operation returnType CDATA #IMPLIED> <!-- %ClassName; -->
+
+
+<!-- The "parameter" element describes a single argument that will be passed
+ to a constructor or operation. The following attributes are supported:
+
+ description Human-readable description of this parameter.
+
+ name Java language name of this parameter.
+
+ type Fully qualified Java class name of this parameter.
+-->
+<!ELEMENT parameter EMPTY>
+<!ATTLIST parameter id ID #IMPLIED>
+<!ATTLIST parameter description CDATA #IMPLIED>
+<!ATTLIST parameter name CDATA #IMPLIED> <!-- %VariableName; -->
+<!ATTLIST parameter type CDATA #IMPLIED> <!-- %ClassName; -->
diff --git a/web/tomcat/webapps/docs/monitoring.html b/web/tomcat/webapps/docs/monitoring.html
new file mode 100644
index 0000000..36111ce
--- /dev/null
+++ b/web/tomcat/webapps/docs/monitoring.html
@@ -0,0 +1,1118 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Monitoring and Managing Tomcat</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Monitoring and Managing Tomcat</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Enabling_JMX_Remote">Enabling JMX Remote</a></li><li><a href="#Manage_Tomcat_with_JMX_remote_Ant_Tasks">Manage Tomcat with JMX remote Ant Tasks</a></li><li><a href="#JMXAccessorOpenTask_-_JMX_open_connection_task">JMXAccessorOpenTask - JMX open connection task</a></li><li><a href="#JMXAccessorGetTask:__get_attribute_value_Ant_task">JMXAccessorGetTask: get attribute value Ant task</a></li><li><a href="#JMXAccessorSetTask:__set_attribute_value_Ant_task">JMXAccessorSetTask: set attribute value Ant task</a></li><li><a href="#JMXAccessorInvokeTask:__invoke_MBean_operation_Ant_task">JMXAccessorInvokeTask: invoke MBean operation Ant task</a></li><li><a href="#JMXAccessorQueryTask:__query_MBean_Ant_task">JMXAccessorQueryTask: query MBean Ant task</a></li><li><a href="#JMXAccessorCreateTask:__remote_create_MBean_Ant_task">JMXAccessorCreateTask: remote create MBean Ant task</a></li><li><a href="#JMXAccessorUnregisterTask:__remote_unregister_MBean_Ant_task">JMXAccessorUnregisterTask: remote unregister MBean Ant task</a></li><li><a href="#JMXAccessorCondition:__express_condition">JMXAccessorCondition: express condition</a></li><li><a href="#JMXAccessorEqualsCondition:__equals_MBean_Ant_condition">JMXAccessorEqualsCondition: equals MBean Ant condition</a></li><li><a href="#Using_the_JMXProxyServlet">Using the JMXProxyServlet</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>Monitoring is a key aspect of system administration. Looking inside a
+ running server, obtaining some statistics or reconfiguring some aspects of
+ an application are all daily administration tasks.</p>
+
+ </div><h3 id="Enabling_JMX_Remote">Enabling JMX Remote</h3><div class="text">
+
+ <p><strong>Note:</strong> This configuration is needed only if you are
+ going to monitor Tomcat remotely. It is not needed if you are going
+ to monitor it locally, using the same user that Tomcat runs with.</p>
+
+ <p>The Oracle website includes the list of options and how to configure
+ JMX Remote on Java 8:
+ <a href="https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html">
+ http://docs.oracle.com/javase/6/docs/technotes/guides/management/agent.html</a>.
+ </p>
+ <p>The following is a quick configuration guide for Java 8:</p>
+ <p>Add the following parameters to <code>setenv.bat</code> script of your
+ Tomcat (see <a href="RUNNING.txt">RUNNING.txt</a> for details).<br>
+ <em>Note:</em> This syntax is for Microsoft Windows. The command has
+ to be on the same line. It is wrapped to be more readable. If Tomcat is
+ running as a Windows service, use its configuration dialog to set
+ java options for the service.
+ For Linux, MacOS, etc, remove <code>"set "</code> from beginning of the
+ line.
+ </p>
+<div class="codeBox"><pre><code>set CATALINA_OPTS=-Dcom.sun.management.jmxremote.port=%my.jmx.port%
+ -Dcom.sun.management.jmxremote.rmi.port=%my.rmi.port%
+ -Dcom.sun.management.jmxremote.ssl=false
+ -Dcom.sun.management.jmxremote.authenticate=false</code></pre></div>
+<p>If you don't set <code>com.sun.management.jmxremote.rmi.port</code> then the
+JSR 160 JMX-Adaptor will select a port at random which will may it difficult to
+configure a firewall to allow access.</p>
+
+<p>If you require TLS:</p>
+ <ol>
+ <li>change and add this:
+<div class="codeBox"><pre><code> -Dcom.sun.management.jmxremote.ssl=true
+ -Dcom.sun.management.jmxremote.registry.ssl=true
+</code></pre></div></li>
+ <li>to configure the protocols and/or cipher suites use:
+<div class="codeBox"><pre><code> -Dcom.sun.management.jmxremote.ssl.enabled.protocols=%my.jmx.ssl.protocols%
+ -Dcom.sun.management.jmxremote.ssl.enabled.cipher.suites=%my.jmx.cipher.suites%
+</code></pre></div></li>
+ <li>to client certificate authentication use:
+<div class="codeBox"><pre><code> -Dcom.sun.management.jmxremote.ssl.need.client.auth=%my.jmx.ssl.clientauth%</code></pre></div></li>
+ </ol>
+<p>If you require authorization (it is strongly recommended that TLS is always
+used with authentication):</p>
+ <ol>
+ <li>change and add this:
+<div class="codeBox"><pre><code> -Dcom.sun.management.jmxremote.authenticate=true
+ -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password
+ -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access</code></pre></div>
+ </li>
+ <li>edit the access authorization file <em>$CATALINA_BASE/conf/jmxremote.access</em>:
+<div class="codeBox"><pre><code>monitorRole readonly
+controlRole readwrite</code></pre></div>
+ </li>
+ <li>edit the password file <em>$CATALINA_BASE/conf/jmxremote.password</em>:
+<div class="codeBox"><pre><code>monitorRole tomcat
+controlRole tomcat</code></pre></div>
+ <b>Tip</b>: The password file should be read-only and only accessible by the
+ operating system user Tomcat is running as.
+ </li>
+ <li>Alternatively, you can configure a JAAS login module with:
+<div class="codeBox"><pre><code> -Dcom.sun.management.jmxremote.login.config=%login.module.name%</code></pre></div></li>
+ </ol>
+
+<p>If you need to specify a host name to be used in the RMI stubs sent to the
+client (e.g. because the public host name that must be used to connect is not
+the same as the local host name) then you can set:</p>
+<div class="codeBox"><pre><code>set CATALINA_OPTS=-Djava.rmi.server.hostname</code></pre></div>
+
+<p>If you need to specify a specific interface for the JMX service to bind to
+then you can set:</p>
+<div class="codeBox"><pre><code>set CATALINA_OPTS=-Dcom.sun.management.jmxremote.host</code></pre></div>
+
+ </div><h3 id="Manage_Tomcat_with_JMX_remote_Ant_Tasks">Manage Tomcat with JMX remote Ant Tasks</h3><div class="text">
+ <p>To simplify JMX usage with Ant, a set of tasks is provided that may
+ be used with antlib.</p>
+ <p><b>antlib</b>: Copy your catalina-ant.jar from $CATALINA_HOME/lib to $ANT_HOME/lib.</p>
+ <p>The following example shows the JMX Accessor usage:<br>
+ <em>Note:</em> The <code>name</code> attribute value was wrapped here to be
+ more readable. It has to be all on the same line, without spaces.</p>
+ <div class="codeBox"><pre><code><project name="Catalina Ant JMX"
+ xmlns:jmx="antlib:org.apache.catalina.ant.jmx"
+ default="state"
+ basedir=".">
+ <property name="jmx.server.name" value="localhost" />
+ <property name="jmx.server.port" value="9012" />
+ <property name="cluster.server.address" value="192.168.1.75" />
+ <property name="cluster.server.port" value="9025" />
+
+ <target name="state" description="Show JMX Cluster state">
+ <jmx:open
+ host="${jmx.server.name}"
+ port="${jmx.server.port}"
+ username="controlRole"
+ password="tomcat"/>
+ <jmx:get
+ name=
+"Catalina:type=IDataSender,host=localhost,
+senderAddress=${cluster.server.address},senderPort=${cluster.server.port}"
+ attribute="connected"
+ resultproperty="IDataSender.backup.connected"
+ echo="false"
+ />
+ <jmx:get
+ name="Catalina:type=ClusterSender,host=localhost"
+ attribute="senderObjectNames"
+ resultproperty="senderObjectNames"
+ echo="false"
+ />
+ <!-- get current maxActiveSession from ClusterTest application
+ echo it to Ant output and store at
+ property <em>clustertest.maxActiveSessions.orginal</em>
+ -->
+ <jmx:get
+ name="Catalina:type=Manager,context=/ClusterTest,host=localhost"
+ attribute="maxActiveSessions"
+ resultproperty="clustertest.maxActiveSessions.orginal"
+ echo="true"
+ />
+ <!-- set maxActiveSession to 100
+ -->
+ <jmx:set
+ name="Catalina:type=Manager,context=/ClusterTest,host=localhost"
+ attribute="maxActiveSessions"
+ value="100"
+ type="int"
+ />
+ <!-- get all sessions and split result as delimiter <em>SPACE</em> for easy
+ access all session ids directly with Ant property sessions.[0..n].
+ -->
+ <jmx:invoke
+ name="Catalina:type=Manager,context=/ClusterTest,host=localhost"
+ operation="listSessionIds"
+ resultproperty="sessions"
+ echo="false"
+ delimiter=" "
+ />
+ <!-- Access session attribute <em>Hello</em> from first session.
+ -->
+ <jmx:invoke
+ name="Catalina:type=Manager,context=/ClusterTest,host=localhost"
+ operation="getSessionAttribute"
+ resultproperty="Hello"
+ echo="false"
+ >
+ <arg value="${sessions.0}"/>
+ <arg value="Hello"/>
+ </jmx:invoke>
+ <!-- Query for all application manager.of the server from all hosts
+ and bind all attributes from all found manager MBeans.
+ -->
+ <jmx:query
+ name="Catalina:type=Manager,*"
+ resultproperty="manager"
+ echo="true"
+ attributebinding="true"
+ />
+ <!-- echo the create properties -->
+<echo>
+senderObjectNames: ${senderObjectNames.0}
+IDataSender.backup.connected: ${IDataSender.backup.connected}
+session: ${sessions.0}
+manager.length: ${manager.length}
+manager.0.name: ${manager.0.name}
+manager.1.name: ${manager.1.name}
+hello: ${Hello}
+manager.ClusterTest.0.name: ${manager.ClusterTest.0.name}
+manager.ClusterTest.0.activeSessions: ${manager.ClusterTest.0.activeSessions}
+manager.ClusterTest.0.counterSend_EVT_SESSION_EXPIRED:
+ ${manager.ClusterTest.0.counterSend_EVT_SESSION_EXPIRED}
+manager.ClusterTest.0.counterSend_EVT_GET_ALL_SESSIONS:
+ ${manager.ClusterTest.0.counterSend_EVT_GET_ALL_SESSIONS}
+</echo>
+
+ </target>
+
+</project></code></pre></div>
+ <p><b>import:</b> Import the JMX Accessor Project with
+ <em><import file="${CATALINA.HOME}/bin/catalina-tasks.xml" /></em> and
+ reference the tasks with <em>jmxOpen</em>, <em>jmxSet</em>, <em>jmxGet</em>,
+ <em>jmxQuery</em>, <em>jmxInvoke</em>, <em>jmxEquals</em> and <em>jmxCondition</em>.</p>
+
+ </div><h3 id="JMXAccessorOpenTask_-_JMX_open_connection_task">JMXAccessorOpenTask - JMX open connection task</h3><div class="text">
+<p>
+List of Attributes
+</p>
+<table class="defaultTable">
+
+ <tr>
+ <th>Attribute</th>
+ <th>Description</th>
+ <th>Default value</th>
+ </tr>
+
+ <tr>
+ <td>url</td>
+ <td>Set JMX connection URL - <em>service:jmx:rmi:///jndi/rmi://localhost:8050/jmxrmi</em>
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>host</td>
+ <td>Set the host, shortcut the very long URL syntax.
+ </td>
+ <td><code class="noHighlight">localhost</code></td>
+ </tr>
+
+ <tr>
+ <td>port</td>
+ <td>Set the remote connection port
+ </td>
+ <td><code class="noHighlight">8050</code></td>
+ </tr>
+
+ <tr>
+ <td>username</td>
+ <td>remote JMX connection user name.
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>password</td>
+ <td>remote JMX connection password.
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>ref</td>
+ <td>Name of the internal connection reference. With this attribute you can
+ configure more the one connection inside the same Ant project.
+ </td>
+ <td><code class="noHighlight">jmx.server</code></td>
+ </tr>
+
+ <tr>
+ <td>echo</td>
+ <td>Echo the command usage (for access analysis or debugging)
+ </td>
+ <td><code class="noHighlight">false</code></td>
+ </tr>
+
+ <tr>
+ <td>if</td>
+ <td>Only execute if a property of the given name <b>exists</b> in the current project.
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>unless</td>
+ <td>Only execute if a property of the given name <b>not exists</b> in the current project.
+ </td>
+ <td></td>
+ </tr>
+
+</table>
+
+<p>
+Example to open a new JMX connection
+</p>
+<div class="codeBox"><pre><code> <jmx:open
+ host="${jmx.server.name}"
+ port="${jmx.server.port}"
+ /></code></pre></div>
+
+<p>
+Example to open a JMX connection from URL, with authorization and
+store at other reference
+</p>
+<div class="codeBox"><pre><code> <jmx:open
+ url="service:jmx:rmi:///jndi/rmi://localhost:9024/jmxrmi"
+ ref="jmx.server.9024"
+ username="controlRole"
+ password="tomcat"
+ /></code></pre></div>
+
+<p>
+Example to open a JMX connection from URL, with authorization and
+store at other reference, but only when property <em>jmx.if</em> exists and
+<em>jmx.unless</em> not exists
+</p>
+<div class="codeBox"><pre><code> <jmx:open
+ url="service:jmx:rmi:///jndi/rmi://localhost:9024/jmxrmi"
+ ref="jmx.server.9024"
+ username="controlRole"
+ password="tomcat"
+ if="jmx.if"
+ unless="jmx.unless"
+ /></code></pre></div>
+
+<p><b>Note</b>: All properties from <em>jmxOpen</em> task also exists at all
+other tasks and conditions.
+</p>
+
+</div><h3 id="JMXAccessorGetTask:__get_attribute_value_Ant_task">JMXAccessorGetTask: get attribute value Ant task</h3><div class="text">
+<p>
+List of Attributes
+</p>
+<table class="defaultTable">
+
+ <tr>
+ <th>Attribute</th>
+ <th>Description</th>
+ <th>Default value</th>
+ </tr>
+
+ <tr>
+ <td>name</td>
+ <td>Full qualified JMX ObjectName -- <em>Catalina:type=Server</em>
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>attribute</td>
+ <td>Existing MBean attribute (see Tomcat MBean description above)
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>ref</td>
+ <td>JMX Connection reference
+ </td>
+ <td><code class="noHighlight">jmx.server</code></td>
+ </tr>
+
+ <tr>
+ <td>echo</td>
+ <td>Echo command usage (access and result)
+ </td>
+ <td><code class="noHighlight">false</code></td>
+ </tr>
+
+ <tr>
+ <td>resultproperty</td>
+ <td>Save result at this project property
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>delimiter</td>
+ <td>Split result with delimiter (java.util.StringTokenizer)
+ and use resultproperty as prefix to store tokens.
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>separatearrayresults</td>
+ <td>When return value is an array, save result as property list
+ (<em>$resultproperty.[0..N]</em> and <em>$resultproperty.length</em>)
+ </td>
+ <td><code class="noHighlight">true</code></td>
+ </tr>
+
+</table>
+
+<p>
+Example to get remote MBean attribute from default JMX connection
+</p>
+<div class="codeBox"><pre><code> <jmx:get
+ name="Catalina:type=Manager,context=/servlets-examples,host=localhost"
+ attribute="maxActiveSessions"
+ resultproperty="servlets-examples.maxActiveSessions"
+ /></code></pre></div>
+
+<p>
+Example to get and result array and split it at separate properties
+</p>
+<div class="codeBox"><pre><code> <jmx:get
+ name="Catalina:type=ClusterSender,host=localhost"
+ attribute="senderObjectNames"
+ resultproperty="senderObjectNames"
+ /></code></pre></div>
+<p>
+Access the senderObjectNames properties with:
+</p>
+<div class="codeBox"><pre><code> ${senderObjectNames.length} give the number of returned sender list.
+ ${senderObjectNames.[0..N]} found all sender object names</code></pre></div>
+
+
+<p>
+Example to get IDataSender attribute connected only when cluster is configured.<br>
+<em>Note:</em> The <code>name</code> attribute value was wrapped here to be
+more readable. It has to be all on the same line, without spaces.
+</p>
+<div class="codeBox"><pre><code>
+ <jmx:query
+ failonerror="false"
+ name="Catalina:type=Cluster,host=${tomcat.application.host}"
+ resultproperty="cluster"
+ />
+ <jmx:get
+ name=
+"Catalina:type=IDataSender,host=${tomcat.application.host},
+senderAddress=${cluster.backup.address},senderPort=${cluster.backup.port}"
+ attribute="connected"
+ resultproperty="datasender.connected"
+ if="cluster.0.name" /></code></pre></div>
+
+</div><h3 id="JMXAccessorSetTask:__set_attribute_value_Ant_task">JMXAccessorSetTask: set attribute value Ant task</h3><div class="text">
+<p>
+List of Attributes
+</p>
+<table class="defaultTable">
+
+ <tr>
+ <th>Attribute</th>
+ <th>Description</th>
+ <th>Default value</th>
+ </tr>
+
+ <tr>
+ <td>name</td>
+ <td>Full qualified JMX ObjectName -- <em>Catalina:type=Server</em>
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>attribute</td>
+ <td>Existing MBean attribute (see Tomcat MBean description above)
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>value</td>
+ <td>value that set to attribute
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>type</td>
+ <td>type of the attribute.
+ </td>
+ <td><code class="noHighlight">java.lang.String</code></td>
+ </tr>
+
+ <tr>
+ <td>ref</td>
+ <td>JMX Connection reference
+ </td>
+ <td><code class="noHighlight">jmx.server</code></td>
+ </tr>
+
+ <tr>
+ <td>echo</td>
+ <td>Echo command usage (access and result)
+ </td>
+ <td><code class="noHighlight">false</code></td>
+ </tr>
+
+</table>
+
+<p>
+Example to set remote MBean attribute value
+</p>
+<div class="codeBox"><pre><code> <jmx:set
+ name="Catalina:type=Manager,context=/servlets-examples,host=localhost"
+ attribute="maxActiveSessions"
+ value="500"
+ type="int"
+ /></code></pre></div>
+
+
+</div><h3 id="JMXAccessorInvokeTask:__invoke_MBean_operation_Ant_task">JMXAccessorInvokeTask: invoke MBean operation Ant task</h3><div class="text">
+<p>
+List of Attributes
+</p>
+<table class="defaultTable">
+
+ <tr>
+ <th>Attribute</th>
+ <th>Description</th>
+ <th>Default value</th>
+ </tr>
+
+ <tr>
+ <td>name</td>
+ <td>Full qualified JMX ObjectName -- <em>Catalina:type=Server</em>
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>operation</td>
+ <td>Existing MBean operation
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>ref</td>
+ <td>JMX Connection reference
+ </td>
+ <td><code class="noHighlight">jmx.server</code></td>
+ </tr>
+
+ <tr>
+ <td>echo</td>
+ <td>Echo command usage (access and result)
+ </td>
+ <td><code class="noHighlight">false</code></td>
+ </tr>
+
+ <tr>
+ <td>resultproperty</td>
+ <td>Save result at this project property
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>delimiter</td>
+ <td>Split result with delimiter (java.util.StringTokenizer)
+ and use resultproperty as prefix to store tokens.
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>separatearrayresults</td>
+ <td>When return value is an array, save result as property list
+ (<em>$resultproperty.[0..N]</em> and <em>$resultproperty.length</em>)
+ </td>
+ <td><code class="noHighlight">true</code></td>
+ </tr>
+
+</table>
+
+<p>
+stop an application
+</p>
+<div class="codeBox"><pre><code> <jmx:invoke
+ name="Catalina:type=Manager,context=/servlets-examples,host=localhost"
+ operation="stop"/></code></pre></div>
+<p>
+Now you can find the sessionid at <em>${sessions.[0..N}</em> properties and access the count
+with ${sessions.length} property.
+</p>
+<p>
+Example to get all sessionids
+</p>
+<div class="codeBox"><pre><code> <jmx:invoke
+ name="Catalina:type=Manager,context=/servlets-examples,host=localhost"
+ operation="listSessionIds"
+ resultproperty="sessions"
+ delimiter=" "
+ /></code></pre></div>
+<p>
+Now you can find the sessionid at <em>${sessions.[0..N}</em> properties and access the count
+with ${sessions.length} property.
+</p>
+<p>
+Example to get remote MBean session attribute from session ${sessionid.0}
+</p>
+<div class="codeBox"><pre><code> <jmx:invoke
+ name="Catalina:type=Manager,context=/ClusterTest,host=localhost"
+ operation="getSessionAttribute"
+ resultproperty="hello">
+ <arg value="${sessionid.0}"/>
+ <arg value="Hello" />
+ </jmx:invoke></code></pre></div>
+
+<p>
+Example to create a new access logger valve at vhost <em>localhost</em>
+</p>
+<div class="codeBox"><pre><code> <jmx:invoke
+ name="Catalina:type=MBeanFactory"
+ operation="createAccessLoggerValve"
+ resultproperty="accessLoggerObjectName"
+ >
+ <arg value="Catalina:type=Host,host=localhost"/>
+ </jmx:invoke></code></pre></div>
+<p>
+Now you can find new MBean with name stored at <em>${accessLoggerObjectName}</em>
+property.
+</p>
+
+</div><h3 id="JMXAccessorQueryTask:__query_MBean_Ant_task">JMXAccessorQueryTask: query MBean Ant task</h3><div class="text">
+<p>
+List of Attributes
+</p>
+<table class="defaultTable">
+
+ <tr>
+ <th>Attribute</th>
+ <th>Description</th>
+ <th>Default value</th>
+ </tr>
+
+ <tr>
+ <td>name</td>
+ <td>JMX ObjectName query string -- <em>Catalina:type=Manager,*</em>
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>ref</td>
+ <td>JMX Connection reference
+ </td>
+ <td><code class="noHighlight">jmx.server</code></td>
+ </tr>
+
+ <tr>
+ <td>echo</td>
+ <td>Echo command usage (access and result)
+ </td>
+ <td><code class="noHighlight">false</code></td>
+ </tr>
+
+ <tr>
+ <td>resultproperty</td>
+ <td>Prefix project property name to all founded MBeans (<em>mbeans.[0..N].objectname</em>)
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>attributebinding</td>
+ <td>bind ALL MBean attributes in addition to <em>name</em>
+ </td>
+ <td><code class="noHighlight">false</code></td>
+ </tr>
+
+ <tr>
+ <td>delimiter</td>
+ <td>Split result with delimiter (java.util.StringTokenizer)
+ and use resultproperty as prefix to store tokens.
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>separatearrayresults</td>
+ <td>When return value is an array, save result as property list
+ (<em>$resultproperty.[0..N]</em> and <em>$resultproperty.length</em>)
+ </td>
+ <td><code class="noHighlight">true</code></td>
+ </tr>
+
+</table>
+
+<p>
+Get all Manager ObjectNames from all services and Hosts
+</p>
+<div class="codeBox"><pre><code> <jmx:query
+ name="Catalina:type=Manager,*
+ resultproperty="manager" /></code></pre></div>
+<p>
+Now you can find the Session Manager at <em>${manager.[0..N].name}</em>
+properties and access the result object counter with ${manager.length} property.
+</p>
+<p>
+Example to get the Manager from <em>servlet-examples</em> application an bind all MBean properties
+</p>
+<div class="codeBox"><pre><code> <jmx:query
+ name="Catalina:type=Manager,context=/servlet-examples,host=localhost*"
+ attributebinding="true"
+ resultproperty="manager.servletExamples" /></code></pre></div>
+<p>
+Now you can find the manager at <em>${manager.servletExamples.0.name}</em> property
+and can access all properties from this manager with <em>${manager.servletExamples.0.[manager attribute names]</em>}.
+The result object counter from MBeans is stored ad ${manager.length} property.
+</p>
+
+<p>
+Example to get all MBeans from a server and store inside an external XML property file
+</p>
+<div class="codeBox"><pre><code><project name="jmx.query"
+ xmlns:jmx="antlib:org.apache.catalina.ant.jmx"
+ default="query-all" basedir=".">
+<property name="jmx.host" value="localhost"/>
+<property name="jmx.port" value="8050"/>
+<property name="jmx.username" value="controlRole"/>
+<property name="jmx.password" value="tomcat"/>
+
+<target name="query-all" description="Query all MBeans of a server">
+ <!-- Configure connection -->
+ <jmx:open
+ host="${jmx.host}"
+ port="${jmx.port}"
+ ref="jmx.server"
+ username="${jmx.username}"
+ password="${jmx.password}"/>
+
+ <!-- Query MBean list -->
+ <jmx:query
+ name="*:*"
+ resultproperty="mbeans"
+ attributebinding="false"/>
+
+ <echoproperties
+ destfile="mbeans.properties"
+ prefix="mbeans."
+ format="xml"/>
+
+ <!-- Print results -->
+ <echo message=
+ "Number of MBeans in server ${jmx.host}:${jmx.port} is ${mbeans.length}"/>
+</target>
+</project></code></pre></div>
+<p>
+Now you can find all MBeans inside the file <em>mbeans.properties</em>.
+</p>
+
+</div><h3 id="JMXAccessorCreateTask:__remote_create_MBean_Ant_task">JMXAccessorCreateTask: remote create MBean Ant task</h3><div class="text">
+<p>
+List of Attributes
+</p>
+<table class="defaultTable">
+
+ <tr>
+ <th>Attribute</th>
+ <th>Description</th>
+ <th>Default value</th>
+ </tr>
+
+ <tr>
+ <td>name</td>
+ <td>Full qualified JMX ObjectName -- <em>Catalina:type=MBeanFactory</em>
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>className</td>
+ <td>Existing MBean full qualified class name (see Tomcat MBean description above)
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>classLoader</td>
+ <td>ObjectName of server or web application classloader <br>
+ ( <em>Catalina:type=ServerClassLoader,name=[server,common,shared]</em> or<br>
+ <em>Catalina:type=WebappClassLoader,context=/myapps,host=localhost</em>)
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>ref</td>
+ <td>JMX Connection reference
+ </td>
+ <td><code class="noHighlight">jmx.server</code></td>
+ </tr>
+
+ <tr>
+ <td>echo</td>
+ <td>Echo command usage (access and result)
+ </td>
+ <td><code class="noHighlight">false</code></td>
+ </tr>
+
+</table>
+
+<p>
+Example to create remote MBean
+</p>
+<div class="codeBox"><pre><code> <jmx:create
+ ref="${jmx.reference}"
+ name="Catalina:type=MBeanFactory"
+ className="org.apache.commons.modeler.BaseModelMBean"
+ classLoader="Catalina:type=ServerClassLoader,name=server">
+ <arg value="org.apache.catalina.mbeans.MBeanFactory" />
+ </jmx:create></code></pre></div>
+
+<p>
+ <b>Warning</b>: Many Tomcat MBeans can't be linked to their parent once<br>
+ created. The Valve, Cluster and Realm MBeans are not automatically<br>
+ connected with their parent. Use the <em>MBeanFactory</em> create<br>
+ operation instead.
+</p>
+
+</div><h3 id="JMXAccessorUnregisterTask:__remote_unregister_MBean_Ant_task">JMXAccessorUnregisterTask: remote unregister MBean Ant task</h3><div class="text">
+<p>
+List of Attributes
+</p>
+<table class="defaultTable">
+
+ <tr>
+ <th>Attribute</th>
+ <th>Description</th>
+ <th>Default value</th>
+ </tr>
+
+ <tr>
+ <td>name</td>
+ <td>Full qualified JMX ObjectName -- <em>Catalina:type=MBeanFactory</em>
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>ref</td>
+ <td>JMX Connection reference
+ </td>
+ <td><code class="noHighlight">jmx.server</code></td>
+ </tr>
+
+ <tr>
+ <td>echo</td>
+ <td>Echo command usage (access and result)
+ </td>
+ <td><code class="noHighlight">false</code></td>
+ </tr>
+
+</table>
+
+<p>
+Example to unregister remote MBean
+</p>
+<div class="codeBox"><pre><code> <jmx:unregister
+ name="Catalina:type=MBeanFactory"
+ /></code></pre></div>
+
+<p>
+ <b>Warning</b>: A lot of Tomcat MBeans can't be unregister.<br>
+ The MBeans are not unlinked from their parent. Use <em>MBeanFactory</em><br>
+ remove operation instead.
+</p>
+
+</div><h3 id="JMXAccessorCondition:__express_condition">JMXAccessorCondition: express condition</h3><div class="text">
+<p>
+List of Attributes
+</p>
+<table class="defaultTable">
+
+ <tr>
+ <th>Attribute</th>
+ <th>Description</th>
+ <th>Default value</th>
+ </tr>
+
+ <tr>
+ <td>url</td>
+ <td>Set JMX connection URL - <em>service:jmx:rmi:///jndi/rmi://localhost:8050/jmxrmi</em>
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>host</td>
+ <td>Set the host, shortcut the very long URL syntax.
+ </td>
+ <td><code class="noHighlight">localhost</code></td>
+ </tr>
+
+ <tr>
+ <td>port</td>
+ <td>Set the remote connection port
+ </td>
+ <td><code class="noHighlight">8050</code></td>
+ </tr>
+
+ <tr>
+ <td>username</td>
+ <td>remote JMX connection user name.
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>password</td>
+ <td>remote JMX connection password.
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>ref</td>
+ <td>Name of the internal connection reference. With this attribute you can
+ configure more the one connection inside the same Ant project.
+ </td>
+ <td><code class="noHighlight">jmx.server</code></td>
+ </tr>
+
+ <tr>
+ <td>name</td>
+ <td>Full qualified JMX ObjectName -- <em>Catalina:type=Server</em>
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>echo</td>
+ <td>Echo condition usage (access and result)
+ </td>
+ <td><code class="noHighlight">false</code></td>
+ </tr>
+
+ <tr>
+ <td>if</td>
+ <td>Only execute if a property of the given name <b>exists</b> in the current project.
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>unless</td>
+ <td>Only execute if a property of the given name <b>not exists</b> in the current project.
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>value (required)</td>
+ <td>Second arg for operation
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>type</td>
+ <td>Value type to express operation (support <em>long</em> and <em>double</em>)
+ </td>
+ <td><code class="noHighlight">long</code></td>
+ </tr>
+
+ <tr>
+ <td>operation</td>
+ <td> express one
+ <ul>
+ <li>== equals</li>
+ <li>!= not equals</li>
+ <li>> greater than (&gt;)</li>
+ <li>>= greater than or equals (&gt;=)</li>
+ <li>< lesser than (&lt;)</li>
+ <li><= lesser than or equals (&lt;=)</li>
+ </ul>
+ </td>
+ <td><code class="noHighlight">==</code></td>
+ </tr>
+
+</table>
+
+<p>
+Wait for server connection and that cluster backup node is accessible
+</p>
+<div class="codeBox"><pre><code><target name="wait">
+ <waitfor maxwait="${maxwait}" maxwaitunit="second" timeoutproperty="server.timeout" >
+ <and>
+ <socket server="${server.name}" port="${server.port}"/>
+ <http url="${url}"/>
+ <jmx:condition
+ operation="=="
+ host="localhost"
+ port="9014"
+ username="controlRole"
+ password="tomcat"
+ name=
+"Catalina:type=IDataSender,host=localhost,senderAddress=192.168.111.1,senderPort=9025"
+ attribute="connected"
+ value="true"
+ />
+ </and>
+ </waitfor>
+ <fail if="server.timeout" message="Server ${url} don't answer inside ${maxwait} sec" />
+ <echo message="Server ${url} alive" />
+</target></code></pre></div>
+
+</div><h3 id="JMXAccessorEqualsCondition:__equals_MBean_Ant_condition">JMXAccessorEqualsCondition: equals MBean Ant condition</h3><div class="text">
+<p>
+List of Attributes
+</p>
+<table class="defaultTable">
+
+ <tr>
+ <th>Attribute</th>
+ <th>Description</th>
+ <th>Default value</th>
+ </tr>
+
+ <tr>
+ <td>url</td>
+ <td>Set JMX connection URL - <em>service:jmx:rmi:///jndi/rmi://localhost:8050/jmxrmi</em>
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>host</td>
+ <td>Set the host, shortcut the very long URL syntax.
+ </td>
+ <td><code class="noHighlight">localhost</code></td>
+ </tr>
+
+ <tr>
+ <td>port</td>
+ <td>Set the remote connection port
+ </td>
+ <td><code class="noHighlight">8050</code></td>
+ </tr>
+
+ <tr>
+ <td>username</td>
+ <td>remote JMX connection user name.
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>password</td>
+ <td>remote JMX connection password.
+ </td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td>ref</td>
+ <td>Name of the internal connection reference. With this attribute you can
+ configure more the one connection inside the same Ant project.
+ </td>
+ <td><code class="noHighlight">jmx.server</code></td>
+ </tr>
+
+ <tr>
+ <td>name</td>
+ <td>Full qualified JMX ObjectName -- <em>Catalina:type=Server</em>
+ </td>
+ <td></td>
+ </tr>
+
+
+ <tr>
+ <td>echo</td>
+ <td>Echo condition usage (access and result)
+ </td>
+ <td><code class="noHighlight">false</code></td>
+ </tr>
+
+</table>
+
+<p>
+Wait for server connection and that cluster backup node is accessible
+</p>
+<div class="codeBox"><pre><code><target name="wait">
+ <waitfor maxwait="${maxwait}" maxwaitunit="second" timeoutproperty="server.timeout" >
+ <and>
+ <socket server="${server.name}" port="${server.port}"/>
+ <http url="${url}"/>
+ <jmx:equals
+ host="localhost"
+ port="9014"
+ username="controlRole"
+ password="tomcat"
+ name=
+"Catalina:type=IDataSender,host=localhost,senderAddress=192.168.111.1,senderPort=9025"
+ attribute="connected"
+ value="true"
+ />
+ </and>
+ </waitfor>
+ <fail if="server.timeout" message="Server ${url} don't answer inside ${maxwait} sec" />
+ <echo message="Server ${url} alive" />
+</target></code></pre></div>
+
+</div><h3 id="Using_the_JMXProxyServlet">Using the JMXProxyServlet</h3><div class="text">
+
+ <p>
+ Tomcat offers an alternative to using remote (or even local) JMX
+ connections while still giving you access to everything JMX has to offer:
+ Tomcat's
+ <a href="api/org/apache/catalina/manager/JMXProxyServlet.html">JMXProxyServlet</a>.
+ </p>
+
+ <p>
+ The JMXProxyServlet allows a client to issue JMX queries via an HTTP
+ interface. This technique offers the following advantages over using
+ JMX directly from a client program:
+ </p>
+
+ <ul>
+ <li>You don't have to launch a full JVM and make a remote JMX connection
+ just to ask for one small piece of data from a running server</li>
+ <li>You don't have to know how to work with JMX connections</li>
+ <li>You don't need any of the complex configuration covered in the rest
+ of this page</li>
+ <li>Your client program does not have to be written in Java</li>
+ </ul>
+
+ <p>
+ A perfect example of JMX overkill can be seen in the case of popular
+ server-monitoring software such as Nagios or Icinga: if you want to
+ monitor 10 items via JMX, you will have to launch 10 JVMs, make 10 JMX
+ connections, and then shut them all down every few minutes. With the
+ JMXProxyServlet, you can make 10 HTTP connections and be done with it.
+ </p>
+
+ <p>
+ You can find out more information about the JMXProxyServlet in the
+ documentation for the
+ <a href="manager-howto.html#Using_the_JMX_Proxy_Servlet">Tomcat
+ manager</a>.
+ </p>
+ </div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/proxy-howto.html b/web/tomcat/webapps/docs/proxy-howto.html
new file mode 100644
index 0000000..8af12f8
--- /dev/null
+++ b/web/tomcat/webapps/docs/proxy-howto.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Proxy Support How-To</title><meta name="author" content="Craig R. McClanahan"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Proxy Support How-To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Apache_httpd_Proxy_Support">Apache httpd Proxy Support</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+<p>Using standard configurations of Tomcat, web applications can ask for
+the server name and port number to which the request was directed for
+processing. When Tomcat is running standalone with the
+<a href="config/http.html">HTTP/1.1 Connector</a>, it will generally
+report the server name specified in the request, and the port number on
+which the <strong>Connector</strong> is listening. The servlet API
+calls of interest, for this purpose, are:</p>
+<ul>
+<li><code>ServletRequest.getServerName()</code>: Returns the host name of the server to which the request was sent.</li>
+<li><code>ServletRequest.getServerPort()</code>: Returns the port number of the server to which the request was sent.</li>
+<li><code>ServletRequest.getLocalName()</code>: Returns the host name of the Internet Protocol (IP) interface on which the request was received.</li>
+<li><code>ServletRequest.getLocalPort()</code>: Returns the Internet Protocol (IP) port number of the interface on which the request was received.</li>
+</ul>
+
+<p>When you are running behind a proxy server (or a web server that is
+configured to behave like a proxy server), you will sometimes prefer to
+manage the values returned by these calls. In particular, you will
+generally want the port number to reflect that specified in the original
+request, not the one on which the <strong>Connector</strong> itself is
+listening. You can use the <code>proxyName</code> and <code>proxyPort</code>
+attributes on the <code><Connector></code> element to configure
+these values.</p>
+
+<p>Proxy support can take many forms. The following sections describe
+proxy configurations for several common cases.</p>
+
+</div><h3 id="Apache_httpd_Proxy_Support">Apache httpd Proxy Support</h3><div class="text">
+
+<p>Apache httpd 1.3 and later versions support an optional module
+(<code>mod_proxy</code>) that configures the web server to act as a proxy
+server. This can be used to forward requests for a particular web application
+to a Tomcat instance, without having to configure a web connector such as
+<code>mod_jk</code>. To accomplish this, you need to perform the following
+tasks:</p>
+<ol>
+<li><p>Configure your copy of Apache so that it includes the
+ <code>mod_proxy</code> module. If you are building from source,
+ the easiest way to do this is to include the
+ <code>--enable-module=proxy</code> directive on the
+ <code>./configure</code> command line.</p></li>
+<li><p>If not already added for you, make sure that you are loading the
+ <code>mod_proxy</code> module at Apache startup time, by using the
+ following directives in your <code>httpd.conf</code> file:</p>
+<div class="codeBox"><pre><code>LoadModule proxy_module {path-to-modules}/mod_proxy.so
+</code></pre></div></li>
+<li><p>Include two directives in your <code>httpd.conf</code> file for
+ each web application that you wish to forward to Tomcat. For
+ example, to forward an application at context path <code>/myapp</code>:</p>
+<div class="codeBox"><pre><code>ProxyPass /myapp http://localhost:8081/myapp
+ProxyPassReverse /myapp http://localhost:8081/myapp</code></pre></div>
+ <p>which tells Apache to forward URLs of the form
+ <code>http://localhost/myapp/*</code> to the Tomcat connector
+ listening on port 8081.</p></li>
+<li><p>Configure your copy of Tomcat to include a special
+ <code><Connector></code> element, with appropriate
+ proxy settings, for example:</p>
+<div class="codeBox"><pre><code><Connector port="8081" ...
+ proxyName="www.mycompany.com"
+ proxyPort="80"/></code></pre></div>
+ <p>which will cause servlets inside this web application to think that
+ all proxied requests were directed to <code>www.mycompany.com</code>
+ on port 80.</p></li>
+<li><p>It is legal to omit the <code>proxyName</code> attribute from the
+ <code><Connector></code> element. If you do so, the value
+ returned by <code>request.getServerName()</code> will by the host
+ name on which Tomcat is running. In the example above, it would be
+ <code>localhost</code>.</p></li>
+<li><p>If you also have a <code><Connector></code> listening on port
+ 8080 (nested within the same <a href="config/service.html">Service</a>
+ element), the requests to either port will share the same set of
+ virtual hosts and web applications.</p></li>
+<li><p>You might wish to use the IP filtering features of your operating
+ system to restrict connections to port 8081 (in this example) to
+ be allowed <strong>only</strong> from the server that is running
+ Apache.</p></li>
+<li><p>Alternatively, you can set up a series of web applications that are
+ only available via proxying, as follows:</p>
+ <ul>
+ <li>Configure another <code><Service></code> that contains
+ only a <code><Connector></code> for the proxy port.</li>
+ <li>Configure appropriate <a href="config/engine.html">Engine</a>,
+ <a href="config/host.html">Host</a>, and
+ <a href="config/context.html">Context</a> elements for the virtual hosts
+ and web applications accessible via proxying.</li>
+ <li>Optionally, protect port 8081 with IP filters as described
+ earlier.</li>
+ </ul></li>
+<li><p>When requests are proxied by Apache, the web server will be recording
+ these requests in its access log. Therefore, you will generally want to
+ disable any access logging performed by Tomcat itself.</p></li>
+</ol>
+
+<p>When requests are proxied in this manner, <strong>all</strong> requests
+for the configured web applications will be processed by Tomcat (including
+requests for static content). You can improve performance by using the
+<code>mod_jk</code> web connector instead of <code>mod_proxy</code>.
+<code>mod_jk</code> can be configured so that the web server serves static
+content that is not processed by filters or security constraints defined
+within the web application's deployment descriptor
+(<code>/WEB-INF/web.xml</code>).</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/realm-howto.html b/web/tomcat/webapps/docs/realm-howto.html
new file mode 100644
index 0000000..2fb4a49
--- /dev/null
+++ b/web/tomcat/webapps/docs/realm-howto.html
@@ -0,0 +1,1183 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Realm Configuration How-To</title><meta name="author" content="Craig R. McClanahan"><meta name="author" content="Yoav Shapira"><meta name="author" content="Andrew R. Jaquith"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Realm Configuration How-To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Quick_Start">Quick Start</a></li><li><a href="#Overview">Overview</a><ol><li><a href="#What_is_a_Realm?">What is a Realm?</a></li><li><a href="#Configuring_a_Realm">Configuring a Realm</a></li></ol></li><li><a href="#Common_Features">Common Features</a><ol><li><a href="#Digested_Passwords">Digested Passwords</a></li><li><a href="#Example_Application">Example Application</a></li><li><a href="#Manager_Application">Manager Application</a></li><li><a href="#Realm_Logging">Realm Logging</a></li></ol></li><li><a href="#Standard_Realm_Implementations">Standard Realm Implementations</a><ol><li><a href="#DataSourceRealm">DataSourceRealm</a></li><li><a href="#JNDIRealm">JNDIRealm</a></li><li><a href="#UserDatabaseRealm">UserDatabaseRealm</a></li><li><a href="#MemoryRealm">MemoryRealm</a></li><li><a href="#JAASRealm">JAASRealm</a></li><li><a href="#CombinedRealm">CombinedRealm</a></li><li><a href="#LockOutRealm">LockOutRealm</a></li><li><a href="#JDBCRealm">JDBCRealm</a></li></ol></li></ul>
+</div><h3 id="Quick_Start">Quick Start</h3><div class="text">
+
+<p>This document describes how to configure Tomcat to support <em>container
+managed security</em>, by connecting to an existing "database" of usernames,
+passwords, and user roles. You only need to care about this if you are using
+a web application that includes one or more
+<code><security-constraint></code> elements, and a
+<code><login-config></code> element defining how users are required
+to authenticate themselves. If you are not utilizing these features, you can
+safely skip this document.</p>
+
+<p>For fundamental background information about container managed security,
+see the <a href="https://wiki.apache.org/tomcat/Specifications">Servlet
+Specification (Version 2.4)</a>, Section 12.</p>
+
+<p>For information about utilizing the <em>Single Sign On</em> feature of
+Tomcat (allowing a user to authenticate themselves once across the entire
+set of web applications associated with a virtual host), see
+<a href="config/host.html#Single_Sign_On">here</a>.</p>
+
+</div><h3 id="Overview">Overview</h3><div class="text">
+
+
+<div class="subsection"><h4 id="What_is_a_Realm?">What is a Realm?</h4><div class="text">
+
+<p>A <strong>Realm</strong> is a "database" of usernames and passwords that
+identify valid users of a web application (or set of web applications), plus
+an enumeration of the list of <em>roles</em> associated with each valid user.
+You can think of roles as similar to <em>groups</em> in Unix-like operating
+systems, because access to specific web application resources is granted to
+all users possessing a particular role (rather than enumerating the list of
+associated usernames). A particular user can have any number of roles
+associated with their username.</p>
+
+<p>Although the Servlet Specification describes a portable mechanism for
+applications to <em>declare</em> their security requirements (in the
+<code>web.xml</code> deployment descriptor), there is no portable API
+defining the interface between a servlet container and the associated user
+and role information. In many cases, however, it is desirable to "connect"
+a servlet container to some existing authentication database or mechanism
+that already exists in the production environment. Therefore, Tomcat
+defines a Java interface (<code>org.apache.catalina.Realm</code>) that
+can be implemented by "plug in" components to establish this connection.
+Six standard plug-ins are provided, supporting connections to various
+sources of authentication information:</p>
+<ul>
+<li><a href="#JDBCRealm">JDBCRealm</a> - Accesses authentication information
+ stored in a relational database, accessed via a JDBC driver.</li>
+<li><a href="#DataSourceRealm">DataSourceRealm</a> - Accesses authentication
+ information stored in a relational database, accessed via a named JNDI
+ JDBC DataSource.</li>
+<li><a href="#JNDIRealm">JNDIRealm</a> - Accesses authentication information
+ stored in an LDAP based directory server, accessed via a JNDI provider.
+ </li>
+<li><a href="#UserDatabaseRealm">UserDatabaseRealm</a> - Accesses authentication
+ information stored in an UserDatabase JNDI resource, which is typically
+ backed by an XML document (<code>conf/tomcat-users.xml</code>).</li>
+<li><a href="#MemoryRealm">MemoryRealm</a> - Accesses authentication
+ information stored in an in-memory object collection, which is initialized
+ from an XML document (<code>conf/tomcat-users.xml</code>).</li>
+<li><a href="#JAASRealm">JAASRealm</a> - Accesses authentication information
+ through the Java Authentication & Authorization Service (JAAS)
+ framework.</li>
+</ul>
+
+<p>It is also possible to write your own <code>Realm</code> implementation,
+and integrate it with Tomcat. To do so, you need to:</p>
+<ul>
+ <li>Implement <code>org.apache.catalina.Realm</code>,</li>
+ <li>Place your compiled realm in $CATALINA_HOME/lib,</li>
+ <li>Declare your realm as described in the "Configuring a Realm" section below,</li>
+ <li>Declare your realm to the <a href="mbeans-descriptors-howto.html">MBeans Descriptors</a>.</li>
+</ul>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="Configuring_a_Realm">Configuring a Realm</h4><div class="text">
+
+<p>Before getting into the details of the standard Realm implementations, it is
+important to understand, in general terms, how a Realm is configured. In
+general, you will be adding an XML element to your <code>conf/server.xml</code>
+configuration file, that looks something like this:</p>
+
+<div class="codeBox"><pre><code><Realm className="... class name for this implementation"
+ ... other attributes for this implementation .../></code></pre></div>
+
+<p>The <code><Realm></code> element can be nested inside any one of
+of the following <code>Container</code> elements. The location of the
+Realm element has a direct impact on the "scope" of that Realm
+(i.e. which web applications will share the same authentication information):
+</p>
+<ul>
+<li><em>Inside an <Engine> element</em> - This Realm will be shared
+ across ALL web applications on ALL virtual hosts, UNLESS it is overridden
+ by a Realm element nested inside a subordinate <code><Host></code>
+ or <code><Context></code> element.</li>
+<li><em>Inside a <Host> element</em> - This Realm will be shared across
+ ALL web applications for THIS virtual host, UNLESS it is overridden
+ by a Realm element nested inside a subordinate <code><Context></code>
+ element.</li>
+<li><em>Inside a <Context> element</em> - This Realm will be used ONLY
+ for THIS web application.</li>
+</ul>
+
+
+</div></div>
+
+
+</div><h3 id="Common_Features">Common Features</h3><div class="text">
+
+
+<div class="subsection"><h4 id="Digested_Passwords">Digested Passwords</h4><div class="text">
+
+<p>For each of the standard <code>Realm</code> implementations, the
+user's password (by default) is stored in clear text. In many
+environments, this is undesirable because casual observers of the
+authentication data can collect enough information to log on
+successfully, and impersonate other users. To avoid this problem, the
+standard implementations support the concept of <em>digesting</em>
+user passwords. This allows the stored version of the passwords to be
+encoded (in a form that is not easily reversible), but that the
+<code>Realm</code> implementation can still utilize for
+authentication.</p>
+
+<p>When a standard realm authenticates by retrieving the stored
+password and comparing it with the value presented by the user, you
+can select digested passwords by placing a <a href="config/credentialhandler.html">
+<code>CredentialHandler</code></a> element inside your <code><Realm></code>
+element. An easy choice to support one of the algorithms SSHA, SHA or MD5
+would be the usage of the <code>MessageDigestCredentialHandler</code>.
+This element must be configured to one of the digest algorithms supported
+by the <code>java.security.MessageDigest</code> class (SSHA, SHA or MD5).
+When you select this option, the contents of the password that is stored
+in the <code>Realm</code> must be the cleartext version of the password,
+as digested by the specified algorithm.</p>
+
+<p>When the <code>authenticate()</code> method of the Realm is called, the
+(cleartext) password specified by the user is itself digested by the same
+algorithm, and the result is compared with the value returned by the
+<code>Realm</code>. An equal match implies that the cleartext version of the
+original password is the same as the one presented by the user, so that this
+user should be authorized.</p>
+
+<p>To calculate the digested value of a cleartext password, two convenience
+techniques are supported:</p>
+<ul>
+<li>If you are writing an application that needs to calculate digested
+ passwords dynamically, call the static <code>Digest()</code> method of the
+ <code>org.apache.catalina.realm.RealmBase</code> class, passing the
+ cleartext password, the digest algorithm name and the encoding as arguments.
+ This method will return the digested password.</li>
+<li>If you want to execute a command line utility to calculate the digested
+ password, simply execute
+<div class="codeBox"><pre><code>CATALINA_HOME/bin/digest.[bat|sh] -a {algorithm} {cleartext-password}</code></pre></div>
+ and the digested version of this cleartext password will be returned to
+ standard output.</li>
+</ul>
+
+<p>If using digested passwords with DIGEST authentication, the cleartext used
+ to generate the digest is different and the digest must use one iteration of
+ the MD5 algorithm with no salt. In the examples above
+ <code>{cleartext-password}</code> must be replaced with
+ <code>{username}:{realm}:{cleartext-password}</code>. For example, in a
+ development environment this might take the form
+ <code>testUser:Authentication required:testPassword</code>. The value for
+ <code>{realm}</code> is taken from the <code><realm-name></code>
+ element of the web application's <code><login-config></code>. If
+ not specified in web.xml, the default value of <code>Authentication
+ required</code> is used.</p>
+
+<p>Usernames and/or passwords using encodings other than the platform default
+are supported using</p>
+<div class="codeBox"><pre><code>CATALINA_HOME/bin/digest.[bat|sh] -a {algorithm} -e {encoding} {input}</code></pre></div>
+<p>but care is required to ensure that the input is correctly passed to the
+digester. The digester returns <code>{input}:{digest}</code>. If the input
+appears corrupted in the return, the digest will be invalid.</p>
+
+<p>The output format of the digest is <code>{salt}${iterations}${digest}</code>.
+If the salt length is zero and the iteration count is one, the output is
+simplified to <code>{digest}</code>.</p>
+
+<p>The full syntax of <code>CATALINA_HOME/bin/digest.[bat|sh]</code> is:</p>
+<div class="codeBox"><pre><code>CATALINA_HOME/bin/digest.[bat|sh] [-a <algorithm>] [-e <encoding>]
+ [-i <iterations>] [-s <salt-length>] [-k <key-length>]
+ [-h <handler-class-name>] <credentials>
+</code></pre></div>
+<ul>
+<li><b>-a</b> - The algorithm to use to generate the stored
+ credential. If not specified, the default for the handler will
+ be used. If neither handler nor algorithm is specified then a
+ default of <code>SHA-512</code> will be used</li>
+<li><b>-e</b> - The encoding to use for any byte to/from character
+ conversion that may be necessary. If not specified, the
+ system encoding (<code>Charset#defaultCharset()</code>) will
+ be used.</li>
+<li><b>-i</b> - The number of iterations to use when generating the
+ stored credential. If not specified, the default for the
+ CredentialHandler will be used.</li>
+<li><b>-s</b> - The length (in bytes) of salt to generate and store as
+ part of the credential. If not specified, the default for
+ the CredentialHandler will be used.</li>
+<li><b>-k</b> - The length (in bits) of the key(s), if any, created while
+ generating the credential. If not specified, the default
+ for the CredentialHandler will be used.</li>
+<li><b>-h</b> - The fully qualified class name of the CredentialHandler
+ to use. If not specified, the built-in handlers will be
+ tested in turn (MessageDigestCredentialHandler then
+ SecretKeyCredentialHandler) and the first one to accept the
+ specified algorithm will be used.</li>
+</ul>
+</div></div>
+
+
+
+<div class="subsection"><h4 id="Example_Application">Example Application</h4><div class="text">
+
+<p>The example application shipped with Tomcat includes an area that is
+protected by a security constraint, utilizing form-based login. To access it,
+point your browser at
+<a href="http://localhost:8080/examples/jsp/security/protected/">http://localhost:8080/examples/jsp/security/protected/</a>
+and log on with one of the usernames and passwords described for the default
+<a href="#UserDatabaseRealm">UserDatabaseRealm</a>.</p>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="Manager_Application">Manager Application</h4><div class="text">
+
+<p>If you wish to use the <a href="manager-howto.html">Manager Application</a>
+to deploy and undeploy applications in a running Tomcat installation, you
+MUST add the "manager-gui" role to at least one username in your selected
+Realm implementation. This is because the manager web application itself uses a
+security constraint that requires role "manager-gui" to access ANY request URI
+within the HTML interface of that application.</p>
+
+<p>For security reasons, no username in the default Realm (i.e. using
+<code>conf/tomcat-users.xml</code> is assigned the "manager-gui" role.
+Therefore, no one will be able to utilize the features of this application
+until the Tomcat administrator specifically assigns this role to one or more
+users.</p>
+
+</div></div>
+
+<div class="subsection"><h4 id="Realm_Logging">Realm Logging</h4><div class="text">
+
+<p>Debugging and exception messages logged by a <code>Realm</code> will
+ be recorded by the logging configuration associated with the container
+ for the realm: its surrounding <a href="config/context.html">Context</a>,
+ <a href="config/host.html">Host</a>, or
+ <a href="config/engine.html">Engine</a>.</p>
+
+</div></div>
+
+</div><h3 id="Standard_Realm_Implementations">Standard Realm Implementations</h3><div class="text">
+
+<div class="subsection"><h4 id="DataSourceRealm">DataSourceRealm</h4><div class="text">
+
+<h5>Introduction</h5>
+
+<p><strong>DataSourceRealm</strong> is an implementation of the Tomcat
+<code>Realm</code> interface that looks up users in a relational database
+accessed via a JNDI named JDBC DataSource. There is substantial configuration
+flexibility that lets you adapt to existing table and column names, as long
+as your database structure conforms to the following requirements:</p>
+<ul>
+<li>There must be a table, referenced below as the <em>users</em> table,
+ that contains one row for every valid user that this <code>Realm</code>
+ should recognize.</li>
+<li>The <em>users</em> table must contain at least two columns (it may
+ contain more if your existing applications required it):
+ <ul>
+ <li>Username to be recognized by Tomcat when the user logs in.</li>
+ <li>Password to be recognized by Tomcat when the user logs in.
+ This value may in cleartext or digested - see below for more
+ information.</li>
+ </ul></li>
+<li>There must be a table, referenced below as the <em>user roles</em> table,
+ that contains one row for every valid role that is assigned to a
+ particular user. It is legal for a user to have zero, one, or more than
+ one valid role.</li>
+<li>The <em>user roles</em> table must contain at least two columns (it may
+ contain more if your existing applications required it):
+ <ul>
+ <li>Username to be recognized by Tomcat (same value as is specified
+ in the <em>users</em> table).</li>
+ <li>Role name of a valid role associated with this user.</li>
+ </ul></li>
+</ul>
+
+<h5>Quick Start</h5>
+
+<p>To set up Tomcat to use DataSourceRealm, you will need to follow these steps:</p>
+<ol>
+<li>If you have not yet done so, create tables and columns in your database
+ that conform to the requirements described above.</li>
+<li>Configure a database username and password for use by Tomcat, that has
+ at least read only access to the tables described above. (Tomcat will
+ never attempt to write to these tables.)</li>
+<li>Configure a JNDI named JDBC DataSource for your database. Refer to the
+ <a href="jndi-datasource-examples-howto.html">JNDI DataSource Example
+ How-To</a> for information on how to configure a JNDI named JDBC DataSource.
+ Be sure to set the <code>Realm</code>'s <code>localDataSource</code>
+ attribute appropriately, depending on where the JNDI DataSource is
+ defined.</li>
+<li>Set up a <code><Realm></code> element, as described below, in your
+ <code>$CATALINA_BASE/conf/server.xml</code> file.</li>
+<li>Restart Tomcat if it is already running.</li>
+</ol>
+
+<h5>Realm Element Attributes</h5>
+
+<p>To configure DataSourceRealm, you will create a <code><Realm></code>
+element and nest it in your <code>$CATALINA_BASE/conf/server.xml</code> file,
+as described <a href="#Configuring_a_Realm">above</a>. The attributes for the
+DataSourceRealm are defined in the <a href="config/realm.html">Realm</a>
+configuration documentation.</p>
+
+<h5>Example</h5>
+
+<p>An example SQL script to create the needed tables might look something
+like this (adapt the syntax as required for your particular database):</p>
+<div class="codeBox"><pre><code>create table users (
+ user_name varchar(15) not null primary key,
+ user_pass varchar(15) not null
+);
+
+create table user_roles (
+ user_name varchar(15) not null,
+ role_name varchar(15) not null,
+ primary key (user_name, role_name)
+);</code></pre></div>
+
+<p>Here is an example for using a MySQL database called "authority", configured
+with the tables described above, and accessed with the JNDI JDBC DataSource with
+name "java:/comp/env/jdbc/authority".</p>
+<div class="codeBox"><pre><code><Realm className="org.apache.catalina.realm.DataSourceRealm"
+ dataSourceName="jdbc/authority"
+ userTable="users" userNameCol="user_name" userCredCol="user_pass"
+ userRoleTable="user_roles" roleNameCol="role_name"/></code></pre></div>
+
+<h5>Additional Notes</h5>
+
+<p>DataSourceRealm operates according to the following rules:</p>
+<ul>
+<li>When a user attempts to access a protected resource for the first time,
+ Tomcat will call the <code>authenticate()</code> method of this
+ <code>Realm</code>. Thus, any changes you have made to the database
+ directly (new users, changed passwords or roles, etc.) will be immediately
+ reflected.</li>
+<li>Once a user has been authenticated, the user (and their associated
+ roles) are cached within Tomcat for the duration of the user's login.
+ (For FORM-based authentication, that means until the session times out or
+ is invalidated; for BASIC authentication, that means until the user
+ closes their browser). The cached user is <strong>not</strong> saved and
+ restored across sessions serialisations. Any changes to the database
+ information for an already authenticated user will <strong>not</strong> be
+ reflected until the next time that user logs on again.</li>
+<li>Administering the information in the <em>users</em> and <em>user roles</em>
+ table is the responsibility of your own applications. Tomcat does not
+ provide any built-in capabilities to maintain users and roles.</li>
+</ul>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="JNDIRealm">JNDIRealm</h4><div class="text">
+
+<h5>Introduction</h5>
+
+<p><strong>JNDIRealm</strong> is an implementation of the Tomcat
+<code>Realm</code> interface that looks up users in an LDAP directory
+server accessed by a JNDI provider (typically, the standard LDAP
+provider that is available with the JNDI API classes). The realm
+supports a variety of approaches to using a directory for
+authentication.</p>
+
+<h6>Connecting to the directory</h6>
+
+<p>The realm's connection to the directory is defined by the
+<strong>connectionURL</strong> configuration attribute. This is a URL
+whose format is defined by the JNDI provider. It is usually an LDAP
+URL that specifies the domain name of the directory server to connect
+to, and optionally the port number and distinguished name (DN) of the
+required root naming context.</p>
+
+<p>If you have more than one provider you can configure an
+<strong>alternateURL</strong>. If a socket connection cannot be
+made to the provider at the <strong>connectionURL</strong> an
+attempt will be made to use the <strong>alternateURL</strong>.</p>
+
+<p>When making a connection in order to search the directory and
+retrieve user and role information, the realm authenticates itself to
+the directory with the username and password specified by the
+<strong>connectionName</strong> and
+<strong>connectionPassword</strong> properties. If these properties
+are not specified the connection is anonymous. This is sufficient in
+many cases.
+</p>
+
+
+<h6>Selecting the user's directory entry</h6>
+
+<p>Each user that can be authenticated must be represented in the
+directory by an individual entry that corresponds to an element in the
+initial <code>DirContext</code> defined by the
+<strong>connectionURL</strong> attribute. This user entry must have an
+attribute containing the username that is presented for
+authentication.</p>
+
+<p>Often the distinguished name of the user's entry contains the
+username presented for authentication but is otherwise the same for
+all users. In this case the <strong>userPattern</strong> attribute may
+be used to specify the DN, with "{0}" marking where
+the username should be substituted.</p>
+
+<p>Otherwise the realm must search the directory to find a unique entry
+containing the username. The following attributes configure this
+search:</p>
+
+ <ul>
+ <li><strong>userBase</strong> - the entry that is the base of
+ the subtree containing users. If not specified, the search
+ base is the top-level context.</li>
+
+ <li><strong>userSubtree</strong> - the search scope. Set to
+ <code>true</code> if you wish to search the entire subtree
+ rooted at the <strong>userBase</strong> entry. The default value
+ of <code>false</code> requests a single-level search
+ including only the top level.</li>
+
+ <li><strong>userSearch</strong> - pattern specifying the LDAP
+ search filter to use after substitution of the username.</li>
+
+ </ul>
+
+
+<h6>Authenticating the user</h6>
+
+<ul>
+<li>
+<p><b>Bind mode</b></p>
+
+<p>By default the realm authenticates a user by binding to
+the directory with the DN of the entry for that user and the password
+presented by the user. If this simple bind succeeds the user is considered to
+be authenticated.</p>
+
+<p>For security reasons a directory may store a digest of the user's
+password rather than the clear text version (see
+<a href="#Digested_Passwords">Digested Passwords</a> for more information). In that case,
+as part of the simple bind operation the directory automatically
+computes the correct digest of the plaintext password presented by the
+user before validating it against the stored value. In bind mode,
+therefore, the realm is not involved in digest processing. The
+<strong>digest</strong> attribute is not used, and will be ignored if
+set.</p>
+</li>
+
+<li>
+<p><b>Comparison mode</b></p>
+<p>Alternatively, the realm may retrieve the stored
+password from the directory and compare it explicitly with the value
+presented by the user. This mode is configured by setting the
+<strong>userPassword</strong> attribute to the name of a directory
+attribute in the user's entry that contains the password.</p>
+
+<p>Comparison mode has some disadvantages. First, the
+<strong>connectionName</strong> and
+<strong>connectionPassword</strong> attributes must be configured to
+allow the realm to read users' passwords in the directory. For
+security reasons this is generally undesirable; indeed many directory
+implementations will not allow even the directory manager to read
+these passwords. In addition, the realm must handle password digests
+itself, including variations in the algorithms used and ways of
+representing password hashes in the directory. However, the realm may
+sometimes need access to the stored password, for example to support
+HTTP Digest Access Authentication (RFC 2069). (Note that HTTP digest
+authentication is different from the storage of password digests in
+the repository for user information as discussed above).
+</p>
+</li>
+</ul>
+
+<h6>Assigning roles to the user</h6>
+
+<p>The directory realm supports two approaches to the representation
+of roles in the directory:</p>
+
+<ul>
+<li>
+<p><b>Roles as explicit directory entries</b></p>
+
+<p>Roles may be represented by explicit directory entries. A role
+entry is usually an LDAP group entry with one attribute
+containing the name of the role and another whose values are the
+distinguished names or usernames of the users in that role. The
+following attributes configure a directory search to
+find the names of roles associated with the authenticated user:</p>
+
+<ul>
+<li><strong>roleBase</strong> - the base entry for the role search.
+ If not specified, the search base is the top-level directory
+ context.</li>
+
+<li><strong>roleSubtree</strong> - the search
+ scope. Set to <code>true</code> if you wish to search the entire
+ subtree rooted at the <code>roleBase</code> entry. The default
+ value of <code>false</code> requests a single-level search
+ including the top level only.</li>
+
+<li><strong>roleSearch</strong> - the LDAP search filter for
+ selecting role entries. It optionally includes pattern
+ replacements "{0}" for the distinguished name and/or "{1}" for the
+ username and/or "{2}" for an attribute from user's directory entry,
+ of the authenticated user. Use <strong>userRoleAttribute</strong> to
+ specify the name of the attribute that provides the value for "{2}".</li>
+
+<li><strong>roleName</strong> - the attribute in a role entry
+ containing the name of that role.</li>
+
+<li><strong>roleNested</strong> - enable nested roles. Set to
+ <code>true</code> if you want to nest roles in roles. If configured, then
+ every newly found roleName and distinguished
+ Name will be recursively tried for a new role search.
+ The default value is <code>false</code>.</li>
+
+</ul>
+
+</li>
+</ul>
+
+<ul>
+<li>
+<p><b>Roles as an attribute of the user entry</b></p>
+
+<p>Role names may also be held as the values of an attribute in the
+user's directory entry. Use <strong>userRoleName</strong> to specify
+the name of this attribute.</p>
+
+</li>
+</ul>
+<p>A combination of both approaches to role representation may be used.</p>
+
+<h5>Quick Start</h5>
+
+<p>To set up Tomcat to use JNDIRealm, you will need to follow these steps:</p>
+<ol>
+<li>Make sure your directory server is configured with a schema that matches
+ the requirements listed above.</li>
+<li>If required, configure a username and password for use by Tomcat, that has
+ read only access to the information described above. (Tomcat will
+ never attempt to modify this information.)</li>
+<li>Set up a <code><Realm></code> element, as described below, in your
+ <code>$CATALINA_BASE/conf/server.xml</code> file.</li>
+<li>Restart Tomcat if it is already running.</li>
+</ol>
+
+<h5>Realm Element Attributes</h5>
+
+<p>To configure JNDIRealm, you will create a <code><Realm></code>
+element and nest it in your <code>$CATALINA_BASE/conf/server.xml</code> file,
+as described <a href="#Configuring_a_Realm">above</a>. The attributes for the
+JNDIRealm are defined in the <a href="config/realm.html">Realm</a> configuration
+documentation.</p>
+
+<h5>Example</h5>
+
+<p>Creation of the appropriate schema in your directory server is beyond the
+scope of this document, because it is unique to each directory server
+implementation. In the examples below, we will assume that you are using a
+distribution of the OpenLDAP directory server (version 2.0.11 or later), which
+can be downloaded from
+<a href="https://www.openldap.org">https://www.openldap.org</a>. Assume that
+your <code>slapd.conf</code> file contains the following settings
+(among others):</p>
+<div class="codeBox"><pre><code>database ldbm
+suffix dc="mycompany",dc="com"
+rootdn "cn=Manager,dc=mycompany,dc=com"
+rootpw secret</code></pre></div>
+
+<p>We will assume for <code>connectionURL</code> that the directory
+server runs on the same machine as Tomcat. See <a href="http://docs.oracle.com/javase/7/docs/technotes/guides/jndi/index.html">
+http://docs.oracle.com/javase/7/docs/technotes/guides/jndi/index.html</a>
+for more information about configuring and using the JNDI LDAP
+provider.</p>
+
+<p>Next, assume that this directory server has been populated with elements
+as shown below (in LDIF format):</p>
+
+<div class="codeBox"><pre><code># Define top-level entry
+dn: dc=mycompany,dc=com
+objectClass: dcObject
+dc:mycompany
+
+# Define an entry to contain people
+# searches for users are based on this entry
+dn: ou=people,dc=mycompany,dc=com
+objectClass: organizationalUnit
+ou: people
+
+# Define a user entry for Janet Jones
+dn: uid=jjones,ou=people,dc=mycompany,dc=com
+objectClass: inetOrgPerson
+uid: jjones
+sn: jones
+cn: janet jones
+mail: j.jones@mycompany.com
+userPassword: janet
+
+# Define a user entry for Fred Bloggs
+dn: uid=fbloggs,ou=people,dc=mycompany,dc=com
+objectClass: inetOrgPerson
+uid: fbloggs
+sn: bloggs
+cn: fred bloggs
+mail: f.bloggs@mycompany.com
+userPassword: fred
+
+# Define an entry to contain LDAP groups
+# searches for roles are based on this entry
+dn: ou=groups,dc=mycompany,dc=com
+objectClass: organizationalUnit
+ou: groups
+
+# Define an entry for the "tomcat" role
+dn: cn=tomcat,ou=groups,dc=mycompany,dc=com
+objectClass: groupOfUniqueNames
+cn: tomcat
+uniqueMember: uid=jjones,ou=people,dc=mycompany,dc=com
+uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com
+
+# Define an entry for the "role1" role
+dn: cn=role1,ou=groups,dc=mycompany,dc=com
+objectClass: groupOfUniqueNames
+cn: role1
+uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com</code></pre></div>
+
+<p>An example <code>Realm</code> element for the OpenLDAP directory
+server configured as described above might look like this, assuming
+that users use their uid (e.g. jjones) to login to the
+application and that an anonymous connection is sufficient to search
+the directory and retrieve role information:</p>
+
+<div class="codeBox"><pre><code><Realm className="org.apache.catalina.realm.JNDIRealm"
+ connectionURL="ldap://localhost:389"
+ userPattern="uid={0},ou=people,dc=mycompany,dc=com"
+ roleBase="ou=groups,dc=mycompany,dc=com"
+ roleName="cn"
+ roleSearch="(uniqueMember={0})"
+/></code></pre></div>
+
+<p>With this configuration, the realm will determine the user's
+distinguished name by substituting the username into the
+<code>userPattern</code>, authenticate by binding to the directory
+with this DN and the password received from the user, and search the
+directory to find the user's roles.</p>
+
+<p>Now suppose that users are expected to enter their email address
+rather than their userid when logging in. In this case the realm must
+search the directory for the user's entry. (A search is also necessary
+when user entries are held in multiple subtrees corresponding perhaps
+to different organizational units or company locations).</p>
+
+<p>Further, suppose that in addition to the group entries you want to
+use an attribute of the user's entry to hold roles. Now the entry for
+Janet Jones might read as follows:</p>
+
+<div class="codeBox"><pre><code>dn: uid=jjones,ou=people,dc=mycompany,dc=com
+objectClass: inetOrgPerson
+uid: jjones
+sn: jones
+cn: janet jones
+mail: j.jones@mycompany.com
+memberOf: role2
+memberOf: role3
+userPassword: janet</code></pre></div>
+
+<p> This realm configuration would satisfy the new requirements:</p>
+
+<div class="codeBox"><pre><code><Realm className="org.apache.catalina.realm.JNDIRealm"
+ connectionURL="ldap://localhost:389"
+ userBase="ou=people,dc=mycompany,dc=com"
+ userSearch="(mail={0})"
+ userRoleName="memberOf"
+ roleBase="ou=groups,dc=mycompany,dc=com"
+ roleName="cn"
+ roleSearch="(uniqueMember={0})"
+/></code></pre></div>
+
+<p>Now when Janet Jones logs in as "j.jones@mycompany.com", the realm
+searches the directory for a unique entry with that value as its mail
+attribute and attempts to bind to the directory as
+<code>uid=jjones,ou=people,dc=mycompany,dc=com</code> with the given
+password. If authentication succeeds, they are assigned three roles:
+"role2" and "role3", the values of the "memberOf" attribute in their
+directory entry, and "tomcat", the value of the "cn" attribute in the
+only group entry of which they are a member.</p>
+
+<p>Finally, to authenticate the user by retrieving
+the password from the directory and making a local comparison in the
+realm, you might use a realm configuration like this:</p>
+
+<div class="codeBox"><pre><code><Realm className="org.apache.catalina.realm.JNDIRealm"
+ connectionName="cn=Manager,dc=mycompany,dc=com"
+connectionPassword="secret"
+ connectionURL="ldap://localhost:389"
+ userPassword="userPassword"
+ userPattern="uid={0},ou=people,dc=mycompany,dc=com"
+ roleBase="ou=groups,dc=mycompany,dc=com"
+ roleName="cn"
+ roleSearch="(uniqueMember={0})"
+/></code></pre></div>
+
+<p>However, as discussed above, the default bind mode for
+authentication is usually to be preferred.</p>
+
+<h5>Additional Notes</h5>
+
+<p>JNDIRealm operates according to the following rules:</p>
+<ul>
+<li>When a user attempts to access a protected resource for the first time,
+ Tomcat will call the <code>authenticate()</code> method of this
+ <code>Realm</code>. Thus, any changes you have made to the directory
+ (new users, changed passwords or roles, etc.) will be immediately
+ reflected.</li>
+<li>Once a user has been authenticated, the user (and their associated
+ roles) are cached within Tomcat for the duration of the user's login.
+ (For FORM-based authentication, that means until the session times out or
+ is invalidated; for BASIC authentication, that means until the user
+ closes their browser). The cached user is <strong>not</strong> saved and
+ restored across sessions serialisations. Any changes to the directory
+ information for an already authenticated user will <strong>not</strong> be
+ reflected until the next time that user logs on again.</li>
+<li>Administering the information in the directory server
+ is the responsibility of your own applications. Tomcat does not
+ provide any built-in capabilities to maintain users and roles.</li>
+</ul>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="UserDatabaseRealm">UserDatabaseRealm</h4><div class="text">
+
+<h5>Introduction</h5>
+
+<p><strong>UserDatabaseRealm</strong> is an implementation of the Tomcat
+<code>Realm</code> interface that uses a JNDI resource to store user
+information. By default, the JNDI resource is backed by an XML file. It is not
+designed for large-scale production use. At startup time, the UserDatabaseRealm
+loads information about all users, and their corresponding roles, from an XML
+document (by default, this document is loaded from
+<code>$CATALINA_BASE/conf/tomcat-users.xml</code>). The users, their passwords
+and their roles may all be editing dynamically, typically via JMX. Changes may
+be saved and will be reflected in the XML file.</p>
+
+<h5>Realm Element Attributes</h5>
+
+<p>To configure UserDatabaseRealm, you will create a <code><Realm></code>
+element and nest it in your <code>$CATALINA_BASE/conf/server.xml</code> file,
+as described <a href="#Configuring_a_Realm">above</a>. The attributes for the
+UserDatabaseRealm are defined in the <a href="config/realm.html">Realm</a>
+configuration documentation.</p>
+
+<h5>User File Format</h5>
+
+<p>The users file uses the same format as the
+<a href="#MemoryRealm">MemoryRealm</a>.</p>
+
+<h5>Example</h5>
+
+<p>The default installation of Tomcat is configured with a UserDatabaseRealm
+nested inside the <code><Engine></code> element, so that it applies
+to all virtual hosts and web applications. The default contents of the
+<code>conf/tomcat-users.xml</code> file is:</p>
+<div class="codeBox"><pre><code><tomcat-users>
+ <user username="tomcat" password="tomcat" roles="tomcat" />
+ <user username="role1" password="tomcat" roles="role1" />
+ <user username="both" password="tomcat" roles="tomcat,role1" />
+</tomcat-users></code></pre></div>
+
+<h5>Additional Notes</h5>
+
+<p>UserDatabaseRealm operates according to the following rules:</p>
+<ul>
+<li>When Tomcat first starts up, it loads all defined users and their
+ associated information from the users file. Changes made to the data in
+ this file will <strong>not</strong> be recognized until Tomcat is
+ restarted. Changes may be made via the UserDatabase resource. Tomcat
+ provides MBeans that may be accessed via JMX for this purpose.</li>
+<li>When a user attempts to access a protected resource for the first time,
+ Tomcat will call the <code>authenticate()</code> method of this
+ <code>Realm</code>.</li>
+<li>Once a user has been authenticated, the user (and their associated
+ roles) are cached within Tomcat for the duration of the user's login.
+ (For FORM-based authentication, that means until the session times out or
+ is invalidated; for BASIC authentication, that means until the user
+ closes their browser). The cached user is <strong>not</strong> saved and
+ restored across sessions serialisations.</li>
+</ul>
+
+
+</div></div>
+
+
+<div class="subsection"><h4 id="MemoryRealm">MemoryRealm</h4><div class="text">
+
+<h5>Introduction</h5>
+
+<p><strong>MemoryRealm</strong> is a simple demonstration implementation of the
+Tomcat <code>Realm</code> interface. It is not designed for production use.
+At startup time, MemoryRealm loads information about all users, and their
+corresponding roles, from an XML document (by default, this document is loaded
+from <code>$CATALINA_BASE/conf/tomcat-users.xml</code>). Changes to the data
+in this file are not recognized until Tomcat is restarted.</p>
+
+<h5>Realm Element Attributes</h5>
+
+<p>To configure MemoryRealm, you will create a <code><Realm></code>
+element and nest it in your <code>$CATALINA_BASE/conf/server.xml</code> file,
+as described <a href="#Configuring_a_Realm">above</a>. The attributes for the
+MemoryRealm are defined in the <a href="config/realm.html">Realm</a>
+configuration documentation.</p>
+
+<h5>User File Format</h5>
+
+<p>The users file (by default, <code>conf/tomcat-users.xml</code> must be an
+XML document, with a root element <code><tomcat-users></code>. Nested
+inside the root element will be a <code><user></code> element for each
+valid user, consisting of the following attributes:</p>
+<ul>
+<li><strong>name</strong> - Username this user must log on with.</li>
+<li><strong>password</strong> - Password this user must log on with (in
+ clear text if the <code>digest</code> attribute was not set on the
+ <code><Realm></code> element, or digested appropriately as
+ described <a href="#Digested_Passwords">here</a> otherwise).</li>
+<li><strong>roles</strong> - Comma-delimited list of the role names
+ associated with this user.</li>
+</ul>
+
+<h5>Additional Notes</h5>
+
+<p>MemoryRealm operates according to the following rules:</p>
+<ul>
+<li>When Tomcat first starts up, it loads all defined users and their
+ associated information from the users file. Changes to the data in
+ this file will <strong>not</strong> be recognized until Tomcat is
+ restarted.</li>
+<li>When a user attempts to access a protected resource for the first time,
+ Tomcat will call the <code>authenticate()</code> method of this
+ <code>Realm</code>.</li>
+<li>Once a user has been authenticated, the user (and their associated
+ roles) are cached within Tomcat for the duration of the user's login.
+ (For FORM-based authentication, that means until the session times out or
+ is invalidated; for BASIC authentication, that means until the user
+ closes their browser). The cached user is <strong>not</strong> saved and
+ restored across sessions serialisations.</li>
+<li>Administering the information in the users file is the responsibility
+ of your application. Tomcat does not
+ provide any built-in capabilities to maintain users and roles.</li>
+</ul>
+
+
+</div></div>
+
+
+<div class="subsection"><h4 id="JAASRealm">JAASRealm</h4><div class="text">
+
+<h5>Introduction</h5>
+
+ <p><strong>JAASRealm</strong> is an implementation of the Tomcat
+<code>Realm</code> interface that authenticates users through the Java
+Authentication & Authorization Service (JAAS) framework which is now
+provided as part of the standard Java SE API.</p>
+ <p>Using JAASRealm gives the developer the ability to combine
+practically any conceivable security realm with Tomcat's CMA. </p>
+ <p>JAASRealm is prototype for Tomcat of the JAAS-based
+J2EE authentication framework for J2EE v1.4, based on the <a href="https://www.jcp.org/en/jsr/detail?id=196">JCP Specification
+Request 196</a> to enhance container-managed security and promote
+'pluggable' authentication mechanisms whose implementations would be
+container-independent.
+ </p>
+ <p>Based on the JAAS login module and principal (see <code>javax.security.auth.spi.LoginModule</code>
+and <code>javax.security.Principal</code>), you can develop your own
+security mechanism or wrap another third-party mechanism for
+integration with the CMA as implemented by Tomcat.
+ </p>
+
+ <h5>Quick Start</h5>
+ <p>To set up Tomcat to use JAASRealm with your own JAAS login module,
+ you will need to follow these steps:</p>
+ <ol>
+ <li>Write your own LoginModule, User and Role classes based
+on JAAS (see
+<a href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/jaas/tutorials/GeneralAcnOnly.html">
+the JAAS Authentication Tutorial</a> and
+<a href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/jaas/JAASLMDevGuide.html">
+the JAAS Login Module Developer's Guide</a>) to be managed by the JAAS Login
+Context (<code>javax.security.auth.login.LoginContext</code>)
+When developing your LoginModule, note that JAASRealm's built-in <code>CallbackHandler</code>
+only recognizes the <code>NameCallback</code> and <code>PasswordCallback</code> at present.
+ </li>
+ <li>Although not specified in JAAS, you should create
+separate classes to distinguish between users and roles, extending <code>javax.security.Principal</code>,
+so that Tomcat can tell which Principals returned from your login
+module are users and which are roles (see <code>org.apache.catalina.realm.JAASRealm</code>).
+Regardless, the first Principal returned is <em>always</em> treated as the user Principal.
+ </li>
+ <li>Place the compiled classes on Tomcat's classpath
+ </li>
+ <li>Set up a login.config file for Java (see <a href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/jaas/tutorials/LoginConfigFile.html">
+JAAS LoginConfig file</a>) and tell Tomcat where to find it by specifying
+its location to the JVM, for instance by setting the environment
+variable: <code>JAVA_OPTS=$JAVA_OPTS -Djava.security.auth.login.config==$CATALINA_BASE/conf/jaas.config</code></li>
+
+ <li>Configure your security-constraints in your web.xml for
+the resources you want to protect</li>
+ <li>Configure the JAASRealm module in your server.xml </li>
+ <li>Restart Tomcat if it is already running.</li>
+ </ol>
+ <h5>Realm Element Attributes</h5>
+ <p>To configure JAASRealm as for step 6 above, you create
+a <code><Realm></code> element and nest it in your
+<code>$CATALINA_BASE/conf/server.xml</code>
+file within your <code><Engine></code> node. The attributes for the
+JAASRealm are defined in the <a href="config/realm.html">Realm</a>
+configuration documentation.</p>
+
+<h5>Example</h5>
+
+<p>Here is an example of how your server.xml snippet should look.</p>
+
+<div class="codeBox"><pre><code><Realm className="org.apache.catalina.realm.JAASRealm"
+ appName="MyFooRealm"
+ userClassNames="org.foobar.realm.FooUser"
+ roleClassNames="org.foobar.realm.FooRole"/></code></pre></div>
+
+<p>It is the responsibility of your login module to create and save User and
+Role objects representing Principals for the user
+(<code>javax.security.auth.Subject</code>). If your login module doesn't
+create a user object but also doesn't throw a login exception, then the
+Tomcat CMA will break and you will be left at the
+http://localhost:8080/myapp/j_security_check URI or at some other
+unspecified location.</p>
+
+ <p>The flexibility of the JAAS approach is two-fold: </p>
+ <ul>
+ <li>you can carry out whatever processing you require behind
+the scenes in your own login module.</li>
+ <li>you can plug in a completely different LoginModule by changing the configuration
+and restarting the server, without any code changes to your application.</li>
+ </ul>
+
+ <h5>Additional Notes</h5>
+ <ul>
+ <li>When a user attempts to access a protected resource for
+ the first time, Tomcat will call the <code>authenticate()</code>
+ method of this <code>Realm</code>. Thus, any changes you have made in
+ the security mechanism directly (new users, changed passwords or
+ roles, etc.) will be immediately reflected.</li>
+ <li>Once a user has been authenticated, the user (and their
+ associated roles) are cached within Tomcat for the duration of
+ the user's login. For FORM-based authentication, that means until
+ the session times out or is invalidated; for BASIC authentication,
+ that means until the user closes their browser. Any changes to the
+ security information for an already authenticated user will <strong>not</strong>
+ be reflected until the next time that user logs on again.</li>
+ <li>As with other <code>Realm</code> implementations, digested passwords
+ are supported if the <code><Realm></code> element in <code>server.xml</code>
+ contains a <code>digest</code> attribute; JAASRealm's <code>CallbackHandler</code>
+ will digest the password prior to passing it back to the <code>LoginModule</code></li>
+ </ul>
+
+</div></div>
+
+
+<div class="subsection"><h4 id="CombinedRealm">CombinedRealm</h4><div class="text">
+
+ <h5>Introduction</h5>
+
+ <p><strong>CombinedRealm</strong> is an implementation of the Tomcat
+ <code>Realm</code> interface that authenticates users through one or more
+ sub-Realms.</p>
+
+ <p>Using CombinedRealm gives the developer the ability to combine multiple
+ Realms of the same or different types. This can be used to authenticate
+ against different sources, provide fall back in case one Realm fails or for
+ any other purpose that requires multiple Realms.</p>
+
+ <p>Sub-realms are defined by nesting <code>Realm</code> elements inside the
+ <code>Realm</code> element that defines the CombinedRealm. Authentication
+ will be attempted against each <code>Realm</code> in the order they are
+ listed. Authentication against any Realm will be sufficient to authenticate
+ the user.</p>
+
+ <h5>Realm Element Attributes</h5>
+ <p>To configure a CombinedRealm, you create a <code><Realm></code>
+ element and nest it in your <code>$CATALINA_BASE/conf/server.xml</code>
+ file within your <code><Engine></code> or <code><Host></code>.
+ You can also nest inside a <code><Context></code> node in a
+ <code>context.xml</code> file.</p>
+
+<h5>Example</h5>
+
+<p>Here is an example of how your server.xml snippet should look to use a
+UserDatabase Realm and a DataSource Realm.</p>
+
+<div class="codeBox"><pre><code><Realm className="org.apache.catalina.realm.CombinedRealm" >
+ <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
+ resourceName="UserDatabase"/>
+ <Realm className="org.apache.catalina.realm.DataSourceRealm"
+ dataSourceName="jdbc/authority"
+ userTable="users" userNameCol="user_name" userCredCol="user_pass"
+ userRoleTable="user_roles" roleNameCol="role_name"/>
+</Realm></code></pre></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="LockOutRealm">LockOutRealm</h4><div class="text">
+
+ <h5>Introduction</h5>
+
+ <p><strong>LockOutRealm</strong> is an implementation of the Tomcat
+ <code>Realm</code> interface that extends the CombinedRealm to provide lock
+ out functionality to provide a user lock out mechanism if there are too many
+ failed authentication attempts in a given period of time.</p>
+
+ <p>To ensure correct operation, there is a reasonable degree of
+ synchronisation in this Realm.</p>
+
+ <p>This Realm does not require modification to the underlying Realms or the
+ associated user storage mechanisms. It achieves this by recording all failed
+ logins, including those for users that do not exist. To prevent a DOS by
+ deliberating making requests with invalid users (and hence causing this
+ cache to grow) the size of the list of users that have failed authentication
+ is limited.</p>
+
+ <p>Sub-realms are defined by nesting <code>Realm</code> elements inside the
+ <code>Realm</code> element that defines the LockOutRealm. Authentication
+ will be attempted against each <code>Realm</code> in the order they are
+ listed. Authentication against any Realm will be sufficient to authenticate
+ the user.</p>
+
+ <h5>Realm Element Attributes</h5>
+ <p>To configure a LockOutRealm, you create a <code><Realm></code>
+ element and nest it in your <code>$CATALINA_BASE/conf/server.xml</code>
+ file within your <code><Engine></code> or <code><Host></code>.
+ You can also nest inside a <code><Context></code> node in a
+ <code>context.xml</code> file. The attributes for the
+ LockOutRealm are defined in the <a href="config/realm.html">Realm</a>
+ configuration documentation.</p>
+
+<h5>Example</h5>
+
+<p>Here is an example of how your server.xml snippet should look to add lock out
+functionality to a UserDatabase Realm.</p>
+
+<div class="codeBox"><pre><code><Realm className="org.apache.catalina.realm.LockOutRealm" >
+ <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
+ resourceName="UserDatabase"/>
+</Realm></code></pre></div>
+
+</div></div>
+
+<div class="subsection"><h4 id="JDBCRealm">JDBCRealm</h4><div class="text">
+
+<h5>Introduction</h5>
+
+<p><strong>The JDBC Database Realm has been deprecated and will be removed
+in Tomcat 10 onwards. Use the DataSourceRealm instead.</strong></p>
+
+<p><strong>JDBCRealm</strong> is an implementation of the Tomcat
+<code>Realm</code> interface that looks up users in a relational database
+accessed via a JDBC driver. There is substantial configuration flexibility
+that lets you adapt to existing table and column names, as long as your
+database structure conforms to the following requirements:</p>
+<ul>
+<li>There must be a table, referenced below as the <em>users</em> table,
+ that contains one row for every valid user that this <code>Realm</code>
+ should recognize.</li>
+<li>The <em>users</em> table must contain at least two columns (it may
+ contain more if your existing applications required it):
+ <ul>
+ <li>Username to be recognized by Tomcat when the user logs in.</li>
+ <li>Password to be recognized by Tomcat when the user logs in.
+ This value may in cleartext or digested - see below for more
+ information.</li>
+ </ul></li>
+<li>There must be a table, referenced below as the <em>user roles</em> table,
+ that contains one row for every valid role that is assigned to a
+ particular user. It is legal for a user to have zero, one, or more than
+ one valid role.</li>
+<li>The <em>user roles</em> table must contain at least two columns (it may
+ contain more if your existing applications required it):
+ <ul>
+ <li>Username to be recognized by Tomcat (same value as is specified
+ in the <em>users</em> table).</li>
+ <li>Role name of a valid role associated with this user.</li>
+ </ul></li>
+</ul>
+
+<h5>Quick Start</h5>
+
+<p>To set up Tomcat to use JDBCRealm, you will need to follow these steps:</p>
+<ol>
+<li>If you have not yet done so, create tables and columns in your database
+ that conform to the requirements described above.</li>
+<li>Configure a database username and password for use by Tomcat, that has
+ at least read only access to the tables described above. (Tomcat will
+ never attempt to write to these tables.)</li>
+<li>Place a copy of the JDBC driver you will be using inside the
+ <code>$CATALINA_HOME/lib</code> directory.
+ Note that <strong>only</strong> JAR files are recognized!</li>
+<li>Set up a <code><Realm></code> element, as described below, in your
+ <code>$CATALINA_BASE/conf/server.xml</code> file.</li>
+<li>Restart Tomcat if it is already running.</li>
+</ol>
+
+<h5>Realm Element Attributes</h5>
+
+<p>To configure JDBCRealm, you will create a <code><Realm></code>
+element and nest it in your <code>$CATALINA_BASE/conf/server.xml</code> file,
+as described <a href="#Configuring_a_Realm">above</a>. The attributes for the
+JDBCRealm are defined in the <a href="config/realm.html">Realm</a> configuration
+documentation.</p>
+
+<h5>Example</h5>
+
+<p>An example SQL script to create the needed tables might look something
+like this (adapt the syntax as required for your particular database):</p>
+<div class="codeBox"><pre><code>create table users (
+ user_name varchar(15) not null primary key,
+ user_pass varchar(15) not null
+);
+
+create table user_roles (
+ user_name varchar(15) not null,
+ role_name varchar(15) not null,
+ primary key (user_name, role_name)
+);</code></pre></div>
+
+<p>Example <code>Realm</code> elements are included (commented out) in the
+default <code>$CATALINA_BASE/conf/server.xml</code> file. Here's an example
+for using a MySQL database called "authority", configured with the tables
+described above, and accessed with username "dbuser" and password "dbpass":</p>
+<div class="codeBox"><pre><code><Realm className="org.apache.catalina.realm.JDBCRealm"
+ driverName="org.gjt.mm.mysql.Driver"
+ connectionURL="jdbc:mysql://localhost/authority?user=dbuser&amp;password=dbpass"
+ userTable="users" userNameCol="user_name" userCredCol="user_pass"
+ userRoleTable="user_roles" roleNameCol="role_name"/></code></pre></div>
+
+<h5>Additional Notes</h5>
+
+<p>JDBCRealm operates according to the following rules:</p>
+<ul>
+<li>When a user attempts to access a protected resource for the first time,
+ Tomcat will call the <code>authenticate()</code> method of this
+ <code>Realm</code>. Thus, any changes you have made to the database
+ directly (new users, changed passwords or roles, etc.) will be immediately
+ reflected.</li>
+<li>Once a user has been authenticated, the user (and his or her associated
+ roles) are cached within Tomcat for the duration of the user's login.
+ (For FORM-based authentication, that means until the session times out or
+ is invalidated; for BASIC authentication, that means until the user
+ closes their browser). The cached user is <strong>not</strong> saved and
+ restored across sessions serialisations. Any changes to the database
+ information for an already authenticated user will <strong>not</strong> be
+ reflected until the next time that user logs on again.</li>
+<li>Administering the information in the <em>users</em> and <em>user roles</em>
+ table is the responsibility of your own applications. Tomcat does not
+ provide any built-in capabilities to maintain users and roles.</li>
+</ul>
+
+</div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/rewrite.html b/web/tomcat/webapps/docs/rewrite.html
new file mode 100644
index 0000000..342ce2e
--- /dev/null
+++ b/web/tomcat/webapps/docs/rewrite.html
@@ -0,0 +1,703 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - The rewrite Valve</title><meta name="author" content="Remy Maucherat"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The rewrite Valve</h2><h3 id="Introduction">Introduction</h3><div class="text">
+
+ <p>The rewrite valve implements URL rewrite functionality in a way that is
+ very similar to mod_rewrite from Apache HTTP Server.</p>
+
+</div><h3 id="Configuration">Configuration</h3><div class="text">
+
+ <p>The rewrite valve is configured as a valve using the <code>org.apache.catalina.valves.rewrite.RewriteValve</code>
+ class name.</p>
+
+ <p>The rewrite valve can be configured as a valve added in a Host.
+ See <a href="config/host.html">virtual-server</a> documentation for
+ informations how to configure it. It will use a <code>rewrite.config</code> file
+ containing the rewrite directives, it must be placed in the Host configuration
+ folder.
+ </p>
+
+ <p>It can also be in the context.xml of a webapp.
+ The valve will then use a <code>rewrite.config</code> file containing the
+ rewrite directives, it must be placed in the WEB-INF folder of the web application
+ </p>
+
+</div><h3 id="Directives">Directives</h3><div class="text">
+
+ <p>The rewrite.config file contains a list of directives which closely
+ resemble the directives used by mod_rewrite, in particular the central
+ RewriteRule and RewriteCond directives. Lines that start with a
+ <code>#</code> character are treated as comments and will be ignored.</p>
+
+ <p>Note: This section is a modified version of the mod_rewrite documentation,
+ which is Copyright 1995-2006 The Apache Software Foundation, and licensed under the
+ under the Apache License, Version 2.0.</p>
+
+ <div class="subsection"><h4 id="RewriteCond">RewriteCond</h4><div class="text">
+
+ <p>Syntax: <code>RewriteCond TestString CondPattern</code></p>
+
+ <p>The RewriteCond directive defines a rule condition. One or more RewriteCond
+ can precede a RewriteRule directive. The following rule is then only used if both
+ the current state of the URI matches its pattern, and if these conditions are met.</p>
+
+ <p><em>TestString</em> is a string which can contain the
+ following expanded constructs in addition to plain text:</p>
+
+ <ul>
+ <li>
+ <strong>RewriteRule backreferences</strong>: These are
+ backreferences of the form <strong><code>$N</code></strong>
+ (0 <= N <= 9), which provide access to the grouped
+ parts (in parentheses) of the pattern, from the
+ <code>RewriteRule</code> which is subject to the current
+ set of <code>RewriteCond</code> conditions..
+ </li>
+ <li>
+ <strong>RewriteCond backreferences</strong>: These are
+ backreferences of the form <strong><code>%N</code></strong>
+ (1 <= N <= 9), which provide access to the grouped
+ parts (again, in parentheses) of the pattern, from the last matched
+ <code>RewriteCond</code> in the current set
+ of conditions.
+ </li>
+ <li>
+ <strong>RewriteMap expansions</strong>: These are
+ expansions of the form <strong><code>${mapname:key|default}</code></strong>.
+ See <a href="#mapfunc">the documentation for
+ RewriteMap</a> for more details.
+ </li>
+ <li>
+ <strong>Server-Variables</strong>: These are variables of
+ the form
+ <strong><code>%{</code> <em>NAME_OF_VARIABLE</em>
+ <code>}</code></strong>
+ where <em>NAME_OF_VARIABLE</em> can be a string taken
+ from the following list:
+
+ <ul>
+ <li>
+ <p><b>HTTP headers:</b></p>
+ <p>
+ HTTP_USER_AGENT<br>
+ HTTP_REFERER<br>
+ HTTP_COOKIE<br>
+ HTTP_FORWARDED<br>
+ HTTP_HOST<br>
+ HTTP_PROXY_CONNECTION<br>
+ HTTP_ACCEPT<br>
+ </p>
+ </li>
+ <li>
+ <p><b>connection & request:</b></p>
+ <p>
+ REMOTE_ADDR<br>
+ REMOTE_HOST<br>
+ REMOTE_PORT<br>
+ REMOTE_USER<br>
+ REMOTE_IDENT<br>
+ REQUEST_METHOD<br>
+ SCRIPT_FILENAME<br>
+ REQUEST_PATH<br>
+ CONTEXT_PATH<br>
+ SERVLET_PATH<br>
+ PATH_INFO<br>
+ QUERY_STRING<br>
+ AUTH_TYPE<br>
+ </p>
+ </li>
+ <li>
+ <p><b>server internals:</b></p>
+ <p>
+ DOCUMENT_ROOT<br>
+ SERVER_NAME<br>
+ SERVER_ADDR<br>
+ SERVER_PORT<br>
+ SERVER_PROTOCOL<br>
+ SERVER_SOFTWARE<br>
+ </p>
+ </li>
+ <li>
+ <p><b>date and time:</b></p>
+ <p>
+ TIME_YEAR<br>
+ TIME_MON<br>
+ TIME_DAY<br>
+ TIME_HOUR<br>
+ TIME_MIN<br>
+ TIME_SEC<br>
+ TIME_WDAY<br>
+ TIME<br>
+ </p>
+ </li>
+ <li>
+ <p><b>specials:</b></p>
+ <p>
+ THE_REQUEST<br>
+ REQUEST_URI<br>
+ REQUEST_FILENAME<br>
+ HTTPS<br>
+ </p>
+ </li>
+ </ul>
+
+ <p>These variables all
+ correspond to the similarly named HTTP
+ MIME-headers and Servlet API methods.
+ Most are documented elsewhere in the Manual or in
+ the CGI specification. Those that are special to
+ the rewrite valve include those below.</p>
+
+ <dl>
+
+ <dt><code>REQUEST_PATH</code></dt>
+
+ <dd>Corresponds to the full path that is used for mapping.</dd>
+
+ <dt><code>CONTEXT_PATH</code></dt>
+
+ <dd>Corresponds to the path of the mapped context.</dd>
+
+ <dt><code>SERVLET_PATH</code></dt>
+
+ <dd>Corresponds to the servlet path.</dd>
+
+ <dt><code>THE_REQUEST</code></dt>
+
+ <dd>The full HTTP request line sent by the
+ browser to the server (e.g., "<code>GET
+ /index.html HTTP/1.1</code>"). This does not
+ include any additional headers sent by the
+ browser.</dd>
+
+ <dt><code>REQUEST_URI</code></dt>
+
+ <dd>The resource requested in the HTTP request
+ line. (In the example above, this would be
+ "/index.html".)</dd>
+
+ <dt><code>REQUEST_FILENAME</code></dt>
+
+ <dd>The full local file system path to the file or
+ script matching the request.</dd>
+
+ <dt><code>HTTPS</code></dt>
+
+ <dd>Will contain the text "on" if the connection is
+ using SSL/TLS, or "off" otherwise.</dd>
+
+ </dl>
+
+ </li>
+ </ul>
+
+ <p>Other things you should be aware of:</p>
+
+ <ol>
+ <li>The variables SCRIPT_FILENAME and REQUEST_FILENAME
+ contain the same value - the value of the
+ <code>filename</code> field of the internal
+ <code>request_rec</code> structure of the Apache server.
+ The first name is the commonly known CGI variable name
+ while the second is the appropriate counterpart of
+ REQUEST_URI (which contains the value of the
+ <code>uri</code> field of <code>request_rec</code>).</li>
+
+ <li>
+ <code>%{ENV:variable}</code>, where <em>variable</em> can be
+ any Java system property, is also available.</li>
+
+ <li>
+ <code>%{SSL:variable}</code>, where <em>variable</em> is the
+ name of an SSL environment
+ variable, are implemented, except
+ <code>SSL_SESSION_RESUMED</code>, <code>SSL_SECURE_RENEG</code>,
+ <code>SSL_COMPRESS_METHOD</code>, <code>SSL_TLS_SNI</code>,
+ <code>SSL_SRP_USER</code>, <code>SSL_SRP_USERINFO</code>,
+ <code>SSL_CLIENT_VERIFY</code>,
+ <code>SSL_CLIENT_SAN_OTHER_msUPN_n</code>,
+ <code>SSL_CLIENT_CERT_RFC4523_CEA</code>.
+ Also, the variables related to the server
+ certificate, prefixed by <code>SSL_SERVER_</code> are not available.
+ Example:
+ <code>%{SSL:SSL_CIPHER_USEKEYSIZE}</code> may expand to
+ <code>128</code>.</li>
+
+ <li>
+ <code>%{HTTP:header}</code>, where <em>header</em> can be
+ any HTTP MIME-header name, can always be used to obtain the
+ value of a header sent in the HTTP request.
+ Example: <code>%{HTTP:Proxy-Connection}</code> is
+ the value of the HTTP header
+ ``<code>Proxy-Connection:</code>''.</li>
+
+ </ol>
+
+ <p><em>CondPattern</em> is the condition pattern,
+ a regular expression which is applied to the
+ current instance of the <em>TestString</em>.
+ <em>TestString</em> is first evaluated, before being matched against
+ <em>CondPattern</em>.</p>
+
+ <p><strong>Remember:</strong> <em>CondPattern</em> is a
+ <em>perl compatible regular expression</em> with some
+ additions:</p>
+
+ <ol>
+ <li>You can prefix the pattern string with a
+ '<code>!</code>' character (exclamation mark) to specify a
+ <strong>non</strong>-matching pattern.</li>
+
+ <li>
+ There are some special variants of <em>CondPatterns</em>.
+ Instead of real regular expression strings you can also
+ use one of the following:
+
+ <ul>
+ <li>'<strong><CondPattern</strong>' (lexicographically
+ precedes)<br>
+ Treats the <em>CondPattern</em> as a plain string and
+ compares it lexicographically to <em>TestString</em>. True if
+ <em>TestString</em> lexicographically precedes
+ <em>CondPattern</em>.</li>
+
+ <li>'<strong>>CondPattern</strong>' (lexicographically
+ follows)<br>
+ Treats the <em>CondPattern</em> as a plain string and
+ compares it lexicographically to <em>TestString</em>. True if
+ <em>TestString</em> lexicographically follows
+ <em>CondPattern</em>.</li>
+
+ <li>'<strong>=CondPattern</strong>' (lexicographically
+ equal)<br>
+ Treats the <em>CondPattern</em> as a plain string and
+ compares it lexicographically to <em>TestString</em>. True if
+ <em>TestString</em> is lexicographically equal to
+ <em>CondPattern</em> (the two strings are exactly
+ equal, character for character). If <em>CondPattern</em>
+ is <code>""</code> (two quotation marks) this
+ compares <em>TestString</em> to the empty string.</li>
+
+ <li>'<strong>-d</strong>' (is
+ <strong>d</strong>irectory)<br>
+ Treats the <em>TestString</em> as a pathname and tests
+ whether or not it exists, and is a directory.</li>
+
+ <li>'<strong>-f</strong>' (is regular
+ <strong>f</strong>ile)<br>
+ Treats the <em>TestString</em> as a pathname and tests
+ whether or not it exists, and is a regular file.</li>
+
+ <li>'<strong>-s</strong>' (is regular file, with
+ <strong>s</strong>ize)<br>
+ Treats the <em>TestString</em> as a pathname and tests
+ whether or not it exists, and is a regular file with size greater
+ than zero.</li>
+
+ </ul>
+
+<strong>Note:</strong>
+ All of these tests can
+ also be prefixed by an exclamation mark ('!') to
+ negate their meaning.
+
+ </li>
+
+ <li>You can also set special flags for
+ <em>CondPattern</em> by appending
+ <strong><code>[</code><em>flags</em><code>]</code></strong>
+ as the third argument to the <code>RewriteCond</code>
+ directive, where <em>flags</em> is a comma-separated list of any of the
+ following flags:
+
+ <ul>
+ <li>'<strong><code>nocase|NC</code></strong>'
+ (<strong>n</strong>o <strong>c</strong>ase)<br>
+ This makes the test case-insensitive - differences
+ between 'A-Z' and 'a-z' are ignored, both in the
+ expanded <em>TestString</em> and the <em>CondPattern</em>.
+ This flag is effective only for comparisons between
+ <em>TestString</em> and <em>CondPattern</em>. It has no
+ effect on file system and subrequest checks.</li>
+
+ <li>
+ '<strong><code>ornext|OR</code></strong>'
+ (<strong>or</strong> next condition)<br>
+ Use this to combine rule conditions with a local OR
+ instead of the implicit AND. Typical example:
+
+<div class="codeBox"><pre><code>RewriteCond %{REMOTE_HOST} ^host1.* [OR]
+RewriteCond %{REMOTE_HOST} ^host2.* [OR]
+RewriteCond %{REMOTE_HOST} ^host3.*
+RewriteRule ...some special stuff for any of these hosts...</code></pre></div>
+
+ Without this flag you would have to write the condition/rule
+ pair three times.
+ </li>
+ </ul>
+ </li>
+ </ol>
+
+ <p><strong>Example:</strong></p>
+
+ <p>To rewrite the Homepage of a site according to the
+ ``<code>User-Agent:</code>'' header of the request, you can
+ use the following: </p>
+
+<div class="codeBox"><pre><code>RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
+RewriteRule ^/$ /homepage.max.html [L]
+
+RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
+RewriteRule ^/$ /homepage.min.html [L]
+
+RewriteRule ^/$ /homepage.std.html [L]</code></pre></div>
+
+ <p>Explanation: If you use a browser which identifies itself
+ as 'Mozilla' (including Netscape Navigator, Mozilla etc), then you
+ get the max homepage (which could include frames, or other special
+ features).
+ If you use the Lynx browser (which is terminal-based), then
+ you get the min homepage (which could be a version designed for
+ easy, text-only browsing).
+ If neither of these conditions apply (you use any other browser,
+ or your browser identifies itself as something non-standard), you get
+ the std (standard) homepage.</p>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="RewriteMap">RewriteMap</h4><div class="text">
+
+ <p>Syntax: <code>RewriteMap name rewriteMapClassName optionalParameters</code></p>
+
+ <p>The <code>rewriteMapClassName</code> value also allows special values:
+ <ul>
+ <li><code>int:toupper</code>: Special map converting passed values to upper case</li>
+ <li><code>int:tolower</code>: Special map converting passed values to lower case</li>
+ <li><code>int:escape</code>: URL escape the passed value</li>
+ <li><code>int:unescape</code>: URL unescape the passed value</li>
+ </ul>
+ </p>
+
+ <p>The maps are implemented using an interface that users must implement. Its class
+ name is <code>org.apache.catalina.valves.rewrite.RewriteMap</code>, and its code is:</p>
+
+<div class="codeBox"><pre><code>package org.apache.catalina.valves.rewrite;
+
+public interface RewriteMap {
+ public String setParameters(String params);
+ public String lookup(String key);
+}</code></pre></div>
+
+ </div></div>
+
+ <div class="subsection"><h4 id="RewriteRule">RewriteRule</h4><div class="text">
+
+ <p>Syntax: <code>RewriteRule Pattern Substitution</code></p>
+
+ <p>The RewriteRule directive is the real
+ rewriting workhorse. The directive can occur more than once,
+ with each instance defining a single rewrite rule. The
+ order in which these rules are defined is important - this is the order
+ in which they will be applied at run-time.</p>
+
+ <p>Pattern is a perl compatible regular
+ expression, which is applied to the current URL.
+ ``Current'' means the value of the URL when this rule is
+ applied. This may not be the originally requested URL,
+ which may already have matched a previous rule, and have been
+ altered.</p>
+
+ <p><strong>Security warning:</strong> Due to the way Java's
+ regex matching is done, poorly formed regex patterns are vulnerable
+ to "catastrophic backtracking", also known as "regular expression
+ denial of service" or ReDoS. Therefore, extra caution should be used
+ for RewriteRule patterns. In general it is difficult to automatically
+ detect such vulnerable regex, and so a good defense is to read a bit
+ on the subject of catastrophic backtracking. A good reference is the
+ <a href="https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS">
+ OWASP ReDoS guide</a>.</p>
+
+ <p>Some hints on the syntax of regular
+ expressions:</p>
+
+
+<pre>
+<strong>Text:</strong>
+ <strong><code>.</code></strong> Any single character
+ <strong><code>[</code></strong>chars<strong><code>]</code></strong> Character class: Any character of the class ``chars''
+ <strong><code>[^</code></strong>chars<strong><code>]</code></strong> Character class: Not a character of the class ``chars''
+ text1<strong><code>|</code></strong>text2 Alternative: text1 or text2
+
+<strong>Quantifiers:</strong>
+ <strong><code>?</code></strong> 0 or 1 occurrences of the preceding text
+ <strong><code>*</code></strong> 0 or N occurrences of the preceding text (N > 0)
+ <strong><code>+</code></strong> 1 or N occurrences of the preceding text (N > 1)
+
+<strong>Grouping:</strong>
+ <strong><code>(</code></strong>text<strong><code>)</code></strong> Grouping of text
+ (used either to set the borders of an alternative as above, or
+ to make backreferences, where the <strong>N</strong>th group can
+ be referred to on the RHS of a RewriteRule as <code>$</code><strong>N</strong>)
+
+<strong>Anchors:</strong>
+ <strong><code>^</code></strong> Start-of-line anchor
+ <strong><code>$</code></strong> End-of-line anchor
+
+<strong>Escaping:</strong>
+ <strong><code>\</code></strong>char escape the given char
+ (for instance, to specify the chars "<code>.[]()</code>" <em>etc.</em>)
+</pre>
+
+ <p>For more information about regular expressions, have a look at the
+ perl regular expression manpage ("<a href="https://perldoc.perl.org/perlre.html">perldoc
+ perlre</a>"). If you are interested in more detailed
+ information about regular expressions and their variants
+ (POSIX regex etc.) the following book is dedicated to this topic:</p>
+
+ <p class="indent">
+ <em>Mastering Regular Expressions, 2nd Edition</em><br>
+ Jeffrey E.F. Friedl<br>
+ O'Reilly & Associates, Inc. 2002<br>
+ ISBN 978-0-596-00289-3<br>
+ </p>
+
+ <p>In the rules, the NOT character
+ ('<code>!</code>') is also available as a possible pattern
+ prefix. This enables you to negate a pattern; to say, for instance:
+ ``<em>if the current URL does <strong>NOT</strong> match this
+ pattern</em>''. This can be used for exceptional cases, where
+ it is easier to match the negative pattern, or as a last
+ default rule.</p>
+
+<p>
+Note: When using the NOT character to negate a pattern, you cannot include
+grouped wildcard parts in that pattern. This is because, when the
+pattern does NOT match (i.e., the negation matches), there are no
+contents for the groups. Thus, if negated patterns are used, you
+cannot use <code>$N</code> in the substitution string!
+</p>
+
+ <p>The <em id="rhs">substitution</em> of a
+ rewrite rule is the string which is substituted for (or
+ replaces) the original URL which <em>Pattern</em>
+ matched. In addition to plain text, it can include</p>
+
+ <ol>
+ <li>back-references (<code>$N</code>) to the RewriteRule
+ pattern</li>
+
+ <li>back-references (<code>%N</code>) to the last matched
+ RewriteCond pattern</li>
+
+ <li>server-variables as in rule condition test-strings
+ (<code>%{VARNAME}</code>)</li>
+
+ <li><a href="#mapfunc">mapping-function</a> calls
+ (<code>${mapname:key|default}</code>)</li>
+ </ol>
+ <p>Back-references are identifiers of the form
+ <code>$</code><strong>N</strong>
+ (<strong>N</strong>=0..9), which will be replaced
+ by the contents of the <strong>N</strong>th group of the
+ matched <em>Pattern</em>. The server-variables are the same
+ as for the <em>TestString</em> of a <code>RewriteCond</code>
+ directive. The mapping-functions come from the
+ <code>RewriteMap</code> directive and are explained there.
+ These three types of variables are expanded in the order above.</p>
+
+ <p>As already mentioned, all rewrite rules are
+ applied to the <em>Substitution</em> (in the order in which
+ they are defined
+ in the config file). The URL is <strong>completely
+ replaced</strong> by the <em>Substitution</em> and the
+ rewriting process continues until all rules have been applied,
+ or it is explicitly terminated by a
+ <code><strong>L</strong></code> flag.</p>
+
+ <p>The special characters <code>$</code> and <code>%</code> can
+ be quoted by prepending them with a backslash character
+ <code>\</code>.</p>
+
+ <p>There is a special substitution string named
+ '<code>-</code>' which means: <strong>NO
+ substitution</strong>! This is useful in providing
+ rewriting rules which <strong>only</strong> match
+ URLs but do not substitute anything for them. It is commonly used
+ in conjunction with the <strong>C</strong> (chain) flag, in order
+ to apply more than one pattern before substitution occurs.</p>
+
+ <p>Unlike newer mod_rewrite versions, the Tomcat rewrite valve does
+ not automatically support absolute URLs (the specific redirect flag
+ must be used to be able to specify an absolute URLs, see below)
+ or direct file serving.</p>
+
+ <p>Additionally you can set special <span id="rewriteflags">flags</span> for <em>Substitution</em> by
+ appending <strong><code>[</code><em>flags</em><code>]</code></strong>
+ as the third argument to the <code>RewriteRule</code>
+ directive. <em>Flags</em> is a comma-separated list of any of the
+ following flags: </p>
+
+ <ul>
+ <li>'<strong><code>chain|C</code></strong>'
+ (<strong>c</strong>hained with next rule)<br>
+ This flag chains the current rule with the next rule
+ (which itself can be chained with the following rule,
+ and so on). This has the following effect: if a rule
+ matches, then processing continues as usual -
+ the flag has no effect. If the rule does
+ <strong>not</strong> match, then all following chained
+ rules are skipped. For instance, it can be used to remove the
+ ``<code>.www</code>'' part, inside a per-directory rule set,
+ when you let an external redirect happen (where the
+ ``<code>.www</code>'' part should not occur!).</li>
+
+ <li>
+ '<strong><code>cookie|CO=</code></strong><em>NAME</em>:<em>VAL</em>:<em>domain</em>[:<em>lifetime</em>[:<em>path</em>]]'
+ (set <strong>co</strong>okie)<br>
+ This sets a cookie in the client's browser. The cookie's name
+ is specified by <em>NAME</em> and the value is
+ <em>VAL</em>. The <em>domain</em> field is the domain of the
+ cookie, such as '.apache.org', the optional <em>lifetime</em>
+ is the lifetime of the cookie in minutes, and the optional
+ <em>path</em> is the path of the cookie</li>
+
+ <li>
+ '<strong><code>env|E=</code></strong><em>VAR</em>:<em>VAL</em>'
+ (set <strong>e</strong>nvironment variable)<br>
+ This forces a request attribute named <em>VAR</em> to
+ be set to the value <em>VAL</em>, where <em>VAL</em> can
+ contain regexp backreferences (<code>$N</code> and
+ <code>%N</code>) which will be expanded. You can use this
+ flag more than once, to set more than one variable.</li>
+
+ <li>'<strong><code>forbidden|F</code></strong>' (force URL
+ to be <strong>f</strong>orbidden)<br>
+ This forces the current URL to be forbidden - it immediately
+ sends back an HTTP response of 403 (FORBIDDEN).
+ Use this flag in conjunction with
+ appropriate RewriteConds to conditionally block some
+ URLs.</li>
+
+ <li>'<strong><code>gone|G</code></strong>' (force URL to be
+ <strong>g</strong>one)<br>
+ This forces the current URL to be gone - it
+ immediately sends back an HTTP response of 410 (GONE). Use
+ this flag to mark pages which no longer exist as gone.</li>
+
+ <li>
+ '<strong><code>host|H</code></strong>=<em>Host</em>'
+ (apply rewriting to <strong>h</strong>ost)<br>
+ Rather that rewrite the URL, the virtual host will be
+ rewritten.</li>
+
+ <li>'<strong><code>last|L</code></strong>'
+ (<strong>l</strong>ast rule)<br>
+ Stop the rewriting process here and don't apply any more
+ rewrite rules. This corresponds to the Perl
+ <code>last</code> command or the <code>break</code> command
+ in C. Use this flag to prevent the currently
+ rewritten URL from being rewritten further by following
+ rules. For example, use it to rewrite the root-path URL
+ ('<code>/</code>') to a real one, <em>e.g.</em>,
+ '<code>/e/www/</code>'.</li>
+
+ <li>'<strong><code>next|N</code></strong>'
+ (<strong>n</strong>ext round)<br>
+ Re-run the rewriting process (starting again with the
+ first rewriting rule). This time, the URL to match is no longer
+ the original URL, but rather the URL returned by the last rewriting rule.
+ This corresponds to the Perl <code>next</code> command or
+ the <code>continue</code> command in C. Use
+ this flag to restart the rewriting process -
+ to immediately go to the top of the loop.<br>
+ <strong>Be careful not to create an infinite
+ loop!</strong></li>
+
+ <li>'<strong><code>nocase|NC</code></strong>'
+ (<strong>n</strong>o <strong>c</strong>ase)<br>
+ This makes the <em>Pattern</em> case-insensitive,
+ ignoring difference between 'A-Z' and
+ 'a-z' when <em>Pattern</em> is matched against the current
+ URL.</li>
+
+ <li>
+ '<strong><code>noescape|NE</code></strong>'
+ (<strong>n</strong>o URI <strong>e</strong>scaping of
+ output)<br>
+ This flag prevents the rewrite valve from applying the usual URI
+ escaping rules to the result of a rewrite. Ordinarily,
+ special characters (such as '%', '$', ';', and so on)
+ will be escaped into their hexcode equivalents ('%25',
+ '%24', and '%3B', respectively); this flag prevents this
+ from happening. This allows percent symbols to appear in
+ the output, as in
+ <div class="codeBox"><pre><code>RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]</code></pre></div>
+ which would turn '<code>/foo/zed</code>' into a safe
+ request for '<code>/bar?arg=P1=zed</code>'.
+ </li>
+
+
+
+ <li>'<strong><code>qsappend|QSA</code></strong>'
+ (<strong>q</strong>uery <strong>s</strong>tring
+ <strong>a</strong>ppend)<br>
+ This flag forces the rewrite engine to append a query
+ string part of the substitution string to the existing string,
+ instead of replacing it. Use this when you want to add more
+ data to the query string via a rewrite rule.</li>
+
+ <li>'<strong><code>redirect|R</code>
+ [=<em>code</em>]</strong>' (force <span id="redirect">
+ <strong>r</strong>edirect</span>)<br>
+ Prefix <em>Substitution</em> with
+ <code>http://thishost[:thisport]/</code> (which makes the
+ new URL a URI) to force a external redirection. If no
+ <em>code</em> is given, an HTTP response of 302 (FOUND, previously MOVED
+ TEMPORARILY) will be returned. If you want to use other response
+ codes in the range 300-399, simply specify the appropriate number
+ or use one of the following symbolic names:
+ <code>temp</code> (default), <code>permanent</code>,
+ <code>seeother</code>. Use this for rules to
+ canonicalize the URL and return it to the client - to
+ translate ``<code>/~</code>'' into
+ ``<code>/u/</code>'', or to always append a slash to
+ <code>/u/</code><em>user</em>, etc.<br>
+ <strong>Note:</strong> When you use this flag, make
+ sure that the substitution field is a valid URL! Otherwise,
+ you will be redirecting to an invalid location. Remember
+ that this flag on its own will only prepend
+ <code>http://thishost[:thisport]/</code> to the URL, and rewriting
+ will continue. Usually, you will want to stop rewriting at this point,
+ and redirect immediately. To stop rewriting, you should add
+ the 'L' flag.
+ </li>
+
+ <li>'<strong><code>skip|S</code></strong>=<em>num</em>'
+ (<strong>s</strong>kip next rule(s))<br>
+ This flag forces the rewriting engine to skip the next
+ <em>num</em> rules in sequence, if the current rule
+ matches. Use this to make pseudo if-then-else constructs:
+ The last rule of the then-clause becomes
+ <code>skip=N</code>, where N is the number of rules in the
+ else-clause. (This is <strong>not</strong> the same as the
+ 'chain|C' flag!)</li>
+
+ <li>
+ '<strong><code>type|T</code></strong>=<em>MIME-type</em>'
+ (force MIME <strong>t</strong>ype)<br>
+ Force the MIME-type of the target file to be
+ <em>MIME-type</em>. This can be used to
+ set up the content-type based on some conditions.
+ For example, the following snippet allows <code>.php</code> files to
+ be <em>displayed</em> by <code>mod_php</code> if they are called with
+ the <code>.phps</code> extension:
+ <div class="codeBox"><pre><code>RewriteRule ^(.+\.php)s$ $1 [T=application/x-httpd-php-source]</code></pre></div>
+ </li>
+ </ul>
+
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/security-howto.html b/web/tomcat/webapps/docs/security-howto.html
new file mode 100644
index 0000000..9d61b9e
--- /dev/null
+++ b/web/tomcat/webapps/docs/security-howto.html
@@ -0,0 +1,523 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Security Considerations</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Security Considerations</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Non-Tomcat_settings">Non-Tomcat settings</a><ol><li><a href="#JMX">JMX</a></li></ol></li><li><a href="#Default_web_applications">Default web applications</a><ol><li><a href="#Default_web_applications/General">General</a></li><li><a href="#ROOT">ROOT</a></li><li><a href="#Documentation">Documentation</a></li><li><a href="#Examples">Examples</a></li><li><a href="#Default_web_applications/Manager">Manager</a></li><li><a href="#Host_Manager">Host Manager</a></li><li><a href="#Securing_Management_Applications">Securing Management Applications</a></li></ol></li><li><a href="#Security_manager">Security manager</a></li><li><a href="#server.xml">server.xml</a><ol><li><a href="#server.xml/General">General</a></li><li><a href="#Server">Server</a></li><li><a href="#Listeners">Listeners</a></li><li><a href="#Connectors">Connectors</a></li><li><a href="#Host">Host</a></li><li><a href="#Context">Context</a></li><li><a href="#Valves">Valves</a></li><li><a href="#Realms">Realms</a></li><li><a href="#server.xml/Manager">Manager</a></li><li><a href="#Cluster">Cluster</a></li></ol></li><li><a href="#System_Properties">System Properties</a></li><li><a href="#web.xml">web.xml</a></li><li><a href="#General">General</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>Tomcat is configured to be reasonably secure for most use cases by
+ default. Some environments may require more, or less, secure configurations.
+ This page is to provide a single point of reference for configuration
+ options that may impact security and to offer some commentary on the
+ expected impact of changing those options. The intention is to provide a
+ list of configuration options that should be considered when assessing the
+ security of a Tomcat installation.</p>
+
+ <p><strong>Note</strong>: Reading this page is not a substitute for reading
+ and understanding the detailed configuration documentation. Fuller
+ descriptions of these attributes may be found in the relevant documentation
+ pages.</p>
+ </div><h3 id="Non-Tomcat_settings">Non-Tomcat settings</h3><div class="text">
+ <p>Tomcat configuration should not be the only line of defense. The other
+ components in the system (operating system, network, database, etc.) should
+ also be secured.</p>
+ <p>Tomcat should not be run under the root user. Create a dedicated user for
+ the Tomcat process and provide that user with the minimum necessary
+ permissions for the operating system. For example, it should not be possible
+ to log on remotely using the Tomcat user.</p>
+ <p>File permissions should also be suitably restricted. In the
+ <code>.tar.gz</code> distribution, files and directories are not world
+ readable and the group does not have write access. On Unix like operating
+ systems, Tomcat runs with a default umask of <code>0027</code> to maintain
+ these permissions for files created while Tomcat is running (e.g. log files,
+ expanded WARs, etc.).</p>
+ <p>Taking the Tomcat instances at the ASF as an example (where
+ auto-deployment is disabled and web applications are deployed as exploded
+ directories), the standard configuration is to have all Tomcat files owned
+ by root with group Tomcat and whilst owner has read/write privileges, group
+ only has read and world has no permissions. The exceptions are the logs,
+ temp and work directory that are owned by the Tomcat user rather than root.
+ This means that even if an attacker compromises the Tomcat process, they
+ can't change the Tomcat configuration, deploy new web applications or
+ modify existing web applications. The Tomcat process runs with a umask of
+ 007 to maintain these permissions.</p>
+ <p>At the network level, consider using a firewall to limit both incoming
+ and outgoing connections to only those connections you expect to be
+ present.</p>
+
+ <div class="subsection"><h4 id="JMX">JMX</h4><div class="text">
+ <p>The security of the JMX connection is dependent on the implementation
+ provided by the JRE and therefore falls outside the control of Tomcat.</p>
+
+ <p>Typically, access control is very limited (either read-only to
+ everything or read-write to everything). Tomcat exposes a large amount
+ of internal information and control via JMX to aid debugging, monitoring
+ and management. Given the limited access control available, JMX access
+ should be treated as equivalent to local root/admin access and restricted
+ accordingly.</p>
+
+ <p>The JMX access control provided by most (all?) JRE vendors does not
+ log failed authentication attempts, nor does it provide an account
+ lock-out feature after repeated failed authentications. This makes a
+ brute force attack easy to mount and difficult to detect.</p>
+
+ <p>Given all of the above, care should be taken to ensure that, if used,
+ the JMX interface is appropriately secured. Options you may wish to
+ consider to secure the JMX interface include:</p>
+
+ <ul>
+ <li>configuring a strong password for all JMX users;</li>
+ <li>binding the JMX listener only to an internal network;</li>
+ <li>limiting network access to the JMX port to trusted clients; and</li>
+ <li>providing an application specific health page for use by external
+ monitoring systems.</li>
+ </ul>
+ </div></div>
+
+ </div><h3 id="Default_web_applications">Default web applications</h3><div class="text">
+
+ <div class="subsection"><h4 id="Default_web_applications/General">General</h4><div class="text">
+ <p>Tomcat ships with a number of web applications that are enabled by
+ default. Vulnerabilities have been discovered in these applications in the
+ past. Applications that are not required should be removed so the system
+ will not be at risk if another vulnerability is discovered.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="ROOT">ROOT</h4><div class="text">
+ <p>The ROOT web application presents a very low security risk but it does
+ include the version of Tomcat that is being used. The ROOT web application
+ should normally be removed from a publicly accessible Tomcat instance, not
+ for security reasons, but so that a more appropriate default page is shown
+ to users.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Documentation">Documentation</h4><div class="text">
+ <p>The documentation web application presents a very low security risk but
+ it does identify the version of Tomcat that is being used. It should
+ normally be removed from a publicly accessible Tomcat instance.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Examples">Examples</h4><div class="text">
+ <p>The examples web application should always be removed from any security
+ sensitive installation. While the examples web application does not
+ contain any known vulnerabilities, it is known to contain features
+ (particularly the cookie examples that display the contents of all
+ received and allow new cookies to be set) that may be used by an attacker
+ in conjunction with a vulnerability in another application deployed on the
+ Tomcat instance to obtain additional information that would otherwise be
+ unavailable.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Default_web_applications/Manager">Manager</h4><div class="text">
+ <p>The Manager application allows the remote deployment of web
+ applications and is frequently targeted by attackers due to the widespread
+ use of weak passwords and publicly accessible Tomcat instances with the
+ Manager application enabled. The Manager application is not accessible by
+ default as no users are configured with the necessary access. If the
+ Manager application is enabled then guidance in the section
+ <strong>Securing Management Applications</strong> section should be
+ followed.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Host_Manager">Host Manager</h4><div class="text">
+ <p>The Host Manager application allows the creation and management of
+ virtual hosts - including the enabling of the Manager application for a
+ virtual host. The Host Manager application is not accessible by default
+ as no users are configured with the necessary access. If the Host Manager
+ application is enabled then guidance in the section <strong>Securing
+ Management Applications</strong> section should be followed.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Securing_Management_Applications">Securing Management Applications</h4><div class="text">
+ <p>When deploying a web application that provides management functions for
+ the Tomcat instance, the following guidelines should be followed:</p>
+ <ul>
+ <li>Ensure that any users permitted to access the management application
+ have strong passwords.</li>
+ <li>Do not remove the use of the <a href="config/realm.html#LockOut_Realm_-_org.apache.catalina.realm.LockOutRealm">LockOutRealm</a>
+ which prevents brute force attacks against user passwords.</li>
+ <li>Configure the <a href="config/valve.html#Remote_Address_Valve">RemoteAddrValve</a>
+ in the <a href="config/context.html">context.xml</a> file for the
+ management application which limits access to localhost by default.
+ If remote access is required, limit it to specific IP addresses using
+ this valve.</li>
+ </ul>
+ </div></div>
+ </div><h3 id="Security_manager">Security manager</h3><div class="text">
+ <p>Enabling the security manager causes web applications to be run in a
+ sandbox, significantly limiting a web application's ability to perform
+ malicious actions such as calling System.exit(), establishing network
+ connections or accessing the file system outside of the web application's
+ root and temporary directories. However, it should be noted that there are
+ some malicious actions, such as triggering high CPU consumption via an
+ infinite loop, that the security manager cannot prevent.</p>
+
+ <p>Enabling the security manager is usually done to limit the potential
+ impact, should an attacker find a way to compromise a trusted web
+ application . A security manager may also be used to reduce the risks of
+ running untrusted web applications (e.g. in hosting environments) but it
+ should be noted that the security manager only reduces the risks of
+ running untrusted web applications, it does not eliminate them. If running
+ multiple untrusted web applications, it is recommended that each web
+ application is deployed to a separate Tomcat instance (and ideally separate
+ hosts) to reduce the ability of a malicious web application impacting the
+ availability of other applications.</p>
+
+ <p>Tomcat is tested with the security manager enabled; but the majority of
+ Tomcat users do not run with a security manager, so Tomcat is not as well
+ user-tested in this configuration. There have been, and continue to be,
+ bugs reported that are triggered by running under a security manager.</p>
+
+ <p>The restrictions imposed by a security manager are likely to break most
+ applications if the security manager is enabled. The security manager should
+ not be used without extensive testing. Ideally, the use of a security
+ manager should be introduced at the start of the development cycle as it can
+ be time-consuming to track down and fix issues caused by enabling a security
+ manager for a mature application.</p>
+
+ <p>Enabling the security manager changes the defaults for the following
+ settings:</p>
+ <ul>
+ <li>The default value for the <strong>deployXML</strong> attribute of the
+ <strong>Host</strong> element is changed to <code>false</code>.</li>
+ </ul>
+ </div><h3 id="server.xml">server.xml</h3><div class="text">
+ <div class="subsection"><h4 id="server.xml/General">General</h4><div class="text">
+ <p>The default server.xml contains a large number of comments, including
+ some example component definitions that are commented out. Removing these
+ comments makes it considerably easier to read and comprehend
+ server.xml.</p>
+ <p>If a component type is not listed, then there are no settings for that
+ type that directly impact security.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Server">Server</h4><div class="text">
+ <p>Setting the <strong>port</strong> attribute to <code>-1</code> disables
+ the shutdown port.</p>
+ <p>If the shutdown port is not disabled, a strong password should be
+ configured for <strong>shutdown</strong>.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Listeners">Listeners</h4><div class="text">
+ <p>The APR Lifecycle Listener is not stable if compiled on Solaris using
+ gcc. If using the APR/native connector on Solaris, compile it with the
+ Sun Studio compiler.</p>
+ <p>The JNI Library Loading Listener may be used to load native code. It should
+ only be used to load trusted libraries.</p>
+ <p>The Security Lifecycle Listener should be enabled and configured as appropriate.
+ </p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Connectors">Connectors</h4><div class="text">
+ <p>By default, a non-TLS, HTTP/1.1 connector is configured on port 8080.
+ Connectors that will not be used should be removed from server.xml.</p>
+
+ <p>AJP Connectors should only be used on trusted networks or be
+ appropriately secured with a suitable <code>secret</code> attribute.</p>
+
+ <p>AJP Connectors block forwarded requests with unknown request
+ attributes. Known safe and/or expected attributes may be allowed by
+ configuration an appropriate regular expression for the
+ <code>allowedRequestAttributesPattern</code> attribute.</p>
+
+ <p>The <strong>address</strong> attribute may be used to control which IP
+ address a connector listens on for connections. By default, a connector
+ listens on all configured IP addresses.</p>
+
+ <p>The <strong>allowTrace</strong> attribute may be used to enable TRACE
+ requests which can be useful for debugging. Due to the way some browsers
+ handle the response from a TRACE request (which exposes the browser to an
+ XSS attack), support for TRACE requests is disabled by default.</p>
+
+ <p>The <strong>discardFacades</strong> attribute set to <code>true</code>
+ will cause a new facade object to be created for each request. This
+ reduces the chances of a bug in an application exposing data from one
+ request to another.</p>
+
+ <p>The <strong>encodedSolidusHandling</strong> attribute allows
+ non-standard parsing of the request URI. Setting this attribute to a
+ non-default value when behind a reverse proxy may enable an attacker to
+ bypass any security constraints enforced by the proxy.</p>
+
+ <p>The <strong>maxPostSize</strong> attribute controls the maximum size
+ of a POST request that will be parsed for parameters. The parameters are
+ cached for the duration of the request so this is limited to 2MB by
+ default to reduce exposure to a DOS attack.</p>
+
+ <p>The <strong>maxSavePostSize</strong> attribute controls the saving of
+ POST requests during FORM and CLIENT-CERT authentication. The parameters
+ are cached for the duration of the authentication (which may be many
+ minutes) so this is limited to 4KB by default to reduce exposure to a DOS
+ attack.</p>
+
+ <p>The <strong>maxParameterCount</strong> attribute controls the
+ maximum number of parameter and value pairs (GET plus POST) that can
+ be parsed and stored in the request. Excessive parameters are ignored.
+ If you want to reject such requests, configure a
+ <a href="config/filter.html">FailedRequestFilter</a>.</p>
+
+ <p>The <strong>xpoweredBy</strong> attribute controls whether or not the
+ X-Powered-By HTTP header is sent with each request. If sent, the value of
+ the header contains the Servlet and JSP specification versions, the full
+ Tomcat version (e.g. Apache Tomcat/8.5), the name of
+ the JVM vendor and
+ the version of the JVM. This header is disabled by default. This header
+ can provide useful information to both legitimate clients and attackers.
+ </p>
+
+ <p>The <strong>server</strong> attribute controls the value of the Server
+ HTTP header. The default value of this header for Tomcat 4.1.x to
+ 8.0.x is Apache-Coyote/1.1. From 8.5.x onwards this header is not set by
+ default. This header can provide limited information to both legitimate
+ clients and attackers.</p>
+
+ <p>The <strong>SSLEnabled</strong>, <strong>scheme</strong> and
+ <strong>secure</strong> attributes may all be independently set. These are
+ normally used when Tomcat is located behind a reverse proxy and the proxy
+ is connecting to Tomcat via HTTP or HTTPS. They allow Tomcat to see the
+ SSL attributes of the connections between the client and the proxy rather
+ than the proxy and Tomcat. For example, the client may connect to the
+ proxy over HTTPS but the proxy connects to Tomcat using HTTP. If it is
+ necessary for Tomcat to be able to distinguish between secure and
+ non-secure connections received by a proxy, the proxy must use separate
+ connectors to pass secure and non-secure requests to Tomcat. If the
+ proxy uses AJP then the SSL attributes of the client connection are
+ passed via the AJP protocol and separate connectors are not needed.</p>
+
+ <p>The <strong>tomcatAuthentication</strong> and
+ <strong>tomcatAuthorization</strong> attributes are used with the
+ AJP connectors to determine if Tomcat should handle all authentication and
+ authorisation or if authentication should be delegated to the reverse
+ proxy (the authenticated user name is passed to Tomcat as part of the AJP
+ protocol) with the option for Tomcat to still perform authorization.</p>
+
+ <p>The <strong>requiredSecret</strong> attribute in AJP connectors
+ configures shared secret between Tomcat and reverse proxy in front of
+ Tomcat. It is used to prevent unauthorized connections over AJP protocol.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Host">Host</h4><div class="text">
+ <p>The host element controls deployment. Automatic deployment allows for
+ simpler management but also makes it easier for an attacker to deploy a
+ malicious application. Automatic deployment is controlled by the
+ <strong>autoDeploy</strong> and <strong>deployOnStartup</strong>
+ attributes. If both are <code>false</code>, only Contexts defined in
+ server.xml will be deployed and any changes will require a Tomcat restart.
+ </p>
+
+ <p>In a hosted environment where web applications may not be trusted, set
+ the <strong>deployXML</strong> attribute to <code>false</code> to ignore
+ any context.xml packaged with the web application that may try to assign
+ increased privileges to the web application. Note that if the security
+ manager is enabled that the <strong>deployXML</strong> attribute will
+ default to <code>false</code>.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Context">Context</h4><div class="text">
+ <p>This applies to <a href="config/context.html">Context</a>
+ elements in all places where they can be defined:
+ <code>server.xml</code> file,
+ default <code>context.xml</code> file,
+ per-host <code>context.xml.default</code> file,
+ web application context file in per-host configuration directory
+ or inside the web application.</p>
+
+ <p>The <strong>crossContext</strong> attribute controls if a context is
+ allowed to access the resources of another context. It is
+ <code>false</code> by default and should only be changed for trusted web
+ applications.</p>
+
+ <p>The <strong>privileged</strong> attribute controls if a context is
+ allowed to use container provided servlets like the Manager servlet. It is
+ <code>false</code> by default and should only be changed for trusted web
+ applications.</p>
+
+ <p>The <strong>allowLinking</strong> attribute of a nested
+ <a href="config/resources.html">Resources</a> element controls if a context
+ is allowed to use linked files. If enabled and the context is undeployed,
+ the links will be followed when deleting the context resources. Changing
+ this setting from the default of <code>false</code> on case insensitive
+ operating systems (this includes Windows) will disable a number of
+ security measures and allow, among other things, direct access to the
+ WEB-INF directory.</p>
+
+ <p>The <strong>sessionCookiePathUsesTrailingSlash</strong> can be used to
+ work around a bug in a number of browsers (Internet Explorer, Safari and
+ Edge) to prevent session cookies being exposed across applications when
+ applications share a common path prefix. However, enabling this option
+ can create problems for applications with Servlets mapped to
+ <code>/*</code>. It should also be noted the RFC6265 section 8.5 makes it
+ clear that different paths should not be considered sufficient to isolate
+ cookies from other applications.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Valves">Valves</h4><div class="text">
+ <p>It is strongly recommended that an AccessLogValve is configured. The
+ default Tomcat configuration includes an AccessLogValve. These are
+ normally configured per host but may also be configured per engine or per
+ context as required.</p>
+
+ <p>Any administrative application should be protected by a
+ RemoteAddrValve (this Valve is also available as a Filter).
+ The <strong>allow</strong> attribute should be used to limit access to a
+ set of known trusted hosts.</p>
+
+ <p>The default ErrorReportValve includes the Tomcat version number in the
+ response sent to clients. To avoid this, custom error handling can be
+ configured within each web application. Alternatively, you can explicitly
+ configure an <a href="config/valve.html">ErrorReportValve</a> and set its
+ <strong>showServerInfo</strong> attribute to <code>false</code>.
+ Alternatively, the version number can be changed by creating the file
+ CATALINA_BASE/lib/org/apache/catalina/util/ServerInfo.properties with
+ content as follows:</p>
+ <div class="codeBox"><pre><code>server.info=Apache Tomcat/8.5.x</code></pre></div>
+ <p>Modify the values as required. Note that this will also change the version
+ number reported in some of the management tools and may make it harder to
+ determine the real version installed. The CATALINA_HOME/bin/version.bat|sh
+ script will still report the correct version number.</p>
+
+ <p>The default ErrorReportValve can display stack traces and/or JSP
+ source code to clients when an error occurs. To avoid this, custom error
+ handling can be configured within each web application. Alternatively, you
+ can explicitly configure an <a href="config/valve.html">ErrorReportValve</a>
+ and set its <strong>showReport</strong> attribute to <code>false</code>.</p>
+
+ <p>The RewriteValve uses regular expressions and poorly formed regex
+ patterns may be vulnerable to "catastrophic backtracking" or "ReDoS". See
+ <a href="rewrite.html">Rewrite docs</a> for more details.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Realms">Realms</h4><div class="text">
+ <p>The MemoryRealm is not intended for production use as any changes to
+ tomcat-users.xml require a restart of Tomcat to take effect.</p>
+
+ <p>The JDBCRealm is not recommended for production use as it is single
+ threaded for all authentication and authorization options. Use the
+ DataSourceRealm instead.</p>
+
+ <p>The UserDatabaseRealm is not intended for large-scale installations. It
+ is intended for small-scale, relatively static environments.</p>
+
+ <p>The JAASRealm is not widely used and therefore the code is not as
+ mature as the other realms. Additional testing is recommended before using
+ this realm.</p>
+
+ <p>By default, the realms do not implement any form of account lock-out.
+ This means that brute force attacks can be successful. To prevent a brute
+ force attack, the chosen realm should be wrapped in a LockOutRealm.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="server.xml/Manager">Manager</h4><div class="text">
+ <p>The manager component is used to generate session IDs.</p>
+
+ <p>The class used to generate random session IDs may be changed with
+ the <strong>randomClass</strong> attribute.</p>
+
+ <p>The length of the session ID may be changed with the
+ <strong>sessionIdLength</strong> attribute.</p>
+
+ <p>The <strong>persistAuthentication</strong> controls whether the
+ authenticated Principal associated with the session (if any) is included
+ when the session is persisted during a restart or to a Store.</p>
+
+ <p>When using the <strong>JDBCStore</strong>, the session store should be
+ secured (dedicated credentials, appropriate permissions) such that only
+ the <strong>JDBCStore</strong> is able to access the persisted session
+ data. In particular, the <strong>JDBCStore</strong> should not be
+ accessible via any credentials available to a web application.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Cluster">Cluster</h4><div class="text">
+ <p>The cluster implementation is written on the basis that a secure,
+ trusted network is used for all of the cluster related network traffic. It
+ is not safe to run a cluster on a insecure, untrusted network.</p>
+
+ <p>If you are operating on an untrusted network or would prefer to
+ exercise an over-abundance of caution, you can use the
+ <a href="config/cluster-interceptor.html#org.apache.catalina.tribes.group.interceptors.EncryptInterceptor_Attributes">EncryptInterceptor</a>
+ to encrypt traffic between nodes.</p>
+ </div></div>
+ </div><h3 id="System_Properties">System Properties</h3><div class="text">
+ <p>The <strong>
+ org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH</strong> and
+ <strong>org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH</strong>
+ system properties allow non-standard parsing of the request URI. Using
+ these options when behind a reverse proxy may enable an attacker to bypass
+ any security constraints enforced by the proxy.</p>
+
+ <p>The <strong>
+ org.apache.catalina.connector.Response.ENFORCE_ENCODING_IN_GET_WRITER
+ </strong> system property has security implications if disabled. Many user
+ agents, in breach of RFC2616, try to guess the character encoding of text
+ media types when the specification-mandated default of ISO-8859-1 should be
+ used. Some browsers will interpret as UTF-7 a response containing characters
+ that are safe for ISO-8859-1 but trigger an XSS vulnerability if interpreted
+ as UTF-7.</p>
+ </div><h3 id="web.xml">web.xml</h3><div class="text">
+ <p>This applies to the default <code>conf/web.xml</code> file and
+ <code>WEB-INF/web.xml</code> files in web applications if they define
+ the components mentioned here.</p>
+
+ <p>The <a href="default-servlet.html">DefaultServlet</a> is configured
+ with <strong>readonly</strong> set to
+ <code>true</code>. Changing this to <code>false</code> allows clients to
+ delete or modify static resources on the server and to upload new
+ resources. This should not normally be changed without requiring
+ authentication.</p>
+
+ <p>The DefaultServlet is configured with <strong>listings</strong> set to
+ <code>false</code>. This isn't because allowing directory listings is
+ considered unsafe but because generating listings of directories with
+ thousands of files can consume significant CPU leading to a DOS attack.
+ </p>
+
+ <p>The DefaultServlet is configured with <strong>showServerInfo</strong>
+ set to <code>true</code>. When the directory listings is enabled the Tomcat
+ version number is included in the response sent to clients. To avoid this,
+ you can explicitly configure a DefaultServlet and set its
+ <strong>showServerInfo</strong> attribute to false.
+ Alternatively, the version number can be changed by creating the file
+ CATALINA_BASE/lib/org/apache/catalina/util/ServerInfo.properties with
+ content as follows:</p>
+ <div class="codeBox"><pre><code>server.info=Apache Tomcat/8.5.x</code></pre></div>
+ <p>Modify the values as required. Note that this will also change the version
+ number reported in some of the management tools and may make it harder to
+ determine the real version installed. The CATALINA_HOME/bin/version.bat|sh
+ script will still report the correct version number.
+ </p>
+
+ <p>The CGI Servlet is disabled by default. If enabled, the debug
+ initialisation parameter should not be set to <code>10</code> or higher on a
+ production system because the debug page is not secure.</p>
+
+ <p>When using the CGI Servlet on Windows with
+ <code>enableCmdLineArguments</code> enabled, review the setting of
+ <code>cmdLineArgumentsDecoded</code> carefully and ensure that it is
+ appropriate for your environment. The default value is secure. Insecure
+ configurations may expose the server to remote code execution. Further
+ information on the potential risks and mitigations may be found by
+ following the links in the <a href="cgi-howto.html">CGI How To</a>.</p>
+
+ <p><a href="config/filter.html">FailedRequestFilter</a>
+ can be configured and used to reject requests that had errors during
+ request parameter parsing. Without the filter the default behaviour is
+ to ignore invalid or excessive parameters.</p>
+
+ <p><a href="config/filter.html">HttpHeaderSecurityFilter</a> can be
+ used to add headers to responses to improve security. If clients access
+ Tomcat directly, then you probably want to enable this filter and all the
+ headers it sets unless your application is already setting them. If Tomcat
+ is accessed via a reverse proxy, then the configuration of this filter needs
+ to be co-ordinated with any headers that the reverse proxy sets.</p>
+ </div><h3 id="General">General</h3><div class="text">
+ <p>BASIC and FORM authentication pass user names and passwords in clear
+ text. Web applications using these authentication mechanisms with clients
+ connecting over untrusted networks should use SSL.</p>
+
+ <p>The session cookie for a session with an authenticated user are nearly
+ as useful as the user's password to an attacker and in nearly all
+ circumstances should be afforded the same level of protection as the
+ password itself. This usually means authenticating over SSL and continuing
+ to use SSL until the session ends.</p>
+ </div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/security-manager-howto.html b/web/tomcat/webapps/docs/security-manager-howto.html
new file mode 100644
index 0000000..9f560c9
--- /dev/null
+++ b/web/tomcat/webapps/docs/security-manager-howto.html
@@ -0,0 +1,469 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Security Manager How-To</title><meta name="author" content="Glenn Nielsen"><meta name="author" content="Jean-Francois Arcand"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Security Manager How-To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Background">Background</a></li><li><a href="#Permissions">Permissions</a><ol><li><a href="#Standard_Permissions">Standard Permissions</a></li></ol></li><li><a href="#Configuring_Tomcat_With_A_SecurityManager">Configuring Tomcat With A SecurityManager</a><ol><li><a href="#Permissions_for_packed_WAR_files">Permissions for packed WAR files</a></li></ol></li><li><a href="#Configuring_Package_Protection_in_Tomcat">Configuring Package Protection in Tomcat</a></li><li><a href="#Troubleshooting">Troubleshooting</a></li></ul>
+</div><h3 id="Background">Background</h3><div class="text">
+
+ <p>The Java <strong>SecurityManager</strong> is what allows a web browser
+ to run an applet in its own sandbox to prevent untrusted code from
+ accessing files on the local file system, connecting to a host other
+ than the one the applet was loaded from, and so on. In the same way
+ the SecurityManager protects you from an untrusted applet running in
+ your browser, use of a SecurityManager while running Tomcat can protect
+ your server from trojan servlets, JSPs, JSP beans, and tag libraries.
+ Or even inadvertent mistakes.</p>
+
+ <p>Imagine if someone who is authorized to publish JSPs on your site
+ inadvertently included the following in their JSP:</p>
+<div class="codeBox"><pre><code><% System.exit(1); %></code></pre></div>
+
+ <p>Every time this JSP was executed by Tomcat, Tomcat would exit.
+ Using the Java SecurityManager is just one more line of defense a
+ system administrator can use to keep the server secure and reliable.</p>
+
+ <p><strong>WARNING</strong> - A security audit
+ have been conducted using the Tomcat codebase. Most of the critical
+ package have been protected and a new security package protection mechanism
+ has been implemented. Still, make sure that you are satisfied with your SecurityManager
+ configuration before allowing untrusted users to publish web applications,
+ JSPs, servlets, beans, or tag libraries. <strong>However, running with a
+ SecurityManager is definitely better than running without one.</strong></p>
+
+</div><h3 id="Permissions">Permissions</h3><div class="text">
+
+ <p>Permission classes are used to define what Permissions a class loaded
+ by Tomcat will have. There are a number of Permission classes that are
+ a standard part of the JDK, and you can create your own Permission class
+ for use in your own web applications. Both techniques are used in
+ Tomcat.</p>
+
+
+ <div class="subsection"><h4 id="Standard_Permissions">Standard Permissions</h4><div class="text">
+
+ <p>This is just a short summary of the standard system SecurityManager
+ Permission classes applicable to Tomcat. See
+ <a href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/">
+ http://docs.oracle.com/javase/7/docs/technotes/guides/security/</a>
+ for more information.</p>
+
+ <ul>
+ <li><strong>java.util.PropertyPermission</strong> - Controls read/write
+ access to JVM properties such as <code>java.home</code>.</li>
+ <li><strong>java.lang.RuntimePermission</strong> - Controls use of
+ some System/Runtime functions like <code>exit()</code> and
+ <code>exec()</code>. Also control the package access/definition.</li>
+ <li><strong>java.io.FilePermission</strong> - Controls read/write/execute
+ access to files and directories.</li>
+ <li><strong>java.net.SocketPermission</strong> - Controls use of
+ network sockets.</li>
+ <li><strong>java.net.NetPermission</strong> - Controls use of
+ multicast network connections.</li>
+ <li><strong>java.lang.reflect.ReflectPermission</strong> - Controls
+ use of reflection to do class introspection.</li>
+ <li><strong>java.security.SecurityPermission</strong> - Controls access
+ to Security methods.</li>
+ <li><strong>java.security.AllPermission</strong> - Allows access to all
+ permissions, just as if you were running Tomcat without a
+ SecurityManager.</li>
+ </ul>
+
+ </div></div>
+
+</div><h3 id="Configuring_Tomcat_With_A_SecurityManager">Configuring Tomcat With A SecurityManager</h3><div class="text">
+
+ <h3>Policy File Format</h3>
+
+ <p>The security policies implemented by the Java SecurityManager are
+ configured in the <code>$CATALINA_BASE/conf/catalina.policy</code> file.
+ This file completely replaces the <code>java.policy</code> file present
+ in your JDK system directories. The <code>catalina.policy</code> file
+ can be edited by hand, or you can use the
+ <a href="http://docs.oracle.com/javase/6/docs/technotes/guides/security/PolicyGuide.html">policytool</a>
+ application that comes with Java 1.2 or later.</p>
+
+ <p>Entries in the <code>catalina.policy</code> file use the standard
+ <code>java.policy</code> file format, as follows:</p>
+<div class="codeBox"><pre><code>// Example policy file entry
+
+grant [signedBy <signer>,] [codeBase <code source>] {
+ permission <class> [<name> [, <action list>]];
+};</code></pre></div>
+
+ <p>The <strong>signedBy</strong> and <strong>codeBase</strong> entries are
+ optional when granting permissions. Comment lines begin with "//" and
+ end at the end of the current line. The <code>codeBase</code> is in the
+ form of a URL, and for a file URL can use the <code>${java.home}</code>
+ and <code>${catalina.home}</code> properties (which are expanded out to
+ the directory paths defined for them by the <code>JAVA_HOME</code>,
+ <code>CATALINA_HOME</code> and <code>CATALINA_BASE</code> environment
+ variables).</p>
+
+ <h3>The Default Policy File</h3>
+
+ <p>The default <code>$CATALINA_BASE/conf/catalina.policy</code> file
+ looks like this:</p>
+
+
+<div class="codeBox"><pre><code>// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// ============================================================================
+// catalina.policy - Security Policy Permissions for Tomcat
+//
+// This file contains a default set of security policies to be enforced (by the
+// JVM) when Catalina is executed with the "-security" option. In addition
+// to the permissions granted here, the following additional permissions are
+// granted to each web application:
+//
+// * Read access to the web application's document root directory
+// * Read, write and delete access to the web application's working directory
+// ============================================================================
+
+
+// ========== SYSTEM CODE PERMISSIONS =========================================
+
+
+// These permissions apply to javac
+grant codeBase "file:${java.home}/lib/-" {
+ permission java.security.AllPermission;
+};
+
+// These permissions apply to all shared system extensions
+grant codeBase "file:${java.home}/jre/lib/ext/-" {
+ permission java.security.AllPermission;
+};
+
+// These permissions apply to javac when ${java.home} points at $JAVA_HOME/jre
+grant codeBase "file:${java.home}/../lib/-" {
+ permission java.security.AllPermission;
+};
+
+// These permissions apply to all shared system extensions when
+// ${java.home} points at $JAVA_HOME/jre
+grant codeBase "file:${java.home}/lib/ext/-" {
+ permission java.security.AllPermission;
+};
+
+// This permission is required when using javac to compile JSPs on Java 9
+// onwards
+//grant codeBase "jrt:/jdk.compiler" {
+// permission java.security.AllPermission;
+//};
+
+
+// ========== CATALINA CODE PERMISSIONS =======================================
+
+// These permissions apply to the daemon code
+grant codeBase "file:${catalina.home}/bin/commons-daemon.jar" {
+ permission java.security.AllPermission;
+};
+
+// These permissions apply to the logging API
+// Note: If tomcat-juli.jar is in ${catalina.base} and not in ${catalina.home},
+// update this section accordingly.
+// grant codeBase "file:${catalina.base}/bin/tomcat-juli.jar" {..}
+grant codeBase "file:${catalina.home}/bin/tomcat-juli.jar" {
+ permission java.io.FilePermission
+ "${java.home}${file.separator}lib${file.separator}logging.properties", "read";
+
+ permission java.io.FilePermission
+ "${catalina.base}${file.separator}conf${file.separator}logging.properties", "read";
+ permission java.io.FilePermission
+ "${catalina.base}${file.separator}logs", "read, write";
+ permission java.io.FilePermission
+ "${catalina.base}${file.separator}logs${file.separator}*", "read, write, delete";
+
+ permission java.lang.RuntimePermission "shutdownHooks";
+ permission java.lang.RuntimePermission "getClassLoader";
+ permission java.lang.RuntimePermission "setContextClassLoader";
+
+ permission java.lang.management.ManagementPermission "monitor";
+
+ permission java.util.logging.LoggingPermission "control";
+
+ permission java.util.PropertyPermission "java.util.logging.config.class", "read";
+ permission java.util.PropertyPermission "java.util.logging.config.file", "read";
+ permission java.util.PropertyPermission "org.apache.juli.AsyncLoggerPollInterval", "read";
+ permission java.util.PropertyPermission "org.apache.juli.AsyncMaxRecordCount", "read";
+ permission java.util.PropertyPermission "org.apache.juli.AsyncOverflowDropType", "read";
+ permission java.util.PropertyPermission "org.apache.juli.ClassLoaderLogManager.debug", "read";
+ permission java.util.PropertyPermission "catalina.base", "read";
+
+ // Note: To enable per context logging configuration, permit read access to
+ // the appropriate file. Be sure that the logging configuration is
+ // secure before enabling such access.
+ // E.g. for the examples web application (uncomment and unwrap
+ // the following to be on a single line):
+ // permission java.io.FilePermission "${catalina.base}${file.separator}
+ // webapps${file.separator}examples${file.separator}WEB-INF
+ // ${file.separator}classes${file.separator}logging.properties", "read";
+};
+
+// These permissions apply to the server startup code
+grant codeBase "file:${catalina.home}/bin/bootstrap.jar" {
+ permission java.security.AllPermission;
+};
+
+// These permissions apply to the servlet API classes
+// and those that are shared across all class loaders
+// located in the "lib" directory
+grant codeBase "file:${catalina.home}/lib/-" {
+ permission java.security.AllPermission;
+};
+
+
+// If using a per instance lib directory, i.e. ${catalina.base}/lib,
+// then the following permission will need to be uncommented
+// grant codeBase "file:${catalina.base}/lib/-" {
+// permission java.security.AllPermission;
+// };
+
+
+// ========== WEB APPLICATION PERMISSIONS =====================================
+
+
+// These permissions are granted by default to all web applications
+// In addition, a web application will be given a read FilePermission
+// for all files and directories in its document root.
+grant {
+ // Required for JNDI lookup of named JDBC DataSource's and
+ // javamail named MimePart DataSource used to send mail
+ permission java.util.PropertyPermission "java.home", "read";
+ permission java.util.PropertyPermission "java.naming.*", "read";
+ permission java.util.PropertyPermission "javax.sql.*", "read";
+
+ // OS Specific properties to allow read access
+ permission java.util.PropertyPermission "os.name", "read";
+ permission java.util.PropertyPermission "os.version", "read";
+ permission java.util.PropertyPermission "os.arch", "read";
+ permission java.util.PropertyPermission "file.separator", "read";
+ permission java.util.PropertyPermission "path.separator", "read";
+ permission java.util.PropertyPermission "line.separator", "read";
+
+ // JVM properties to allow read access
+ permission java.util.PropertyPermission "java.version", "read";
+ permission java.util.PropertyPermission "java.vendor", "read";
+ permission java.util.PropertyPermission "java.vendor.url", "read";
+ permission java.util.PropertyPermission "java.class.version", "read";
+ permission java.util.PropertyPermission "java.specification.version", "read";
+ permission java.util.PropertyPermission "java.specification.vendor", "read";
+ permission java.util.PropertyPermission "java.specification.name", "read";
+
+ permission java.util.PropertyPermission "java.vm.specification.version", "read";
+ permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
+ permission java.util.PropertyPermission "java.vm.specification.name", "read";
+ permission java.util.PropertyPermission "java.vm.version", "read";
+ permission java.util.PropertyPermission "java.vm.vendor", "read";
+ permission java.util.PropertyPermission "java.vm.name", "read";
+
+ // Required for OpenJMX
+ permission java.lang.RuntimePermission "getAttribute";
+
+ // Allow read of JAXP compliant XML parser debug
+ permission java.util.PropertyPermission "jaxp.debug", "read";
+
+ // All JSPs need to be able to read this package
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat";
+
+ // Precompiled JSPs need access to these packages.
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.el";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.runtime";
+ permission java.lang.RuntimePermission
+ "accessClassInPackage.org.apache.jasper.runtime.*";
+
+ // Applications using WebSocket need to be able to access these packages
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.websocket";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.websocket.server";
+};
+
+
+// The Manager application needs access to the following packages to support the
+// session display functionality. It also requires the custom Tomcat
+// DeployXmlPermission to enable the use of META-INF/context.xml
+// These settings support the following configurations:
+// - default CATALINA_HOME == CATALINA_BASE
+// - CATALINA_HOME != CATALINA_BASE, per instance Manager in CATALINA_BASE
+// - CATALINA_HOME != CATALINA_BASE, shared Manager in CATALINA_HOME
+grant codeBase "file:${catalina.base}/webapps/manager/-" {
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.ha.session";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager.util";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.util";
+ permission org.apache.catalina.security.DeployXmlPermission "manager";
+};
+grant codeBase "file:${catalina.home}/webapps/manager/-" {
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.ha.session";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager.util";
+ permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.util";
+ permission org.apache.catalina.security.DeployXmlPermission "manager";
+};
+
+// The Host Manager application needs the custom Tomcat DeployXmlPermission to
+// enable the use of META-INF/context.xml
+// These settings support the following configurations:
+// - default CATALINA_HOME == CATALINA_BASE
+// - CATALINA_HOME != CATALINA_BASE, per instance Host Manager in CATALINA_BASE
+// - CATALINA_HOME != CATALINA_BASE, shared Host Manager in CATALINA_HOME
+grant codeBase "file:${catalina.base}/webapps/host-manager/-" {
+ permission org.apache.catalina.security.DeployXmlPermission "host-manager";
+};
+grant codeBase "file:${catalina.home}/webapps/host-manager/-" {
+ permission org.apache.catalina.security.DeployXmlPermission "host-manager";
+};
+
+
+// You can assign additional permissions to particular web applications by
+// adding additional "grant" entries here, based on the code base for that
+// application, /WEB-INF/classes/, or /WEB-INF/lib/ jar files.
+//
+// Different permissions can be granted to JSP pages, classes loaded from
+// the /WEB-INF/classes/ directory, all jar files in the /WEB-INF/lib/
+// directory, or even to individual jar files in the /WEB-INF/lib/ directory.
+//
+// For instance, assume that the standard "examples" application
+// included a JDBC driver that needed to establish a network connection to the
+// corresponding database and used the scrape taglib to get the weather from
+// the NOAA web server. You might create a "grant" entries like this:
+//
+// The permissions granted to the context root directory apply to JSP pages.
+// grant codeBase "file:${catalina.base}/webapps/examples/-" {
+// permission java.net.SocketPermission "dbhost.mycompany.com:5432", "connect";
+// permission java.net.SocketPermission "*.noaa.gov:80", "connect";
+// };
+//
+// The permissions granted to the context WEB-INF/classes directory
+// grant codeBase "file:${catalina.base}/webapps/examples/WEB-INF/classes/-" {
+// };
+//
+// The permission granted to your JDBC driver
+// grant codeBase "jar:file:${catalina.base}/webapps/examples/WEB-INF/lib/driver.jar!/-" {
+// permission java.net.SocketPermission "dbhost.mycompany.com:5432", "connect";
+// };
+// The permission granted to the scrape taglib
+// grant codeBase "jar:file:${catalina.base}/webapps/examples/WEB-INF/lib/scrape.jar!/-" {
+// permission java.net.SocketPermission "*.noaa.gov:80", "connect";
+// };
+
+// To grant permissions for web applications using packed WAR files, use the
+// Tomcat specific WAR url scheme.
+//
+// The permissions granted to the entire web application
+// grant codeBase "war:file:${catalina.base}/webapps/examples.war*/-" {
+// };
+//
+// The permissions granted to a specific JAR
+// grant codeBase "war:file:${catalina.base}/webapps/examples.war*/WEB-INF/lib/foo.jar" {
+// };
+</code></pre></div>
+
+ <h3>Starting Tomcat With A SecurityManager</h3>
+
+ <p>Once you have configured the <code>catalina.policy</code> file for use
+ with a SecurityManager, Tomcat can be started with a SecurityManager in
+ place by using the "-security" option:</p>
+<div class="codeBox"><pre><code>$CATALINA_HOME/bin/catalina.sh start -security (Unix)
+%CATALINA_HOME%\bin\catalina start -security (Windows)</code></pre></div>
+
+ <div class="subsection"><h4 id="Permissions_for_packed_WAR_files">Permissions for packed WAR files</h4><div class="text">
+
+ <p>When using packed WAR files, it is necessary to use Tomcat's custom war
+ URL protocol to assign permissions to web application code.</p>
+
+ <p>To assign permissions to the entire web application the entry in the
+ policy file would look like this:</p>
+
+<div class="codeBox"><pre><code>// Example policy file entry
+grant codeBase "war:file:${catalina.base}/webapps/examples.war*/-" {
+ ...
+};
+</code></pre></div>
+
+ <p>To assign permissions to a single JAR within the web application the
+ entry in the policy file would look like this:</p>
+
+<div class="codeBox"><pre><code>// Example policy file entry
+grant codeBase "war:file:${catalina.base}/webapps/examples.war*/WEB-INF/lib/foo.jar" {
+ ...
+};
+</code></pre></div>
+
+ </div></div>
+
+</div><h3 id="Configuring_Package_Protection_in_Tomcat">Configuring Package Protection in Tomcat</h3><div class="text">
+ <p>Starting with Tomcat 5, it is now possible to configure which Tomcat
+ internal package are protected against package definition and access. See
+ <a href="http://www.oracle.com/technetwork/java/seccodeguide-139067.html">
+ http://www.oracle.com/technetwork/java/seccodeguide-139067.html</a>
+ for more information.</p>
+
+
+ <p><strong>WARNING</strong>: Be aware that removing the default package protection
+ could possibly open a security hole</p>
+
+ <h3>The Default Properties File</h3>
+
+ <p>The default <code>$CATALINA_BASE/conf/catalina.properties</code> file
+ looks like this:</p>
+<div class="codeBox"><pre><code>#
+# List of comma-separated packages that start with or equal this string
+# will cause a security exception to be thrown when
+# passed to checkPackageAccess unless the
+# corresponding RuntimePermission ("accessClassInPackage."+package) has
+# been granted.
+package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,
+org.apache.jasper.
+#
+# List of comma-separated packages that start with or equal this string
+# will cause a security exception to be thrown when
+# passed to checkPackageDefinition unless the
+# corresponding RuntimePermission ("defineClassInPackage."+package) has
+# been granted.
+#
+# by default, no packages are restricted for definition, and none of
+# the class loaders supplied with the JDK call checkPackageDefinition.
+#
+package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote.,
+org.apache.tomcat.,org.apache.jasper.</code></pre></div>
+ <p>Once you have configured the <code>catalina.properties</code> file for use
+ with a SecurityManager, remember to re-start Tomcat.</p>
+</div><h3 id="Troubleshooting">Troubleshooting</h3><div class="text">
+
+ <p>If your web application attempts to execute an operation that is
+ prohibited by lack of a required Permission, it will throw an
+ <code>AccessControLException</code> or a <code>SecurityException</code>
+ when the SecurityManager detects the violation. Debugging the permission
+ that is missing can be challenging, and one option is to turn on debug
+ output of all security decisions that are made during execution. This
+ is done by setting a system property before starting Tomcat. The easiest
+ way to do this is via the <code>CATALINA_OPTS</code> environment variable.
+ Execute this command:</p>
+<div class="codeBox"><pre><code>export CATALINA_OPTS=-Djava.security.debug=all (Unix)
+set CATALINA_OPTS=-Djava.security.debug=all (Windows)</code></pre></div>
+
+ <p>before starting Tomcat.</p>
+
+ <p><strong>WARNING</strong> - This will generate <em>many megabytes</em>
+ of output! However, it can help you track down problems by searching
+ for the word "FAILED" and determining which permission was being checked
+ for. See the Java security documentation for more options that you can
+ specify here as well.</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/servletapi/index.html b/web/tomcat/webapps/docs/servletapi/index.html
new file mode 100644
index 0000000..e1c5695
--- /dev/null
+++ b/web/tomcat/webapps/docs/servletapi/index.html
@@ -0,0 +1,34 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8" />
+ <title>API docs</title>
+</head>
+
+<body>
+
+The Servlet Javadoc is not installed by default. Download and install
+the "fulldocs" package to get it.
+
+You can also access the javadoc online in the Tomcat
+<a href="https://tomcat.apache.org/tomcat-8.5-doc/">
+documentation bundle</a>.
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/docs/setup.html b/web/tomcat/webapps/docs/setup.html
new file mode 100644
index 0000000..6b0d661
--- /dev/null
+++ b/web/tomcat/webapps/docs/setup.html
@@ -0,0 +1,164 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Tomcat Setup</title><meta name="author" content="Remy Maucherat"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Tomcat Setup</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Windows">Windows</a></li><li><a href="#Unix_daemon">Unix daemon</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+ <p>
+ There are several ways to set up Tomcat for running on different
+ platforms. The main documentation for this is a file called
+ <a href="RUNNING.txt">RUNNING.txt</a>. We encourage you to refer to that
+ file if the information below does not answer some of your questions.
+ </p>
+ </div><h3 id="Windows">Windows</h3><div class="text">
+
+ <p>
+ Installing Tomcat on Windows can be done easily using the Windows
+ installer. Its interface and functionality is similar to other wizard
+ based installers, with only a few items of interest.
+ </p>
+
+
+ <ul>
+ <li><strong>Installation as a service</strong>: Tomcat will be
+ installed as a Windows service no matter what setting is selected.
+ Using the checkbox on the component page sets the service as "auto"
+ startup, so that Tomcat is automatically started when Windows
+ starts. For optimal security, the service should be run as a
+ separate user, with reduced permissions (see the Windows Services
+ administration tool and its documentation).</li>
+ <li><strong>Java location</strong>: The installer will provide a default
+ JRE to use to run the service. The installer uses the registry to
+ determine the base path of a Java 7 or later JRE,
+ including the JRE installed as part of the full JDK. When running on
+ a 64-bit operating system, the installer will first look for a
+ 64-bit JRE and only look for a 32-bit JRE if a 64-bit JRE is not
+ found. If a JRE cannot be found when running on a 64-bit operating
+ system, the installer will look for a 64-bit JDK. Finally, if a JRE
+ or JDK has not been found, the installer will try to use the
+ <code>JAVA_HOME</code> environment variable. It is not mandatory to
+ use the default JRE detected by the installer. Any installed Java
+ 7 or later JRE (32-bit or 64-bit) may be
+ used.</li>
+ <li><strong>Tray icon</strong>: When Tomcat is run as a service, there
+ will not be any tray icon present when Tomcat is running. Note that
+ when choosing to run Tomcat at the end of installation, the tray
+ icon will be used even if Tomcat was installed as a service.</li>
+ <li><strong>Defaults</strong>: The defaults used by the installer may be
+ overridden by use of the <code>/C=<config file></code> command
+ line argument. The configuration file uses the format
+ <code>name=value</code> with each pair on a separate line. The names
+ of the available configuration options are:
+ <ul>
+ <li>JavaHome</li>
+ <li>TomcatPortShutdown</li>
+ <li>TomcatPortHttp</li>
+ <li>TomcatMenuEntriesEnable</li>
+ <li>TomcatShortcutAllUsers</li>
+ <li>TomcatServiceDefaultName</li>
+ <li>TomcatServiceName</li>
+ <li>TomcatServiceFileName</li>
+ <li>TomcatServiceManagerFileName</li>
+ <li>TomcatAdminEnable</li>
+ <li>TomcatAdminUsername</li>
+ <li>TomcatAdminPassword</li>
+ <li>TomcatAdminRoles</li>
+ </ul>
+ By using <code>/C=...</code> along with <code>/S</code> and
+ <code>/D=</code> it is possible to perform fully configured
+ unattended installs of Apache Tomcat.
+ </li>
+ <li>Refer to the
+ <a href="windows-service-howto.html">Windows Service How-To</a>
+ for information on how to manage Tomcat as a Windows service.
+ </li>
+ </ul>
+
+
+ <p>The installer will create shortcuts allowing starting and configuring
+ Tomcat. It is important to note that the Tomcat administration web
+ application can only be used when Tomcat is running.</p>
+
+ </div><h3 id="Unix_daemon">Unix daemon</h3><div class="text">
+
+ <p>Tomcat can be run as a daemon using the jsvc tool from the
+ commons-daemon project. Source tarballs for jsvc are included with the
+ Tomcat binaries, and need to be compiled. Building jsvc requires
+ a C ANSI compiler (such as GCC), GNU Autoconf, and a JDK.</p>
+
+ <p>Before running the script, the <code>JAVA_HOME</code> environment
+ variable should be set to the base path of the JDK. Alternately, when
+ calling the <code>./configure</code> script, the path of the JDK may
+ be specified using the <code>--with-java</code> parameter, such as
+ <code>./configure --with-java=/usr/java</code>.</p>
+
+ <p>Using the following commands should result in a compiled jsvc binary,
+ located in the <code>$CATALINA_HOME/bin</code> folder. This assumes
+ that GNU TAR is used, and that <code>CATALINA_HOME</code> is an
+ environment variable pointing to the base path of the Tomcat
+ installation.</p>
+
+ <p>Please note that you should use the GNU make (gmake) instead of
+ the native BSD make on FreeBSD systems.</p>
+
+<div class="codeBox"><pre><code>cd $CATALINA_HOME/bin
+tar xvfz commons-daemon-native.tar.gz
+cd commons-daemon-1.1.x-native-src/unix
+./configure
+make
+cp jsvc ../..
+cd ../..</code></pre></div>
+
+ <p>Tomcat can then be run as a daemon using the following commands.</p>
+
+<div class="codeBox"><pre><code>CATALINA_BASE=$CATALINA_HOME
+cd $CATALINA_HOME
+./bin/jsvc \
+ -classpath $CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/tomcat-juli.jar \
+ -outfile $CATALINA_BASE/logs/catalina.out \
+ -errfile $CATALINA_BASE/logs/catalina.err \
+ -Dcatalina.home=$CATALINA_HOME \
+ -Dcatalina.base=$CATALINA_BASE \
+ -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
+ -Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties \
+ org.apache.catalina.startup.Bootstrap</code></pre></div>
+
+ <p>When running on Java 9 you will need to additionally specify the
+ following when starting jsvc to avoid warnings on shutdown.</p>
+<div class="codeBox"><pre><code>...
+--add-opens=java.base/java.lang=ALL-UNNAMED \
+--add-opens=java.base/java.io=ALL-UNNAMED \
+--add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED \
+...
+</code></pre></div>
+
+ <p>You may also need to specify <code>-jvm server</code> if the JVM defaults
+ to using a server VM rather than a client VM. This has been observed on
+ OSX.</p>
+
+ <p>jsvc has other useful parameters, such as <code>-user</code> which
+ causes it to switch to another user after the daemon initialization is
+ complete. This allows, for example, running Tomcat as a non privileged
+ user while still being able to use privileged ports. Note that if you
+ use this option and start Tomcat as root, you'll need to disable the
+ <code>org.apache.catalina.security.SecurityListener</code> check that
+ prevents Tomcat starting when running as root.</p>
+
+ <p><code>jsvc --help</code> will return the full jsvc usage
+ information. In particular, the <code>-debug</code> option is useful
+ to debug issues running jsvc.</p>
+
+ <p>The file <code>$CATALINA_HOME/bin/daemon.sh</code> can be used as a
+ template for starting Tomcat automatically at boot time from
+ <code>/etc/init.d</code> with jsvc.</p>
+
+ <p>Note that the Commons-Daemon JAR file must be on your runtime classpath
+ to run Tomcat in this manner. The Commons-Daemon JAR file is in the
+ Class-Path entry of the bootstrap.jar manifest, but if you get a
+ ClassNotFoundException or a NoClassDefFoundError for a Commons-Daemon
+ class, add the Commons-Daemon JAR to the -cp argument when launching
+ jsvc.</p>
+
+ </div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/ssi-howto.html b/web/tomcat/webapps/docs/ssi-howto.html
new file mode 100644
index 0000000..01fa75f
--- /dev/null
+++ b/web/tomcat/webapps/docs/ssi-howto.html
@@ -0,0 +1,398 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - SSI How To</title><meta name="author" content="Glenn L. Nielsen"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>SSI How To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Installation">Installation</a></li><li><a href="#Servlet_Configuration">Servlet Configuration</a></li><li><a href="#Filter_Configuration">Filter Configuration</a></li><li><a href="#Directives">Directives</a></li><li><a href="#Variables">Variables</a></li></ul>
+</div><h3 id="Introduction">Introduction</h3><div class="text">
+
+<p>SSI (Server Side Includes) are directives that are placed in HTML pages,
+and evaluated on the server while the pages are being served. They let you
+add dynamically generated content to an existing HTML page, without having
+to serve the entire page via a CGI program, or other dynamic technology.
+</p>
+
+<p>Within Tomcat SSI support can be added when using Tomcat as your
+HTTP server and you require SSI support. Typically this is done
+during development when you don't want to run a web server like Apache.</p>
+
+<p>Tomcat SSI support implements the same SSI directives as Apache. See the
+<a href="https://httpd.apache.org/docs/howto/ssi.html#basicssidirectives">
+Apache Introduction to SSI</a> for information on using SSI directives.</p>
+
+<p>SSI support is available as a servlet and as a filter. You should use one
+or the other to provide SSI support but not both.</p>
+
+<p>Servlet based SSI support is implemented using the class
+<code>org.apache.catalina.ssi.SSIServlet</code>. Traditionally, this servlet
+is mapped to the URL pattern "*.shtml".</p>
+
+<p>Filter based SSI support is implemented using the class
+<code>org.apache.catalina.ssi.SSIFilter</code>. Traditionally, this filter
+is mapped to the URL pattern "*.shtml", though it can be mapped to "*" as
+it will selectively enable/disable SSI processing based on mime types. The
+contentType init param allows you to apply SSI processing to JSP pages,
+JavaScript, or any other content you wish.</p>
+<p>By default SSI support is disabled in Tomcat.</p>
+</div><h3 id="Installation">Installation</h3><div class="text">
+
+<p><strong>CAUTION</strong> - SSI directives can be used to execute programs
+external to the Tomcat JVM. If you are using the Java SecurityManager this
+will bypass your security policy configuration in <code>catalina.policy.</code>
+</p>
+
+<p>To use the SSI servlet, remove the XML comments from around the SSI servlet
+and servlet-mapping configuration in
+<code>$CATALINA_BASE/conf/web.xml</code>.</p>
+
+<p>To use the SSI filter, remove the XML comments from around the SSI filter
+and filter-mapping configuration in
+<code>$CATALINA_BASE/conf/web.xml</code>.</p>
+
+<p>Only Contexts which are marked as privileged may use SSI features (see the
+privileged property of the Context element).</p>
+
+</div><h3 id="Servlet_Configuration">Servlet Configuration</h3><div class="text">
+
+<p>There are several servlet init parameters which can be used to
+configure the behaviour of the SSI servlet.</p>
+<ul>
+<li><strong>buffered</strong> - Should output from this servlet be buffered?
+(0=false, 1=true) Default 0 (false).</li>
+<li><strong>debug</strong> - Debugging detail level for messages logged
+by this servlet. Default 0.</li>
+<li><strong>expires</strong> - The number of seconds before a page with SSI
+directives will expire. Default behaviour is for all SSI directives to be
+evaluated for every request.</li>
+<li><strong>isVirtualWebappRelative</strong> - Should "virtual" SSI directive
+paths be interpreted as relative to the context root, instead of the server
+root? Default false.</li>
+<li><strong>inputEncoding</strong> - The encoding to be assumed for SSI
+resources if one cannot be determined from the resource itself. Default is
+the default platform encoding.</li>
+<li><strong>outputEncoding</strong> - The encoding to be used for the result
+of the SSI processing. Default is UTF-8.</li>
+<li><strong>allowExec</strong> - Is the exec command enabled? Default is
+false.</li>
+</ul>
+
+
+</div><h3 id="Filter_Configuration">Filter Configuration</h3><div class="text">
+
+<p>There are several filter init parameters which can be used to
+configure the behaviour of the SSI filter.</p>
+<ul>
+<li><strong>contentType</strong> - A regex pattern that must be matched before
+SSI processing is applied. When crafting your own pattern, don't forget that a
+mime content type may be followed by an optional character set in the form
+"mime/type; charset=set" that you must take into account. Default is
+"text/x-server-parsed-html(;.*)?".</li>
+<li><strong>debug</strong> - Debugging detail level for messages logged
+by this servlet. Default 0.</li>
+<li><strong>expires</strong> - The number of seconds before a page with SSI
+directives will expire. Default behaviour is for all SSI directives to be
+evaluated for every request.</li>
+<li><strong>isVirtualWebappRelative</strong> - Should "virtual" SSI directive
+paths be interpreted as relative to the context root, instead of the server
+root? Default false.</li>
+<li><strong>allowExec</strong> - Is the exec command enabled? Default is
+false.</li>
+</ul>
+
+
+</div><h3 id="Directives">Directives</h3><div class="text">
+<p>Server Side Includes are invoked by embedding SSI directives in an HTML document
+ whose type will be processed by the SSI servlet. The directives take the form of an HTML
+ comment. The directive is replaced by the results of interpreting it before sending the
+ page to the client. The general form of a directive is: </p>
+<p> <code><!--#directive [parm=value] --></code></p>
+<p>The directives are:</p>
+<ul>
+<li>
+<strong>config</strong> - <code><!--#config errmsg="Error occurred" sizefmt="abbrev"
+timefmt="%B %Y" --></code>
+Used to set SSI error message, the format of dates and file sizes processed by SSI.<br>
+All are optional but at least one must be used. The available options are as follows:
+<br>
+<strong>errmsg</strong> - error message used for SSI errors<br>
+<strong>sizefmt</strong> - format used for sizes in the <strong>fsize</strong> directive<br>
+<strong>timefmt</strong> - format used for timestamps in the <strong>flastmod</strong> directive<br>
+</li>
+<li>
+<strong>echo</strong> - <code><!--#echo var="VARIABLE_NAME" encoding="entity" --></code>
+will be replaced by the value of the variable.
+<br>
+The optional <strong>encoding</strong> parameter specifies the type of encoding to use.
+Valid values are <strong>entity</strong> (default), <strong>url</strong> or <strong>none</strong>.
+NOTE: Using an encoding other than <strong>entity</strong> can lead to security issues.
+</li>
+<li>
+<strong>exec</strong> - <code><!--#exec cmd="file-name" --></code>
+Used to run commands on the host system.
+</li>
+<li>
+<strong>exec</strong> - <code><!--#exec cgi="file-name" --></code>
+This acts the same as the <strong>include virtual</strong> directive, and doesn't actually execute any commands.
+</li>
+<li>
+<strong>include</strong> - <code><!--#include file="file-name" --></code>
+inserts the contents. The path is interpreted relative to the document where this directive
+is being used, and IS NOT a "virtual" path relative to either the context root or the server root.
+</li>
+<li>
+<strong>include</strong> - <code><!--#include virtual="file-name" --></code>
+inserts the contents. The path is interpreted as a "virtual" path which is
+relative to either the context root or the server root (depending on the <strong>isVirtualWebappRelative</strong>
+parameter).
+</li>
+<li>
+<strong>flastmod</strong> - <code><!--#flastmod file="filename.shtml" --></code>
+Returns the time that a file was last modified. The path is interpreted relative to the document where this directive
+is being used, and IS NOT a "virtual" path relative to either the context root or the server root.
+</li>
+<li>
+<strong>flastmod</strong> - <code><!--#flastmod virtual="filename.shtml" --></code>
+Returns the time that a file was last modified. The path is interpreted as a "virtual" path which is
+relative to either the context root or the server root (depending on the <strong>isVirtualWebappRelative</strong>
+parameter).
+</li>
+<li>
+<strong>fsize</strong> - <code><!--#fsize file="filename.shtml" --></code>
+Returns the size of a file. The path is interpreted relative to the document where this directive
+is being used, and IS NOT a "virtual" path relative to either the context root or the server root.
+</li>
+<li>
+<strong>fsize</strong> - <code><!--#fsize virtual="filename.shtml" --></code>
+Returns the size of a file. The path is interpreted as a "virtual" path which is
+relative to either the context root or the server root (depending on the <strong>isVirtualWebappRelative</strong>
+parameter).
+</li>
+<li>
+<strong>printenv</strong> - <code><!--#printenv --></code>
+Returns the list of all the defined variables.
+</li>
+<li>
+<strong>set</strong> - <code><!--#set var="foo" value="Bar" --></code>
+is used to assign a value to a user-defined variable.
+</li>
+<li>
+<strong>if elif endif else</strong> - Used to create conditional sections. For example:
+<div class="codeBox"><pre><code><!--#config timefmt="%A" -->
+<!--#if expr="$DATE_LOCAL = /Monday/" -->
+<p>Meeting at 10:00 on Mondays</p>
+<!--#elif expr="$DATE_LOCAL = /Friday/" -->
+<p>Turn in your time card</p>
+<!--#else -->
+<p>Yoga class at noon.</p>
+<!--#endif --></code></pre></div>
+</li>
+</ul>
+<p>
+See the
+<a href="https://httpd.apache.org/docs/howto/ssi.html#basicssidirectives">
+Apache Introduction to SSI</a> for more information on using SSI directives.</p>
+</div><h3 id="Variables">Variables</h3><div class="text">
+<p>
+SSI variables are implemented via request attributes on the <b>javax.servlet.ServletRequest</b> object
+and are not limited to the SSI servlet. Variables starting with the names
+"java.", "javax.", "sun" or "org.apache.catalina.ssi.SSIMediator." are reserved
+and cannot be used.
+</p>
+<p>The SSI servlet currently implements the following variables:
+</p>
+<table class="defaultTable">
+<tr>
+<th>Variable Name</th>
+<th>Description</th>
+</tr>
+
+<tr>
+<td>AUTH_TYPE</td>
+<td>
+ The type of authentication used for this user: BASIC, FORM, etc.</td>
+</tr>
+
+<tr>
+<td>CONTENT_LENGTH</td>
+<td>
+ The length of the data (in bytes or the number of
+ characters) passed from a form.</td>
+</tr>
+
+<tr>
+<td>CONTENT_TYPE</td>
+<td>
+ The MIME type of the query data, such as "text/html".</td>
+</tr>
+
+<tr>
+<td>DATE_GMT</td>
+<td>
+Current date and time in GMT</td>
+</tr>
+
+<tr>
+<td>DATE_LOCAL</td>
+<td>
+Current date and time in the local time zone</td>
+</tr>
+<tr>
+<td>DOCUMENT_NAME</td>
+<td>
+The current file</td>
+</tr>
+<tr>
+<td>DOCUMENT_URI</td>
+<td>
+Virtual path to the file</td>
+</tr>
+
+<tr>
+<td>GATEWAY_INTERFACE</td>
+<td>
+ The revision of the Common Gateway Interface that the
+ server uses if enabled: "CGI/1.1".</td>
+</tr>
+
+<tr>
+<td>HTTP_ACCEPT</td>
+<td>
+ A list of the MIME types that the client can accept.</td>
+</tr>
+
+<tr>
+<td>HTTP_ACCEPT_ENCODING</td>
+<td>
+ A list of the compression types that the client can accept.</td>
+</tr>
+
+<tr>
+<td>HTTP_ACCEPT_LANGUAGE</td>
+<td>
+ A list of the languages that the client can accept.</td>
+</tr>
+<tr>
+<td>HTTP_CONNECTION</td>
+<td>
+ The way that the connection from the client is being managed:
+ "Close" or "Keep-Alive".</td>
+</tr>
+<tr>
+<td>HTTP_HOST</td>
+<td>
+ The web site that the client requested.</td>
+</tr>
+<tr>
+<td>HTTP_REFERER</td>
+<td>
+ The URL of the document that the client linked from.</td>
+</tr>
+<tr>
+<td>HTTP_USER_AGENT</td>
+<td>
+ The browser the client is using to issue the request.</td>
+</tr>
+<tr>
+<td>LAST_MODIFIED</td>
+<td>
+Last modification date and time for current file</td>
+</tr>
+<tr>
+<td>PATH_INFO</td>
+<td>
+ Extra path information passed to a servlet.</td>
+</tr>
+<tr>
+<td>PATH_TRANSLATED</td>
+<td>
+ The translated version of the path given by the
+ variable PATH_INFO.</td>
+</tr>
+<tr>
+<td>QUERY_STRING</td>
+<td>
+The query string that follows the "?" in the URL.
+</td>
+</tr>
+<tr>
+<td>QUERY_STRING_UNESCAPED</td>
+<td>
+Undecoded query string with all shell metacharacters escaped
+with "\"</td>
+</tr>
+<tr>
+<td>REMOTE_ADDR</td>
+<td>
+ The remote IP address of the user making the request.</td>
+</tr>
+<tr>
+<td>REMOTE_HOST</td>
+<td>
+ The remote hostname of the user making the request.</td>
+</tr>
+<tr>
+<td>REMOTE_PORT</td>
+<td>
+ The port number at remote IP address of the user making the request.</td>
+</tr>
+<tr>
+<td>REMOTE_USER</td>
+<td>
+ The authenticated name of the user.</td>
+</tr>
+<tr>
+<td>REQUEST_METHOD</td>
+<td>
+ The method with which the information request was
+ issued: "GET", "POST" etc.</td>
+</tr>
+<tr>
+<td>REQUEST_URI</td>
+<td>
+ The web page originally requested by the client.</td>
+</tr>
+<tr>
+<td>SCRIPT_FILENAME</td>
+<td>
+ The location of the current web page on the server.</td>
+</tr>
+<tr>
+<td>SCRIPT_NAME</td>
+<td>
+ The name of the web page.</td>
+</tr>
+<tr>
+<td>SERVER_ADDR</td>
+<td>
+ The server's IP address.</td>
+</tr>
+<tr>
+<td>SERVER_NAME</td>
+<td>
+ The server's hostname or IP address.</td>
+</tr>
+<tr>
+<td>SERVER_PORT</td>
+<td>
+ The port on which the server received the request.</td>
+</tr>
+<tr>
+<td>SERVER_PROTOCOL</td>
+<td>
+ The protocol used by the server. E.g. "HTTP/1.1".</td>
+</tr>
+<tr>
+<td>SERVER_SOFTWARE</td>
+<td>
+ The name and version of the server software that is
+ answering the client request.</td>
+</tr>
+<tr>
+<td>UNIQUE_ID</td>
+<td>
+ A token used to identify the current session if one
+ has been established.</td>
+</tr>
+</table>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/ssl-howto.html b/web/tomcat/webapps/docs/ssl-howto.html
new file mode 100644
index 0000000..71e0c95
--- /dev/null
+++ b/web/tomcat/webapps/docs/ssl-howto.html
@@ -0,0 +1,673 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - SSL/TLS Configuration How-To</title><meta name="author" content="Christopher Cain"><meta name="author" content="Yoav Shapira"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>SSL/TLS Configuration How-To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Quick_Start">Quick Start</a></li><li><a href="#Introduction_to_SSL">Introduction to SSL/TLS</a></li><li><a href="#SSL_and_Tomcat">SSL/TLS and Tomcat</a></li><li><a href="#Certificates">Certificates</a></li><li><a href="#General_Tips_on_Running_SSL">General Tips on Running SSL</a></li><li><a href="#Configuration">Configuration</a><ol><li><a href="#Prepare_the_Certificate_Keystore">Prepare the Certificate Keystore</a></li><li><a href="#Edit_the_Tomcat_Configuration_File">Edit the Tomcat Configuration File</a></li></ol></li><li><a href="#Installing_a_Certificate_from_a_Certificate_Authority">Installing a Certificate from a Certificate Authority</a><ol><li><a href="#Create_a_local_Certificate_Signing_Request_(CSR)">Create a local Certificate Signing Request (CSR)</a></li><li><a href="#Importing_the_Certificate">Importing the Certificate</a></li></ol></li><li><a href="#Using_OCSP_Certificates">Using OCSP Certificates</a><ol><li><a href="#Generating_OCSP-Enabled_Certificates">Generating OCSP-Enabled Certificates</a></li><li><a href="#Configuring_OCSP_Connector">Configuring OCSP Connector</a></li><li><a href="#Starting_OCSP_Responder">Starting OCSP Responder</a></li></ol></li><li><a href="#Troubleshooting">Troubleshooting</a></li><li><a href="#Using_the_SSL_for_session_tracking_in_your_application">Using the SSL for session tracking in your application</a></li><li><a href="#Miscellaneous_Tips_and_Bits">Miscellaneous Tips and Bits</a></li></ul>
+</div><h3 id="Quick_Start">Quick Start</h3><div class="text">
+
+ <p><em>The description below uses the variable name $CATALINA_BASE to refer the
+ base directory against which most relative paths are resolved. If you have
+ not configured Tomcat for multiple instances by setting a CATALINA_BASE
+ directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME,
+ the directory into which you have installed Tomcat.</em></p>
+
+<p>To install and configure SSL/TLS support on Tomcat, you need to follow
+these simple steps. For more information, read the rest of this How-To.</p>
+<ol>
+<li><p>Create a keystore file to store the server's private key and
+self-signed certificate by executing the following command:</p>
+<p>Windows:</p>
+<div class="codeBox"><pre><code>"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA</code></pre></div>
+<p>Unix:</p>
+<div class="codeBox"><pre><code>$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA</code></pre></div>
+
+<p>and specify a password value of "changeit".</p></li>
+<li><p>Uncomment the "SSL HTTP/1.1 Connector" entry in
+ <code>$CATALINA_BASE/conf/server.xml</code> and modify as described in
+ the <a href="#Configuration">Configuration section</a> below.</p></li>
+
+</ol>
+
+
+</div><h3 id="Introduction_to_SSL">Introduction to SSL/TLS</h3><div class="text">
+
+<p>Transport Layer Security (TLS) and its predecessor, Secure Sockets Layer
+(SSL), are technologies which allow web browsers and web servers to communicate
+over a secured connection. This means that the data being sent is encrypted by
+one side, transmitted, then decrypted by the other side before processing.
+This is a two-way process, meaning that both the server AND the browser encrypt
+all traffic before sending out data.</p>
+
+<p>Another important aspect of the SSL/TLS protocol is Authentication. This means
+that during your initial attempt to communicate with a web server over a secure
+connection, that server will present your web browser with a set of
+credentials, in the form of a "Certificate", as proof the site is who and what
+it claims to be. In certain cases, the server may also request a Certificate
+from your web browser, asking for proof that <em>you</em> are who you claim
+to be. This is known as "Client Authentication," although in practice this is
+used more for business-to-business (B2B) transactions than with individual
+users. Most SSL-enabled web servers do not request Client Authentication.</p>
+
+</div><h3 id="SSL_and_Tomcat">SSL/TLS and Tomcat</h3><div class="text">
+
+<p>It is important to note that configuring Tomcat to take advantage of
+secure sockets is usually only necessary when running it as a stand-alone
+web server. Details can be found in the
+<a href="security-howto.html">Security Considerations Document</a>.
+When running Tomcat primarily as a Servlet/JSP container behind
+another web server, such as Apache or Microsoft IIS, it is usually necessary
+to configure the primary web server to handle the SSL connections from users.
+Typically, this server will negotiate all SSL-related functionality, then
+pass on any requests destined for the Tomcat container only after decrypting
+those requests. Likewise, Tomcat will return cleartext responses, that will
+be encrypted before being returned to the user's browser. In this environment,
+Tomcat knows that communications between the primary web server and the
+client are taking place over a secure connection (because your application
+needs to be able to ask about this), but it does not participate in the
+encryption or decryption itself.</p>
+
+<p>Tomcat is able to use any of the the cryptographic protocols that are
+provided by the underlying environment. Java itself provides cryptographic
+capabilities through <a href="https://docs.oracle.com/javase/9/security/java-cryptography-architecture-jca-reference-guide.htm">JCE/JCA</a>
+and encrypted communications capabilities through <a href="https://docs.oracle.com/javase/9/security/java-secure-socket-extension-jsse-reference-guide.htm">JSSE</a>.
+Any compliant cryptographic "provider" can provide cryptographic algorithms
+to Tomcat. The built-in provider (SunJCE) includes support for various
+SSL/TLS versions like SSLv3, TLSv1, TLSv1.1, and so on. Check the documentation
+for your version of Java for details on protocol and algorithm support.</p>
+
+<p>If you use the optional <code>tcnative</code> library, you can use
+the <a href="https://www.openssl.org/">OpenSSL</a> cryptographic provider
+through JCA/JCE/JSSE which may provide a different selection of cryptographic
+algorithms and/or performance benefits relative to the SunJCE provider.
+You can also use <code>tcnative</code> to enable the <a href="apr.html">APR</a>
+connector which uses OpenSSL for its cryptographic operations. Check the
+documentation for your version of OpenSSL for details on protocol and
+algorithm support.</p>
+
+</div><h3 id="Certificates">Certificates</h3><div class="text">
+
+<p>In order to implement SSL, a web server must have an associated Certificate
+for each external interface (IP address) that accepts secure connections.
+The theory behind this design is that a server should provide some kind of
+reasonable assurance that its owner is who you think it is, particularly
+before receiving any sensitive information. While a broader explanation of
+Certificates is beyond the scope of this document, think of a Certificate as a
+"digital passport" for an Internet address. It states which organisation the
+site is associated with, along with some basic contact information about the
+site owner or administrator.</p>
+
+<p>This certificate is cryptographically signed by its owner, and is
+therefore extremely difficult for anyone else to forge. For the certificate to
+work in the visitors browsers without warnings, it needs to be signed by a
+trusted third party. These are called <em>Certificate Authorities</em> (CAs). To
+obtain a signed certificate, you need to choose a CA and follow the instructions
+your chosen CA provides to obtain your certificate. A range of CAs is available
+including some that offer certificates at no cost.</p>
+
+<p>Java provides a relatively simple command-line tool, called
+<code>keytool</code>, which can easily create a "self-signed" Certificate.
+Self-signed Certificates are simply user generated Certificates which have not
+been signed by a well-known CA and are, therefore, not really guaranteed to be
+authentic at all. While self-signed certificates can be useful for some testing
+scenarios, they are not suitable for any form of production use.</p>
+
+</div><h3 id="General_Tips_on_Running_SSL">General Tips on Running SSL</h3><div class="text">
+
+<p>When securing a website with SSL it's important to make sure that all assets
+that the site uses are served over SSL, so that an attacker can't bypass
+the security by injecting malicious content in a JavaScript file or similar. To
+further enhance the security of your website, you should evaluate to use the
+HSTS header. It allows you to communicate to the browser that your site should
+always be accessed over https.</p>
+
+<p>Using name-based virtual hosts on a secured connection requires careful
+configuration of the names specified in a single certificate or Tomcat 8.5
+onwards where Server Name Indication (SNI) support is available. SNI allows
+multiple certificates with different names to be associated with a single TLS
+connector.</p>
+
+</div><h3 id="Configuration">Configuration</h3><div class="text">
+
+<div class="subsection"><h4 id="Prepare_the_Certificate_Keystore">Prepare the Certificate Keystore</h4><div class="text">
+
+<p>Tomcat currently operates only on <code>JKS</code>, <code>PKCS11</code> or
+<code>PKCS12</code> format keystores. The <code>JKS</code> format
+is Java's standard "Java KeyStore" format, and is the format created by the
+<code>keytool</code> command-line utility. This tool is included in the JDK.
+The <code>PKCS12</code> format is an internet standard, and can be manipulated
+via (among other things) OpenSSL and Microsoft's Key-Manager.
+</p>
+
+<p>Each entry in a keystore is identified by an alias string. Whilst many
+keystore implementations treat aliases in a case insensitive manner, case
+sensitive implementations are available. The <code>PKCS11</code> specification,
+for example, requires that aliases are case sensitive. To avoid issues related
+to the case sensitivity of aliases, it is not recommended to use aliases that
+differ only in case.
+</p>
+
+<p>To import an existing certificate into a <code>JKS</code> keystore, please read the
+documentation (in your JDK documentation package) about <code>keytool</code>.
+Note that OpenSSL often adds readable comments before the key, but
+<code>keytool</code> does not support that. So if your certificate has
+comments before the key data, remove them before importing the certificate with
+<code>keytool</code>.
+</p>
+<p>To import an existing certificate signed by your own CA into a <code>PKCS12</code>
+keystore using OpenSSL you would execute a command like:</p>
+<div class="codeBox"><pre><code>openssl pkcs12 -export -in mycert.crt -inkey mykey.key
+ -out mycert.p12 -name tomcat -CAfile myCA.crt
+ -caname root -chain</code></pre></div>
+<p>For more advanced cases, consult the
+<a href="https://www.openssl.org/" rel="nofollow">OpenSSL documentation</a>.</p>
+
+<p>To create a new <code>JKS</code> keystore from scratch, containing a single
+self-signed Certificate, execute the following from a terminal command line:</p>
+<p>Windows:</p>
+<div class="codeBox"><pre><code>"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA</code></pre></div>
+<p>Unix:</p>
+<div class="codeBox"><pre><code>$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA</code></pre></div>
+
+<p>(The RSA algorithm should be preferred as a secure algorithm, and this
+also ensures general compatibility with other servers and components.)</p>
+
+<p>This command will create a new file, in the home directory of the user
+under which you run it, named "<code>.keystore</code>". To specify a
+different location or filename, add the <code>-keystore</code> parameter,
+followed by the complete pathname to your keystore file,
+to the <code>keytool</code> command shown above. You will also need to
+reflect this new location in the <code>server.xml</code> configuration file,
+as described later. For example:</p>
+<p>Windows:</p>
+<div class="codeBox"><pre><code>"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA
+ -keystore \path\to\my\keystore</code></pre></div>
+<p>Unix:</p>
+<div class="codeBox"><pre><code>$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA
+ -keystore /path/to/my/keystore</code></pre></div>
+
+<p>After executing this command, you will first be prompted for the keystore
+password. The default password used by Tomcat is "<code>changeit</code>"
+(all lower case), although you can specify a custom password if you like.
+You will also need to specify the custom password in the
+<code>server.xml</code> configuration file, as described later.</p>
+
+<p>Next, you will be prompted for general information about this Certificate,
+such as company, contact name, and so on. This information will be displayed
+to users who attempt to access a secure page in your application, so make
+sure that the information provided here matches what they will expect.</p>
+
+<p>Finally, you will be prompted for the <em>key password</em>, which is the
+password specifically for this Certificate (as opposed to any other
+Certificates stored in the same keystore file). The <code>keytool</code> prompt
+will tell you that pressing the ENTER key automatically uses the same password
+for the key as the keystore. You are free to use the same password or to select
+a custom one. If you select a different password to the keystore password, you
+will also need to specify the custom password in the <code>server.xml</code>
+configuration file.</p>
+
+<p>If everything was successful, you now have a keystore file with a
+Certificate that can be used by your server.</p>
+
+</div></div>
+
+<div class="subsection"><h4 id="Edit_the_Tomcat_Configuration_File">Edit the Tomcat Configuration File</h4><div class="text">
+<p>
+Tomcat can use three different implementations of SSL:
+</p>
+<ul>
+<li>JSSE implementation provided as part of the Java runtime</li>
+<li>JSSE implementation that uses OpenSSL</li>
+<li>APR implementation, which uses the OpenSSL engine by default</li>
+</ul>
+<p>
+The exact configuration details depend on which implementation is being used.
+If you configured Connector by specifying generic
+<code>protocol="HTTP/1.1"</code> then the implementation used by Tomcat is
+chosen automatically. If the installation uses <a href="apr.html">APR</a>
+- i.e. you have installed the Tomcat native library -
+then it will use the JSSE OpenSSL implementation, otherwise it will use the Java
+JSSE implementation.
+</p>
+
+<p>
+Auto-selection of implementation can be avoided if needed. It is done by specifying a classname
+in the <b>protocol</b> attribute of the <a href="config/http.html">Connector</a>.</p>
+
+<p>To define a Java (JSSE) connector, regardless of whether the APR library is
+loaded or not, use one of the following:</p>
+<div class="codeBox"><pre><code><!-- Define an HTTP/1.1 Connector on port 8443, JSSE NIO implementation -->
+<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
+ sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
+ port="8443" .../>
+
+<!-- Define an HTTP/1.1 Connector on port 8443, JSSE NIO2 implementation -->
+<Connector protocol="org.apache.coyote.http11.Http11Nio2Protocol"
+ sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
+ port="8443" .../></code></pre></div>
+
+<p>The OpenSSL JSSE implementation can also be configured explicitly if needed. If the APR library
+is installed (as for using the APR connector), using the sslImplementationName attribute
+allows enabling it. When using the OpenSSL JSSE implementation, the configuration can use
+either the JSSE attributes or
+the OpenSSL attributes (as used for the APR connector), but must not mix attributes from
+both types in the same SSLHostConfig or Connector element.</p>
+<div class="codeBox"><pre><code><!-- Define an HTTP/1.1 Connector on port 8443, JSSE NIO implementation and OpenSSL -->
+<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8443"
+ sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"
+ .../></code></pre></div>
+
+<p>Alternatively, to specify an APR connector (the APR library must be available) use:</p>
+<div class="codeBox"><pre><code><!-- Define an HTTP/1.1 Connector on port 8443, APR implementation -->
+<Connector protocol="org.apache.coyote.http11.Http11AprProtocol"
+ port="8443" .../></code></pre></div>
+
+<p>If you are using APR or JSSE OpenSSL, you have the option of configuring an alternative engine to OpenSSL.</p>
+<div class="codeBox"><pre><code><Listener className="org.apache.catalina.core.AprLifecycleListener"
+ SSLEngine="someengine" SSLRandomSeed="somedevice" /></code></pre></div>
+<p>The default value is</p>
+<div class="codeBox"><pre><code><Listener className="org.apache.catalina.core.AprLifecycleListener"
+ SSLEngine="on" SSLRandomSeed="builtin" /></code></pre></div>
+<p>Also the <code>useAprConnector</code> attribute may be used to have Tomcat default to
+using the APR connector rather than the NIO connector:</p>
+<div class="codeBox"><pre><code><Listener className="org.apache.catalina.core.AprLifecycleListener"
+ useAprConnector="true" SSLEngine="on" SSLRandomSeed="builtin" /></code></pre></div>
+<p>
+So to enable OpenSSL, make sure the SSLEngine attribute is set to something other than <code>off</code>.
+The default value is <code>on</code> and if you specify another value,
+it has to be a valid OpenSSL engine name.
+</p>
+
+<p>
+SSLRandomSeed allows to specify a source of entropy. Productive system needs a reliable source of entropy
+but entropy may need a lot of time to be collected therefore test systems could use no blocking entropy
+sources like "/dev/urandom" that will allow quicker starts of Tomcat.
+</p>
+
+<p>The final step is to configure the Connector in the
+<code>$CATALINA_BASE/conf/server.xml</code> file, where
+<code>$CATALINA_BASE</code> represents the base directory for the
+Tomcat instance. An example <code><Connector></code> element
+for an SSL connector is included in the default <code>server.xml</code>
+file installed with Tomcat. To configure an SSL connector that uses JSSE, you
+will need to remove the comments and edit it so it looks something like
+this:</p>
+<div class="codeBox"><pre><code><!-- Define an SSL Coyote HTTP/1.1 Connector on port 8443 -->
+<Connector
+ protocol="org.apache.coyote.http11.Http11NioProtocol"
+ port="8443" maxThreads="200"
+ scheme="https" secure="true" SSLEnabled="true"
+ keystoreFile="${user.home}/.keystore" keystorePass="changeit"
+ clientAuth="false" sslProtocol="TLS"/></code></pre></div>
+<p>
+ Note: If tomcat-native is installed, the configuration will use JSSE with
+ an OpenSSL implementation, which supports either this configuration or the APR
+ configuration example given below.</p>
+<p>
+ The APR connector uses different attributes for many SSL settings,
+ particularly keys and certificates. An example of an APR configuration is:</p>
+<div class="codeBox"><pre><code><!-- Define an SSL Coyote HTTP/1.1 Connector on port 8443 -->
+<Connector
+ protocol="org.apache.coyote.http11.Http11AprProtocol"
+ port="8443" maxThreads="200"
+ scheme="https" secure="true" SSLEnabled="true"
+ SSLCertificateFile="/usr/local/ssl/server.crt"
+ SSLCertificateKeyFile="/usr/local/ssl/server.pem"
+ SSLVerifyClient="optional" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"/></code></pre></div>
+
+
+<p>The configuration options and information on which attributes
+are mandatory, are documented in the SSL Support section of the
+<a href="config/http.html#SSL_Support">HTTP connector</a> configuration
+reference. Make sure that you use the correct attributes for the connector you
+are using. The NIO and NIO2 connectors use JSSE unless the JSSE OpenSSL implementation is
+installed (in which case it supports either the JSSE or OpenSSL configuration styles),
+whereas the APR/native connector uses APR.</p>
+
+<p>The <code>port</code> attribute is the TCP/IP
+port number on which Tomcat will listen for secure connections. You can
+change this to any port number you wish (such as to the default port for
+<code>https</code> communications, which is 443). However, special setup
+(outside the scope of this document) is necessary to run Tomcat on port
+numbers lower than 1024 on many operating systems.</p>
+
+ <p><em>If you change the port number here, you should also change the
+ value specified for the <code>redirectPort</code> attribute on the
+ non-SSL connector. This allows Tomcat to automatically redirect
+ users who attempt to access a page with a security constraint specifying
+ that SSL is required, as required by the Servlet Specification.</em></p>
+
+<p>After completing these configuration changes, you must restart Tomcat as
+you normally do, and you should be in business. You should be able to access
+any web application supported by Tomcat via SSL. For example, try:</p>
+<div class="codeBox"><pre><code>https://localhost:8443/</code></pre></div>
+<p>and you should see the usual Tomcat splash page (unless you have modified
+the ROOT web application). If this does not work, the following section
+contains some troubleshooting tips.</p>
+
+</div></div>
+
+</div><h3 id="Installing_a_Certificate_from_a_Certificate_Authority">Installing a Certificate from a Certificate Authority</h3><div class="text">
+<p>To obtain and install a Certificate from a Certificate Authority (like verisign.com, thawte.com
+or trustcenter.de), read the previous section and then follow these instructions:</p>
+
+<div class="subsection"><h4 id="Create_a_local_Certificate_Signing_Request_(CSR)">Create a local Certificate Signing Request (CSR)</h4><div class="text">
+<p>In order to obtain a Certificate from the Certificate Authority of your choice
+you have to create a so called Certificate Signing Request (CSR). That CSR will be used
+by the Certificate Authority to create a Certificate that will identify your website
+as "secure". To create a CSR follow these steps:</p>
+<ul>
+<li>Create a local self-signed Certificate (as described in the previous section):
+ <div class="codeBox"><pre><code>keytool -genkey -alias tomcat -keyalg RSA
+ -keystore <your_keystore_filename></code></pre></div>
+ Note: In some cases you will have to enter the domain of your website (i.e. <code>www.myside.org</code>)
+ in the field "first- and lastname" in order to create a working Certificate.
+</li>
+<li>The CSR is then created with:
+ <div class="codeBox"><pre><code>keytool -certreq -keyalg RSA -alias tomcat -file certreq.csr
+ -keystore <your_keystore_filename></code></pre></div>
+</li>
+</ul>
+<p>Now you have a file called <code>certreq.csr</code> that you can submit to the Certificate Authority (look at the
+documentation of the Certificate Authority website on how to do this). In return you get a Certificate.</p>
+</div></div>
+
+<div class="subsection"><h4 id="Importing_the_Certificate">Importing the Certificate</h4><div class="text">
+<p>Now that you have your Certificate you can import it into you local keystore.
+First of all you have to import a so called Chain Certificate or Root Certificate into your keystore.
+After that you can proceed with importing your Certificate.</p>
+
+<ul>
+<li>Download a Chain Certificate from the Certificate Authority you obtained the Certificate from.<br>
+ For Verisign.com commercial certificates go to:
+ http://www.verisign.com/support/install/intermediate.html<br>
+ For Verisign.com trial certificates go to:
+ http://www.verisign.com/support/verisign-intermediate-ca/Trial_Secure_Server_Root/index.html<br>
+ For Trustcenter.de go to:
+ http://www.trustcenter.de/certservices/cacerts/en/en.htm#server<br>
+ For Thawte.com go to:
+ http://www.thawte.com/certs/trustmap.html<br>
+</li>
+<li>Import the Chain Certificate into your keystore
+ <div class="codeBox"><pre><code>keytool -import -alias root -keystore <your_keystore_filename>
+ -trustcacerts -file <filename_of_the_chain_certificate></code></pre></div>
+</li>
+<li>And finally import your new Certificate
+ <div class="codeBox"><pre><code>keytool -import -alias tomcat -keystore <your_keystore_filename>
+ -file <your_certificate_filename></code></pre></div>
+</li>
+</ul>
+
+<p>Each Certificate Authority tends to differ slightly from the others. They may
+require slightly different information and/or provide the certificate and
+associated certificate chain in different formats. Additionally, the rules that
+the Certificate Authorities use for issuing certifcates change over time. As a
+result you may find that the commands given above may need to be modified. If
+you require assitance then help is available via the
+<a href="http://tomcat.apache.org/lists.html#tomcat-users">Apache Tomcat users
+mailing list</a>.</p>
+
+</div></div>
+</div><h3 id="Using_OCSP_Certificates">Using OCSP Certificates</h3><div class="text">
+<p>To use Online Certificate Status Protocol (OCSP) with Apache Tomcat, ensure
+ you have downloaded, installed, and configured the
+ <a href="https://tomcat.apache.org/download-native.cgi">
+ Tomcat Native Connector</a>.
+Furthermore, if you use the Windows platform, ensure you download the
+ocsp-enabled connector.</p>
+<p>To use OCSP, you require the following:</p>
+
+<ul>
+ <li>OCSP-enabled certificates</li>
+ <li>Tomcat with SSL APR connector</li>
+ <li>Configured OCSP responder</li>
+</ul>
+
+<div class="subsection"><h4 id="Generating_OCSP-Enabled_Certificates">Generating OCSP-Enabled Certificates</h4><div class="text">
+<p>Apache Tomcat requires the OCSP-enabled certificate to have the OCSP
+ responder location encoded in the certificate. The basic OCSP-related
+ certificate authority settings in the <code>openssl.cnf</code> file could look
+ as follows:</p>
+
+<div class="codeBox"><pre><code>
+#... omitted for brevity
+
+[x509]
+x509_extensions = v3_issued
+
+[v3_issued]
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid,issuer
+# The address of your responder
+authorityInfoAccess = OCSP;URI:http://127.0.0.1:8088
+keyUsage = critical,digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment,keyAgreement,keyCertSign,cRLSign,encipherOnly,decipherOnly
+basicConstraints=critical,CA:FALSE
+nsComment="Testing OCSP Certificate"
+
+#... omitted for brevity
+</code></pre></div>
+
+<p>The settings above encode the OCSP responder address
+ <code>127.0.0.1:8088</code> into the certificate. Note that for the following
+ steps, you must have <code>openssl.cnf</code> and other configuration of
+ your CA ready. To generate an OCSP-enabled certificate:</p>
+
+<ul>
+ <li>
+ Create a private key:
+ <div class="codeBox"><pre><code>openssl genrsa -aes256 -out ocsp-cert.key 4096</code></pre></div>
+ </li>
+ <li>
+ Create a signing request (CSR):
+ <div class="codeBox"><pre><code>openssl req -config openssl.cnf -new -sha256 \
+ -key ocsp-cert.key -out ocsp-cert.csr</code></pre></div></li>
+ <li>
+ Sign the CSR:
+ <div class="codeBox"><pre><code>openssl ca -openssl.cnf -extensions ocsp -days 375 -notext \
+ -md sha256 -in ocsp-cert.csr -out ocsp-cert.crt</code></pre></div>
+ </li>
+ <li>
+ You may verify the certificate:
+ <div class="codeBox"><pre><code>openssl x509 -noout -text -in ocsp-cert.crt</code></pre></div>
+ </li>
+</ul>
+</div></div>
+
+<div class="subsection"><h4 id="Configuring_OCSP_Connector">Configuring OCSP Connector</h4><div class="text">
+
+<p>To configure the OCSP connector, first verify that you are loading the Tomcat
+ APR library. Check the <a href="apr.html#Installation">
+ Apache Portable Runtime (APR) based Native library for Tomcat</a>
+for more information about installation of APR. A basic OCSP-enabled connector
+ definition in the <code>server.xml</code> file looks as follows:</p>
+<div class="codeBox"><pre><code>
+<Connector
+ port="8443"
+ protocol="org.apache.coyote.http11.Http11AprProtocol"
+ secure="true"
+ scheme="https"
+ SSLEnabled="true"
+ <SSLHostConfig
+ caCertificateFile="/path/to/ca.pem"
+ certificateVerification="require"
+ certificateVerificationDepth="10" >
+ <Certificate
+ certificateFile="/path/to/ocsp-cert.crt"
+ certificateKeyFile="/path/to/ocsp-cert.key" />
+ </SSLHostConfig>
+</code></pre></div>
+</div></div>
+
+<div class="subsection"><h4 id="Starting_OCSP_Responder">Starting OCSP Responder</h4><div class="text">
+ <p>Apache Tomcat will query an OCSP responder server to get the certificate
+ status. When testing, an easy way to create an OCSP responder is by executing
+ the following:
+ <div class="codeBox"><pre><code>openssl ocsp -port 127.0.0.1:8088 \
+ -text -sha256 -index index.txt \
+ -CA ca-chain.cert.pem -rkey ocsp-cert.key \
+ -rsigner ocsp-cert.crt</code></pre></div> </p>
+
+ <p>Do note that when using OCSP, the responder encoded in the connector
+ certificate must be running. For further information, see
+ <a href="https://www.openssl.org/docs/man1.1.0/apps/ocsp.html">
+ OCSP documentation
+ </a>.
+ </p>
+
+</div></div>
+
+</div><h3 id="Troubleshooting">Troubleshooting</h3><div class="text">
+
+<p>Here is a list of common problems that you may encounter when setting up
+SSL communications, and what to do about them.</p>
+
+<ul>
+
+<li>When Tomcat starts up, I get an exception like
+ "java.io.FileNotFoundException: {some-directory}/{some-file} not found".
+
+ <p>A likely explanation is that Tomcat cannot find the keystore file
+ where it is looking. By default, Tomcat expects the keystore file to
+ be named <code>.keystore</code> in the user home directory under which
+ Tomcat is running (which may or may not be the same as yours :-). If
+ the keystore file is anywhere else, you will need to add a
+ <code>keystoreFile</code> attribute to the <code><Connector></code>
+ element in the <a href="#Edit_the_Tomcat_Configuration_File">Tomcat
+ configuration file</a>.</p>
+ </li>
+
+<li>When Tomcat starts up, I get an exception like
+ "java.io.FileNotFoundException: Keystore was tampered with, or
+ password was incorrect".
+
+ <p>Assuming that someone has not <em>actually</em> tampered with
+ your keystore file, the most likely cause is that Tomcat is using
+ a different password than the one you used when you created the
+ keystore file. To fix this, you can either go back and
+ <a href="#Prepare_the_Certificate_Keystore">recreate the keystore
+ file</a>, or you can add or update the <code>keystorePass</code>
+ attribute on the <code><Connector></code> element in the
+ <a href="#Edit_the_Tomcat_Configuration_File">Tomcat configuration
+ file</a>. <strong>REMINDER</strong> - Passwords are case sensitive!</p>
+ </li>
+
+<li>When Tomcat starts up, I get an exception like
+ "java.net.SocketException: SSL handshake error javax.net.ssl.SSLException: No
+ available certificate or key corresponds to the SSL cipher suites which are
+ enabled."
+
+ <p>A likely explanation is that Tomcat cannot find the alias for the server
+ key within the specified keystore. Check that the correct
+ <code>keystoreFile</code> and <code>keyAlias</code> are specified in the
+ <code><Connector></code> element in the
+ <a href="#Edit_the_Tomcat_Configuration_File">Tomcat configuration file</a>.
+ <strong>REMINDER</strong> - <code>keyAlias</code> values may be case
+ sensitive!</p>
+ </li>
+
+<li>My Java-based client aborts handshakes with exceptions such as
+ "java.lang.RuntimeException: Could not generate DH keypair" and
+ "java.security.InvalidAlgorithmParameterException: Prime size must be multiple
+ of 64, and can only range from 512 to 1024 (inclusive)"
+
+ <p>If you are using the APR/native connector or the JSSE OpenSSL implementation,
+ it will determine the strength of ephemeral DH keys from the key size of
+ your RSA certificate. For example a 2048 bit RSA key will result in
+ using a 2048 bit prime for the DH keys. Unfortunately Java 6 only supports
+ 768 bit and Java 7 only supports 1024 bit. So if your certificate has a
+ stronger key, old Java clients might produce such handshake failures.
+ As a mitigation you can either try to force them to use another cipher by
+ configuring an appropriate <code>SSLCipherSuite</code> and activate
+ <code>SSLHonorCipherOrder</code>, or embed weak DH params in your
+ certificate file. The latter approach is not recommended because it weakens
+ the SSL security (logjam attack).</p>
+ </li>
+
+</ul>
+
+<p>If you are still having problems, a good source of information is the
+<strong>TOMCAT-USER</strong> mailing list. You can find pointers to archives
+of previous messages on this list, as well as subscription and unsubscription
+information, at
+<a href="https://tomcat.apache.org/lists.html">https://tomcat.apache.org/lists.html</a>.</p>
+
+</div><h3 id="Using_the_SSL_for_session_tracking_in_your_application">Using the SSL for session tracking in your application</h3><div class="text">
+ <p>This is a new feature in the Servlet 3.0 specification. Because it uses the
+ SSL session ID associated with the physical client-server connection there
+ are some limitations. They are:</p>
+ <ul>
+ <li>Tomcat must have a connector with the attribute
+ <strong>isSecure</strong> set to <code>true</code>.</li>
+ <li>If SSL connections are managed by a proxy or a hardware accelerator
+ they must populate the SSL request headers (see the
+ <a href="config/valve.html">SSLValve</a>) so that
+ the SSL session ID is visible to Tomcat.</li>
+ <li>If Tomcat terminates the SSL connection, it will not be possible to use
+ session replication as the SSL session IDs will be different on each
+ node.</li>
+ </ul>
+
+ <p>
+ To enable SSL session tracking you need to use a context listener to set the
+ tracking mode for the context to be just SSL (if any other tracking mode is
+ enabled, it will be used in preference). It might look something like:</p>
+ <div class="codeBox"><pre><code>package org.apache.tomcat.example;
+
+import java.util.EnumSet;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.SessionTrackingMode;
+
+public class SessionTrackingModeListener implements ServletContextListener {
+
+ @Override
+ public void contextDestroyed(ServletContextEvent event) {
+ // Do nothing
+ }
+
+ @Override
+ public void contextInitialized(ServletContextEvent event) {
+ ServletContext context = event.getServletContext();
+ EnumSet<SessionTrackingMode> modes =
+ EnumSet.of(SessionTrackingMode.SSL);
+
+ context.setSessionTrackingModes(modes);
+ }
+
+}</code></pre></div>
+
+ <p>Note: SSL session tracking is implemented for the NIO and NIO2 connectors.
+ It is not yet implemented for the APR connector.</p>
+
+</div><h3 id="Miscellaneous_Tips_and_Bits">Miscellaneous Tips and Bits</h3><div class="text">
+
+<p>To access the SSL session ID from the request, use:</p>
+
+ <div class="codeBox"><pre><code>String sslID = (String)request.getAttribute("javax.servlet.request.ssl_session_id");</code></pre></div>
+<p>
+For additional discussion on this area, please see
+<a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=22679">Bugzilla</a>.
+</p>
+
+ <p>To terminate an SSL session, use:</p>
+ <div class="codeBox"><pre><code>// Standard HTTP session invalidation
+session.invalidate();
+
+// Invalidate the SSL Session
+org.apache.tomcat.util.net.SSLSessionManager mgr =
+ (org.apache.tomcat.util.net.SSLSessionManager)
+ request.getAttribute("javax.servlet.request.ssl_session_mgr");
+mgr.invalidateSession();
+
+// Close the connection since the SSL session will be active until the connection
+// is closed
+response.setHeader("Connection", "close");</code></pre></div>
+ <p>
+ Note that this code is Tomcat specific due to the use of the
+ SSLSessionManager class. This is currently only available for the NIO and
+ NIO2 connectors, not the APR/native connector.
+ </p>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/tribes/developers.html b/web/tomcat/webapps/docs/tribes/developers.html
new file mode 100644
index 0000000..75d95a3
--- /dev/null
+++ b/web/tomcat/webapps/docs/tribes/developers.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tribes - The Tomcat Cluster Communication Module (8.5.73) - Apache Tribes - Developers</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tribes - The Tomcat Cluster Communication Module</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="introduction.html">Tribes Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="faq.html">3) FAQ</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="../api/org/apache/catalina/tribes/package-summary.html">JavaDoc</a></li></ul></div><div><h2>Apache Tribes Development</h2><ul><li><a href="membership.html">Membership</a></li><li><a href="transport.html">Transport</a></li><li><a href="interceptors.html">Interceptors</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tribes - Developers</h2><h3 id="Developers">Developers</h3><div class="text">
+ <p>TODO</p>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/tribes/faq.html b/web/tomcat/webapps/docs/tribes/faq.html
new file mode 100644
index 0000000..d8b0c0e
--- /dev/null
+++ b/web/tomcat/webapps/docs/tribes/faq.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tribes - The Tomcat Cluster Communication Module (8.5.73) - Apache Tribes - Frequently Asked Questions</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tribes - The Tomcat Cluster Communication Module</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="introduction.html">Tribes Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="faq.html">3) FAQ</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="../api/org/apache/catalina/tribes/package-summary.html">JavaDoc</a></li></ul></div><div><h2>Apache Tribes Development</h2><ul><li><a href="membership.html">Membership</a></li><li><a href="transport.html">Transport</a></li><li><a href="interceptors.html">Interceptors</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tribes - Frequently Asked Questions</h2><h3 id="Frequently_Asked_Questions">Frequently Asked Questions</h3><div class="text">
+ <p>TODO</p>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/tribes/interceptors.html b/web/tomcat/webapps/docs/tribes/interceptors.html
new file mode 100644
index 0000000..eafeb30
--- /dev/null
+++ b/web/tomcat/webapps/docs/tribes/interceptors.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tribes - The Tomcat Cluster Communication Module (8.5.73) - Apache Tribes - Interceptors</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tribes - The Tomcat Cluster Communication Module</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="introduction.html">Tribes Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="faq.html">3) FAQ</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="../api/org/apache/catalina/tribes/package-summary.html">JavaDoc</a></li></ul></div><div><h2>Apache Tribes Development</h2><ul><li><a href="membership.html">Membership</a></li><li><a href="transport.html">Transport</a></li><li><a href="interceptors.html">Interceptors</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tribes - Interceptors</h2><h3 id="Interceptors">Interceptors</h3><div class="text">
+ <p>TODO</p>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/tribes/introduction.html b/web/tomcat/webapps/docs/tribes/introduction.html
new file mode 100644
index 0000000..299e6be
--- /dev/null
+++ b/web/tomcat/webapps/docs/tribes/introduction.html
@@ -0,0 +1,232 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tribes - The Tomcat Cluster Communication Module (8.5.73) - Apache Tribes - Introduction</title><meta name="author" content="Filip Hanik"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tribes - The Tomcat Cluster Communication Module</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="introduction.html">Tribes Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="faq.html">3) FAQ</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="../api/org/apache/catalina/tribes/package-summary.html">JavaDoc</a></li></ul></div><div><h2>Apache Tribes Development</h2><ul><li><a href="membership.html">Membership</a></li><li><a href="transport.html">Transport</a></li><li><a href="interceptors.html">Interceptors</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tribes - Introduction</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Quick_Start">Quick Start</a></li><li><a href="#What_is_Tribes">What is Tribes</a></li><li><a href="#Why_another_messaging_framework">Why another messaging framework</a></li><li><a href="#Feature_Overview">Feature Overview</a></li><li><a href="#Where_can_I_get_Tribes">Where can I get Tribes</a></li></ul>
+</div><h3 id="Quick_Start">Quick Start</h3><div class="text">
+
+ <p>Apache Tribes is a group or peer-to-peer communication framework that enables you to easily connect
+ your remote objects to communicate with each other.
+ </p>
+ <ul>
+ <li>Import: <code>org.apache.catalina.tribes.Channel</code></li>
+ <li>Import: <code>org.apache.catalina.tribes.Member</code></li>
+ <li>Import: <code>org.apache.catalina.tribes.MembershipListener</code></li>
+ <li>Import: <code>org.apache.catalina.tribes.ChannelListener</code></li>
+ <li>Import: <code>org.apache.catalina.tribes.group.GroupChannel</code></li>
+ <li>Create a class that implements: <code>org.apache.catalina.tribes.ChannelListener</code></li>
+ <li>Create a class that implements: <code>org.apache.catalina.tribes.MembershipListener</code></li>
+ <li>Simple class to demonstrate how to send a message:
+ <div class="codeBox"><pre><code>//create a channel
+Channel myChannel = new GroupChannel();
+
+//create my listeners
+ChannelListener msgListener = new MyMessageListener();
+MembershipListener mbrListener = new MyMemberListener();
+
+//attach the listeners to the channel
+myChannel.addMembershipListener(mbrListener);
+myChannel.addChannelListener(msgListener);
+
+//start the channel
+myChannel.start(Channel.DEFAULT);
+
+//create a message to be sent, message must implement java.io.Serializable
+//for performance reasons you probably want them to implement java.io.Externalizable
+Serializable myMsg = new MyMessage();
+
+//retrieve my current members
+Member[] group = myChannel.getMembers();
+
+//send the message
+myChannel.send(group,myMsg,Channel.SEND_OPTIONS_DEFAULT);</code></pre></div>
+ </li>
+ </ul>
+ <p>
+ Simple yeah? There is a lot more to Tribes than we have shown, hopefully the docs will be able
+ to explain more to you. Remember, that we are always interested in suggestions, improvements, bug fixes
+ and anything that you think would help this project.
+ </p>
+</div><h3 id="What_is_Tribes">What is Tribes</h3><div class="text">
+ <p>
+ Tribes is a messaging framework with group communication abilities. Tribes allows you to send and receive
+ messages over a network, it also allows for dynamic discovery of other nodes in the network.<br>
+ And that is the short story, it really is as simple as that. What makes Tribes useful and unique will be
+ described in the section below.<br>
+ </p>
+ <p>
+ The Tribes module was started early 2006 and a small part of the code base comes from the clustering module
+ that has been existing since 2003 or 2004.
+ The current cluster implementation has several short comings and many workarounds were created due
+ to the complexity in group communication. Long story short, what should have been two modules a long time
+ ago, will be now. Tribes takes out the complexity of messaging from the replication module and becomes
+ a fully independent and highly flexible group communication module.<br>
+ </p>
+ <p>
+ In Tomcat the old <code>modules/cluster</code> has now become <code>modules/groupcom</code>(Tribes) and
+ <code>modules/ha</code> (replication). This will allow development to proceed and let the developers
+ focus on the issues they are actually working on rather than getting boggled down in details of a module
+ they are not interested in. The understanding is that both communication and replication are complex enough,
+ and when trying to develop them in the same module, well you know, it becomes a cluster :)<br>
+ </p>
+ <p>
+ Tribes allows for guaranteed messaging, and can be customized in many ways. Why is this important?<br>
+ Well, you as a developer want to know that the messages you are sending are reaching their destination.
+ More than that, if a message doesn't reach its destination, the application on top of Tribes will be notified
+ that the message was never sent, and what node it failed.
+ </p>
+
+</div><h3 id="Why_another_messaging_framework">Why another messaging framework</h3><div class="text">
+ <p>
+ I am a big fan of reusing code and would never dream of developing something if someone else has already
+ done it and it was available to me and the community I try to serve.<br>
+ When I did my research to improve the clustering module I was constantly faced with a few obstacles:<br>
+ 1. The framework wasn't flexible enough<br>
+ 2. The framework was licensed in a way that neither I nor the community could use it<br>
+ 3. Several features that I needed were missing<br>
+ 4. Messaging was guaranteed, but no feedback was reported to me<br>
+ 5. The semantics of my message delivery had to be configured before runtime<br>
+ And the list continues...
+ </p>
+ <p>
+ So I came up with Tribes, to address these issues and other issues that came along.
+ When designing Tribes I wanted to make sure I didn't lose any of the flexibility and
+ delivery semantics that the existing frameworks already delivered. The goal was to create a framework
+ that could do everything that the others already did, but to provide more flexibility for the application
+ developer. In the next section will give you the high level overview of what features tribes offers or will offer.
+ </p>
+</div><h3 id="Feature_Overview">Feature Overview</h3><div class="text">
+ <p>
+ To give you an idea of the feature set I will list it out here.
+ Some of the features are not yet completed, if that is the case they are marked accordingly.
+ </p>
+ <p>
+ <b>Pluggable modules</b><br>
+ Tribes is built using interfaces. Any of the modules or components that are part of Tribes can be swapped out
+ to customize your own Tribes implementation.
+ </p>
+ <p>
+ <b>Guaranteed Messaging</b><br>
+ In the default implementation of Tribes uses TCP or UDP for messaging. TCP already has guaranteed message delivery
+ and flow control built in. I believe that the performance of Java TCP, will outperform an implementation of
+ Java/UDP/flow-control/message guarantee since the logic happens further down the stack. UDP messaging has been added in for
+ sending messages over UDP instead of TCP when desired. The same guarantee scenarios as described below are still available
+ over UDP, however, when a UDP message is lost, it's considered failed.<br>
+ Tribes supports both non-blocking and blocking IO operations. The recommended setting is to use non blocking
+ as it promotes better parallelism when sending and receiving messages. The blocking implementation is available
+ for those platforms where NIO is still a trouble child.
+ </p>
+ <p>
+ <b>Different Guarantee Levels</b><br>
+ There are three different levels of delivery guarantee when a message is sent.
+ </p>
+ <ol>
+ <li>IO Based send guarantee. - fastest, least reliable<br>
+ This means that Tribes considers the message transfer to be successful
+ if the message was sent to the socket send buffer and accepted.<br>
+ On blocking IO, this would be <code>socket.getOutputStream().write(msg)</code><br>
+ On non blocking IO, this would be <code>socketChannel.write()</code>, and the buffer byte buffer gets emptied
+ followed by a <code>socketChannel.read()</code> to ensure the channel still open.
+ The <code>read()</code> has been added since <code>write()</code> will succeed if the connection has been "closed"
+ when using NIO.
+ </li>
+ <li>ACK based. - recommended, guaranteed delivery<br>
+ When the message has been received on a remote node, an ACK is sent back to the sender,
+ indicating that the message was received successfully.
+ </li>
+ <li>SYNC_ACK based. - guaranteed delivery, guaranteed processed, slowest<br>
+ When the message has been received on a remote node, the node will process
+ the message and if the message was processed successfully, an ACK is sent back to the sender
+ indicating that the message was received and processed successfully.
+ If the message was received, but processing it failed, an ACK_FAIL will be sent back
+ to the sender. This is a unique feature that adds an incredible amount value to the application
+ developer. Most frameworks here will tell you that the message was delivered, and the application
+ developer has to build in logic on whether the message was actually processed properly by the application
+ on the remote node. If configured, Tribes will throw an exception when it receives an ACK_FAIL
+ and associate that exception with the member that didn't process the message.
+ </li>
+ </ol>
+ <p>
+ You can of course write even more sophisticated guarantee levels, and some of them will be mentioned later on
+ in the documentation. One mentionable level would be a 2-Phase-Commit, where the remote applications don't receive
+ the message until all nodes have received the message. Sort of like a all-or-nothing protocol.
+ </p>
+ <p>
+ <b>Per Message Delivery Attributes</b><br>
+ Perhaps the feature that makes Tribes stand out from the crowd of group communication frameworks.
+ Tribes enables you to send to decide what delivery semantics a message transfer should have on a per
+ message basis. Meaning, that your messages are not delivered based on some static configuration
+ that remains fixed after the message framework has been started.<br>
+ To give you an example of how powerful this feature is, I'll try to illustrate it with a simple example.
+ Imagine you need to send 10 different messages, you could send them the following way:
+ </p>
+ <div class="codeBox"><pre><code>Message_1 - asynchronous and fast, no guarantee required, fire and forget
+Message_2 - all-or-nothing, either all receivers get it, or none.
+Message_3 - encrypted and SYNC_ACK based
+Message_4 - asynchronous, SYNC_ACK and call back when the message is processed on the remote nodes
+Message_5 - totally ordered, this message should be received in the same order on all nodes that have been
+ send totally ordered
+Message_6 - asynchronous and totally ordered
+Message_7 - RPC message, send a message, wait for all remote nodes to reply before returning
+Message_8 - RPC message, wait for the first reply
+Message_9 - RPC message, asynchronous, don't wait for a reply, collect them via a callback
+Message_10- sent to a member that is not part of this group</code></pre></div>
+ <p>
+ As you can imagine by now, these are just examples. The number of different semantics you can apply on a
+ per-message-basis is almost limitless. Tribes allows you to set up to 28 different on a message
+ and then configure Tribes to what flag results in what action on the message.<br>
+ Imagine a shared transactional cache, probably >90% are reads, and the dirty reads should be completely
+ unordered and delivered as fast as possible. But transactional writes on the other hand, have to
+ be ordered so that no cache gets corrupted. With tribes you would send the write messages totally ordered,
+ while the read messages you simple fire to achieve highest throughput.<br>
+ There are probably better examples on how this powerful feature can be used, so use your imagination and
+ your experience to think of how this could benefit you in your application.
+ </p>
+ <p>
+ <b>Interceptor based message processing</b><br>
+ Tribes uses a customizable interceptor stack to process messages that are sent and received.<br>
+ <i>So what, all frameworks have this!</i><br>
+ Yes, but in Tribes interceptors can react to a message based on the per-message-attributes
+ that are sent runtime. Meaning, that if you add a encryption interceptor that encrypts message
+ you can decide if this interceptor will encrypt all messages, or only certain messages that are decided
+ by the applications running on top of Tribes.<br>
+ This is how Tribes is able to send some messages totally ordered and others fire and forget style
+ like the example above.<br>
+ The number of interceptors that are available will keep growing, and we would appreciate any contributions
+ that you might have.
+ </p>
+ <p>
+ <b>Threadless Interceptor stack</b>
+ The interceptor don't require any separate threads to perform their message manipulation.<br>
+ Messages that are sent will piggy back on the thread that is sending them all the way through transmission.
+ The exception is the <code>MessageDispatchInterceptor</code> that will queue up the message
+ and send it on a separate thread for asynchronous message delivery.
+ Messages received are controlled by a thread pool in the <code>receiver</code> component.<br>
+ The channel object can send a <code>heartbeat()</code> through the interceptor stack to allow
+ for timeouts, cleanup and other events.<br>
+ The <code>MessageDispatchInterceptor</code> is the only interceptor that is configured by default.
+ </p>
+ <p>
+ <b>Parallel Delivery</b><br>
+ Tribes support parallel delivery of messages. Meaning that node_A could send three messages to node_B in
+ parallel. This feature becomes useful when sending messages with different delivery semantics.
+ Otherwise if Message_1 was sent totally ordered, Message_2 would have to wait for that message to complete.<br>
+ Through NIO, Tribes is also able to send a message to several receivers at the same time on the same thread.
+ </p>
+ <p>
+ <b>Silent Member Messaging</b><br>
+ With Tribes you are able to send messages to members that are not in your group.
+ So by default, you can already send messages over a wide area network, even though the dynamic discover
+ module today is limited to local area networks by using multicast for dynamic node discovery.
+ Of course, the membership component will be expanded to support WAN memberships in the future.
+ But this is very useful, when you want to hide members from the rest of the group and only communicate with them
+ </p>
+</div><h3 id="Where_can_I_get_Tribes">Where can I get Tribes</h3><div class="text">
+ <p>
+ Tribes ships as a module with Tomcat, and is released as part of the Apache Tomcat release.
+ </p>
+
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/tribes/membership.html b/web/tomcat/webapps/docs/tribes/membership.html
new file mode 100644
index 0000000..d623ae4
--- /dev/null
+++ b/web/tomcat/webapps/docs/tribes/membership.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tribes - The Tomcat Cluster Communication Module (8.5.73) - Apache Tribes - Membership</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tribes - The Tomcat Cluster Communication Module</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="introduction.html">Tribes Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="faq.html">3) FAQ</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="../api/org/apache/catalina/tribes/package-summary.html">JavaDoc</a></li></ul></div><div><h2>Apache Tribes Development</h2><ul><li><a href="membership.html">Membership</a></li><li><a href="transport.html">Transport</a></li><li><a href="interceptors.html">Interceptors</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tribes - Membership</h2><h3 id="Membership">Membership</h3><div class="text">
+ <p>TODO</p>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/tribes/setup.html b/web/tomcat/webapps/docs/tribes/setup.html
new file mode 100644
index 0000000..949ab60
--- /dev/null
+++ b/web/tomcat/webapps/docs/tribes/setup.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tribes - The Tomcat Cluster Communication Module (8.5.73) - Apache Tribes - Configuration</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tribes - The Tomcat Cluster Communication Module</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="introduction.html">Tribes Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="faq.html">3) FAQ</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="../api/org/apache/catalina/tribes/package-summary.html">JavaDoc</a></li></ul></div><div><h2>Apache Tribes Development</h2><ul><li><a href="membership.html">Membership</a></li><li><a href="transport.html">Transport</a></li><li><a href="interceptors.html">Interceptors</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tribes - Configuration</h2><h3 id="Configuration_Overview">Configuration Overview</h3><div class="text">
+ <p>TODO</p>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/tribes/status.html b/web/tomcat/webapps/docs/tribes/status.html
new file mode 100644
index 0000000..a47d740
--- /dev/null
+++ b/web/tomcat/webapps/docs/tribes/status.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tribes - The Tomcat Cluster Communication Module (8.5.73) - Apache Tribes - Status</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tribes - The Tomcat Cluster Communication Module</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="introduction.html">Tribes Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="faq.html">3) FAQ</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="../api/org/apache/catalina/tribes/package-summary.html">JavaDoc</a></li></ul></div><div><h2>Apache Tribes Development</h2><ul><li><a href="membership.html">Membership</a></li><li><a href="transport.html">Transport</a></li><li><a href="interceptors.html">Interceptors</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tribes - Status</h2><h3 id="Status">Status</h3><div class="text">
+ <p>TODO</p>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/tribes/transport.html b/web/tomcat/webapps/docs/tribes/transport.html
new file mode 100644
index 0000000..8e22922
--- /dev/null
+++ b/web/tomcat/webapps/docs/tribes/transport.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tribes - The Tomcat Cluster Communication Module (8.5.73) - Apache Tribes - Transport</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tribes - The Tomcat Cluster Communication Module</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="introduction.html">Tribes Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="faq.html">3) FAQ</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="../api/org/apache/catalina/tribes/package-summary.html">JavaDoc</a></li></ul></div><div><h2>Apache Tribes Development</h2><ul><li><a href="membership.html">Membership</a></li><li><a href="transport.html">Transport</a></li><li><a href="interceptors.html">Interceptors</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tribes - Transport</h2><h3 id="Transport">Transport</h3><div class="text">
+ <p>TODO</p>
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/virtual-hosting-howto.html b/web/tomcat/webapps/docs/virtual-hosting-howto.html
new file mode 100644
index 0000000..824de48
--- /dev/null
+++ b/web/tomcat/webapps/docs/virtual-hosting-howto.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Virtual Hosting and Tomcat</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Virtual Hosting and Tomcat</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Assumptions">Assumptions</a></li><li><a href="#server.xml">server.xml</a></li><li><a href="#Webapps_Directory">Webapps Directory</a></li><li><a href="#Configuring_Your_Contexts">Configuring Your Contexts</a><ol><li><a href="#General">General</a></li><li><a href="#context.xml_-_approach__1">context.xml - approach #1</a></li><li><a href="#context.xml_-_approach__2">context.xml - approach #2</a></li><li><a href="#Defaults_per_host">Defaults per host</a></li><li><a href="#Further_Information">Further Information</a></li></ol></li></ul>
+</div><h3 id="Assumptions">Assumptions</h3><div class="text">
+ <p>
+ For the sake of this how-to, assume you have a development host with two
+ host names, <code>ren</code> and <code>stimpy</code>. Let's also assume
+ one instance of Tomcat running, so <code>$CATALINA_HOME</code> refers to
+ wherever it's installed, perhaps <code>/usr/local/tomcat</code>.
+ </p>
+ <p>
+ Also, this how-to uses Unix-style path separators and commands; if you're
+ on Windows modify accordingly.
+ </p>
+ </div><h3 id="server.xml">server.xml</h3><div class="text">
+ <p>
+ At the simplest, edit the <a href="config/engine.html">Engine</a> portion
+ of your <code>server.xml</code> file to look like this:
+ </p>
+ <div class="codeBox"><pre><code><Engine name="Catalina" defaultHost="ren">
+ <Host name="ren" appBase="renapps"/>
+ <Host name="stimpy" appBase="stimpyapps"/>
+</Engine></code></pre></div>
+ <p>
+ Note that the directory structures under the appBase for each host should
+ not overlap each other.
+ </p>
+ <p>
+ Consult the configuration documentation for other attributes of the
+ <a href="config/engine.html">Engine</a> and <a href="config/host.html">
+ Host</a> elements.
+ </p>
+ </div><h3 id="Webapps_Directory">Webapps Directory</h3><div class="text">
+ <p>
+ Create directories for each of the virtual hosts:
+ </p>
+ <div class="codeBox"><pre><code>mkdir $CATALINA_HOME/renapps
+mkdir $CATALINA_HOME/stimpyapps</code></pre></div>
+ </div><h3 id="Configuring_Your_Contexts">Configuring Your Contexts</h3><div class="text">
+ <div class="subsection"><h4 id="General">General</h4><div class="text">
+ <p>Contexts are normally located underneath the appBase directory. For
+ example, to deploy the <code>foobar</code> context as a war file in
+ the <code>ren</code> host, use
+ <code>$CATALINA_HOME/renapps/foobar.war</code>. Note that the
+ default or ROOT context for <code>ren</code> would be deployed as
+ <code>$CATALINA_HOME/renapps/ROOT.war</code> (WAR) or
+ <code>$CATALINA_HOME/renapps/ROOT</code> (directory).
+ </p>
+ <p><strong>NOTE: The <code>docBase</code> for a context should never be
+ the same as the <code>appBase</code> for a host.</strong>
+ </p>
+ </div></div>
+ <div class="subsection"><h4 id="context.xml_-_approach__1">context.xml - approach #1</h4><div class="text">
+ <p>
+ Within your Context, create a <code>META-INF</code> directory and then
+ place your Context definition in it in a file named
+ <code>context.xml</code>. i.e.
+ <code>$CATALINA_HOME/renapps/ROOT/META-INF/context.xml</code>
+ This makes deployment easier, particularly if you're distributing a WAR
+ file.
+ </p>
+ </div></div>
+ <div class="subsection"><h4 id="context.xml_-_approach__2">context.xml - approach #2</h4><div class="text">
+ <p>
+ Create a structure under <code>$CATALINA_HOME/conf/Catalina</code>
+ corresponding to your virtual hosts, e.g.:
+ </p>
+ <div class="codeBox"><pre><code>mkdir $CATALINA_HOME/conf/Catalina/ren
+mkdir $CATALINA_HOME/conf/Catalina/stimpy</code></pre></div>
+ <p>
+ Note that the ending directory name "Catalina" represents the
+ <code>name</code> attribute of the
+ <a href="config/engine.html">Engine</a> element as shown above.
+ </p>
+ <p>
+ Now, for your default webapps, add:
+ </p>
+ <div class="codeBox"><pre><code>$CATALINA_HOME/conf/Catalina/ren/ROOT.xml
+$CATALINA_HOME/conf/Catalina/stimpy/ROOT.xml</code></pre></div>
+ <p>
+ If you want to use the Tomcat manager webapp for each host, you'll also
+ need to add it here:
+ </p>
+ <div class="codeBox"><pre><code>cd $CATALINA_HOME/conf/Catalina
+cp localhost/manager.xml ren/
+cp localhost/manager.xml stimpy/</code></pre></div>
+ </div></div>
+ <div class="subsection"><h4 id="Defaults_per_host">Defaults per host</h4><div class="text">
+ <p>
+ You can override the default values found in <code>conf/context.xml</code>
+ and <code>conf/web.xml</code> by specifying the new values in files
+ named <code>context.xml.default</code> and <code>web.xml.default</code>
+ from the host specific xml directory.</p>
+ <p>Following our previous example, you could use
+ <code>$CATALINA_HOME/conf/Catalina/ren/web.xml.default</code>
+ to customize the defaults for all webapps that are deployed in the virtual
+ host named <code>ren</code>.
+ </p>
+ </div></div>
+ <div class="subsection"><h4 id="Further_Information">Further Information</h4><div class="text">
+ <p>
+ Consult the configuration documentation for other attributes of the
+ <a href="config/context.html">Context</a> element.
+ </p>
+ </div></div>
+ </div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/web-socket-howto.html b/web/tomcat/webapps/docs/web-socket-howto.html
new file mode 100644
index 0000000..121f965
--- /dev/null
+++ b/web/tomcat/webapps/docs/web-socket-howto.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - WebSocket How-To</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>WebSocket How-To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Overview">Overview</a></li><li><a href="#Application_development">Application development</a></li><li><a href="#Tomcat_WebSocket_specific_configuration">Tomcat WebSocket specific configuration</a></li></ul>
+</div><h3 id="Overview">Overview</h3><div class="text">
+<p>Tomcat provides support for WebSocket as defined by
+ <a href="https://tools.ietf.org/html/rfc6455">RFC 6455</a>.</p>
+</div><h3 id="Application_development">Application development</h3><div class="text">
+<p>Tomcat implements the Java WebSocket 1.1 API defined by <a href="https://www.jcp.org/en/jsr/detail?id=356">JSR-356</a>.</p>
+
+<p>There are several example applications that demonstrate how the WebSocket API
+ can be used. You will need to look at both the client side <a href="https://github.com/apache/tomcat/tree/8.5.x/webapps/examples/websocket">
+ HTML</a> and the server side <a href="https://github.com/apache/tomcat/tree/8.5.x/webapps/examples/WEB-INF/classes/websocket">
+ code</a>.</p>
+</div><h3 id="Tomcat_WebSocket_specific_configuration">Tomcat WebSocket specific configuration</h3><div class="text">
+
+<p>Tomcat provides a number of Tomcat specific configuration options for
+ WebSocket. It is anticipated that these will be absorbed into the WebSocket
+ specification over time.</p>
+
+<p>The write timeout used when sending WebSocket messages in blocking mode
+ defaults to 20000 milliseconds (20 seconds). This may be changed by setting
+ the property <code>org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT</code>
+ in the user properties collection attached to the WebSocket session. The
+ value assigned to this property should be a <code>Long</code> and represents
+ the timeout to use in milliseconds. For an infinite timeout, use
+ <code>-1</code>.</p>
+
+<p>In addition to the <code>Session.setMaxIdleTimeout(long)</code> method which
+ is part of the Java WebSocket API, Tomcat provides greater control of the
+ timing out the session due to lack of activity. Setting the property
+ <code>org.apache.tomcat.websocket.READ_IDLE_TIMEOUT_MS</code> in the user
+ properties collection attached to the WebSocket session will trigger a
+ session timeout if no WebSocket message is received for the specified number
+ of milliseconds. Setting the property
+ <code>org.apache.tomcat.websocket.WRITE_IDLE_TIMEOUT_MS</code> will trigger a
+ session timeout if no WebSocket message is sent for the specified number of
+ milliseconds. These can be used separately or together, with or without
+ <code>Session.setMaxIdleTimeout(long)</code>. If the associated property is
+ not specified, the read and/or write idle timeout will be applied.</p>
+
+<p>If the application does not define a <code>MessageHandler.Partial</code> for
+ incoming binary messages, any incoming binary messages must be buffered so
+ the entire message can be delivered in a single call to the registered
+ <code>MessageHandler.Whole</code> for binary messages. The default buffer
+ size for binary messages is 8192 bytes. This may be changed for a web
+ application by setting the servlet context initialization parameter
+ <code>org.apache.tomcat.websocket.binaryBufferSize</code> to the desired
+ value in bytes.</p>
+
+<p>If the application does not define a <code>MessageHandler.Partial</code> for
+ incoming text messages, any incoming text messages must be buffered so the
+ entire message can be delivered in a single call to the registered
+ <code>MessageHandler.Whole</code> for text messages. The default buffer size
+ for text messages is 8192 bytes. This may be changed for a web application by
+ setting the servlet context initialization parameter
+ <code>org.apache.tomcat.websocket.textBufferSize</code> to the desired value
+ in bytes.</p>
+
+<p>The Java WebSocket specification 1.0 does not permit programmatic deployment
+ after the first endpoint has started a WebSocket handshake. By default,
+ Tomcat continues to permit additional programmatic deployment. This
+ behavior is controlled by the
+ <code>org.apache.tomcat.websocket.noAddAfterHandshake</code> servlet context
+ initialization parameter. The default may be changed by setting the
+ <code>org.apache.tomcat.websocket.STRICT_SPEC_COMPLIANCE</code> system
+ property to <code>true</code> but any explicit setting on the servlet context
+ will always take priority.</p>
+
+<p>When using the WebSocket client to connect to server endpoints, the timeout
+ for IO operations while establishing the connection is controlled by the
+ <code>userProperties</code> of the provided
+ <code>javax.websocket.ClientEndpointConfig</code>. The property is
+ <code>org.apache.tomcat.websocket.IO_TIMEOUT_MS</code> and is the
+ timeout as a <code>String</code> in milliseconds. The default is 5000 (5
+ seconds).</p>
+
+<p>When using the WebSocket client to connect to secure server endpoints, the
+ client SSL configuration is controlled by the <code>userProperties</code>
+ of the provided <code>javax.websocket.ClientEndpointConfig</code>. The
+ following user properties are supported:</p>
+ <ul>
+ <li><code>org.apache.tomcat.websocket.SSL_CONTEXT</code></li>
+ <li><code>org.apache.tomcat.websocket.SSL_PROTOCOLS</code></li>
+ <li><code>org.apache.tomcat.websocket.SSL_TRUSTSTORE</code></li>
+ <li><code>org.apache.tomcat.websocket.SSL_TRUSTSTORE_PWD</code></li>
+ </ul>
+ <p>The default truststore password is <code>changeit</code>.</p>
+
+<p>If the <code>org.apache.tomcat.websocket.SSL_CONTEXT</code> property is
+ set then the <code>org.apache.tomcat.websocket.SSL_TRUSTSTORE</code> and
+ <code>org.apache.tomcat.websocket.SSL_TRUSTSTORE_PWD</code> properties
+ will be ignored.</p>
+
+<p>For secure server end points, host name verification is enabled by default.
+ To bypass this verification (not recommended), it is necessary to provide a
+ custom <code>SSLContext</code> via the
+ <code>org.apache.tomcat.websocket.SSL_CONTEXT</code> user property. The
+ custom <code>SSLContext</code> must be configured with a custom
+ <code>TrustManager</code> that extends
+ <code>javax.net.ssl.X509ExtendedTrustManager</code>. The desired verification
+ (or lack of verification) can then be controlled by appropriate
+ implementations of the individual abstract methods.</p>
+
+<p>When using the WebSocket client to connect to server endpoints, the number of
+ HTTP redirects that the client will follow is controlled by the
+ <code>userProperties</code> of the provided
+ <code>javax.websocket.ClientEndpointConfig</code>. The property is
+ <ocde>org.apache.tomcat.websocket.MAX_REDIRECTIONS</ocde>. The default value
+ is 20. Redirection support can be disabled by configuring a value of zero.</p>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/websocketapi/index.html b/web/tomcat/webapps/docs/websocketapi/index.html
new file mode 100644
index 0000000..517ac7c
--- /dev/null
+++ b/web/tomcat/webapps/docs/websocketapi/index.html
@@ -0,0 +1,34 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8" />
+ <title>API docs</title>
+</head>
+
+<body>
+
+The WebSocket Javadoc is not installed by default. Download and install
+the "fulldocs" package to get it.
+
+You can also access the javadoc online in the Tomcat
+<a href="https://tomcat.apache.org/tomcat-8.5-doc/">
+documentation bundle</a>.
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/docs/windows-auth-howto.html b/web/tomcat/webapps/docs/windows-auth-howto.html
new file mode 100644
index 0000000..b2fe623
--- /dev/null
+++ b/web/tomcat/webapps/docs/windows-auth-howto.html
@@ -0,0 +1,299 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Windows Authentication How-To</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Windows Authentication How-To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Overview">Overview</a></li><li><a href="#Built-in_Tomcat_support">Built-in Tomcat support</a><ol><li><a href="#Domain_Controller">Domain Controller</a></li><li><a href="#Tomcat_instance_(Windows_server)">Tomcat instance (Windows server)</a></li><li><a href="#Tomcat_instance_(Linux_server)">Tomcat instance (Linux server)</a></li><li><a href="#Web_application">Web application</a></li><li><a href="#Client">Client</a></li><li><a href="#References">References</a></li></ol></li><li><a href="#Third_party_libraries">Third party libraries</a><ol><li><a href="#Waffle">Waffle</a></li><li><a href="#Spring_Security_-_Kerberos_Extension">Spring Security - Kerberos Extension</a></li><li><a href="#Jespa">Jespa</a></li><li><a href="#SPNEGO_AD_project_at_SourceForge">SPNEGO AD project at SourceForge</a></li></ol></li><li><a href="#Reverse_proxies">Reverse proxies</a><ol><li><a href="#Microsoft_IIS">Microsoft IIS</a></li><li><a href="#Apache_httpd">Apache httpd</a></li></ol></li></ul>
+</div><h3 id="Overview">Overview</h3><div class="text">
+<p>Integrated Windows authentication is most frequently used within intranet
+environments since it requires that the server performing the authentication and
+the user being authenticated are part of the same domain. For the user to be
+authenticated automatically, the client machine used by the user must also be
+part of the domain.</p>
+<p>There are several options for implementing integrated Windows authentication
+with Apache Tomcat. They are:</p>
+<ul>
+<li>Built-in Tomcat support.</li>
+<li>Use a third party library such as Waffle.</li>
+<li>Use a reverse proxy that supports Windows authentication to perform the
+authentication step such as IIS or httpd.</li>
+</ul>
+<p>The configuration of each of these options is discussed in the following
+sections.</p>
+</div><h3 id="Built-in_Tomcat_support">Built-in Tomcat support</h3><div class="text">
+<p>Kerberos (the basis for integrated Windows authentication) requires careful
+configuration. If the steps in this guide are followed exactly, then a working
+configuration will result. It is important that the steps below are followed
+exactly. There is very little scope for flexibility in the configuration. From
+the testing to date it is known that:</p>
+<ul>
+<li>The host name used to access the Tomcat server must match the host name in
+the SPN exactly else authentication will fail. A checksum error may be reported
+in the debug logs in this case.</li>
+<li>The client must be of the view that the server is part of the local trusted
+intranet.</li>
+<li>The SPN must be HTTP/<hostname> and it must be exactly the same in all
+the places it is used.</li>
+<li>The port number must not be included in the SPN.</li>
+<li>No more than one SPN may be mapped to a domain user.</li>
+<li>Tomcat must run as the domain account with which the SPN has been associated
+or as domain admin. It is <strong>NOT</strong> recommended to run Tomcat under a
+domain admin user.</li>
+<li>The domain name (<code>DEV.LOCAL</code>) is not case sensitive when used in
+the ktpass command, nor when used in jaas.conf</li>
+<li>The domain must be specified when using the ktpass command</li>
+</ul>
+<p>There are four components to the configuration of the built-in Tomcat
+support for Windows authentication. The domain controller, the server hosting
+Tomcat, the web application wishing to use Windows authentication and the client
+machine. The following sections describe the configuration required for each
+component.</p>
+<p>The names of the three machines used in the configuration examples below are
+win-dc01.dev.local (the domain controller), win-tc01.dev.local (the Tomcat
+instance) and win-pc01.dev.local (client). All are members of the DEV.LOCAL
+domain.</p>
+<p>Note: In order to use the passwords in the steps below, the domain password
+policy had to be relaxed. This is not recommended for production environments.
+</p>
+
+ <div class="subsection"><h4 id="Domain_Controller">Domain Controller</h4><div class="text">
+ <p>These steps assume that the server has already been configured to act as a
+ domain controller. Configuration of a Windows server as a domain controller is
+ outside the scope of this how-to. The steps to configure the domain controller
+ to enable Tomcat to support Windows authentication are as follows:
+ </p>
+ <ul>
+ <li>Create a domain user that will be mapped to the service name used by the
+ Tomcat server. In this how-to, this user is called <code>tc01</code> and has a
+ password of <code>tc01pass</code>.</li>
+ <li>Map the service principal name (SPN) to the user account. SPNs take the
+ form <code>
+ <service class>/<host>:<port>/<service name></code>.
+ The SPN used in this how-to is <code>HTTP/win-tc01.dev.local</code>. To
+ map the user to the SPN, run the following:
+ <div class="codeBox"><pre><code>setspn -A HTTP/win-tc01.dev.local tc01</code></pre></div>
+ </li>
+ <li>Generate the keytab file that the Tomcat server will use to authenticate
+ itself to the domain controller. This file contains the Tomcat private key for
+ the service provider account and should be protected accordingly. To generate
+ the file, run the following command (all on a single line):
+ <div class="codeBox"><pre><code>ktpass /out c:\tomcat.keytab /mapuser tc01@DEV.LOCAL
+ /princ HTTP/win-tc01.dev.local@DEV.LOCAL
+ /pass tc01pass /kvno 0</code></pre></div></li>
+ <li>Create a domain user to be used on the client. In this how-to the domain
+ user is <code>test</code> with a password of <code>testpass</code>.</li>
+ </ul>
+ <p>The above steps have been tested on a domain controller running Windows
+ Server 2008 R2 64-bit Standard using the Windows Server 2003 functional level
+ for both the forest and the domain.
+ </p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Tomcat_instance_(Windows_server)">Tomcat instance (Windows server)</h4><div class="text">
+ <p>These steps assume that Tomcat and a Java 6 JDK/JRE have already been
+ installed and configured and that Tomcat is running as the tc01@DEV.LOCAL
+ user. The steps to configure the Tomcat instance for Windows authentication
+ are as follows:
+ </p>
+ <ul>
+ <li>Copy the <code>tomcat.keytab</code> file created on the domain controller
+ to <code>$CATALINA_BASE/conf/tomcat.keytab</code>.</li>
+ <li>Create the kerberos configuration file
+ <code>$CATALINA_BASE/conf/krb5.ini</code>. The file used in this how-to
+ contained:<div class="codeBox"><pre><code>[libdefaults]
+default_realm = DEV.LOCAL
+default_keytab_name = FILE:c:\apache-tomcat-8.5.x\conf\tomcat.keytab
+default_tkt_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
+default_tgs_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
+forwardable=true
+
+[realms]
+DEV.LOCAL = {
+ kdc = win-dc01.dev.local:88
+}
+
+[domain_realm]
+dev.local= DEV.LOCAL
+.dev.local= DEV.LOCAL</code></pre></div>
+ The location of this file can be changed by setting the
+ <code>java.security.krb5.conf</code> system property.</li>
+ <li>Create the JAAS login configuration file
+ <code>$CATALINA_BASE/conf/jaas.conf</code>. The file used in this how-to
+ contained:<div class="codeBox"><pre><code>com.sun.security.jgss.krb5.initiate {
+ com.sun.security.auth.module.Krb5LoginModule required
+ doNotPrompt=true
+ principal="HTTP/win-tc01.dev.local@DEV.LOCAL"
+ useKeyTab=true
+ keyTab="c:/apache-tomcat-8.5.x/conf/tomcat.keytab"
+ storeKey=true;
+};
+
+com.sun.security.jgss.krb5.accept {
+ com.sun.security.auth.module.Krb5LoginModule required
+ doNotPrompt=true
+ principal="HTTP/win-tc01.dev.local@DEV.LOCAL"
+ useKeyTab=true
+ keyTab="c:/apache-tomcat-8.5.x/conf/tomcat.keytab"
+ storeKey=true;
+};</code></pre></div>
+ The location of this file can be changed by setting the
+ <code>java.security.auth.login.config</code> system property. The LoginModule
+ used is a JVM specific one so ensure that the LoginModule specified matches
+ the JVM being used. The name of the login configuration must match the
+ value used by the <a href="config/valve.html#SPNEGO_Valve">authentication
+ valve</a>.</li>
+ </ul>
+ <p>The SPNEGO authenticator will work with any <a href="config/realm.html">
+ Realm</a> but if used with the JNDI Realm, by default the JNDI Realm will use
+ the user's delegated credentials to connect to the Active Directory.
+ </p>
+ <p>The above steps have been tested on a Tomcat server running Windows Server
+ 2008 R2 64-bit Standard with an Oracle 1.6.0_24 64-bit JDK.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Tomcat_instance_(Linux_server)">Tomcat instance (Linux server)</h4><div class="text">
+ <p>This was tested with:</p>
+ <ul>
+ <li>Java 1.7.0, update 45, 64-bit</li>
+ <li>Ubuntu Server 12.04.3 LTS 64-bit</li>
+ <li>Tomcat 8.0.x (r1546570)</li>
+ </ul>
+ <p>It should work with any Tomcat 8 release although it is recommended that
+ the latest stable release is used.</p>
+ <p>The configuration is the same as for Windows but with the following
+ changes:</p>
+ <ul>
+ <li>The Linux server does not have to be part of the Windows domain.</li>
+ <li>The path to the keytab file in krb5.ini and jaas.conf should be updated
+ to reflect the path to the keytab file on the Linux server using Linux
+ style file paths (e.g. /usr/local/tomcat/...).</li>
+ </ul>
+ </div></div>
+
+ <div class="subsection"><h4 id="Web_application">Web application</h4><div class="text">
+ <p>The web application needs to be configured to the use Tomcat specific
+ authentication method of <code>SPNEGO</code> (rather than BASIC etc.) in
+ web.xml. As with the other authenticators, behaviour can be customised by
+ explicitly configuring the <a href="config/valve.html#SPNEGO_Valve">
+ authentication valve</a> and setting attributes on the Valve.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="Client">Client</h4><div class="text">
+ <p>The client must be configured to use Kerberos authentication. For Internet
+ Explorer this means making sure that the Tomcat instance is in the "Local
+ intranet" security domain and that it is configured (Tools > Internet
+ Options > Advanced) with integrated Windows authentication enabled. Note that
+ this <strong>will not</strong> work if you use the same machine for the client
+ and the Tomcat instance as Internet Explorer will use the unsupported NTLM
+ protocol.</p>
+ </div></div>
+
+ <div class="subsection"><h4 id="References">References</h4><div class="text">
+ <p>Correctly configuring Kerberos authentication can be tricky. The following
+ references may prove helpful. Advice is also always available from the
+ <a href="https://tomcat.apache.org/lists.html#tomcat-users">Tomcat users
+ mailing list</a>.</p>
+ <ol>
+ <li><a href="http://www.adopenstatic.com/cs/blogs/ken/archive/2006/10/19/512.aspx">
+ IIS and Kerberos</a></li>
+ <li><a href="http://spnego.sourceforge.net/index.html">
+ SPNEGO project at SourceForge</a></li>
+ <li><a href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/jgss/tutorials/index.html">
+ Oracle Java GSS-API tutorial (Java 7)</a></li>
+ <li><a href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/jgss/tutorials/Troubleshooting.html">
+ Oracle Java GSS-API tutorial - Troubleshooting (Java 7)</a></li>
+ <li><a href="https://cwiki.apache.org/confluence/display/GMOxDOC21/Using+SPNEGO+in+Geronimo#UsingSPNEGOinGeronimo-SettinguptheDomainControllerMachine">
+ Geronimo configuration for Windows authentication</a></li>
+ <li><a href="http://blogs.msdn.com/b/openspecification/archive/2010/11/17/encryption-type-selection-in-kerberos-exchanges.aspx">
+ Encryption Selection in Kerberos Exchanges</a></li>
+ <li><a href="http://support.microsoft.com/kb/977321">Supported Kerberos Cipher
+ Suites</a></li>
+ </ol>
+ </div></div>
+
+</div><h3 id="Third_party_libraries">Third party libraries</h3><div class="text">
+
+ <div class="subsection"><h4 id="Waffle">Waffle</h4><div class="text">
+ <p>Full details of this solution can be found through the
+ <a href="http://waffle.codeplex.com/" rel="nofollow">Waffle web site</a>. The
+ key features are:</p>
+ <ul>
+ <li>Drop-in solution</li>
+ <li>Simple configuration (no JAAS or Kerberos keytab configuration required)
+ </li>
+ <li>Uses a native library</li>
+ </ul>
+ </div></div>
+
+ <div class="subsection"><h4 id="Spring_Security_-_Kerberos_Extension">Spring Security - Kerberos Extension</h4><div class="text">
+ <p>Full details of this solution can be found through the
+ <a href="http://static.springsource.org/spring-security/site/extensions/krb/index.html" rel="nofollow"> Kerberos extension web site</a>. The key features are:</p>
+ <ul>
+ <li>Extension to Spring Security</li>
+ <li>Requires a Kerberos keytab file to be generated</li>
+ <li>Pure Java solution</li>
+ </ul>
+ </div></div>
+
+ <div class="subsection"><h4 id="Jespa">Jespa</h4><div class="text">
+ <p>Full details of this solution can be found through the
+ <a href="http://www.ioplex.com/" rel="nofollow">project web site.</a> The key
+ features are:</p>
+ <ul>
+ <li>Pure Java solution</li>
+ <li>Advanced Active Directory integration</li>
+ </ul>
+ </div></div>
+
+ <div class="subsection"><h4 id="SPNEGO_AD_project_at_SourceForge">SPNEGO AD project at SourceForge</h4><div class="text">
+ <p>Full details of this solution can be found through the
+ <a href="http://tomcatspnegoad.sourceforge.net/" rel="nofollow">project
+ site</a>. The key features are:</p>
+ <ul>
+ <li>Pure Java solution</li>
+ <li>SPNEGO/Kerberos Authenticator</li>
+ <li>Active Directory Realm</li>
+ </ul>
+ </div></div>
+</div><h3 id="Reverse_proxies">Reverse proxies</h3><div class="text">
+
+ <div class="subsection"><h4 id="Microsoft_IIS">Microsoft IIS</h4><div class="text">
+ <p>There are three steps to configuring IIS to provide Windows authentication.
+ They are:</p>
+ <ol>
+ <li>Configure IIS as a reverse proxy for Tomcat (see the
+ <a href="https://tomcat.apache.org/connectors-doc/webserver_howto/iis.html">
+ IIS Web Server How-To)</a>.</li>
+ <li>Configure IIS to use Windows authentication</li>
+ <li>Configure Tomcat to use the authentication user information from IIS by
+ setting the tomcatAuthentication attribute on the <a href="config/ajp.html">
+ AJP connector</a> to <code>false</code>. Alternatively, set the
+ tomcatAuthorization attribute to <code>true</code> to allow IIS to
+ authenticate, while Tomcat performs the authorization.</li>
+ </ol>
+ </div></div>
+
+ <div class="subsection"><h4 id="Apache_httpd">Apache httpd</h4><div class="text">
+ <p>Apache httpd does not support Windows authentication out of the box but
+ there are a number of third-party modules that can be used. These include:</p>
+ <ol>
+ <li><a href="http://sourceforge.net/projects/mod-auth-sspi/" rel="nofollow">mod_auth_sspi</a> for use on Windows platforms.</li>
+ <li><a href="http://adldap.sourceforge.net/wiki/doku.php?id=mod_auth_ntlm_winbind" rel="nofollow">mod_auth_ntlm_winbind</a> for non-Windows platforms. Known to
+ work with httpd 2.0.x on 32-bit platforms. Some users have reported stability
+ issues with both httpd 2.2.x builds and 64-bit Linux builds.</li>
+ </ol>
+ <p>There are three steps to configuring httpd to provide Windows
+ authentication. They are:</p>
+ <ol>
+ <li>Configure httpd as a reverse proxy for Tomcat (see the
+ <a href="https://tomcat.apache.org/connectors-doc/webserver_howto/apache.html">
+ Apache httpd Web Server How-To)</a>.</li>
+ <li>Configure httpd to use Windows authentication</li>
+ <li>Configure Tomcat to use the authentication user information from httpd by
+ setting the tomcatAuthentication attribute on the <a href="config/ajp.html">
+ AJP connector</a> to <code>false</code>.</li>
+ </ol>
+ </div></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/docs/windows-service-howto.html b/web/tomcat/webapps/docs/windows-service-howto.html
new file mode 100644
index 0000000..49574ed
--- /dev/null
+++ b/web/tomcat/webapps/docs/windows-service-howto.html
@@ -0,0 +1,449 @@
+<!DOCTYPE html SYSTEM "about:legacy-compat">
+<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 8 (8.5.73) - Windows Service How-To</title><meta name="author" content="Mladen Turk"></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="https://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="https://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 8</h1><div class="versionInfo">
+ Version 8.5.73,
+ <time datetime="2021-11-11">Nov 11 2021</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="https://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="mbeans-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet 4.0 Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="jaspicapi/index.html">JASPIC 1.1 Javadocs</a></li><li><a href="annotationapi/index.html">Common Annotations 1.2 Javadocs</a></li><li><a href="https://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="https://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Windows Service How-To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text">
+<ul><li><a href="#Tomcat_service_application">Tomcat service application</a></li><li><a href="#Tomcat_monitor_application">Tomcat monitor application</a></li><li><a href="#Command_line_arguments">Command line arguments</a></li><li><a href="#Command_line_parameters">Command line parameters</a></li><li><a href="#Installing_services">Installing services</a></li><li><a href="#Updating_services">Updating services</a></li><li><a href="#Removing_services">Removing services</a></li><li><a href="#Debugging_services">Debugging services</a></li><li><a href="#Multiple_Instances">Multiple Instances</a></li></ul>
+</div><h3 id="Tomcat_service_application">Tomcat service application</h3><div class="text">
+<p>
+ <b>Tomcat8</b> is a service application for running Tomcat
+ 8 as a Windows service.
+</p>
+</div><h3 id="Tomcat_monitor_application">Tomcat monitor application</h3><div class="text">
+<p>
+ <b>Tomcat8w</b> is a GUI application for monitoring and
+ configuring Tomcat services.
+</p>
+ <p>The available command line options are:</p>
+
+ <table class="defaultTable">
+ <tr><td><b>//ES//</b></td>
+ <td>Edit service configuration</td>
+ <td>This is the default operation. It is called if the no option is
+ provided but the executable is renamed to <b>servicenameW.exe</b></td>
+ </tr>
+ <tr><td><b>//MS//</b></td>
+ <td>Monitor service</td>
+ <td>Put the icon in the system tray</td>
+ </tr>
+ </table>
+
+</div><h3 id="Command_line_arguments">Command line arguments</h3><div class="text">
+<p>
+ Each command line directive is in the form of <b>//XX//ServiceName</b>
+</p>
+ <p>The available command line options are:</p>
+
+ <table class="defaultTable">
+ <tr><td><b>//TS//</b></td>
+ <td>Run the service as console application</td>
+ <td>This is the default operation. It is called if the no option is
+ provided. The ServiceName is the name of the executable without
+ exe suffix, meaning Tomcat8</td>
+ </tr>
+ <tr><td><b>//RS//</b></td>
+ <td>Run the service</td>
+ <td>Called only from ServiceManager</td>
+ </tr>
+ <tr><td><b>//SS//</b></td>
+ <td>Stop the service</td>
+ <td></td>
+ </tr>
+ <tr><td><b>//US//</b></td>
+ <td>Update service parameters</td>
+ <td></td>
+ </tr>
+ <tr><td><b>//IS//</b></td>
+ <td>Install service</td>
+ <td></td>
+ </tr>
+ <tr><td><b>//DS//</b></td>
+ <td>Delete service</td>
+ <td>Stops the service if running</td>
+ </tr>
+ </table>
+
+</div><h3 id="Command_line_parameters">Command line parameters</h3><div class="text">
+<p>
+ Each command line parameter is prefixed with <b>--</b>. If the command line
+ parameter is prefixed with <b>++</b> then it's value will be appended to the
+ existing option.
+ If the environment variable with the same name as command line parameter but
+ prefixed with <code>PR_</code> exists it will take precedence.
+ For example:</p>
+<div class="codeBox"><pre><code>set PR_CLASSPATH=xx.jar</code></pre></div>
+
+<p>is equivalent to providing</p>
+<div class="codeBox"><pre><code>--Classpath=xx.jar</code></pre></div>
+<p> as command line parameter.</p>
+
+ <table class="defaultTable">
+ <tr>
+ <th>ParameterName</th>
+ <th>Default</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>--Description</td>
+ <td></td>
+ <td>Service name description (maximum 1024 characters)</td>
+ </tr>
+ <tr>
+ <td>--DisplayName</td>
+ <td>ServiceName</td>
+ <td>Service display name</td>
+ </tr>
+ <tr>
+ <td>--Install</td>
+ <td>procrun.exe //RS//ServiceName</td>
+ <td>Install image</td>
+ </tr>
+ <tr>
+ <td>--Startup</td>
+ <td>manual</td>
+ <td>Service startup mode can be either <b>auto</b> or <b>manual</b></td>
+ </tr>
+ <tr>
+ <td>--DependsOn</td>
+ <td></td>
+ <td>List of services that this service depend on. Dependent services
+ are separated using either <b>#</b> or <b>;</b> characters</td>
+ </tr>
+ <tr>
+ <td>--Environment</td>
+ <td></td>
+ <td>List of environment variables that will be provided to the service
+ in the form <b>key=value</b>. They are separated using either
+ <b>#</b> or <b>;</b> characters. If you need to use either the <b>#</b>
+ or <b>;</b> character within a value then the entire value must be
+ enclosed inside single quotes.</td>
+ </tr>
+ <tr>
+ <td>--User</td>
+ <td></td>
+ <td>User account used for running executable. It is used only for
+ StartMode <b>java</b> or <b>exe</b> and enables running applications
+ as service under account without LogonAsService privilege.</td>
+ </tr>
+ <tr>
+ <td>--Password</td>
+ <td></td>
+ <td>Password for user account set by --User parameter</td>
+ </tr>
+ <tr>
+ <td>--JavaHome</td>
+ <td>JAVA_HOME</td>
+ <td>Set a different JAVA_HOME than defined by JAVA_HOME environment
+ variable</td>
+ </tr>
+ <tr>
+ <td>--Jvm</td>
+ <td>auto</td>
+ <td>Use either <b>auto</b> (i.e. find the JVM from the Windows registry)
+ or specify the full path to the <b>jvm.dll</b>.
+ You can use the environment variable expansion here.</td>
+ </tr>
+ <tr>
+ <td>--JvmOptions</td>
+ <td>-Xrs</td>
+ <td>List of options in the form of <b>-D</b> or <b>-X</b> that will be
+ passed to the JVM. The options are separated using either
+ <b>#</b> or <b>;</b> characters. If you need to embed either <b>#</b> or
+ <b>;</b> characters, put them inside single quotes. (Not used in
+ <b>exe</b> mode.)</td>
+ </tr>
+ <tr>
+ <td>--JvmOptions9</td>
+ <td></td>
+ <td>List of options in the form of <b>-D</b> or <b>-X</b> that will be
+ passed to the JVM when running on Java 9 or later. The options are
+ separated using either <b>#</b> or <b>;</b> characters. If you need to
+ embed either <b>#</b> or <b>;</b> characters, put them inside single
+ quotes. (Not used in <b>exe</b> mode.)</td>
+ </tr>
+ <tr>
+ <td>--Classpath</td>
+ <td></td>
+ <td>Set the Java classpath. (Not used in <b>exe</b> mode.)</td>
+ </tr>
+ <tr>
+ <td>--JvmMs</td>
+ <td></td>
+ <td>Initial memory pool size in MB. (Not used in <b>exe</b> mode.)</td>
+ </tr>
+ <tr>
+ <td>--JvmMx</td>
+ <td></td>
+ <td>Maximum memory pool size in MB. (Not used in <b>exe</b> mode.)</td>
+ </tr>
+ <tr>
+ <td>--JvmSs</td>
+ <td></td>
+ <td>Thread stack size in KB. (Not used in <b>exe</b> mode.)</td>
+ </tr>
+ <tr>
+ <td>--StartMode</td>
+ <td></td>
+ <td>One of <b>jvm</b>, <b>Java</b> or <b>exe</b>. The modes are:
+ <ul>
+ <li>jvm - start Java in-process. Depends on jvm.dll, see <b>--Jvm</b>.</li>
+ <li>Java - same as exe, but automatically uses the default Java
+ executable, i.e. %JAVA_HOME%\bin\java.exe. Make sure JAVA_HOME is set
+ correctly, or use --JavaHome to provide the correct location.
+ If neither is set, procrun will try to find the default JDK (not JRE)
+ from the Windows registry.</li>
+ <li>exe - run the image as a separate process</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>--StartImage</td>
+ <td></td>
+ <td>Executable that will be run. Only applies to <b>exe</b> mode.</td>
+ </tr>
+ <tr>
+ <td>--StartPath</td>
+ <td></td>
+ <td>Working path for the start image executable.</td>
+ </tr>
+ <tr>
+ <td>--StartClass</td>
+ <td>Main</td>
+ <td>Class that contains the startup method. Applies to the <b>jvm</b> and
+ <b>Java</b> modes. (Not used in <b>exe</b> mode.) </td>
+ </tr>
+ <tr>
+ <td>--StartMethod</td>
+ <td>main</td>
+ <td>Method name if differs then main</td>
+ </tr>
+ <tr>
+ <td>--StartParams</td>
+ <td></td>
+ <td>List of parameters that will be passed to either StartImage or
+ StartClass. Parameters are separated using either <b>#</b> or
+ <b>;</b> character.</td>
+ </tr>
+ <tr>
+ <td>--StopMode</td>
+ <td></td>
+ <td>One of <b>jvm</b>, <b>Java</b> or <b>exe</b>. See <b>--StartMode</b>
+ for further details. </td>
+ </tr>
+ <tr>
+ <td>--StopImage</td>
+ <td></td>
+ <td>Executable that will be run on Stop service signal. Only applies to
+ <b>exe</b> mode.</td>
+ </tr>
+ <tr>
+ <td>--StopPath</td>
+ <td></td>
+ <td>Working path for the stop image executable. Does not apply to <b>jvm</b>
+ mode.</td>
+ </tr>
+ <tr>
+ <td>--StopClass</td>
+ <td>Main</td>
+ <td>Class that will be used on Stop service signal. Applies to the
+ <b>jvm</b> and <b>Java</b> modes. </td>
+ </tr>
+ <tr>
+ <td>--StopMethod</td>
+ <td>main</td>
+ <td>Method name if differs then main</td>
+ </tr>
+ <tr>
+ <td>--StopParams</td>
+ <td></td>
+ <td>List of parameters that will be passed to either StopImage or
+ StopClass. Parameters are separated using either <b>#</b> or
+ <b>;</b> character.</td>
+ </tr>
+ <tr>
+ <td>--StopTimeout</td>
+ <td>No Timeout</td>
+ <td>Defines the timeout in seconds that procrun waits for service to
+ exit gracefully.</td>
+ </tr>
+ <tr>
+ <td>--LogPath</td>
+ <td>%SystemRoot%\System32\LogFiles\Apache</td>
+ <td>Defines the path for logging. Creates the directory if necessary.</td>
+ </tr>
+ <tr>
+ <td>--LogPrefix</td>
+ <td>commons-daemon</td>
+ <td>Defines the service log filename prefix. The log file is created in the
+ LogPath directory with <code>.YEAR-MONTH-DAY.log</code> suffix</td>
+ </tr>
+ <tr>
+ <td>--LogLevel</td>
+ <td>Info</td>
+ <td>Defines the logging level and can be either <b>Error</b>,
+ <b>Info</b>, <b>Warn</b> or <b>Debug</b>. (Case insensitive).</td>
+ </tr>
+ <tr>
+ <td>--StdOutput</td>
+ <td></td>
+ <td>Redirected stdout filename.
+ If named <b>auto</b> then file is created inside <b>LogPath</b> with the
+ name <b>service-stdout.YEAR-MONTH-DAY.log</b>.</td>
+ </tr>
+ <tr>
+ <td>--StdError</td>
+ <td></td>
+ <td>Redirected stderr filename.
+ If named <b>auto</b> then file is created inside <b>LogPath</b> with the
+ name <b>service-stderr.YEAR-MONTH-DAY.log</b>.</td>
+ </tr>
+ <tr>
+ <td>--PidFile</td>
+ <td></td>
+ <td>Defines the file name for storing the running process id. Actual file is
+ created in the <b>LogPath</b> directory</td>
+ </tr>
+ </table>
+
+</div><h3 id="Installing_services">Installing services</h3><div class="text">
+<p>
+The safest way to manually install the service is to use the provided
+<b>service.bat</b> script. Administrator privileges are required to run this
+script. If necessary, you can use the <code>/user</code> switch to specify
+a user to use for the installation of the service.
+</p>
+<p>
+<strong>NOTE:</strong> If User Account Control (UAC) is enabled you will be
+asked for additional privileges when 'Tomcat8.exe' is launched by
+the script.<br>
+If you want to pass additional options to service installer as
+<code>PR_*</code> environment variables, you have to either configure them
+globally in OS, or launch the program that sets them with elevated privileges
+(e.g. right-click on cmd.exe and select "Run as administrator"; on Windows 8
+(or later) or Windows Server 2012 (or later), you can open an elevated command
+prompt for the current directory from the Explorer
+by clicking on the "File" menu bar). See issue <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=56143">56143</a> for details.
+</p>
+
+<div class="codeBox"><pre><code>Install the service named 'Tomcat8'
+C:\> service.bat install</code></pre></div>
+
+<p>There is a 2nd optional parameter that lets you specify the name of the
+service, as displayed in Windows services.</p>
+
+<div class="codeBox"><pre><code>Install the service named 'MyService'
+C:\> service.bat install MyService</code></pre></div>
+
+<p>When installing the service with a non-default name,
+tomcat8.exe and tomcat8w.exe may be renamed to
+match the chosen service name. To do this, use the <code>--rename</code>
+option.</p>
+
+<div class="codeBox"><pre><code>Install the service named 'MyService' with renaming
+C:\> service.bat install MyService --rename</code></pre></div>
+
+<p>
+If using tomcat8.exe, you need to use the <b>//IS//</b> parameter.</p>
+
+<div class="codeBox"><pre><code>Install the service named 'Tomcat8'
+C:\> tomcat8 //IS//Tomcat8 --DisplayName="Apache Tomcat 8" ^
+ --Install="C:\Program Files\Tomcat\bin\tomcat8.exe" --Jvm=auto ^
+ --StartMode=jvm --StopMode=jvm ^
+ --StartClass=org.apache.catalina.startup.Bootstrap --StartParams=start ^
+ --StopClass=org.apache.catalina.startup.Bootstrap --StopParams=stop</code></pre></div>
+
+</div><h3 id="Updating_services">Updating services</h3><div class="text">
+<p>
+To update the service parameters, you need to use the <b>//US//</b> parameter.
+</p>
+
+<div class="codeBox"><pre><code>Update the service named 'Tomcat8'
+C:\> tomcat8 //US//Tomcat8 --Description="Apache Tomcat Server - https://tomcat.apache.org/ " ^
+ --Startup=auto --Classpath=%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\bin\bootstrap.jar</code></pre></div>
+
+<p>If you gave the service an optional name, you need to specify it like this:
+</p>
+
+<div class="codeBox"><pre><code>Update the service named 'MyService'
+C:\> tomcat8 //US//MyService --Description="Apache Tomcat Server - https://tomcat.apache.org/ " ^
+ --Startup=auto --Classpath=%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\bin\bootstrap.jar</code></pre></div>
+
+</div><h3 id="Removing_services">Removing services</h3><div class="text">
+<p>
+To remove the service, you need to use the <b>//DS//</b> parameter.<br>
+If the service is running it will be stopped and then deleted.</p>
+
+<div class="codeBox"><pre><code>Remove the service named 'Tomcat8'
+C:\> tomcat8 //DS//Tomcat8</code></pre></div>
+
+<p>If you gave the service an optional name, you need to specify it like this:
+</p>
+
+<div class="codeBox"><pre><code>Remove the service named 'MyService'
+C:\> tomcat8 //DS//MyService</code></pre></div>
+
+</div><h3 id="Debugging_services">Debugging services</h3><div class="text">
+<p>
+To run the service in console mode, you need to use the <b>//TS//</b> parameter.
+The service shutdown can be initiated by pressing <b>CTRL+C</b> or
+<b>CTRL+BREAK</b>.
+If you rename the tomcat8.exe to testservice.exe then you can just execute the
+testservice.exe and this command mode will be executed by default.</p>
+
+<div class="codeBox"><pre><code>Run the service named 'Tomcat8' in console mode
+C:\> tomcat8 //TS//Tomcat8 [additional arguments]
+Or simply execute:
+C:\> tomcat8</code></pre></div>
+
+</div><h3 id="Multiple_Instances">Multiple Instances</h3><div class="text">
+<p>
+Tomcat supports installation of multiple instances. You can have a single
+installation of Tomcat with multiple instances running on different IP/port
+combinations, or multiple Tomcat versions, each running one or more instances on
+different IP/ports.</p>
+<p>
+Each instance folder will need the following structure:
+</p>
+<ul>
+<li>conf</li>
+<li>logs</li>
+<li>temp</li>
+<li>webapps</li>
+<li>work</li>
+</ul>
+<p>
+At a minimum, conf should contain a copy of the following files from
+CATALINA_HOME\conf\. Any files not copied and edited, will be picked up by
+default from CATALINA_HOME\conf, i.e. CATALINA_BASE\conf files override defaults
+from CATALINA_HOME\conf.</p>
+<ul>
+<li>server.xml</li>
+<li>web.xml</li>
+</ul>
+<p>
+You must edit CATALINA_BASE\conf\server.xml to specify a unique IP/port for the
+instance to listen on. Find the line that contains
+<code><Connector port="8080" ...</code> and add an address attribute and/or
+update the port number so as to specify a unique IP/port combination.</p>
+<p>
+To install an instance, first set the CATALINA_HOME environment variable to the
+name of the Tomcat installation directory. Then create a second environment
+variable CATALINA_BASE and point this to the instance folder. Then run
+"service.bat install" command specifying a service name.</p>
+
+<div class="codeBox"><pre><code>set CATALINA_HOME=c:\tomcat_8
+set CATALINA_BASE=c:\tomcat_8\instances\instance1
+service.bat install instance1</code></pre></div>
+
+<p>
+To modify the service settings, you can run <b>tomcat8w //ES//instance1</b>.
+</p>
+<p>
+For additional instances, create additional instance folder, update the
+CATALINA_BASE environment variable, and run the "service.bat install" again.</p>
+
+<div class="codeBox"><pre><code>set CATALINA_BASE=c:\tomcat_8\instances\instance2
+service.bat install instance2</code></pre></div>
+
+</div></div></div></div></div><footer><div id="footer">
+ Copyright © 1999-2021, The Apache Software Foundation
+ </div></footer></div></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/META-INF/context.xml b/web/tomcat/webapps/examples/META-INF/context.xml
new file mode 100644
index 0000000..b6c932d
--- /dev/null
+++ b/web/tomcat/webapps/examples/META-INF/context.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Context>
+ <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
+ sameSiteCookies="strict" />
+</Context>
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/CookieExample.class b/web/tomcat/webapps/examples/WEB-INF/classes/CookieExample.class
new file mode 100644
index 0000000..889a7ff
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/CookieExample.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/CookieExample.java b/web/tomcat/webapps/examples/WEB-INF/classes/CookieExample.java
new file mode 100644
index 0000000..afbf3e7
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/CookieExample.java
@@ -0,0 +1,140 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ResourceBundle;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import util.CookieFilter;
+import util.HTMLFilter;
+
+/**
+ * Example servlet showing request headers
+ *
+ * @author James Duncan Davidson <duncan@eng.sun.com>
+ */
+
+public class CookieExample extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void doGet(HttpServletRequest request,
+ HttpServletResponse response)
+ throws IOException, ServletException
+ {
+ ResourceBundle rb = ResourceBundle.getBundle("LocalStrings",request.getLocale());
+
+ String cookieName = request.getParameter("cookiename");
+ String cookieValue = request.getParameter("cookievalue");
+ Cookie aCookie = null;
+ if (cookieName != null && cookieValue != null) {
+ aCookie = new Cookie(cookieName, cookieValue);
+ aCookie.setPath(request.getContextPath() + "/");
+ response.addCookie(aCookie);
+ }
+
+ response.setContentType("text/html");
+ response.setCharacterEncoding("UTF-8");
+
+ PrintWriter out = response.getWriter();
+ out.println("<!DOCTYPE html><html>");
+ out.println("<head>");
+ out.println("<meta charset=\"UTF-8\" />");
+
+ String title = rb.getString("cookies.title");
+ out.println("<title>" + title + "</title>");
+ out.println("</head>");
+ out.println("<body bgcolor=\"white\">");
+
+ // relative links
+
+ // XXX
+ // making these absolute till we work out the
+ // addition of a PathInfo issue
+
+ out.println("<a href=\"../cookies.html\">");
+ out.println("<img src=\"../images/code.gif\" height=24 " +
+ "width=24 align=right border=0 alt=\"view code\"></a>");
+ out.println("<a href=\"../index.html\">");
+ out.println("<img src=\"../images/return.gif\" height=24 " +
+ "width=24 align=right border=0 alt=\"return\"></a>");
+
+ out.println("<h3>" + title + "</h3>");
+
+ Cookie[] cookies = request.getCookies();
+ if ((cookies != null) && (cookies.length > 0)) {
+ HttpSession session = request.getSession(false);
+ String sessionId = null;
+ if (session != null) {
+ sessionId = session.getId();
+ }
+ out.println(rb.getString("cookies.cookies") + "<br>");
+ for (Cookie cookie : cookies) {
+ String cName = cookie.getName();
+ String cValue = cookie.getValue();
+ out.print("Cookie Name: " + HTMLFilter.filter(cName) + "<br>");
+ out.println(" Cookie Value: "
+ + HTMLFilter.filter(CookieFilter.filter(cName, cValue, sessionId))
+ + "<br><br>");
+ }
+ } else {
+ out.println(rb.getString("cookies.no-cookies"));
+ }
+
+ if (aCookie != null) {
+ out.println("<P>");
+ out.println(rb.getString("cookies.set") + "<br>");
+ out.print(rb.getString("cookies.name") + " "
+ + HTMLFilter.filter(cookieName) + "<br>");
+ out.print(rb.getString("cookies.value") + " "
+ + HTMLFilter.filter(cookieValue));
+ }
+
+ out.println("<P>");
+ out.println(rb.getString("cookies.make-cookie") + "<br>");
+ out.print("<form action=\"");
+ out.println("CookieExample\" method=POST>");
+ out.print(rb.getString("cookies.name") + " ");
+ out.println("<input type=text length=20 name=cookiename><br>");
+ out.print(rb.getString("cookies.value") + " ");
+ out.println("<input type=text length=20 name=cookievalue><br>");
+ out.println("<input type=submit></form>");
+
+
+ out.println("</body>");
+ out.println("</html>");
+ }
+
+ @Override
+ public void doPost(HttpServletRequest request,
+ HttpServletResponse response)
+ throws IOException, ServletException
+ {
+ doGet(request, response);
+ }
+
+}
+
+
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/HelloWorldExample.class b/web/tomcat/webapps/examples/WEB-INF/classes/HelloWorldExample.class
new file mode 100644
index 0000000..4b83e7c
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/HelloWorldExample.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/HelloWorldExample.java b/web/tomcat/webapps/examples/WEB-INF/classes/HelloWorldExample.java
new file mode 100644
index 0000000..4a75a4d
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/HelloWorldExample.java
@@ -0,0 +1,79 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ResourceBundle;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * The simplest possible servlet.
+ *
+ * @author James Duncan Davidson
+ */
+
+public class HelloWorldExample extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void doGet(HttpServletRequest request,
+ HttpServletResponse response)
+ throws IOException, ServletException
+ {
+ ResourceBundle rb =
+ ResourceBundle.getBundle("LocalStrings",request.getLocale());
+ response.setContentType("text/html");
+ response.setCharacterEncoding("UTF-8");
+ PrintWriter out = response.getWriter();
+
+ out.println("<!DOCTYPE html><html>");
+ out.println("<head>");
+ out.println("<meta charset=\"UTF-8\" />");
+
+ String title = rb.getString("helloworld.title");
+
+ out.println("<title>" + title + "</title>");
+ out.println("</head>");
+ out.println("<body bgcolor=\"white\">");
+
+ // note that all links are created to be relative. this
+ // ensures that we can move the web application that this
+ // servlet belongs to a different place in the url
+ // tree and not have any harmful side effects.
+
+ // XXX
+ // making these absolute till we work out the
+ // addition of a PathInfo issue
+
+ out.println("<a href=\"../helloworld.html\">");
+ out.println("<img src=\"../images/code.gif\" height=24 " +
+ "width=24 align=right border=0 alt=\"view code\"></a>");
+ out.println("<a href=\"../index.html\">");
+ out.println("<img src=\"../images/return.gif\" height=24 " +
+ "width=24 align=right border=0 alt=\"return\"></a>");
+ out.println("<h1>" + title + "</h1>");
+ out.println("</body>");
+ out.println("</html>");
+ }
+}
+
+
+
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings.properties b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings.properties
new file mode 100644
index 0000000..2791a66
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings.properties
@@ -0,0 +1,48 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+cookies.cookies=Your browser is sending the following cookies:
+cookies.make-cookie=Create a cookie to send to your browser
+cookies.name=Name:
+cookies.no-cookies=Your browser isn't sending any cookies
+cookies.set=You just sent the following cookie to your browser:
+cookies.title=Cookies Example
+cookies.value=Value:
+
+helloworld.title=Hello World!
+
+requestheader.title=Request Header Example
+
+requestinfo.label.method=Method:
+requestinfo.label.pathinfo=Path Info:
+requestinfo.label.protocol=Protocol:
+requestinfo.label.remoteaddr=Remote Address:
+requestinfo.label.requesturi=Request URI:
+requestinfo.title=Request Information Example
+
+requestparams.firstname=First Name:
+requestparams.lastname=Last Name:
+requestparams.no-params=No Parameters, Please enter some
+requestparams.params-in-req=Parameters in this request:
+requestparams.title=Request Parameters Example
+
+sessions.adddata=Add data to your session
+sessions.created=Created:
+sessions.data=The following data is in your session:
+sessions.dataname=Name of Session Attribute:
+sessions.datavalue=Value of Session Attribute:
+sessions.id=Session ID:
+sessions.lastaccessed=Last Accessed:
+sessions.title=Sessions Example
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_de.properties b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_de.properties
new file mode 100644
index 0000000..697de27
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_de.properties
@@ -0,0 +1,28 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+cookies.make-cookie=Erzeuge ein Cookie um es an deinen Browser zu senden
+cookies.name=Name:
+
+requestheader.title=Request-Header Beispiel
+
+requestinfo.label.protocol=Protokoll:
+requestinfo.label.requesturi=Anfrage-URI:
+
+requestparams.firstname=Vorname:
+requestparams.no-params=Keine Parameter, bitte geben Sie welche ein
+requestparams.title=Beispiel f\u00fcr Anfrageparameter
+
+sessions.title=Sessions-Beispiel
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_es.properties b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_es.properties
new file mode 100644
index 0000000..0cbe29b
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_es.properties
@@ -0,0 +1,48 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+cookies.cookies=Tu navegador est\u00e1 enviando los siguientes cookies:
+cookies.make-cookie=Crea un cookie para enviarlo a tu navegador
+cookies.name=Nombre:
+cookies.no-cookies=Tu navegador no est\u00e1 enviando cookies
+cookies.set=Acabas de enviar a tu navegador estos cookies:
+cookies.title=Ejemplo de Cookies
+cookies.value=Valor:
+
+helloworld.title=Hola Mundo!
+
+requestheader.title=Ejemplo de Cabecera de Requerimiento:
+
+requestinfo.label.method=M\u00e9todo:
+requestinfo.label.pathinfo=Info de Ruta:
+requestinfo.label.protocol=Protocolo:
+requestinfo.label.remoteaddr=Direccion Remota:
+requestinfo.label.requesturi=URI de Requerimiento:
+requestinfo.title=Ejemplo de Informacion de Requerimiento:
+
+requestparams.firstname=Nombre:
+requestparams.lastname=Apellidos:
+requestparams.no-params=No hay p\u00e1rametro. Por favor, usa alguno
+requestparams.params-in-req=Par\u00e1metros en este Request:
+requestparams.title=Ejemplo de solicitud con par\u00e1metros:
+
+sessions.adddata=A\u00f1ade datos a tu sesi\u00f3n:
+sessions.created=Creado:
+sessions.data=Lo siguientes datos est\u00e1n en tu sesi\u00f3n:
+sessions.dataname=Nombre del atributo de sesi\u00f3n:
+sessions.datavalue=Valor del atributo de sesi\u00f3n:
+sessions.id=ID de Sesi\u00f3n:
+sessions.lastaccessed=Ultimo Acceso:
+sessions.title=Ejemplo de Sesiones
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_fr.properties b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_fr.properties
new file mode 100644
index 0000000..f09c641
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_fr.properties
@@ -0,0 +1,48 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+cookies.cookies=Votre navigateur retourne les cookies suivant :
+cookies.make-cookie=Cr\u00e9ation d'un cookie \u00e0 retourner \u00e0 votre navigateur
+cookies.name=Nom :
+cookies.no-cookies=Votre navigateur ne retourne aucun cookie
+cookies.set=Vous venez d'envoyer le cookie suivant \u00e0 votre navigateur :
+cookies.title=Exemple d'utilisation de Cookies
+cookies.value=Valeur :
+
+helloworld.title=Salut le Monde !
+
+requestheader.title=Exemple d'information sur les ent\u00eates de requ\u00eate
+
+requestinfo.label.method=M\u00e9thode :
+requestinfo.label.pathinfo=Info de chemin :
+requestinfo.label.protocol=Protocole :
+requestinfo.label.remoteaddr=Adresse distante :
+requestinfo.label.requesturi=URI de requ\u00eate :
+requestinfo.title=Exemple d'information sur la requ\u00eate
+
+requestparams.firstname=Pr\u00e9nom :
+requestparams.lastname=Nom :
+requestparams.no-params=Pas de param\u00eatre, merci d'en saisir quelques-uns
+requestparams.params-in-req=Param\u00eatres dans la requ\u00eate :
+requestparams.title=Exemple de Requ\u00eate avec Param\u00e8tres
+
+sessions.adddata=Ajouter des donn\u00e9es \u00e0 votre session
+sessions.created=Cr\u00e9e le :
+sessions.data=Les donn\u00e9es existantes dans votre session :
+sessions.dataname=Nom de l'Attribut de Session :
+sessions.datavalue=Valeur de l'Attribut de Session :
+sessions.id=ID de Session :
+sessions.lastaccessed=Dernier acc\u00e8s :
+sessions.title=Exemple de Sessions
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_ja.properties b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_ja.properties
new file mode 100644
index 0000000..8e316c0
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_ja.properties
@@ -0,0 +1,48 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+cookies.cookies=\u3042\u306a\u305f\u306e\u306e\u30d6\u30e9\u30a6\u30b6\u304b\u3089\u6b21\u306eCookie\u304c\u9001\u4fe1\u3055\u308c\u3066\u3044\u307e\u3059\uff1a
+cookies.make-cookie=\u30d6\u30e9\u30a6\u30b6\u3078\u9001\u4fe1\u3059\u308b cookie \u3092\u4f5c\u6210\u3057\u307e\u3059\u3002
+cookies.name=Name:
+cookies.no-cookies=\u3042\u306a\u305f\u306e\u30d6\u30e9\u30a6\u30b6\u306f\u30af\u30c3\u30ad\u30fc\u3092\u9001\u4fe1\u3057\u3066\u3044\u307e\u305b\u3093\u3002
+cookies.set=\u30d6\u30e9\u30a6\u30b6\u306b cookie \u3092\u9001\u4fe1\u3057\u307e\u3057\u305f\u3002
+cookies.title=Cookie \u4f8b
+cookies.value=\u5024\uff1a
+
+helloworld.title=Hello World!
+
+requestheader.title=\u30ea\u30af\u30a8\u30b9\u30c8\u30d8\u30c3\u30c0\u4f8b
+
+requestinfo.label.method=\u30e1\u30bd\u30c3\u30c9\uff1a
+requestinfo.label.pathinfo=\u30d1\u30b9\u60c5\u5831\uff1a
+requestinfo.label.protocol=\u30d7\u30ed\u30c8\u30b3\u30eb\uff1a
+requestinfo.label.remoteaddr=\u30ea\u30e2\u30fc\u30c8\u30a2\u30c9\u30ec\u30b9\uff1a
+requestinfo.label.requesturi=Request URI:
+requestinfo.title=\u30ea\u30af\u30a8\u30b9\u30c8\u60c5\u5831\u4f8b
+
+requestparams.firstname=First Name:
+requestparams.lastname=Last Name:
+requestparams.no-params=\u30d1\u30e9\u30e1\u30fc\u30bf\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u4f55\u304b\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+requestparams.params-in-req=\u3053\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\uff1a
+requestparams.title=\u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u4f8b
+
+sessions.adddata=\u30bb\u30c3\u30b7\u30e7\u30f3\u306b\u30c7\u30fc\u30bf\u3092\u8ffd\u52a0\u3057\u307e\u3059
+sessions.created=\u4f5c\u6210\uff1a
+sessions.data=\u3042\u306a\u305f\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u306b\u306f\u6b21\u306e\u30c7\u30fc\u30bf\u304c\u3042\u308a\u307e\u3059\uff1a
+sessions.dataname=\u30bb\u30c3\u30b7\u30e7\u30f3\u5c5e\u6027\u540d\uff1a
+sessions.datavalue=\u30bb\u30c3\u30b7\u30e7\u30f3\u5c5e\u6027\u306e\u5024\uff1a
+sessions.id=\u30bb\u30c3\u30b7\u30e7\u30f3ID
+sessions.lastaccessed=\u6700\u7d42\u30a2\u30af\u30bb\u30b9\uff1a
+sessions.title=\u30bb\u30c3\u30b7\u30e7\u30f3\u4f8b
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_ko.properties b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_ko.properties
new file mode 100644
index 0000000..d781dce
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_ko.properties
@@ -0,0 +1,48 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+cookies.cookies=\uadc0\ud558\uc758 \ube0c\ub77c\uc6b0\uc800\uac00 \ub2e4\uc74c \ucfe0\ud0a4\ub4e4\uc744 \ubcf4\ub0c5\ub2c8\ub2e4.
+cookies.make-cookie=\uadc0\ud558\uc758 \ube0c\ub77c\uc6b0\uc800\uc5d0 \uc804\uc1a1\ud558\uae30 \uc704\ud55c \ucfe0\ud0a4 \uc0dd\uc131
+cookies.name=\uc774\ub984:
+cookies.no-cookies=\uadc0\ud558\uc758 \ube0c\ub77c\uc6b0\uc800\ub294 \uc5b4\ub5a4 \ucfe0\ud0a4\ub3c4 \uc804\uc1a1\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
+cookies.set=\uadc0\ud558\ub294 \ub2e4\uc74c \ucfe0\ud0a4\ub97c, \uadc0\ud558\uc758 \ube0c\ub77c\uc6b0\uc800\uc5d0 \uc804\uc1a1\ud588\uc2b5\ub2c8\ub2e4.
+cookies.title=\ucfe0\ud0a4\ub4e4\uc758 \uc608\uc81c
+cookies.value=\uac12:
+
+helloworld.title=\uc548\ub155 \uc138\uacc4\uc5ec!
+
+requestheader.title=\uc694\uccad\uc758 \ud5e4\ub354 \uc608\uc81c
+
+requestinfo.label.method=\uba54\uc18c\ub4dc:
+requestinfo.label.pathinfo=\uacbd\ub85c \uc815\ubcf4:
+requestinfo.label.protocol=\ud504\ub85c\ud1a0\ucf5c:
+requestinfo.label.remoteaddr=\uc6d0\uaca9 \uc8fc\uc18c:
+requestinfo.label.requesturi=\uc694\uccad URI:
+requestinfo.title=\uc694\uccad \uc815\ubcf4 \uc608\uc81c
+
+requestparams.firstname=\uc774\ub984:
+requestparams.lastname=\uc131
+requestparams.no-params=\ud30c\ub77c\ubbf8\ud130\ub4e4\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \ud30c\ub77c\ubbf8\ud130\ub4e4\uc744 \uc785\ub825\ud558\uc2ed\uc2dc\uc624.
+requestparams.params-in-req=\uc774 \uc694\uccad\uc758 \ud30c\ub77c\ubbf8\ud130\ub4e4:
+requestparams.title=\uc694\uccad \ud30c\ub77c\ubbf8\ud130\ub4e4\uc758 \uc608\uc81c
+
+sessions.adddata=\uadc0\ud558\uc758 \uc138\uc158\uc5d0 \ub370\uc774\ud130\ub97c \ucd94\uac00
+sessions.created=\uc0dd\uc131\uc2dc\uac04:
+sessions.data=\uadc0\ud558\uc758 \uc138\uc158\uc5d0 \ub2e4\uc74c \ub370\uc774\ud130\uac00 \uc788\uc2b5\ub2c8\ub2e4:
+sessions.dataname=\uc138\uc158 \uc18d\uc131 \uc774\ub984:
+sessions.datavalue=\uc138\uc158 \uc18d\uc131 \uac12:
+sessions.id=\uc138\uc158 ID:
+sessions.lastaccessed=\ucd5c\uc885 \uc811\uadfc \uc2dc\uac04:
+sessions.title=\uc138\uc158\ub4e4\uc758 \uc608\uc81c
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_pt.properties b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_pt.properties
new file mode 100644
index 0000000..b432741
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_pt.properties
@@ -0,0 +1,48 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+cookies.cookies=O se browser esta a enviar os seguintes cookies:
+cookies.make-cookie=Crie um cookie para enviar para o seu browser
+cookies.name=Nome:
+cookies.no-cookies=O seu browser nao esta a enviar nenhuns cookies
+cookies.set=Acabou de enviar o seguinte cookie para o seu browser:
+cookies.title=CExamplo de Cookies
+cookies.value=Valor:
+
+helloworld.title=Ola Mundo!
+
+requestheader.title=Exemplo da Cebeceira do Pedido
+
+requestinfo.label.method=Metodo:
+requestinfo.label.pathinfo=Informacao do Caminho:
+requestinfo.label.protocol=Protocolo:
+requestinfo.label.remoteaddr=Endereco Remoto:
+requestinfo.label.requesturi=URI do Pedido:
+requestinfo.title=Exemplo da Informacao do Pedido
+
+requestparams.firstname=Primeiro Nome:
+requestparams.lastname=Apelido:
+requestparams.no-params=Sem Parametros, Por favor entre alguns
+requestparams.params-in-req=Parametros neste pedido:
+requestparams.title=Examplo de Parametros do Pedido
+
+sessions.adddata=Adicione data a sua sessao
+sessions.created=Criada:
+sessions.data=Os seguintes dados fazem parte da sua sessao:
+sessions.dataname=Nome do atributo da sessao:
+sessions.datavalue=Valor do atributo da Sessao:
+sessions.id=Identificador da Sessao:
+sessions.lastaccessed=Ultima vez acedida:
+sessions.title=Examplo de sessoes
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_ru.properties b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_ru.properties
new file mode 100644
index 0000000..45cc2ae
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_ru.properties
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+requestparams.title=\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_zh_CN.properties b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_zh_CN.properties
new file mode 100644
index 0000000..978234d
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_zh_CN.properties
@@ -0,0 +1,48 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+cookies.cookies=\u4f60\u7684\u6d4f\u89c8\u5668\u6b63\u5728\u53d1\u9001\u4e0b\u9762\u7684cookie\uff1a
+cookies.make-cookie=\u521b\u5efa\u4e00\u4e2a\u53d1\u9001\u5230\u4f60\u7684\u6d4f\u89c8\u5668\u7684cookie
+cookies.name=\u540d.\u79f0:
+cookies.no-cookies=\u4f60\u7684\u6d4f\u89c8\u5668\u672a\u53d1\u9001\u4efb\u4f55cookie
+cookies.set=\u4f60\u521a\u521a\u5c06\u4ee5\u4e0bcookie\u53d1\u9001\u5230\u4f60\u7684\u6d4f\u89c8\u5668\uff1a
+cookies.title=cookie\u793a\u4f8b
+cookies.value=\u503c\uff1a
+
+helloworld.title=\u4f60\u597d\uff0c\u4e16\u754c.
+
+requestheader.title=\u8bf7\u6c42 Header \u793a\u4f8b
+
+requestinfo.label.method=\u65b9\u6cd5\uff1a
+requestinfo.label.pathinfo=\u8def\u5f84\u4fe1\u606f\uff1a
+requestinfo.label.protocol=\u534f\u8bae\uff1a
+requestinfo.label.remoteaddr=\u8fdc\u7a0b\u5730\u5740\uff1a
+requestinfo.label.requesturi=\u8bf7\u6c42 URI (:
+requestinfo.title=\u8bf7\u6c42\u4fe1\u606f\u8303\u4f8b
+
+requestparams.firstname=\u59d3\uff1a
+requestparams.lastname=\u59d3\u6c0f\uff1a
+requestparams.no-params=\u6ca1\u6709\u53c2\u6570\uff0c\u8bf7\u8f93\u5165\u4e00\u4e9b
+requestparams.params-in-req=\u53c2\u6570\u5728\u8bf7\u6c42\u4e2d.
+requestparams.title=\u8bf7\u6c42\u53c2\u6570\u793a\u4f8b
+
+sessions.adddata=\u5c06\u6570\u636e\u6dfb\u52a0\u5230\u4f60\u7684\u4f1a\u8bdd\u4e2d
+sessions.created=\u5df2\u521b\u5efa\u7684\uff1a
+sessions.data=\u4ee5\u4e0b\u6570\u636e\u5728\u60a8\u7684\u4f1a\u8bdd\u4e2d\uff1a
+sessions.dataname=\u4f1a\u8bdd\u5c5e\u6027\u540d\uff1a
+sessions.datavalue=\u4f1a\u8bdd\u5c5e\u6027\u503c\uff1a
+sessions.id=\u4f1a\u8bddID\uff1a
+sessions.lastaccessed=\u6700\u540e\u8bbf\u95ee\uff1a
+sessions.title=\u4f1a\u8bdd.\u793a\u4f8b
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/RequestHeaderExample.class b/web/tomcat/webapps/examples/WEB-INF/classes/RequestHeaderExample.class
new file mode 100644
index 0000000..dba72b6
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/RequestHeaderExample.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/RequestHeaderExample.java b/web/tomcat/webapps/examples/WEB-INF/classes/RequestHeaderExample.java
new file mode 100644
index 0000000..6d8a442
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/RequestHeaderExample.java
@@ -0,0 +1,109 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import util.CookieFilter;
+import util.HTMLFilter;
+
+/**
+ * Example servlet showing request headers
+ *
+ * @author James Duncan Davidson <duncan@eng.sun.com>
+ */
+
+public class RequestHeaderExample extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void doGet(HttpServletRequest request,
+ HttpServletResponse response)
+ throws IOException, ServletException
+ {
+ ResourceBundle rb = ResourceBundle.getBundle("LocalStrings",request.getLocale());
+
+ response.setContentType("text/html");
+ response.setCharacterEncoding("UTF-8");
+
+ PrintWriter out = response.getWriter();
+ out.println("<!DOCTYPE html><html>");
+ out.println("<head>");
+ out.println("<meta charset=\"UTF-8\" />");
+
+ String title = rb.getString("requestheader.title");
+ out.println("<title>" + title + "</title>");
+ out.println("</head>");
+ out.println("<body bgcolor=\"white\">");
+
+ // all links relative
+
+ // XXX
+ // making these absolute till we work out the
+ // addition of a PathInfo issue
+
+ out.println("<a href=\"../reqheaders.html\">");
+ out.println("<img src=\"../images/code.gif\" height=24 " +
+ "width=24 align=right border=0 alt=\"view code\"></a>");
+ out.println("<a href=\"../index.html\">");
+ out.println("<img src=\"../images/return.gif\" height=24 " +
+ "width=24 align=right border=0 alt=\"return\"></a>");
+
+ out.println("<h3>" + title + "</h3>");
+ out.println("<table border=0>");
+ Enumeration<String> e = request.getHeaderNames();
+ while (e.hasMoreElements()) {
+ String headerName = e.nextElement();
+ String headerValue = request.getHeader(headerName);
+ out.println("<tr><td bgcolor=\"#CCCCCC\">");
+ out.println(HTMLFilter.filter(headerName));
+ out.println("</td><td>");
+ if (headerName.toLowerCase(Locale.ENGLISH).contains("cookie")) {
+ HttpSession session = request.getSession(false);
+ String sessionId = null;
+ if (session != null) {
+ sessionId = session.getId();
+ }
+ out.println(HTMLFilter.filter(CookieFilter.filter(headerValue, sessionId)));
+ } else {
+ out.println(HTMLFilter.filter(headerValue));
+ }
+ out.println("</td></tr>");
+ }
+ out.println("</table>");
+ }
+
+ @Override
+ public void doPost(HttpServletRequest request,
+ HttpServletResponse response)
+ throws IOException, ServletException
+ {
+ doGet(request, response);
+ }
+
+}
+
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/RequestInfoExample.class b/web/tomcat/webapps/examples/WEB-INF/classes/RequestInfoExample.class
new file mode 100644
index 0000000..8abd534
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/RequestInfoExample.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/RequestInfoExample.java b/web/tomcat/webapps/examples/WEB-INF/classes/RequestInfoExample.java
new file mode 100644
index 0000000..791e088
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/RequestInfoExample.java
@@ -0,0 +1,118 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ResourceBundle;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import util.HTMLFilter;
+
+/**
+ * Example servlet showing request information.
+ *
+ * @author James Duncan Davidson <duncan@eng.sun.com>
+ */
+
+public class RequestInfoExample extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void doGet(HttpServletRequest request,
+ HttpServletResponse response)
+ throws IOException, ServletException
+ {
+ ResourceBundle rb = ResourceBundle.getBundle("LocalStrings",request.getLocale());
+
+ response.setContentType("text/html");
+ response.setCharacterEncoding("UTF-8");
+
+ PrintWriter out = response.getWriter();
+ out.println("<!DOCTYPE html><html>");
+ out.println("<head>");
+ out.println("<meta charset=\"UTF-8\" />");
+
+ String title = rb.getString("requestinfo.title");
+ out.println("<title>" + title + "</title>");
+ out.println("</head>");
+ out.println("<body bgcolor=\"white\">");
+
+ // img stuff not req'd for source code html showing
+ // all links relative!
+
+ // XXX
+ // making these absolute till we work out the
+ // addition of a PathInfo issue
+
+ out.println("<a href=\"../reqinfo.html\">");
+ out.println("<img src=\"../images/code.gif\" height=24 " +
+ "width=24 align=right border=0 alt=\"view code\"></a>");
+ out.println("<a href=\"../index.html\">");
+ out.println("<img src=\"../images/return.gif\" height=24 " +
+ "width=24 align=right border=0 alt=\"return\"></a>");
+
+ out.println("<h3>" + title + "</h3>");
+ out.println("<table border=0><tr><td>");
+ out.println(rb.getString("requestinfo.label.method"));
+ out.println("</td><td>");
+ out.println(HTMLFilter.filter(request.getMethod()));
+ out.println("</td></tr><tr><td>");
+ out.println(rb.getString("requestinfo.label.requesturi"));
+ out.println("</td><td>");
+ out.println(HTMLFilter.filter(request.getRequestURI()));
+ out.println("</td></tr><tr><td>");
+ out.println(rb.getString("requestinfo.label.protocol"));
+ out.println("</td><td>");
+ out.println(HTMLFilter.filter(request.getProtocol()));
+ out.println("</td></tr><tr><td>");
+ out.println(rb.getString("requestinfo.label.pathinfo"));
+ out.println("</td><td>");
+ out.println(HTMLFilter.filter(request.getPathInfo()));
+ out.println("</td></tr><tr><td>");
+ out.println(rb.getString("requestinfo.label.remoteaddr"));
+ out.println("</td><td>");
+ out.println(HTMLFilter.filter(request.getRemoteAddr()));
+ out.println("</td></tr>");
+
+ String cipherSuite=
+ (String)request.getAttribute("javax.servlet.request.cipher_suite");
+ if(cipherSuite!=null){
+ out.println("<tr><td>");
+ out.println("SSLCipherSuite:");
+ out.println("</td><td>");
+ out.println(HTMLFilter.filter(cipherSuite));
+ out.println("</td></tr>");
+ }
+
+ out.println("</table>");
+ }
+
+ @Override
+ public void doPost(HttpServletRequest request,
+ HttpServletResponse response)
+ throws IOException, ServletException
+ {
+ doGet(request, response);
+ }
+
+}
+
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/RequestParamExample.class b/web/tomcat/webapps/examples/WEB-INF/classes/RequestParamExample.class
new file mode 100644
index 0000000..35ac5c4
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/RequestParamExample.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/RequestParamExample.java b/web/tomcat/webapps/examples/WEB-INF/classes/RequestParamExample.java
new file mode 100644
index 0000000..b5e2dfa
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/RequestParamExample.java
@@ -0,0 +1,111 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ResourceBundle;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import util.HTMLFilter;
+
+/**
+ * Example servlet showing request headers
+ *
+ * @author James Duncan Davidson <duncan@eng.sun.com>
+ */
+
+public class RequestParamExample extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void doGet(HttpServletRequest request,
+ HttpServletResponse response)
+ throws IOException, ServletException
+ {
+ ResourceBundle rb = ResourceBundle.getBundle("LocalStrings",request.getLocale());
+
+ response.setContentType("text/html");
+ response.setCharacterEncoding("UTF-8");
+
+ PrintWriter out = response.getWriter();
+ out.println("<!DOCTYPE html><html>");
+ out.println("<head>");
+ out.println("<meta charset=\"UTF-8\" />");
+
+ String title = rb.getString("requestparams.title");
+ out.println("<title>" + title + "</title>");
+ out.println("</head>");
+ out.println("<body bgcolor=\"white\">");
+
+ // img stuff not req'd for source code html showing
+
+ // all links relative
+
+ // XXX
+ // making these absolute till we work out the
+ // addition of a PathInfo issue
+
+ out.println("<a href=\"../reqparams.html\">");
+ out.println("<img src=\"../images/code.gif\" height=24 " +
+ "width=24 align=right border=0 alt=\"view code\"></a>");
+ out.println("<a href=\"../index.html\">");
+ out.println("<img src=\"../images/return.gif\" height=24 " +
+ "width=24 align=right border=0 alt=\"return\"></a>");
+
+ out.println("<h3>" + title + "</h3>");
+ String firstName = request.getParameter("firstname");
+ String lastName = request.getParameter("lastname");
+ out.println(rb.getString("requestparams.params-in-req") + "<br>");
+ if (firstName != null || lastName != null) {
+ out.println(rb.getString("requestparams.firstname"));
+ out.println(" = " + HTMLFilter.filter(firstName) + "<br>");
+ out.println(rb.getString("requestparams.lastname"));
+ out.println(" = " + HTMLFilter.filter(lastName));
+ } else {
+ out.println(rb.getString("requestparams.no-params"));
+ }
+ out.println("<P>");
+ out.print("<form action=\"");
+ out.print("RequestParamExample\" ");
+ out.println("method=POST>");
+ out.println(rb.getString("requestparams.firstname"));
+ out.println("<input type=text size=20 name=firstname>");
+ out.println("<br>");
+ out.println(rb.getString("requestparams.lastname"));
+ out.println("<input type=text size=20 name=lastname>");
+ out.println("<br>");
+ out.println("<input type=submit>");
+ out.println("</form>");
+
+ out.println("</body>");
+ out.println("</html>");
+ }
+
+ @Override
+ public void doPost(HttpServletRequest request,
+ HttpServletResponse response)
+ throws IOException, ServletException
+ {
+ doGet(request, response);
+ }
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/ServletToJsp.class b/web/tomcat/webapps/examples/WEB-INF/classes/ServletToJsp.class
new file mode 100644
index 0000000..aecdc31
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/ServletToJsp.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/ServletToJsp.java b/web/tomcat/webapps/examples/WEB-INF/classes/ServletToJsp.java
new file mode 100644
index 0000000..53faba2
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/ServletToJsp.java
@@ -0,0 +1,39 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class ServletToJsp extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void doGet (HttpServletRequest request,
+ HttpServletResponse response) {
+
+ try {
+ // Set the attribute and Forward to hello.jsp
+ request.setAttribute ("servletName", "servletToJsp");
+ getServletConfig().getServletContext().getRequestDispatcher(
+ "/jsp/jsptoserv/hello.jsp").forward(request, response);
+ } catch (Exception ex) {
+ ex.printStackTrace ();
+ }
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/SessionExample.class b/web/tomcat/webapps/examples/WEB-INF/classes/SessionExample.class
new file mode 100644
index 0000000..238ae34
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/SessionExample.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/SessionExample.java b/web/tomcat/webapps/examples/WEB-INF/classes/SessionExample.java
new file mode 100644
index 0000000..a306560
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/SessionExample.java
@@ -0,0 +1,147 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.ResourceBundle;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import util.HTMLFilter;
+
+/**
+ * Example servlet showing request headers
+ *
+ * @author James Duncan Davidson <duncan@eng.sun.com>
+ */
+
+public class SessionExample extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void doGet(HttpServletRequest request,
+ HttpServletResponse response)
+ throws IOException, ServletException
+ {
+ ResourceBundle rb = ResourceBundle.getBundle("LocalStrings",request.getLocale());
+
+ response.setContentType("text/html");
+ response.setCharacterEncoding("UTF-8");
+
+ PrintWriter out = response.getWriter();
+ out.println("<!DOCTYPE html><html>");
+ out.println("<head>");
+ out.println("<meta charset=\"UTF-8\" />");
+
+
+ String title = rb.getString("sessions.title");
+ out.println("<title>" + title + "</title>");
+ out.println("</head>");
+ out.println("<body bgcolor=\"white\">");
+
+ // img stuff not req'd for source code html showing
+ // relative links everywhere!
+
+ // XXX
+ // making these absolute till we work out the
+ // addition of a PathInfo issue
+
+ out.println("<a href=\"../sessions.html\">");
+ out.println("<img src=\"../images/code.gif\" height=24 " +
+ "width=24 align=right border=0 alt=\"view code\"></a>");
+ out.println("<a href=\"../index.html\">");
+ out.println("<img src=\"../images/return.gif\" height=24 " +
+ "width=24 align=right border=0 alt=\"return\"></a>");
+
+ out.println("<h3>" + title + "</h3>");
+
+ HttpSession session = request.getSession(true);
+ out.println(rb.getString("sessions.id") + " " + session.getId());
+ out.println("<br>");
+ out.println(rb.getString("sessions.created") + " ");
+ out.println(new Date(session.getCreationTime()) + "<br>");
+ out.println(rb.getString("sessions.lastaccessed") + " ");
+ out.println(new Date(session.getLastAccessedTime()));
+
+ String dataName = request.getParameter("dataname");
+ String dataValue = request.getParameter("datavalue");
+ if (dataName != null && dataValue != null) {
+ session.setAttribute(dataName, dataValue);
+ }
+
+ out.println("<P>");
+ out.println(rb.getString("sessions.data") + "<br>");
+ Enumeration<String> names = session.getAttributeNames();
+ while (names.hasMoreElements()) {
+ String name = names.nextElement();
+ String value = session.getAttribute(name).toString();
+ out.println(HTMLFilter.filter(name) + " = "
+ + HTMLFilter.filter(value) + "<br>");
+ }
+
+ out.println("<P>");
+ out.print("<form action=\"");
+ out.print(response.encodeURL("SessionExample"));
+ out.print("\" ");
+ out.println("method=POST>");
+ out.println(rb.getString("sessions.dataname"));
+ out.println("<input type=text size=20 name=dataname>");
+ out.println("<br>");
+ out.println(rb.getString("sessions.datavalue"));
+ out.println("<input type=text size=20 name=datavalue>");
+ out.println("<br>");
+ out.println("<input type=submit>");
+ out.println("</form>");
+
+ out.println("<P>GET based form:<br>");
+ out.print("<form action=\"");
+ out.print(response.encodeURL("SessionExample"));
+ out.print("\" ");
+ out.println("method=GET>");
+ out.println(rb.getString("sessions.dataname"));
+ out.println("<input type=text size=20 name=dataname>");
+ out.println("<br>");
+ out.println(rb.getString("sessions.datavalue"));
+ out.println("<input type=text size=20 name=datavalue>");
+ out.println("<br>");
+ out.println("<input type=submit>");
+ out.println("</form>");
+
+ out.print("<p><a href=\"");
+ out.print(HTMLFilter.filter(response.encodeURL("SessionExample?dataname=foo&datavalue=bar")));
+ out.println("\" >URL encoded </a>");
+
+ out.println("</body>");
+ out.println("</html>");
+ }
+
+ @Override
+ public void doPost(HttpServletRequest request,
+ HttpServletResponse response)
+ throws IOException, ServletException
+ {
+ doGet(request, response);
+ }
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/Async0$1.class b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async0$1.class
new file mode 100644
index 0000000..e2c487b
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async0$1.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/Async0.class b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async0.class
new file mode 100644
index 0000000..3597212
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async0.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/Async0.java b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async0.java
new file mode 100644
index 0000000..5bc0ee4
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async0.java
@@ -0,0 +1,71 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package async;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+
+public class Async0 extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Log log = LogFactory.getLog(Async0.class);
+
+ @Override
+ protected void service(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
+ if (Boolean.TRUE.equals(req.getAttribute("dispatch"))) {
+ log.info("Received dispatch, completing on the worker thread.");
+ log.info("After complete called started:"+req.isAsyncStarted());
+ Date date = new Date(System.currentTimeMillis());
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
+ resp.getWriter().write("Async dispatch worked: " + sdf.format(date) + "\n");
+ } else {
+ resp.setContentType("text/plain");
+ final AsyncContext actx = req.startAsync();
+ actx.setTimeout(Long.MAX_VALUE);
+ Runnable run = new Runnable() {
+ @Override
+ public void run() {
+ try {
+ req.setAttribute("dispatch", Boolean.TRUE);
+ Thread.currentThread().setName("Async0-Thread");
+ log.info("Putting AsyncThread to sleep");
+ Thread.sleep(2*1000);
+ log.info("Dispatching");
+ actx.dispatch();
+ }catch (InterruptedException x) {
+ log.error("Async1",x);
+ }catch (IllegalStateException x) {
+ log.error("Async1",x);
+ }
+ }
+ };
+ Thread t = new Thread(run);
+ t.start();
+ }
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/Async1$1.class b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async1$1.class
new file mode 100644
index 0000000..1522c70
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async1$1.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/Async1.class b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async1.class
new file mode 100644
index 0000000..5ecdd9a
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async1.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/Async1.java b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async1.java
new file mode 100644
index 0000000..dc0dc59
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async1.java
@@ -0,0 +1,62 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package async;
+
+import java.io.IOException;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+
+public class Async1 extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Log log = LogFactory.getLog(Async1.class);
+
+ @Override
+ protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ final AsyncContext actx = req.startAsync();
+ actx.setTimeout(30*1000);
+ Runnable run = new Runnable() {
+ @Override
+ public void run() {
+ try {
+ String path = "/jsp/async/async1.jsp";
+ Thread.currentThread().setName("Async1-Thread");
+ log.info("Putting AsyncThread to sleep");
+ Thread.sleep(2*1000);
+ log.info("Dispatching to "+path);
+ actx.dispatch(path);
+ }catch (InterruptedException x) {
+ log.error("Async1",x);
+ }catch (IllegalStateException x) {
+ log.error("Async1",x);
+ }
+ }
+ };
+ Thread t = new Thread(run);
+ t.start();
+ }
+
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/Async2$1.class b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async2$1.class
new file mode 100644
index 0000000..f47c277
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async2$1.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/Async2.class b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async2.class
new file mode 100644
index 0000000..36734d8
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async2.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/Async2.java b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async2.java
new file mode 100644
index 0000000..0682d62
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async2.java
@@ -0,0 +1,70 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package async;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+
+public class Async2 extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Log log = LogFactory.getLog(Async2.class);
+
+ @Override
+ protected void service(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ final AsyncContext actx = req.startAsync();
+ actx.setTimeout(30*1000);
+ Runnable run = new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Thread.currentThread().setName("Async2-Thread");
+ log.info("Putting AsyncThread to sleep");
+ Thread.sleep(2*1000);
+ log.info("Writing data.");
+ Date date = new Date(System.currentTimeMillis());
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
+ actx.getResponse().getWriter().write(
+ "Output from background thread. Time: " + sdf.format(date) + "\n");
+ actx.complete();
+ }catch (InterruptedException x) {
+ log.error("Async2",x);
+ }catch (IllegalStateException x) {
+ log.error("Async2",x);
+ }catch (IOException x) {
+ log.error("Async2",x);
+ }
+ }
+ };
+ Thread t = new Thread(run);
+ t.start();
+ }
+
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/Async3.class b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async3.class
new file mode 100644
index 0000000..6353314
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async3.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/Async3.java b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async3.java
new file mode 100644
index 0000000..e1ff5e0
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/Async3.java
@@ -0,0 +1,39 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package async;
+
+import java.io.IOException;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class Async3 extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ final AsyncContext actx = req.startAsync();
+ actx.setTimeout(30*1000);
+ actx.dispatch("/jsp/async/async3.jsp");
+ }
+
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.class b/web/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.class
new file mode 100644
index 0000000..b18d4ce
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.java b/web/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.java
new file mode 100644
index 0000000..685ac23
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package async;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+/*
+ * Ensures the Stockticker is shut down cleanly when the context stops. This
+ * also covers the case when the server shuts down.
+ */
+public class AsyncStockContextListener implements ServletContextListener {
+
+ public static final String STOCK_TICKER_KEY = "StockTicker";
+
+ @Override
+ public void contextInitialized(ServletContextEvent sce) {
+ Stockticker stockticker = new Stockticker();
+ ServletContext sc = sce.getServletContext();
+ sc.setAttribute(STOCK_TICKER_KEY, stockticker);
+ }
+
+ @Override
+ public void contextDestroyed(ServletContextEvent sce) {
+ ServletContext sc = sce.getServletContext();
+ Stockticker stockticker = (Stockticker) sc.getAttribute(STOCK_TICKER_KEY);
+ stockticker.shutdown();
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.class b/web/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.class
new file mode 100644
index 0000000..b1cedd3
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java b/web/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java
new file mode 100644
index 0000000..0ae07ac
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package async;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.AsyncEvent;
+import javax.servlet.AsyncListener;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+
+import async.Stockticker.Stock;
+import async.Stockticker.TickListener;
+
+public class AsyncStockServlet extends HttpServlet implements TickListener, AsyncListener{
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Log log = LogFactory.getLog(AsyncStockServlet.class);
+
+ private static final ConcurrentLinkedQueue<AsyncContext> clients =
+ new ConcurrentLinkedQueue<>();
+ private static final AtomicInteger clientcount = new AtomicInteger(0);
+
+ public AsyncStockServlet() {
+ log.info("AsyncStockServlet created");
+ }
+
+
+ @Override
+ protected void service(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ if (req.isAsyncStarted()) {
+ req.getAsyncContext().complete();
+ } else if (req.isAsyncSupported()) {
+ AsyncContext actx = req.startAsync();
+ actx.addListener(this);
+ resp.setContentType("text/plain");
+ clients.add(actx);
+ if (clientcount.incrementAndGet()==1) {
+ Stockticker ticker = (Stockticker) req.getServletContext().getAttribute(
+ AsyncStockContextListener.STOCK_TICKER_KEY);
+ ticker.addTickListener(this);
+ }
+ } else {
+ new Exception("Async Not Supported").printStackTrace();
+ resp.sendError(400,"Async is not supported.");
+ }
+ }
+
+
+ @Override
+ public void tick(Stock stock) {
+ for (AsyncContext actx : clients) {
+ try {
+ writeStock(actx, stock);
+ } catch (Exception e) {
+ // Ignore. The async error handling will deal with this.
+ }
+ }
+ }
+
+
+ public void writeStock(AsyncContext actx, Stock stock) throws IOException {
+ HttpServletResponse response = (HttpServletResponse)actx.getResponse();
+ PrintWriter writer = response.getWriter();
+ writer.write("STOCK#");//make client parsing easier
+ writer.write(stock.getSymbol());
+ writer.write("#");
+ writer.write(stock.getValueAsString());
+ writer.write("#");
+ writer.write(stock.getLastChangeAsString());
+ writer.write("#");
+ writer.write(String.valueOf(stock.getCnt()));
+ writer.write("\n");
+ writer.flush();
+ response.flushBuffer();
+ }
+
+
+ @Override
+ public void shutdown() {
+ // The web application is shutting down. Complete any AsyncContexts
+ // associated with an active client.
+ for (AsyncContext actx : clients) {
+ try {
+ actx.complete();
+ } catch (Exception e) {
+ // Ignore. The async error handling will deal with this.
+ }
+ }
+ }
+
+
+ @Override
+ public void onComplete(AsyncEvent event) throws IOException {
+ if (clients.remove(event.getAsyncContext()) && clientcount.decrementAndGet()==0) {
+ ServletContext sc = event.getAsyncContext().getRequest().getServletContext();
+ Stockticker ticker = (Stockticker) sc.getAttribute(
+ AsyncStockContextListener.STOCK_TICKER_KEY);
+ ticker.removeTickListener(this);
+ }
+ }
+
+ @Override
+ public void onError(AsyncEvent event) throws IOException {
+ event.getAsyncContext().complete();
+ }
+
+ @Override
+ public void onTimeout(AsyncEvent event) throws IOException {
+ event.getAsyncContext().complete();
+ }
+
+
+ @Override
+ public void onStartAsync(AsyncEvent event) throws IOException {
+ // NOOP
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker$Stock.class b/web/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker$Stock.class
new file mode 100644
index 0000000..3b33bdc
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker$Stock.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker$TickListener.class b/web/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker$TickListener.class
new file mode 100644
index 0000000..e63e28c
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker$TickListener.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker.class b/web/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker.class
new file mode 100644
index 0000000..a09a293
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker.java b/web/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker.java
new file mode 100644
index 0000000..07a1000
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker.java
@@ -0,0 +1,212 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package async;
+
+import java.text.DecimalFormat;
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class Stockticker implements Runnable {
+ public volatile boolean run = true;
+ protected final AtomicInteger counter = new AtomicInteger(0);
+ final List<TickListener> listeners = new CopyOnWriteArrayList<>();
+ protected volatile Thread ticker = null;
+ protected volatile int ticknr = 0;
+
+ public synchronized void start() {
+ run = true;
+ ticker = new Thread(this);
+ ticker.setName("Ticker Thread");
+ ticker.start();
+ }
+
+ public synchronized void stop() {
+ // On context stop this can be called multiple times.
+ // NO-OP is the ticker thread is not set
+ // (i.e. stop() has already completed)
+ if (ticker == null) {
+ return;
+ }
+ run = false;
+ try {
+ ticker.join();
+ }catch (InterruptedException x) {
+ Thread.interrupted();
+ }
+
+ ticker = null;
+ }
+
+ public void shutdown() {
+ // Notify each listener of the shutdown. This enables them to
+ // trigger any necessary clean-up.
+ for (TickListener l : listeners) {
+ l.shutdown();
+ }
+ // Wait for the thread to stop. This prevents warnings in the logs
+ // that the thread is still active when the context stops.
+ stop();
+ }
+
+ public void addTickListener(TickListener listener) {
+ if (listeners.add(listener)) {
+ if (counter.incrementAndGet()==1) {
+ start();
+ }
+ }
+
+ }
+
+ public void removeTickListener(TickListener listener) {
+ if (listeners.remove(listener)) {
+ if (counter.decrementAndGet()==0) {
+ stop();
+ }
+ }
+ }
+
+ @Override
+ public void run() {
+ try {
+
+ Stock[] stocks = new Stock[] { new Stock("GOOG", 435.43),
+ new Stock("YHOO", 27.88), new Stock("ASF", 1015.55), };
+ Random r = new Random(System.currentTimeMillis());
+ while (run) {
+ for (int j = 0; j < 1; j++) {
+ int i = r.nextInt() % 3;
+ if (i < 0) {
+ i = i * (-1);
+ }
+ Stock stock = stocks[i];
+ double change = r.nextDouble();
+ boolean plus = r.nextBoolean();
+ if (plus) {
+ stock.setValue(stock.getValue() + change);
+ } else {
+ stock.setValue(stock.getValue() - change);
+ }
+ stock.setCnt(++ticknr);
+ for (TickListener l : listeners) {
+ l.tick(stock);
+ }
+
+ }
+ Thread.sleep(850);
+ }
+ } catch (InterruptedException ix) {
+ // Ignore
+ } catch (Exception x) {
+ x.printStackTrace();
+ }
+ }
+
+
+ public static interface TickListener {
+ public void tick(Stock stock);
+ public void shutdown();
+ }
+
+ public static final class Stock implements Cloneable {
+ protected static final DecimalFormat df = new DecimalFormat("0.00");
+ protected final String symbol;
+ protected double value = 0.0d;
+ protected double lastchange = 0.0d;
+ protected int cnt = 0;
+
+ public Stock(String symbol, double initvalue) {
+ this.symbol = symbol;
+ this.value = initvalue;
+ }
+
+ public void setCnt(int c) {
+ this.cnt = c;
+ }
+
+ public int getCnt() {
+ return cnt;
+ }
+
+ public String getSymbol() {
+ return symbol;
+ }
+
+ public double getValue() {
+ return value;
+ }
+
+ public void setValue(double value) {
+ double old = this.value;
+ this.value = value;
+ this.lastchange = value - old;
+ }
+
+ public String getValueAsString() {
+ return df.format(value);
+ }
+
+ public double getLastChange() {
+ return this.lastchange;
+ }
+
+ public void setLastChange(double lastchange) {
+ this.lastchange = lastchange;
+ }
+
+ public String getLastChangeAsString() {
+ return df.format(lastchange);
+ }
+
+ @Override
+ public int hashCode() {
+ return symbol.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other instanceof Stock) {
+ return this.symbol.equals(((Stock) other).symbol);
+ }
+
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder buf = new StringBuilder("STOCK#");
+ buf.append(getSymbol());
+ buf.append('#');
+ buf.append(getValueAsString());
+ buf.append('#');
+ buf.append(getLastChangeAsString());
+ buf.append('#');
+ buf.append(String.valueOf(getCnt()));
+ return buf.toString();
+
+ }
+
+ @Override
+ public Object clone() {
+ Stock s = new Stock(this.getSymbol(), this.getValue());
+ s.setLastChange(this.getLastChange());
+ s.setCnt(this.cnt);
+ return s;
+ }
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/cal/Entries.class b/web/tomcat/webapps/examples/WEB-INF/classes/cal/Entries.class
new file mode 100644
index 0000000..55660a7
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/cal/Entries.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/cal/Entries.java b/web/tomcat/webapps/examples/WEB-INF/classes/cal/Entries.java
new file mode 100644
index 0000000..4b3a5ee
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/cal/Entries.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cal;
+
+import java.util.Hashtable;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class Entries {
+
+ private final Hashtable<String, Entry> entries;
+ private static final String[] time = { "8am", "9am", "10am", "11am",
+ "12pm", "1pm", "2pm", "3pm", "4pm", "5pm", "6pm", "7pm", "8pm" };
+ public static final int rows = 12;
+
+ public Entries() {
+ entries = new Hashtable<>(rows);
+ for (int i = 0; i < rows; i++) {
+ entries.put(time[i], new Entry(time[i]));
+ }
+ }
+
+ public int getRows() {
+ return rows;
+ }
+
+ public Entry getEntry(int index) {
+ return this.entries.get(time[index]);
+ }
+
+ public int getIndex(String tm) {
+ for (int i = 0; i < rows; i++) {
+ if (tm.equals(time[i])) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public void processRequest(HttpServletRequest request, String tm) {
+ int index = getIndex(tm);
+ if (index >= 0) {
+ String descr = request.getParameter("description");
+ entries.get(time[index]).setDescription(descr);
+ }
+ }
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/cal/Entry.class b/web/tomcat/webapps/examples/WEB-INF/classes/cal/Entry.class
new file mode 100644
index 0000000..a456b68
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/cal/Entry.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/cal/Entry.java b/web/tomcat/webapps/examples/WEB-INF/classes/cal/Entry.java
new file mode 100644
index 0000000..ac248bf
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/cal/Entry.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cal;
+
+public class Entry {
+
+ final String hour;
+ String description;
+
+ public Entry(String hour) {
+ this.hour = hour;
+ this.description = "";
+
+ }
+
+ public String getHour() {
+ return this.hour;
+ }
+
+ public String getColor() {
+ if (description.equals("")) {
+ return "lightblue";
+ }
+ return "red";
+ }
+
+ public String getDescription() {
+ if (description.equals("")) {
+ return "None";
+ }
+ return this.description;
+ }
+
+ public void setDescription(String descr) {
+ description = descr;
+ }
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/cal/JspCalendar.class b/web/tomcat/webapps/examples/WEB-INF/classes/cal/JspCalendar.class
new file mode 100644
index 0000000..8be7d11
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/cal/JspCalendar.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/cal/JspCalendar.java b/web/tomcat/webapps/examples/WEB-INF/classes/cal/JspCalendar.java
new file mode 100644
index 0000000..2cfd5a0
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/cal/JspCalendar.java
@@ -0,0 +1,152 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package cal;
+
+import java.util.Calendar;
+import java.util.Date;
+
+public class JspCalendar {
+ final Calendar calendar;
+
+ public JspCalendar() {
+ calendar = Calendar.getInstance();
+ Date trialTime = new Date();
+ calendar.setTime(trialTime);
+ }
+
+
+ public int getYear() {
+ return calendar.get(Calendar.YEAR);
+ }
+
+ public String getMonth() {
+ int m = getMonthInt();
+ String[] months = new String [] { "January", "February", "March",
+ "April", "May", "June",
+ "July", "August", "September",
+ "October", "November", "December" };
+ if (m > 12) {
+ return "Unknown to Man";
+ }
+
+ return months[m - 1];
+
+ }
+
+ public String getDay() {
+ int x = getDayOfWeek();
+ String[] days = new String[] {"Sunday", "Monday", "Tuesday", "Wednesday",
+ "Thursday", "Friday", "Saturday"};
+
+ if (x > 7) {
+ return "Unknown to Man";
+ }
+
+ return days[x - 1];
+
+ }
+
+ public int getMonthInt() {
+ return 1 + calendar.get(Calendar.MONTH);
+ }
+
+ public String getDate() {
+ return getMonthInt() + "/" + getDayOfMonth() + "/" + getYear();
+ }
+
+ public String getCurrentDate() {
+ Date dt = new Date ();
+ calendar.setTime (dt);
+ return getMonthInt() + "/" + getDayOfMonth() + "/" + getYear();
+
+ }
+
+ public String getNextDate() {
+ calendar.set (Calendar.DAY_OF_MONTH, getDayOfMonth() + 1);
+ return getDate ();
+ }
+
+ public String getPrevDate() {
+ calendar.set (Calendar.DAY_OF_MONTH, getDayOfMonth() - 1);
+ return getDate ();
+ }
+
+ public String getTime() {
+ return getHour() + ":" + getMinute() + ":" + getSecond();
+ }
+
+ public int getDayOfMonth() {
+ return calendar.get(Calendar.DAY_OF_MONTH);
+ }
+
+ public int getDayOfYear() {
+ return calendar.get(Calendar.DAY_OF_YEAR);
+ }
+
+ public int getWeekOfYear() {
+ return calendar.get(Calendar.WEEK_OF_YEAR);
+ }
+
+ public int getWeekOfMonth() {
+ return calendar.get(Calendar.WEEK_OF_MONTH);
+ }
+
+ public int getDayOfWeek() {
+ return calendar.get(Calendar.DAY_OF_WEEK);
+ }
+
+ public int getHour() {
+ return calendar.get(Calendar.HOUR_OF_DAY);
+ }
+
+ public int getMinute() {
+ return calendar.get(Calendar.MINUTE);
+ }
+
+
+ public int getSecond() {
+ return calendar.get(Calendar.SECOND);
+ }
+
+
+ public int getEra() {
+ return calendar.get(Calendar.ERA);
+ }
+
+ public String getUSTimeZone() {
+ String[] zones = new String[] {"Hawaii", "Alaskan", "Pacific",
+ "Mountain", "Central", "Eastern"};
+
+ return zones[10 + getZoneOffset()];
+ }
+
+ public int getZoneOffset() {
+ return calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000);
+ }
+
+
+ public int getDSTOffset() {
+ return calendar.get(Calendar.DST_OFFSET)/(60*60*1000);
+ }
+
+
+ public int getAMPM() {
+ return calendar.get(Calendar.AM_PM);
+ }
+}
+
+
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/cal/TableBean.class b/web/tomcat/webapps/examples/WEB-INF/classes/cal/TableBean.class
new file mode 100644
index 0000000..4faa8e2
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/cal/TableBean.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/cal/TableBean.java b/web/tomcat/webapps/examples/WEB-INF/classes/cal/TableBean.java
new file mode 100644
index 0000000..1a871ae
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/cal/TableBean.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cal;
+
+import java.util.Hashtable;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class TableBean {
+
+ final Hashtable<String, Entries> table;
+ final JspCalendar JspCal;
+ Entries entries;
+ String date;
+ String name = null;
+ String email = null;
+ boolean processError = false;
+
+ public TableBean() {
+ this.table = new Hashtable<>(10);
+ this.JspCal = new JspCalendar();
+ this.date = JspCal.getCurrentDate();
+ }
+
+ public void setName(String nm) {
+ this.name = nm;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public void setEmail(String mail) {
+ this.email = mail;
+ }
+
+ public String getEmail() {
+ return this.email;
+ }
+
+ public String getDate() {
+ return this.date;
+ }
+
+ public Entries getEntries() {
+ return this.entries;
+ }
+
+ public void processRequest(HttpServletRequest request) {
+
+ // Get the name and e-mail.
+ this.processError = false;
+ if (name == null || name.equals("")) {
+ setName(request.getParameter("name"));
+ }
+ if (email == null || email.equals("")) {
+ setEmail(request.getParameter("email"));
+ }
+ if (name == null || email == null || name.equals("")
+ || email.equals("")) {
+ this.processError = true;
+ return;
+ }
+
+ // Get the date.
+ String dateR = request.getParameter("date");
+ if (dateR == null) {
+ date = JspCal.getCurrentDate();
+ } else if (dateR.equalsIgnoreCase("next")) {
+ date = JspCal.getNextDate();
+ } else if (dateR.equalsIgnoreCase("prev")) {
+ date = JspCal.getPrevDate();
+ }
+
+ entries = table.get(date);
+ if (entries == null) {
+ entries = new Entries();
+ table.put(date, entries);
+ }
+
+ // If time is provided add the event.
+ String time = request.getParameter("time");
+ if (time != null) {
+ entries.processRequest(request, time);
+ }
+ }
+
+ public boolean getProcessError() {
+ return this.processError;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/checkbox/CheckTest.class b/web/tomcat/webapps/examples/WEB-INF/classes/checkbox/CheckTest.class
new file mode 100644
index 0000000..c527004
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/checkbox/CheckTest.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/checkbox/CheckTest.java b/web/tomcat/webapps/examples/WEB-INF/classes/checkbox/CheckTest.java
new file mode 100644
index 0000000..3eb23ea
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/checkbox/CheckTest.java
@@ -0,0 +1,30 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package checkbox;
+
+public class CheckTest {
+
+ String b[] = new String[] { "1", "2", "3", "4" };
+
+ public String[] getFruit() {
+ return b;
+ }
+
+ public void setFruit(String [] b) {
+ this.b = b;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/colors/ColorGameBean.class b/web/tomcat/webapps/examples/WEB-INF/classes/colors/ColorGameBean.class
new file mode 100644
index 0000000..837070e
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/colors/ColorGameBean.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/colors/ColorGameBean.java b/web/tomcat/webapps/examples/WEB-INF/classes/colors/ColorGameBean.java
new file mode 100644
index 0000000..f8f0118
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/colors/ColorGameBean.java
@@ -0,0 +1,114 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package colors;
+
+public class ColorGameBean {
+
+ private String background = "yellow";
+ private String foreground = "red";
+ private String color1 = foreground;
+ private String color2 = background;
+ private String hint = "no";
+ private int attempts = 0;
+ private int intval = 0;
+ private boolean tookHints = false;
+
+ public void processRequest() {
+
+ // background = "yellow";
+ // foreground = "red";
+
+ if (! color1.equals(foreground)) {
+ if (color1.equalsIgnoreCase("black") ||
+ color1.equalsIgnoreCase("cyan")) {
+ background = color1;
+ }
+ }
+
+ if (! color2.equals(background)) {
+ if (color2.equalsIgnoreCase("black") ||
+ color2.equalsIgnoreCase("cyan")) {
+ foreground = color2;
+ }
+ }
+
+ attempts++;
+ }
+
+ public void setColor2(String x) {
+ color2 = x;
+ }
+
+ public void setColor1(String x) {
+ color1 = x;
+ }
+
+ public void setAction(String x) {
+ if (!tookHints) {
+ tookHints = x.equalsIgnoreCase("Hint");
+ }
+ hint = x;
+ }
+
+ public String getColor2() {
+ return background;
+ }
+
+ public String getColor1() {
+ return foreground;
+ }
+
+ public int getAttempts() {
+ return attempts;
+ }
+
+ public boolean getHint() {
+ return hint.equalsIgnoreCase("Hint");
+ }
+
+ public boolean getSuccess() {
+ if (background.equalsIgnoreCase("black") ||
+ background.equalsIgnoreCase("cyan")) {
+
+ if (foreground.equalsIgnoreCase("black") ||
+ foreground.equalsIgnoreCase("cyan")) {
+ return true;
+ }
+ return false;
+ }
+
+ return false;
+ }
+
+ public boolean getHintTaken() {
+ return tookHints;
+ }
+
+ public void reset() {
+ foreground = "red";
+ background = "yellow";
+ }
+
+ public void setIntval(int value) {
+ intval = value;
+ }
+
+ public int getIntval() {
+ return intval;
+ }
+}
+
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.class b/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.class
new file mode 100644
index 0000000..95f44c7
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.java b/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.java
new file mode 100644
index 0000000..714e115
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.java
@@ -0,0 +1,240 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package compressionFilters;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Implementation of <code>javax.servlet.Filter</code> used to compress
+ * the ServletResponse if it is bigger than a threshold.
+ *
+ * @author Amy Roh
+ * @author Dmitri Valdin
+ */
+public class CompressionFilter implements Filter {
+
+ /**
+ * Minimal reasonable threshold.
+ */
+ private static final int MIN_THRESHOLD = 128;
+
+ /**
+ * Minimal reasonable buffer.
+ */
+ // 8KB is what tomcat would use by default anyway
+ private static final int MIN_BUFFER = 8192;
+
+ /**
+ * The threshold number to compress.
+ */
+ protected int compressionThreshold = 0;
+
+ /**
+ * The compression buffer size to avoid chunking.
+ */
+ protected int compressionBuffer = 0;
+
+ /**
+ * The mime types to compress.
+ */
+ protected String[] compressionMimeTypes = {"text/html", "text/xml", "text/plain"};
+
+ /**
+ * Debug level for this filter.
+ */
+ private int debug = 0;
+
+ /**
+ * Place this filter into service.
+ *
+ * @param filterConfig The filter configuration object
+ */
+ @Override
+ public void init(FilterConfig filterConfig) {
+
+ if (filterConfig != null) {
+ String value = filterConfig.getInitParameter("debug");
+ if (value!=null) {
+ debug = Integer.parseInt(value);
+ }
+
+ String str = filterConfig.getInitParameter("compressionThreshold");
+ if (str != null) {
+ compressionThreshold = Integer.parseInt(str);
+ if (compressionThreshold != 0 && compressionThreshold < MIN_THRESHOLD) {
+ if (debug > 0) {
+ System.out.println("compressionThreshold should be either 0 - no compression or >= " + MIN_THRESHOLD);
+ System.out.println("compressionThreshold set to " + MIN_THRESHOLD);
+ }
+ compressionThreshold = MIN_THRESHOLD;
+ }
+ }
+
+ str = filterConfig.getInitParameter("compressionBuffer");
+ if (str != null) {
+ compressionBuffer = Integer.parseInt(str);
+ if (compressionBuffer < MIN_BUFFER) {
+ if (debug > 0) {
+ System.out.println("compressionBuffer should be >= " + MIN_BUFFER);
+ System.out.println("compressionBuffer set to " + MIN_BUFFER);
+ }
+ compressionBuffer = MIN_BUFFER;
+ }
+ }
+
+ str = filterConfig.getInitParameter("compressionMimeTypes");
+ if (str != null) {
+ List<String> values = new ArrayList<>();
+ StringTokenizer st = new StringTokenizer(str, ",");
+
+ while (st.hasMoreTokens()) {
+ String token = st.nextToken().trim();
+ if (token.length() > 0) {
+ values.add(token);
+ }
+ }
+
+ if (values.size() > 0) {
+ compressionMimeTypes = values.toArray(
+ new String[0]);
+ } else {
+ compressionMimeTypes = null;
+ }
+
+ if (debug > 0) {
+ System.out.println("compressionMimeTypes set to " +
+ Arrays.toString(compressionMimeTypes));
+ }
+ }
+ }
+
+ }
+
+ /**
+ * Take this filter out of service.
+ */
+ @Override
+ public void destroy() {
+ }
+
+ /**
+ * The <code>doFilter</code> method of the Filter is called by the container
+ * each time a request/response pair is passed through the chain due
+ * to a client request for a resource at the end of the chain.
+ * The FilterChain passed into this method allows the Filter to pass on the
+ * request and response to the next entity in the chain.<p>
+ * This method first examines the request to check whether the client support
+ * compression. <br>
+ * It simply just pass the request and response if there is no support for
+ * compression.<br>
+ * If the compression support is available, it creates a
+ * CompressionServletResponseWrapper object which compresses the content and
+ * modifies the header if the content length is big enough.
+ * It then invokes the next entity in the chain using the FilterChain object
+ * (<code>chain.doFilter()</code>), <br>
+ **/
+ @Override
+ public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain )
+ throws IOException, ServletException {
+
+ if (debug > 0) {
+ System.out.println("@doFilter");
+ }
+
+ if (compressionThreshold == 0) {
+ if (debug > 0) {
+ System.out.println("doFilter got called, but compressionThreshold is set to 0 - no compression");
+ }
+ chain.doFilter(request, response);
+ return;
+ }
+
+ boolean supportCompression = false;
+ if (request instanceof HttpServletRequest) {
+ if (debug > 1) {
+ System.out.println("requestURI = " + ((HttpServletRequest)request).getRequestURI());
+ }
+
+ // Are we allowed to compress ?
+ String s = ((HttpServletRequest)request).getParameter("gzip");
+ if ("false".equals(s)) {
+ if (debug > 0) {
+ System.out.println("got parameter gzip=false --> don't compress, just chain filter");
+ }
+ chain.doFilter(request, response);
+ return;
+ }
+
+ Enumeration<String> e =
+ ((HttpServletRequest)request).getHeaders("Accept-Encoding");
+ while (e.hasMoreElements()) {
+ String name = e.nextElement();
+ if (name.indexOf("gzip") != -1) {
+ if (debug > 0) {
+ System.out.println("supports compression");
+ }
+ supportCompression = true;
+ } else {
+ if (debug > 0) {
+ System.out.println("no support for compression");
+ }
+ }
+ }
+ }
+
+ if (supportCompression) {
+ if (response instanceof HttpServletResponse) {
+ CompressionServletResponseWrapper wrappedResponse =
+ new CompressionServletResponseWrapper((HttpServletResponse)response);
+ wrappedResponse.setDebugLevel(debug);
+ wrappedResponse.setCompressionThreshold(compressionThreshold);
+ wrappedResponse.setCompressionBuffer(compressionBuffer);
+ wrappedResponse.setCompressionMimeTypes(compressionMimeTypes);
+ if (debug > 0) {
+ System.out.println("doFilter gets called with compression");
+ }
+ try {
+ chain.doFilter(request, wrappedResponse);
+ } finally {
+ wrappedResponse.finishResponse();
+ }
+ return;
+ }
+ } else {
+ if (debug > 0) {
+ System.out.println("doFilter gets called w/o compression");
+ }
+ chain.doFilter(request, response);
+ return;
+ }
+ }
+}
+
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.class b/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.class
new file mode 100644
index 0000000..abe09d8
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.java b/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.java
new file mode 100644
index 0000000..a973937
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.java
@@ -0,0 +1,65 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package compressionFilters;
+
+import java.io.IOException;
+import java.util.Enumeration;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Very Simple test servlet to test compression filter
+ * @author Amy Roh
+ */
+public class CompressionFilterTestServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+
+ ServletOutputStream out = response.getOutputStream();
+ response.setContentType("text/plain");
+
+ Enumeration<String> e = request.getHeaders("Accept-Encoding");
+ while (e.hasMoreElements()) {
+ String name = e.nextElement();
+ out.println(name);
+ if (name.indexOf("gzip") != -1) {
+ out.println("gzip supported -- able to compress");
+ } else {
+ out.println("gzip not supported");
+ }
+ }
+
+
+ out.println("Compression Filter Test Servlet");
+ out.println("Minimum content length for compression is 128 bytes");
+ out.println("********** 32 bytes **********");
+ out.println("********** 32 bytes **********");
+ out.println("********** 32 bytes **********");
+ out.println("********** 32 bytes **********");
+ out.close();
+ }
+
+}
+
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.class b/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.class
new file mode 100644
index 0000000..5c336ad
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.java b/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.java
new file mode 100644
index 0000000..a879e04
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.java
@@ -0,0 +1,443 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package compressionFilters;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Arrays;
+import java.util.zip.GZIPOutputStream;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.WriteListener;
+
+/**
+ * Implementation of <b>ServletOutputStream</b> that works with
+ * the CompressionServletResponseWrapper implementation.
+ *
+ * @author Amy Roh
+ * @author Dmitri Valdin
+ */
+public class CompressionResponseStream extends ServletOutputStream {
+
+ // ----------------------------------------------------------- Constructors
+
+ /**
+ * Construct a servlet output stream associated with the specified Response.
+ *
+ * @param responseWrapper The associated response wrapper
+ * @param originalOutput the output stream
+ */
+ public CompressionResponseStream(
+ CompressionServletResponseWrapper responseWrapper,
+ ServletOutputStream originalOutput) {
+
+ super();
+ closed = false;
+ this.response = responseWrapper;
+ this.output = originalOutput;
+ }
+
+
+ // ----------------------------------------------------- Instance Variables
+
+
+ /**
+ * The threshold number which decides to compress or not.
+ * Users can configure in web.xml to set it to fit their needs.
+ */
+ protected int compressionThreshold = 0;
+
+ /**
+ * The compression buffer size to avoid chunking
+ */
+ protected int compressionBuffer = 0;
+
+ /**
+ * The mime types to compress
+ */
+ protected String[] compressionMimeTypes = {"text/html", "text/xml", "text/plain"};
+
+ /**
+ * Debug level
+ */
+ private int debug = 0;
+
+ /**
+ * The buffer through which all of our output bytes are passed.
+ */
+ protected byte[] buffer = null;
+
+ /**
+ * The number of data bytes currently in the buffer.
+ */
+ protected int bufferCount = 0;
+
+ /**
+ * The underlying gzip output stream to which we should write data.
+ */
+ protected OutputStream gzipstream = null;
+
+ /**
+ * Has this stream been closed?
+ */
+ protected boolean closed = false;
+
+ /**
+ * The response with which this servlet output stream is associated.
+ */
+ protected final CompressionServletResponseWrapper response;
+
+ /**
+ * The underlying servlet output stream to which we should write data.
+ */
+ protected final ServletOutputStream output;
+
+
+ // --------------------------------------------------------- Public Methods
+
+ /**
+ * Set debug level.
+ *
+ * @param debug The higher the number, the more detail shown. Currently the
+ * range 0 (none) to 3 (everything) is used.
+ */
+ public void setDebugLevel(int debug) {
+ this.debug = debug;
+ }
+
+
+ /**
+ * Set the compressionThreshold number and create buffer for this size
+ */
+ protected void setCompressionThreshold(int compressionThreshold) {
+ this.compressionThreshold = compressionThreshold;
+ buffer = new byte[this.compressionThreshold];
+ if (debug > 1) {
+ System.out.println("compressionThreshold is set to "+ this.compressionThreshold);
+ }
+ }
+
+ /**
+ * The compression buffer size to avoid chunking
+ */
+ protected void setCompressionBuffer(int compressionBuffer) {
+ this.compressionBuffer = compressionBuffer;
+ if (debug > 1) {
+ System.out.println("compressionBuffer is set to "+ this.compressionBuffer);
+ }
+ }
+
+ /**
+ * Set supported mime types.
+ *
+ * @param compressionMimeTypes The mimetypes that will be compressed.
+ */
+ public void setCompressionMimeTypes(String[] compressionMimeTypes) {
+ this.compressionMimeTypes = compressionMimeTypes;
+ if (debug > 1) {
+ System.out.println("compressionMimeTypes is set to " +
+ Arrays.toString(this.compressionMimeTypes));
+ }
+ }
+
+ /**
+ * Close this output stream, causing any buffered data to be flushed and
+ * any further output data to throw an IOException.
+ */
+ @Override
+ public void close() throws IOException {
+
+ if (debug > 1) {
+ System.out.println("close() @ CompressionResponseStream");
+ }
+ if (closed) {
+ throw new IOException("This output stream has already been closed");
+ }
+
+ if (gzipstream != null) {
+ flushToGZip();
+ gzipstream.close();
+ gzipstream = null;
+ } else {
+ if (bufferCount > 0) {
+ if (debug > 2) {
+ System.out.print("output.write(");
+ System.out.write(buffer, 0, bufferCount);
+ System.out.println(")");
+ }
+ output.write(buffer, 0, bufferCount);
+ bufferCount = 0;
+ }
+ }
+
+ output.close();
+ closed = true;
+
+ }
+
+
+ /**
+ * Flush any buffered data for this output stream, which also causes the
+ * response to be committed.
+ */
+ @Override
+ public void flush() throws IOException {
+
+ if (debug > 1) {
+ System.out.println("flush() @ CompressionResponseStream");
+ }
+ if (closed) {
+ throw new IOException("Cannot flush a closed output stream");
+ }
+
+ if (gzipstream != null) {
+ gzipstream.flush();
+ }
+
+ }
+
+ public void flushToGZip() throws IOException {
+
+ if (debug > 1) {
+ System.out.println("flushToGZip() @ CompressionResponseStream");
+ }
+ if (bufferCount > 0) {
+ if (debug > 1) {
+ System.out.println("flushing out to GZipStream, bufferCount = " + bufferCount);
+ }
+ writeToGZip(buffer, 0, bufferCount);
+ bufferCount = 0;
+ }
+
+ }
+
+ /**
+ * Write the specified byte to our output stream.
+ *
+ * @param b The byte to be written
+ *
+ * @exception IOException if an input/output error occurs
+ */
+ @Override
+ public void write(int b) throws IOException {
+
+ if (debug > 1) {
+ System.out.println("write "+b+" in CompressionResponseStream ");
+ }
+ if (closed) {
+ throw new IOException("Cannot write to a closed output stream");
+ }
+
+ if (bufferCount >= buffer.length) {
+ flushToGZip();
+ }
+
+ buffer[bufferCount++] = (byte) b;
+
+ }
+
+
+ /**
+ * Write <code>b.length</code> bytes from the specified byte array
+ * to our output stream.
+ *
+ * @param b The byte array to be written
+ *
+ * @exception IOException if an input/output error occurs
+ */
+ @Override
+ public void write(byte b[]) throws IOException {
+
+ write(b, 0, b.length);
+
+ }
+
+
+
+ /**
+ * TODO SERVLET 3.1
+ */
+ @Override
+ public boolean isReady() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+
+ /**
+ * TODO SERVLET 3.1
+ */
+ @Override
+ public void setWriteListener(WriteListener listener) {
+ // TODO Auto-generated method stub
+
+ }
+
+
+ /**
+ * Write <code>len</code> bytes from the specified byte array, starting
+ * at the specified offset, to our output stream.
+ *
+ * @param b The byte array containing the bytes to be written
+ * @param off Zero-relative starting offset of the bytes to be written
+ * @param len The number of bytes to be written
+ *
+ * @exception IOException if an input/output error occurs
+ */
+ @Override
+ public void write(byte b[], int off, int len) throws IOException {
+
+ if (debug > 1) {
+ System.out.println("write, bufferCount = " + bufferCount + " len = " + len + " off = " + off);
+ }
+ if (debug > 2) {
+ System.out.print("write(");
+ System.out.write(b, off, len);
+ System.out.println(")");
+ }
+
+ if (closed) {
+ throw new IOException("Cannot write to a closed output stream");
+ }
+
+ if (len == 0) {
+ return;
+ }
+
+ // Can we write into buffer ?
+ if (len <= (buffer.length - bufferCount)) {
+ System.arraycopy(b, off, buffer, bufferCount, len);
+ bufferCount += len;
+ return;
+ }
+
+ // There is not enough space in buffer. Flush it ...
+ flushToGZip();
+
+ // ... and try again. Note, that bufferCount = 0 here !
+ if (len <= (buffer.length - bufferCount)) {
+ System.arraycopy(b, off, buffer, bufferCount, len);
+ bufferCount += len;
+ return;
+ }
+
+ // write direct to gzip
+ writeToGZip(b, off, len);
+ }
+
+ public void writeToGZip(byte b[], int off, int len) throws IOException {
+
+ if (debug > 1) {
+ System.out.println("writeToGZip, len = " + len);
+ }
+ if (debug > 2) {
+ System.out.print("writeToGZip(");
+ System.out.write(b, off, len);
+ System.out.println(")");
+ }
+ if (gzipstream == null) {
+ if (debug > 1) {
+ System.out.println("new GZIPOutputStream");
+ }
+
+ boolean alreadyCompressed = false;
+ String contentEncoding = response.getHeader("Content-Encoding");
+ if (contentEncoding != null) {
+ if (contentEncoding.contains("gzip")) {
+ alreadyCompressed = true;
+ if (debug > 0) {
+ System.out.println("content is already compressed");
+ }
+ } else {
+ if (debug > 0) {
+ System.out.println("content is not compressed yet");
+ }
+ }
+ }
+
+ boolean compressibleMimeType = false;
+ // Check for compatible MIME-TYPE
+ if (compressionMimeTypes != null) {
+ if (startsWithStringArray(compressionMimeTypes, response.getContentType())) {
+ compressibleMimeType = true;
+ if (debug > 0) {
+ System.out.println("mime type " + response.getContentType() + " is compressible");
+ }
+ } else {
+ if (debug > 0) {
+ System.out.println("mime type " + response.getContentType() + " is not compressible");
+ }
+ }
+ }
+
+ if (response.isCommitted()) {
+ if (debug > 1) {
+ System.out.print("Response already committed. Using original output stream");
+ }
+ gzipstream = output;
+ } else if (alreadyCompressed) {
+ if (debug > 1) {
+ System.out.print("Response already compressed. Using original output stream");
+ }
+ gzipstream = output;
+ } else if (!compressibleMimeType) {
+ if (debug > 1) {
+ System.out.print("Response mime type is not compressible. Using original output stream");
+ }
+ gzipstream = output;
+ } else {
+ response.addHeader("Content-Encoding", "gzip");
+ response.setContentLength(-1); // don't use any preset content-length as it will be wrong after gzipping
+ response.setBufferSize(compressionBuffer);
+ gzipstream = new GZIPOutputStream(output);
+ }
+ }
+ gzipstream.write(b, off, len);
+
+ }
+
+
+ // -------------------------------------------------------- Package Methods
+
+ /**
+ * Has this response stream been closed?
+ *
+ * @return <code>true</code> if the stream has been closed, otherwise false.
+ */
+ public boolean closed() {
+ return closed;
+ }
+
+
+ /**
+ * Checks if any entry in the string array starts with the specified value
+ *
+ * @param sArray the StringArray
+ * @param value string
+ */
+ private boolean startsWithStringArray(String sArray[], String value) {
+ if (value == null) {
+ return false;
+ }
+ for (String s : sArray) {
+ if (value.startsWith(s)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.class b/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.class
new file mode 100644
index 0000000..6c7c609
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.java b/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.java
new file mode 100644
index 0000000..d5d145a
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.java
@@ -0,0 +1,295 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package compressionFilters;
+
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+
+/**
+ * Implementation of <b>HttpServletResponseWrapper</b> that works with
+ * the CompressionServletResponseStream implementation..
+ *
+ * @author Amy Roh
+ * @author Dmitri Valdin
+ */
+public class CompressionServletResponseWrapper
+ extends HttpServletResponseWrapper {
+
+ // ----------------------------------------------------- Constructor
+
+ /**
+ * Calls the parent constructor which creates a ServletResponse adaptor
+ * wrapping the given response object.
+ *
+ * @param response The response object to be wrapped.
+ */
+ public CompressionServletResponseWrapper(HttpServletResponse response) {
+ super(response);
+ origResponse = response;
+ if (debug > 1) {
+ System.out.println("CompressionServletResponseWrapper constructor gets called");
+ }
+ }
+
+
+ // ----------------------------------------------------- Instance Variables
+
+ /**
+ * Original response
+ */
+ protected final HttpServletResponse origResponse;
+
+ /**
+ * The ServletOutputStream that has been returned by
+ * <code>getOutputStream()</code>, if any.
+ */
+ protected ServletOutputStream stream = null;
+
+
+ /**
+ * The PrintWriter that has been returned by
+ * <code>getWriter()</code>, if any.
+ */
+ protected PrintWriter writer = null;
+
+ /**
+ * The threshold number to compress
+ */
+ protected int compressionThreshold = 0;
+
+ /**
+ * The compression buffer size
+ */
+ protected int compressionBuffer = 8192; // 8KB default
+
+ /**
+ * The mime types to compress
+ */
+ protected String[] compressionMimeTypes = {"text/html", "text/xml", "text/plain"};
+
+ /**
+ * Debug level
+ */
+ protected int debug = 0;
+
+ /**
+ * keeps a copy of all headers set
+ */
+ private final Map<String,String> headerCopies = new HashMap<>();
+
+
+ // --------------------------------------------------------- Public Methods
+
+
+ /**
+ * Set threshold number.
+ *
+ * @param threshold The new compression threshold
+ */
+ public void setCompressionThreshold(int threshold) {
+ if (debug > 1) {
+ System.out.println("setCompressionThreshold to " + threshold);
+ }
+ this.compressionThreshold = threshold;
+ }
+
+ /**
+ * Set compression buffer.
+ *
+ * @param buffer New size of buffer to use for compressed output
+ */
+ public void setCompressionBuffer(int buffer) {
+ if (debug > 1) {
+ System.out.println("setCompressionBuffer to " + buffer);
+ }
+ this.compressionBuffer = buffer;
+ }
+
+ /**
+ * Set compressible mime types.
+ *
+ * @param mimeTypes The new list of mime types that will be considered for
+ * compression
+ */
+ public void setCompressionMimeTypes(String[] mimeTypes) {
+ if (debug > 1) {
+ System.out.println("setCompressionMimeTypes to " +
+ Arrays.toString(mimeTypes));
+ }
+ this.compressionMimeTypes = mimeTypes;
+ }
+
+ /**
+ * Set debug level.
+ *
+ * @param debug The new debug level
+ */
+ public void setDebugLevel(int debug) {
+ this.debug = debug;
+ }
+
+
+ /**
+ * Create and return a ServletOutputStream to write the content
+ * associated with this Response.
+ *
+ * @exception IOException if an input/output error occurs
+ *
+ * @return A new servlet output stream that compressed any data written to
+ * it
+ */
+ protected ServletOutputStream createOutputStream() throws IOException {
+ if (debug > 1) {
+ System.out.println("createOutputStream gets called");
+ }
+
+ CompressionResponseStream stream = new CompressionResponseStream(
+ this, origResponse.getOutputStream());
+ stream.setDebugLevel(debug);
+ stream.setCompressionThreshold(compressionThreshold);
+ stream.setCompressionBuffer(compressionBuffer);
+ stream.setCompressionMimeTypes(compressionMimeTypes);
+
+ return stream;
+ }
+
+
+ /**
+ * Finish a response.
+ */
+ public void finishResponse() {
+ try {
+ if (writer != null) {
+ writer.close();
+ } else {
+ if (stream != null) {
+ stream.close();
+ }
+ }
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+
+
+ // ------------------------------------------------ ServletResponse Methods
+
+
+ /**
+ * Flush the buffer and commit this response.
+ *
+ * @exception IOException if an input/output error occurs
+ */
+ @Override
+ public void flushBuffer() throws IOException {
+ if (debug > 1) {
+ System.out.println("flush buffer @ GZipServletResponseWrapper");
+ }
+ ((CompressionResponseStream)stream).flush();
+
+ }
+
+ /**
+ * Return the servlet output stream associated with this Response.
+ *
+ * @exception IllegalStateException if <code>getWriter</code> has
+ * already been called for this response
+ * @exception IOException if an input/output error occurs
+ */
+ @Override
+ public ServletOutputStream getOutputStream() throws IOException {
+
+ if (writer != null) {
+ throw new IllegalStateException("getWriter() has already been called for this response");
+ }
+
+ if (stream == null) {
+ stream = createOutputStream();
+ }
+ if (debug > 1) {
+ System.out.println("stream is set to "+stream+" in getOutputStream");
+ }
+
+ return stream;
+ }
+
+ /**
+ * Return the writer associated with this Response.
+ *
+ * @exception IllegalStateException if <code>getOutputStream</code> has
+ * already been called for this response
+ * @exception IOException if an input/output error occurs
+ */
+ @Override
+ public PrintWriter getWriter() throws IOException {
+
+ if (writer != null) {
+ return writer;
+ }
+
+ if (stream != null) {
+ throw new IllegalStateException("getOutputStream() has already been called for this response");
+ }
+
+ stream = createOutputStream();
+ if (debug > 1) {
+ System.out.println("stream is set to "+stream+" in getWriter");
+ }
+ String charEnc = origResponse.getCharacterEncoding();
+ if (debug > 1) {
+ System.out.println("character encoding is " + charEnc);
+ }
+ writer = new PrintWriter(new OutputStreamWriter(stream, charEnc));
+
+ return writer;
+ }
+
+ @Override
+ public String getHeader(String name) {
+ return headerCopies.get(name);
+ }
+
+ @Override
+ public void addHeader(String name, String value) {
+ if (headerCopies.containsKey(name)) {
+ String existingValue = headerCopies.get(name);
+ if ((existingValue != null) && (existingValue.length() > 0)) {
+ headerCopies.put(name, existingValue + "," + value);
+ } else {
+ headerCopies.put(name, value);
+ }
+ } else {
+ headerCopies.put(name, value);
+ }
+ super.addHeader(name, value);
+ }
+
+
+ @Override
+ public void setHeader(String name, String value) {
+ headerCopies.put(name, value);
+ super.setHeader(name, value);
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/dates/JspCalendar.class b/web/tomcat/webapps/examples/WEB-INF/classes/dates/JspCalendar.class
new file mode 100644
index 0000000..e6bfc64
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/dates/JspCalendar.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/dates/JspCalendar.java b/web/tomcat/webapps/examples/WEB-INF/classes/dates/JspCalendar.java
new file mode 100644
index 0000000..d6165ba
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/dates/JspCalendar.java
@@ -0,0 +1,155 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package dates;
+
+import java.util.Calendar;
+import java.util.Date;
+
+public class JspCalendar {
+ final Calendar calendar;
+
+ public JspCalendar() {
+ calendar = Calendar.getInstance();
+ Date trialTime = new Date();
+ calendar.setTime(trialTime);
+ }
+
+ public int getYear() {
+ return calendar.get(Calendar.YEAR);
+ }
+
+ public String getMonth() {
+ int m = getMonthInt();
+ String[] months = new String [] { "January", "February", "March",
+ "April", "May", "June",
+ "July", "August", "September",
+ "October", "November", "December" };
+ if (m > 12) {
+ return "Unknown to Man";
+ }
+
+ return months[m - 1];
+
+ }
+
+ public String getDay() {
+ int x = getDayOfWeek();
+ String[] days = new String[] {"Sunday", "Monday", "Tuesday", "Wednesday",
+ "Thursday", "Friday", "Saturday"};
+
+ if (x > 7) {
+ return "Unknown to Man";
+ }
+
+ return days[x - 1];
+
+ }
+
+ public int getMonthInt() {
+ return 1 + calendar.get(Calendar.MONTH);
+ }
+
+ public String getDate() {
+ return getMonthInt() + "/" + getDayOfMonth() + "/" + getYear();
+
+ }
+
+ public String getTime() {
+ return getHour() + ":" + getMinute() + ":" + getSecond();
+ }
+
+ public int getDayOfMonth() {
+ return calendar.get(Calendar.DAY_OF_MONTH);
+ }
+
+ public int getDayOfYear() {
+ return calendar.get(Calendar.DAY_OF_YEAR);
+ }
+
+ public int getWeekOfYear() {
+ return calendar.get(Calendar.WEEK_OF_YEAR);
+ }
+
+ public int getWeekOfMonth() {
+ return calendar.get(Calendar.WEEK_OF_MONTH);
+ }
+
+ public int getDayOfWeek() {
+ return calendar.get(Calendar.DAY_OF_WEEK);
+ }
+
+ public int getHour() {
+ return calendar.get(Calendar.HOUR_OF_DAY);
+ }
+
+ public int getMinute() {
+ return calendar.get(Calendar.MINUTE);
+ }
+
+
+ public int getSecond() {
+ return calendar.get(Calendar.SECOND);
+ }
+
+ public static void main(String args[]) {
+ JspCalendar db = new JspCalendar();
+ p("date: " + db.getDayOfMonth());
+ p("year: " + db.getYear());
+ p("month: " + db.getMonth());
+ p("time: " + db.getTime());
+ p("date: " + db.getDate());
+ p("Day: " + db.getDay());
+ p("DayOfYear: " + db.getDayOfYear());
+ p("WeekOfYear: " + db.getWeekOfYear());
+ p("era: " + db.getEra());
+ p("ampm: " + db.getAMPM());
+ p("DST: " + db.getDSTOffset());
+ p("ZONE Offset: " + db.getZoneOffset());
+ p("TIMEZONE: " + db.getUSTimeZone());
+ }
+
+ private static void p(String x) {
+ System.out.println(x);
+ }
+
+
+ public int getEra() {
+ return calendar.get(Calendar.ERA);
+ }
+
+ public String getUSTimeZone() {
+ String[] zones = new String[] {"Hawaii", "Alaskan", "Pacific",
+ "Mountain", "Central", "Eastern"};
+
+ return zones[10 + getZoneOffset()];
+ }
+
+ public int getZoneOffset() {
+ return calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000);
+ }
+
+
+ public int getDSTOffset() {
+ return calendar.get(Calendar.DST_OFFSET)/(60*60*1000);
+ }
+
+
+ public int getAMPM() {
+ return calendar.get(Calendar.AM_PM);
+ }
+}
+
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/error/Smart.class b/web/tomcat/webapps/examples/WEB-INF/classes/error/Smart.class
new file mode 100644
index 0000000..c676cb9
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/error/Smart.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/error/Smart.java b/web/tomcat/webapps/examples/WEB-INF/classes/error/Smart.java
new file mode 100644
index 0000000..82c22f6
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/error/Smart.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package error;
+
+public class Smart {
+
+ String name = "JSP";
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.class b/web/tomcat/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.class
new file mode 100644
index 0000000..04bc6c1
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.java b/web/tomcat/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.java
new file mode 100644
index 0000000..127eddf
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.java
@@ -0,0 +1,74 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package examples;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.BodyContent;
+import javax.servlet.jsp.tagext.BodyTagSupport;
+import javax.servlet.jsp.tagext.Tag;
+
+public abstract class ExampleTagBase extends BodyTagSupport {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void setParent(Tag parent) {
+ this.parent = parent;
+ }
+
+ @Override
+ public void setBodyContent(BodyContent bodyOut) {
+ this.bodyOut = bodyOut;
+ }
+
+ @Override
+ public Tag getParent() {
+ return this.parent;
+ }
+
+ @Override
+ public int doStartTag() throws JspException {
+ return SKIP_BODY;
+ }
+
+ @Override
+ public int doEndTag() throws JspException {
+ return EVAL_PAGE;
+ }
+
+
+ @Override
+ public void doInitBody() throws JspException {
+ // Default implementations for BodyTag methods as well
+ // just in case a tag decides to implement BodyTag.
+ }
+
+ @Override
+ public int doAfterBody() throws JspException {
+ return SKIP_BODY;
+ }
+
+ @Override
+ public void release() {
+ bodyOut = null;
+ pageContext = null;
+ parent = null;
+ }
+
+ protected BodyContent bodyOut;
+ protected Tag parent;
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/examples/FooTag.class b/web/tomcat/webapps/examples/WEB-INF/classes/examples/FooTag.class
new file mode 100644
index 0000000..52de017
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/examples/FooTag.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/examples/FooTag.java b/web/tomcat/webapps/examples/WEB-INF/classes/examples/FooTag.java
new file mode 100644
index 0000000..f4f3050
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/examples/FooTag.java
@@ -0,0 +1,87 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package examples;
+
+import java.io.IOException;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.JspTagException;
+
+/**
+ * Example1: the simplest tag
+ * Collect attributes and call into some actions
+ *
+ * <foo att1="..." att2="...." att3="...." />
+ */
+
+public class FooTag extends ExampleTagBase {
+
+ private static final long serialVersionUID = 1L;
+
+ private final String atts[] = new String[3];
+ int i = 0;
+
+ private final void setAtt(int index, String value) {
+ atts[index] = value;
+ }
+
+ public void setAtt1(String value) {
+ setAtt(0, value);
+ }
+
+ public void setAtt2(String value) {
+ setAtt(1, value);
+ }
+
+ public void setAtt3(String value) {
+ setAtt(2, value);
+ }
+
+ /**
+ * Process start tag
+ *
+ * @return EVAL_BODY_INCLUDE
+ */
+ @Override
+ public int doStartTag() throws JspException {
+ i = 0;
+ return EVAL_BODY_BUFFERED;
+ }
+
+ @Override
+ public void doInitBody() throws JspException {
+ pageContext.setAttribute("member", atts[i]);
+ i++;
+ }
+
+ @Override
+ public int doAfterBody() throws JspException {
+ try {
+ if (i == 3) {
+ bodyOut.writeOut(bodyOut.getEnclosingWriter());
+ return SKIP_BODY;
+ }
+
+ pageContext.setAttribute("member", atts[i]);
+ i++;
+ return EVAL_BODY_BUFFERED;
+ } catch (IOException ex) {
+ throw new JspTagException(ex.toString());
+ }
+ }
+}
+
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.class b/web/tomcat/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.class
new file mode 100644
index 0000000..e57ebf2
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.java b/web/tomcat/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.java
new file mode 100644
index 0000000..e3fe371
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.java
@@ -0,0 +1,36 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package examples;
+
+import javax.servlet.jsp.tagext.TagData;
+import javax.servlet.jsp.tagext.TagExtraInfo;
+import javax.servlet.jsp.tagext.VariableInfo;
+
+public class FooTagExtraInfo extends TagExtraInfo {
+ @Override
+ public VariableInfo[] getVariableInfo(TagData data) {
+ return new VariableInfo[]
+ {
+ new VariableInfo("member",
+ "String",
+ true,
+ VariableInfo.NESTED)
+ };
+ }
+}
+
+
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/examples/LogTag.class b/web/tomcat/webapps/examples/WEB-INF/classes/examples/LogTag.class
new file mode 100644
index 0000000..dfc0151
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/examples/LogTag.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/examples/LogTag.java b/web/tomcat/webapps/examples/WEB-INF/classes/examples/LogTag.java
new file mode 100644
index 0000000..0f93a06
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/examples/LogTag.java
@@ -0,0 +1,63 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package examples;
+
+import java.io.IOException;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.JspTagException;
+
+/**
+ * Log the contents of the body. Could be used to handle errors etc.
+ */
+public class LogTag extends ExampleTagBase {
+
+ private static final long serialVersionUID = 1L;
+
+ boolean toBrowser = false;
+
+ public void setToBrowser(String value) {
+ if (value == null) {
+ toBrowser = false;
+ } else if (value.equalsIgnoreCase("true")) {
+ toBrowser = true;
+ } else {
+ toBrowser = false;
+ }
+ }
+
+ @Override
+ public int doStartTag() throws JspException {
+ return EVAL_BODY_BUFFERED;
+ }
+
+ @Override
+ public int doAfterBody() throws JspException {
+ try {
+ String s = bodyOut.getString();
+ System.err.println(s);
+ if (toBrowser) {
+ bodyOut.writeOut(bodyOut.getEnclosingWriter());
+ }
+ return SKIP_BODY;
+ } catch (IOException ex) {
+ throw new JspTagException(ex.toString());
+ }
+ }
+}
+
+
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/examples/ValuesTag.class b/web/tomcat/webapps/examples/WEB-INF/classes/examples/ValuesTag.class
new file mode 100644
index 0000000..e9c4dea
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/examples/ValuesTag.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/examples/ValuesTag.java b/web/tomcat/webapps/examples/WEB-INF/classes/examples/ValuesTag.java
new file mode 100644
index 0000000..b335860
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/examples/ValuesTag.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package examples;
+
+import java.io.IOException;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.JspTagException;
+import javax.servlet.jsp.JspWriter;
+import javax.servlet.jsp.tagext.TagSupport;
+
+/**
+ * Accept and display a value.
+ */
+public class ValuesTag extends TagSupport {
+
+ private static final long serialVersionUID = 1L;
+
+ // Using "-1" as the default value,
+ // in the assumption that it won't be used as the value.
+ // Cannot use null here, because null is an important case
+ // that should be present in the tests.
+ private Object objectValue = "-1";
+ private String stringValue = "-1";
+ private long longValue = -1;
+ private double doubleValue = -1;
+
+ public void setObject(Object objectValue) {
+ this.objectValue = objectValue;
+ }
+
+ public void setString(String stringValue) {
+ this.stringValue = stringValue;
+ }
+
+ public void setLong(long longValue) {
+ this.longValue = longValue;
+ }
+
+ public void setDouble(double doubleValue) {
+ this.doubleValue = doubleValue;
+ }
+
+ @Override
+ public int doEndTag() throws JspException {
+ JspWriter out = pageContext.getOut();
+
+ try {
+ if (!"-1".equals(objectValue)) {
+ out.print(objectValue);
+ } else if (!"-1".equals(stringValue)) {
+ out.print(stringValue);
+ } else if (longValue != -1) {
+ out.print(longValue);
+ } else if (doubleValue != -1) {
+ out.print(doubleValue);
+ } else {
+ out.print("-1");
+ }
+ } catch (IOException ex) {
+ throw new JspTagException("IOException: " + ex.toString(), ex);
+ }
+ return super.doEndTag();
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/filters/ExampleFilter.class b/web/tomcat/webapps/examples/WEB-INF/classes/filters/ExampleFilter.class
new file mode 100644
index 0000000..23b9e93
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/filters/ExampleFilter.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/filters/ExampleFilter.java b/web/tomcat/webapps/examples/WEB-INF/classes/filters/ExampleFilter.java
new file mode 100644
index 0000000..287c036
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/filters/ExampleFilter.java
@@ -0,0 +1,136 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package filters;
+
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+
+/**
+ * Example filter that can be attached to either an individual servlet
+ * or to a URL pattern. This filter performs the following functions:
+ * <ul>
+ * <li>Attaches itself as a request attribute, under the attribute name
+ * defined by the value of the <code>attribute</code> initialization
+ * parameter.</li>
+ * <li>Calculates the number of milliseconds required to perform the
+ * servlet processing required by this request, including any
+ * subsequently defined filters, and logs the result to the servlet
+ * context log for this application.
+ * </ul>
+ *
+ * @author Craig McClanahan
+ */
+public final class ExampleFilter implements Filter {
+
+
+ // ----------------------------------------------------- Instance Variables
+
+
+ /**
+ * The request attribute name under which we store a reference to ourself.
+ */
+ private String attribute = null;
+
+
+ /**
+ * The filter configuration object we are associated with. If this value
+ * is null, this filter instance is not currently configured.
+ */
+ private FilterConfig filterConfig = null;
+
+
+ // --------------------------------------------------------- Public Methods
+
+
+ /**
+ * Take this filter out of service.
+ */
+ @Override
+ public void destroy() {
+
+ this.attribute = null;
+ this.filterConfig = null;
+
+ }
+
+
+ /**
+ * Time the processing that is performed by all subsequent filters in the
+ * current filter stack, including the ultimately invoked servlet.
+ *
+ * @param request The servlet request we are processing
+ * @param response The servlet response we are creating
+ * @param chain The filter chain we are processing
+ *
+ * @exception IOException if an input/output error occurs
+ * @exception ServletException if a servlet error occurs
+ */
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response,
+ FilterChain chain)
+ throws IOException, ServletException {
+
+ // Store ourselves as a request attribute (if requested)
+ if (attribute != null) {
+ request.setAttribute(attribute, this);
+ }
+
+ // Time and log the subsequent processing
+ long startTime = System.currentTimeMillis();
+ chain.doFilter(request, response);
+ long stopTime = System.currentTimeMillis();
+ filterConfig.getServletContext().log
+ (this.toString() + ": " + (stopTime - startTime) +
+ " milliseconds");
+ }
+
+
+ /**
+ * Place this filter into service.
+ *
+ * @param fConfig The filter configuration object
+ */
+ @Override
+ public void init(FilterConfig fConfig) throws ServletException {
+
+ this.filterConfig = fConfig;
+ this.attribute = fConfig.getInitParameter("attribute");
+ }
+
+
+ /**
+ * Return a String representation of this object.
+ */
+ @Override
+ public String toString() {
+
+ if (filterConfig == null) {
+ return ("ExampleFilter()");
+ }
+
+ return "ExampleFilter(" + filterConfig + ")";
+ }
+}
+
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.class b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.class
new file mode 100644
index 0000000..8c3cf31
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.java b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.java
new file mode 100644
index 0000000..4e05ba2
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.java
@@ -0,0 +1,42 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples;
+
+public class BookBean {
+ private final String title;
+ private final String author;
+ private final String isbn;
+
+ public BookBean( String title, String author, String isbn ) {
+ this.title = title;
+ this.author = author;
+ this.isbn = isbn;
+ }
+
+ public String getTitle() {
+ return this.title;
+ }
+
+ public String getAuthor() {
+ return this.author;
+ }
+
+ public String getIsbn() {
+ return this.isbn;
+ }
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.class b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.class
new file mode 100644
index 0000000..066f861
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.java b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.java
new file mode 100644
index 0000000..58d3c57
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.java
@@ -0,0 +1,34 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples;
+
+public class FooBean {
+ private String bar;
+
+ public FooBean() {
+ bar = "Initial value";
+ }
+
+ public String getBar() {
+ return this.bar;
+ }
+
+ public void setBar(String bar) {
+ this.bar = bar;
+ }
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.class b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.class
new file mode 100644
index 0000000..77d90b3
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.java b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.java
new file mode 100644
index 0000000..5805f5e
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.java
@@ -0,0 +1,50 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples;
+
+/**
+ * Accept and display a value.
+ */
+public class ValuesBean {
+ private String string;
+ private double doubleValue;
+ private long longValue;
+
+ public String getStringValue() {
+ return this.string;
+ }
+
+ public void setStringValue(String string) {
+ this.string = string;
+ }
+
+ public double getDoubleValue() {
+ return doubleValue;
+ }
+
+ public void setDoubleValue(double doubleValue) {
+ this.doubleValue = doubleValue;
+ }
+
+ public long getLongValue() {
+ return longValue;
+ }
+
+ public void setLongValue(long longValue) {
+ this.longValue = longValue;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.class b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.class
new file mode 100644
index 0000000..b3b0cf4
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.java b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.java
new file mode 100644
index 0000000..77fdb9c
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.java
@@ -0,0 +1,45 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples.el;
+
+import java.util.Locale;
+
+/**
+ * Defines the functions for the jsp2 example tag library.
+ *
+ * <p>Each function is defined as a static method.</p>
+ */
+public class Functions {
+ public static String reverse( String text ) {
+ return new StringBuilder( text ).reverse().toString();
+ }
+
+ public static int numVowels( String text ) {
+ String vowels = "aeiouAEIOU";
+ int result = 0;
+ for( int i = 0; i < text.length(); i++ ) {
+ if( vowels.indexOf( text.charAt( i ) ) != -1 ) {
+ result++;
+ }
+ }
+ return result;
+ }
+
+ public static String caps( String text ) {
+ return text.toUpperCase(Locale.ENGLISH);
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.class b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.class
new file mode 100644
index 0000000..124d3b7
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.java b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.java
new file mode 100644
index 0000000..4bac9a0
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.java
@@ -0,0 +1,56 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples.simpletag;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.JspWriter;
+import javax.servlet.jsp.tagext.DynamicAttributes;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+
+/**
+ * SimpleTag handler that echoes all its attributes
+ */
+public class EchoAttributesTag
+ extends SimpleTagSupport
+ implements DynamicAttributes
+{
+ private final List<String> keys = new ArrayList<>();
+ private final List<Object> values = new ArrayList<>();
+
+ @Override
+ public void doTag() throws JspException, IOException {
+ JspWriter out = getJspContext().getOut();
+ for( int i = 0; i < keys.size(); i++ ) {
+ String key = keys.get( i );
+ Object value = values.get( i );
+ out.println( "<li>" + key + " = " + value + "</li>" );
+ }
+ }
+
+ @Override
+ public void setDynamicAttribute( String uri, String localName,
+ Object value )
+ throws JspException
+ {
+ keys.add( localName );
+ values.add( value );
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.class b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.class
new file mode 100644
index 0000000..720410c
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.java b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.java
new file mode 100644
index 0000000..ebe21b4
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.java
@@ -0,0 +1,44 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples.simpletag;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+
+import jsp2.examples.BookBean;
+
+/**
+ * SimpleTag handler that pretends to search for a book, and stores
+ * the result in a scoped variable.
+ */
+public class FindBookSimpleTag extends SimpleTagSupport {
+ private String var;
+
+ private static final String BOOK_TITLE = "The Lord of the Rings";
+ private static final String BOOK_AUTHOR = "J. R. R. Tolkien";
+ private static final String BOOK_ISBN = "0618002251";
+
+ @Override
+ public void doTag() throws JspException {
+ BookBean book = new BookBean( BOOK_TITLE, BOOK_AUTHOR, BOOK_ISBN );
+ getJspContext().setAttribute( this.var, book );
+ }
+
+ public void setVar( String var ) {
+ this.var = var;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.class b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.class
new file mode 100644
index 0000000..8b82adc
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.java b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.java
new file mode 100644
index 0000000..5225ae0
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.java
@@ -0,0 +1,32 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples.simpletag;
+
+import java.io.IOException;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+
+/**
+ * SimpleTag handler that prints "Hello, world!"
+ */
+public class HelloWorldSimpleTag extends SimpleTagSupport {
+ @Override
+ public void doTag() throws JspException, IOException {
+ getJspContext().getOut().write( "Hello, world!" );
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.class b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.class
new file mode 100644
index 0000000..d13e8fd
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.java b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.java
new file mode 100644
index 0000000..34e9b2c
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.java
@@ -0,0 +1,42 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples.simpletag;
+
+import java.io.IOException;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+
+/**
+ * SimpleTag handler that accepts a num attribute and
+ * invokes its body 'num' times.
+ */
+public class RepeatSimpleTag extends SimpleTagSupport {
+ private int num;
+
+ @Override
+ public void doTag() throws JspException, IOException {
+ for (int i=0; i<num; i++) {
+ getJspContext().setAttribute("count", String.valueOf( i + 1 ) );
+ getJspBody().invoke(null);
+ }
+ }
+
+ public void setNum(int num) {
+ this.num = num;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.class b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.class
new file mode 100644
index 0000000..ab39bd4
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.java b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.java
new file mode 100644
index 0000000..864f4c6
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.java
@@ -0,0 +1,85 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples.simpletag;
+
+import java.io.IOException;
+import java.util.Random;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.JspFragment;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+
+/**
+ * SimpleTag handler that accepts takes three attributes of type
+ * JspFragment and invokes then in a random order.
+ */
+public class ShuffleSimpleTag extends SimpleTagSupport {
+ // No need for this to use SecureRandom
+ private static final Random random = new Random();
+
+ private JspFragment fragment1;
+ private JspFragment fragment2;
+ private JspFragment fragment3;
+
+ @Override
+ public void doTag() throws JspException, IOException {
+ switch(random.nextInt(6)) {
+ case 0:
+ fragment1.invoke( null );
+ fragment2.invoke( null );
+ fragment3.invoke( null );
+ break;
+ case 1:
+ fragment1.invoke( null );
+ fragment3.invoke( null );
+ fragment2.invoke( null );
+ break;
+ case 2:
+ fragment2.invoke( null );
+ fragment1.invoke( null );
+ fragment3.invoke( null );
+ break;
+ case 3:
+ fragment2.invoke( null );
+ fragment3.invoke( null );
+ fragment1.invoke( null );
+ break;
+ case 4:
+ fragment3.invoke( null );
+ fragment1.invoke( null );
+ fragment2.invoke( null );
+ break;
+ case 5:
+ fragment3.invoke( null );
+ fragment2.invoke( null );
+ fragment1.invoke( null );
+ break;
+ }
+ }
+
+ public void setFragment1( JspFragment fragment1 ) {
+ this.fragment1 = fragment1;
+ }
+
+ public void setFragment2( JspFragment fragment2 ) {
+ this.fragment2 = fragment2;
+ }
+
+ public void setFragment3( JspFragment fragment3 ) {
+ this.fragment3 = fragment3;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.class b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.class
new file mode 100644
index 0000000..f66460a
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.java b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.java
new file mode 100644
index 0000000..768d15f
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.java
@@ -0,0 +1,46 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples.simpletag;
+
+import java.io.IOException;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+
+/**
+ * Displays a tile as a single cell in a table.
+ */
+public class TileSimpleTag extends SimpleTagSupport {
+ private String color;
+ private String label;
+
+ @Override
+ public void doTag() throws JspException, IOException {
+ getJspContext().getOut().write(
+ "<td width=\"32\" height=\"32\" bgcolor=\"" + this.color +
+ "\"><font color=\"#ffffff\"><center>" + this.label +
+ "</center></font></td>" );
+ }
+
+ public void setColor( String color ) {
+ this.color = color;
+ }
+
+ public void setLabel( String label ) {
+ this.label = label;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/listeners/ContextListener.class b/web/tomcat/webapps/examples/WEB-INF/classes/listeners/ContextListener.class
new file mode 100644
index 0000000..55f74ad
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/listeners/ContextListener.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/listeners/ContextListener.java b/web/tomcat/webapps/examples/WEB-INF/classes/listeners/ContextListener.java
new file mode 100644
index 0000000..0d78d8e
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/listeners/ContextListener.java
@@ -0,0 +1,139 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package listeners;
+
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextAttributeEvent;
+import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+
+/**
+ * Example listener for context-related application events, which were
+ * introduced in the 2.3 version of the Servlet API. This listener
+ * merely documents the occurrence of such events in the application log
+ * associated with our servlet context.
+ *
+ * @author Craig R. McClanahan
+ */
+public final class ContextListener
+ implements ServletContextAttributeListener, ServletContextListener {
+
+
+ // ----------------------------------------------------- Instance Variables
+
+
+ /**
+ * The servlet context with which we are associated.
+ */
+ private ServletContext context = null;
+
+
+ // --------------------------------------------------------- Public Methods
+
+
+ /**
+ * Record the fact that a servlet context attribute was added.
+ *
+ * @param event The servlet context attribute event
+ */
+ @Override
+ public void attributeAdded(ServletContextAttributeEvent event) {
+
+ log("attributeAdded('" + event.getName() + "', '" +
+ event.getValue() + "')");
+
+ }
+
+
+ /**
+ * Record the fact that a servlet context attribute was removed.
+ *
+ * @param event The servlet context attribute event
+ */
+ @Override
+ public void attributeRemoved(ServletContextAttributeEvent event) {
+
+ log("attributeRemoved('" + event.getName() + "', '" +
+ event.getValue() + "')");
+
+ }
+
+
+ /**
+ * Record the fact that a servlet context attribute was replaced.
+ *
+ * @param event The servlet context attribute event
+ */
+ @Override
+ public void attributeReplaced(ServletContextAttributeEvent event) {
+
+ log("attributeReplaced('" + event.getName() + "', '" +
+ event.getValue() + "')");
+
+ }
+
+
+ /**
+ * Record the fact that this web application has been destroyed.
+ *
+ * @param event The servlet context event
+ */
+ @Override
+ public void contextDestroyed(ServletContextEvent event) {
+
+ log("contextDestroyed()");
+ this.context = null;
+
+ }
+
+
+ /**
+ * Record the fact that this web application has been initialized.
+ *
+ * @param event The servlet context event
+ */
+ @Override
+ public void contextInitialized(ServletContextEvent event) {
+
+ this.context = event.getServletContext();
+ log("contextInitialized()");
+
+ }
+
+
+ // -------------------------------------------------------- Private Methods
+
+
+ /**
+ * Log a message to the servlet context application log.
+ *
+ * @param message Message to be logged
+ */
+ private void log(String message) {
+
+ if (context != null) {
+ context.log("ContextListener: " + message);
+ } else {
+ System.out.println("ContextListener: " + message);
+ }
+
+ }
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/listeners/SessionListener.class b/web/tomcat/webapps/examples/WEB-INF/classes/listeners/SessionListener.class
new file mode 100644
index 0000000..327936c
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/listeners/SessionListener.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/listeners/SessionListener.java b/web/tomcat/webapps/examples/WEB-INF/classes/listeners/SessionListener.java
new file mode 100644
index 0000000..2f2be18
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/listeners/SessionListener.java
@@ -0,0 +1,161 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package listeners;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.http.HttpSessionAttributeListener;
+import javax.servlet.http.HttpSessionBindingEvent;
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionListener;
+
+/**
+ * Example listener for context-related application events, which were
+ * introduced in the 2.3 version of the Servlet API. This listener merely
+ * documents the occurrence of such events in the application log associated
+ * with our servlet context.
+ *
+ * @author Craig R. McClanahan
+ */
+public final class SessionListener implements ServletContextListener,
+ HttpSessionAttributeListener, HttpSessionListener {
+
+ // ----------------------------------------------------- Instance Variables
+
+ /**
+ * The servlet context with which we are associated.
+ */
+ private ServletContext context = null;
+
+ // --------------------------------------------------------- Public Methods
+
+ /**
+ * Record the fact that a servlet context attribute was added.
+ *
+ * @param event
+ * The session attribute event
+ */
+ @Override
+ public void attributeAdded(HttpSessionBindingEvent event) {
+
+ log("attributeAdded('" + event.getSession().getId() + "', '"
+ + event.getName() + "', '" + event.getValue() + "')");
+
+ }
+
+ /**
+ * Record the fact that a servlet context attribute was removed.
+ *
+ * @param event
+ * The session attribute event
+ */
+ @Override
+ public void attributeRemoved(HttpSessionBindingEvent event) {
+
+ log("attributeRemoved('" + event.getSession().getId() + "', '"
+ + event.getName() + "', '" + event.getValue() + "')");
+
+ }
+
+ /**
+ * Record the fact that a servlet context attribute was replaced.
+ *
+ * @param event
+ * The session attribute event
+ */
+ @Override
+ public void attributeReplaced(HttpSessionBindingEvent event) {
+
+ log("attributeReplaced('" + event.getSession().getId() + "', '"
+ + event.getName() + "', '" + event.getValue() + "')");
+
+ }
+
+ /**
+ * Record the fact that this web application has been destroyed.
+ *
+ * @param event
+ * The servlet context event
+ */
+ @Override
+ public void contextDestroyed(ServletContextEvent event) {
+
+ log("contextDestroyed()");
+ this.context = null;
+
+ }
+
+ /**
+ * Record the fact that this web application has been initialized.
+ *
+ * @param event
+ * The servlet context event
+ */
+ @Override
+ public void contextInitialized(ServletContextEvent event) {
+
+ this.context = event.getServletContext();
+ log("contextInitialized()");
+
+ }
+
+ /**
+ * Record the fact that a session has been created.
+ *
+ * @param event
+ * The session event
+ */
+ @Override
+ public void sessionCreated(HttpSessionEvent event) {
+
+ log("sessionCreated('" + event.getSession().getId() + "')");
+
+ }
+
+ /**
+ * Record the fact that a session has been destroyed.
+ *
+ * @param event
+ * The session event
+ */
+ @Override
+ public void sessionDestroyed(HttpSessionEvent event) {
+
+ log("sessionDestroyed('" + event.getSession().getId() + "')");
+
+ }
+
+ // -------------------------------------------------------- Private Methods
+
+ /**
+ * Log a message to the servlet context application log.
+ *
+ * @param message
+ * Message to be logged
+ */
+ private void log(String message) {
+
+ if (context != null) {
+ context.log("SessionListener: " + message);
+ } else {
+ System.out.println("SessionListener: " + message);
+ }
+
+ }
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$1.class b/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$1.class
new file mode 100644
index 0000000..accd7e0
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$1.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$CounterListener.class b/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$CounterListener.class
new file mode 100644
index 0000000..3c5b2cf
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$CounterListener.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.class b/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.class
new file mode 100644
index 0000000..132deab
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.java b/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.java
new file mode 100644
index 0000000..3923780
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package nonblocking;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.ReadListener;
+import javax.servlet.ServletException;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.WriteListener;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * This doesn't do anything particularly useful - it just counts the total
+ * number of bytes in a request body while demonstrating how to perform
+ * non-blocking reads.
+ */
+public class ByteCounter extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+
+ resp.setContentType("text/plain");
+ resp.setCharacterEncoding("UTF-8");
+
+ resp.getWriter().println("Try again using a POST request.");
+ }
+
+ @Override
+ protected void doPost(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+
+ resp.setContentType("text/plain");
+ resp.setCharacterEncoding("UTF-8");
+
+ // Non-blocking IO requires async
+ AsyncContext ac = req.startAsync();
+
+ // Use a single listener for read and write. Listeners often need to
+ // share state to coordinate reads and writes and this is much easier as
+ // a single object.
+ @SuppressWarnings("unused")
+ CounterListener listener = new CounterListener(
+ ac, req.getInputStream(), resp.getOutputStream());
+ }
+
+
+ /**
+ * Keep in mind that each call may well be on a different thread to the
+ * previous call. Ensure that changes in values will be visible across
+ * threads. There should only ever be one container thread at a time calling
+ * the listener.
+ */
+ private static class CounterListener implements ReadListener, WriteListener {
+
+ private final AsyncContext ac;
+ private final ServletInputStream sis;
+ private final ServletOutputStream sos;
+
+ private volatile boolean readFinished = false;
+ private volatile long totalBytesRead = 0;
+ private byte[] buffer = new byte[8192];
+
+ private CounterListener(AsyncContext ac, ServletInputStream sis,
+ ServletOutputStream sos) {
+ this.ac = ac;
+ this.sis = sis;
+ this.sos = sos;
+
+ // In Tomcat, the order the listeners are set controls the order
+ // that the first calls are made. In this case, the read listener
+ // will be called before the write listener.
+ sis.setReadListener(this);
+ sos.setWriteListener(this);
+ }
+
+ @Override
+ public void onDataAvailable() throws IOException {
+ int read = 0;
+ // Loop as long as there is data to read. If isReady() returns false
+ // the socket will be added to the poller and onDataAvailable() will
+ // be called again as soon as there is more data to read.
+ while (sis.isReady() && read > -1) {
+ read = sis.read(buffer);
+ if (read > 0) {
+ totalBytesRead += read;
+ }
+ }
+ }
+
+ @Override
+ public void onAllDataRead() throws IOException {
+ readFinished = true;
+
+ // If sos is not ready to write data, the call to isReady() will
+ // register the socket with the poller which will trigger a call to
+ // onWritePossible() when the socket is ready to have data written
+ // to it.
+ if (sos.isReady()) {
+ onWritePossible();
+ }
+ }
+
+ @Override
+ public void onWritePossible() throws IOException {
+ if (readFinished) {
+ // Must be ready to write data if onWritePossible was called
+ String msg = "Total bytes written = [" + totalBytesRead + "]";
+ sos.write(msg.getBytes(StandardCharsets.UTF_8));
+ ac.complete();
+ }
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ // Should probably log the throwable
+ ac.complete();
+ }
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$1.class b/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$1.class
new file mode 100644
index 0000000..e63768e
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$1.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$NumberWriterListener.class b/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$NumberWriterListener.class
new file mode 100644
index 0000000..43beb94
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$NumberWriterListener.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.class b/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.class
new file mode 100644
index 0000000..dc01a9f
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.java b/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.java
new file mode 100644
index 0000000..d7a6680
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.java
@@ -0,0 +1,148 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package nonblocking;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.ReadListener;
+import javax.servlet.ServletException;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.WriteListener;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * This doesn't do anything particularly useful - it just writes a series of
+ * numbers to the response body while demonstrating how to perform non-blocking
+ * writes.
+ */
+public class NumberWriter extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+
+ resp.setContentType("text/plain");
+ resp.setCharacterEncoding("UTF-8");
+
+ // Non-blocking IO requires async
+ AsyncContext ac = req.startAsync();
+
+ // Use a single listener for read and write. Listeners often need to
+ // share state to coordinate reads and writes and this is much easier as
+ // a single object.
+ @SuppressWarnings("unused")
+ NumberWriterListener listener = new NumberWriterListener(
+ ac, req.getInputStream(), resp.getOutputStream());
+
+ }
+
+
+ /**
+ * Keep in mind that each call may well be on a different thread to the
+ * previous call. Ensure that changes in values will be visible across
+ * threads. There should only ever be one container thread at a time calling
+ * the listener.
+ */
+ private static class NumberWriterListener implements ReadListener,
+ WriteListener {
+
+ private static final int LIMIT = 10000;
+
+ private final AsyncContext ac;
+ private final ServletInputStream sis;
+ private final ServletOutputStream sos;
+ private final AtomicInteger counter = new AtomicInteger(0);
+
+ private volatile boolean readFinished = false;
+ private byte[] buffer = new byte[8192];
+
+ private NumberWriterListener(AsyncContext ac, ServletInputStream sis,
+ ServletOutputStream sos) {
+ this.ac = ac;
+ this.sis = sis;
+ this.sos = sos;
+
+ // In Tomcat, the order the listeners are set controls the order
+ // that the first calls are made. In this case, the read listener
+ // will be called before the write listener.
+ sis.setReadListener(this);
+ sos.setWriteListener(this);
+ }
+
+ @Override
+ public void onDataAvailable() throws IOException {
+
+ // There should be no data to read
+
+ int read = 0;
+ // Loop as long as there is data to read. If isReady() returns false
+ // the socket will be added to the poller and onDataAvailable() will
+ // be called again as soon as there is more data to read.
+ while (sis.isReady() && read > -1) {
+ read = sis.read(buffer);
+ if (read > 0) {
+ throw new IOException("Data was present in input stream");
+ }
+ }
+ }
+
+ @Override
+ public void onAllDataRead() throws IOException {
+ readFinished = true;
+
+ // If sos is not ready to write data, the call to isReady() will
+ // register the socket with the poller which will trigger a call to
+ // onWritePossible() when the socket is ready to have data written
+ // to it.
+ if (sos.isReady()) {
+ onWritePossible();
+ }
+ }
+
+ @Override
+ public void onWritePossible() throws IOException {
+ if (readFinished) {
+ int i = counter.get();
+ boolean ready = true;
+ while (i < LIMIT && ready) {
+ i = counter.incrementAndGet();
+ String msg = String.format("%1$020d\n", Integer.valueOf(i));
+ sos.write(msg.getBytes(StandardCharsets.UTF_8));
+ ready = sos.isReady();
+ }
+
+ if (i == LIMIT) {
+ ac.complete();
+ }
+ }
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ // Should probably log the throwable
+ ac.complete();
+ }
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/num/NumberGuessBean.class b/web/tomcat/webapps/examples/WEB-INF/classes/num/NumberGuessBean.class
new file mode 100644
index 0000000..b77dd5d
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/num/NumberGuessBean.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/num/NumberGuessBean.java b/web/tomcat/webapps/examples/WEB-INF/classes/num/NumberGuessBean.java
new file mode 100644
index 0000000..c47c211
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/num/NumberGuessBean.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * Originally written by Jason Hunter, http://www.servlets.com.
+ */
+package num;
+
+import java.io.Serializable;
+import java.util.Random;
+
+public class NumberGuessBean implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private int answer;
+ private String hint;
+ private int numGuesses;
+ private boolean success;
+ private final Random random = new Random();
+
+ public NumberGuessBean() {
+ reset();
+ }
+
+ public int getAnswer() {
+ return answer;
+ }
+
+ public void setAnswer(int answer) {
+ this.answer = answer;
+ }
+
+ public String getHint() {
+ return "" + hint;
+ }
+
+ public void setHint(String hint) {
+ this.hint = hint;
+ }
+
+ public void setNumGuesses(int numGuesses) {
+ this.numGuesses = numGuesses;
+ }
+
+ public int getNumGuesses() {
+ return numGuesses;
+ }
+
+ public boolean getSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public void setGuess(String guess) {
+ numGuesses++;
+
+ int g;
+ try {
+ g = Integer.parseInt(guess);
+ } catch (NumberFormatException e) {
+ g = -1;
+ }
+
+ if (g == answer) {
+ success = true;
+ } else if (g == -1) {
+ hint = "a number next time";
+ } else if (g < answer) {
+ hint = "higher";
+ } else if (g > answer) {
+ hint = "lower";
+ }
+ }
+
+ public void reset() {
+ answer = Math.abs(random.nextInt() % 100) + 1;
+ success = false;
+ numGuesses = 0;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/sessions/DummyCart.class b/web/tomcat/webapps/examples/WEB-INF/classes/sessions/DummyCart.class
new file mode 100644
index 0000000..81a9e5a
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/sessions/DummyCart.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/sessions/DummyCart.java b/web/tomcat/webapps/examples/WEB-INF/classes/sessions/DummyCart.java
new file mode 100644
index 0000000..28846bd
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/sessions/DummyCart.java
@@ -0,0 +1,66 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package sessions;
+
+import java.util.Vector;
+
+public class DummyCart {
+ final Vector<String> v = new Vector<>();
+ String submit = null;
+ String item = null;
+
+ private void addItem(String name) {
+ v.addElement(name);
+ }
+
+ private void removeItem(String name) {
+ v.removeElement(name);
+ }
+
+ public void setItem(String name) {
+ item = name;
+ }
+
+ public void setSubmit(String s) {
+ submit = s;
+ }
+
+ public String[] getItems() {
+ String[] s = new String[v.size()];
+ v.copyInto(s);
+ return s;
+ }
+
+ public void processRequest() {
+ // null value for submit - user hit enter instead of clicking on
+ // "add" or "remove"
+ if (submit == null || submit.equals("add")) {
+ addItem(item);
+ } else if (submit.equals("remove")) {
+ removeItem(item);
+ }
+
+ // reset at the end of the request
+ reset();
+ }
+
+ // reset
+ private void reset() {
+ submit = null;
+ item = null;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/util/CookieFilter.class b/web/tomcat/webapps/examples/WEB-INF/classes/util/CookieFilter.class
new file mode 100644
index 0000000..85da560
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/util/CookieFilter.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/util/CookieFilter.java b/web/tomcat/webapps/examples/WEB-INF/classes/util/CookieFilter.java
new file mode 100644
index 0000000..d7c8550
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/util/CookieFilter.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package util;
+
+import java.util.Locale;
+import java.util.StringTokenizer;
+
+/**
+ * Processes a cookie header and attempts to obfuscate any cookie values that
+ * represent session IDs from other web applications. Since session cookie names
+ * are configurable, as are session ID lengths, this filter is not expected to
+ * be 100% effective.
+ *
+ * It is required that the examples web application is removed in security
+ * conscious environments as documented in the Security How-To. This filter is
+ * intended to reduce the impact of failing to follow that advice. A failure by
+ * this filter to obfuscate a session ID or similar value is not a security
+ * vulnerability. In such instances the vulnerability is the failure to remove
+ * the examples web application.
+ */
+public class CookieFilter {
+
+ private static final String OBFUSCATED = "[obfuscated]";
+
+ private CookieFilter() {
+ // Hide default constructor
+ }
+
+ public static String filter(String cookieHeader, String sessionId) {
+
+ StringBuilder sb = new StringBuilder(cookieHeader.length());
+
+ // Cookie name value pairs are ';' separated.
+ // Session IDs don't use ; in the value so don't worry about quoted
+ // values that contain ;
+ StringTokenizer st = new StringTokenizer(cookieHeader, ";");
+
+ boolean first = true;
+ while (st.hasMoreTokens()) {
+ if (first) {
+ first = false;
+ } else {
+ sb.append(';');
+ }
+ sb.append(filterNameValuePair(st.nextToken(), sessionId));
+ }
+
+
+ return sb.toString();
+ }
+
+ private static String filterNameValuePair(String input, String sessionId) {
+ int i = input.indexOf('=');
+ if (i == -1) {
+ return input;
+ }
+ String name = input.substring(0, i);
+ String value = input.substring(i + 1);
+
+ return name + "=" + filter(name, value, sessionId);
+ }
+
+ public static String filter(String cookieName, String cookieValue, String sessionId) {
+ if (cookieName.toLowerCase(Locale.ENGLISH).contains("jsessionid") &&
+ (sessionId == null || !cookieValue.contains(sessionId))) {
+ cookieValue = OBFUSCATED;
+ }
+
+ return cookieValue;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/util/HTMLFilter.class b/web/tomcat/webapps/examples/WEB-INF/classes/util/HTMLFilter.class
new file mode 100644
index 0000000..837de04
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/util/HTMLFilter.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/util/HTMLFilter.java b/web/tomcat/webapps/examples/WEB-INF/classes/util/HTMLFilter.java
new file mode 100644
index 0000000..88f3d16
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/util/HTMLFilter.java
@@ -0,0 +1,69 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package util;
+
+/**
+ * HTML filter utility.
+ *
+ * @author Craig R. McClanahan
+ * @author Tim Tye
+ */
+public final class HTMLFilter {
+
+
+ /**
+ * Filter the specified message string for characters that are sensitive
+ * in HTML. This avoids potential attacks caused by including JavaScript
+ * codes in the request URL that is often reported in error messages.
+ *
+ * @param message The message string to be filtered
+ *
+ * @return the filtered version of the message
+ */
+ public static String filter(String message) {
+
+ if (message == null) {
+ return null;
+ }
+
+ char content[] = new char[message.length()];
+ message.getChars(0, message.length(), content, 0);
+ StringBuilder result = new StringBuilder(content.length + 50);
+ for (char c : content) {
+ switch (c) {
+ case '<':
+ result.append("<");
+ break;
+ case '>':
+ result.append(">");
+ break;
+ case '&':
+ result.append("&");
+ break;
+ case '"':
+ result.append(""");
+ break;
+ default:
+ result.append(c);
+ }
+ }
+ return result.toString();
+ }
+
+
+}
+
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/validators/DebugValidator.class b/web/tomcat/webapps/examples/WEB-INF/classes/validators/DebugValidator.class
new file mode 100644
index 0000000..e921951
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/validators/DebugValidator.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/validators/DebugValidator.java b/web/tomcat/webapps/examples/WEB-INF/classes/validators/DebugValidator.java
new file mode 100644
index 0000000..ee23462
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/validators/DebugValidator.java
@@ -0,0 +1,83 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package validators;
+
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.servlet.jsp.tagext.PageData;
+import javax.servlet.jsp.tagext.TagLibraryValidator;
+import javax.servlet.jsp.tagext.ValidationMessage;
+
+
+/**
+ * Example tag library validator that simply dumps the XML version of each
+ * page to standard output (which will typically be sent to the file
+ * <code>$CATALINA_HOME/logs/catalina.out</code>). To utilize it, simply
+ * include a <code>taglib</code> directive for this tag library at the top
+ * of your JSP page.
+ *
+ * @author Craig McClanahan
+ */
+public class DebugValidator extends TagLibraryValidator {
+
+
+ // ----------------------------------------------------- Instance Variables
+
+
+ // --------------------------------------------------------- Public Methods
+
+
+ /**
+ * Validate a JSP page. This will get invoked once per directive in the
+ * JSP page. This method will return <code>null</code> if the page is
+ * valid; otherwise the method should return an array of
+ * <code>ValidationMessage</code> objects. An array of length zero is
+ * also interpreted as no errors.
+ *
+ * @param prefix The value of the prefix argument in this directive
+ * @param uri The value of the URI argument in this directive
+ * @param page The page data for this page
+ */
+ @Override
+ public ValidationMessage[] validate(String prefix, String uri,
+ PageData page) {
+
+ System.out.println("---------- Prefix=" + prefix + " URI=" + uri +
+ "----------");
+
+ InputStream is = page.getInputStream();
+ while (true) {
+ try {
+ int ch = is.read();
+ if (ch < 0) {
+ break;
+ }
+ System.out.print((char) ch);
+ } catch (IOException e) {
+ break;
+ }
+ }
+ System.out.println();
+ System.out.println("-----------------------------------------------");
+ return null;
+
+ }
+
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.class
new file mode 100644
index 0000000..e4fde99
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.java
new file mode 100644
index 0000000..ba8c60b
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.websocket.Endpoint;
+import javax.websocket.server.ServerApplicationConfig;
+import javax.websocket.server.ServerEndpointConfig;
+
+import websocket.drawboard.DrawboardEndpoint;
+import websocket.echo.EchoEndpoint;
+
+public class ExamplesConfig implements ServerApplicationConfig {
+
+ @Override
+ public Set<ServerEndpointConfig> getEndpointConfigs(
+ Set<Class<? extends Endpoint>> scanned) {
+
+ Set<ServerEndpointConfig> result = new HashSet<>();
+
+ if (scanned.contains(EchoEndpoint.class)) {
+ result.add(ServerEndpointConfig.Builder.create(
+ EchoEndpoint.class,
+ "/websocket/echoProgrammatic").build());
+ }
+
+ if (scanned.contains(DrawboardEndpoint.class)) {
+ result.add(ServerEndpointConfig.Builder.create(
+ DrawboardEndpoint.class,
+ "/websocket/drawboard").build());
+ }
+
+ return result;
+ }
+
+
+ @Override
+ public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) {
+ // Deploy all WebSocket endpoints defined by annotations in the examples
+ // web application. Filter out all others to avoid issues when running
+ // tests on Gump
+ Set<Class<?>> results = new HashSet<>();
+ for (Class<?> clazz : scanned) {
+ if (clazz.getPackage().getName().startsWith("websocket.")) {
+ results.add(clazz);
+ }
+ }
+ return results;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.class
new file mode 100644
index 0000000..0dda34f
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.java
new file mode 100644
index 0000000..d1d5523
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.java
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.chat;
+
+import java.io.IOException;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.websocket.OnClose;
+import javax.websocket.OnError;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+
+import util.HTMLFilter;
+
+@ServerEndpoint(value = "/websocket/chat")
+public class ChatAnnotation {
+
+ private static final Log log = LogFactory.getLog(ChatAnnotation.class);
+
+ private static final String GUEST_PREFIX = "Guest";
+ private static final AtomicInteger connectionIds = new AtomicInteger(0);
+ private static final Set<ChatAnnotation> connections =
+ new CopyOnWriteArraySet<>();
+
+ private final String nickname;
+ private Session session;
+
+ public ChatAnnotation() {
+ nickname = GUEST_PREFIX + connectionIds.getAndIncrement();
+ }
+
+
+ @OnOpen
+ public void start(Session session) {
+ this.session = session;
+ connections.add(this);
+ String message = String.format("* %s %s", nickname, "has joined.");
+ broadcast(message);
+ }
+
+
+ @OnClose
+ public void end() {
+ connections.remove(this);
+ String message = String.format("* %s %s",
+ nickname, "has disconnected.");
+ broadcast(message);
+ }
+
+
+ @OnMessage
+ public void incoming(String message) {
+ // Never trust the client
+ String filteredMessage = String.format("%s: %s",
+ nickname, HTMLFilter.filter(message.toString()));
+ broadcast(filteredMessage);
+ }
+
+
+
+
+ @OnError
+ public void onError(Throwable t) throws Throwable {
+ log.error("Chat Error: " + t.toString(), t);
+ }
+
+
+ private static void broadcast(String msg) {
+ for (ChatAnnotation client : connections) {
+ try {
+ synchronized (client) {
+ client.session.getBasicRemote().sendText(msg);
+ }
+ } catch (IOException e) {
+ log.debug("Chat Error: Failed to send message to client", e);
+ connections.remove(client);
+ try {
+ client.session.close();
+ } catch (IOException e1) {
+ // Ignore
+ }
+ String message = String.format("* %s %s",
+ client.nickname, "has been disconnected.");
+ broadcast(message);
+ }
+ }
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client$1.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client$1.class
new file mode 100644
index 0000000..ad80e02
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client$1.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.class
new file mode 100644
index 0000000..e5e234a
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.java
new file mode 100644
index 0000000..6d87660
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.java
@@ -0,0 +1,230 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.drawboard;
+
+import java.io.IOException;
+import java.util.LinkedList;
+
+import javax.websocket.CloseReason;
+import javax.websocket.CloseReason.CloseCodes;
+import javax.websocket.RemoteEndpoint.Async;
+import javax.websocket.SendHandler;
+import javax.websocket.SendResult;
+import javax.websocket.Session;
+
+import websocket.drawboard.wsmessages.AbstractWebsocketMessage;
+import websocket.drawboard.wsmessages.BinaryWebsocketMessage;
+import websocket.drawboard.wsmessages.CloseWebsocketMessage;
+import websocket.drawboard.wsmessages.StringWebsocketMessage;
+
+/**
+ * Represents a client with methods to send messages asynchronously.
+ */
+public class Client {
+
+ private final Session session;
+ private final Async async;
+
+ /**
+ * Contains the messages which are buffered until the previous
+ * send operation has finished.
+ */
+ private final LinkedList<AbstractWebsocketMessage> messagesToSend =
+ new LinkedList<>();
+ /**
+ * If this client is currently sending a messages asynchronously.
+ */
+ private volatile boolean isSendingMessage = false;
+ /**
+ * If this client is closing. If <code>true</code>, new messages to
+ * send will be ignored.
+ */
+ private volatile boolean isClosing = false;
+ /**
+ * The length of all current buffered messages, to avoid iterating
+ * over a linked list.
+ */
+ private volatile long messagesToSendLength = 0;
+
+ public Client(Session session) {
+ this.session = session;
+ this.async = session.getAsyncRemote();
+ }
+
+ /**
+ * Asynchronously closes the Websocket session. This will wait until all
+ * remaining messages have been sent to the Client and then close
+ * the Websocket session.
+ */
+ public void close() {
+ sendMessage(new CloseWebsocketMessage());
+ }
+
+ /**
+ * Sends the given message asynchronously to the client.
+ * If there is already a async sending in progress, then the message
+ * will be buffered and sent when possible.<br><br>
+ *
+ * This method can be called from multiple threads.
+ *
+ * @param msg The message to send
+ */
+ public void sendMessage(AbstractWebsocketMessage msg) {
+ synchronized (messagesToSend) {
+ if (!isClosing) {
+ // Check if we have a Close message
+ if (msg instanceof CloseWebsocketMessage) {
+ isClosing = true;
+ }
+
+ if (isSendingMessage) {
+ // Check if the buffered messages exceed
+ // a specific amount - in that case, disconnect the client
+ // to prevent DoS.
+ // In this case we check if there are >= 1000 messages
+ // or length(of all messages) >= 1000000 bytes.
+ if (messagesToSend.size() >= 1000
+ || messagesToSendLength >= 1000000) {
+ isClosing = true;
+
+ // Discard the new message and close the session immediately.
+ CloseReason cr = new CloseReason(
+ CloseCodes.VIOLATED_POLICY,
+ "Send Buffer exceeded");
+ try {
+ // TODO: close() may block if the remote endpoint doesn't read the data
+ // (eventually there will be a TimeoutException). However, this method
+ // (sendMessage) is intended to run asynchronous code and shouldn't
+ // block. Otherwise it would temporarily stop processing of messages
+ // from other clients.
+ // Maybe call this method on another thread.
+ // Note that when this method is called, the RemoteEndpoint.Async
+ // is still in the process of sending data, so there probably should
+ // be another way to cancel the Websocket connection.
+ // Ideally, there should be some method that cancels the connection
+ // immediately...
+ session.close(cr);
+ } catch (IOException e) {
+ // Ignore
+ }
+
+ } else {
+
+ // Check if the last message and the new message are
+ // String messages - in that case we concatenate them
+ // to reduce TCP overhead (using ";" as separator).
+ if (msg instanceof StringWebsocketMessage
+ && !messagesToSend.isEmpty()
+ && messagesToSend.getLast()
+ instanceof StringWebsocketMessage) {
+
+ StringWebsocketMessage ms =
+ (StringWebsocketMessage) messagesToSend.removeLast();
+ messagesToSendLength -= calculateMessageLength(ms);
+
+ String concatenated = ms.getString() + ";" +
+ ((StringWebsocketMessage) msg).getString();
+ msg = new StringWebsocketMessage(concatenated);
+ }
+
+ messagesToSend.add(msg);
+ messagesToSendLength += calculateMessageLength(msg);
+ }
+ } else {
+ isSendingMessage = true;
+ internalSendMessageAsync(msg);
+ }
+ }
+
+ }
+ }
+
+ private long calculateMessageLength(AbstractWebsocketMessage msg) {
+ if (msg instanceof BinaryWebsocketMessage) {
+ return ((BinaryWebsocketMessage) msg).getBytes().capacity();
+ } else if (msg instanceof StringWebsocketMessage) {
+ return ((StringWebsocketMessage) msg).getString().length() * 2;
+ }
+
+ return 0;
+ }
+
+ /**
+ * Internally sends the messages asynchronously.
+ * @param msg
+ */
+ private void internalSendMessageAsync(AbstractWebsocketMessage msg) {
+ try {
+ if (msg instanceof StringWebsocketMessage) {
+ StringWebsocketMessage sMsg = (StringWebsocketMessage) msg;
+ async.sendText(sMsg.getString(), sendHandler);
+
+ } else if (msg instanceof BinaryWebsocketMessage) {
+ BinaryWebsocketMessage bMsg = (BinaryWebsocketMessage) msg;
+ async.sendBinary(bMsg.getBytes(), sendHandler);
+
+ } else if (msg instanceof CloseWebsocketMessage) {
+ // Close the session.
+ session.close();
+ }
+ } catch (IllegalStateException|IOException ex) {
+ // Trying to write to the client when the session has
+ // already been closed.
+ // Ignore
+ }
+ }
+
+
+
+ /**
+ * SendHandler that will continue to send buffered messages.
+ */
+ private final SendHandler sendHandler = new SendHandler() {
+ @Override
+ public void onResult(SendResult result) {
+ if (!result.isOK()) {
+ // Message could not be sent. In this case, we don't
+ // set isSendingMessage to false because we must assume the connection
+ // broke (and onClose will be called), so we don't try to send
+ // other messages.
+ // As a precaution, we close the session (e.g. if a send timeout occurred).
+ // TODO: session.close() blocks, while this handler shouldn't block.
+ // Ideally, there should be some method that cancels the connection
+ // immediately...
+ try {
+ session.close();
+ } catch (IOException ex) {
+ // Ignore
+ }
+ }
+ synchronized (messagesToSend) {
+
+ if (!messagesToSend.isEmpty()) {
+ AbstractWebsocketMessage msg = messagesToSend.remove();
+ messagesToSendLength -= calculateMessageLength(msg);
+
+ internalSendMessageAsync(msg);
+
+ } else {
+ isSendingMessage = false;
+ }
+
+ }
+ }
+ };
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage$ParseException.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage$ParseException.class
new file mode 100644
index 0000000..6d34b98
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage$ParseException.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.class
new file mode 100644
index 0000000..ba8f069
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.java
new file mode 100644
index 0000000..33de557
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.java
@@ -0,0 +1,253 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.drawboard;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.geom.Arc2D;
+import java.awt.geom.Line2D;
+import java.awt.geom.Rectangle2D;
+
+/**
+ * A message that represents a drawing action.
+ * Note that we use primitive types instead of Point, Color etc.
+ * to reduce object allocation.<br><br>
+ *
+ * TODO: But a Color objects needs to be created anyway for drawing this
+ * onto a Graphics2D object, so this probably does not save much.
+ */
+public final class DrawMessage {
+
+ private int type;
+ private byte colorR, colorG, colorB, colorA;
+ private double thickness;
+ private double x1, y1, x2, y2;
+
+ /**
+ * The type.
+ *
+ * @return 1: Brush<br>2: Line<br>3: Rectangle<br>4: Ellipse
+ */
+ public int getType() {
+ return type;
+ }
+ public void setType(int type) {
+ this.type = type;
+ }
+
+ public double getThickness() {
+ return thickness;
+ }
+ public void setThickness(double thickness) {
+ this.thickness = thickness;
+ }
+
+ public byte getColorR() {
+ return colorR;
+ }
+ public void setColorR(byte colorR) {
+ this.colorR = colorR;
+ }
+ public byte getColorG() {
+ return colorG;
+ }
+ public void setColorG(byte colorG) {
+ this.colorG = colorG;
+ }
+ public byte getColorB() {
+ return colorB;
+ }
+ public void setColorB(byte colorB) {
+ this.colorB = colorB;
+ }
+ public byte getColorA() {
+ return colorA;
+ }
+ public void setColorA(byte colorA) {
+ this.colorA = colorA;
+ }
+
+ public double getX1() {
+ return x1;
+ }
+ public void setX1(double x1) {
+ this.x1 = x1;
+ }
+ public double getX2() {
+ return x2;
+ }
+ public void setX2(double x2) {
+ this.x2 = x2;
+ }
+ public double getY1() {
+ return y1;
+ }
+ public void setY1(double y1) {
+ this.y1 = y1;
+ }
+ public double getY2() {
+ return y2;
+ }
+ public void setY2(double y2) {
+ this.y2 = y2;
+ }
+
+
+ public DrawMessage(int type, byte colorR, byte colorG, byte colorB,
+ byte colorA, double thickness, double x1, double x2, double y1,
+ double y2) {
+
+ this.type = type;
+ this.colorR = colorR;
+ this.colorG = colorG;
+ this.colorB = colorB;
+ this.colorA = colorA;
+ this.thickness = thickness;
+ this.x1 = x1;
+ this.x2 = x2;
+ this.y1 = y1;
+ this.y2 = y2;
+ }
+
+
+ /**
+ * Draws this DrawMessage onto the given Graphics2D.
+ *
+ * @param g The target for the DrawMessage
+ */
+ public void draw(Graphics2D g) {
+
+ g.setStroke(new BasicStroke((float) thickness,
+ BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER));
+ g.setColor(new Color(colorR & 0xFF, colorG & 0xFF, colorB & 0xFF,
+ colorA & 0xFF));
+
+ if (x1 == x2 && y1 == y2) {
+ // Always draw as arc to meet the behavior in the HTML5 Canvas.
+ Arc2D arc = new Arc2D.Double(x1, y1, 0, 0,
+ 0d, 360d, Arc2D.OPEN);
+ g.draw(arc);
+
+ } else if (type == 1 || type == 2) {
+ // Draw a line.
+ Line2D line = new Line2D.Double(x1, y1, x2, y2);
+ g.draw(line);
+
+ } else if (type == 3 || type == 4) {
+ double x1 = this.x1, x2 = this.x2,
+ y1 = this.y1, y2 = this.y2;
+ if (x1 > x2) {
+ x1 = this.x2;
+ x2 = this.x1;
+ }
+ if (y1 > y2) {
+ y1 = this.y2;
+ y2 = this.y1;
+ }
+
+ // TODO: If (x1 == x2 || y1 == y2) draw as line.
+
+ if (type == 3) {
+ // Draw a rectangle.
+ Rectangle2D rect = new Rectangle2D.Double(x1, y1,
+ x2 - x1, y2 - y1);
+ g.draw(rect);
+
+ } else if (type == 4) {
+ // Draw an ellipse.
+ Arc2D arc = new Arc2D.Double(x1, y1, x2 - x1, y2 - y1,
+ 0d, 360d, Arc2D.OPEN);
+ g.draw(arc);
+
+ }
+ }
+ }
+
+ /**
+ * Converts this message into a String representation that
+ * can be sent over WebSocket.<br>
+ * Since a DrawMessage consists only of numbers,
+ * we concatenate those numbers with a ",".
+ */
+ @Override
+ public String toString() {
+
+ return type + "," + (colorR & 0xFF) + "," + (colorG & 0xFF) + ","
+ + (colorB & 0xFF) + "," + (colorA & 0xFF) + "," + thickness
+ + "," + x1 + "," + y1 + "," + x2 + "," + y2;
+ }
+
+ public static DrawMessage parseFromString(String str)
+ throws ParseException {
+
+ int type;
+ byte[] colors = new byte[4];
+ double thickness;
+ double[] coords = new double[4];
+
+ try {
+ String[] elements = str.split(",");
+
+ type = Integer.parseInt(elements[0]);
+ if (!(type >= 1 && type <= 4)) {
+ throw new ParseException("Invalid type: " + type);
+ }
+
+ for (int i = 0; i < colors.length; i++) {
+ colors[i] = (byte) Integer.parseInt(elements[1 + i]);
+ }
+
+ thickness = Double.parseDouble(elements[5]);
+ if (Double.isNaN(thickness) || thickness < 0 || thickness > 100) {
+ throw new ParseException("Invalid thickness: " + thickness);
+ }
+
+ for (int i = 0; i < coords.length; i++) {
+ coords[i] = Double.parseDouble(elements[6 + i]);
+ if (Double.isNaN(coords[i])) {
+ throw new ParseException("Invalid coordinate: "
+ + coords[i]);
+ }
+ }
+
+ } catch (RuntimeException ex) {
+ throw new ParseException(ex);
+ }
+
+ DrawMessage m = new DrawMessage(type, colors[0], colors[1],
+ colors[2], colors[3], thickness, coords[0], coords[2],
+ coords[1], coords[3]);
+
+ return m;
+ }
+
+ public static class ParseException extends Exception {
+ private static final long serialVersionUID = -6651972769789842960L;
+
+ public ParseException(Throwable root) {
+ super(root);
+ }
+
+ public ParseException(String message) {
+ super(message);
+ }
+ }
+
+
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.class
new file mode 100644
index 0000000..82f642b
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.java
new file mode 100644
index 0000000..dd022ba
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.drawboard;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+public final class DrawboardContextListener implements ServletContextListener {
+
+ @Override
+ public void contextInitialized(ServletContextEvent sce) {
+ // NO-OP
+ }
+
+ @Override
+ public void contextDestroyed(ServletContextEvent sce) {
+ // Shutdown our room.
+ Room room = DrawboardEndpoint.getRoom(false);
+ if (room != null) {
+ room.shutdown();
+ }
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$1.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$1.class
new file mode 100644
index 0000000..7cdff24
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$1.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$2.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$2.class
new file mode 100644
index 0000000..b333aed
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$2.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3$1.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3$1.class
new file mode 100644
index 0000000..2fd73e1
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3$1.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3.class
new file mode 100644
index 0000000..6907213
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.class
new file mode 100644
index 0000000..c8bdc8e
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.java
new file mode 100644
index 0000000..cd99f49
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.java
@@ -0,0 +1,236 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.drawboard;
+
+import java.io.EOFException;
+import java.io.IOException;
+
+import javax.websocket.CloseReason;
+import javax.websocket.Endpoint;
+import javax.websocket.EndpointConfig;
+import javax.websocket.MessageHandler;
+import javax.websocket.Session;
+
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+
+import websocket.drawboard.DrawMessage.ParseException;
+import websocket.drawboard.wsmessages.StringWebsocketMessage;
+
+
+public final class DrawboardEndpoint extends Endpoint {
+
+ private static final Log log =
+ LogFactory.getLog(DrawboardEndpoint.class);
+
+
+ /**
+ * Our room where players can join.
+ */
+ private static volatile Room room = null;
+ private static final Object roomLock = new Object();
+
+ public static Room getRoom(boolean create) {
+ if (create) {
+ if (room == null) {
+ synchronized (roomLock) {
+ if (room == null) {
+ room = new Room();
+ }
+ }
+ }
+ return room;
+ } else {
+ return room;
+ }
+ }
+
+ /**
+ * The player that is associated with this Endpoint and the current room.
+ * Note that this variable is only accessed from the Room Thread.<br><br>
+ *
+ * TODO: Currently, Tomcat uses an Endpoint instance once - however
+ * the java doc of endpoint says:
+ * "Each instance of a websocket endpoint is guaranteed not to be called by
+ * more than one thread at a time per active connection."
+ * This could mean that after calling onClose(), the instance
+ * could be reused for another connection so onOpen() will get called
+ * (possibly from another thread).<br>
+ * If this is the case, we would need a variable holder for the variables
+ * that are accessed by the Room thread, and read the reference to the holder
+ * at the beginning of onOpen, onMessage, onClose methods to ensure the room
+ * thread always gets the correct instance of the variable holder.
+ */
+ private Room.Player player;
+
+
+ @Override
+ public void onOpen(Session session, EndpointConfig config) {
+ // Set maximum messages size to 10.000 bytes.
+ session.setMaxTextMessageBufferSize(10000);
+ session.addMessageHandler(stringHandler);
+ final Client client = new Client(session);
+
+ final Room room = getRoom(true);
+ room.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ try {
+
+ // Create a new Player and add it to the room.
+ try {
+ player = room.createAndAddPlayer(client);
+ } catch (IllegalStateException ex) {
+ // Probably the max. number of players has been
+ // reached.
+ client.sendMessage(new StringWebsocketMessage(
+ "0" + ex.getLocalizedMessage()));
+ // Close the connection.
+ client.close();
+ }
+
+ } catch (RuntimeException ex) {
+ log.error("Unexpected exception: " + ex.toString(), ex);
+ }
+ }
+ });
+
+ }
+
+
+ @Override
+ public void onClose(Session session, CloseReason closeReason) {
+ Room room = getRoom(false);
+ if (room != null) {
+ room.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ // Player can be null if it couldn't enter the room
+ if (player != null) {
+ // Remove this player from the room.
+ player.removeFromRoom();
+
+ // Set player to null to prevent NPEs when onMessage events
+ // are processed (from other threads) after onClose has been
+ // called from different thread which closed the Websocket session.
+ player = null;
+ }
+ } catch (RuntimeException ex) {
+ log.error("Unexpected exception: " + ex.toString(), ex);
+ }
+ }
+ });
+ }
+ }
+
+
+
+ @Override
+ public void onError(Session session, Throwable t) {
+ // Most likely cause is a user closing their browser. Check to see if
+ // the root cause is EOF and if it is ignore it.
+ // Protect against infinite loops.
+ int count = 0;
+ Throwable root = t;
+ while (root.getCause() != null && count < 20) {
+ root = root.getCause();
+ count ++;
+ }
+ if (root instanceof EOFException) {
+ // Assume this is triggered by the user closing their browser and
+ // ignore it.
+ } else if (!session.isOpen() && root instanceof IOException) {
+ // IOException after close. Assume this is a variation of the user
+ // closing their browser (or refreshing very quickly) and ignore it.
+ } else {
+ log.error("onError: " + t.toString(), t);
+ }
+ }
+
+
+
+ private final MessageHandler.Whole<String> stringHandler =
+ new MessageHandler.Whole<String>() {
+
+ @Override
+ public void onMessage(final String message) {
+ // Invoke handling of the message in the room.
+ room.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ try {
+
+ // Currently, the only types of messages the client will send
+ // are draw messages prefixed by a Message ID
+ // (starting with char '1'), and pong messages (starting
+ // with char '0').
+ // Draw messages should look like this:
+ // ID|type,colR,colB,colG,colA,thickness,x1,y1,x2,y2,lastInChain
+
+ boolean dontSwallowException = false;
+ try {
+ char messageType = message.charAt(0);
+ String messageContent = message.substring(1);
+ switch (messageType) {
+ case '0':
+ // Pong message.
+ // Do nothing.
+ break;
+
+ case '1':
+ // Draw message
+ int indexOfChar = messageContent.indexOf('|');
+ long msgId = Long.parseLong(
+ messageContent.substring(0, indexOfChar));
+
+ DrawMessage msg = DrawMessage.parseFromString(
+ messageContent.substring(indexOfChar + 1));
+
+ // Don't ignore RuntimeExceptions thrown by
+ // this method
+ // TODO: Find a better solution than this variable
+ dontSwallowException = true;
+ if (player != null) {
+ player.handleDrawMessage(msg, msgId);
+ }
+ dontSwallowException = false;
+
+ break;
+ }
+ } catch (ParseException e) {
+ // Client sent invalid data
+ // Ignore, TODO: maybe close connection
+ } catch (RuntimeException e) {
+ // Client sent invalid data.
+ // Ignore, TODO: maybe close connection
+ if (dontSwallowException) {
+ throw e;
+ }
+ }
+
+ } catch (RuntimeException ex) {
+ log.error("Unexpected exception: " + ex.toString(), ex);
+ }
+ }
+ });
+
+ }
+ };
+
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1$1.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1$1.class
new file mode 100644
index 0000000..7385358
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1$1.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1.class
new file mode 100644
index 0000000..b376454
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$2.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$2.class
new file mode 100644
index 0000000..096f6c7
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$2.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$MessageType.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$MessageType.class
new file mode 100644
index 0000000..226f142
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$MessageType.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$Player.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$Player.class
new file mode 100644
index 0000000..c0e97fb
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$Player.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.class
new file mode 100644
index 0000000..f6d4c85
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.java
new file mode 100644
index 0000000..2193c04
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.java
@@ -0,0 +1,497 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.drawboard;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.locks.ReentrantLock;
+
+import javax.imageio.ImageIO;
+
+import websocket.drawboard.wsmessages.BinaryWebsocketMessage;
+import websocket.drawboard.wsmessages.StringWebsocketMessage;
+
+/**
+ * A Room represents a drawboard where a number of
+ * users participate.<br><br>
+ *
+ * Note: Instance methods should only be invoked by calling
+ * {@link #invokeAndWait(Runnable)} to ensure access is correctly synchronized.
+ */
+public final class Room {
+
+ /**
+ * Specifies the type of a room message that is sent to a client.<br>
+ * Note: Currently we are sending simple string messages - for production
+ * apps, a JSON lib should be used for object-level messages.<br><br>
+ *
+ * The number (single char) will be prefixed to the string when sending
+ * the message.
+ */
+ public enum MessageType {
+ /**
+ * '0': Error: contains error message.
+ */
+ ERROR('0'),
+ /**
+ * '1': DrawMessage: contains serialized DrawMessage(s) prefixed
+ * with the current Player's {@link Player#lastReceivedMessageId}
+ * and ",".<br>
+ * Multiple draw messages are concatenated with "|" as separator.
+ */
+ DRAW_MESSAGE('1'),
+ /**
+ * '2': ImageMessage: Contains number of current players in this room.
+ * After this message a Binary Websocket message will follow,
+ * containing the current Room image as PNG.<br>
+ * This is the first message that a Room sends to a new Player.
+ */
+ IMAGE_MESSAGE('2'),
+ /**
+ * '3': PlayerChanged: contains "+" or "-" which indicate a player
+ * was added or removed to this Room.
+ */
+ PLAYER_CHANGED('3');
+
+ private final char flag;
+
+ private MessageType(char flag) {
+ this.flag = flag;
+ }
+
+ }
+
+
+ /**
+ * The lock used to synchronize access to this Room.
+ */
+ private final ReentrantLock roomLock = new ReentrantLock();
+
+ /**
+ * Indicates if this room has already been shutdown.
+ */
+ private volatile boolean closed = false;
+
+ /**
+ * If <code>true</code>, outgoing DrawMessages will be buffered until the
+ * drawmessageBroadcastTimer ticks. Otherwise they will be sent
+ * immediately.
+ */
+ private static final boolean BUFFER_DRAW_MESSAGES = true;
+
+ /**
+ * A timer which sends buffered drawmessages to the client at once
+ * at a regular interval, to avoid sending a lot of very small
+ * messages which would cause TCP overhead and high CPU usage.
+ */
+ private final Timer drawmessageBroadcastTimer = new Timer();
+
+ private static final int TIMER_DELAY = 30;
+
+ /**
+ * The current active broadcast timer task. If null, then no Broadcast task is scheduled.
+ * The Task will be scheduled if the first player enters the Room, and
+ * cancelled if the last player exits the Room, to avoid unnecessary timer executions.
+ */
+ private TimerTask activeBroadcastTimerTask;
+
+
+ /**
+ * The current image of the room drawboard. DrawMessages that are
+ * received from Players will be drawn onto this image.
+ */
+ private final BufferedImage roomImage =
+ new BufferedImage(900, 600, BufferedImage.TYPE_INT_RGB);
+ private final Graphics2D roomGraphics = roomImage.createGraphics();
+
+
+ /**
+ * The maximum number of players that can join this room.
+ */
+ private static final int MAX_PLAYER_COUNT = 100;
+
+ /**
+ * List of all currently joined players.
+ */
+ private final List<Player> players = new ArrayList<>();
+
+
+
+ public Room() {
+ roomGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+ RenderingHints.VALUE_ANTIALIAS_ON);
+
+ // Clear the image with white background.
+ roomGraphics.setBackground(Color.WHITE);
+ roomGraphics.clearRect(0, 0, roomImage.getWidth(),
+ roomImage.getHeight());
+ }
+
+ private TimerTask createBroadcastTimerTask() {
+ return new TimerTask() {
+ @Override
+ public void run() {
+ invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ broadcastTimerTick();
+ }
+ });
+ }
+ };
+ }
+
+ /**
+ * Creates a Player from the given Client and adds it to this room.
+ *
+ * @param client the client
+ *
+ * @return The newly created player
+ */
+ public Player createAndAddPlayer(Client client) {
+ if (players.size() >= MAX_PLAYER_COUNT) {
+ throw new IllegalStateException("Maximum player count ("
+ + MAX_PLAYER_COUNT + ") has been reached.");
+ }
+
+ Player p = new Player(this, client);
+
+ // Broadcast to the other players that one player joined.
+ broadcastRoomMessage(MessageType.PLAYER_CHANGED, "+");
+
+ // Add the new player to the list.
+ players.add(p);
+
+ // If currently no Broadcast Timer Task is scheduled, then we need to create one.
+ if (activeBroadcastTimerTask == null) {
+ activeBroadcastTimerTask = createBroadcastTimerTask();
+ drawmessageBroadcastTimer.schedule(activeBroadcastTimerTask,
+ TIMER_DELAY, TIMER_DELAY);
+ }
+
+ // Send the current number of players and the current room image.
+ String content = String.valueOf(players.size());
+ p.sendRoomMessage(MessageType.IMAGE_MESSAGE, content);
+
+ // Store image as PNG
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ try {
+ ImageIO.write(roomImage, "PNG", bout);
+ } catch (IOException e) { /* Should never happen */ }
+
+
+ // Send the image as binary message.
+ BinaryWebsocketMessage msg = new BinaryWebsocketMessage(
+ ByteBuffer.wrap(bout.toByteArray()));
+ p.getClient().sendMessage(msg);
+
+ return p;
+
+ }
+
+ /**
+ * @see Player#removeFromRoom()
+ * @param p
+ */
+ private void internalRemovePlayer(Player p) {
+ boolean removed = players.remove(p);
+ assert removed;
+
+ // If the last player left the Room, we need to cancel the Broadcast Timer Task.
+ if (players.size() == 0) {
+ // Cancel the task.
+ // Note that it can happen that the TimerTask is just about to execute (from
+ // the Timer thread) but waits until all players are gone (or even until a new
+ // player is added to the list), and then executes. This is OK. To prevent it,
+ // a TimerTask subclass would need to have some boolean "cancel" instance variable and
+ // query it in the invocation of Room#invokeAndWait.
+ activeBroadcastTimerTask.cancel();
+ activeBroadcastTimerTask = null;
+ }
+
+ // Broadcast that one player is removed.
+ broadcastRoomMessage(MessageType.PLAYER_CHANGED, "-");
+ }
+
+ /**
+ * @see Player#handleDrawMessage(DrawMessage, long)
+ * @param p
+ * @param msg
+ * @param msgId
+ */
+ private void internalHandleDrawMessage(Player p, DrawMessage msg,
+ long msgId) {
+ p.setLastReceivedMessageId(msgId);
+
+ // Draw the RoomMessage onto our Room Image.
+ msg.draw(roomGraphics);
+
+ // Broadcast the Draw Message.
+ broadcastDrawMessage(msg);
+ }
+
+
+ /**
+ * Broadcasts the given drawboard message to all connected players.<br>
+ * Note: For DrawMessages, please use
+ * {@link #broadcastDrawMessage(DrawMessage)}
+ * as this method will buffer them and prefix them with the correct
+ * last received Message ID.
+ * @param type
+ * @param content
+ */
+ private void broadcastRoomMessage(MessageType type, String content) {
+ for (Player p : players) {
+ p.sendRoomMessage(type, content);
+ }
+ }
+
+
+ /**
+ * Broadcast the given DrawMessage. This will buffer the message
+ * and the {@link #drawmessageBroadcastTimer} will broadcast them
+ * at a regular interval, prefixing them with the player's current
+ * {@link Player#lastReceivedMessageId}.
+ * @param msg
+ */
+ private void broadcastDrawMessage(DrawMessage msg) {
+ if (!BUFFER_DRAW_MESSAGES) {
+ String msgStr = msg.toString();
+
+ for (Player p : players) {
+ String s = String.valueOf(p.getLastReceivedMessageId())
+ + "," + msgStr;
+ p.sendRoomMessage(MessageType.DRAW_MESSAGE, s);
+ }
+ } else {
+ for (Player p : players) {
+ p.getBufferedDrawMessages().add(msg);
+ }
+ }
+ }
+
+
+ /**
+ * Tick handler for the broadcastTimer.
+ */
+ private void broadcastTimerTick() {
+ // For each Player, send all per Player buffered
+ // DrawMessages, prefixing each DrawMessage with the player's
+ // lastReceivedMessageId.
+ // Multiple messages are concatenated with "|".
+
+ for (Player p : players) {
+
+ StringBuilder sb = new StringBuilder();
+ List<DrawMessage> drawMessages = p.getBufferedDrawMessages();
+
+ if (drawMessages.size() > 0) {
+ for (int i = 0; i < drawMessages.size(); i++) {
+ DrawMessage msg = drawMessages.get(i);
+
+ String s = String.valueOf(p.getLastReceivedMessageId())
+ + "," + msg.toString();
+ if (i > 0) {
+ sb.append("|");
+ }
+
+ sb.append(s);
+ }
+ drawMessages.clear();
+
+ p.sendRoomMessage(MessageType.DRAW_MESSAGE, sb.toString());
+ }
+ }
+ }
+
+ /**
+ * A list of cached {@link Runnable}s to prevent recursive invocation of Runnables
+ * by one thread. This variable is only used by one thread at a time and then
+ * set to <code>null</code>.
+ */
+ private List<Runnable> cachedRunnables = null;
+
+ /**
+ * Submits the given Runnable to the Room Executor and waits until it
+ * has been executed. Currently, this simply means that the Runnable
+ * will be run directly inside of a synchronized() block.<br>
+ * Note that if a runnable recursively calls invokeAndWait() with another
+ * runnable on this Room, it will not be executed recursively, but instead
+ * cached until the original runnable is finished, to keep the behavior of
+ * using a Executor.
+ *
+ * @param task The task to be executed
+ */
+ public void invokeAndWait(Runnable task) {
+
+ // Check if the current thread already holds a lock on this room.
+ // If yes, then we must not directly execute the Runnable but instead
+ // cache it until the original invokeAndWait() has finished.
+ if (roomLock.isHeldByCurrentThread()) {
+
+ if (cachedRunnables == null) {
+ cachedRunnables = new ArrayList<>();
+ }
+ cachedRunnables.add(task);
+
+ } else {
+
+ roomLock.lock();
+ try {
+ // Explicitly overwrite value to ensure data consistency in
+ // current thread
+ cachedRunnables = null;
+
+ if (!closed) {
+ task.run();
+ }
+
+ // Run the cached runnables.
+ if (cachedRunnables != null) {
+ for (Runnable cachedRunnable : cachedRunnables) {
+ if (!closed) {
+ cachedRunnable.run();
+ }
+ }
+ cachedRunnables = null;
+ }
+
+ } finally {
+ roomLock.unlock();
+ }
+
+ }
+
+ }
+
+ /**
+ * Shuts down the roomExecutor and the drawmessageBroadcastTimer.
+ */
+ public void shutdown() {
+ invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ closed = true;
+ drawmessageBroadcastTimer.cancel();
+ roomGraphics.dispose();
+ }
+ });
+ }
+
+
+ /**
+ * A Player participates in a Room. It is the interface between the
+ * {@link Room} and the {@link Client}.<br><br>
+ *
+ * Note: This means a player object is actually a join between Room and
+ * Client.
+ */
+ public static final class Player {
+
+ /**
+ * The room to which this player belongs.
+ */
+ private Room room;
+
+ /**
+ * The room buffers the last draw message ID that was received from
+ * this player.
+ */
+ private long lastReceivedMessageId = 0;
+
+ private final Client client;
+
+ /**
+ * Buffered DrawMessages that will be sent by a Timer.
+ */
+ private final List<DrawMessage> bufferedDrawMessages =
+ new ArrayList<>();
+
+ private List<DrawMessage> getBufferedDrawMessages() {
+ return bufferedDrawMessages;
+ }
+
+ private Player(Room room, Client client) {
+ this.room = room;
+ this.client = client;
+ }
+
+ public Room getRoom() {
+ return room;
+ }
+
+ public Client getClient() {
+ return client;
+ }
+
+ /**
+ * Removes this player from its room, e.g. when
+ * the client disconnects.
+ */
+ public void removeFromRoom() {
+ if (room != null) {
+ room.internalRemovePlayer(this);
+ room = null;
+ }
+ }
+
+
+ private long getLastReceivedMessageId() {
+ return lastReceivedMessageId;
+ }
+ private void setLastReceivedMessageId(long value) {
+ lastReceivedMessageId = value;
+ }
+
+
+ /**
+ * Handles the given DrawMessage by drawing it onto this Room's
+ * image and by broadcasting it to the connected players.
+ *
+ * @param msg The draw message received
+ * @param msgId The ID for the draw message received
+ */
+ public void handleDrawMessage(DrawMessage msg, long msgId) {
+ room.internalHandleDrawMessage(this, msg, msgId);
+ }
+
+
+ /**
+ * Sends the given room message.
+ * @param type
+ * @param content
+ */
+ private void sendRoomMessage(MessageType type, String content) {
+ Objects.requireNonNull(content);
+ Objects.requireNonNull(type);
+
+ String completeMsg = String.valueOf(type.flag) + content;
+
+ client.sendMessage(new StringWebsocketMessage(completeMsg));
+ }
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.class
new file mode 100644
index 0000000..c6953a4
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.java
new file mode 100644
index 0000000..d425393
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.drawboard.wsmessages;
+
+/**
+ * Abstract base class for Websocket Messages (binary or string)
+ * that can be buffered.
+ */
+public abstract class AbstractWebsocketMessage {
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.class
new file mode 100644
index 0000000..ada7b34
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.java
new file mode 100644
index 0000000..b16e1ae
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.drawboard.wsmessages;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Represents a binary websocket message.
+ */
+public final class BinaryWebsocketMessage extends AbstractWebsocketMessage {
+ private final ByteBuffer bytes;
+
+ public BinaryWebsocketMessage(ByteBuffer bytes) {
+ this.bytes = bytes;
+ }
+
+ public ByteBuffer getBytes() {
+ return bytes;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.class
new file mode 100644
index 0000000..f080cee
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.java
new file mode 100644
index 0000000..44f48ad
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.drawboard.wsmessages;
+
+/**
+ * Represents a "close" message that closes the session.
+ */
+public class CloseWebsocketMessage extends AbstractWebsocketMessage {
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.class
new file mode 100644
index 0000000..2c03f92
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.java
new file mode 100644
index 0000000..49be369
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.drawboard.wsmessages;
+
+/**
+ * Represents a string websocket message.
+ *
+ */
+public final class StringWebsocketMessage extends AbstractWebsocketMessage {
+ private final String string;
+
+ public StringWebsocketMessage(String string) {
+ this.string = string;
+ }
+
+ public String getString() {
+ return string;
+ }
+
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.class
new file mode 100644
index 0000000..a7c1a02
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.java
new file mode 100644
index 0000000..34f0de2
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.echo;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import javax.websocket.OnMessage;
+import javax.websocket.PongMessage;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+
+/**
+ * The three annotated echo endpoints can be used to test with Autobahn and
+ * the following command "wstest -m fuzzingclient -s servers.json". See the
+ * Autobahn documentation for setup and general information.
+ */
+@ServerEndpoint("/websocket/echoAnnotation")
+public class EchoAnnotation {
+
+ @OnMessage
+ public void echoTextMessage(Session session, String msg, boolean last) {
+ try {
+ if (session.isOpen()) {
+ session.getBasicRemote().sendText(msg, last);
+ }
+ } catch (IOException e) {
+ try {
+ session.close();
+ } catch (IOException e1) {
+ // Ignore
+ }
+ }
+ }
+
+ @OnMessage
+ public void echoBinaryMessage(Session session, ByteBuffer bb,
+ boolean last) {
+ try {
+ if (session.isOpen()) {
+ session.getBasicRemote().sendBinary(bb, last);
+ }
+ } catch (IOException e) {
+ try {
+ session.close();
+ } catch (IOException e1) {
+ // Ignore
+ }
+ }
+ }
+
+ /**
+ * Process a received pong. This is a NO-OP.
+ *
+ * @param pm Ignored.
+ */
+ @OnMessage
+ public void echoPongMessage(PongMessage pm) {
+ // NO-OP
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$1.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$1.class
new file mode 100644
index 0000000..8224f30
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$1.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$CompletedFuture.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$CompletedFuture.class
new file mode 100644
index 0000000..5ed8542
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$CompletedFuture.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.class
new file mode 100644
index 0000000..e4bd6c5
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.java
new file mode 100644
index 0000000..39df783
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.echo;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import javax.websocket.OnMessage;
+import javax.websocket.PongMessage;
+import javax.websocket.Session;
+
+/**
+ * The three annotated echo endpoints can be used to test with Autobahn and
+ * the following command "wstest -m fuzzingclient -s servers.json". See the
+ * Autobahn documentation for setup and general information.
+ *
+ * Note: This one is disabled by default since it allocates memory, and needs
+ * to be enabled back.
+ */
+//@javax.websocket.server.ServerEndpoint("/websocket/echoAsyncAnnotation")
+public class EchoAsyncAnnotation {
+
+ private static final Future<Void> COMPLETED = new CompletedFuture();
+
+ Future<Void> f = COMPLETED;
+ StringBuilder sb = null;
+ ByteArrayOutputStream bytes = null;
+
+ @OnMessage
+ public void echoTextMessage(Session session, String msg, boolean last) {
+ if (sb == null) {
+ sb = new StringBuilder();
+ }
+ sb.append(msg);
+ if (last) {
+ // Before we send the next message, have to wait for the previous
+ // message to complete
+ try {
+ f.get();
+ } catch (InterruptedException | ExecutionException e) {
+ // Let the container deal with it
+ throw new RuntimeException(e);
+ }
+ f = session.getAsyncRemote().sendText(sb.toString());
+ sb = null;
+ }
+ }
+
+ @OnMessage
+ public void echoBinaryMessage(byte[] msg, Session session, boolean last)
+ throws IOException {
+ if (bytes == null) {
+ bytes = new ByteArrayOutputStream();
+ }
+ bytes.write(msg);
+ if (last) {
+ // Before we send the next message, have to wait for the previous
+ // message to complete
+ try {
+ f.get();
+ } catch (InterruptedException | ExecutionException e) {
+ // Let the container deal with it
+ throw new RuntimeException(e);
+ }
+ f = session.getAsyncRemote().sendBinary(ByteBuffer.wrap(bytes.toByteArray()));
+ bytes = null;
+ }
+ }
+
+ /**
+ * Process a received pong. This is a NO-OP.
+ *
+ * @param pm Ignored.
+ */
+ @OnMessage
+ public void echoPongMessage(PongMessage pm) {
+ // NO-OP
+ }
+
+ private static class CompletedFuture implements Future<Void> {
+
+ @Override
+ public boolean cancel(boolean mayInterruptIfRunning) {
+ return false;
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return false;
+ }
+
+ @Override
+ public boolean isDone() {
+ return true;
+ }
+
+ @Override
+ public Void get() throws InterruptedException, ExecutionException {
+ return null;
+ }
+
+ @Override
+ public Void get(long timeout, TimeUnit unit)
+ throws InterruptedException, ExecutionException,
+ TimeoutException {
+ return null;
+ }
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$1.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$1.class
new file mode 100644
index 0000000..0235572
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$1.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerBinary.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerBinary.class
new file mode 100644
index 0000000..e6a13ec
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerBinary.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerText.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerText.class
new file mode 100644
index 0000000..d159f56
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerText.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.class
new file mode 100644
index 0000000..fb2cdad
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.java
new file mode 100644
index 0000000..3620238
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.echo;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import javax.websocket.Endpoint;
+import javax.websocket.EndpointConfig;
+import javax.websocket.MessageHandler;
+import javax.websocket.RemoteEndpoint;
+import javax.websocket.Session;
+
+public class EchoEndpoint extends Endpoint {
+
+ @Override
+ public void onOpen(Session session, EndpointConfig endpointConfig) {
+ RemoteEndpoint.Basic remoteEndpointBasic = session.getBasicRemote();
+ session.addMessageHandler(new EchoMessageHandlerText(remoteEndpointBasic));
+ session.addMessageHandler(new EchoMessageHandlerBinary(remoteEndpointBasic));
+ }
+
+ private static class EchoMessageHandlerText
+ implements MessageHandler.Partial<String> {
+
+ private final RemoteEndpoint.Basic remoteEndpointBasic;
+
+ private EchoMessageHandlerText(RemoteEndpoint.Basic remoteEndpointBasic) {
+ this.remoteEndpointBasic = remoteEndpointBasic;
+ }
+
+ @Override
+ public void onMessage(String message, boolean last) {
+ try {
+ if (remoteEndpointBasic != null) {
+ remoteEndpointBasic.sendText(message, last);
+ }
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private static class EchoMessageHandlerBinary
+ implements MessageHandler.Partial<ByteBuffer> {
+
+ private final RemoteEndpoint.Basic remoteEndpointBasic;
+
+ private EchoMessageHandlerBinary(RemoteEndpoint.Basic remoteEndpointBasic) {
+ this.remoteEndpointBasic = remoteEndpointBasic;
+ }
+
+ @Override
+ public void onMessage(ByteBuffer message, boolean last) {
+ try {
+ if (remoteEndpointBasic != null) {
+ remoteEndpointBasic.sendBinary(message, last);
+ }
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.class
new file mode 100644
index 0000000..de6f561
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.java
new file mode 100644
index 0000000..7aef821
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.echo;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Writer;
+
+import javax.websocket.OnMessage;
+import javax.websocket.PongMessage;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+
+/**
+ * The three annotated echo endpoints can be used to test with Autobahn and
+ * the following command "wstest -m fuzzingclient -s servers.json". See the
+ * Autobahn documentation for setup and general information.
+ */
+@ServerEndpoint("/websocket/echoStreamAnnotation")
+public class EchoStreamAnnotation {
+
+ Writer writer;
+ OutputStream stream;
+
+ @OnMessage
+ public void echoTextMessage(Session session, String msg, boolean last)
+ throws IOException {
+ if (writer == null) {
+ writer = session.getBasicRemote().getSendWriter();
+ }
+ writer.write(msg);
+ if (last) {
+ writer.close();
+ writer = null;
+ }
+ }
+
+ @OnMessage
+ public void echoBinaryMessage(byte[] msg, Session session, boolean last)
+ throws IOException {
+ if (stream == null) {
+ stream = session.getBasicRemote().getSendStream();
+ }
+ stream.write(msg);
+ stream.flush();
+ if (last) {
+ stream.close();
+ stream = null;
+ }
+ }
+
+ /**
+ * Process a received pong. This is a NO-OP.
+ *
+ * @param pm Ignored.
+ */
+ @OnMessage
+ public void echoPongMessage(PongMessage pm) {
+ // NO-OP
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/servers.json b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/servers.json
new file mode 100644
index 0000000..c816a7d
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/servers.json
@@ -0,0 +1,20 @@
+{
+ "options": {"failByDrop": false},
+ "outdir": "./reports/servers",
+
+ "servers": [
+ {"agent": "Basic",
+ "url": "ws://localhost:8080/examples/websocket/echoAnnotation",
+ "options": {"version": 18}},
+ {"agent": "Stream",
+ "url": "ws://localhost:8080/examples/websocket/echoStreamAnnotation",
+ "options": {"version": 18}},
+ {"agent": "Async",
+ "url": "ws://localhost:8080/examples/websocket/echoAsyncAnnotation",
+ "options": {"version": 18}}
+ ],
+
+ "cases": ["*"],
+ "exclude-cases": [],
+ "exclude-agent-cases": {}
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Direction.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Direction.class
new file mode 100644
index 0000000..9db474e
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Direction.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Direction.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Direction.java
new file mode 100644
index 0000000..4440c9d
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Direction.java
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.snake;
+
+public enum Direction {
+ NONE, NORTH, SOUTH, EAST, WEST
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location$1.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location$1.class
new file mode 100644
index 0000000..a5ac306
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location$1.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location.class
new file mode 100644
index 0000000..f6fbd16
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location.java
new file mode 100644
index 0000000..420be8a
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.snake;
+
+public class Location {
+
+ public int x;
+ public int y;
+
+ public Location(int x, int y) {
+ this.x = x;
+ this.y = y;
+ }
+
+ public Location getAdjacentLocation(Direction direction) {
+ switch (direction) {
+ case NORTH:
+ return new Location(x, y - SnakeAnnotation.GRID_SIZE);
+ case SOUTH:
+ return new Location(x, y + SnakeAnnotation.GRID_SIZE);
+ case EAST:
+ return new Location(x + SnakeAnnotation.GRID_SIZE, y);
+ case WEST:
+ return new Location(x - SnakeAnnotation.GRID_SIZE, y);
+ case NONE:
+ // fall through
+ default:
+ return this;
+ }
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ Location location = (Location) o;
+
+ if (x != location.x) {
+ return false;
+ }
+ if (y != location.y) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = x;
+ result = 31 * result + y;
+ return result;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Snake.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Snake.class
new file mode 100644
index 0000000..afdcf77
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Snake.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Snake.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Snake.java
new file mode 100644
index 0000000..7a11222
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Snake.java
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.snake;
+
+import java.io.IOException;
+import java.util.ArrayDeque;
+import java.util.Collection;
+import java.util.Deque;
+
+import javax.websocket.CloseReason;
+import javax.websocket.CloseReason.CloseCodes;
+import javax.websocket.Session;
+
+public class Snake {
+
+ private static final int DEFAULT_LENGTH = 5;
+
+ private final int id;
+ private final Session session;
+
+ private Direction direction;
+ private int length = DEFAULT_LENGTH;
+ private Location head;
+ private final Deque<Location> tail = new ArrayDeque<>();
+ private final String hexColor;
+
+ public Snake(int id, Session session) {
+ this.id = id;
+ this.session = session;
+ this.hexColor = SnakeAnnotation.getRandomHexColor();
+ resetState();
+ }
+
+ private void resetState() {
+ this.direction = Direction.NONE;
+ this.head = SnakeAnnotation.getRandomLocation();
+ this.tail.clear();
+ this.length = DEFAULT_LENGTH;
+ }
+
+ private synchronized void kill() {
+ resetState();
+ sendMessage("{\"type\": \"dead\"}");
+ }
+
+ private synchronized void reward() {
+ length++;
+ sendMessage("{\"type\": \"kill\"}");
+ }
+
+
+ protected void sendMessage(String msg) {
+ try {
+ session.getBasicRemote().sendText(msg);
+ } catch (IOException ioe) {
+ CloseReason cr =
+ new CloseReason(CloseCodes.CLOSED_ABNORMALLY, ioe.getMessage());
+ try {
+ session.close(cr);
+ } catch (IOException ioe2) {
+ // Ignore
+ }
+ }
+ }
+
+ public synchronized void update(Collection<Snake> snakes) {
+ Location nextLocation = head.getAdjacentLocation(direction);
+ if (nextLocation.x >= SnakeAnnotation.PLAYFIELD_WIDTH) {
+ nextLocation.x = 0;
+ }
+ if (nextLocation.y >= SnakeAnnotation.PLAYFIELD_HEIGHT) {
+ nextLocation.y = 0;
+ }
+ if (nextLocation.x < 0) {
+ nextLocation.x = SnakeAnnotation.PLAYFIELD_WIDTH;
+ }
+ if (nextLocation.y < 0) {
+ nextLocation.y = SnakeAnnotation.PLAYFIELD_HEIGHT;
+ }
+ if (direction != Direction.NONE) {
+ tail.addFirst(head);
+ if (tail.size() > length) {
+ tail.removeLast();
+ }
+ head = nextLocation;
+ }
+
+ handleCollisions(snakes);
+ }
+
+ private void handleCollisions(Collection<Snake> snakes) {
+ for (Snake snake : snakes) {
+ boolean headCollision = id != snake.id && snake.getHead().equals(head);
+ boolean tailCollision = snake.getTail().contains(head);
+ if (headCollision || tailCollision) {
+ kill();
+ if (id != snake.id) {
+ snake.reward();
+ }
+ }
+ }
+ }
+
+ public synchronized Location getHead() {
+ return head;
+ }
+
+ public synchronized Collection<Location> getTail() {
+ return tail;
+ }
+
+ public synchronized void setDirection(Direction direction) {
+ this.direction = direction;
+ }
+
+ public synchronized String getLocationsJson() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(String.format("{\"x\": %d, \"y\": %d}",
+ Integer.valueOf(head.x), Integer.valueOf(head.y)));
+ for (Location location : tail) {
+ sb.append(',');
+ sb.append(String.format("{\"x\": %d, \"y\": %d}",
+ Integer.valueOf(location.x), Integer.valueOf(location.y)));
+ }
+ return String.format("{\"id\":%d,\"body\":[%s]}",
+ Integer.valueOf(id), sb.toString());
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public String getHexColor() {
+ return hexColor;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.class
new file mode 100644
index 0000000..266344c
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.java
new file mode 100644
index 0000000..c030dbc
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.java
@@ -0,0 +1,135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.snake;
+
+import java.awt.Color;
+import java.io.EOFException;
+import java.util.Iterator;
+import java.util.Random;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.websocket.OnClose;
+import javax.websocket.OnError;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+
+@ServerEndpoint(value = "/websocket/snake")
+public class SnakeAnnotation {
+
+ public static final int PLAYFIELD_WIDTH = 640;
+ public static final int PLAYFIELD_HEIGHT = 480;
+ public static final int GRID_SIZE = 10;
+
+ private static final AtomicInteger snakeIds = new AtomicInteger(0);
+ private static final Random random = new Random();
+
+
+ private final int id;
+ private Snake snake;
+
+ public static String getRandomHexColor() {
+ float hue = random.nextFloat();
+ // sat between 0.1 and 0.3
+ float saturation = (random.nextInt(2000) + 1000) / 10000f;
+ float luminance = 0.9f;
+ Color color = Color.getHSBColor(hue, saturation, luminance);
+ return '#' + Integer.toHexString(
+ (color.getRGB() & 0xffffff) | 0x1000000).substring(1);
+ }
+
+
+ public static Location getRandomLocation() {
+ int x = roundByGridSize(random.nextInt(PLAYFIELD_WIDTH));
+ int y = roundByGridSize(random.nextInt(PLAYFIELD_HEIGHT));
+ return new Location(x, y);
+ }
+
+
+ private static int roundByGridSize(int value) {
+ value = value + (GRID_SIZE / 2);
+ value = value / GRID_SIZE;
+ value = value * GRID_SIZE;
+ return value;
+ }
+
+ public SnakeAnnotation() {
+ this.id = snakeIds.getAndIncrement();
+ }
+
+
+ @OnOpen
+ public void onOpen(Session session) {
+ this.snake = new Snake(id, session);
+ SnakeTimer.addSnake(snake);
+ StringBuilder sb = new StringBuilder();
+ for (Iterator<Snake> iterator = SnakeTimer.getSnakes().iterator();
+ iterator.hasNext();) {
+ Snake snake = iterator.next();
+ sb.append(String.format("{\"id\": %d, \"color\": \"%s\"}",
+ Integer.valueOf(snake.getId()), snake.getHexColor()));
+ if (iterator.hasNext()) {
+ sb.append(',');
+ }
+ }
+ SnakeTimer.broadcast(String.format("{\"type\": \"join\",\"data\":[%s]}",
+ sb.toString()));
+ }
+
+
+ @OnMessage
+ public void onTextMessage(String message) {
+ if ("west".equals(message)) {
+ snake.setDirection(Direction.WEST);
+ } else if ("north".equals(message)) {
+ snake.setDirection(Direction.NORTH);
+ } else if ("east".equals(message)) {
+ snake.setDirection(Direction.EAST);
+ } else if ("south".equals(message)) {
+ snake.setDirection(Direction.SOUTH);
+ }
+ }
+
+
+ @OnClose
+ public void onClose() {
+ SnakeTimer.removeSnake(snake);
+ SnakeTimer.broadcast(String.format("{\"type\": \"leave\", \"id\": %d}",
+ Integer.valueOf(id)));
+ }
+
+
+ @OnError
+ public void onError(Throwable t) throws Throwable {
+ // Most likely cause is a user closing their browser. Check to see if
+ // the root cause is EOF and if it is ignore it.
+ // Protect against infinite loops.
+ int count = 0;
+ Throwable root = t;
+ while (root.getCause() != null && count < 20) {
+ root = root.getCause();
+ count ++;
+ }
+ if (root instanceof EOFException) {
+ // Assume this is triggered by the user closing their browser and
+ // ignore it.
+ } else {
+ throw t;
+ }
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer$1.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer$1.class
new file mode 100644
index 0000000..59e00f4
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer$1.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.class b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.class
new file mode 100644
index 0000000..0ba3089
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.java b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.java
new file mode 100644
index 0000000..0115413
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package websocket.snake;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+
+/**
+ * Sets up the timer for the multi-player snake game WebSocket example.
+ */
+public class SnakeTimer {
+
+ private static final Log log =
+ LogFactory.getLog(SnakeTimer.class);
+
+ private static Timer gameTimer = null;
+
+ private static final long TICK_DELAY = 100;
+
+ private static final ConcurrentHashMap<Integer, Snake> snakes =
+ new ConcurrentHashMap<>();
+
+ protected static synchronized void addSnake(Snake snake) {
+ if (snakes.size() == 0) {
+ startTimer();
+ }
+ snakes.put(Integer.valueOf(snake.getId()), snake);
+ }
+
+
+ protected static Collection<Snake> getSnakes() {
+ return Collections.unmodifiableCollection(snakes.values());
+ }
+
+
+ protected static synchronized void removeSnake(Snake snake) {
+ snakes.remove(Integer.valueOf(snake.getId()));
+ if (snakes.size() == 0) {
+ stopTimer();
+ }
+ }
+
+
+ protected static void tick() {
+ StringBuilder sb = new StringBuilder();
+ for (Iterator<Snake> iterator = SnakeTimer.getSnakes().iterator();
+ iterator.hasNext();) {
+ Snake snake = iterator.next();
+ snake.update(SnakeTimer.getSnakes());
+ sb.append(snake.getLocationsJson());
+ if (iterator.hasNext()) {
+ sb.append(',');
+ }
+ }
+ broadcast(String.format("{\"type\": \"update\", \"data\" : [%s]}",
+ sb.toString()));
+ }
+
+ protected static void broadcast(String message) {
+ for (Snake snake : SnakeTimer.getSnakes()) {
+ try {
+ snake.sendMessage(message);
+ } catch (IllegalStateException ise) {
+ // An ISE can occur if an attempt is made to write to a
+ // WebSocket connection after it has been closed. The
+ // alternative to catching this exception is to synchronise
+ // the writes to the clients along with the addSnake() and
+ // removeSnake() methods that are already synchronised.
+ }
+ }
+ }
+
+
+ public static void startTimer() {
+ gameTimer = new Timer(SnakeTimer.class.getSimpleName() + " Timer");
+ gameTimer.scheduleAtFixedRate(new TimerTask() {
+ @Override
+ public void run() {
+ try {
+ tick();
+ } catch (RuntimeException e) {
+ log.error("Caught to prevent timer from shutting down", e);
+ }
+ }
+ }, TICK_DELAY, TICK_DELAY);
+ }
+
+
+ public static void stopTimer() {
+ if (gameTimer != null) {
+ gameTimer.cancel();
+ }
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/jsp/applet/Clock2.java b/web/tomcat/webapps/examples/WEB-INF/jsp/applet/Clock2.java
new file mode 100644
index 0000000..128cfbd
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/jsp/applet/Clock2.java
@@ -0,0 +1,229 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import java.applet.Applet;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * Time!
+ *
+ * @author Rachel Gollub
+ */
+
+public class Clock2 extends Applet implements Runnable {
+ private static final long serialVersionUID = 1L;
+ Thread timer; // The thread that displays clock
+ int lastxs, lastys, lastxm,
+ lastym, lastxh, lastyh; // Dimensions used to draw hands
+ SimpleDateFormat formatter; // Formats the date displayed
+ String lastdate; // String to hold date displayed
+ Font clockFaceFont; // Font for number display on clock
+ Date currentDate; // Used to get date to display
+ Color handColor; // Color of main hands and dial
+ Color numberColor; // Color of second hand and numbers
+
+ @Override
+ public void init() {
+ lastxs = lastys = lastxm = lastym = lastxh = lastyh = 0;
+ formatter = new SimpleDateFormat ("EEE MMM dd hh:mm:ss yyyy", Locale.getDefault());
+ currentDate = new Date();
+ lastdate = formatter.format(currentDate);
+ clockFaceFont = new Font("Serif", Font.PLAIN, 14);
+ handColor = Color.blue;
+ numberColor = Color.darkGray;
+
+ try {
+ setBackground(new Color(Integer.parseInt(getParameter("bgcolor"),16)));
+ } catch (Exception e) {
+ // Ignore
+ }
+ try {
+ handColor = new Color(Integer.parseInt(getParameter("fgcolor1"),16));
+ } catch (Exception e) {
+ // Ignore
+ }
+ try {
+ numberColor = new Color(Integer.parseInt(getParameter("fgcolor2"),16));
+ } catch (Exception e) {
+ // Ignore
+ }
+ resize(300,300); // Set clock window size
+ }
+
+ // Plotpoints allows calculation to only cover 45 degrees of the circle,
+ // and then mirror
+ public void plotpoints(int x0, int y0, int x, int y, Graphics g) {
+ g.drawLine(x0+x,y0+y,x0+x,y0+y);
+ g.drawLine(x0+y,y0+x,x0+y,y0+x);
+ g.drawLine(x0+y,y0-x,x0+y,y0-x);
+ g.drawLine(x0+x,y0-y,x0+x,y0-y);
+ g.drawLine(x0-x,y0-y,x0-x,y0-y);
+ g.drawLine(x0-y,y0-x,x0-y,y0-x);
+ g.drawLine(x0-y,y0+x,x0-y,y0+x);
+ g.drawLine(x0-x,y0+y,x0-x,y0+y);
+ }
+
+ // Circle is just Bresenham's algorithm for a scan converted circle
+ public void circle(int x0, int y0, int r, Graphics g) {
+ int x,y;
+ float d;
+ x=0;
+ y=r;
+ d=5/4-r;
+ plotpoints(x0,y0,x,y,g);
+
+ while (y>x){
+ if (d<0) {
+ d=d+2*x+3;
+ x++;
+ } else {
+ d=d+2*(x-y)+5;
+ x++;
+ y--;
+ }
+ plotpoints(x0,y0,x,y,g);
+ }
+ }
+
+ // Paint is the main part of the program
+ @Override
+ public void paint(Graphics g) {
+ int xh, yh, xm, ym, xs, ys, s = 0, m = 10, h = 10, xcenter, ycenter;
+ String today;
+
+ currentDate = new Date();
+ SimpleDateFormat formatter = new SimpleDateFormat("s",Locale.getDefault());
+ try {
+ s = Integer.parseInt(formatter.format(currentDate));
+ } catch (NumberFormatException n) {
+ s = 0;
+ }
+ formatter.applyPattern("m");
+ try {
+ m = Integer.parseInt(formatter.format(currentDate));
+ } catch (NumberFormatException n) {
+ m = 10;
+ }
+ formatter.applyPattern("h");
+ try {
+ h = Integer.parseInt(formatter.format(currentDate));
+ } catch (NumberFormatException n) {
+ h = 10;
+ }
+ formatter.applyPattern("EEE MMM dd HH:mm:ss yyyy");
+ today = formatter.format(currentDate);
+ xcenter=80;
+ ycenter=55;
+
+ // a= s* pi/2 - pi/2 (to switch 0,0 from 3:00 to 12:00)
+ // x = r(cos a) + xcenter, y = r(sin a) + ycenter
+
+ xs = (int)(Math.cos(s * Math.PI/30 - Math.PI/2) * 45 + xcenter);
+ ys = (int)(Math.sin(s * Math.PI/30 - Math.PI/2) * 45 + ycenter);
+ xm = (int)(Math.cos(m * Math.PI/30 - Math.PI/2) * 40 + xcenter);
+ ym = (int)(Math.sin(m * Math.PI/30 - Math.PI/2) * 40 + ycenter);
+ xh = (int)(Math.cos((h*30 + m/2) * Math.PI/180 - Math.PI/2) * 30 + xcenter);
+ yh = (int)(Math.sin((h*30 + m/2) * Math.PI/180 - Math.PI/2) * 30 + ycenter);
+
+ // Draw the circle and numbers
+
+ g.setFont(clockFaceFont);
+ g.setColor(handColor);
+ circle(xcenter,ycenter,50,g);
+ g.setColor(numberColor);
+ g.drawString("9",xcenter-45,ycenter+3);
+ g.drawString("3",xcenter+40,ycenter+3);
+ g.drawString("12",xcenter-5,ycenter-37);
+ g.drawString("6",xcenter-3,ycenter+45);
+
+ // Erase if necessary, and redraw
+
+ g.setColor(getBackground());
+ if (xs != lastxs || ys != lastys) {
+ g.drawLine(xcenter, ycenter, lastxs, lastys);
+ g.drawString(lastdate, 5, 125);
+ }
+ if (xm != lastxm || ym != lastym) {
+ g.drawLine(xcenter, ycenter-1, lastxm, lastym);
+ g.drawLine(xcenter-1, ycenter, lastxm, lastym); }
+ if (xh != lastxh || yh != lastyh) {
+ g.drawLine(xcenter, ycenter-1, lastxh, lastyh);
+ g.drawLine(xcenter-1, ycenter, lastxh, lastyh); }
+ g.setColor(numberColor);
+ g.drawString("", 5, 125);
+ g.drawString(today, 5, 125);
+ g.drawLine(xcenter, ycenter, xs, ys);
+ g.setColor(handColor);
+ g.drawLine(xcenter, ycenter-1, xm, ym);
+ g.drawLine(xcenter-1, ycenter, xm, ym);
+ g.drawLine(xcenter, ycenter-1, xh, yh);
+ g.drawLine(xcenter-1, ycenter, xh, yh);
+ lastxs=xs; lastys=ys;
+ lastxm=xm; lastym=ym;
+ lastxh=xh; lastyh=yh;
+ lastdate = today;
+ currentDate=null;
+ }
+
+ @Override
+ public void start() {
+ timer = new Thread(this);
+ timer.start();
+ }
+
+ @Override
+ public void stop() {
+ timer = null;
+ }
+
+ @Override
+ public void run() {
+ Thread me = Thread.currentThread();
+ while (timer == me) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ }
+ repaint();
+ }
+ }
+
+ @Override
+ public void update(Graphics g) {
+ paint(g);
+ }
+
+ @Override
+ public String getAppletInfo() {
+ return "Title: A Clock \nAuthor: Rachel Gollub, 1995 \nAn analog clock.";
+ }
+
+ @Override
+ public String[][] getParameterInfo() {
+ String[][] info = {
+ {"bgcolor", "hexadecimal RGB number", "The background color. Default is the color of your browser."},
+ {"fgcolor1", "hexadecimal RGB number", "The color of the hands and dial. Default is blue."},
+ {"fgcolor2", "hexadecimal RGB number", "The color of the seconds hand and numbers. Default is dark gray."}
+ };
+ return info;
+ }
+}
diff --git a/web/tomcat/webapps/examples/WEB-INF/jsp/debug-taglib.tld b/web/tomcat/webapps/examples/WEB-INF/jsp/debug-taglib.tld
new file mode 100644
index 0000000..424a3df
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/jsp/debug-taglib.tld
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!DOCTYPE taglib
+ PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
+ "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
+
+<!-- a tag library descriptor -->
+
+<taglib>
+ <tlib-version>1.0</tlib-version>
+ <jsp-version>1.2</jsp-version>
+ <short-name>debug</short-name>
+ <uri>http://tomcat.apache.org/debug-taglib</uri>
+ <description>
+ This tag library defines no tags. Instead, its purpose is encapsulated
+ in the TagLibraryValidator implementation that simply outputs the XML
+ version of a JSP page to standard output, whenever this tag library is
+ referenced in a "taglib" directive in a JSP page.
+ </description>
+ <validator>
+ <validator-class>validators.DebugValidator</validator-class>
+ </validator>
+
+ <!-- This is a dummy tag solely to satisfy DTD requirements -->
+ <tag>
+ <name>log</name>
+ <tag-class>examples.LogTag</tag-class>
+ <body-content>TAGDEPENDENT</body-content>
+ <description>
+ Perform a server side action; Log the message.
+ </description>
+ <attribute>
+ <name>toBrowser</name>
+ <required>false</required>
+ </attribute>
+ </tag>
+
+
+</taglib>
diff --git a/web/tomcat/webapps/examples/WEB-INF/jsp/example-taglib.tld b/web/tomcat/webapps/examples/WEB-INF/jsp/example-taglib.tld
new file mode 100644
index 0000000..f60e353
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/jsp/example-taglib.tld
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!DOCTYPE taglib
+ PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
+ "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
+
+<taglib>
+
+ <tlib-version>1.0</tlib-version>
+ <jsp-version>1.2</jsp-version>
+ <short-name>simple</short-name>
+ <uri>http://tomcat.apache.org/example-taglib</uri>
+ <description>
+ A simple tab library for the examples
+ </description>
+
+ <!-- A simple Tag -->
+ <!-- foo tag -->
+ <tag>
+ <name>foo</name>
+ <tag-class>examples.FooTag</tag-class>
+ <tei-class>examples.FooTagExtraInfo</tei-class>
+ <body-content>JSP</body-content>
+ <description>
+ Perform a server side action; uses 3 mandatory attributes
+ </description>
+
+ <attribute>
+ <name>att1</name>
+ <required>true</required>
+ </attribute>
+ <attribute>
+ <name>att2</name>
+ <required>true</required>
+ </attribute>
+ <attribute>
+ <name>att3</name>
+ <required>true</required>
+ </attribute>
+ </tag>
+
+ <!-- Another simple tag -->
+ <!-- log tag -->
+ <tag>
+ <name>log</name>
+ <tag-class>examples.LogTag</tag-class>
+ <body-content>TAGDEPENDENT</body-content>
+ <description>
+ Perform a server side action; Log the message.
+ </description>
+ <attribute>
+ <name>toBrowser</name>
+ <required>false</required>
+ </attribute>
+ </tag>
+
+ <!-- Another simple Tag -->
+ <!-- values tag -->
+ <tag>
+ <name>values</name>
+ <tag-class>examples.ValuesTag</tag-class>
+ <body-content>empty</body-content>
+ <description>
+ Accept and return values of different types. This tag is used
+ to illustrate type coercions.
+ </description>
+ <attribute>
+ <name>object</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.Object</type>
+ </attribute>
+ <attribute>
+ <name>string</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <name>long</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>long</type>
+ </attribute>
+ <attribute>
+ <name>double</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>double</type>
+ </attribute>
+ </tag>
+</taglib>
diff --git a/web/tomcat/webapps/examples/WEB-INF/jsp2/jsp2-example-taglib.tld b/web/tomcat/webapps/examples/WEB-INF/jsp2/jsp2-example-taglib.tld
new file mode 100644
index 0000000..73173bd
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/jsp2/jsp2-example-taglib.tld
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
+ version="2.0">
+ <description>A tag library exercising SimpleTag handlers.</description>
+ <tlib-version>1.0</tlib-version>
+ <short-name>SimpleTagLibrary</short-name>
+ <uri>http://tomcat.apache.org/jsp2-example-taglib</uri>
+ <tag>
+ <description>Outputs Hello, World</description>
+ <name>helloWorld</name>
+ <tag-class>jsp2.examples.simpletag.HelloWorldSimpleTag</tag-class>
+ <body-content>empty</body-content>
+ </tag>
+ <tag>
+ <description>Repeats the body of the tag 'num' times</description>
+ <name>repeat</name>
+ <tag-class>jsp2.examples.simpletag.RepeatSimpleTag</tag-class>
+ <body-content>scriptless</body-content>
+ <variable>
+ <description>Current invocation count (1 to num)</description>
+ <name-given>count</name-given>
+ </variable>
+ <attribute>
+ <name>num</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ </tag>
+ <tag>
+ <description>Populates the page context with a BookBean</description>
+ <name>findBook</name>
+ <tag-class>jsp2.examples.simpletag.FindBookSimpleTag</tag-class>
+ <body-content>empty</body-content>
+ <attribute>
+ <name>var</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ Takes 3 fragments and invokes them in a random order
+ </description>
+ <name>shuffle</name>
+ <tag-class>jsp2.examples.simpletag.ShuffleSimpleTag</tag-class>
+ <body-content>empty</body-content>
+ <attribute>
+ <name>fragment1</name>
+ <required>true</required>
+ <fragment>true</fragment>
+ </attribute>
+ <attribute>
+ <name>fragment2</name>
+ <required>true</required>
+ <fragment>true</fragment>
+ </attribute>
+ <attribute>
+ <name>fragment3</name>
+ <required>true</required>
+ <fragment>true</fragment>
+ </attribute>
+ </tag>
+ <tag>
+ <description>Outputs a colored tile</description>
+ <name>tile</name>
+ <tag-class>jsp2.examples.simpletag.TileSimpleTag</tag-class>
+ <body-content>empty</body-content>
+ <attribute>
+ <name>color</name>
+ <required>true</required>
+ </attribute>
+ <attribute>
+ <name>label</name>
+ <required>true</required>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ Tag that echoes all its attributes and body content
+ </description>
+ <name>echoAttributes</name>
+ <tag-class>jsp2.examples.simpletag.EchoAttributesTag</tag-class>
+ <body-content>empty</body-content>
+ <dynamic-attributes>true</dynamic-attributes>
+ </tag>
+ <function>
+ <description>Reverses the characters in the given String</description>
+ <name>reverse</name>
+ <function-class>jsp2.examples.el.Functions</function-class>
+ <function-signature>java.lang.String reverse( java.lang.String )</function-signature>
+ </function>
+ <function>
+ <description>Counts the number of vowels (a,e,i,o,u) in the given String</description>
+ <name>countVowels</name>
+ <function-class>jsp2.examples.el.Functions</function-class>
+ <function-signature>java.lang.String numVowels( java.lang.String )</function-signature>
+ </function>
+ <function>
+ <description>Converts the string to all caps</description>
+ <name>caps</name>
+ <function-class>jsp2.examples.el.Functions</function-class>
+ <function-signature>java.lang.String caps( java.lang.String )</function-signature>
+ </function>
+</taglib>
+
diff --git a/web/tomcat/webapps/examples/WEB-INF/lib/taglibs-standard-impl-1.2.5.jar b/web/tomcat/webapps/examples/WEB-INF/lib/taglibs-standard-impl-1.2.5.jar
new file mode 100644
index 0000000..9176777
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/lib/taglibs-standard-impl-1.2.5.jar
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/lib/taglibs-standard-spec-1.2.5.jar b/web/tomcat/webapps/examples/WEB-INF/lib/taglibs-standard-spec-1.2.5.jar
new file mode 100644
index 0000000..d547867
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/lib/taglibs-standard-spec-1.2.5.jar
Binary files differ
diff --git a/web/tomcat/webapps/examples/WEB-INF/tags/displayProducts.tag b/web/tomcat/webapps/examples/WEB-INF/tags/displayProducts.tag
new file mode 100644
index 0000000..41e8c35
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/tags/displayProducts.tag
@@ -0,0 +1,55 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ attribute name="normalPrice" fragment="true" %>
+<%@ attribute name="onSale" fragment="true" %>
+<%@ variable name-given="name" %>
+<%@ variable name-given="price" %>
+<%@ variable name-given="origPrice" %>
+<%@ variable name-given="salePrice" %>
+
+<table border="1">
+ <tr>
+ <td>
+ <c:set var="name" value="Hand-held Color PDA"/>
+ <c:set var="price" value="$298.86"/>
+ <jsp:invoke fragment="normalPrice"/>
+ </td>
+ <td>
+ <c:set var="name" value="4-Pack 150 Watt Light Bulbs"/>
+ <c:set var="origPrice" value="$2.98"/>
+ <c:set var="salePrice" value="$2.32"/>
+ <jsp:invoke fragment="onSale"/>
+ </td>
+ <td>
+ <c:set var="name" value="Digital Cellular Phone"/>
+ <c:set var="price" value="$68.74"/>
+ <jsp:invoke fragment="normalPrice"/>
+ </td>
+ <td>
+ <c:set var="name" value="Baby Grand Piano"/>
+ <c:set var="price" value="$10,800.00"/>
+ <jsp:invoke fragment="normalPrice"/>
+ </td>
+ <td>
+ <c:set var="name" value="Luxury Car w/ Leather Seats"/>
+ <c:set var="origPrice" value="$23,980.00"/>
+ <c:set var="salePrice" value="$21,070.00"/>
+ <jsp:invoke fragment="onSale"/>
+ </td>
+ </tr>
+</table>
diff --git a/web/tomcat/webapps/examples/WEB-INF/tags/helloWorld.tag b/web/tomcat/webapps/examples/WEB-INF/tags/helloWorld.tag
new file mode 100644
index 0000000..192bf53
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/tags/helloWorld.tag
@@ -0,0 +1,17 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+Hello, world!
diff --git a/web/tomcat/webapps/examples/WEB-INF/tags/panel.tag b/web/tomcat/webapps/examples/WEB-INF/tags/panel.tag
new file mode 100644
index 0000000..f4f30d0
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/tags/panel.tag
@@ -0,0 +1,29 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<%@ attribute name="color" %>
+<%@ attribute name="bgcolor" %>
+<%@ attribute name="title" %>
+<table border="1" bgcolor="${color}">
+ <tr>
+ <td><b>${title}</b></td>
+ </tr>
+ <tr>
+ <td bgcolor="${bgcolor}">
+ <jsp:doBody/>
+ </td>
+ </tr>
+</table>
diff --git a/web/tomcat/webapps/examples/WEB-INF/web.xml b/web/tomcat/webapps/examples/WEB-INF/web.xml
new file mode 100644
index 0000000..1a823a5
--- /dev/null
+++ b/web/tomcat/webapps/examples/WEB-INF/web.xml
@@ -0,0 +1,418 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
+ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+ version="3.1"
+ metadata-complete="true">
+
+ <description>
+ Servlet and JSP Examples.
+ </description>
+ <display-name>Servlet and JSP Examples</display-name>
+
+ <!-- Define example filters -->
+ <filter>
+ <filter-name>Timing Filter</filter-name>
+ <filter-class>filters.ExampleFilter</filter-class>
+ <init-param>
+ <param-name>attribute</param-name>
+ <param-value>filters.ExampleFilter</param-value>
+ </init-param>
+ </filter>
+
+ <filter>
+ <filter-name>Request Dumper Filter</filter-name>
+ <filter-class>org.apache.catalina.filters.RequestDumperFilter</filter-class>
+ </filter>
+
+ <!-- Example filter to set character encoding on each request -->
+ <filter>
+ <filter-name>Set Character Encoding</filter-name>
+ <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
+ <async-supported>true</async-supported>
+ <init-param>
+ <param-name>encoding</param-name>
+ <param-value>UTF-8</param-value>
+ </init-param>
+ <init-param>
+ <param-name>ignore</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ </filter>
+
+ <filter>
+ <filter-name>Compression Filter</filter-name>
+ <filter-class>compressionFilters.CompressionFilter</filter-class>
+ <init-param>
+ <param-name>compressionThreshold</param-name>
+ <param-value>128</param-value>
+ </init-param>
+ <init-param>
+ <param-name>compressionBuffer</param-name>
+ <param-value>8192</param-value>
+ </init-param>
+ <init-param>
+ <param-name>compressionMimeTypes</param-name>
+ <param-value>text/html,text/plain,text/xml</param-value>
+ </init-param>
+ <init-param>
+ <param-name>debug</param-name>
+ <param-value>0</param-value>
+ </init-param>
+ </filter>
+
+ <!-- Configured to set X-FRAME-OPTIONS. Disable HSTS in case it -->
+ <!-- interferes with an existing setting. Keep X-Content-Type-Options -->
+ <!-- and X-XSS-Protection as they are page specific. -->
+ <filter>
+ <filter-name>HTTP header security filter</filter-name>
+ <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
+ <async-supported>true</async-supported>
+ <init-param>
+ <param-name>hstsEnabled</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ </filter>
+
+ <!-- Define filter mappings for the timing filters -->
+ <!--
+ <filter-mapping>
+ <filter-name>Timing Filter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+ -->
+
+<!-- Example filter mapping to apply the "Set Character Encoding" filter
+ to *all* requests processed by this web application -->
+ <filter-mapping>
+ <filter-name>Set Character Encoding</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+<!--
+ <filter-mapping>
+ <filter-name>Compression Filter</filter-name>
+ <url-pattern>/CompressionTest</url-pattern>
+ </filter-mapping>
+-->
+
+<!--
+ <filter-mapping>
+ <filter-name>Request Dumper Filter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+-->
+
+ <!-- Enable header security filter for all requests -->
+ <filter-mapping>
+ <filter-name>HTTP header security filter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <!-- Define example application events listeners -->
+ <listener>
+ <listener-class>listeners.ContextListener</listener-class>
+ </listener>
+ <listener>
+ <listener-class>listeners.SessionListener</listener-class>
+ </listener>
+
+ <!-- Define listeners required by examples -->
+ <listener>
+ <listener-class>async.AsyncStockContextListener</listener-class>
+ </listener>
+
+ <!-- Define servlets that are included in the example application -->
+
+ <servlet>
+ <servlet-name>ServletToJsp</servlet-name>
+ <servlet-class>ServletToJsp</servlet-class>
+ </servlet>
+ <servlet>
+ <servlet-name>CompressionFilterTestServlet</servlet-name>
+ <servlet-class>compressionFilters.CompressionFilterTestServlet</servlet-class>
+ </servlet>
+ <servlet>
+ <servlet-name>HelloWorldExample</servlet-name>
+ <servlet-class>HelloWorldExample</servlet-class>
+ </servlet>
+ <servlet>
+ <servlet-name>RequestInfoExample</servlet-name>
+ <servlet-class>RequestInfoExample</servlet-class>
+ </servlet>
+ <servlet>
+ <servlet-name>RequestHeaderExample</servlet-name>
+ <servlet-class>RequestHeaderExample</servlet-class>
+ </servlet>
+ <servlet>
+ <servlet-name>RequestParamExample</servlet-name>
+ <servlet-class>RequestParamExample</servlet-class>
+ </servlet>
+ <servlet>
+ <servlet-name>CookieExample</servlet-name>
+ <servlet-class>CookieExample</servlet-class>
+ </servlet>
+ <servlet>
+ <servlet-name>SessionExample</servlet-name>
+ <servlet-class>SessionExample</servlet-class>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>CompressionFilterTestServlet</servlet-name>
+ <url-pattern>/CompressionTest</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>HelloWorldExample</servlet-name>
+ <url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>RequestInfoExample</servlet-name>
+ <url-pattern>/servlets/servlet/RequestInfoExample/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>RequestHeaderExample</servlet-name>
+ <url-pattern>/servlets/servlet/RequestHeaderExample</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>RequestParamExample</servlet-name>
+ <url-pattern>/servlets/servlet/RequestParamExample</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>CookieExample</servlet-name>
+ <url-pattern>/servlets/servlet/CookieExample</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>SessionExample</servlet-name>
+ <url-pattern>/servlets/servlet/SessionExample</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>ServletToJsp</servlet-name>
+ <url-pattern>/servletToJsp</url-pattern>
+ </servlet-mapping>
+
+ <jsp-config>
+ <taglib>
+ <taglib-uri>
+ http://tomcat.apache.org/debug-taglib
+ </taglib-uri>
+ <taglib-location>
+ /WEB-INF/jsp/debug-taglib.tld
+ </taglib-location>
+ </taglib>
+
+ <taglib>
+ <taglib-uri>
+ http://tomcat.apache.org/example-taglib
+ </taglib-uri>
+ <taglib-location>
+ /WEB-INF/jsp/example-taglib.tld
+ </taglib-location>
+ </taglib>
+
+ <taglib>
+ <taglib-uri>
+ http://tomcat.apache.org/jsp2-example-taglib
+ </taglib-uri>
+ <taglib-location>
+ /WEB-INF/jsp2/jsp2-example-taglib.tld
+ </taglib-location>
+ </taglib>
+
+ <jsp-property-group>
+ <description>
+ Special property group for JSP Configuration JSP example.
+ </description>
+ <display-name>JSPConfiguration</display-name>
+ <url-pattern>/jsp/jsp2/misc/config.jsp</url-pattern>
+ <el-ignored>true</el-ignored>
+ <page-encoding>ISO-8859-1</page-encoding>
+ <scripting-invalid>true</scripting-invalid>
+ <include-prelude>/jsp/jsp2/misc/prelude.jspf</include-prelude>
+ <include-coda>/jsp/jsp2/misc/coda.jspf</include-coda>
+ </jsp-property-group>
+ </jsp-config>
+
+ <security-constraint>
+ <display-name>Example Security Constraint - part 1</display-name>
+ <web-resource-collection>
+ <web-resource-name>Protected Area - Allow methods</web-resource-name>
+ <!-- Define the context-relative URL(s) to be protected -->
+ <url-pattern>/jsp/security/protected/*</url-pattern>
+ <!-- If you list http methods, only those methods are protected so -->
+ <!-- the constraint below ensures all other methods are denied -->
+ <http-method>DELETE</http-method>
+ <http-method>GET</http-method>
+ <http-method>POST</http-method>
+ <http-method>PUT</http-method>
+ </web-resource-collection>
+ <auth-constraint>
+ <!-- Anyone with one of the listed roles may access this area -->
+ <role-name>tomcat</role-name>
+ <role-name>role1</role-name>
+ </auth-constraint>
+ </security-constraint>
+ <security-constraint>
+ <display-name>Example Security Constraint - part 2</display-name>
+ <web-resource-collection>
+ <web-resource-name>Protected Area - Deny methods</web-resource-name>
+ <!-- Define the context-relative URL(s) to be protected -->
+ <url-pattern>/jsp/security/protected/*</url-pattern>
+ <http-method-omission>DELETE</http-method-omission>
+ <http-method-omission>GET</http-method-omission>
+ <http-method-omission>POST</http-method-omission>
+ <http-method-omission>PUT</http-method-omission>
+ </web-resource-collection>
+ <!-- An empty auth constraint denies access -->
+ <auth-constraint />
+ </security-constraint>
+
+ <!-- Default login configuration uses form-based authentication -->
+ <login-config>
+ <auth-method>FORM</auth-method>
+ <realm-name>Example Form-Based Authentication Area</realm-name>
+ <form-login-config>
+ <form-login-page>/jsp/security/protected/login.jsp</form-login-page>
+ <form-error-page>/jsp/security/protected/error.jsp</form-error-page>
+ </form-login-config>
+ </login-config>
+
+ <!-- Security roles referenced by this web application -->
+ <security-role>
+ <role-name>role1</role-name>
+ </security-role>
+ <security-role>
+ <role-name>tomcat</role-name>
+ </security-role>
+
+ <!-- Environment entry examples -->
+ <!--env-entry>
+ <env-entry-description>
+ The maximum number of tax exemptions allowed to be set.
+ </env-entry-description>
+ <env-entry-name>maxExemptions</env-entry-name>
+ <env-entry-type>java.lang.Integer</env-entry-type>
+ <env-entry-value>15</env-entry-value>
+ </env-entry-->
+ <env-entry>
+ <env-entry-name>minExemptions</env-entry-name>
+ <env-entry-type>java.lang.Integer</env-entry-type>
+ <env-entry-value>1</env-entry-value>
+ </env-entry>
+ <env-entry>
+ <env-entry-name>foo/name1</env-entry-name>
+ <env-entry-type>java.lang.String</env-entry-type>
+ <env-entry-value>value1</env-entry-value>
+ </env-entry>
+ <env-entry>
+ <env-entry-name>foo/bar/name2</env-entry-name>
+ <env-entry-type>java.lang.Boolean</env-entry-type>
+ <env-entry-value>true</env-entry-value>
+ </env-entry>
+ <env-entry>
+ <env-entry-name>name3</env-entry-name>
+ <env-entry-type>java.lang.Integer</env-entry-type>
+ <env-entry-value>1</env-entry-value>
+ </env-entry>
+ <env-entry>
+ <env-entry-name>foo/name4</env-entry-name>
+ <env-entry-type>java.lang.Integer</env-entry-type>
+ <env-entry-value>10</env-entry-value>
+ </env-entry>
+
+ <!-- Async examples -->
+ <servlet>
+ <servlet-name>async0</servlet-name>
+ <servlet-class>async.Async0</servlet-class>
+ <async-supported>true</async-supported>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>async0</servlet-name>
+ <url-pattern>/async/async0</url-pattern>
+ </servlet-mapping>
+ <servlet>
+ <servlet-name>async1</servlet-name>
+ <servlet-class>async.Async1</servlet-class>
+ <async-supported>true</async-supported>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>async1</servlet-name>
+ <url-pattern>/async/async1</url-pattern>
+ </servlet-mapping>
+ <servlet>
+ <servlet-name>async2</servlet-name>
+ <servlet-class>async.Async2</servlet-class>
+ <async-supported>true</async-supported>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>async2</servlet-name>
+ <url-pattern>/async/async2</url-pattern>
+ </servlet-mapping>
+ <servlet>
+ <servlet-name>async3</servlet-name>
+ <servlet-class>async.Async3</servlet-class>
+ <async-supported>true</async-supported>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>async3</servlet-name>
+ <url-pattern>/async/async3</url-pattern>
+ </servlet-mapping>
+ <servlet>
+ <servlet-name>stock</servlet-name>
+ <servlet-class>async.AsyncStockServlet</servlet-class>
+ <async-supported>true</async-supported>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>stock</servlet-name>
+ <url-pattern>/async/stockticker</url-pattern>
+ </servlet-mapping>
+
+ <!-- Non-blocking IO examples -->
+ <servlet>
+ <servlet-name>bytecounter</servlet-name>
+ <servlet-class>nonblocking.ByteCounter</servlet-class>
+ <async-supported>true</async-supported>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>bytecounter</servlet-name>
+ <url-pattern>/servlets/nonblocking/bytecounter</url-pattern>
+ </servlet-mapping>
+ <servlet>
+ <servlet-name>numberwriter</servlet-name>
+ <servlet-class>nonblocking.NumberWriter</servlet-class>
+ <async-supported>true</async-supported>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>numberwriter</servlet-name>
+ <url-pattern>/servlets/nonblocking/numberwriter</url-pattern>
+ </servlet-mapping>
+
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ <welcome-file>index.xhtml</welcome-file>
+ <welcome-file>index.htm</welcome-file>
+ <welcome-file>index.jsp</welcome-file>
+ </welcome-file-list>
+
+ <!-- Websocket examples -->
+ <listener>
+ <listener-class>websocket.drawboard.DrawboardContextListener</listener-class>
+ </listener>
+
+</web-app>
diff --git a/web/tomcat/webapps/examples/index.html b/web/tomcat/webapps/examples/index.html
new file mode 100644
index 0000000..0799e10
--- /dev/null
+++ b/web/tomcat/webapps/examples/index.html
@@ -0,0 +1,30 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!DOCTYPE HTML><html lang="en"><head>
+<meta charset="UTF-8">
+<title>Apache Tomcat Examples</title>
+</head>
+<body>
+<p>
+<h3>Apache Tomcat Examples</H3>
+<p></p>
+<ul>
+<li><a href="servlets">Servlets examples</a></li>
+<li><a href="jsp">JSP Examples</a></li>
+<li><a href="websocket/index.xhtml">WebSocket Examples</a></li>
+</ul>
+</body></html>
diff --git a/web/tomcat/webapps/examples/jsp/async/async1.jsp b/web/tomcat/webapps/examples/jsp/async/async1.jsp
new file mode 100644
index 0000000..af88869
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/async/async1.jsp
@@ -0,0 +1,28 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page session="false" import="java.util.Date,java.text.SimpleDateFormat"%>
+Output from async1.jsp
+Type is <%=request.getDispatcherType()%>
+<%
+ System.out.println("Inside Async 1");
+ if (request.isAsyncStarted()) {
+ request.getAsyncContext().complete();
+ }
+ Date date = new Date(System.currentTimeMillis());
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
+%>
+Completed async request at <%=sdf.format(date)%>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/async/async1.jsp.html b/web/tomcat/webapps/examples/jsp/async/async1.jsp.html
new file mode 100644
index 0000000..2244765
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/async/async1.jsp.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page session="false" import="java.util.Date,java.text.SimpleDateFormat"%>
+Output from async1.jsp
+Type is <%=request.getDispatcherType()%>
+<%
+ System.out.println("Inside Async 1");
+ if (request.isAsyncStarted()) {
+ request.getAsyncContext().complete();
+ }
+ Date date = new Date(System.currentTimeMillis());
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
+%>
+Completed async request at <%=sdf.format(date)%>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/async/async3.jsp b/web/tomcat/webapps/examples/jsp/async/async3.jsp
new file mode 100644
index 0000000..9d24e60
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/async/async3.jsp
@@ -0,0 +1,25 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page session="false" import="java.util.Date,java.text.SimpleDateFormat"%>
+Output from async3.jsp
+Type is <%=request.getDispatcherType()%>
+<%
+ Date date = new Date(System.currentTimeMillis());
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
+%>
+
+Completed async 3 request at <%=sdf.format(date)%>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/async/async3.jsp.html b/web/tomcat/webapps/examples/jsp/async/async3.jsp.html
new file mode 100644
index 0000000..6deced8
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/async/async3.jsp.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page session="false" import="java.util.Date,java.text.SimpleDateFormat"%>
+Output from async3.jsp
+Type is <%=request.getDispatcherType()%>
+<%
+ Date date = new Date(System.currentTimeMillis());
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
+%>
+
+Completed async 3 request at <%=sdf.format(date)%>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/async/index.jsp b/web/tomcat/webapps/examples/jsp/async/index.jsp
new file mode 100644
index 0000000..be2d713
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/async/index.jsp
@@ -0,0 +1,69 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page session="false"%>
+
+<pre>
+Use cases:
+
+1. Simple dispatch
+ - servlet does startAsync()
+ - background thread calls ctx.dispatch()
+ <a href="<%=response.encodeURL("/examples/async/async0")%>"> Async 0 </a>
+
+2. Simple dispatch
+ - servlet does startAsync()
+ - background thread calls dispatch(/path/to/jsp)
+ <a href="<%=response.encodeURL("/examples/async/async1")%>"> Async 1 </a>
+
+3. Simple dispatch
+ - servlet does startAsync()
+ - background thread calls writes and calls complete()
+ <a href="<%=response.encodeURL("/examples/async/async2")%>"> Async 2 </a>
+
+4. Simple dispatch
+ - servlet does a startAsync()
+ - servlet calls dispatch(/path/to/jsp)
+ - servlet calls complete()
+ <a href="<%=response.encodeURL("/examples/async/async3")%>"> Async 3 </a>
+
+3. Timeout s1
+ - servlet does a startAsync()
+ - servlet does a setAsyncTimeout
+ - returns - waits for timeout to happen should return error page
+
+4. Timeout s2
+ - servlet does a startAsync()
+ - servlet does a setAsyncTimeout
+ - servlet does a addAsyncListener
+ - returns - waits for timeout to happen and listener invoked
+
+5. Dispatch to asyncSupported=false servlet
+ - servlet1 does a startAsync()
+ - servlet1 dispatches to dispatch(/servlet2)
+ - the container calls complete() after servlet2 is complete
+ - TODO
+
+6. Chained dispatch
+ - servlet1 does a startAsync
+ - servlet1 does a dispatch to servlet2 (asyncsupported=true)
+ - servlet2 does a dispatch to servlet3 (asyncsupported=true)
+ - servlet3 does a dispatch to servlet4 (asyncsupported=false)
+
+
+7. Stock ticker
+ <a href="<%=response.encodeURL("/examples/async/stockticker")%>"> StockTicker </a>
+</pre>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/async/index.jsp.html b/web/tomcat/webapps/examples/jsp/async/index.jsp.html
new file mode 100644
index 0000000..778b643
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/async/index.jsp.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page session="false"%>
+
+<pre>
+Use cases:
+
+1. Simple dispatch
+ - servlet does startAsync()
+ - background thread calls ctx.dispatch()
+ <a href="<%=response.encodeURL("/examples/async/async0")%>"> Async 0 </a>
+
+2. Simple dispatch
+ - servlet does startAsync()
+ - background thread calls dispatch(/path/to/jsp)
+ <a href="<%=response.encodeURL("/examples/async/async1")%>"> Async 1 </a>
+
+3. Simple dispatch
+ - servlet does startAsync()
+ - background thread calls writes and calls complete()
+ <a href="<%=response.encodeURL("/examples/async/async2")%>"> Async 2 </a>
+
+4. Simple dispatch
+ - servlet does a startAsync()
+ - servlet calls dispatch(/path/to/jsp)
+ - servlet calls complete()
+ <a href="<%=response.encodeURL("/examples/async/async3")%>"> Async 3 </a>
+
+3. Timeout s1
+ - servlet does a startAsync()
+ - servlet does a setAsyncTimeout
+ - returns - waits for timeout to happen should return error page
+
+4. Timeout s2
+ - servlet does a startAsync()
+ - servlet does a setAsyncTimeout
+ - servlet does a addAsyncListener
+ - returns - waits for timeout to happen and listener invoked
+
+5. Dispatch to asyncSupported=false servlet
+ - servlet1 does a startAsync()
+ - servlet1 dispatches to dispatch(/servlet2)
+ - the container calls complete() after servlet2 is complete
+ - TODO
+
+6. Chained dispatch
+ - servlet1 does a startAsync
+ - servlet1 does a dispatch to servlet2 (asyncsupported=true)
+ - servlet2 does a dispatch to servlet3 (asyncsupported=true)
+ - servlet3 does a dispatch to servlet4 (asyncsupported=false)
+
+
+7. Stock ticker
+ <a href="<%=response.encodeURL("/examples/async/stockticker")%>"> StockTicker </a>
+</pre>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/cal/Entries.java.html b/web/tomcat/webapps/examples/jsp/cal/Entries.java.html
new file mode 100644
index 0000000..6598b55
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/cal/Entries.java.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cal;
+
+import java.util.Hashtable;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class Entries {
+
+ private final Hashtable<String, Entry> entries;
+ private static final String[] time = { "8am", "9am", "10am", "11am",
+ "12pm", "1pm", "2pm", "3pm", "4pm", "5pm", "6pm", "7pm", "8pm" };
+ public static final int rows = 12;
+
+ public Entries() {
+ entries = new Hashtable<>(rows);
+ for (int i = 0; i < rows; i++) {
+ entries.put(time[i], new Entry(time[i]));
+ }
+ }
+
+ public int getRows() {
+ return rows;
+ }
+
+ public Entry getEntry(int index) {
+ return this.entries.get(time[index]);
+ }
+
+ public int getIndex(String tm) {
+ for (int i = 0; i < rows; i++) {
+ if (tm.equals(time[i])) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public void processRequest(HttpServletRequest request, String tm) {
+ int index = getIndex(tm);
+ if (index >= 0) {
+ String descr = request.getParameter("description");
+ entries.get(time[index]).setDescription(descr);
+ }
+ }
+
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/cal/Entry.java.html b/web/tomcat/webapps/examples/jsp/cal/Entry.java.html
new file mode 100644
index 0000000..7b77cda
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/cal/Entry.java.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cal;
+
+public class Entry {
+
+ final String hour;
+ String description;
+
+ public Entry(String hour) {
+ this.hour = hour;
+ this.description = "";
+
+ }
+
+ public String getHour() {
+ return this.hour;
+ }
+
+ public String getColor() {
+ if (description.equals("")) {
+ return "lightblue";
+ }
+ return "red";
+ }
+
+ public String getDescription() {
+ if (description.equals("")) {
+ return "None";
+ }
+ return this.description;
+ }
+
+ public void setDescription(String descr) {
+ description = descr;
+ }
+
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/cal/JspCalendar.java.html b/web/tomcat/webapps/examples/jsp/cal/JspCalendar.java.html
new file mode 100644
index 0000000..0a6809c
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/cal/JspCalendar.java.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package cal;
+
+import java.util.Calendar;
+import java.util.Date;
+
+public class JspCalendar {
+ final Calendar calendar;
+
+ public JspCalendar() {
+ calendar = Calendar.getInstance();
+ Date trialTime = new Date();
+ calendar.setTime(trialTime);
+ }
+
+
+ public int getYear() {
+ return calendar.get(Calendar.YEAR);
+ }
+
+ public String getMonth() {
+ int m = getMonthInt();
+ String[] months = new String [] { "January", "February", "March",
+ "April", "May", "June",
+ "July", "August", "September",
+ "October", "November", "December" };
+ if (m > 12) {
+ return "Unknown to Man";
+ }
+
+ return months[m - 1];
+
+ }
+
+ public String getDay() {
+ int x = getDayOfWeek();
+ String[] days = new String[] {"Sunday", "Monday", "Tuesday", "Wednesday",
+ "Thursday", "Friday", "Saturday"};
+
+ if (x > 7) {
+ return "Unknown to Man";
+ }
+
+ return days[x - 1];
+
+ }
+
+ public int getMonthInt() {
+ return 1 + calendar.get(Calendar.MONTH);
+ }
+
+ public String getDate() {
+ return getMonthInt() + "/" + getDayOfMonth() + "/" + getYear();
+ }
+
+ public String getCurrentDate() {
+ Date dt = new Date ();
+ calendar.setTime (dt);
+ return getMonthInt() + "/" + getDayOfMonth() + "/" + getYear();
+
+ }
+
+ public String getNextDate() {
+ calendar.set (Calendar.DAY_OF_MONTH, getDayOfMonth() + 1);
+ return getDate ();
+ }
+
+ public String getPrevDate() {
+ calendar.set (Calendar.DAY_OF_MONTH, getDayOfMonth() - 1);
+ return getDate ();
+ }
+
+ public String getTime() {
+ return getHour() + ":" + getMinute() + ":" + getSecond();
+ }
+
+ public int getDayOfMonth() {
+ return calendar.get(Calendar.DAY_OF_MONTH);
+ }
+
+ public int getDayOfYear() {
+ return calendar.get(Calendar.DAY_OF_YEAR);
+ }
+
+ public int getWeekOfYear() {
+ return calendar.get(Calendar.WEEK_OF_YEAR);
+ }
+
+ public int getWeekOfMonth() {
+ return calendar.get(Calendar.WEEK_OF_MONTH);
+ }
+
+ public int getDayOfWeek() {
+ return calendar.get(Calendar.DAY_OF_WEEK);
+ }
+
+ public int getHour() {
+ return calendar.get(Calendar.HOUR_OF_DAY);
+ }
+
+ public int getMinute() {
+ return calendar.get(Calendar.MINUTE);
+ }
+
+
+ public int getSecond() {
+ return calendar.get(Calendar.SECOND);
+ }
+
+
+ public int getEra() {
+ return calendar.get(Calendar.ERA);
+ }
+
+ public String getUSTimeZone() {
+ String[] zones = new String[] {"Hawaii", "Alaskan", "Pacific",
+ "Mountain", "Central", "Eastern"};
+
+ return zones[10 + getZoneOffset()];
+ }
+
+ public int getZoneOffset() {
+ return calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000);
+ }
+
+
+ public int getDSTOffset() {
+ return calendar.get(Calendar.DST_OFFSET)/(60*60*1000);
+ }
+
+
+ public int getAMPM() {
+ return calendar.get(Calendar.AM_PM);
+ }
+}
+
+
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/cal/TableBean.java.html b/web/tomcat/webapps/examples/jsp/cal/TableBean.java.html
new file mode 100644
index 0000000..2421733
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/cal/TableBean.java.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cal;
+
+import java.util.Hashtable;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class TableBean {
+
+ final Hashtable<String, Entries> table;
+ final JspCalendar JspCal;
+ Entries entries;
+ String date;
+ String name = null;
+ String email = null;
+ boolean processError = false;
+
+ public TableBean() {
+ this.table = new Hashtable<>(10);
+ this.JspCal = new JspCalendar();
+ this.date = JspCal.getCurrentDate();
+ }
+
+ public void setName(String nm) {
+ this.name = nm;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public void setEmail(String mail) {
+ this.email = mail;
+ }
+
+ public String getEmail() {
+ return this.email;
+ }
+
+ public String getDate() {
+ return this.date;
+ }
+
+ public Entries getEntries() {
+ return this.entries;
+ }
+
+ public void processRequest(HttpServletRequest request) {
+
+ // Get the name and e-mail.
+ this.processError = false;
+ if (name == null || name.equals("")) {
+ setName(request.getParameter("name"));
+ }
+ if (email == null || email.equals("")) {
+ setEmail(request.getParameter("email"));
+ }
+ if (name == null || email == null || name.equals("")
+ || email.equals("")) {
+ this.processError = true;
+ return;
+ }
+
+ // Get the date.
+ String dateR = request.getParameter("date");
+ if (dateR == null) {
+ date = JspCal.getCurrentDate();
+ } else if (dateR.equalsIgnoreCase("next")) {
+ date = JspCal.getNextDate();
+ } else if (dateR.equalsIgnoreCase("prev")) {
+ date = JspCal.getPrevDate();
+ }
+
+ entries = table.get(date);
+ if (entries == null) {
+ entries = new Entries();
+ table.put(date, entries);
+ }
+
+ // If time is provided add the event.
+ String time = request.getParameter("time");
+ if (time != null) {
+ entries.processRequest(request, time);
+ }
+ }
+
+ public boolean getProcessError() {
+ return this.processError;
+ }
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/cal/cal1.jsp b/web/tomcat/webapps/examples/jsp/cal/cal1.jsp
new file mode 100644
index 0000000..e6b8a49
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/cal/cal1.jsp
@@ -0,0 +1,94 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page contentType="text/html; charset=UTF-8" %>
+<HTML>
+<HEAD><TITLE>
+ Calendar: A JSP APPLICATION
+</TITLE></HEAD>
+
+
+<BODY BGCOLOR="white">
+
+<%@ page language="java" import="cal.*" %>
+<jsp:useBean id="table" scope="session" class="cal.TableBean" />
+
+<%
+ table.processRequest(request);
+ if (table.getProcessError() == false) {
+%>
+
+<!-- html table goes here -->
+<CENTER>
+<TABLE WIDTH=60% BGCOLOR=yellow CELLPADDING=15>
+<TR>
+<TD ALIGN=CENTER> <A HREF=cal1.jsp?date=prev> prev </A>
+<TD ALIGN=CENTER> Calendar:<%= table.getDate() %></TD>
+<TD ALIGN=CENTER> <A HREF=cal1.jsp?date=next> next </A>
+</TR>
+</TABLE>
+
+<!-- the main table -->
+<TABLE WIDTH=60% BGCOLOR=lightblue BORDER=1 CELLPADDING=10>
+<TR>
+<TH> Time </TH>
+<TH> Appointment </TH>
+</TR>
+<FORM METHOD=POST ACTION=cal1.jsp>
+<%
+ for(int i=0; i<table.getEntries().getRows(); i++) {
+ cal.Entry entr = table.getEntries().getEntry(i);
+%>
+ <TR>
+ <TD>
+ <A HREF=cal2.jsp?time=<%= entr.getHour() %>>
+ <%= entr.getHour() %> </A>
+ </TD>
+ <TD BGCOLOR=<%= entr.getColor() %>>
+ <% out.print(util.HTMLFilter.filter(entr.getDescription())); %>
+ </TD>
+ </TR>
+<%
+ }
+%>
+</FORM>
+</TABLE>
+<BR>
+
+<!-- footer -->
+<TABLE WIDTH=60% BGCOLOR=yellow CELLPADDING=15>
+<TR>
+<TD ALIGN=CENTER> <% out.print(util.HTMLFilter.filter(table.getName())); %> :
+ <% out.print(util.HTMLFilter.filter(table.getEmail())); %> </TD>
+</TR>
+</TABLE>
+</CENTER>
+
+<%
+ } else {
+%>
+<font size=5>
+ You must enter your name and email address correctly.
+</font>
+<%
+ }
+%>
+
+
+</BODY>
+</HTML>
+
+
diff --git a/web/tomcat/webapps/examples/jsp/cal/cal1.jsp.html b/web/tomcat/webapps/examples/jsp/cal/cal1.jsp.html
new file mode 100644
index 0000000..7daddf0
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/cal/cal1.jsp.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page contentType="text/html; charset=UTF-8" %>
+<HTML>
+<HEAD><TITLE>
+ Calendar: A JSP APPLICATION
+</TITLE></HEAD>
+
+
+<BODY BGCOLOR="white">
+
+<%@ page language="java" import="cal.*" %>
+<jsp:useBean id="table" scope="session" class="cal.TableBean" />
+
+<%
+ table.processRequest(request);
+ if (table.getProcessError() == false) {
+%>
+
+<!-- html table goes here -->
+<CENTER>
+<TABLE WIDTH=60% BGCOLOR=yellow CELLPADDING=15>
+<TR>
+<TD ALIGN=CENTER> <A HREF=cal1.jsp?date=prev> prev </A>
+<TD ALIGN=CENTER> Calendar:<%= table.getDate() %></TD>
+<TD ALIGN=CENTER> <A HREF=cal1.jsp?date=next> next </A>
+</TR>
+</TABLE>
+
+<!-- the main table -->
+<TABLE WIDTH=60% BGCOLOR=lightblue BORDER=1 CELLPADDING=10>
+<TR>
+<TH> Time </TH>
+<TH> Appointment </TH>
+</TR>
+<FORM METHOD=POST ACTION=cal1.jsp>
+<%
+ for(int i=0; i<table.getEntries().getRows(); i++) {
+ cal.Entry entr = table.getEntries().getEntry(i);
+%>
+ <TR>
+ <TD>
+ <A HREF=cal2.jsp?time=<%= entr.getHour() %>>
+ <%= entr.getHour() %> </A>
+ </TD>
+ <TD BGCOLOR=<%= entr.getColor() %>>
+ <% out.print(util.HTMLFilter.filter(entr.getDescription())); %>
+ </TD>
+ </TR>
+<%
+ }
+%>
+</FORM>
+</TABLE>
+<BR>
+
+<!-- footer -->
+<TABLE WIDTH=60% BGCOLOR=yellow CELLPADDING=15>
+<TR>
+<TD ALIGN=CENTER> <% out.print(util.HTMLFilter.filter(table.getName())); %> :
+ <% out.print(util.HTMLFilter.filter(table.getEmail())); %> </TD>
+</TR>
+</TABLE>
+</CENTER>
+
+<%
+ } else {
+%>
+<font size=5>
+ You must enter your name and email address correctly.
+</font>
+<%
+ }
+%>
+
+
+</BODY>
+</HTML>
+
+
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/cal/cal2.jsp b/web/tomcat/webapps/examples/jsp/cal/cal2.jsp
new file mode 100644
index 0000000..e7e14d8
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/cal/cal2.jsp
@@ -0,0 +1,45 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page contentType="text/html; charset=UTF-8" %>
+<HTML>
+<HEAD><TITLE>
+ Calendar: A JSP APPLICATION
+</TITLE></HEAD>
+
+
+<BODY BGCOLOR="white">
+<jsp:useBean id="table" scope="session" class="cal.TableBean" />
+
+<%
+ String time = request.getParameter ("time");
+%>
+
+<FONT SIZE=5> Please add the following event:
+<BR> <h3> Date <%= table.getDate() %>
+<BR> Time <%= util.HTMLFilter.filter(time) %> </h3>
+</FONT>
+<FORM METHOD=POST ACTION=cal1.jsp>
+<BR>
+<BR> <INPUT NAME="date" TYPE=HIDDEN VALUE="current">
+<BR> <INPUT NAME="time" TYPE=HIDDEN VALUE="<%= util.HTMLFilter.filter(time) %>">
+<BR> <h2> Description of the event <INPUT NAME="description" TYPE=TEXT SIZE=20> </h2>
+<BR> <INPUT TYPE=SUBMIT VALUE="submit">
+</FORM>
+
+</BODY>
+</HTML>
+
diff --git a/web/tomcat/webapps/examples/jsp/cal/cal2.jsp.html b/web/tomcat/webapps/examples/jsp/cal/cal2.jsp.html
new file mode 100644
index 0000000..2cc191b
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/cal/cal2.jsp.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page contentType="text/html; charset=UTF-8" %>
+<HTML>
+<HEAD><TITLE>
+ Calendar: A JSP APPLICATION
+</TITLE></HEAD>
+
+
+<BODY BGCOLOR="white">
+<jsp:useBean id="table" scope="session" class="cal.TableBean" />
+
+<%
+ String time = request.getParameter ("time");
+%>
+
+<FONT SIZE=5> Please add the following event:
+<BR> <h3> Date <%= table.getDate() %>
+<BR> Time <%= util.HTMLFilter.filter(time) %> </h3>
+</FONT>
+<FORM METHOD=POST ACTION=cal1.jsp>
+<BR>
+<BR> <INPUT NAME="date" TYPE=HIDDEN VALUE="current">
+<BR> <INPUT NAME="time" TYPE=HIDDEN VALUE="<%= util.HTMLFilter.filter(time) %>">
+<BR> <h2> Description of the event <INPUT NAME="description" TYPE=TEXT SIZE=20> </h2>
+<BR> <INPUT TYPE=SUBMIT VALUE="submit">
+</FORM>
+
+</BODY>
+</HTML>
+
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/cal/calendar.html b/web/tomcat/webapps/examples/jsp/cal/calendar.html
new file mode 100644
index 0000000..a0a3ea1
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/cal/calendar.html
@@ -0,0 +1,43 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="login.html"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h2> Source Code for Calendar Example. <br>
+<h3><a href="cal1.jsp.html">cal1.jsp<font color="#0000FF"></a>
+ </font> </h3>
+<h3><a href="cal2.jsp.html">cal2.jsp<font color="#0000FF"></a>
+ </font> </h3>
+
+<br>
+<h2> Beans.
+<h3><a href="TableBean.java.html">TableBean<font color="#0000FF"></a>
+ </font> </h3>
+<h3><a href="Entries.java.html">Entries<font color="#0000FF"></a>
+ </font> </h3>
+<h3><a href="Entry.java.html">Entry<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/cal/login.html b/web/tomcat/webapps/examples/jsp/cal/login.html
new file mode 100644
index 0000000..2c4aa55
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/cal/login.html
@@ -0,0 +1,47 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<head>
+ <title> Login page for the calendar. </title>
+</head>
+
+<body bgcolor="white">
+<center>
+
+ <font size=7 color="red"> Please Enter the following information: </font>
+
+<br>
+ <form method=GET action=cal1.jsp>
+
+ <font size=5> Name <input type=text name="name" size=20>
+ </font>
+ <br>
+ <font size=5> Email <input type=text name="email" size=20>
+ </font>
+ <br>
+ <input type=submit name=action value="Submit">
+
+ </form>
+<hr>
+<font size=3 color="red"> Note: This application does not implement the complete
+functionality of a typical calendar application. It demonstrates a way JSP can
+be used with html tables and forms.</font>
+
+</center>
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/checkbox/CheckTest.html b/web/tomcat/webapps/examples/jsp/checkbox/CheckTest.html
new file mode 100644
index 0000000..284d9ec
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/checkbox/CheckTest.html
@@ -0,0 +1,56 @@
+<HTML>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<HEAD>
+<title>
+checkbox.CheckTest Bean Properties
+</title>
+<BODY BGCOLOR="white">
+<H2>
+checkbox.CheckTest Bean Properties
+</H2>
+<HR>
+<DL>
+<DT>public class <B>CheckTest</B><DT>extends Object</DL>
+
+<P>
+<HR>
+
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0">
+<TR BGCOLOR="#EEEEFF">
+<TD COLSPAN=3><FONT SIZE="+2">
+<B>Properties Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white">
+<td align="right" valign="top" width="1%">
+<FONT SIZE="-1">
+String
+</FONT></TD>
+<TD><B>CheckTest:fruit</B>
+<BR>
+ </TD>
+<td width="1%">
+<FONT SIZE="-1">
+Multi
+</FONT></TD>
+</TABLE>
+<HR>
+</BODY>
+</HTML>
diff --git a/web/tomcat/webapps/examples/jsp/checkbox/check.html b/web/tomcat/webapps/examples/jsp/checkbox/check.html
new file mode 100644
index 0000000..b6d6b3b
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/checkbox/check.html
@@ -0,0 +1,38 @@
+<HTML>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<BODY bgcolor="white">
+
+
+<FORM TYPE=POST ACTION=checkresult.jsp>
+<BR>
+<font size=5 color="red">
+Check all Favorite fruits: <br>
+
+<input TYPE=checkbox name=fruit VALUE=apples> Apples <BR>
+<input TYPE=checkbox name=fruit VALUE=grapes> Grapes <BR>
+<input TYPE=checkbox name=fruit VALUE=oranges> Oranges <BR>
+<input TYPE=checkbox name=fruit VALUE=melons> Melons <BR>
+
+
+<br> <INPUT TYPE=submit name=submit Value="Submit">
+
+</font>
+</FORM>
+</BODY>
+</HTML>
diff --git a/web/tomcat/webapps/examples/jsp/checkbox/checkresult.jsp b/web/tomcat/webapps/examples/jsp/checkbox/checkresult.jsp
new file mode 100644
index 0000000..4e64739
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/checkbox/checkresult.jsp
@@ -0,0 +1,65 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<body bgcolor="white">
+<font size=5 color="red">
+<%! String[] fruits; %>
+<jsp:useBean id="foo" scope="page" class="checkbox.CheckTest" />
+
+<jsp:setProperty name="foo" property="fruit" param="fruit" />
+<hr>
+The checked fruits (got using request) are: <br>
+<%
+ fruits = request.getParameterValues("fruit");
+%>
+<ul>
+<%
+ if (fruits != null) {
+ for (String fruit : fruits) {
+%>
+<li>
+<%
+ out.println (util.HTMLFilter.filter(fruit));
+ }
+ } else out.println ("none selected");
+%>
+</ul>
+<br>
+<hr>
+
+The checked fruits (got using beans) are <br>
+
+<%
+ fruits = foo.getFruit();
+%>
+<ul>
+<%
+ if (!fruits[0].equals("1")) {
+ for (String fruit : fruits) {
+%>
+<li>
+<%
+ out.println (util.HTMLFilter.filter(fruit));
+ }
+ } else {
+ out.println ("none selected");
+ }
+%>
+</ul>
+</font>
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/checkbox/checkresult.jsp.html b/web/tomcat/webapps/examples/jsp/checkbox/checkresult.jsp.html
new file mode 100644
index 0000000..f8af737
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/checkbox/checkresult.jsp.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<body bgcolor="white">
+<font size=5 color="red">
+<%! String[] fruits; %>
+<jsp:useBean id="foo" scope="page" class="checkbox.CheckTest" />
+
+<jsp:setProperty name="foo" property="fruit" param="fruit" />
+<hr>
+The checked fruits (got using request) are: <br>
+<%
+ fruits = request.getParameterValues("fruit");
+%>
+<ul>
+<%
+ if (fruits != null) {
+ for (String fruit : fruits) {
+%>
+<li>
+<%
+ out.println (util.HTMLFilter.filter(fruit));
+ }
+ } else out.println ("none selected");
+%>
+</ul>
+<br>
+<hr>
+
+The checked fruits (got using beans) are <br>
+
+<%
+ fruits = foo.getFruit();
+%>
+<ul>
+<%
+ if (!fruits[0].equals("1")) {
+ for (String fruit : fruits) {
+%>
+<li>
+<%
+ out.println (util.HTMLFilter.filter(fruit));
+ }
+ } else {
+ out.println ("none selected");
+ }
+%>
+</ul>
+</font>
+</body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/checkbox/cresult.html b/web/tomcat/webapps/examples/jsp/checkbox/cresult.html
new file mode 100644
index 0000000..b6a28d6
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/checkbox/cresult.html
@@ -0,0 +1,34 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="check.html"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="checkresult.jsp.html">Source Code for Checkbox Example<font color="#0000FF"></a>
+ </font> </h3>
+
+<h3><a href="CheckTest.html">Property Sheet for CheckTest
+<font color="#0000FF"></a> </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/colors/ColorGameBean.html b/web/tomcat/webapps/examples/jsp/colors/ColorGameBean.html
new file mode 100644
index 0000000..172bc66
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/colors/ColorGameBean.html
@@ -0,0 +1,116 @@
+<HTML>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<HEAD>
+<title>
+colors.ColorGameBean Bean Properties
+</title>
+<BODY BGCOLOR="white">
+<H2>
+colors.ColorGameBean Bean Properties
+</H2>
+<HR>
+<DL>
+<DT>public class <B>ColorGameBean</B><DT>extends Object</DL>
+
+<P>
+<HR>
+
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0">
+<TR BGCOLOR="#EEEEFF">
+<TD COLSPAN=3><FONT SIZE="+2">
+<B>Properties Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white">
+<td align="right" valign="top" width="1%">
+<FONT SIZE="-1">
+String
+</FONT></TD>
+<TD><B>ColorGameBean:color2</B>
+<BR>
+ </TD>
+<td width="1%">
+<FONT SIZE="-1">
+Single
+</FONT></TD>
+<TR BGCOLOR="white">
+<td align="right" valign="top" width="1%">
+<FONT SIZE="-1">
+String
+</FONT></TD>
+<TD><B>ColorGameBean:color1</B>
+<BR>
+ </TD>
+<td width="1%">
+<FONT SIZE="-1">
+Single
+</FONT></TD>
+<TR BGCOLOR="white">
+<td align="right" valign="top" width="1%">
+<FONT SIZE="-1">
+int
+</FONT></TD>
+<TD><B>ColorGameBean:attempts</B>
+<BR>
+ </TD>
+<td width="1%">
+<FONT SIZE="-1">
+Single
+</FONT></TD>
+<TR BGCOLOR="white">
+<td align="right" valign="top" width="1%">
+<FONT SIZE="-1">
+boolean
+</FONT></TD>
+<TD><B>ColorGameBean:hint</B>
+<BR>
+ </TD>
+<td width="1%">
+<FONT SIZE="-1">
+Single
+</FONT></TD>
+<TR BGCOLOR="white">
+<td align="right" valign="top" width="1%">
+<FONT SIZE="-1">
+boolean
+</FONT></TD>
+<TD><B>ColorGameBean:success</B>
+<BR>
+ </TD>
+<td width="1%">
+<FONT SIZE="-1">
+Single
+</FONT></TD>
+<TR BGCOLOR="white">
+<td align="right" valign="top" width="1%">
+<FONT SIZE="-1">
+boolean
+</FONT></TD>
+<TD><B>ColorGameBean:hintTaken</B>
+<BR>
+ </TD>
+<td width="1%">
+<FONT SIZE="-1">
+Single
+</FONT></TD>
+</TABLE>
+<HR>
+</BODY>
+</HTML>
diff --git a/web/tomcat/webapps/examples/jsp/colors/clr.html b/web/tomcat/webapps/examples/jsp/colors/clr.html
new file mode 100644
index 0000000..e411f59
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/colors/clr.html
@@ -0,0 +1,34 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="colors.html"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="colrs.jsp.html">Source Code for Color Example<font color="#0000FF"></a>
+ </font> </h3>
+
+<h3><a href="ColorGameBean.html">Property Sheet for ColorGameBean
+<font color="#0000FF"></a> </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/colors/colors.html b/web/tomcat/webapps/examples/jsp/colors/colors.html
new file mode 100644
index 0000000..900651e
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/colors/colors.html
@@ -0,0 +1,47 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<body bgcolor= white>
+<font size=6 color=red>
+
+<hr>
+This web page is an example using JSP and BEANs.
+<p>
+Guess my favorite two colors
+
+<p> If you fail to guess both of them - you get yellow on red.
+
+<p> If you guess one of them right, either your foreground or
+ your background will change to the color that was guessed right.
+
+<p> Guess them both right and your browser foreground/background
+ will change to my two favorite colors to display this page.
+
+<hr>
+<form method=GET action=colrs.jsp>
+Color #1: <input type=text name= color1 size=16>
+<br>
+Color #2: <input type=text name= color2 size=16>
+<p>
+<input type=submit name=action value="Submit">
+<input type=submit name=action value="Hint">
+</form>
+
+</font>
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/colors/colrs.jsp b/web/tomcat/webapps/examples/jsp/colors/colrs.jsp
new file mode 100644
index 0000000..ec3af88
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/colors/colrs.jsp
@@ -0,0 +1,70 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+
+<jsp:useBean id="cb" scope="session" class="colors.ColorGameBean" />
+<jsp:setProperty name="cb" property="*" />
+
+<%
+ cb.processRequest();
+%>
+
+<body bgcolor=<%= cb.getColor1() %>>
+<font size=6 color=<%= cb.getColor2() %>>
+<p>
+
+<% if (cb.getHint()==true) { %>
+
+ <p> Hint #1: Vampires prey at night!
+ <p> <p> Hint #2: Nancy without the n.
+
+<% } %>
+
+<% if (cb.getSuccess()==true) { %>
+
+ <p> CONGRATULATIONS!!
+ <% if (cb.getHintTaken()==true) { %>
+
+ <p> ( although I know you cheated and peeked into the hints)
+
+ <% } %>
+
+<% } %>
+
+<p> Total attempts so far: <%= cb.getAttempts() %>
+<p>
+
+<p>
+
+<form method=POST action=colrs.jsp>
+
+Color #1: <input type=text name= color1 size=16>
+
+<br>
+
+Color #2: <input type=text name= color2 size=16>
+
+<p>
+
+<input type=submit name=action value="Submit">
+<input type=submit name=action value="Hint">
+
+</form>
+
+</font>
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/colors/colrs.jsp.html b/web/tomcat/webapps/examples/jsp/colors/colrs.jsp.html
new file mode 100644
index 0000000..7ef38ae
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/colors/colrs.jsp.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+
+<jsp:useBean id="cb" scope="session" class="colors.ColorGameBean" />
+<jsp:setProperty name="cb" property="*" />
+
+<%
+ cb.processRequest();
+%>
+
+<body bgcolor=<%= cb.getColor1() %>>
+<font size=6 color=<%= cb.getColor2() %>>
+<p>
+
+<% if (cb.getHint()==true) { %>
+
+ <p> Hint #1: Vampires prey at night!
+ <p> <p> Hint #2: Nancy without the n.
+
+<% } %>
+
+<% if (cb.getSuccess()==true) { %>
+
+ <p> CONGRATULATIONS!!
+ <% if (cb.getHintTaken()==true) { %>
+
+ <p> ( although I know you cheated and peeked into the hints)
+
+ <% } %>
+
+<% } %>
+
+<p> Total attempts so far: <%= cb.getAttempts() %>
+<p>
+
+<p>
+
+<form method=POST action=colrs.jsp>
+
+Color #1: <input type=text name= color1 size=16>
+
+<br>
+
+Color #2: <input type=text name= color2 size=16>
+
+<p>
+
+<input type=submit name=action value="Submit">
+<input type=submit name=action value="Hint">
+
+</form>
+
+</font>
+</body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/dates/date.html b/web/tomcat/webapps/examples/jsp/dates/date.html
new file mode 100644
index 0000000..683ab4d
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/dates/date.html
@@ -0,0 +1,31 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="date.jsp"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="date.jsp.html">Source Code for Date Example<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/dates/date.jsp b/web/tomcat/webapps/examples/jsp/dates/date.jsp
new file mode 100644
index 0000000..d6c6b86
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/dates/date.jsp
@@ -0,0 +1,41 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+
+<%@ page session="false"%>
+
+<body bgcolor="white">
+<jsp:useBean id='clock' scope='page' class='dates.JspCalendar' type="dates.JspCalendar" />
+
+<font size=4>
+<ul>
+<li> Day of month: is <jsp:getProperty name="clock" property="dayOfMonth"/>
+<li> Year: is <jsp:getProperty name="clock" property="year"/>
+<li> Month: is <jsp:getProperty name="clock" property="month"/>
+<li> Time: is <jsp:getProperty name="clock" property="time"/>
+<li> Date: is <jsp:getProperty name="clock" property="date"/>
+<li> Day: is <jsp:getProperty name="clock" property="day"/>
+<li> Day Of Year: is <jsp:getProperty name="clock" property="dayOfYear"/>
+<li> Week Of Year: is <jsp:getProperty name="clock" property="weekOfYear"/>
+<li> era: is <jsp:getProperty name="clock" property="era"/>
+<li> DST Offset: is <jsp:getProperty name="clock" property="DSTOffset"/>
+<li> Zone Offset: is <jsp:getProperty name="clock" property="zoneOffset"/>
+</ul>
+</font>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/dates/date.jsp.html b/web/tomcat/webapps/examples/jsp/dates/date.jsp.html
new file mode 100644
index 0000000..3f2abfc
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/dates/date.jsp.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+
+<%@ page session="false"%>
+
+<body bgcolor="white">
+<jsp:useBean id='clock' scope='page' class='dates.JspCalendar' type="dates.JspCalendar" />
+
+<font size=4>
+<ul>
+<li> Day of month: is <jsp:getProperty name="clock" property="dayOfMonth"/>
+<li> Year: is <jsp:getProperty name="clock" property="year"/>
+<li> Month: is <jsp:getProperty name="clock" property="month"/>
+<li> Time: is <jsp:getProperty name="clock" property="time"/>
+<li> Date: is <jsp:getProperty name="clock" property="date"/>
+<li> Day: is <jsp:getProperty name="clock" property="day"/>
+<li> Day Of Year: is <jsp:getProperty name="clock" property="dayOfYear"/>
+<li> Week Of Year: is <jsp:getProperty name="clock" property="weekOfYear"/>
+<li> era: is <jsp:getProperty name="clock" property="era"/>
+<li> DST Offset: is <jsp:getProperty name="clock" property="DSTOffset"/>
+<li> Zone Offset: is <jsp:getProperty name="clock" property="zoneOffset"/>
+</ul>
+</font>
+
+</body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/error/er.html b/web/tomcat/webapps/examples/jsp/error/er.html
new file mode 100644
index 0000000..af78159
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/error/er.html
@@ -0,0 +1,31 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="error.html"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="err.jsp.html">Source Code for Error Example<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/error/err.jsp b/web/tomcat/webapps/examples/jsp/error/err.jsp
new file mode 100644
index 0000000..d188456
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/error/err.jsp
@@ -0,0 +1,44 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<body bgcolor="lightblue">
+
+ <%@ page errorPage="errorpge.jsp" %>
+ <jsp:useBean id="foo" scope="request" class="error.Smart" />
+ <%
+ String name = null;
+
+ if (request.getParameter("name") == null) {
+ %>
+ <%@ include file="error.html" %>
+ <%
+ } else {
+ foo.setName(request.getParameter("name"));
+ if (foo.getName().equalsIgnoreCase("integra"))
+ name = "acura";
+ if (name.equalsIgnoreCase("acura")) {
+ %>
+
+ <H1> Yes!!! <a href="http://www.acura.com">Acura</a> is my favorite car.
+
+ <%
+ }
+ }
+ %>
+</body>
+</html>
+
diff --git a/web/tomcat/webapps/examples/jsp/error/err.jsp.html b/web/tomcat/webapps/examples/jsp/error/err.jsp.html
new file mode 100644
index 0000000..3d607a5
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/error/err.jsp.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<body bgcolor="lightblue">
+
+ <%@ page errorPage="errorpge.jsp" %>
+ <jsp:useBean id="foo" scope="request" class="error.Smart" />
+ <%
+ String name = null;
+
+ if (request.getParameter("name") == null) {
+ %>
+ <%@ include file="error.html" %>
+ <%
+ } else {
+ foo.setName(request.getParameter("name"));
+ if (foo.getName().equalsIgnoreCase("integra"))
+ name = "acura";
+ if (name.equalsIgnoreCase("acura")) {
+ %>
+
+ <H1> Yes!!! <a href="http://www.acura.com">Acura</a> is my favorite car.
+
+ <%
+ }
+ }
+ %>
+</body>
+</html>
+
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/error/error.html b/web/tomcat/webapps/examples/jsp/error/error.html
new file mode 100644
index 0000000..b1b029c
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/error/error.html
@@ -0,0 +1,37 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<body bgcolor="white">
+
+<h1> This example uses <b>errorpage</b> directive </h1>
+<br>
+<h3> Select my favourite car.</h3>
+<form method=get action=err.jsp>
+<!-- <br> Make a guess: -->
+<SELECT NAME="name" SIZE=5>
+<OPTION VALUE="integra"> Acura Integra <BR>
+<OPTION VALUE="bmw328i"> BMW 328I <BR>
+<OPTION VALUE="z3"> BMW Z3 <BR>
+<OPTION VALUE="infiniti"> InfinitiQ3 <BR>
+<OPTION VALUE="audi"> Audi A8 <BR>
+</SELECT>
+<br> <INPUT TYPE=submit name=submit Value="Submit">
+</form>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/error/errorpge.jsp b/web/tomcat/webapps/examples/jsp/error/errorpge.jsp
new file mode 100644
index 0000000..5c6eb0a
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/error/errorpge.jsp
@@ -0,0 +1,25 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+
+<body bgcolor="red">
+
+ <%@ page isErrorPage="true" %>
+ <h1> The exception <%= exception.getMessage() %> tells me you
+ made a wrong choice.
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/error/errorpge.jsp.html b/web/tomcat/webapps/examples/jsp/error/errorpge.jsp.html
new file mode 100644
index 0000000..3d690dc
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/error/errorpge.jsp.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+
+<body bgcolor="red">
+
+ <%@ page isErrorPage="true" %>
+ <h1> The exception <%= exception.getMessage() %> tells me you
+ made a wrong choice.
+</body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/forward/forward.jsp b/web/tomcat/webapps/examples/jsp/forward/forward.jsp
new file mode 100644
index 0000000..092d9b4
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/forward/forward.jsp
@@ -0,0 +1,33 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<%
+ double freeMem = Runtime.getRuntime().freeMemory();
+ double totlMem = Runtime.getRuntime().totalMemory();
+ double percent = freeMem/totlMem;
+ if (percent < 0.5) {
+%>
+
+<jsp:forward page="one.jsp"/>
+
+<% } else { %>
+
+<jsp:forward page="two.html"/>
+
+<% } %>
+
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/forward/forward.jsp.html b/web/tomcat/webapps/examples/jsp/forward/forward.jsp.html
new file mode 100644
index 0000000..32f8bf7
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/forward/forward.jsp.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<%
+ double freeMem = Runtime.getRuntime().freeMemory();
+ double totlMem = Runtime.getRuntime().totalMemory();
+ double percent = freeMem/totlMem;
+ if (percent < 0.5) {
+%>
+
+<jsp:forward page="one.jsp"/>
+
+<% } else { %>
+
+<jsp:forward page="two.html"/>
+
+<% } %>
+
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/forward/fwd.html b/web/tomcat/webapps/examples/jsp/forward/fwd.html
new file mode 100644
index 0000000..b3b0219
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/forward/fwd.html
@@ -0,0 +1,30 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="forward.jsp"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="forward.jsp.html">Source Code for Forward Example<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/forward/one.jsp b/web/tomcat/webapps/examples/jsp/forward/one.jsp
new file mode 100644
index 0000000..c7f0004
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/forward/one.jsp
@@ -0,0 +1,23 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+
+<body bgcolor="white">
+<font color="red">
+
+VM Memory usage < 50%.
+</html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/forward/one.jsp.html b/web/tomcat/webapps/examples/jsp/forward/one.jsp.html
new file mode 100644
index 0000000..af18501
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/forward/one.jsp.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+
+<body bgcolor="white">
+<font color="red">
+
+VM Memory usage &lt; 50%.
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/forward/two.html b/web/tomcat/webapps/examples/jsp/forward/two.html
new file mode 100644
index 0000000..24f4c08
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/forward/two.html
@@ -0,0 +1,23 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<body bgcolor="white">
+<font color="red">
+
+VM Memory usage > 50%.
+</html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/images/code.gif b/web/tomcat/webapps/examples/jsp/images/code.gif
new file mode 100644
index 0000000..93af2cd
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/images/code.gif
Binary files differ
diff --git a/web/tomcat/webapps/examples/jsp/images/execute.gif b/web/tomcat/webapps/examples/jsp/images/execute.gif
new file mode 100644
index 0000000..f64d70f
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/images/execute.gif
Binary files differ
diff --git a/web/tomcat/webapps/examples/jsp/images/return.gif b/web/tomcat/webapps/examples/jsp/images/return.gif
new file mode 100644
index 0000000..af4f68f
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/images/return.gif
Binary files differ
diff --git a/web/tomcat/webapps/examples/jsp/include/foo.html b/web/tomcat/webapps/examples/jsp/include/foo.html
new file mode 100644
index 0000000..168c8c8
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/include/foo.html
@@ -0,0 +1,17 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+To get the current time in ms
diff --git a/web/tomcat/webapps/examples/jsp/include/foo.jsp b/web/tomcat/webapps/examples/jsp/include/foo.jsp
new file mode 100644
index 0000000..bb476c7
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/include/foo.jsp
@@ -0,0 +1,17 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+--%><%= System.currentTimeMillis() %>
diff --git a/web/tomcat/webapps/examples/jsp/include/foo.jsp.html b/web/tomcat/webapps/examples/jsp/include/foo.jsp.html
new file mode 100644
index 0000000..2a1ac7b
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/include/foo.jsp.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+--%><%= System.currentTimeMillis() %>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/include/inc.html b/web/tomcat/webapps/examples/jsp/include/inc.html
new file mode 100644
index 0000000..fedaed0
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/include/inc.html
@@ -0,0 +1,30 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="include.jsp"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="include.jsp.html">Source Code for Include Example<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/include/include.jsp b/web/tomcat/webapps/examples/jsp/include/include.jsp
new file mode 100644
index 0000000..62a8c22
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/include/include.jsp
@@ -0,0 +1,30 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+
+<body bgcolor="white">
+
+<font color="red">
+
+<%@ page buffer="5kb" autoFlush="false" %>
+
+<p>In place evaluation of another JSP which gives you the current time: <%@ include file="foo.jsp" %>
+
+<p> <jsp:include page="foo.html" flush="true"/> by including the output of another JSP: <jsp:include page="foo.jsp" flush="true"/>
+:-)
+
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/include/include.jsp.html b/web/tomcat/webapps/examples/jsp/include/include.jsp.html
new file mode 100644
index 0000000..4f529c1
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/include/include.jsp.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+
+<body bgcolor="white">
+
+<font color="red">
+
+<%@ page buffer="5kb" autoFlush="false" %>
+
+<p>In place evaluation of another JSP which gives you the current time: <%@ include file="foo.jsp" %>
+
+<p> <jsp:include page="foo.html" flush="true"/> by including the output of another JSP: <jsp:include page="foo.jsp" flush="true"/>
+:-)
+
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/index.html b/web/tomcat/webapps/examples/jsp/index.html
new file mode 100644
index 0000000..977ed04
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/index.html
@@ -0,0 +1,369 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!DOCTYPE html><html lang="en">
+<head>
+ <meta charset="UTF-8"/>
+ <meta name="Author" content="Anil K. Vijendran" />
+ <title>JSP Examples</title>
+ <style type="text/css">
+ img { border: 0; }
+ th { text-align: left; }
+ tr { vertical-align: top; }
+ </style>
+</head>
+<body>
+<h1>JSP
+Samples</h1>
+<p>This is a collection of samples demonstrating the usage of different
+parts of the Java Server Pages (JSP) specification. Both JSP 2.0 and
+JSP 1.2 examples are presented below.
+<p>These examples will only work when these pages are being served by a
+servlet engine; of course, we recommend
+<a href="https://tomcat.apache.org/">Tomcat</a>.
+They will not work if you are viewing these pages via a
+"file://..." URL.
+<p>To navigate your way through the examples, the following icons will
+help:</p>
+<ul style="list-style-type: none; padding-left: 0;">
+<li><img src="images/execute.gif" alt=""> Execute the example</li>
+<li><img src="images/code.gif" alt=""> Look at the source code for the example</li>
+<li><img src="images/return.gif" alt=""> Return to this screen</li>
+</ul>
+
+<p>Tip: For session scoped beans to work, the cookies must be enabled.
+This can be done using browser options.</p>
+<h2>JSP 2.0 Examples</h2>
+
+<table style="width: 85%;">
+<tr>
+<th colspan="3">Expression Language</th>
+</tr>
+
+<tr>
+<td>Basic Arithmetic</td>
+<td style="width: 30%;"><a href="jsp2/el/basic-arithmetic.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/el/basic-arithmetic.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/el/basic-arithmetic.html"><img src="images/code.gif" alt=""></a><a href="jsp2/el/basic-arithmetic.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Basic Comparisons</td>
+<td style="width: 30%;"><a href="jsp2/el/basic-comparisons.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/el/basic-comparisons.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/el/basic-comparisons.html"><img src="images/code.gif" alt=""></a><a href="jsp2/el/basic-comparisons.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Implicit Objects</td>
+<td style="width: 30%;"><a href="jsp2/el/implicit-objects.jsp?foo=bar"><img src="images/execute.gif" alt=""></a><a href="jsp2/el/implicit-objects.jsp?foo=bar">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/el/implicit-objects.html"><img src="images/code.gif" alt=""></a><a href="jsp2/el/implicit-objects.html">Source</a></td>
+</tr>
+<tr>
+
+<td>Functions</td>
+<td style="width: 30%;"><a href="jsp2/el/functions.jsp?foo=JSP+2.0"><img src="images/execute.gif" alt=""></a><a href="jsp2/el/functions.jsp?foo=JSP+2.0">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/el/functions.html"><img src="images/code.gif" alt=""></a><a href="jsp2/el/functions.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Composite Expressions</td>
+<td style="width: 30%;"><a href="jsp2/el/composite.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/el/composite.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/el/composite.html"><img src="images/code.gif" alt=""></a><a href="jsp2/el/composite.html">Source</a></td>
+</tr>
+
+
+<tr>
+<th colspan="3"><br />SimpleTag Handlers and JSP Fragments</th>
+</tr>
+
+<tr>
+<td>Hello World Tag</td>
+<td style="width: 30%;"><a href="jsp2/simpletag/hello.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/simpletag/hello.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/simpletag/hello.html"><img src="images/code.gif" alt=""></a><a href="jsp2/simpletag/hello.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Repeat Tag</td>
+<td style="width: 30%;"><a href="jsp2/simpletag/repeat.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/simpletag/repeat.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/simpletag/repeat.html"><img src="images/code.gif" alt=""></a><a href="jsp2/simpletag/repeat.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Book Example</td>
+<td style="width: 30%;"><a href="jsp2/simpletag/book.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/simpletag/book.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/simpletag/book.html"><img src="images/code.gif" alt=""></a><a href="jsp2/simpletag/book.html">Source</a></td>
+</tr>
+
+<tr>
+<th colspan="3"><br />Tag Files</th>
+</tr>
+
+<tr>
+<td>Hello World Tag File</td>
+<td style="width: 30%;"><a href="jsp2/tagfiles/hello.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/tagfiles/hello.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/tagfiles/hello.html"><img src="images/code.gif" alt=""></a><a href="jsp2/tagfiles/hello.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Panel Tag File</td>
+<td style="width: 30%;"><a href="jsp2/tagfiles/panel.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/tagfiles/panel.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/tagfiles/panel.html"><img src="images/code.gif" alt=""></a><a href="jsp2/tagfiles/panel.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Display Products Example</td>
+<td style="width: 30%;"><a href="jsp2/tagfiles/products.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/tagfiles/products.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/tagfiles/products.html"><img src="images/code.gif" alt=""></a><a href="jsp2/tagfiles/products.html">Source</a></td>
+</tr>
+
+<tr>
+<th colspan="3"><br />New JSP XML Syntax (.jspx)</th>
+</tr>
+
+<tr>
+<td>XHTML Basic Example</td>
+<td style="width: 30%;"><a href="jsp2/jspx/basic.jspx"><img src="images/execute.gif" alt=""></a><a href="jsp2/jspx/basic.jspx">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/jspx/basic.html"><img src="images/code.gif" alt=""></a><a href="jsp2/jspx/basic.html">Source</a></td>
+</tr>
+
+<tr>
+<td>SVG (Scalable Vector Graphics)</td>
+<td style="width: 30%;"><a href="jsp2/jspx/svgexample.html"><img src="images/execute.gif" alt=""></a><a href="jsp2/jspx/svgexample.html">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/jspx/textRotate.html"><img src="images/code.gif" alt=""></a><a href="jsp2/jspx/textRotate.html">Source</a></td>
+</tr>
+
+<tr>
+<th colspan="3"><br />Other JSP 2.0 Features</th>
+</tr>
+
+<tr>
+<td><jsp:attribute> and <jsp:body></td>
+<td style="width: 30%;"><a href="jsp2/jspattribute/jspattribute.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/jspattribute/jspattribute.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/jspattribute/jspattribute.html"><img src="images/code.gif" alt=""></a><a href="jsp2/jspattribute/jspattribute.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Shuffle Example</td>
+<td style="width: 30%;"><a href="jsp2/jspattribute/shuffle.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/jspattribute/shuffle.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/jspattribute/shuffle.html"><img src="images/code.gif" alt=""></a><a href="jsp2/jspattribute/shuffle.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Attributes With Dynamic Names</td>
+<td style="width: 30%;"><a href="jsp2/misc/dynamicattrs.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/misc/dynamicattrs.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/misc/dynamicattrs.html"><img src="images/code.gif" alt=""></a><a href="jsp2/misc/dynamicattrs.html">Source</a></td>
+</tr>
+
+<tr>
+<td>JSP Configuration</td>
+<td style="width: 30%;"><a href="jsp2/misc/config.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/misc/config.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsp2/misc/config.html"><img src="images/code.gif" alt=""></a><a href="jsp2/misc/config.html">Source</a></td>
+</tr>
+
+</table>
+
+<h2>JSP 1.2 Examples</h2>
+<table style="width: 85%;">
+<tr>
+<td>Numberguess</td>
+
+<td style="width: 30%;"><a href="num/numguess.jsp"><img src="images/execute.gif" alt=""></a><a href="num/numguess.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="num/numguess.html"><img src="images/code.gif" alt=""></a><a href="num/numguess.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Date</td>
+
+<td style="width: 30%;"><a href="dates/date.jsp"><img src="images/execute.gif" alt=""></a><a href="dates/date.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="dates/date.html"><img src="images/code.gif" alt=""></a><a href="dates/date.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Snoop</td>
+
+<td style="width: 30%;"><a href="snp/snoop.jsp"><img src="images/execute.gif" alt=""></a><a href="snp/snoop.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="snp/snoop.html"><img src="images/code.gif" alt=""></a><a href="snp/snoop.html">Source</a></td>
+</tr>
+
+<tr>
+<td>ErrorPage</td>
+
+<td style="width: 30%;"><a href="error/error.html"><img src="images/execute.gif" alt=""></a><a href="error/error.html">Execute</a></td>
+
+<td style="width: 30%;"><a href="error/er.html"><img src="images/code.gif" alt=""></a><a href="error/er.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Carts</td>
+
+<td style="width: 30%;"><a href="sessions/carts.html"><img src="images/execute.gif" alt=""></a><a href="sessions/carts.html">Execute</a></td>
+
+<td style="width: 30%;"><a href="sessions/crt.html"><img src="images/code.gif" alt=""></a><a href="sessions/crt.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Checkbox</td>
+
+<td style="width: 30%;"><a href="checkbox/check.html"><img src="images/execute.gif" alt=""></a><a href="checkbox/check.html">Execute</a></td>
+
+<td style="width: 30%;"><a href="checkbox/cresult.html"><img src="images/code.gif" alt=""></a><a href="checkbox/cresult.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Color</td>
+
+<td style="width: 30%;"><a href="colors/colors.html"><img src="images/execute.gif" alt=""></a><a href="colors/colors.html">Execute</a></td>
+
+<td style="width: 30%;"><a href="colors/clr.html"><img src="images/code.gif" alt=""></a><a href="colors/clr.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Calendar</td>
+
+<td style="width: 30%;"><a href="cal/login.html"><img src="images/execute.gif" alt=""></a><a href="cal/login.html">Execute</a></td>
+
+<td style="width: 30%;"><a href="cal/calendar.html"><img src="images/code.gif" alt=""></a><a href="cal/calendar.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Include</td>
+
+<td style="width: 30%;"><a href="include/include.jsp"><img src="images/execute.gif" alt=""></a><a href="include/include.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="include/inc.html"><img src="images/code.gif" alt=""></a><a href="include/inc.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Forward</td>
+
+<td style="width: 30%;"><a href="forward/forward.jsp"><img src="images/execute.gif" alt=""></a><a href="forward/forward.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="forward/fwd.html"><img src="images/code.gif" alt=""></a><a href="forward/fwd.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Plugin</td>
+
+<td style="width: 30%;"><a href="plugin/plugin.jsp"><img src="images/execute.gif" alt=""></a><a href="plugin/plugin.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="plugin/plugin.html"><img src="images/code.gif" alt=""></a><a href="plugin/plugin.html">Source</a></td>
+</tr>
+
+<tr>
+<td>JSP-Servlet-JSP</td>
+
+<td style="width: 30%;"><a href="jsptoserv/jsptoservlet.jsp"><img src="images/execute.gif" alt=""></a><a href="jsptoserv/jsptoservlet.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="jsptoserv/jts.html"><img src="images/code.gif" alt=""></a><a href="jsptoserv/jts.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Custom tag example</td>
+
+<td style="width: 30%;"><a href="simpletag/foo.jsp"><img src="images/execute.gif" alt=""></a><a href="simpletag/foo.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="simpletag/foo.html"><img src="images/code.gif" alt=""></a><a href="simpletag/foo.html">Source</a></td>
+</tr>
+
+<tr>
+<td>XML syntax example</td>
+<td style="width: 30%;"><a href="xml/xml.jsp"><img src="images/execute.gif" alt=""></a><a href="xml/xml.jsp">Execute</a></td>
+
+<td style="width: 30%;"><a href="xml/xml.html"><img src="images/code.gif" alt=""></a><a href="xml/xml.html">Source</a></td>
+</tr>
+
+</table>
+
+<h2>Tag Plugins</h2>
+<table style="width: 85%;">
+
+<tr>
+ <td>If</td>
+ <td style="width: 30%;">
+ <a href="tagplugin/if.jsp"><img src="images/execute.gif" alt=""></a>
+ <a href="tagplugin/if.jsp">Execute</a>
+ </td>
+ <td style="width: 30%;">
+ <a href="tagplugin/if.html"><img src="images/code.gif" alt=""></a>
+ <a href="tagplugin/if.html">Source</a>
+ </td>
+</tr>
+
+<tr>
+ <td>ForEach</td>
+ <td style="width: 30%;">
+ <a href="tagplugin/foreach.jsp"><img src="images/execute.gif" alt=""></a>
+ <a href="tagplugin/foreach.jsp">Execute</a>
+ </td>
+ <td style="width: 30%;">
+ <a href="tagplugin/foreach.html"><img src="images/code.gif" alt=""></a>
+ <a href="tagplugin/foreach.html">Source</a>
+ </td>
+</tr>
+
+<tr>
+ <td>Choose</td>
+ <td style="width: 30%;">
+ <a href="tagplugin/choose.jsp"><img src="images/execute.gif" alt=""></a>
+ <a href="tagplugin/choose.jsp">Execute</a>
+ </td>
+ <td style="width: 30%;">
+ <a href="tagplugin/choose.html"><img src="images/code.gif" alt=""></a>
+ <a href="tagplugin/choose.html">Source</a>
+ </td>
+</tr>
+
+</table>
+
+<h2>Other Examples</h2>
+<table style="width: 85%;">
+
+<tr>
+ <td>FORM Authentication</td>
+ <td style="width: 30%;">
+ <a href="security/protected/index.jsp"><img src="images/execute.gif" alt=""> Execute</a>
+ </td>
+ <td style="width: 30%;"></td>
+</tr>
+<tr>
+ <td colspan="3">Example that demonstrates protecting a resource and
+ using Form-Based authentication. To access the page the user must
+ have role of either "tomcat" or "role1". By default no user
+ is configured to have these roles.</td>
+</tr>
+
+</table>
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/Functions.java.html b/web/tomcat/webapps/examples/jsp/jsp2/el/Functions.java.html
new file mode 100644
index 0000000..aa84ccc
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/Functions.java.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples.el;
+
+import java.util.Locale;
+
+/**
+ * Defines the functions for the jsp2 example tag library.
+ *
+ * <p>Each function is defined as a static method.</p>
+ */
+public class Functions {
+ public static String reverse( String text ) {
+ return new StringBuilder( text ).reverse().toString();
+ }
+
+ public static int numVowels( String text ) {
+ String vowels = "aeiouAEIOU";
+ int result = 0;
+ for( int i = 0; i < text.length(); i++ ) {
+ if( vowels.indexOf( text.charAt( i ) ) != -1 ) {
+ result++;
+ }
+ }
+ return result;
+ }
+
+ public static String caps( String text ) {
+ return text.toUpperCase(Locale.ENGLISH);
+ }
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/ValuesBean.java.html b/web/tomcat/webapps/examples/jsp/jsp2/el/ValuesBean.java.html
new file mode 100644
index 0000000..1550ef5
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/ValuesBean.java.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples;
+
+/**
+ * Accept and display a value.
+ */
+public class ValuesBean {
+ private String string;
+ private double doubleValue;
+ private long longValue;
+
+ public String getStringValue() {
+ return this.string;
+ }
+
+ public void setStringValue(String string) {
+ this.string = string;
+ }
+
+ public double getDoubleValue() {
+ return doubleValue;
+ }
+
+ public void setDoubleValue(double doubleValue) {
+ this.doubleValue = doubleValue;
+ }
+
+ public long getLongValue() {
+ return longValue;
+ }
+
+ public void setLongValue(long longValue) {
+ this.longValue = longValue;
+ }
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/ValuesTag.java.html b/web/tomcat/webapps/examples/jsp/jsp2/el/ValuesTag.java.html
new file mode 100644
index 0000000..490d212
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/ValuesTag.java.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package examples;
+
+import java.io.IOException;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.JspTagException;
+import javax.servlet.jsp.JspWriter;
+import javax.servlet.jsp.tagext.TagSupport;
+
+/**
+ * Accept and display a value.
+ */
+public class ValuesTag extends TagSupport {
+
+ private static final long serialVersionUID = 1L;
+
+ // Using "-1" as the default value,
+ // in the assumption that it won't be used as the value.
+ // Cannot use null here, because null is an important case
+ // that should be present in the tests.
+ private Object objectValue = "-1";
+ private String stringValue = "-1";
+ private long longValue = -1;
+ private double doubleValue = -1;
+
+ public void setObject(Object objectValue) {
+ this.objectValue = objectValue;
+ }
+
+ public void setString(String stringValue) {
+ this.stringValue = stringValue;
+ }
+
+ public void setLong(long longValue) {
+ this.longValue = longValue;
+ }
+
+ public void setDouble(double doubleValue) {
+ this.doubleValue = doubleValue;
+ }
+
+ @Override
+ public int doEndTag() throws JspException {
+ JspWriter out = pageContext.getOut();
+
+ try {
+ if (!"-1".equals(objectValue)) {
+ out.print(objectValue);
+ } else if (!"-1".equals(stringValue)) {
+ out.print(stringValue);
+ } else if (longValue != -1) {
+ out.print(longValue);
+ } else if (doubleValue != -1) {
+ out.print(doubleValue);
+ } else {
+ out.print("-1");
+ }
+ } catch (IOException ex) {
+ throw new JspTagException("IOException: " + ex.toString(), ex);
+ }
+ return super.doEndTag();
+ }
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.html b/web/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.html
new file mode 100644
index 0000000..8a2f0a6
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.html
@@ -0,0 +1,30 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>View Source Code</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="basic-arithmetic.jsp"><img src="../../images/execute.gif" align="right" border="0"></a><a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="basic-arithmetic.jsp.html">Source Code for Basic Arithmetic Example<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp b/web/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp
new file mode 100644
index 0000000..757e809
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp
@@ -0,0 +1,88 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+ <head>
+ <title>JSP 2.0 Expression Language - Basic Arithmetic</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Expression Language - Basic Arithmetic</h1>
+ <hr>
+ This example illustrates basic Expression Language arithmetic.
+ Addition (+), subtraction (-), multiplication (*), division (/ or div),
+ and modulus (% or mod) are all supported. Error conditions, like
+ division by zero, are handled gracefully.
+ <br>
+ <blockquote>
+ <code>
+ <table border="1">
+ <thead>
+ <td><b>EL Expression</b></td>
+ <td><b>Result</b></td>
+ </thead>
+ <tr>
+ <td>\${1}</td>
+ <td>${1}</td>
+ </tr>
+ <tr>
+ <td>\${1 + 2}</td>
+ <td>${1 + 2}</td>
+ </tr>
+ <tr>
+ <td>\${1.2 + 2.3}</td>
+ <td>${1.2 + 2.3}</td>
+ </tr>
+ <tr>
+ <td>\${1.2E4 + 1.4}</td>
+ <td>${1.2E4 + 1.4}</td>
+ </tr>
+ <tr>
+ <td>\${-4 - 2}</td>
+ <td>${-4 - 2}</td>
+ </tr>
+ <tr>
+ <td>\${21 * 2}</td>
+ <td>${21 * 2}</td>
+ </tr>
+ <tr>
+ <td>\${3/4}</td>
+ <td>${3/4}</td>
+ </tr>
+ <tr>
+ <td>\${3 div 4}</td>
+ <td>${3 div 4}</td>
+ </tr>
+ <tr>
+ <td>\${3/0}</td>
+ <td>${3/0}</td>
+ </tr>
+ <tr>
+ <td>\${10%4}</td>
+ <td>${10%4}</td>
+ </tr>
+ <tr>
+ <td>\${10 mod 4}</td>
+ <td>${10 mod 4}</td>
+ </tr>
+ <tr>
+ <td>\${(1==2) ? 3 : 4}</td>
+ <td>${(1==2) ? 3 : 4}</td>
+ </tr>
+ </table>
+ </code>
+ </blockquote>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp.html b/web/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp.html
new file mode 100644
index 0000000..b8e1a69
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+ <head>
+ <title>JSP 2.0 Expression Language - Basic Arithmetic</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Expression Language - Basic Arithmetic</h1>
+ <hr>
+ This example illustrates basic Expression Language arithmetic.
+ Addition (+), subtraction (-), multiplication (*), division (/ or div),
+ and modulus (% or mod) are all supported. Error conditions, like
+ division by zero, are handled gracefully.
+ <br>
+ <blockquote>
+ <code>
+ <table border="1">
+ <thead>
+ <td><b>EL Expression</b></td>
+ <td><b>Result</b></td>
+ </thead>
+ <tr>
+ <td>\${1}</td>
+ <td>${1}</td>
+ </tr>
+ <tr>
+ <td>\${1 + 2}</td>
+ <td>${1 + 2}</td>
+ </tr>
+ <tr>
+ <td>\${1.2 + 2.3}</td>
+ <td>${1.2 + 2.3}</td>
+ </tr>
+ <tr>
+ <td>\${1.2E4 + 1.4}</td>
+ <td>${1.2E4 + 1.4}</td>
+ </tr>
+ <tr>
+ <td>\${-4 - 2}</td>
+ <td>${-4 - 2}</td>
+ </tr>
+ <tr>
+ <td>\${21 * 2}</td>
+ <td>${21 * 2}</td>
+ </tr>
+ <tr>
+ <td>\${3/4}</td>
+ <td>${3/4}</td>
+ </tr>
+ <tr>
+ <td>\${3 div 4}</td>
+ <td>${3 div 4}</td>
+ </tr>
+ <tr>
+ <td>\${3/0}</td>
+ <td>${3/0}</td>
+ </tr>
+ <tr>
+ <td>\${10%4}</td>
+ <td>${10%4}</td>
+ </tr>
+ <tr>
+ <td>\${10 mod 4}</td>
+ <td>${10 mod 4}</td>
+ </tr>
+ <tr>
+ <td>\${(1==2) ? 3 : 4}</td>
+ <td>${(1==2) ? 3 : 4}</td>
+ </tr>
+ </table>
+ </code>
+ </blockquote>
+ </body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.html b/web/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.html
new file mode 100644
index 0000000..60fb40a
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.html
@@ -0,0 +1,30 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>View Source Code</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="basic-comparisons.jsp"><img src="../../images/execute.gif" align="right" border="0"></a><a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="basic-comparisons.jsp.html">Source Code for Basic Comparisons Example<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp b/web/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp
new file mode 100644
index 0000000..d72f724
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp
@@ -0,0 +1,116 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+ <head>
+ <title>JSP 2.0 Expression Language - Basic Comparisons</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Expression Language - Basic Comparisons</h1>
+ <hr>
+ This example illustrates basic Expression Language comparisons.
+ The following comparison operators are supported:
+ <ul>
+ <li>Less-than (< or lt)</li>
+ <li>Greater-than (> or gt)</li>
+ <li>Less-than-or-equal (<= or le)</li>
+ <li>Greater-than-or-equal (>= or ge)</li>
+ <li>Equal (== or eq)</li>
+ <li>Not Equal (!= or ne)</li>
+ </ul>
+ <blockquote>
+ <u><b>Numeric</b></u>
+ <code>
+ <table border="1">
+ <thead>
+ <td><b>EL Expression</b></td>
+ <td><b>Result</b></td>
+ </thead>
+ <tr>
+ <td>\${1 < 2}</td>
+ <td>${1 < 2}</td>
+ </tr>
+ <tr>
+ <td>\${1 lt 2}</td>
+ <td>${1 lt 2}</td>
+ </tr>
+ <tr>
+ <td>\${1 > (4/2)}</td>
+ <td>${1 > (4/2)}</td>
+ </tr>
+ <tr>
+ <td>\${1 gt (4/2)}</td>
+ <td>${1 gt (4/2)}</td>
+ </tr>
+ <tr>
+ <td>\${4.0 >= 3}</td>
+ <td>${4.0 >= 3}</td>
+ </tr>
+ <tr>
+ <td>\${4.0 ge 3}</td>
+ <td>${4.0 ge 3}</td>
+ </tr>
+ <tr>
+ <td>\${4 <= 3}</td>
+ <td>${4 <= 3}</td>
+ </tr>
+ <tr>
+ <td>\${4 le 3}</td>
+ <td>${4 le 3}</td>
+ </tr>
+ <tr>
+ <td>\${100.0 == 100}</td>
+ <td>${100.0 == 100}</td>
+ </tr>
+ <tr>
+ <td>\${100.0 eq 100}</td>
+ <td>${100.0 eq 100}</td>
+ </tr>
+ <tr>
+ <td>\${(10*10) != 100}</td>
+ <td>${(10*10) != 100}</td>
+ </tr>
+ <tr>
+ <td>\${(10*10) ne 100}</td>
+ <td>${(10*10) ne 100}</td>
+ </tr>
+ </table>
+ </code>
+ <br>
+ <u><b>Alphabetic</b></u>
+ <code>
+ <table border="1">
+ <thead>
+ <td><b>EL Expression</b></td>
+ <td><b>Result</b></td>
+ </thead>
+ <tr>
+ <td>\${'a' < 'b'}</td>
+ <td>${'a' < 'b'}</td>
+ </tr>
+ <tr>
+ <td>\${'hip' > 'hit'}</td>
+ <td>${'hip' > 'hit'}</td>
+ </tr>
+ <tr>
+ <td>\${'4' > 3}</td>
+ <td>${'4' > 3}</td>
+ </tr>
+ </table>
+ </code>
+ </blockquote>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp.html b/web/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp.html
new file mode 100644
index 0000000..d20471e
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+ <head>
+ <title>JSP 2.0 Expression Language - Basic Comparisons</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Expression Language - Basic Comparisons</h1>
+ <hr>
+ This example illustrates basic Expression Language comparisons.
+ The following comparison operators are supported:
+ <ul>
+ <li>Less-than (&lt; or lt)</li>
+ <li>Greater-than (&gt; or gt)</li>
+ <li>Less-than-or-equal (&lt;= or le)</li>
+ <li>Greater-than-or-equal (&gt;= or ge)</li>
+ <li>Equal (== or eq)</li>
+ <li>Not Equal (!= or ne)</li>
+ </ul>
+ <blockquote>
+ <u><b>Numeric</b></u>
+ <code>
+ <table border="1">
+ <thead>
+ <td><b>EL Expression</b></td>
+ <td><b>Result</b></td>
+ </thead>
+ <tr>
+ <td>\${1 &lt; 2}</td>
+ <td>${1 < 2}</td>
+ </tr>
+ <tr>
+ <td>\${1 lt 2}</td>
+ <td>${1 lt 2}</td>
+ </tr>
+ <tr>
+ <td>\${1 &gt; (4/2)}</td>
+ <td>${1 > (4/2)}</td>
+ </tr>
+ <tr>
+ <td>\${1 gt (4/2)}</td>
+ <td>${1 gt (4/2)}</td>
+ </tr>
+ <tr>
+ <td>\${4.0 &gt;= 3}</td>
+ <td>${4.0 >= 3}</td>
+ </tr>
+ <tr>
+ <td>\${4.0 ge 3}</td>
+ <td>${4.0 ge 3}</td>
+ </tr>
+ <tr>
+ <td>\${4 &lt;= 3}</td>
+ <td>${4 <= 3}</td>
+ </tr>
+ <tr>
+ <td>\${4 le 3}</td>
+ <td>${4 le 3}</td>
+ </tr>
+ <tr>
+ <td>\${100.0 == 100}</td>
+ <td>${100.0 == 100}</td>
+ </tr>
+ <tr>
+ <td>\${100.0 eq 100}</td>
+ <td>${100.0 eq 100}</td>
+ </tr>
+ <tr>
+ <td>\${(10*10) != 100}</td>
+ <td>${(10*10) != 100}</td>
+ </tr>
+ <tr>
+ <td>\${(10*10) ne 100}</td>
+ <td>${(10*10) ne 100}</td>
+ </tr>
+ </table>
+ </code>
+ <br>
+ <u><b>Alphabetic</b></u>
+ <code>
+ <table border="1">
+ <thead>
+ <td><b>EL Expression</b></td>
+ <td><b>Result</b></td>
+ </thead>
+ <tr>
+ <td>\${'a' &lt; 'b'}</td>
+ <td>${'a' < 'b'}</td>
+ </tr>
+ <tr>
+ <td>\${'hip' &gt; 'hit'}</td>
+ <td>${'hip' > 'hit'}</td>
+ </tr>
+ <tr>
+ <td>\${'4' &gt; 3}</td>
+ <td>${'4' > 3}</td>
+ </tr>
+ </table>
+ </code>
+ </blockquote>
+ </body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/composite.html b/web/tomcat/webapps/examples/jsp/jsp2/el/composite.html
new file mode 100644
index 0000000..5900008
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/composite.html
@@ -0,0 +1,31 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>View Source Code</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="composite.jsp"><img src="../../images/execute.gif" align="right" border="0"></a><a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="composite.jsp.html">Source Code for composite.jsp</a></h3>
+<h3><a href="ValuesTag.java.html">Source Code for ValuesTag.java</a></h3>
+<h3><a href="ValuesBean.java.html">Source Code for ValuesBean.java</a></h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/composite.jsp b/web/tomcat/webapps/examples/jsp/jsp2/el/composite.jsp
new file mode 100644
index 0000000..ae671d4
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/composite.jsp
@@ -0,0 +1,110 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="my" uri="http://tomcat.apache.org/example-taglib" %>
+
+<html>
+ <head>
+ <title>JSP 2.0 Expression Language - Composite Expressions</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Expression Language - Composite Expressions</h1>
+ <hr>
+ This example illustrates EL composite expressions. Composite expressions
+ are formed by grouping together multiple EL expressions. Each of them is
+ evaluated from left to right, coerced to String, all those strings are
+ concatenated, and the result is coerced to the expected type.
+
+ <jsp:useBean id="values" class="jsp2.examples.ValuesBean" />
+
+ <blockquote>
+ <code>
+ <table border="1">
+ <thead>
+ <td><b>EL Expression</b></td>
+ <td><b>Type</b></td>
+ <td><b>Result</b></td>
+ </thead>
+ <tr>
+ <td>\${'hello'} wo\${'rld'}</td>
+ <td>String</td>
+ <td><jsp:setProperty name="values" property="stringValue" value="${'hello'} wo${'rld'}"/>${values.stringValue}</td>
+ </tr>
+ <tr>
+ <td>\${'hello'} wo\${'rld'}</td>
+ <td>String</td>
+ <td><my:values string="${'hello'} wo${'rld'}"/></td>
+ </tr>
+ <tr>
+ <td>\${1+2}.\${220}</td>
+ <td>Double</td>
+ <td><jsp:setProperty name="values" property="doubleValue" value="${1+2}.${220}"/>${values.doubleValue}</td>
+ </tr>
+ <tr>
+ <td>\${1+2}.\${220}</td>
+ <td>Double</td>
+ <td><my:values double="${1+2}.${220}"/></td>
+ </tr>
+ <tr>
+ <td>000\${1}\${7}</td>
+ <td>Long</td>
+ <td><jsp:setProperty name="values" property="longValue" value="000${1}${7}"/>${values.longValue}</td>
+ </tr>
+ <tr>
+ <td>000\${1}\${7}</td>
+ <td>Long</td>
+ <td><my:values long="000${1}${7}"/></td>
+ </tr>
+ <!--
+ Undefined values are to be coerced to String, to be "",
+ https://bz.apache.org/bugzilla/show_bug.cgi?id=47413
+ -->
+ <tr>
+ <td>\${undefinedFoo}hello world\${undefinedBar}</td>
+ <td>String</td>
+ <td><jsp:setProperty name="values" property="stringValue" value="${undefinedFoo}hello world${undefinedBar}"/>${values.stringValue}</td>
+ </tr>
+ <tr>
+ <td>\${undefinedFoo}hello world\${undefinedBar}</td>
+ <td>String</td>
+ <td><my:values string="${undefinedFoo}hello world${undefinedBar}"/></td>
+ </tr>
+ <tr>
+ <td>\${undefinedFoo}\${undefinedBar}</td>
+ <td>Double</td>
+ <td><jsp:setProperty name="values" property="doubleValue" value="${undefinedFoo}${undefinedBar}"/>${values.doubleValue}</td>
+ </tr>
+ <tr>
+ <td>\${undefinedFoo}\${undefinedBar}</td>
+ <td>Double</td>
+ <td><my:values double="${undefinedFoo}${undefinedBar}"/></td>
+ </tr>
+ <tr>
+ <td>\${undefinedFoo}\${undefinedBar}</td>
+ <td>Long</td>
+ <td><jsp:setProperty name="values" property="longValue" value="${undefinedFoo}${undefinedBar}"/>${values.longValue}</td>
+ </tr>
+ <tr>
+ <td>\${undefinedFoo}\${undefinedBar}</td>
+ <td>Long</td>
+ <td><my:values long="${undefinedFoo}${undefinedBar}"/></td>
+ </tr>
+ </table>
+ </code>
+ </blockquote>
+ </body>
+</html>
+
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/composite.jsp.html b/web/tomcat/webapps/examples/jsp/jsp2/el/composite.jsp.html
new file mode 100644
index 0000000..375555f
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/composite.jsp.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="my" uri="http://tomcat.apache.org/example-taglib" %>
+
+<html>
+ <head>
+ <title>JSP 2.0 Expression Language - Composite Expressions</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Expression Language - Composite Expressions</h1>
+ <hr>
+ This example illustrates EL composite expressions. Composite expressions
+ are formed by grouping together multiple EL expressions. Each of them is
+ evaluated from left to right, coerced to String, all those strings are
+ concatenated, and the result is coerced to the expected type.
+
+ <jsp:useBean id="values" class="jsp2.examples.ValuesBean" />
+
+ <blockquote>
+ <code>
+ <table border="1">
+ <thead>
+ <td><b>EL Expression</b></td>
+ <td><b>Type</b></td>
+ <td><b>Result</b></td>
+ </thead>
+ <tr>
+ <td>\${'hello'} wo\${'rld'}</td>
+ <td>String</td>
+ <td><jsp:setProperty name="values" property="stringValue" value="${'hello'} wo${'rld'}"/>${values.stringValue}</td>
+ </tr>
+ <tr>
+ <td>\${'hello'} wo\${'rld'}</td>
+ <td>String</td>
+ <td><my:values string="${'hello'} wo${'rld'}"/></td>
+ </tr>
+ <tr>
+ <td>\${1+2}.\${220}</td>
+ <td>Double</td>
+ <td><jsp:setProperty name="values" property="doubleValue" value="${1+2}.${220}"/>${values.doubleValue}</td>
+ </tr>
+ <tr>
+ <td>\${1+2}.\${220}</td>
+ <td>Double</td>
+ <td><my:values double="${1+2}.${220}"/></td>
+ </tr>
+ <tr>
+ <td>000\${1}\${7}</td>
+ <td>Long</td>
+ <td><jsp:setProperty name="values" property="longValue" value="000${1}${7}"/>${values.longValue}</td>
+ </tr>
+ <tr>
+ <td>000\${1}\${7}</td>
+ <td>Long</td>
+ <td><my:values long="000${1}${7}"/></td>
+ </tr>
+ <!--
+ Undefined values are to be coerced to String, to be "",
+ https://bz.apache.org/bugzilla/show_bug.cgi?id=47413
+ -->
+ <tr>
+ <td>\${undefinedFoo}hello world\${undefinedBar}</td>
+ <td>String</td>
+ <td><jsp:setProperty name="values" property="stringValue" value="${undefinedFoo}hello world${undefinedBar}"/>${values.stringValue}</td>
+ </tr>
+ <tr>
+ <td>\${undefinedFoo}hello world\${undefinedBar}</td>
+ <td>String</td>
+ <td><my:values string="${undefinedFoo}hello world${undefinedBar}"/></td>
+ </tr>
+ <tr>
+ <td>\${undefinedFoo}\${undefinedBar}</td>
+ <td>Double</td>
+ <td><jsp:setProperty name="values" property="doubleValue" value="${undefinedFoo}${undefinedBar}"/>${values.doubleValue}</td>
+ </tr>
+ <tr>
+ <td>\${undefinedFoo}\${undefinedBar}</td>
+ <td>Double</td>
+ <td><my:values double="${undefinedFoo}${undefinedBar}"/></td>
+ </tr>
+ <tr>
+ <td>\${undefinedFoo}\${undefinedBar}</td>
+ <td>Long</td>
+ <td><jsp:setProperty name="values" property="longValue" value="${undefinedFoo}${undefinedBar}"/>${values.longValue}</td>
+ </tr>
+ <tr>
+ <td>\${undefinedFoo}\${undefinedBar}</td>
+ <td>Long</td>
+ <td><my:values long="${undefinedFoo}${undefinedBar}"/></td>
+ </tr>
+ </table>
+ </code>
+ </blockquote>
+ </body>
+</html>
+
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/functions.html b/web/tomcat/webapps/examples/jsp/jsp2/el/functions.html
new file mode 100644
index 0000000..726dda3
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/functions.html
@@ -0,0 +1,32 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>View Source Code</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="functions.jsp?foo=JSP+2.0"><img src="../../images/execute.gif" align="right" border="0"></a><a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="functions.jsp.html">Source Code for functions.jsp<font color="#0000FF"></a>
+ </font> </h3>
+<h3><a href="Functions.java.html">Source Code for Functions.java<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/functions.jsp b/web/tomcat/webapps/examples/jsp/jsp2/el/functions.jsp
new file mode 100644
index 0000000..12b3fa9
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/functions.jsp
@@ -0,0 +1,67 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page contentType="text/html; charset=UTF-8" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%>
+
+<html>
+ <head>
+ <title>JSP 2.0 Expression Language - Functions</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Expression Language - Functions</h1>
+ <hr>
+ An upgrade from the JSTL expression language, the JSP 2.0 EL also
+ allows for simple function invocation. Functions are defined
+ by tag libraries and are implemented by a Java programmer as
+ static methods.
+
+ <blockquote>
+ <u><b>Change Parameter</b></u>
+ <form action="functions.jsp" method="GET">
+ foo = <input type="text" name="foo" value="${fn:escapeXml(param["foo"])}">
+ <input type="submit">
+ </form>
+ <br>
+ <code>
+ <table border="1">
+ <thead>
+ <td><b>EL Expression</b></td>
+ <td><b>Result</b></td>
+ </thead>
+ <tr>
+ <td>\${param["foo"]}</td>
+ <td>${fn:escapeXml(param["foo"])} </td>
+ </tr>
+ <tr>
+ <td>\${my:reverse(param["foo"])}</td>
+ <td>${my:reverse(fn:escapeXml(param["foo"]))} </td>
+ </tr>
+ <tr>
+ <td>\${my:reverse(my:reverse(param["foo"]))}</td>
+ <td>${my:reverse(my:reverse(fn:escapeXml(param["foo"])))} </td>
+ </tr>
+ <tr>
+ <td>\${my:countVowels(param["foo"])}</td>
+ <td>${my:countVowels(fn:escapeXml(param["foo"]))} </td>
+ </tr>
+ </table>
+ </code>
+ </blockquote>
+ </body>
+</html>
+
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/functions.jsp.html b/web/tomcat/webapps/examples/jsp/jsp2/el/functions.jsp.html
new file mode 100644
index 0000000..1a3cdb4
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/functions.jsp.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page contentType="text/html; charset=UTF-8" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%>
+
+<html>
+ <head>
+ <title>JSP 2.0 Expression Language - Functions</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Expression Language - Functions</h1>
+ <hr>
+ An upgrade from the JSTL expression language, the JSP 2.0 EL also
+ allows for simple function invocation. Functions are defined
+ by tag libraries and are implemented by a Java programmer as
+ static methods.
+
+ <blockquote>
+ <u><b>Change Parameter</b></u>
+ <form action="functions.jsp" method="GET">
+ foo = <input type="text" name="foo" value="${fn:escapeXml(param["foo"])}">
+ <input type="submit">
+ </form>
+ <br>
+ <code>
+ <table border="1">
+ <thead>
+ <td><b>EL Expression</b></td>
+ <td><b>Result</b></td>
+ </thead>
+ <tr>
+ <td>\${param["foo"]}</td>
+ <td>${fn:escapeXml(param["foo"])}&nbsp;</td>
+ </tr>
+ <tr>
+ <td>\${my:reverse(param["foo"])}</td>
+ <td>${my:reverse(fn:escapeXml(param["foo"]))}&nbsp;</td>
+ </tr>
+ <tr>
+ <td>\${my:reverse(my:reverse(param["foo"]))}</td>
+ <td>${my:reverse(my:reverse(fn:escapeXml(param["foo"])))}&nbsp;</td>
+ </tr>
+ <tr>
+ <td>\${my:countVowels(param["foo"])}</td>
+ <td>${my:countVowels(fn:escapeXml(param["foo"]))}&nbsp;</td>
+ </tr>
+ </table>
+ </code>
+ </blockquote>
+ </body>
+</html>
+
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.html b/web/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.html
new file mode 100644
index 0000000..15268db
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.html
@@ -0,0 +1,31 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>View Source Code</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="implicit-objects.jsp?foo=bar"><img src="../../images/execute.gif" align="right" border="0"></a><a href="../../index.html">
+<img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="implicit-objects.jsp.html">Source Code for Implicit Objects Example<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.jsp b/web/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.jsp
new file mode 100644
index 0000000..b557714
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.jsp
@@ -0,0 +1,90 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page contentType="text/html; charset=UTF-8" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+
+<html>
+ <head>
+ <title>JSP 2.0 Expression Language - Implicit Objects</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Expression Language - Implicit Objects</h1>
+ <hr>
+ This example illustrates some of the implicit objects available
+ in the Expression Language. The following implicit objects are
+ available (not all illustrated here):
+ <ul>
+ <li>pageContext - the PageContext object</li>
+ <li>pageScope - a Map that maps page-scoped attribute names to
+ their values</li>
+ <li>requestScope - a Map that maps request-scoped attribute names
+ to their values</li>
+ <li>sessionScope - a Map that maps session-scoped attribute names
+ to their values</li>
+ <li>applicationScope - a Map that maps application-scoped attribute
+ names to their values</li>
+ <li>param - a Map that maps parameter names to a single String
+ parameter value</li>
+ <li>paramValues - a Map that maps parameter names to a String[] of
+ all values for that parameter</li>
+ <li>header - a Map that maps header names to a single String
+ header value</li>
+ <li>headerValues - a Map that maps header names to a String[] of
+ all values for that header</li>
+ <li>initParam - a Map that maps context initialization parameter
+ names to their String parameter value</li>
+ <li>cookie - a Map that maps cookie names to a single Cookie object.</li>
+ </ul>
+
+ <blockquote>
+ <u><b>Change Parameter</b></u>
+ <form action="implicit-objects.jsp" method="GET">
+ foo = <input type="text" name="foo" value="${fn:escapeXml(param["foo"])}">
+ <input type="submit">
+ </form>
+ <br>
+ <code>
+ <table border="1">
+ <thead>
+ <td><b>EL Expression</b></td>
+ <td><b>Result</b></td>
+ </thead>
+ <tr>
+ <td>\${param.foo}</td>
+ <td>${fn:escapeXml(param["foo"])} </td>
+ </tr>
+ <tr>
+ <td>\${param["foo"]}</td>
+ <td>${fn:escapeXml(param["foo"])} </td>
+ </tr>
+ <tr>
+ <td>\${header["host"]}</td>
+ <td>${fn:escapeXml(header["host"])} </td>
+ </tr>
+ <tr>
+ <td>\${header["accept"]}</td>
+ <td>${fn:escapeXml(header["accept"])} </td>
+ </tr>
+ <tr>
+ <td>\${header["user-agent"]}</td>
+ <td>${fn:escapeXml(header["user-agent"])} </td>
+ </tr>
+ </table>
+ </code>
+ </blockquote>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.jsp.html b/web/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.jsp.html
new file mode 100644
index 0000000..db967e7
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.jsp.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page contentType="text/html; charset=UTF-8" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+
+<html>
+ <head>
+ <title>JSP 2.0 Expression Language - Implicit Objects</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Expression Language - Implicit Objects</h1>
+ <hr>
+ This example illustrates some of the implicit objects available
+ in the Expression Language. The following implicit objects are
+ available (not all illustrated here):
+ <ul>
+ <li>pageContext - the PageContext object</li>
+ <li>pageScope - a Map that maps page-scoped attribute names to
+ their values</li>
+ <li>requestScope - a Map that maps request-scoped attribute names
+ to their values</li>
+ <li>sessionScope - a Map that maps session-scoped attribute names
+ to their values</li>
+ <li>applicationScope - a Map that maps application-scoped attribute
+ names to their values</li>
+ <li>param - a Map that maps parameter names to a single String
+ parameter value</li>
+ <li>paramValues - a Map that maps parameter names to a String[] of
+ all values for that parameter</li>
+ <li>header - a Map that maps header names to a single String
+ header value</li>
+ <li>headerValues - a Map that maps header names to a String[] of
+ all values for that header</li>
+ <li>initParam - a Map that maps context initialization parameter
+ names to their String parameter value</li>
+ <li>cookie - a Map that maps cookie names to a single Cookie object.</li>
+ </ul>
+
+ <blockquote>
+ <u><b>Change Parameter</b></u>
+ <form action="implicit-objects.jsp" method="GET">
+ foo = <input type="text" name="foo" value="${fn:escapeXml(param["foo"])}">
+ <input type="submit">
+ </form>
+ <br>
+ <code>
+ <table border="1">
+ <thead>
+ <td><b>EL Expression</b></td>
+ <td><b>Result</b></td>
+ </thead>
+ <tr>
+ <td>\${param.foo}</td>
+ <td>${fn:escapeXml(param["foo"])}&nbsp;</td>
+ </tr>
+ <tr>
+ <td>\${param["foo"]}</td>
+ <td>${fn:escapeXml(param["foo"])}&nbsp;</td>
+ </tr>
+ <tr>
+ <td>\${header["host"]}</td>
+ <td>${fn:escapeXml(header["host"])}&nbsp;</td>
+ </tr>
+ <tr>
+ <td>\${header["accept"]}</td>
+ <td>${fn:escapeXml(header["accept"])}&nbsp;</td>
+ </tr>
+ <tr>
+ <td>\${header["user-agent"]}</td>
+ <td>${fn:escapeXml(header["user-agent"])}&nbsp;</td>
+ </tr>
+ </table>
+ </code>
+ </blockquote>
+ </body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/FooBean.java.html b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/FooBean.java.html
new file mode 100644
index 0000000..ca36472
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/FooBean.java.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples;
+
+public class FooBean {
+ private String bar;
+
+ public FooBean() {
+ bar = "Initial value";
+ }
+
+ public String getBar() {
+ return this.bar;
+ }
+
+ public void setBar(String bar) {
+ this.bar = bar;
+ }
+
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/HelloWorldSimpleTag.java.html b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/HelloWorldSimpleTag.java.html
new file mode 100644
index 0000000..4c2a7b7
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/HelloWorldSimpleTag.java.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples.simpletag;
+
+import java.io.IOException;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+
+/**
+ * SimpleTag handler that prints "Hello, world!"
+ */
+public class HelloWorldSimpleTag extends SimpleTagSupport {
+ @Override
+ public void doTag() throws JspException, IOException {
+ getJspContext().getOut().write( "Hello, world!" );
+ }
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/ShuffleSimpleTag.java.html b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/ShuffleSimpleTag.java.html
new file mode 100644
index 0000000..aba68ad
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/ShuffleSimpleTag.java.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples.simpletag;
+
+import java.io.IOException;
+import java.util.Random;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.JspFragment;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+
+/**
+ * SimpleTag handler that accepts takes three attributes of type
+ * JspFragment and invokes then in a random order.
+ */
+public class ShuffleSimpleTag extends SimpleTagSupport {
+ // No need for this to use SecureRandom
+ private static final Random random = new Random();
+
+ private JspFragment fragment1;
+ private JspFragment fragment2;
+ private JspFragment fragment3;
+
+ @Override
+ public void doTag() throws JspException, IOException {
+ switch(random.nextInt(6)) {
+ case 0:
+ fragment1.invoke( null );
+ fragment2.invoke( null );
+ fragment3.invoke( null );
+ break;
+ case 1:
+ fragment1.invoke( null );
+ fragment3.invoke( null );
+ fragment2.invoke( null );
+ break;
+ case 2:
+ fragment2.invoke( null );
+ fragment1.invoke( null );
+ fragment3.invoke( null );
+ break;
+ case 3:
+ fragment2.invoke( null );
+ fragment3.invoke( null );
+ fragment1.invoke( null );
+ break;
+ case 4:
+ fragment3.invoke( null );
+ fragment1.invoke( null );
+ fragment2.invoke( null );
+ break;
+ case 5:
+ fragment3.invoke( null );
+ fragment2.invoke( null );
+ fragment1.invoke( null );
+ break;
+ }
+ }
+
+ public void setFragment1( JspFragment fragment1 ) {
+ this.fragment1 = fragment1;
+ }
+
+ public void setFragment2( JspFragment fragment2 ) {
+ this.fragment2 = fragment2;
+ }
+
+ public void setFragment3( JspFragment fragment3 ) {
+ this.fragment3 = fragment3;
+ }
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/TileSimpleTag.java.html b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/TileSimpleTag.java.html
new file mode 100644
index 0000000..13e7ba9
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/TileSimpleTag.java.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples.simpletag;
+
+import java.io.IOException;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+
+/**
+ * Displays a tile as a single cell in a table.
+ */
+public class TileSimpleTag extends SimpleTagSupport {
+ private String color;
+ private String label;
+
+ @Override
+ public void doTag() throws JspException, IOException {
+ getJspContext().getOut().write(
+ "<td width=\"32\" height=\"32\" bgcolor=\"" + this.color +
+ "\"><font color=\"#ffffff\"><center>" + this.label +
+ "</center></font></td>" );
+ }
+
+ public void setColor( String color ) {
+ this.color = color;
+ }
+
+ public void setLabel( String label ) {
+ this.label = label;
+ }
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.html b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.html
new file mode 100644
index 0000000..df1b6e6
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.html
@@ -0,0 +1,37 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>View Source Code</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="jspattribute.jsp"><img src="../../images/execute.gif" align="right" border="0"></a>
+<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="jspattribute.jsp.html">Source Code for jspattribute.jsp<font color="#0000FF"></a>
+ </font> </h3>
+
+<h3><a href="HelloWorldSimpleTag.java.html">Source Code for HelloWorldSimpleTag.java<font color="#0000FF"></a>
+ </font> </h3>
+
+<h3><a href="FooBean.java.html">Source Code for FooBean.java<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp
new file mode 100644
index 0000000..8050b34
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp
@@ -0,0 +1,46 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%>
+
+<html>
+ <head>
+ <title>JSP 2.0 Examples - jsp:attribute and jsp:body</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - jsp:attribute and jsp:body</h1>
+ <hr>
+ <p>The new <jsp:attribute> and <jsp:body>
+ standard actions can be used to specify the value of any standard
+ action or custom action attribute.</p>
+ <p>This example uses the <jsp:attribute>
+ standard action to use the output of a custom action invocation
+ (one that simply outputs "Hello, World!") to set the value of a
+ bean property. This would normally require an intermediary
+ step, such as using JSTL's <c:set> action.</p>
+ <br>
+ <jsp:useBean id="foo" class="jsp2.examples.FooBean">
+ Bean created! Setting foo.bar...<br>
+ <jsp:setProperty name="foo" property="bar">
+ <jsp:attribute name="value">
+ <my:helloWorld/>
+ </jsp:attribute>
+ </jsp:setProperty>
+ </jsp:useBean>
+ <br>
+ Result: ${foo.bar}
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp.html b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp.html
new file mode 100644
index 0000000..9596997
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%>
+
+<html>
+ <head>
+ <title>JSP 2.0 Examples - jsp:attribute and jsp:body</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - jsp:attribute and jsp:body</h1>
+ <hr>
+ <p>The new &lt;jsp:attribute&gt; and &lt;jsp:body&gt;
+ standard actions can be used to specify the value of any standard
+ action or custom action attribute.</p>
+ <p>This example uses the &lt;jsp:attribute&gt;
+ standard action to use the output of a custom action invocation
+ (one that simply outputs "Hello, World!") to set the value of a
+ bean property. This would normally require an intermediary
+ step, such as using JSTL's &lt;c:set&gt; action.</p>
+ <br>
+ <jsp:useBean id="foo" class="jsp2.examples.FooBean">
+ Bean created! Setting foo.bar...<br>
+ <jsp:setProperty name="foo" property="bar">
+ <jsp:attribute name="value">
+ <my:helloWorld/>
+ </jsp:attribute>
+ </jsp:setProperty>
+ </jsp:useBean>
+ <br>
+ Result: ${foo.bar}
+ </body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.html b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.html
new file mode 100644
index 0000000..5711860
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.html
@@ -0,0 +1,37 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>View Source Code</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="shuffle.jsp"><img src="../../images/execute.gif" align="right" border="0"></a>
+<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="shuffle.jsp.html">Source Code for shuffle.jsp<font color="#0000FF"></a>
+ </font> </h3>
+
+<h3><a href="ShuffleSimpleTag.java.html">Source Code for ShuffleSimpleTag.java<font color="#0000FF"></a>
+ </font> </h3>
+
+<h3><a href="TileSimpleTag.java.html">Source Code for TileSimpleTag.java<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp
new file mode 100644
index 0000000..737ff65
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp
@@ -0,0 +1,90 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%>
+
+<html>
+ <head>
+ <title>JSP 2.0 Examples - Shuffle Example</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - Shuffle Example</h1>
+ <hr>
+ <p>Try reloading the page a few times. Both the rows and the columns
+ are shuffled and appear different each time.</p>
+ <p>Here's how the code works. The SimpleTag handler called
+ <my:shuffle> accepts three attributes. Each attribute is a
+ JSP Fragment, meaning it is a fragment of JSP code that can be
+ dynamically executed by the shuffle tag handler on demand. The
+ shuffle tag handler executes the three fragments in a random order.
+ To shuffle both the rows and the columns, the shuffle tag is used
+ with itself as a parameter.</p>
+ <hr>
+ <blockquote>
+ <font color="#ffffff">
+ <table>
+ <my:shuffle>
+ <jsp:attribute name="fragment1">
+ <tr>
+ <my:shuffle>
+ <jsp:attribute name="fragment1">
+ <my:tile color="#ff0000" label="A"/>
+ </jsp:attribute>
+ <jsp:attribute name="fragment2">
+ <my:tile color="#00ff00" label="B"/>
+ </jsp:attribute>
+ <jsp:attribute name="fragment3">
+ <my:tile color="#0000ff" label="C"/>
+ </jsp:attribute>
+ </my:shuffle>
+ </tr>
+ </jsp:attribute>
+ <jsp:attribute name="fragment2">
+ <tr>
+ <my:shuffle>
+ <jsp:attribute name="fragment1">
+ <my:tile color="#ff0000" label="1"/>
+ </jsp:attribute>
+ <jsp:attribute name="fragment2">
+ <my:tile color="#00ff00" label="2"/>
+ </jsp:attribute>
+ <jsp:attribute name="fragment3">
+ <my:tile color="#0000ff" label="3"/>
+ </jsp:attribute>
+ </my:shuffle>
+ </tr>
+ </jsp:attribute>
+ <jsp:attribute name="fragment3">
+ <tr>
+ <my:shuffle>
+ <jsp:attribute name="fragment1">
+ <my:tile color="#ff0000" label="!"/>
+ </jsp:attribute>
+ <jsp:attribute name="fragment2">
+ <my:tile color="#00ff00" label="@"/>
+ </jsp:attribute>
+ <jsp:attribute name="fragment3">
+ <my:tile color="#0000ff" label="#"/>
+ </jsp:attribute>
+ </my:shuffle>
+ </tr>
+ </jsp:attribute>
+ </my:shuffle>
+ </table>
+ </font>
+ </blockquote>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp.html b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp.html
new file mode 100644
index 0000000..dcb137d
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%>
+
+<html>
+ <head>
+ <title>JSP 2.0 Examples - Shuffle Example</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - Shuffle Example</h1>
+ <hr>
+ <p>Try reloading the page a few times. Both the rows and the columns
+ are shuffled and appear different each time.</p>
+ <p>Here's how the code works. The SimpleTag handler called
+ &lt;my:shuffle&gt; accepts three attributes. Each attribute is a
+ JSP Fragment, meaning it is a fragment of JSP code that can be
+ dynamically executed by the shuffle tag handler on demand. The
+ shuffle tag handler executes the three fragments in a random order.
+ To shuffle both the rows and the columns, the shuffle tag is used
+ with itself as a parameter.</p>
+ <hr>
+ <blockquote>
+ <font color="#ffffff">
+ <table>
+ <my:shuffle>
+ <jsp:attribute name="fragment1">
+ <tr>
+ <my:shuffle>
+ <jsp:attribute name="fragment1">
+ <my:tile color="#ff0000" label="A"/>
+ </jsp:attribute>
+ <jsp:attribute name="fragment2">
+ <my:tile color="#00ff00" label="B"/>
+ </jsp:attribute>
+ <jsp:attribute name="fragment3">
+ <my:tile color="#0000ff" label="C"/>
+ </jsp:attribute>
+ </my:shuffle>
+ </tr>
+ </jsp:attribute>
+ <jsp:attribute name="fragment2">
+ <tr>
+ <my:shuffle>
+ <jsp:attribute name="fragment1">
+ <my:tile color="#ff0000" label="1"/>
+ </jsp:attribute>
+ <jsp:attribute name="fragment2">
+ <my:tile color="#00ff00" label="2"/>
+ </jsp:attribute>
+ <jsp:attribute name="fragment3">
+ <my:tile color="#0000ff" label="3"/>
+ </jsp:attribute>
+ </my:shuffle>
+ </tr>
+ </jsp:attribute>
+ <jsp:attribute name="fragment3">
+ <tr>
+ <my:shuffle>
+ <jsp:attribute name="fragment1">
+ <my:tile color="#ff0000" label="!"/>
+ </jsp:attribute>
+ <jsp:attribute name="fragment2">
+ <my:tile color="#00ff00" label="@"/>
+ </jsp:attribute>
+ <jsp:attribute name="fragment3">
+ <my:tile color="#0000ff" label="#"/>
+ </jsp:attribute>
+ </my:shuffle>
+ </tr>
+ </jsp:attribute>
+ </my:shuffle>
+ </table>
+ </font>
+ </blockquote>
+ </body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspx/basic.html b/web/tomcat/webapps/examples/jsp/jsp2/jspx/basic.html
new file mode 100644
index 0000000..f9df6a4
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspx/basic.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<title>View Source Code</title>
+</head>
+
+<body>
+<p><a href="basic.jspx"><img src="../../images/execute.gif" alt="Execute" style="border: 0;"></a><a
+href="../../index.html"><img src="../../images/return.gif" alt="Return" style="border: 0;"></a></p>
+
+<h3><a href="basic.jspx.html">Source Code for XHTML Basic Example</a></h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspx/basic.jspx b/web/tomcat/webapps/examples/jsp/jsp2/jspx/basic.jspx
new file mode 100644
index 0000000..fc1e45f
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspx/basic.jspx
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html xmlns:jsp="http://java.sun.com/JSP/Page"
+ xmlns:fmt="http://java.sun.com/jsp/jstl/fmt"
+ xmlns="http://www.w3.org/1999/xhtml">
+ <jsp:output doctype-root-element="html"
+ doctype-public="-//W3C//DTD XHTML Basic 1.0//EN"
+ doctype-system="http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd"/>
+ <jsp:directive.page contentType="application/xhtml+xml" />
+ <head>
+ <title>JSPX - XHTML Basic Example</title>
+ </head>
+ <body>
+ <h1>JSPX - XHTML Basic Example</h1>
+ This example illustrates how to use JSPX to produce an XHTML basic
+ document suitable for use with mobile phones, televisions,
+ PDAs, vending machines, pagers, car navigation systems,
+ mobile game machines, digital book readers, smart watches, etc.
+ <p/>
+ JSPX lets you create dynamic documents in a pure XML syntax compatible
+ with existing XML tools. The XML syntax in JSP 1.2 was awkward and
+ required &lt;jsp:root&gt; to be the root element of the document.
+ This is no longer the case in JSP 2.0.
+ <p/>
+ This particular example uses
+ namespace declarations to make the output of this page a valid XHTML
+ document.
+ <p/>
+ Just to prove this is live, here's some dynamic content:
+ <jsp:useBean id="now" class="java.util.Date" />
+ <fmt:formatDate value="${now}" pattern="MMMM d, yyyy, H:mm:ss"/>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspx/basic.jspx.html b/web/tomcat/webapps/examples/jsp/jsp2/jspx/basic.jspx.html
new file mode 100644
index 0000000..6b38336
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspx/basic.jspx.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html xmlns:jsp="http://java.sun.com/JSP/Page"
+ xmlns:fmt="http://java.sun.com/jsp/jstl/fmt"
+ xmlns="http://www.w3.org/1999/xhtml">
+ <jsp:output doctype-root-element="html"
+ doctype-public="-//W3C//DTD XHTML Basic 1.0//EN"
+ doctype-system="http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd"/>
+ <jsp:directive.page contentType="application/xhtml+xml" />
+ <head>
+ <title>JSPX - XHTML Basic Example</title>
+ </head>
+ <body>
+ <h1>JSPX - XHTML Basic Example</h1>
+ This example illustrates how to use JSPX to produce an XHTML basic
+ document suitable for use with mobile phones, televisions,
+ PDAs, vending machines, pagers, car navigation systems,
+ mobile game machines, digital book readers, smart watches, etc.
+ <p/>
+ JSPX lets you create dynamic documents in a pure XML syntax compatible
+ with existing XML tools. The XML syntax in JSP 1.2 was awkward and
+ required &amp;lt;jsp:root&amp;gt; to be the root element of the document.
+ This is no longer the case in JSP 2.0.
+ <p/>
+ This particular example uses
+ namespace declarations to make the output of this page a valid XHTML
+ document.
+ <p/>
+ Just to prove this is live, here's some dynamic content:
+ <jsp:useBean id="now" class="java.util.Date" />
+ <fmt:formatDate value="${now}" pattern="MMMM d, yyyy, H:mm:ss"/>
+ </body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspx/svgexample.html b/web/tomcat/webapps/examples/jsp/jsp2/jspx/svgexample.html
new file mode 100644
index 0000000..f7d591a
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspx/svgexample.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html><!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <title>JSP 2.0 SVG Example</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 SVG Example</h1>
+ This example uses JSP 2.0's new, simplified JSPX syntax to render a
+ Scalable Vector Graphics (SVG) document. When you view the source,
+ notice the lack of a <jsp:root> element! The text to be rendered
+ can be modified by changing the value of the name parameter.
+ <p>
+ SVG has many potential uses, such as searchable images, or images
+ customized with the name of your site's visitor (e.g. a "Susan's Store"
+ tab image). JSPX is a natural fit for generating dynamic XML content
+ such as SVG.
+ <p>
+ To execute this example you will need a browser with basic SVG support. Any
+ remotely recent browser should have this.
+ <ol>
+ <li>Use this URL:
+ <a href="textRotate.jspx?name=JSPX">textRotate.jspx?name=JSPX</a></li>
+ <li>Customize by changing the name=JSPX parameter</li>
+ </ol>
+ <p style="margin-top: 2em;">
+ The following is a screenshot of the resulting image, for those using a
+ browser without SVG support:<br>
+ <img src="textRotate.jpg" alt="[Screenshot image]" style="border: 1px solid #000;">
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.html b/web/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.html
new file mode 100644
index 0000000..5b3befe
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<title>View Source Code</title>
+</head>
+
+<body>
+<p><a href="textRotate.jspx"><img src="../../images/execute.gif" alt="Execute" style="border: 0;"></a> <a
+href="../../index.html"><img src="../../images/return.gif" alt="Return" style="border: 0;"></a></p>
+
+<h3><a href="textRotate.jspx.html">Source Code for SVG (Scalable Vector Graphics)
+Example</a></h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jpg b/web/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jpg
new file mode 100644
index 0000000..9e98736
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jpg
Binary files differ
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jspx b/web/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jspx
new file mode 100644
index 0000000..c543887
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jspx
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!--
+ - This example is based off the textRotate.svg example that comes
+ - with Apache Batik. The original example was written by Bill Haneman.
+ - This version by Mark Roth.
+ -->
+<svg xmlns="http://www.w3.org/2000/svg"
+ width="450" height="500" viewBox="0 0 450 500"
+ xmlns:c="http://java.sun.com/jsp/jstl/core"
+ xmlns:fn="http://java.sun.com/jsp/jstl/functions"
+ xmlns:jsp="http://java.sun.com/JSP/Page">
+ <jsp:directive.page contentType="image/svg+xml" />
+ <title>JSP 2.0 JSPX</title>
+ <!-- select name parameter, or default to JSPX -->
+ <c:set var="name" value='${empty fn:escapeXml(param["name"]) ? "JSPX" : fn:escapeXml(param["name"])}'/>
+ <g id="testContent">
+ <text class="title" x="50%" y="10%" font-size="15" text-anchor="middle" >
+ JSP 2.0 XML Syntax (.jspx) Demo</text>
+ <text class="title" x="50%" y="15%" font-size="15" text-anchor="middle" >
+ Try changing the name parameter!</text>
+ <g opacity="1.0" transform="translate(225, 250)" id="rotatedText">
+ <c:forEach var="i" begin="1" end="24">
+ <jsp:text>
+ <![CDATA[<g opacity="0.95" transform="scale(1.05) rotate(15)">]]>
+ </jsp:text>
+ <text x="0" y="0" transform="scale(1.6, 1.6)" fill="DarkSlateBlue"
+ text-anchor="middle" font-size="40" font-family="Serif"
+ id="words">${name}</text>
+ </c:forEach>
+ <c:forEach var="i" begin="1" end="24">
+ <jsp:text><![CDATA[</g>]]></jsp:text>
+ </c:forEach>
+ <text style="font-size:75;font-family:Serif;fill:white"
+ text-anchor="middle">${name}</text>
+ </g>
+ </g>
+</svg>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jspx.html b/web/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jspx.html
new file mode 100644
index 0000000..0e6c820
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jspx.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!--
+ - This example is based off the textRotate.svg example that comes
+ - with Apache Batik. The original example was written by Bill Haneman.
+ - This version by Mark Roth.
+ -->
+<svg xmlns="http://www.w3.org/2000/svg"
+ width="450" height="500" viewBox="0 0 450 500"
+ xmlns:c="http://java.sun.com/jsp/jstl/core"
+ xmlns:fn="http://java.sun.com/jsp/jstl/functions"
+ xmlns:jsp="http://java.sun.com/JSP/Page">
+ <jsp:directive.page contentType="image/svg+xml" />
+ <title>JSP 2.0 JSPX</title>
+ <!-- select name parameter, or default to JSPX -->
+ <c:set var="name" value='${empty fn:escapeXml(param["name"]) ? "JSPX" : fn:escapeXml(param["name"])}'/>
+ <g id="testContent">
+ <text class="title" x="50%" y="10%" font-size="15" text-anchor="middle" >
+ JSP 2.0 XML Syntax (.jspx) Demo</text>
+ <text class="title" x="50%" y="15%" font-size="15" text-anchor="middle" >
+ Try changing the name parameter!</text>
+ <g opacity="1.0" transform="translate(225, 250)" id="rotatedText">
+ <c:forEach var="i" begin="1" end="24">
+ <jsp:text>
+ <![CDATA[<g opacity="0.95" transform="scale(1.05) rotate(15)">]]>
+ </jsp:text>
+ <text x="0" y="0" transform="scale(1.6, 1.6)" fill="DarkSlateBlue"
+ text-anchor="middle" font-size="40" font-family="Serif"
+ id="words">${name}</text>
+ </c:forEach>
+ <c:forEach var="i" begin="1" end="24">
+ <jsp:text><![CDATA[</g>]]></jsp:text>
+ </c:forEach>
+ <text style="font-size:75;font-family:Serif;fill:white"
+ text-anchor="middle">${name}</text>
+ </g>
+ </g>
+</svg>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/misc/EchoAttributesTag.java.html b/web/tomcat/webapps/examples/jsp/jsp2/misc/EchoAttributesTag.java.html
new file mode 100644
index 0000000..53474b4
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/misc/EchoAttributesTag.java.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples.simpletag;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.JspWriter;
+import javax.servlet.jsp.tagext.DynamicAttributes;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+
+/**
+ * SimpleTag handler that echoes all its attributes
+ */
+public class EchoAttributesTag
+ extends SimpleTagSupport
+ implements DynamicAttributes
+{
+ private final List<String> keys = new ArrayList<>();
+ private final List<Object> values = new ArrayList<>();
+
+ @Override
+ public void doTag() throws JspException, IOException {
+ JspWriter out = getJspContext().getOut();
+ for( int i = 0; i < keys.size(); i++ ) {
+ String key = keys.get( i );
+ Object value = values.get( i );
+ out.println( "<li>" + key + " = " + value + "</li>" );
+ }
+ }
+
+ @Override
+ public void setDynamicAttribute( String uri, String localName,
+ Object value )
+ throws JspException
+ {
+ keys.add( localName );
+ values.add( value );
+ }
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/misc/coda.jspf b/web/tomcat/webapps/examples/jsp/jsp2/misc/coda.jspf
new file mode 100644
index 0000000..d767de5
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/misc/coda.jspf
@@ -0,0 +1,21 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<hr>
+<center>
+This banner included with <include-coda>
+</center>
+<hr>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/misc/coda.jspf.html b/web/tomcat/webapps/examples/jsp/jsp2/misc/coda.jspf.html
new file mode 100644
index 0000000..3a82576
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/misc/coda.jspf.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<hr>
+<center>
+This banner included with &lt;include-coda&gt;
+</center>
+<hr>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/misc/config.html b/web/tomcat/webapps/examples/jsp/jsp2/misc/config.html
new file mode 100644
index 0000000..707d68f
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/misc/config.html
@@ -0,0 +1,35 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>View Source Code</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="config.jsp"><img src="../../images/execute.gif" align="right" border="0"></a>
+<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="config.jsp.html">Source Code for config.jsp<font color="#0000FF"></a>
+ </font> </h3>
+<h3><a href="prelude.jspf.html">Source Code for prelude.jspf<font color="#0000FF"></a>
+ </font> </h3>
+<h3><a href="coda.jspf.html">Source Code for coda.jspf<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/misc/config.jsp b/web/tomcat/webapps/examples/jsp/jsp2/misc/config.jsp
new file mode 100644
index 0000000..0372889
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/misc/config.jsp
@@ -0,0 +1,32 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%>
+ <h1>JSP 2.0 Examples - JSP Configuration</h1>
+ <hr>
+ <p>Using a <jsp-property-group> element in the web.xml
+ deployment descriptor, this JSP page has been configured in the
+ following ways:</p>
+ <ul>
+ <li>Uses <include-prelude> to include the top banner.</li>
+ <li>Uses <include-coda> to include the bottom banner.</li>
+ <li>Uses <scripting-invalid> true to disable
+ <% scripting %> elements</li>
+ <li>Uses <el-ignored> true to disable ${EL} elements</li>
+ <li>Uses <page-encoding> ISO-8859-1 to set the page encoding (though this is the default anyway)</li>
+ </ul>
+ There are various other configuration options that can be used.
+
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/misc/config.jsp.html b/web/tomcat/webapps/examples/jsp/jsp2/misc/config.jsp.html
new file mode 100644
index 0000000..6ce33ff
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/misc/config.jsp.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%>
+ <h1>JSP 2.0 Examples - JSP Configuration</h1>
+ <hr>
+ <p>Using a &lt;jsp-property-group&gt; element in the web.xml
+ deployment descriptor, this JSP page has been configured in the
+ following ways:</p>
+ <ul>
+ <li>Uses &lt;include-prelude&gt; to include the top banner.</li>
+ <li>Uses &lt;include-coda&gt; to include the bottom banner.</li>
+ <li>Uses &lt;scripting-invalid&gt; true to disable
+ &lt;% scripting %&gt; elements</li>
+ <li>Uses &lt;el-ignored&gt; true to disable ${EL} elements</li>
+ <li>Uses &lt;page-encoding&gt; ISO-8859-1 to set the page encoding (though this is the default anyway)</li>
+ </ul>
+ There are various other configuration options that can be used.
+
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.html b/web/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.html
new file mode 100644
index 0000000..4fa1bf1
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.html
@@ -0,0 +1,33 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>View Source Code</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="dynamicattrs.jsp"><img src="../../images/execute.gif" align="right" border="0"></a>
+<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="dynamicattrs.jsp.html">Source Code for dynamicattrs.jsp<font color="#0000FF"></a>
+ </font> </h3>
+<h3><a href="EchoAttributesTag.java.html">Source Code for EchoAttributesTag.java<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp b/web/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp
new file mode 100644
index 0000000..251c49d
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp
@@ -0,0 +1,44 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%>
+<html>
+ <head>
+ <title>JSP 2.0 Examples - Dynamic Attributes</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - Dynamic Attributes</h1>
+ <hr>
+ <p>This JSP page invokes a custom tag that accepts a dynamic set
+ of attributes. The tag echoes the name and value of all attributes
+ passed to it.</p>
+ <hr>
+ <h2>Invocation 1 (six attributes)</h2>
+ <ul>
+ <my:echoAttributes x="1" y="2" z="3" r="red" g="green" b="blue"/>
+ </ul>
+ <h2>Invocation 2 (zero attributes)</h2>
+ <ul>
+ <my:echoAttributes/>
+ </ul>
+ <h2>Invocation 3 (three attributes)</h2>
+ <ul>
+ <my:echoAttributes dogName="Scruffy"
+ catName="Fluffy"
+ blowfishName="Puffy"/>
+ </ul>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp.html b/web/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp.html
new file mode 100644
index 0000000..8f5ee18
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%>
+<html>
+ <head>
+ <title>JSP 2.0 Examples - Dynamic Attributes</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - Dynamic Attributes</h1>
+ <hr>
+ <p>This JSP page invokes a custom tag that accepts a dynamic set
+ of attributes. The tag echoes the name and value of all attributes
+ passed to it.</p>
+ <hr>
+ <h2>Invocation 1 (six attributes)</h2>
+ <ul>
+ <my:echoAttributes x="1" y="2" z="3" r="red" g="green" b="blue"/>
+ </ul>
+ <h2>Invocation 2 (zero attributes)</h2>
+ <ul>
+ <my:echoAttributes/>
+ </ul>
+ <h2>Invocation 3 (three attributes)</h2>
+ <ul>
+ <my:echoAttributes dogName="Scruffy"
+ catName="Fluffy"
+ blowfishName="Puffy"/>
+ </ul>
+ </body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/misc/prelude.jspf b/web/tomcat/webapps/examples/jsp/jsp2/misc/prelude.jspf
new file mode 100644
index 0000000..05f7c84
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/misc/prelude.jspf
@@ -0,0 +1,21 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<hr>
+<center>
+This banner included with <include-prelude>
+</center>
+<hr>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/misc/prelude.jspf.html b/web/tomcat/webapps/examples/jsp/jsp2/misc/prelude.jspf.html
new file mode 100644
index 0000000..8b2bcd0
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/misc/prelude.jspf.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<hr>
+<center>
+This banner included with &lt;include-prelude&gt;
+</center>
+<hr>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/simpletag/BookBean.java.html b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/BookBean.java.html
new file mode 100644
index 0000000..59ef906
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/BookBean.java.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples;
+
+public class BookBean {
+ private final String title;
+ private final String author;
+ private final String isbn;
+
+ public BookBean( String title, String author, String isbn ) {
+ this.title = title;
+ this.author = author;
+ this.isbn = isbn;
+ }
+
+ public String getTitle() {
+ return this.title;
+ }
+
+ public String getAuthor() {
+ return this.author;
+ }
+
+ public String getIsbn() {
+ return this.isbn;
+ }
+
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/simpletag/FindBookSimpleTag.java.html b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/FindBookSimpleTag.java.html
new file mode 100644
index 0000000..45b2ac0
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/FindBookSimpleTag.java.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples.simpletag;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+
+import jsp2.examples.BookBean;
+
+/**
+ * SimpleTag handler that pretends to search for a book, and stores
+ * the result in a scoped variable.
+ */
+public class FindBookSimpleTag extends SimpleTagSupport {
+ private String var;
+
+ private static final String BOOK_TITLE = "The Lord of the Rings";
+ private static final String BOOK_AUTHOR = "J. R. R. Tolkien";
+ private static final String BOOK_ISBN = "0618002251";
+
+ @Override
+ public void doTag() throws JspException {
+ BookBean book = new BookBean( BOOK_TITLE, BOOK_AUTHOR, BOOK_ISBN );
+ getJspContext().setAttribute( this.var, book );
+ }
+
+ public void setVar( String var ) {
+ this.var = var;
+ }
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/simpletag/Functions.java.html b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/Functions.java.html
new file mode 100644
index 0000000..aa84ccc
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/Functions.java.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples.el;
+
+import java.util.Locale;
+
+/**
+ * Defines the functions for the jsp2 example tag library.
+ *
+ * <p>Each function is defined as a static method.</p>
+ */
+public class Functions {
+ public static String reverse( String text ) {
+ return new StringBuilder( text ).reverse().toString();
+ }
+
+ public static int numVowels( String text ) {
+ String vowels = "aeiouAEIOU";
+ int result = 0;
+ for( int i = 0; i < text.length(); i++ ) {
+ if( vowels.indexOf( text.charAt( i ) ) != -1 ) {
+ result++;
+ }
+ }
+ return result;
+ }
+
+ public static String caps( String text ) {
+ return text.toUpperCase(Locale.ENGLISH);
+ }
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/simpletag/HelloWorldSimpleTag.java.html b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/HelloWorldSimpleTag.java.html
new file mode 100644
index 0000000..4c2a7b7
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/HelloWorldSimpleTag.java.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples.simpletag;
+
+import java.io.IOException;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+
+/**
+ * SimpleTag handler that prints "Hello, world!"
+ */
+public class HelloWorldSimpleTag extends SimpleTagSupport {
+ @Override
+ public void doTag() throws JspException, IOException {
+ getJspContext().getOut().write( "Hello, world!" );
+ }
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/simpletag/RepeatSimpleTag.java.html b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/RepeatSimpleTag.java.html
new file mode 100644
index 0000000..6831fdd
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/RepeatSimpleTag.java.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package jsp2.examples.simpletag;
+
+import java.io.IOException;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+
+/**
+ * SimpleTag handler that accepts a num attribute and
+ * invokes its body 'num' times.
+ */
+public class RepeatSimpleTag extends SimpleTagSupport {
+ private int num;
+
+ @Override
+ public void doTag() throws JspException, IOException {
+ for (int i=0; i<num; i++) {
+ getJspContext().setAttribute("count", String.valueOf( i + 1 ) );
+ getJspBody().invoke(null);
+ }
+ }
+
+ public void setNum(int num) {
+ this.num = num;
+ }
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/simpletag/book.html b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/book.html
new file mode 100644
index 0000000..2841acf
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/book.html
@@ -0,0 +1,37 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>View Source Code</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="book.jsp"><img src="../../images/execute.gif" align="right" border="0"></a>
+<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="book.jsp.html">Source Code for the Book Example JSP<font color="#0000FF"></a>
+ </font> </h3>
+<h3><a href="FindBookSimpleTag.java.html">Source Code for the FindBook SimpleTag Handler<font color="#0000FF"></a>
+ </font> </h3>
+<h3><a href="BookBean.java.html">Source Code for BookBean<font color="#0000FF"></a>
+ </font> </h3>
+<h3><a href="Functions.java.html">Source Code for the EL Functions<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/simpletag/book.jsp b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/book.jsp
new file mode 100644
index 0000000..ba07cfb
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/book.jsp
@@ -0,0 +1,55 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="my" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %>
+<html>
+ <head>
+ <title>JSP 2.0 Examples - Book SimpleTag Handler</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - Book SimpleTag Handler</h1>
+ <hr>
+ <p>Illustrates a semi-realistic use of SimpleTag and the Expression
+ Language. First, a <my:findBook> tag is invoked to populate
+ the page context with a BookBean. Then, the books fields are printed
+ in all caps.</p>
+ <br>
+ <b><u>Result:</u></b><br>
+ <my:findBook var="book"/>
+ <table border="1">
+ <thead>
+ <td><b>Field</b></td>
+ <td><b>Value</b></td>
+ <td><b>Capitalized</b></td>
+ </thead>
+ <tr>
+ <td>Title</td>
+ <td>${book.title}</td>
+ <td>${my:caps(book.title)}</td>
+ </tr>
+ <tr>
+ <td>Author</td>
+ <td>${book.author}</td>
+ <td>${my:caps(book.author)}</td>
+ </tr>
+ <tr>
+ <td>ISBN</td>
+ <td>${book.isbn}</td>
+ <td>${my:caps(book.isbn)}</td>
+ </tr>
+ </table>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/simpletag/book.jsp.html b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/book.jsp.html
new file mode 100644
index 0000000..51c27a0
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/book.jsp.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="my" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %>
+<html>
+ <head>
+ <title>JSP 2.0 Examples - Book SimpleTag Handler</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - Book SimpleTag Handler</h1>
+ <hr>
+ <p>Illustrates a semi-realistic use of SimpleTag and the Expression
+ Language. First, a &lt;my:findBook&gt; tag is invoked to populate
+ the page context with a BookBean. Then, the books fields are printed
+ in all caps.</p>
+ <br>
+ <b><u>Result:</u></b><br>
+ <my:findBook var="book"/>
+ <table border="1">
+ <thead>
+ <td><b>Field</b></td>
+ <td><b>Value</b></td>
+ <td><b>Capitalized</b></td>
+ </thead>
+ <tr>
+ <td>Title</td>
+ <td>${book.title}</td>
+ <td>${my:caps(book.title)}</td>
+ </tr>
+ <tr>
+ <td>Author</td>
+ <td>${book.author}</td>
+ <td>${my:caps(book.author)}</td>
+ </tr>
+ <tr>
+ <td>ISBN</td>
+ <td>${book.isbn}</td>
+ <td>${my:caps(book.isbn)}</td>
+ </tr>
+ </table>
+ </body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.html b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.html
new file mode 100644
index 0000000..20cadf8
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.html
@@ -0,0 +1,33 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>View Source Code</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="hello.jsp"><img src="../../images/execute.gif" align="right" border="0"></a>
+<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="hello.jsp.html">Source Code for the Hello World Tag Example JSP<font color="#0000FF"></a>
+ </font> </h3>
+<h3><a href="HelloWorldSimpleTag.java.html">Source Code for the Hello World SimpleTag Handler<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.jsp b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.jsp
new file mode 100644
index 0000000..d9f22a2
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.jsp
@@ -0,0 +1,31 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %>
+<html>
+ <head>
+ <title>JSP 2.0 Examples - Hello World SimpleTag Handler</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - Hello World SimpleTag Handler</h1>
+ <hr>
+ <p>This tag handler simply echos "Hello, World!" It's an example of
+ a very basic SimpleTag handler with no body.</p>
+ <br>
+ <b><u>Result:</u></b>
+ <mytag:helloWorld/>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.jsp.html b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.jsp.html
new file mode 100644
index 0000000..76f3973
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.jsp.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %>
+<html>
+ <head>
+ <title>JSP 2.0 Examples - Hello World SimpleTag Handler</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - Hello World SimpleTag Handler</h1>
+ <hr>
+ <p>This tag handler simply echos "Hello, World!" It's an example of
+ a very basic SimpleTag handler with no body.</p>
+ <br>
+ <b><u>Result:</u></b>
+ <mytag:helloWorld/>
+ </body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.html b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.html
new file mode 100644
index 0000000..a56bfcd
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.html
@@ -0,0 +1,33 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>View Source Code</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="repeat.jsp"><img src="../../images/execute.gif" align="right" border="0"></a>
+<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="repeat.jsp.html">Source Code for the Repeat Tag Example JSP<font color="#0000FF"></a>
+ </font> </h3>
+<h3><a href="RepeatSimpleTag.java.html">Source Code for the Repeat SimpleTag Handler<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.jsp b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.jsp
new file mode 100644
index 0000000..b12d0a9
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.jsp
@@ -0,0 +1,39 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %>
+<html>
+ <head>
+ <title>JSP 2.0 Examples - Repeat SimpleTag Handler</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - Repeat SimpleTag Handler</h1>
+ <hr>
+ <p>This tag handler accepts a "num" parameter and repeats the body of the
+ tag "num" times. It's a simple example, but the implementation of
+ such a tag in JSP 2.0 is substantially simpler than the equivalent
+ JSP 1.2-style classic tag handler.</p>
+ <p>The body of the tag is encapsulated in a "JSP Fragment" and passed
+ to the tag handler, which then executes it five times, inside a
+ for loop. The tag handler passes in the current invocation in a
+ scoped variable called count, which can be accessed using the EL.</p>
+ <br>
+ <b><u>Result:</u></b><br>
+ <mytag:repeat num="5">
+ Invocation ${count} of 5<br>
+ </mytag:repeat>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.jsp.html b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.jsp.html
new file mode 100644
index 0000000..bd40cab
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.jsp.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %>
+<html>
+ <head>
+ <title>JSP 2.0 Examples - Repeat SimpleTag Handler</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - Repeat SimpleTag Handler</h1>
+ <hr>
+ <p>This tag handler accepts a "num" parameter and repeats the body of the
+ tag "num" times. It's a simple example, but the implementation of
+ such a tag in JSP 2.0 is substantially simpler than the equivalent
+ JSP 1.2-style classic tag handler.</p>
+ <p>The body of the tag is encapsulated in a "JSP Fragment" and passed
+ to the tag handler, which then executes it five times, inside a
+ for loop. The tag handler passes in the current invocation in a
+ scoped variable called count, which can be accessed using the EL.</p>
+ <br>
+ <b><u>Result:</u></b><br>
+ <mytag:repeat num="5">
+ Invocation ${count} of 5<br>
+ </mytag:repeat>
+ </body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/displayProducts.tag.html b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/displayProducts.tag.html
new file mode 100644
index 0000000..dd488f2
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/displayProducts.tag.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ attribute name="normalPrice" fragment="true" %>
+<%@ attribute name="onSale" fragment="true" %>
+<%@ variable name-given="name" %>
+<%@ variable name-given="price" %>
+<%@ variable name-given="origPrice" %>
+<%@ variable name-given="salePrice" %>
+
+<table border="1">
+ <tr>
+ <td>
+ <c:set var="name" value="Hand-held Color PDA"/>
+ <c:set var="price" value="$298.86"/>
+ <jsp:invoke fragment="normalPrice"/>
+ </td>
+ <td>
+ <c:set var="name" value="4-Pack 150 Watt Light Bulbs"/>
+ <c:set var="origPrice" value="$2.98"/>
+ <c:set var="salePrice" value="$2.32"/>
+ <jsp:invoke fragment="onSale"/>
+ </td>
+ <td>
+ <c:set var="name" value="Digital Cellular Phone"/>
+ <c:set var="price" value="$68.74"/>
+ <jsp:invoke fragment="normalPrice"/>
+ </td>
+ <td>
+ <c:set var="name" value="Baby Grand Piano"/>
+ <c:set var="price" value="$10,800.00"/>
+ <jsp:invoke fragment="normalPrice"/>
+ </td>
+ <td>
+ <c:set var="name" value="Luxury Car w/ Leather Seats"/>
+ <c:set var="origPrice" value="$23,980.00"/>
+ <c:set var="salePrice" value="$21,070.00"/>
+ <jsp:invoke fragment="onSale"/>
+ </td>
+ </tr>
+</table>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.html b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.html
new file mode 100644
index 0000000..f29a379
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.html
@@ -0,0 +1,33 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>View Source Code</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="hello.jsp"><img src="../../images/execute.gif" align="right" border="0"></a>
+<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="hello.jsp.html">Source Code for hello.jsp<font color="#0000FF"></a>
+ </font> </h3>
+<h3><a href="helloWorld.tag.html">Source Code for helloWorld.tag<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.jsp b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.jsp
new file mode 100644
index 0000000..9b260f5
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.jsp
@@ -0,0 +1,35 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
+<html>
+ <head>
+ <title>JSP 2.0 Examples - Hello World Using a Tag File</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - Hello World Using a Tag File</h1>
+ <hr>
+ <p>This JSP page invokes a custom tag that simply echos "Hello, World!"
+ The custom tag is generated from a tag file in the /WEB-INF/tags
+ directory.</p>
+ <p>Notice that we did not need to write a TLD for this tag. We just
+ created /WEB-INF/tags/helloWorld.tag, imported it using the taglib
+ directive, and used it!</p>
+ <br>
+ <b><u>Result:</u></b>
+ <tags:helloWorld/>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.jsp.html b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.jsp.html
new file mode 100644
index 0000000..b431f30
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.jsp.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
+<html>
+ <head>
+ <title>JSP 2.0 Examples - Hello World Using a Tag File</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - Hello World Using a Tag File</h1>
+ <hr>
+ <p>This JSP page invokes a custom tag that simply echos "Hello, World!"
+ The custom tag is generated from a tag file in the /WEB-INF/tags
+ directory.</p>
+ <p>Notice that we did not need to write a TLD for this tag. We just
+ created /WEB-INF/tags/helloWorld.tag, imported it using the taglib
+ directive, and used it!</p>
+ <br>
+ <b><u>Result:</u></b>
+ <tags:helloWorld/>
+ </body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/helloWorld.tag.html b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/helloWorld.tag.html
new file mode 100644
index 0000000..f29726f
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/helloWorld.tag.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+Hello, world!
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.html b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.html
new file mode 100644
index 0000000..1f03b9c
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.html
@@ -0,0 +1,33 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>View Source Code</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="panel.jsp"><img src="../../images/execute.gif" align="right" border="0"></a>
+<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="panel.jsp.html">Source Code for panel.jsp<font color="#0000FF"></a>
+ </font> </h3>
+<h3><a href="panel.tag.html">Source Code for panel.tag<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.jsp b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.jsp
new file mode 100644
index 0000000..d963877
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.jsp
@@ -0,0 +1,58 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
+<html>
+ <head>
+ <title>JSP 2.0 Examples - Panels using Tag Files</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - Panels using Tag Files</h1>
+ <hr>
+ <p>This JSP page invokes a custom tag that draws a
+ panel around the contents of the tag body. Normally, such a tag
+ implementation would require a Java class with many println() statements,
+ outputting HTML. Instead, we can use a .tag file as a template,
+ and we don't need to write a single line of Java or even a TLD!</p>
+ <hr>
+ <table border="0">
+ <tr valign="top">
+ <td>
+ <tags:panel color="#ff8080" bgcolor="#ffc0c0" title="Panel 1">
+ First panel.<br/>
+ </tags:panel>
+ </td>
+ <td>
+ <tags:panel color="#80ff80" bgcolor="#c0ffc0" title="Panel 2">
+ Second panel.<br/>
+ Second panel.<br/>
+ Second panel.<br/>
+ Second panel.<br/>
+ </tags:panel>
+ </td>
+ <td>
+ <tags:panel color="#8080ff" bgcolor="#c0c0ff" title="Panel 3">
+ Third panel.<br/>
+ <tags:panel color="#ff80ff" bgcolor="#ffc0ff" title="Inner">
+ A panel in a panel.
+ </tags:panel>
+ Third panel.<br/>
+ </tags:panel>
+ </td>
+ </tr>
+ </table>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.jsp.html b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.jsp.html
new file mode 100644
index 0000000..584393d
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.jsp.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
+<html>
+ <head>
+ <title>JSP 2.0 Examples - Panels using Tag Files</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - Panels using Tag Files</h1>
+ <hr>
+ <p>This JSP page invokes a custom tag that draws a
+ panel around the contents of the tag body. Normally, such a tag
+ implementation would require a Java class with many println() statements,
+ outputting HTML. Instead, we can use a .tag file as a template,
+ and we don't need to write a single line of Java or even a TLD!</p>
+ <hr>
+ <table border="0">
+ <tr valign="top">
+ <td>
+ <tags:panel color="#ff8080" bgcolor="#ffc0c0" title="Panel 1">
+ First panel.<br/>
+ </tags:panel>
+ </td>
+ <td>
+ <tags:panel color="#80ff80" bgcolor="#c0ffc0" title="Panel 2">
+ Second panel.<br/>
+ Second panel.<br/>
+ Second panel.<br/>
+ Second panel.<br/>
+ </tags:panel>
+ </td>
+ <td>
+ <tags:panel color="#8080ff" bgcolor="#c0c0ff" title="Panel 3">
+ Third panel.<br/>
+ <tags:panel color="#ff80ff" bgcolor="#ffc0ff" title="Inner">
+ A panel in a panel.
+ </tags:panel>
+ Third panel.<br/>
+ </tags:panel>
+ </td>
+ </tr>
+ </table>
+ </body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.tag.html b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.tag.html
new file mode 100644
index 0000000..aec91c3
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.tag.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<%@ attribute name="color" %>
+<%@ attribute name="bgcolor" %>
+<%@ attribute name="title" %>
+<table border="1" bgcolor="${color}">
+ <tr>
+ <td><b>${title}</b></td>
+ </tr>
+ <tr>
+ <td bgcolor="${bgcolor}">
+ <jsp:doBody/>
+ </td>
+ </tr>
+</table>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.html b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.html
new file mode 100644
index 0000000..72ae49f
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.html
@@ -0,0 +1,33 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>View Source Code</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="products.jsp"><img src="../../images/execute.gif" align="right" border="0"></a>
+<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="products.jsp.html">Source Code for products.jsp<font color="#0000FF"></a>
+ </font> </h3>
+<h3><a href="displayProducts.tag.html">Source Code for displayProducts.tag<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.jsp b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.jsp
new file mode 100644
index 0000000..7f32ffb
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.jsp
@@ -0,0 +1,54 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
+<html>
+ <head>
+ <title>JSP 2.0 Examples - Display Products Tag File</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - Display Products Tag File</h1>
+ <hr>
+ <p>This JSP page invokes a tag file that displays a listing of
+ products. The custom tag accepts two fragments that enable
+ customization of appearance. One for when the product is on sale
+ and one for normal price.</p>
+ <p>The tag is invoked twice, using different styles</p>
+ <hr>
+ <h2>Products</h2>
+ <tags:displayProducts>
+ <jsp:attribute name="normalPrice">
+ Item: ${name}<br/>
+ Price: ${price}
+ </jsp:attribute>
+ <jsp:attribute name="onSale">
+ Item: ${name}<br/>
+ <font color="red"><strike>Was: ${origPrice}</strike></font><br/>
+ <b>Now: ${salePrice}</b>
+ </jsp:attribute>
+ </tags:displayProducts>
+ <hr>
+ <h2>Products (Same tag, alternate style)</h2>
+ <tags:displayProducts>
+ <jsp:attribute name="normalPrice">
+ <b>${name}</b> @ ${price} ea.
+ </jsp:attribute>
+ <jsp:attribute name="onSale">
+ <b>${name}</b> @ ${salePrice} ea. (was: ${origPrice})
+ </jsp:attribute>
+ </tags:displayProducts>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.jsp.html b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.jsp.html
new file mode 100644
index 0000000..6d6fc10
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.jsp.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
+<html>
+ <head>
+ <title>JSP 2.0 Examples - Display Products Tag File</title>
+ </head>
+ <body>
+ <h1>JSP 2.0 Examples - Display Products Tag File</h1>
+ <hr>
+ <p>This JSP page invokes a tag file that displays a listing of
+ products. The custom tag accepts two fragments that enable
+ customization of appearance. One for when the product is on sale
+ and one for normal price.</p>
+ <p>The tag is invoked twice, using different styles</p>
+ <hr>
+ <h2>Products</h2>
+ <tags:displayProducts>
+ <jsp:attribute name="normalPrice">
+ Item: ${name}<br/>
+ Price: ${price}
+ </jsp:attribute>
+ <jsp:attribute name="onSale">
+ Item: ${name}<br/>
+ <font color="red"><strike>Was: ${origPrice}</strike></font><br/>
+ <b>Now: ${salePrice}</b>
+ </jsp:attribute>
+ </tags:displayProducts>
+ <hr>
+ <h2>Products (Same tag, alternate style)</h2>
+ <tags:displayProducts>
+ <jsp:attribute name="normalPrice">
+ <b>${name}</b> @ ${price} ea.
+ </jsp:attribute>
+ <jsp:attribute name="onSale">
+ <b>${name}</b> @ ${salePrice} ea. (was: ${origPrice})
+ </jsp:attribute>
+ </tags:displayProducts>
+ </body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsptoserv/ServletToJsp.java.html b/web/tomcat/webapps/examples/jsp/jsptoserv/ServletToJsp.java.html
new file mode 100644
index 0000000..0a38037
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsptoserv/ServletToJsp.java.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class ServletToJsp extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void doGet (HttpServletRequest request,
+ HttpServletResponse response) {
+
+ try {
+ // Set the attribute and Forward to hello.jsp
+ request.setAttribute ("servletName", "servletToJsp");
+ getServletConfig().getServletContext().getRequestDispatcher(
+ "/jsp/jsptoserv/hello.jsp").forward(request, response);
+ } catch (Exception ex) {
+ ex.printStackTrace ();
+ }
+ }
+}
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsptoserv/hello.jsp b/web/tomcat/webapps/examples/jsp/jsptoserv/hello.jsp
new file mode 100644
index 0000000..8b2a43f
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsptoserv/hello.jsp
@@ -0,0 +1,26 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<body bgcolor="white">
+
+<h1>
+I have been invoked by
+<% out.print (request.getAttribute("servletName").toString()); %>
+Servlet.
+</h1>
+
+</html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsptoserv/hello.jsp.html b/web/tomcat/webapps/examples/jsp/jsptoserv/hello.jsp.html
new file mode 100644
index 0000000..6ed7176
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsptoserv/hello.jsp.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<body bgcolor="white">
+
+<h1>
+I have been invoked by
+<% out.print (request.getAttribute("servletName").toString()); %>
+Servlet.
+</h1>
+
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp b/web/tomcat/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp
new file mode 100644
index 0000000..db68a6f
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp
@@ -0,0 +1,23 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<body bgcolor="white">
+
+<!-- Forward to a servlet -->
+<jsp:forward page="/servletToJsp" />
+
+</html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp.html b/web/tomcat/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp.html
new file mode 100644
index 0000000..a5dc22c
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<body bgcolor="white">
+
+<!-- Forward to a servlet -->
+<jsp:forward page="/servletToJsp" />
+
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/jsptoserv/jts.html b/web/tomcat/webapps/examples/jsp/jsptoserv/jts.html
new file mode 100644
index 0000000..a4e1679
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/jsptoserv/jts.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+<head>
+<meta charset="UTF-8" />
+<title>Untitled Document</title>
+<style type="text/css">
+img { border: 0; }
+</style>
+</head>
+
+<body>
+<p><a href="jsptoservlet.jsp"><img src="../images/execute.gif" alt=""> Execute</a><br />
+<a href="../index.html"><img src="../images/return.gif" alt=""> Return</a></p>
+
+<p style="font-size: 1.4em;"><a href="jsptoservlet.jsp.html">Source Code for JSP calling servlet</a></p>
+
+<p style="font-size: 1.4em;"><a href="ServletToJsp.java.html">Source Code for Servlet calling JSP</a></p>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/num/numguess.html b/web/tomcat/webapps/examples/jsp/num/numguess.html
new file mode 100644
index 0000000..1c5a484
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/num/numguess.html
@@ -0,0 +1,34 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ Number Guess Game
+ Written by Jason Hunter, CTO, K&A Software
+ http://www.servlets.com
+-->
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="numguess.jsp"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="numguess.jsp.html">Source Code for Numguess Example<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/num/numguess.jsp b/web/tomcat/webapps/examples/jsp/num/numguess.jsp
new file mode 100644
index 0000000..d9c61b9
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/num/numguess.jsp
@@ -0,0 +1,69 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ Number Guess Game
+ Written by Jason Hunter, CTO, K&A Software
+ http://www.servlets.com
+--%>
+
+<%@ page import = "num.NumberGuessBean" %>
+
+<jsp:useBean id="numguess" class="num.NumberGuessBean" scope="session"/>
+<jsp:setProperty name="numguess" property="*"/>
+
+<html>
+<head><title>Number Guess</title></head>
+<body bgcolor="white">
+<font size=4>
+
+<% if (numguess.getSuccess()) { %>
+
+ Congratulations! You got it.
+ And after just <%= numguess.getNumGuesses() %> tries.<p>
+
+ <% numguess.reset(); %>
+
+ Care to <a href="numguess.jsp">try again</a>?
+
+<% } else if (numguess.getNumGuesses() == 0) { %>
+
+ Welcome to the Number Guess game.<p>
+
+ I'm thinking of a number between 1 and 100.<p>
+
+ <form method=get>
+ What's your guess? <input type=text name=guess>
+ <input type=submit value="Submit">
+ </form>
+
+<% } else { %>
+
+ Good guess, but nope. Try <b><%= numguess.getHint() %></b>.
+
+ You have made <%= numguess.getNumGuesses() %> guesses.<p>
+
+ I'm thinking of a number between 1 and 100.<p>
+
+ <form method=get>
+ What's your guess? <input type=text name=guess>
+ <input type=submit value="Submit">
+ </form>
+
+<% } %>
+
+</font>
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/num/numguess.jsp.html b/web/tomcat/webapps/examples/jsp/num/numguess.jsp.html
new file mode 100644
index 0000000..e764041
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/num/numguess.jsp.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ Number Guess Game
+ Written by Jason Hunter, CTO, K&A Software
+ http://www.servlets.com
+--%>
+
+<%@ page import = "num.NumberGuessBean" %>
+
+<jsp:useBean id="numguess" class="num.NumberGuessBean" scope="session"/>
+<jsp:setProperty name="numguess" property="*"/>
+
+<html>
+<head><title>Number Guess</title></head>
+<body bgcolor="white">
+<font size=4>
+
+<% if (numguess.getSuccess()) { %>
+
+ Congratulations! You got it.
+ And after just <%= numguess.getNumGuesses() %> tries.<p>
+
+ <% numguess.reset(); %>
+
+ Care to <a href="numguess.jsp">try again</a>?
+
+<% } else if (numguess.getNumGuesses() == 0) { %>
+
+ Welcome to the Number Guess game.<p>
+
+ I'm thinking of a number between 1 and 100.<p>
+
+ <form method=get>
+ What's your guess? <input type=text name=guess>
+ <input type=submit value="Submit">
+ </form>
+
+<% } else { %>
+
+ Good guess, but nope. Try <b><%= numguess.getHint() %></b>.
+
+ You have made <%= numguess.getNumGuesses() %> guesses.<p>
+
+ I'm thinking of a number between 1 and 100.<p>
+
+ <form method=get>
+ What's your guess? <input type=text name=guess>
+ <input type=submit value="Submit">
+ </form>
+
+<% } %>
+
+</font>
+</body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/plugin/applet/Clock2.class b/web/tomcat/webapps/examples/jsp/plugin/applet/Clock2.class
new file mode 100644
index 0000000..cd01539
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/plugin/applet/Clock2.class
Binary files differ
diff --git a/web/tomcat/webapps/examples/jsp/plugin/applet/Clock2.java b/web/tomcat/webapps/examples/jsp/plugin/applet/Clock2.java
new file mode 100644
index 0000000..17bd9dd
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/plugin/applet/Clock2.java
@@ -0,0 +1,229 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import java.applet.Applet;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * Time!
+ *
+ * @author Rachel Gollub
+ */
+
+public class Clock2 extends Applet implements Runnable {
+ private static final long serialVersionUID = 1L;
+ Thread timer; // The thread that displays clock
+ int lastxs, lastys, lastxm,
+ lastym, lastxh, lastyh; // Dimensions used to draw hands
+ SimpleDateFormat formatter; // Formats the date displayed
+ String lastdate; // String to hold date displayed
+ Font clockFaceFont; // Font for number display on clock
+ Date currentDate; // Used to get date to display
+ Color handColor; // Color of main hands and dial
+ Color numberColor; // Color of second hand and numbers
+
+ @Override
+ public void init() {
+ lastxs = lastys = lastxm = lastym = lastxh = lastyh = 0;
+ formatter = new SimpleDateFormat ("EEE MMM dd hh:mm:ss yyyy", Locale.getDefault());
+ currentDate = new Date();
+ lastdate = formatter.format(currentDate);
+ clockFaceFont = new Font("Serif", Font.PLAIN, 14);
+ handColor = Color.blue;
+ numberColor = Color.darkGray;
+
+ try {
+ setBackground(new Color(Integer.parseInt(getParameter("bgcolor"),16)));
+ } catch (Exception e) {
+ // Ignored
+ }
+ try {
+ handColor = new Color(Integer.parseInt(getParameter("fgcolor1"),16));
+ } catch (Exception e) {
+ // Ignored
+ }
+ try {
+ numberColor = new Color(Integer.parseInt(getParameter("fgcolor2"),16));
+ } catch (Exception e) {
+ // Ignored
+ }
+ resize(300,300); // Set clock window size
+ }
+
+ // Plotpoints allows calculation to only cover 45 degrees of the circle,
+ // and then mirror
+ public void plotpoints(int x0, int y0, int x, int y, Graphics g) {
+ g.drawLine(x0+x,y0+y,x0+x,y0+y);
+ g.drawLine(x0+y,y0+x,x0+y,y0+x);
+ g.drawLine(x0+y,y0-x,x0+y,y0-x);
+ g.drawLine(x0+x,y0-y,x0+x,y0-y);
+ g.drawLine(x0-x,y0-y,x0-x,y0-y);
+ g.drawLine(x0-y,y0-x,x0-y,y0-x);
+ g.drawLine(x0-y,y0+x,x0-y,y0+x);
+ g.drawLine(x0-x,y0+y,x0-x,y0+y);
+ }
+
+ // Circle is just Bresenham's algorithm for a scan converted circle
+ public void circle(int x0, int y0, int r, Graphics g) {
+ int x,y;
+ float d;
+ x=0;
+ y=r;
+ d=5/4-r;
+ plotpoints(x0,y0,x,y,g);
+
+ while (y>x){
+ if (d<0) {
+ d=d+2*x+3;
+ x++;
+ } else {
+ d=d+2*(x-y)+5;
+ x++;
+ y--;
+ }
+ plotpoints(x0,y0,x,y,g);
+ }
+ }
+
+ // Paint is the main part of the program
+ @Override
+ public void paint(Graphics g) {
+ int xh, yh, xm, ym, xs, ys, s = 0, m = 10, h = 10, xcenter, ycenter;
+ String today;
+
+ currentDate = new Date();
+ SimpleDateFormat formatter = new SimpleDateFormat("s",Locale.getDefault());
+ try {
+ s = Integer.parseInt(formatter.format(currentDate));
+ } catch (NumberFormatException n) {
+ s = 0;
+ }
+ formatter.applyPattern("m");
+ try {
+ m = Integer.parseInt(formatter.format(currentDate));
+ } catch (NumberFormatException n) {
+ m = 10;
+ }
+ formatter.applyPattern("h");
+ try {
+ h = Integer.parseInt(formatter.format(currentDate));
+ } catch (NumberFormatException n) {
+ h = 10;
+ }
+ formatter.applyPattern("EEE MMM dd HH:mm:ss yyyy");
+ today = formatter.format(currentDate);
+ xcenter=80;
+ ycenter=55;
+
+ // a= s* pi/2 - pi/2 (to switch 0,0 from 3:00 to 12:00)
+ // x = r(cos a) + xcenter, y = r(sin a) + ycenter
+
+ xs = (int)(Math.cos(s * 3.14f/30 - 3.14f/2) * 45 + xcenter);
+ ys = (int)(Math.sin(s * 3.14f/30 - 3.14f/2) * 45 + ycenter);
+ xm = (int)(Math.cos(m * 3.14f/30 - 3.14f/2) * 40 + xcenter);
+ ym = (int)(Math.sin(m * 3.14f/30 - 3.14f/2) * 40 + ycenter);
+ xh = (int)(Math.cos((h*30 + m/2) * 3.14f/180 - 3.14f/2) * 30 + xcenter);
+ yh = (int)(Math.sin((h*30 + m/2) * 3.14f/180 - 3.14f/2) * 30 + ycenter);
+
+ // Draw the circle and numbers
+
+ g.setFont(clockFaceFont);
+ g.setColor(handColor);
+ circle(xcenter,ycenter,50,g);
+ g.setColor(numberColor);
+ g.drawString("9",xcenter-45,ycenter+3);
+ g.drawString("3",xcenter+40,ycenter+3);
+ g.drawString("12",xcenter-5,ycenter-37);
+ g.drawString("6",xcenter-3,ycenter+45);
+
+ // Erase if necessary, and redraw
+
+ g.setColor(getBackground());
+ if (xs != lastxs || ys != lastys) {
+ g.drawLine(xcenter, ycenter, lastxs, lastys);
+ g.drawString(lastdate, 5, 125);
+ }
+ if (xm != lastxm || ym != lastym) {
+ g.drawLine(xcenter, ycenter-1, lastxm, lastym);
+ g.drawLine(xcenter-1, ycenter, lastxm, lastym); }
+ if (xh != lastxh || yh != lastyh) {
+ g.drawLine(xcenter, ycenter-1, lastxh, lastyh);
+ g.drawLine(xcenter-1, ycenter, lastxh, lastyh); }
+ g.setColor(numberColor);
+ g.drawString("", 5, 125);
+ g.drawString(today, 5, 125);
+ g.drawLine(xcenter, ycenter, xs, ys);
+ g.setColor(handColor);
+ g.drawLine(xcenter, ycenter-1, xm, ym);
+ g.drawLine(xcenter-1, ycenter, xm, ym);
+ g.drawLine(xcenter, ycenter-1, xh, yh);
+ g.drawLine(xcenter-1, ycenter, xh, yh);
+ lastxs=xs; lastys=ys;
+ lastxm=xm; lastym=ym;
+ lastxh=xh; lastyh=yh;
+ lastdate = today;
+ currentDate=null;
+ }
+
+ @Override
+ public void start() {
+ timer = new Thread(this);
+ timer.start();
+ }
+
+ @Override
+ public void stop() {
+ timer = null;
+ }
+
+ @Override
+ public void run() {
+ Thread me = Thread.currentThread();
+ while (timer == me) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ }
+ repaint();
+ }
+ }
+
+ @Override
+ public void update(Graphics g) {
+ paint(g);
+ }
+
+ @Override
+ public String getAppletInfo() {
+ return "Title: A Clock \nAuthor: Rachel Gollub, 1995 \nAn analog clock.";
+ }
+
+ @Override
+ public String[][] getParameterInfo() {
+ String[][] info = {
+ {"bgcolor", "hexadecimal RGB number", "The background color. Default is the color of your browser."},
+ {"fgcolor1", "hexadecimal RGB number", "The color of the hands and dial. Default is blue."},
+ {"fgcolor2", "hexadecimal RGB number", "The color of the seconds hand and numbers. Default is dark gray."}
+ };
+ return info;
+ }
+}
diff --git a/web/tomcat/webapps/examples/jsp/plugin/plugin.html b/web/tomcat/webapps/examples/jsp/plugin/plugin.html
new file mode 100644
index 0000000..27bc51b
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/plugin/plugin.html
@@ -0,0 +1,30 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="plugin.jsp"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="plugin.jsp.html">Source Code for Plugin Example<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/plugin/plugin.jsp b/web/tomcat/webapps/examples/jsp/plugin/plugin.jsp
new file mode 100644
index 0000000..a07dda3
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/plugin/plugin.jsp
@@ -0,0 +1,34 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<title> Plugin example </title>
+<body bgcolor="white">
+<h3> Current time is : </h3>
+<jsp:plugin type="applet" code="Clock2.class" codebase="applet" jreversion="1.2" width="160" height="150" >
+ <jsp:fallback>
+ Plugin tag OBJECT or EMBED not supported by browser.
+ </jsp:fallback>
+</jsp:plugin>
+<p>
+<h4>
+<font color=red>
+The above applet is loaded using the Java Plugin from a jsp page using the
+plugin tag.
+</font>
+</h4>
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/plugin/plugin.jsp.html b/web/tomcat/webapps/examples/jsp/plugin/plugin.jsp.html
new file mode 100644
index 0000000..710bda7
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/plugin/plugin.jsp.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<title> Plugin example </title>
+<body bgcolor="white">
+<h3> Current time is : </h3>
+<jsp:plugin type="applet" code="Clock2.class" codebase="applet" jreversion="1.2" width="160" height="150" >
+ <jsp:fallback>
+ Plugin tag OBJECT or EMBED not supported by browser.
+ </jsp:fallback>
+</jsp:plugin>
+<p>
+<h4>
+<font color=red>
+The above applet is loaded using the Java Plugin from a jsp page using the
+plugin tag.
+</font>
+</h4>
+</body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/security/protected/error.jsp b/web/tomcat/webapps/examples/jsp/security/protected/error.jsp
new file mode 100644
index 0000000..29616af
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/security/protected/error.jsp
@@ -0,0 +1,25 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<head>
+<title>Error Page For Examples</title>
+</head>
+<body bgcolor="white">
+Invalid user name and/or password, please try
+<a href='<%= response.encodeURL(application.getContextPath() + "/jsp/security/protected/index.jsp") %>'>again</a>.
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/security/protected/error.jsp.html b/web/tomcat/webapps/examples/jsp/security/protected/error.jsp.html
new file mode 100644
index 0000000..b7e8b4a
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/security/protected/error.jsp.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<head>
+<title>Error Page For Examples</title>
+</head>
+<body bgcolor="white">
+Invalid user name and/or password, please try
+<a href='<%= response.encodeURL(application.getContextPath() + "/jsp/security/protected/index.jsp") %>'>again</a>.
+</body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/security/protected/index.jsp b/web/tomcat/webapps/examples/jsp/security/protected/index.jsp
new file mode 100644
index 0000000..31122eb
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/security/protected/index.jsp
@@ -0,0 +1,112 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ page import="java.util.Enumeration" %>
+<%
+ if (request.getParameter("logoff") != null) {
+ session.invalidate();
+ response.sendRedirect("index.jsp");
+ return;
+ }
+%>
+<html>
+<head>
+<title>Protected Page for Examples</title>
+</head>
+<body bgcolor="white">
+
+You are logged in as remote user
+<b><%= util.HTMLFilter.filter(request.getRemoteUser()) %></b>
+in session <b><%= session.getId() %></b><br><br>
+
+<%
+ if (request.getUserPrincipal() != null) {
+%>
+ Your user principal name is
+ <b><%= util.HTMLFilter.filter(request.getUserPrincipal().getName()) %></b>
+ <br><br>
+<%
+ } else {
+%>
+ No user principal could be identified.<br><br>
+<%
+ }
+%>
+
+<%
+ String role = request.getParameter("role");
+ if (role == null)
+ role = "";
+ if (role.length() > 0) {
+ if (request.isUserInRole(role)) {
+%>
+ You have been granted role
+ <b><%= util.HTMLFilter.filter(role) %></b><br><br>
+<%
+ } else {
+%>
+ You have <i>not</i> been granted role
+ <b><%= util.HTMLFilter.filter(role) %></b><br><br>
+<%
+ }
+ }
+%>
+
+To check whether your user name has been granted a particular role,
+enter it here:
+<form method="GET" action='<%= response.encodeURL("index.jsp") %>'>
+<input type="text" name="role" value="<%= util.HTMLFilter.filter(role) %>">
+<input type="submit" >
+</form>
+<br><br>
+
+To add some data to the authenticated session, enter it here:
+<form method="GET" action='<%= response.encodeURL("index.jsp") %>'>
+<input type="text" name="dataName">
+<input type="text" name="dataValue">
+<input type="submit" >
+</form>
+<br><br>
+
+<%
+ String dataName = request.getParameter("dataName");
+ if (dataName != null) {
+ session.setAttribute(dataName, request.getParameter("dataValue"));
+ }
+%>
+<p>The authenticated session contains the following attributes:</p>
+<table>
+<tr><th>Name</th><th>Value</th></tr>
+<%
+ Enumeration<String> names = session.getAttributeNames();
+ while (names.hasMoreElements()) {
+ String name = names.nextElement();
+%>
+<tr><td><%= name %></td><td><%= session.getAttribute(name) %></td>
+<%
+ }
+%>
+</table>
+<br><br>
+
+If you have configured this application for form-based authentication, you can
+log off by clicking
+<a href='<%= response.encodeURL("index.jsp?logoff=true") %>'>here</a>.
+This should cause you to be returned to the login page after the redirect
+that is performed.
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/security/protected/index.jsp.html b/web/tomcat/webapps/examples/jsp/security/protected/index.jsp.html
new file mode 100644
index 0000000..2fe6bdf
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/security/protected/index.jsp.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ page import="java.util.Enumeration" %>
+<%
+ if (request.getParameter("logoff") != null) {
+ session.invalidate();
+ response.sendRedirect("index.jsp");
+ return;
+ }
+%>
+<html>
+<head>
+<title>Protected Page for Examples</title>
+</head>
+<body bgcolor="white">
+
+You are logged in as remote user
+<b><%= util.HTMLFilter.filter(request.getRemoteUser()) %></b>
+in session <b><%= session.getId() %></b><br><br>
+
+<%
+ if (request.getUserPrincipal() != null) {
+%>
+ Your user principal name is
+ <b><%= util.HTMLFilter.filter(request.getUserPrincipal().getName()) %></b>
+ <br><br>
+<%
+ } else {
+%>
+ No user principal could be identified.<br><br>
+<%
+ }
+%>
+
+<%
+ String role = request.getParameter("role");
+ if (role == null)
+ role = "";
+ if (role.length() > 0) {
+ if (request.isUserInRole(role)) {
+%>
+ You have been granted role
+ <b><%= util.HTMLFilter.filter(role) %></b><br><br>
+<%
+ } else {
+%>
+ You have <i>not</i> been granted role
+ <b><%= util.HTMLFilter.filter(role) %></b><br><br>
+<%
+ }
+ }
+%>
+
+To check whether your user name has been granted a particular role,
+enter it here:
+<form method="GET" action='<%= response.encodeURL("index.jsp") %>'>
+<input type="text" name="role" value="<%= util.HTMLFilter.filter(role) %>">
+<input type="submit" >
+</form>
+<br><br>
+
+To add some data to the authenticated session, enter it here:
+<form method="GET" action='<%= response.encodeURL("index.jsp") %>'>
+<input type="text" name="dataName">
+<input type="text" name="dataValue">
+<input type="submit" >
+</form>
+<br><br>
+
+<%
+ String dataName = request.getParameter("dataName");
+ if (dataName != null) {
+ session.setAttribute(dataName, request.getParameter("dataValue"));
+ }
+%>
+<p>The authenticated session contains the following attributes:</p>
+<table>
+<tr><th>Name</th><th>Value</th></tr>
+<%
+ Enumeration<String> names = session.getAttributeNames();
+ while (names.hasMoreElements()) {
+ String name = names.nextElement();
+%>
+<tr><td><%= name %></td><td><%= session.getAttribute(name) %></td>
+<%
+ }
+%>
+</table>
+<br><br>
+
+If you have configured this application for form-based authentication, you can
+log off by clicking
+<a href='<%= response.encodeURL("index.jsp?logoff=true") %>'>here</a>.
+This should cause you to be returned to the login page after the redirect
+that is performed.
+
+</body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/security/protected/login.jsp b/web/tomcat/webapps/examples/jsp/security/protected/login.jsp
new file mode 100644
index 0000000..e11a898
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/security/protected/login.jsp
@@ -0,0 +1,38 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<head>
+<title>Login Page for Examples</title>
+<body bgcolor="white">
+<form method="POST" action='<%= response.encodeURL("j_security_check") %>' >
+ <table border="0" cellspacing="5">
+ <tr>
+ <th align="right">Username:</th>
+ <td align="left"><input type="text" name="j_username"></td>
+ </tr>
+ <tr>
+ <th align="right">Password:</th>
+ <td align="left"><input type="password" name="j_password"></td>
+ </tr>
+ <tr>
+ <td align="right"><input type="submit" value="Log In"></td>
+ <td align="left"><input type="reset"></td>
+ </tr>
+ </table>
+</form>
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/security/protected/login.jsp.html b/web/tomcat/webapps/examples/jsp/security/protected/login.jsp.html
new file mode 100644
index 0000000..5726e32
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/security/protected/login.jsp.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<head>
+<title>Login Page for Examples</title>
+<body bgcolor="white">
+<form method="POST" action='<%= response.encodeURL("j_security_check") %>' >
+ <table border="0" cellspacing="5">
+ <tr>
+ <th align="right">Username:</th>
+ <td align="left"><input type="text" name="j_username"></td>
+ </tr>
+ <tr>
+ <th align="right">Password:</th>
+ <td align="left"><input type="password" name="j_password"></td>
+ </tr>
+ <tr>
+ <td align="right"><input type="submit" value="Log In"></td>
+ <td align="left"><input type="reset"></td>
+ </tr>
+ </table>
+</form>
+</body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/sessions/DummyCart.html b/web/tomcat/webapps/examples/jsp/sessions/DummyCart.html
new file mode 100644
index 0000000..d953fa9
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/sessions/DummyCart.html
@@ -0,0 +1,56 @@
+<HTML>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<HEAD>
+<title>
+sessions.DummyCart Bean Properties
+</title>
+<BODY BGCOLOR="white">
+<H2>
+sessions.DummyCart Bean Properties
+</H2>
+<HR>
+<DL>
+<DT>public class <B>DummyCart</B><DT>extends Object</DL>
+
+<P>
+<HR>
+
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0">
+<TR BGCOLOR="#EEEEFF">
+<TD COLSPAN=3><FONT SIZE="+2">
+<B>Properties Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white">
+<td align="right" valign="top" width="1%">
+<FONT SIZE="-1">
+String
+</FONT></TD>
+<TD><B>DummyCart:items</B>
+<BR>
+ </TD>
+<td width="1%">
+<FONT SIZE="-1">
+Multi
+</FONT></TD>
+</TABLE>
+<HR>
+</BODY>
+</HTML>
diff --git a/web/tomcat/webapps/examples/jsp/sessions/carts.html b/web/tomcat/webapps/examples/jsp/sessions/carts.html
new file mode 100644
index 0000000..834ee0a
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/sessions/carts.html
@@ -0,0 +1,53 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<head>
+ <title>carts</title>
+</head>
+
+ <body bgcolor="white">
+<font size = 5 color="#CC0000">
+
+<form type=POST action=carts.jsp>
+<BR>
+Please enter item to add or remove:
+<br>
+Add Item:
+
+<SELECT NAME="item">
+<OPTION>Beavis & Butt-head Video collection
+<OPTION>X-files movie
+<OPTION>Twin peaks tapes
+<OPTION>NIN CD
+<OPTION>JSP Book
+<OPTION>Concert tickets
+<OPTION>Love life
+<OPTION>Switch blade
+<OPTION>Rex, Rugs & Rock n' Roll
+</SELECT>
+
+
+<br> <br>
+<INPUT TYPE=submit name="submit" value="add">
+<INPUT TYPE=submit name="submit" value="remove">
+
+</form>
+
+</FONT>
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/sessions/carts.jsp b/web/tomcat/webapps/examples/jsp/sessions/carts.jsp
new file mode 100644
index 0000000..dc51495
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/sessions/carts.jsp
@@ -0,0 +1,43 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<jsp:useBean id="cart" scope="session" class="sessions.DummyCart" />
+
+<jsp:setProperty name="cart" property="*" />
+<%
+ cart.processRequest();
+%>
+
+
+<FONT size = 5 COLOR="#CC0000">
+<br> You have the following items in your cart:
+<ol>
+<%
+ String[] items = cart.getItems();
+ for (String item : items) {
+%>
+<li> <% out.print(util.HTMLFilter.filter(item)); %>
+<%
+ }
+%>
+</ol>
+
+</FONT>
+
+<hr>
+<%@ include file ="carts.html" %>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/sessions/carts.jsp.html b/web/tomcat/webapps/examples/jsp/sessions/carts.jsp.html
new file mode 100644
index 0000000..8acde4e
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/sessions/carts.jsp.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<jsp:useBean id="cart" scope="session" class="sessions.DummyCart" />
+
+<jsp:setProperty name="cart" property="*" />
+<%
+ cart.processRequest();
+%>
+
+
+<FONT size = 5 COLOR="#CC0000">
+<br> You have the following items in your cart:
+<ol>
+<%
+ String[] items = cart.getItems();
+ for (String item : items) {
+%>
+<li> <% out.print(util.HTMLFilter.filter(item)); %>
+<%
+ }
+%>
+</ol>
+
+</FONT>
+
+<hr>
+<%@ include file ="carts.html" %>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/sessions/crt.html b/web/tomcat/webapps/examples/jsp/sessions/crt.html
new file mode 100644
index 0000000..11e6eda
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/sessions/crt.html
@@ -0,0 +1,34 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="carts.html"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="carts.jsp.html">Source Code for Cart Example<font color="#0000FF"></a>
+ </font> </h3>
+
+<h3><a href="DummyCart.html">Property Sheet for DummyCart
+<font color="#0000FF"></a> </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/simpletag/foo.html b/web/tomcat/webapps/examples/jsp/simpletag/foo.html
new file mode 100644
index 0000000..e20f840
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/simpletag/foo.html
@@ -0,0 +1,30 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="foo.jsp"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="foo.jsp.html">Source Code for the Simple Tag Example<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/simpletag/foo.jsp b/web/tomcat/webapps/examples/jsp/simpletag/foo.jsp
new file mode 100644
index 0000000..2489146
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/simpletag/foo.jsp
@@ -0,0 +1,38 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<body>
+<%@ taglib uri="http://tomcat.apache.org/example-taglib" prefix="eg"%>
+
+Radio stations that rock:
+
+<ul>
+<eg:foo att1="98.5" att2="92.3" att3="107.7">
+<li><%= member %></li>
+</eg:foo>
+</ul>
+
+<eg:log>
+Did you see me on the stderr window?
+</eg:log>
+
+<eg:log toBrowser="true">
+Did you see me on the browser window as well?
+</eg:log>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/simpletag/foo.jsp.html b/web/tomcat/webapps/examples/jsp/simpletag/foo.jsp.html
new file mode 100644
index 0000000..02693c8
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/simpletag/foo.jsp.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<body>
+<%@ taglib uri="http://tomcat.apache.org/example-taglib" prefix="eg"%>
+
+Radio stations that rock:
+
+<ul>
+<eg:foo att1="98.5" att2="92.3" att3="107.7">
+<li><%= member %></li>
+</eg:foo>
+</ul>
+
+<eg:log>
+Did you see me on the stderr window?
+</eg:log>
+
+<eg:log toBrowser="true">
+Did you see me on the browser window as well?
+</eg:log>
+
+</body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/snp/snoop.html b/web/tomcat/webapps/examples/jsp/snp/snoop.html
new file mode 100644
index 0000000..e48355b
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/snp/snoop.html
@@ -0,0 +1,31 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="snoop.jsp"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="snoop.jsp.html">Source Code for Request Parameters Example<font color="#0000FF">
+ </font></a></h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/snp/snoop.jsp b/web/tomcat/webapps/examples/jsp/snp/snoop.jsp
new file mode 100644
index 0000000..9bb57a8
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/snp/snoop.jsp
@@ -0,0 +1,56 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<body bgcolor="white">
+<h1> Request Information </h1>
+<font size="4">
+JSP Request Method: <%= util.HTMLFilter.filter(request.getMethod()) %>
+<br>
+Request URI: <%= util.HTMLFilter.filter(request.getRequestURI()) %>
+<br>
+Request Protocol: <%= util.HTMLFilter.filter(request.getProtocol()) %>
+<br>
+Servlet path: <%= util.HTMLFilter.filter(request.getServletPath()) %>
+<br>
+Path info: <%= util.HTMLFilter.filter(request.getPathInfo()) %>
+<br>
+Query string: <%= util.HTMLFilter.filter(request.getQueryString()) %>
+<br>
+Content length: <%= request.getContentLength() %>
+<br>
+Content type: <%= util.HTMLFilter.filter(request.getContentType()) %>
+<br>
+Server name: <%= util.HTMLFilter.filter(request.getServerName()) %>
+<br>
+Server port: <%= request.getServerPort() %>
+<br>
+Remote user: <%= util.HTMLFilter.filter(request.getRemoteUser()) %>
+<br>
+Remote address: <%= util.HTMLFilter.filter(request.getRemoteAddr()) %>
+<br>
+Remote host: <%= util.HTMLFilter.filter(request.getRemoteHost()) %>
+<br>
+Authorization scheme: <%= util.HTMLFilter.filter(request.getAuthType()) %>
+<br>
+Locale: <%= request.getLocale() %>
+<hr>
+The browser you are using is
+<%= util.HTMLFilter.filter(request.getHeader("User-Agent")) %>
+<hr>
+</font>
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/snp/snoop.jsp.html b/web/tomcat/webapps/examples/jsp/snp/snoop.jsp.html
new file mode 100644
index 0000000..00bf89b
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/snp/snoop.jsp.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+<body bgcolor="white">
+<h1> Request Information </h1>
+<font size="4">
+JSP Request Method: <%= util.HTMLFilter.filter(request.getMethod()) %>
+<br>
+Request URI: <%= util.HTMLFilter.filter(request.getRequestURI()) %>
+<br>
+Request Protocol: <%= util.HTMLFilter.filter(request.getProtocol()) %>
+<br>
+Servlet path: <%= util.HTMLFilter.filter(request.getServletPath()) %>
+<br>
+Path info: <%= util.HTMLFilter.filter(request.getPathInfo()) %>
+<br>
+Query string: <%= util.HTMLFilter.filter(request.getQueryString()) %>
+<br>
+Content length: <%= request.getContentLength() %>
+<br>
+Content type: <%= util.HTMLFilter.filter(request.getContentType()) %>
+<br>
+Server name: <%= util.HTMLFilter.filter(request.getServerName()) %>
+<br>
+Server port: <%= request.getServerPort() %>
+<br>
+Remote user: <%= util.HTMLFilter.filter(request.getRemoteUser()) %>
+<br>
+Remote address: <%= util.HTMLFilter.filter(request.getRemoteAddr()) %>
+<br>
+Remote host: <%= util.HTMLFilter.filter(request.getRemoteHost()) %>
+<br>
+Authorization scheme: <%= util.HTMLFilter.filter(request.getAuthType()) %>
+<br>
+Locale: <%= request.getLocale() %>
+<hr>
+The browser you are using is
+<%= util.HTMLFilter.filter(request.getHeader("User-Agent")) %>
+<hr>
+</font>
+</body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/tagplugin/choose.html b/web/tomcat/webapps/examples/jsp/tagplugin/choose.html
new file mode 100644
index 0000000..afe90b2
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/tagplugin/choose.html
@@ -0,0 +1,36 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+<head>
+<title>View Source Code</title>
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF">
+ <a href="choose.jsp">
+ <img src="../images/execute.gif" align="right" border="0"></a>
+ <a href="../index.html">
+ <img src="../images/return.gif" width="24" height="24" align="right" border="0">
+ </a></font>
+</p>
+
+<h3>
+ <a href="choose.jsp.html">Source Code for choose.jsp<font color="#0000FF"/></a>
+</h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/tagplugin/choose.jsp b/web/tomcat/webapps/examples/jsp/tagplugin/choose.jsp
new file mode 100644
index 0000000..745e5f5
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/tagplugin/choose.jsp
@@ -0,0 +1,54 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+ <head>
+ <title>Tag Examples - choose</title>
+ </head>
+ <body>
+ <h1>Tag Plugin Examples - <c:choose></h1>
+
+ <hr/>
+ <br/>
+ <a href="notes.html">Plugin Introductory Notes</a>
+ <br/>
+ <a href="howto.html">Brief Instructions for Writing Plugins</a>
+ <br/> <br/>
+ <hr/>
+
+ <br/>
+
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+ <c:forEach var="index" begin="0" end="4">
+ # ${index}:
+ <c:choose>
+ <c:when test="${index == 1}">
+ One!<br/>
+ </c:when>
+ <c:when test="${index == 4}">
+ Four!<br/>
+ </c:when>
+ <c:when test="${index == 3}">
+ Three!<br/>
+ </c:when>
+ <c:otherwise>
+ Huh?<br/>
+ </c:otherwise>
+ </c:choose>
+ </c:forEach>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/tagplugin/choose.jsp.html b/web/tomcat/webapps/examples/jsp/tagplugin/choose.jsp.html
new file mode 100644
index 0000000..3f3b7e4
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/tagplugin/choose.jsp.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+ <head>
+ <title>Tag Examples - choose</title>
+ </head>
+ <body>
+ <h1>Tag Plugin Examples - &lt;c:choose></h1>
+
+ <hr/>
+ <br/>
+ <a href="notes.html">Plugin Introductory Notes</a>
+ <br/>
+ <a href="howto.html">Brief Instructions for Writing Plugins</a>
+ <br/> <br/>
+ <hr/>
+
+ <br/>
+
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+ <c:forEach var="index" begin="0" end="4">
+ # ${index}:
+ <c:choose>
+ <c:when test="${index == 1}">
+ One!<br/>
+ </c:when>
+ <c:when test="${index == 4}">
+ Four!<br/>
+ </c:when>
+ <c:when test="${index == 3}">
+ Three!<br/>
+ </c:when>
+ <c:otherwise>
+ Huh?<br/>
+ </c:otherwise>
+ </c:choose>
+ </c:forEach>
+ </body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/tagplugin/foreach.html b/web/tomcat/webapps/examples/jsp/tagplugin/foreach.html
new file mode 100644
index 0000000..3d2e608
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/tagplugin/foreach.html
@@ -0,0 +1,36 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+<head>
+<title>View Source Code</title>
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF">
+ <a href="foreach.jsp">
+ <img src="../images/execute.gif" align="right" border="0"></a>
+ <a href="../index.html">
+ <img src="../images/return.gif" width="24" height="24" align="right" border="0">
+ </a></font>
+</p>
+
+<h3>
+ <a href="foreach.jsp.html">Source Code for foreach.jsp<font color="#0000FF"/></a>
+</h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/tagplugin/foreach.jsp b/web/tomcat/webapps/examples/jsp/tagplugin/foreach.jsp
new file mode 100644
index 0000000..4803506
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/tagplugin/foreach.jsp
@@ -0,0 +1,54 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+ <head>
+ <title>Tag Plugin Examples: forEach</title>
+ </head>
+ <body>
+ <h1>Tag Plugin Examples - <c:forEach></h1>
+
+ <hr/>
+ <br/>
+ <a href="notes.html">Plugin Introductory Notes</a>
+ <br/>
+ <a href="howto.html">Brief Instructions for Writing Plugins</a>
+ <br/> <br/>
+ <hr/>
+
+ <br/>
+
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+ <%@ page import="java.util.Vector" %>
+
+ <h3>Iterating over a range</h3>
+ <c:forEach var="item" begin="1" end="10">
+ ${item}
+ </c:forEach>
+
+ <% Vector<String> v = new Vector<>();
+ v.add("One"); v.add("Two"); v.add("Three"); v.add("Four");
+
+ pageContext.setAttribute("vector", v);
+ %>
+
+ <h3>Iterating over a Vector</h3>
+
+ <c:forEach items="${vector}" var="item" >
+ ${item}
+ </c:forEach>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/tagplugin/foreach.jsp.html b/web/tomcat/webapps/examples/jsp/tagplugin/foreach.jsp.html
new file mode 100644
index 0000000..5d229d7
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/tagplugin/foreach.jsp.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+ <head>
+ <title>Tag Plugin Examples: forEach</title>
+ </head>
+ <body>
+ <h1>Tag Plugin Examples - &lt;c:forEach></h1>
+
+ <hr/>
+ <br/>
+ <a href="notes.html">Plugin Introductory Notes</a>
+ <br/>
+ <a href="howto.html">Brief Instructions for Writing Plugins</a>
+ <br/> <br/>
+ <hr/>
+
+ <br/>
+
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+ <%@ page import="java.util.Vector" %>
+
+ <h3>Iterating over a range</h3>
+ <c:forEach var="item" begin="1" end="10">
+ ${item}
+ </c:forEach>
+
+ <% Vector<String> v = new Vector<>();
+ v.add("One"); v.add("Two"); v.add("Three"); v.add("Four");
+
+ pageContext.setAttribute("vector", v);
+ %>
+
+ <h3>Iterating over a Vector</h3>
+
+ <c:forEach items="${vector}" var="item" >
+ ${item}
+ </c:forEach>
+ </body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/tagplugin/howto.html b/web/tomcat/webapps/examples/jsp/tagplugin/howto.html
new file mode 100644
index 0000000..5f1d223
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/tagplugin/howto.html
@@ -0,0 +1,45 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+ <head>
+ <title>Tag Plugin Implementation</title>
+ </head>
+ <body>
+ <h2>How to write tag plugins</h2>
+ <p>
+ To write a plugin, you'll need to download the source for Tomcat.
+ There are two steps:
+ <ol>
+ <li>
+ Implement the plugin class.<p/>
+ This class, which implements
+ <tt>org.apache.jasper.compiler.tagplugin.TagPlugin</tt>
+ instructs Jasper what Java codes to generate in place of the tag
+ handler calls.
+ See Javadoc for <tt>org.apache.jasper.compiler.tagplugin.TagPlugin</tt>
+ for details.
+ </li>
+
+ <li>
+ Create the plugin descriptor file <tt> WEB-INF/tagPlugins.xml</tt><p/>
+ This file
+ specifies the plugin classes and their corresponding tag handler
+ classes.
+ </li>
+ </ol>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/tagplugin/if.html b/web/tomcat/webapps/examples/jsp/tagplugin/if.html
new file mode 100644
index 0000000..b04ac59
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/tagplugin/if.html
@@ -0,0 +1,36 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+<head>
+<title>View Source Code</title>
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF">
+ <a href="if.jsp">
+ <img src="../images/execute.gif" align="right" border="0"></a>
+ <a href="../index.html">
+ <img src="../images/return.gif" width="24" height="24" align="right" border="0">
+ </a></font>
+</p>
+
+<h3>
+ <a href="if.jsp.html">Source Code for if.jsp<font color="#0000FF"/></a>
+</h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/tagplugin/if.jsp b/web/tomcat/webapps/examples/jsp/tagplugin/if.jsp
new file mode 100644
index 0000000..af627bf
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/tagplugin/if.jsp
@@ -0,0 +1,47 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+ <head>
+ <title>Tag Plugin Examples: if</title>
+ </head>
+ <body>
+ <h1>Tag Plugin Examples - <c:if></h1>
+
+ <hr/>
+ <br/>
+ <a href="notes.html">Plugin Introductory Notes</a>
+ <br/>
+ <a href="howto.html">Brief Instructions for Writing Plugins</a>
+ <br/> <br/>
+ <hr/>
+
+ <br/>
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+ <h3>Set the test result to a variable</h3>
+ <c:if test="${1==1}" var="theTruth" scope="page"/>
+ The result of testing for (1==1) is: ${theTruth}
+
+ <h3>Conditionally execute the body</h3>
+ <c:if test="${2>0}">
+ <p>It's true that (2>0)! Working.</p>
+ </c:if>
+ <c:if test="${0>2}">
+ <p>It's not true that (0>2)! Failed.</p>
+ </c:if>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/tagplugin/if.jsp.html b/web/tomcat/webapps/examples/jsp/tagplugin/if.jsp.html
new file mode 100644
index 0000000..ee126c3
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/tagplugin/if.jsp.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<html>
+ <head>
+ <title>Tag Plugin Examples: if</title>
+ </head>
+ <body>
+ <h1>Tag Plugin Examples - &lt;c:if></h1>
+
+ <hr/>
+ <br/>
+ <a href="notes.html">Plugin Introductory Notes</a>
+ <br/>
+ <a href="howto.html">Brief Instructions for Writing Plugins</a>
+ <br/> <br/>
+ <hr/>
+
+ <br/>
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+ <h3>Set the test result to a variable</h3>
+ <c:if test="${1==1}" var="theTruth" scope="page"/>
+ The result of testing for (1==1) is: ${theTruth}
+
+ <h3>Conditionally execute the body</h3>
+ <c:if test="${2>0}">
+ <p>It's true that (2>0)! Working.</p>
+ </c:if>
+ <c:if test="${0>2}">
+ <p>It's not true that (0>2)! Failed.</p>
+ </c:if>
+ </body>
+</html>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/jsp/tagplugin/notes.html b/web/tomcat/webapps/examples/jsp/tagplugin/notes.html
new file mode 100644
index 0000000..cd326fc
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/tagplugin/notes.html
@@ -0,0 +1,41 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+ <head>
+ <title>Tag Plugin Introduction</title>
+ </head>
+ <body>
+ <h2>Tag Plugins: Introductory Notes</h2>
+ <p>
+ Tomcat provides a framework for implementing tag plugins. The
+ plugins instruct Jasper, at translation time, to replace tag handler
+ calls with Java scriptlets.
+ The framework allows tag library authors to implement plugins for
+ their tags.
+ </p>
+ <p>
+ Tomcat is released with plugins for several JSTL tags. Note
+ that these plugins work with JSTL 1.1 as well as JSTL 1.0, though
+ the examples uses JSTL 1.1 and JSP 2.0.
+ These plugins are not complete (for instance, some item types are not
+ handled in <c:if>).
+ They do serve as examples to show plugins in action (just
+ examine the generated Java files), and how they can be implemented.
+ </p>
+ </body>
+</html>
+
diff --git a/web/tomcat/webapps/examples/jsp/xml/xml.html b/web/tomcat/webapps/examples/jsp/xml/xml.html
new file mode 100644
index 0000000..0012142
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/xml/xml.html
@@ -0,0 +1,31 @@
+<html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="xml.jsp"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+
+<h3><a href="xml.jsp.html">Source Code for XML syntax Example<font color="#0000FF"></a>
+ </font> </h3>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/jsp/xml/xml.jsp b/web/tomcat/webapps/examples/jsp/xml/xml.jsp
new file mode 100644
index 0000000..840b21f
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/xml/xml.jsp
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
+ version="1.2">
+<jsp:directive.page contentType="text/html"/>
+<jsp:directive.page import="java.util.Date, java.util.Locale"/>
+<jsp:directive.page import="java.text.*"/>
+
+<jsp:declaration>
+ String getDateTimeStr(Locale l) {
+ DateFormat df = SimpleDateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, l);
+ return df.format(new Date());
+ }
+</jsp:declaration>
+
+<html>
+<head>
+ <title>Example JSP in XML format</title>
+</head>
+
+<body>
+This is the output of a simple JSP using XML format.
+<br />
+
+<div>Use a jsp:scriptlet to loop from 1 to 10: </div>
+<jsp:scriptlet>
+// Note we need to declare CDATA because we don't escape the less than symbol
+<![CDATA[
+ for (int i = 1; i<=10; i++) {
+ out.println(i);
+ if (i < 10) {
+ out.println(", ");
+ }
+ }
+]]>
+</jsp:scriptlet>
+
+<!-- Because I omit br's end tag, declare it as CDATA -->
+<![CDATA[
+ <br><br>
+]]>
+
+<div align="left">
+ Use a jsp:expression to write the date and time in the browser's locale:
+ <jsp:expression>getDateTimeStr(request.getLocale())</jsp:expression>
+</div>
+
+
+<jsp:text>
+ <p>This sentence is enclosed in a jsp:text element.</p>
+</jsp:text>
+
+</body>
+</html>
+</jsp:root>
diff --git a/web/tomcat/webapps/examples/jsp/xml/xml.jsp.html b/web/tomcat/webapps/examples/jsp/xml/xml.jsp.html
new file mode 100644
index 0000000..b146a97
--- /dev/null
+++ b/web/tomcat/webapps/examples/jsp/xml/xml.jsp.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
+ version="1.2">
+<jsp:directive.page contentType="text/html"/>
+<jsp:directive.page import="java.util.Date, java.util.Locale"/>
+<jsp:directive.page import="java.text.*"/>
+
+<jsp:declaration>
+ String getDateTimeStr(Locale l) {
+ DateFormat df = SimpleDateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, l);
+ return df.format(new Date());
+ }
+</jsp:declaration>
+
+<html>
+<head>
+ <title>Example JSP in XML format</title>
+</head>
+
+<body>
+This is the output of a simple JSP using XML format.
+<br />
+
+<div>Use a jsp:scriptlet to loop from 1 to 10: </div>
+<jsp:scriptlet>
+// Note we need to declare CDATA because we don't escape the less than symbol
+<![CDATA[
+ for (int i = 1; i<=10; i++) {
+ out.println(i);
+ if (i < 10) {
+ out.println(", ");
+ }
+ }
+]]>
+</jsp:scriptlet>
+
+<!-- Because I omit br's end tag, declare it as CDATA -->
+<![CDATA[
+ <br><br>
+]]>
+
+<div align="left">
+ Use a jsp:expression to write the date and time in the browser's locale:
+ <jsp:expression>getDateTimeStr(request.getLocale())</jsp:expression>
+</div>
+
+
+<jsp:text>
+ &lt;p&gt;This sentence is enclosed in a jsp:text element.&lt;/p&gt;
+</jsp:text>
+
+</body>
+</html>
+</jsp:root>
+</pre></body></html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/servlets/cookies.html b/web/tomcat/webapps/examples/servlets/cookies.html
new file mode 100644
index 0000000..bacee44
--- /dev/null
+++ b/web/tomcat/webapps/examples/servlets/cookies.html
@@ -0,0 +1,61 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="servlet/CookieExample"><img src="images/execute.gif" align="right" border="0"></a><a href="index.html"><img src="images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+<h3>Source Code for Cookie Example<font color="#0000FF"><br>
+ </font> </h3>
+<font color="#0000FF"></font>
+<pre><font color="#0000FF">import</font> java.io.*;
+<font color="#0000FF">import</font> javax.servlet.*;
+<font color="#0000FF">import</font> javax.servlet.http.*;
+
+<font color="#0000FF">public class</font> CookieExample <font color="#0000FF">extends</font> HttpServlet {
+
+ <font color="#0000FF">public void</font> doGet(HttpServletRequest request, HttpServletResponse response)
+ <font color="#0000FF">throws</font> IOException, ServletException
+ {
+ response.setContentType("<font color="#009900">text/html</font>");
+ PrintWriter out = response.getWriter();
+
+ <font color="#CC0000">// print out cookies</font>
+
+ Cookie[] cookies = request.getCookies();
+ for (int i = 0; i < cookies.length; i++) {
+ Cookie c = cookies[i];
+ String name = c.getName();
+ String value = c.getValue();
+ out.println(name + "<font color="#009900"> = </font>" + value);
+ }
+
+ <font color="#CC0000">// set a cookie</font>
+
+ String name = request.getParameter("<font color="#009900">cookieName</font>");
+ if (name != null && name.length() > 0) {
+ String value = request.getParameter("<font color="#009900">cookieValue</font>");
+ Cookie c = new Cookie(name, value);
+ response.addCookie(c);
+ }
+ }
+}</pre>
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/servlets/helloworld.html b/web/tomcat/webapps/examples/servlets/helloworld.html
new file mode 100644
index 0000000..c223446
--- /dev/null
+++ b/web/tomcat/webapps/examples/servlets/helloworld.html
@@ -0,0 +1,50 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="servlet/HelloWorldExample"><img src="images/execute.gif" align="right" border="0"></a><a href="index.html"><img src="images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+<h3>Source Code for HelloWorld Example<font color="#0000FF"><br>
+ </font> </h3>
+<font color="#0000FF"></font>
+<pre><font color="#0000FF">import</font> java.io.*;
+<font color="#0000FF">import</font> javax.servlet.*;
+<font color="#0000FF">import</font> javax.servlet.http.*;
+
+<font color="#0000FF">public class</font> HelloWorld <font color="#0000FF">extends</font> HttpServlet {
+
+ <font color="#0000FF">public void</font> doGet(HttpServletRequest request, HttpServletResponse response)
+ <font color="#0000FF">throws</font> IOException, ServletException
+ {
+ response.setContentType("<font color="#009900">text/html</font>");
+ PrintWriter out = response.getWriter();
+ out.println("<font color="#009900"><html></font>");
+ out.println("<font color="#009900"><head></font>");
+ out.println("<font color="#009900"><title>Hello World!</title></font>");
+ out.println("<font color="#009900"></head></font>");
+ out.println("<font color="#009900"><body></font>");
+ out.println("<font color="#009900"><h1>Hello World!</h1></font>");
+ out.println("<font color="#009900"></body></font>");
+ out.println("<font color="#009900"></html></font>");
+ }
+}</pre>
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/servlets/images/code.gif b/web/tomcat/webapps/examples/servlets/images/code.gif
new file mode 100644
index 0000000..93af2cd
--- /dev/null
+++ b/web/tomcat/webapps/examples/servlets/images/code.gif
Binary files differ
diff --git a/web/tomcat/webapps/examples/servlets/images/execute.gif b/web/tomcat/webapps/examples/servlets/images/execute.gif
new file mode 100644
index 0000000..f64d70f
--- /dev/null
+++ b/web/tomcat/webapps/examples/servlets/images/execute.gif
Binary files differ
diff --git a/web/tomcat/webapps/examples/servlets/images/return.gif b/web/tomcat/webapps/examples/servlets/images/return.gif
new file mode 100644
index 0000000..af4f68f
--- /dev/null
+++ b/web/tomcat/webapps/examples/servlets/images/return.gif
Binary files differ
diff --git a/web/tomcat/webapps/examples/servlets/index.html b/web/tomcat/webapps/examples/servlets/index.html
new file mode 100644
index 0000000..94931d4
--- /dev/null
+++ b/web/tomcat/webapps/examples/servlets/index.html
@@ -0,0 +1,171 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!DOCTYPE html><html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta name="Author" content="Anil K. Vijendran" />
+ <title>Servlet Examples</title>
+ <style type="text/css">
+ img { border: 0; }
+ th { text-align: left; }
+ tr { vertical-align: top; }
+ </style>
+</head>
+<body>
+<h1>Servlet
+Examples with Code</h1>
+<p>This is a collection of examples which demonstrate some of the more
+frequently used parts of the Servlet API. Familiarity with the Java(tm)
+Programming Language is assumed.
+<p>These examples will only work when viewed via an http URL. They will
+not work if you are viewing these pages via a "file://..." URL. Please
+refer to the <i>README</i> file provide with this Tomcat release regarding
+how to configure and start the provided web server.
+<p>Wherever you see a form, enter some data and see how the servlet reacts.
+When playing with the Cookie and Session Examples, jump back to the Headers
+Example to see exactly what your browser is sending the server.
+<p>To navigate your way through the examples, the following icons will
+help:</p>
+<ul style="list-style-type: none; padding-left: 0;">
+<li><img src="images/execute.gif" alt=""> Execute the example</li>
+<li><img src="images/code.gif" alt=""> Look at the source code for the example</li>
+<li><img src="images/return.gif" alt=""> Return to this screen</li>
+</ul>
+
+<p>Tip: To see the cookie interactions with your browser, try turning on
+the "notify when setting a cookie" option in your browser preferences.
+This will let you see when a session is created and give some feedback
+when looking at the cookie demo.</p>
+<table style="width: 85%;" >
+<tr>
+<td>Hello World</td>
+
+<td style="width: 30%;"><a href="servlet/HelloWorldExample"><img SRC="images/execute.gif" alt=""></a><a href="servlet/HelloWorldExample">Execute</a></td>
+
+<td style="width: 30%;"><a href="helloworld.html"><img SRC="images/code.gif" alt=""></a><a href="helloworld.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Request Info</td>
+
+<td style="width: 30%;"><a href="servlet/RequestInfoExample"><img SRC="images/execute.gif" alt=""></a><a href="servlet/RequestInfoExample">Execute</a></td>
+
+<td style="width: 30%;"><a href="reqinfo.html"><img SRC="images/code.gif" alt=""></a><a href="reqinfo.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Request Headers</td>
+
+<td style="width: 30%;"><a href="servlet/RequestHeaderExample"><img SRC="images/execute.gif" alt=""></a><a href="servlet/RequestHeaderExample">Execute</a></td>
+
+<td style="width: 30%;"><a href="reqheaders.html"><img SRC="images/code.gif" alt=""></a><a href="reqheaders.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Request Parameters</td>
+
+<td style="width: 30%;"><a href="servlet/RequestParamExample"><img SRC="images/execute.gif" alt=""></a><a href="servlet/RequestParamExample">Execute</a></td>
+
+<td style="width: 30%;"><a href="reqparams.html"><img SRC="images/code.gif" alt=""></a><a href="reqparams.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Cookies</td>
+
+<td style="width: 30%;"><a href="servlet/CookieExample"><img SRC="images/execute.gif" alt=""></a><a href="servlet/CookieExample">Execute</a></td>
+
+<td style="width: 30%;"><a href="cookies.html"><img SRC="images/code.gif" alt=""></a><a href="cookies.html">Source</a></td>
+</tr>
+
+<tr>
+<td>Sessions</td>
+
+<td style="width: 30%;"><a href="servlet/SessionExample"><img SRC="images/execute.gif" alt=""></a><a href="servlet/SessionExample">Execute</a></td>
+
+<td style="width: 30%;"><a href="sessions.html"><img SRC="images/code.gif" alt=""></a><a href="sessions.html">Source</a></td>
+</tr>
+</table>
+
+<p>Note: The source code for these examples does not contain all of the
+source code that is actually in the example, only the important sections
+of code. Code not important to understand the example has been removed
+for clarity.</p>
+
+<h2>Other Examples</h2>
+<table style="width: 85%;" >
+
+<tr>
+ <th colspan="3">Servlet 3.0 Asynchronous processing examples:</th>
+</tr>
+<tr>
+ <td>async0</td>
+ <td style="width: 30%;">
+ <a href="../async/async0"><img SRC="images/execute.gif" alt=""> Execute</a>
+ </td>
+ <td style="width: 30%;"></td>
+</tr>
+<tr>
+ <td>async1</td>
+ <td style="width: 30%;">
+ <a href="../async/async1"><img SRC="images/execute.gif" alt=""> Execute</a>
+ </td>
+ <td style="width: 30%;"></td>
+</tr>
+<tr>
+ <td>async2</td>
+ <td style="width: 30%;">
+ <a href="../async/async2"><img SRC="images/execute.gif" alt=""> Execute</a>
+ </td>
+ <td style="width: 30%;"></td>
+</tr>
+<tr>
+ <td>async3</td>
+ <td style="width: 30%;">
+ <a href="../async/async3"><img SRC="images/execute.gif" alt=""> Execute</a>
+ </td>
+ <td style="width: 30%;"></td>
+</tr>
+<tr>
+ <td>stockticker</td>
+ <td style="width: 30%;">
+ <a href="../async/stockticker"><img SRC="images/execute.gif" alt=""> Execute</a>
+ </td>
+ <td style="width: 30%;"></td>
+</tr>
+
+<tr>
+ <th colspan="3">Servlet 3.1 Non-blocking IO examples</th>
+</tr>
+<tr>
+ <td>Byte counter</td>
+ <td style="width: 30%;">
+ <a href="nonblocking/bytecounter.html"><img src="images/execute.gif" alt=""> Execute</a>
+ </td>
+ <td style="width: 30%;"></td>
+</tr>
+<tr>
+ <td>Number Writer</td>
+ <td style="width: 30%;">
+ <a href="nonblocking/numberwriter"><img src="images/execute.gif" alt=""> Execute</a>
+ </td>
+ <td style="width: 30%;"></td>
+</tr>
+
+</table>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/servlets/nonblocking/bytecounter.html b/web/tomcat/webapps/examples/servlets/nonblocking/bytecounter.html
new file mode 100644
index 0000000..55d31a2
--- /dev/null
+++ b/web/tomcat/webapps/examples/servlets/nonblocking/bytecounter.html
@@ -0,0 +1,32 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+ <head>
+ <title>Servlet 3.1 non-blocking IO examples: Byte counter</title>
+ </head>
+ <body>
+ <h1>Byte counter</h1>
+ <p>Select a file and/or enter some data using the form below and then submit
+ it. The server will read the request body using non-blocking IO and then
+ respond with the total length of the request body in bytes.</p>
+ <form method="POST" enctype="multipart/form-data" action="bytecounter" >
+ <p><textarea name="data" rows="5" cols="60" ></textarea></p>
+ <p><input name="source" type="file" /></p>
+ <p><input type="submit" value="Submit" /></p>
+ </form>
+ </body>
+</html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/servlets/reqheaders.html b/web/tomcat/webapps/examples/servlets/reqheaders.html
new file mode 100644
index 0000000..adda30c
--- /dev/null
+++ b/web/tomcat/webapps/examples/servlets/reqheaders.html
@@ -0,0 +1,49 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="servlet/RequestHeaderExample"><img src="images/execute.gif" align="right" border="0"></a><a href="index.html"><img src="images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+<h3>Source Code for RequestHeader Example<font color="#0000FF"><br>
+ </font> </h3>
+<font color="#0000FF"></font>
+<pre><font color="#0000FF">import</font> java.io.*;
+<font color="#0000FF">import</font> java.util.*;
+<font color="#0000FF">import</font> javax.servlet.*;
+<font color="#0000FF">import</font> javax.servlet.http.*;
+
+<font color="#0000FF">public class</font> RequestHeaderExample <font color="#0000FF">extends</font> HttpServlet {
+
+ <font color="#0000FF">public void</font> doGet(HttpServletRequest request, HttpServletResponse response)
+ <font color="#0000FF">throws</font> IOException, ServletException
+ {
+ response.setContentType("<font color="#009900">text/html</font>");
+ PrintWriter out = response.getWriter();
+ Enumeration e = request.getHeaderNames();
+ while (e.hasMoreElements()) {
+ String name = (String)e.nextElement();
+ String value = request.getHeader(name);
+ out.println(name + "<font color="#009900"> = </font>" + value);
+ }
+ }
+}</pre>
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/servlets/reqinfo.html b/web/tomcat/webapps/examples/servlets/reqinfo.html
new file mode 100644
index 0000000..daf239c
--- /dev/null
+++ b/web/tomcat/webapps/examples/servlets/reqinfo.html
@@ -0,0 +1,68 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="servlet/RequestInfoExample"><img src="images/execute.gif" align="right" border="0"></a><a href="index.html"><img src="images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+<h3>Source Code for Request Info Example<font color="#0000FF"><br>
+ </font> </h3>
+<font color="#0000FF"></font>
+<pre><font color="#0000FF">import</font> java.io.*;
+<font color="#0000FF">import</font> javax.servlet.*;
+<font color="#0000FF">import</font> javax.servlet.http.*;
+
+<font color="#0000FF">public class</font> RequestInfo <font color="#0000FF">extends</font> HttpServlet {
+
+ <font color="#0000FF">public void</font> doGet(HttpServletRequest request, HttpServletResponse response)
+ <font color="#0000FF">throws</font> IOException, ServletException
+ {
+ response.setContentType("<font color="#009900">text/html</font>");
+ PrintWriter out = response.getWriter();
+ out.println("<font color="#009900"><html></font>");
+ out.println("<font color="#009900"><body></font>");
+ out.println("<font color="#009900"><head></font>");
+ out.println("<font color="#009900"><title>Request Information Example</title></font>");
+ out.println("<font color="#009900"></head></font>");
+ out.println("<font color="#009900"><body></font>");
+ out.println("<font color="#009900"><h3>Request Information Example</h3></font>");
+ out.println("<font color="#009900">Method: </font>" + request.getMethod());
+ out.println("<font color="#009900">Request URI: </font>" + request.getRequestURI());
+ out.println("<font color="#009900">Protocol: </font>" + request.getProtocol());
+ out.println("<font color="#009900">PathInfo: </font>" + request.getPathInfo());
+ out.println("<font color="#009900">Remote Address: </font>" + request.getRemoteAddr());
+ out.println("<font color="#009900"></body></font>");
+ out.println("<font color="#009900"></html></font>");
+ }
+
+<font color="#FF0000"> /**
+ * We are going to perform the same operations for POST requests
+ * as for GET methods, so this method just sends the request to
+ * the doGet method.
+ */</font>
+
+ <font color="#0000FF">public void</font> doPost(HttpServletRequest request, HttpServletResponse response)
+ <font color="#0000FF">throws</font> IOException, ServletException
+ {
+ doGet(request, response);
+ }
+}</pre>
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/servlets/reqparams.html b/web/tomcat/webapps/examples/servlets/reqparams.html
new file mode 100644
index 0000000..4bbb6b3
--- /dev/null
+++ b/web/tomcat/webapps/examples/servlets/reqparams.html
@@ -0,0 +1,82 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="servlet/RequestParamExample"><img src="images/execute.gif" align="right" border="0"></a><a href="index.html"><img src="images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+<h3>Source Code for Request Parameter Example<font color="#0000FF"><br>
+ </font> </h3>
+<font color="#0000FF"></font>
+<pre><font color="#0000FF">import</font> java.io.*;
+<font color="#0000FF">import</font> java.util.*;
+<font color="#0000FF">import</font> javax.servlet.*;
+<font color="#0000FF">import</font> javax.servlet.http.*;
+
+<font color="#0000FF">public class</font> RequestParamExample <font color="#0000FF">extends</font> HttpServlet {
+
+ <font color="#0000FF">public void</font> doGet(HttpServletRequest request, HttpServletResponse response)
+ <font color="#0000FF">throws</font> IOException, ServletException
+ {
+ response.setContentType("<font color="#009900">text/html</font>");
+ PrintWriter out = response.getWriter();
+ out.println("<font color="#009900"><html></font>");
+ out.println("<font color="#009900"><head></font>");
+ out.println("<font color="#009900"><title>Request Parameters Example</title></font>");
+ out.println("<font color="#009900"></head></font>");
+ out.println("<font color="#009900"><body></font>");
+ out.println("<font color="#009900"><h3>Request Parameters Example</h3></font>");
+ out.println("<font color="#009900">Parameters in this request:<br></font>");
+
+ String firstName = request.getParameter("firstname");
+ String lastName = request.getParameter("lastname");
+
+ if (firstName != null || lastName != null) {
+ out.println("<font color="#009900">First Name:</font>");
+ out.println("<font color="#009900"> = </font>" + HTMLFilter.filter(firstName) + "<font color="#009900"><br></font>");
+ out.println("<font color="#009900">Last Name:</font>");
+ out.println("<font color="#009900"> = </font>" + HTMLFilter.filter(lastName));
+ } else {
+ out.println("<font color="#009900">No Parameters, Please enter some</font>");
+ }
+ out.println("<font color="#009900"><P></font>");
+ out.print("<font color="#009900"><form action=\"</font>");
+ out.print("<font color="#009900">RequestParamExample\" </font>");
+ out.println("<font color="#009900">method=POST></font>");
+ out.println("<font color="#009900">First Name:</font>");
+ out.println("<font color="#009900"><input type=text size=20 name=firstname></font>");
+ out.println("<font color="#009900"><br></font>");
+ out.println("<font color="#009900">Last Name:</font>");
+ out.println("<font color="#009900"><input type=text size=20 name=lastname></font>");
+ out.println("<font color="#009900"><br></font>");
+ out.println("<font color="#009900"><input type=submit></font>");
+ out.println("<font color="#009900"></form></font>");
+ out.println("<font color="#009900"></body></font>");
+ out.println("<font color="#009900"></html></font>");
+ }
+
+ <font color="#0000FF">public void</font> doPost(HttpServletRequest request, HttpServletResponse res)
+ <font color="#0000FF">throws</font> IOException, ServletException
+ {
+ doGet(request, response);
+ }
+}</pre>
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/servlets/sessions.html b/web/tomcat/webapps/examples/servlets/sessions.html
new file mode 100644
index 0000000..99816c2
--- /dev/null
+++ b/web/tomcat/webapps/examples/servlets/sessions.html
@@ -0,0 +1,70 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<p><font color="#0000FF"><a href="servlet/SessionExample"><img src="images/execute.gif" align="right" border="0"></a><a href="index.html"><img src="images/return.gif" width="24" height="24" align="right" border="0"></a></font></p>
+<h3>Source Code for Session Example<font color="#0000FF"><br>
+ </font> </h3>
+<font color="#0000FF"></font>
+<pre><font color="#0000FF">import</font> java.io.*;
+<font color="#0000FF">import</font> java.util.*;
+<font color="#0000FF">import</font> javax.servlet.*;
+<font color="#0000FF">import</font> javax.servlet.http.*;
+
+<font color="#0000FF">public class</font> SessionExample <font color="#0000FF">extends</font> HttpServlet {
+
+ <font color="#0000FF">public void</font> doGet(HttpServletRequest request, HttpServletResponse response)
+ <font color="#0000FF">throws</font> IOException, ServletException
+ {
+ response.setContentType("<font color="#009900">text/html</font>");
+ PrintWriter out = response.getWriter();
+
+ HttpSession session = request.getSession(true);
+
+ <font color="#CC0000">// print session info</font>
+
+ Date created = new Date(session.getCreationTime());
+ Date accessed = new Date(session.getLastAccessedTime());
+ out.println("<font color="#009900">ID </font>" + session.getId());
+ out.println("<font color="#009900">Created: </font>" + created);
+ out.println("<font color="#009900">Last Accessed: </font>" + accessed);
+
+ <font color="#CC0000">// set session info if needed</font>
+
+ String dataName = request.getParameter("<font color="#009900">dataName</font>");
+ if (dataName != null && dataName.length() > 0) {
+ String dataValue = request.getParameter("<font color="#009900">dataValue</font>");
+ session.setAttribute(dataName, dataValue);
+ }
+
+ // print session contents
+
+ Enumeration e = session.getAttributeNames();
+ while (e.hasMoreElements()) {
+ String name = (String)e.nextElement();
+ String value = session.getAttribute(name).toString();
+ out.println(name + " <font color="#009900">= </font>" + value);
+ }
+ }
+}</pre>
+</body>
+</html>
diff --git a/web/tomcat/webapps/examples/websocket/chat.xhtml b/web/tomcat/webapps/examples/websocket/chat.xhtml
new file mode 100644
index 0000000..806c172
--- /dev/null
+++ b/web/tomcat/webapps/examples/websocket/chat.xhtml
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+ <title>Apache Tomcat WebSocket Examples: Chat</title>
+ <style type="text/css"><![CDATA[
+ input#chat {
+ width: 410px
+ }
+
+ #console-container {
+ width: 400px;
+ }
+
+ #console {
+ border: 1px solid #CCCCCC;
+ border-right-color: #999999;
+ border-bottom-color: #999999;
+ height: 170px;
+ overflow-y: scroll;
+ padding: 5px;
+ width: 100%;
+ }
+
+ #console p {
+ padding: 0;
+ margin: 0;
+ }
+ ]]></style>
+ <script type="application/javascript"><![CDATA[
+ "use strict";
+
+ var Chat = {};
+
+ Chat.socket = null;
+
+ Chat.connect = (function(host) {
+ if ('WebSocket' in window) {
+ Chat.socket = new WebSocket(host);
+ } else if ('MozWebSocket' in window) {
+ Chat.socket = new MozWebSocket(host);
+ } else {
+ Console.log('Error: WebSocket is not supported by this browser.');
+ return;
+ }
+
+ Chat.socket.onopen = function () {
+ Console.log('Info: WebSocket connection opened.');
+ document.getElementById('chat').onkeydown = function(event) {
+ if (event.keyCode == 13) {
+ Chat.sendMessage();
+ }
+ };
+ };
+
+ Chat.socket.onclose = function () {
+ document.getElementById('chat').onkeydown = null;
+ Console.log('Info: WebSocket closed.');
+ };
+
+ Chat.socket.onmessage = function (message) {
+ Console.log(message.data);
+ };
+ });
+
+ Chat.initialize = function() {
+ if (window.location.protocol == 'http:') {
+ Chat.connect('ws://' + window.location.host + '/examples/websocket/chat');
+ } else {
+ Chat.connect('wss://' + window.location.host + '/examples/websocket/chat');
+ }
+ };
+
+ Chat.sendMessage = (function() {
+ var message = document.getElementById('chat').value;
+ if (message != '') {
+ Chat.socket.send(message);
+ document.getElementById('chat').value = '';
+ }
+ });
+
+ var Console = {};
+
+ Console.log = (function(message) {
+ var console = document.getElementById('console');
+ var p = document.createElement('p');
+ p.style.wordWrap = 'break-word';
+ p.innerHTML = message;
+ console.appendChild(p);
+ while (console.childNodes.length > 25) {
+ console.removeChild(console.firstChild);
+ }
+ console.scrollTop = console.scrollHeight;
+ });
+
+ Chat.initialize();
+
+
+ document.addEventListener("DOMContentLoaded", function() {
+ // Remove elements with "noscript" class - <noscript> is not allowed in XHTML
+ var noscripts = document.getElementsByClassName("noscript");
+ for (var i = 0; i < noscripts.length; i++) {
+ noscripts[i].parentNode.removeChild(noscripts[i]);
+ }
+ }, false);
+
+ ]]></script>
+</head>
+<body>
+<div class="noscript"><h2 style="color: #ff0000">Seems your browser doesn't support JavaScript! Websockets rely on JavaScript being enabled. Please enable
+ JavaScript and reload this page!</h2></div>
+<div>
+ <p>
+ <input type="text" placeholder="type and press enter to chat" id="chat" />
+ </p>
+ <div id="console-container">
+ <div id="console"/>
+ </div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/websocket/drawboard.xhtml b/web/tomcat/webapps/examples/websocket/drawboard.xhtml
new file mode 100644
index 0000000..52df651
--- /dev/null
+++ b/web/tomcat/webapps/examples/websocket/drawboard.xhtml
@@ -0,0 +1,899 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+ <title>Apache Tomcat WebSocket Examples: Drawboard</title>
+ <style type="text/css"><![CDATA[
+
+ body {
+ font-family: Arial, sans-serif;
+ font-size: 11pt;
+ background-color: #eeeeea;
+ padding: 10px;
+ }
+
+ #console-container {
+ float: left;
+ background-color: #fff;
+ width: 250px;
+ }
+
+ #console {
+ font-size: 10pt;
+ height: 600px;
+ overflow-y: scroll;
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+
+ #console p {
+ padding: 0;
+ margin: 0;
+ }
+
+ #drawContainer {
+ float: left;
+ display: none;
+ margin-right: 25px;
+ }
+
+ #drawContainer canvas {
+ display: block;
+ -ms-touch-action: none;
+ touch-action: none; /* Disable touch behaviors, like pan and zoom */
+ cursor: crosshair;
+ }
+
+ #labelContainer {
+ margin-bottom: 15px;
+ }
+
+ #drawContainer, #console-container {
+ box-shadow: 0px 0px 8px 3px #bbb;
+ border: 1px solid #CCCCCC;
+ }
+
+ ]]></style>
+ <script type="application/javascript"><![CDATA[
+ "use strict";
+
+ (function() {
+
+ document.addEventListener("DOMContentLoaded", function() {
+ // Remove elements with "noscript" class - <noscript> is not
+ // allowed in XHTML
+ var noscripts = document.getElementsByClassName("noscript");
+ for (var i = 0; i < noscripts.length; i++) {
+ noscripts[i].parentNode.removeChild(noscripts[i]);
+ }
+
+ // Add script for expand content.
+ var expandElements = document.getElementsByClassName("expand");
+ for (var ixx = 0; ixx < expandElements.length; ixx++) {
+ (function(el) {
+ var expandContent = document.getElementById(el.getAttribute("data-content-id"));
+ expandContent.style.display = "none";
+ var arrow = document.createTextNode("鈼� ");
+ var arrowSpan = document.createElement("span");
+ arrowSpan.appendChild(arrow);
+
+ var link = document.createElement("a");
+ link.setAttribute("href", "#!");
+ while (el.firstChild != null) {
+ link.appendChild(el.removeChild(el.firstChild));
+ }
+ el.appendChild(arrowSpan);
+ el.appendChild(link);
+
+ var textSpan = document.createElement("span");
+ textSpan.setAttribute("style", "font-weight: normal;");
+ textSpan.appendChild(document.createTextNode(" (click to expand)"));
+ el.appendChild(textSpan);
+
+
+ var visible = true;
+
+ var switchExpand = function() {
+ visible = !visible;
+ expandContent.style.display = visible ? "block" : "none";
+ arrowSpan.style.color = visible ? "#000" : "#888";
+ return false;
+ };
+
+ link.onclick = switchExpand;
+ switchExpand();
+
+ })(expandElements[ixx]);
+ }
+
+
+ var Console = {};
+
+ Console.log = (function() {
+ var consoleContainer =
+ document.getElementById("console-container");
+ var console = document.createElement("div");
+ console.setAttribute("id", "console");
+ consoleContainer.appendChild(console);
+
+ return function(message) {
+ var p = document.createElement('p');
+ p.style.wordWrap = "break-word";
+ p.appendChild(document.createTextNode(message));
+ console.appendChild(p);
+ while (console.childNodes.length > 25) {
+ console.removeChild(console.firstChild);
+ }
+ console.scrollTop = console.scrollHeight;
+ }
+ })();
+
+
+ function Room(drawContainer) {
+
+ /* A pausable event forwarder that can be used to pause and
+ * resume handling of events (e.g. when we need to wait
+ * for a Image's load event before we can process further
+ * WebSocket messages).
+ * The object's callFunction(func) should be called from an
+ * event handler and give the function to handle the event as
+ * argument.
+ * Call pauseProcessing() to suspend event forwarding and
+ * resumeProcessing() to resume it.
+ */
+ function PausableEventForwarder() {
+
+ var pauseProcessing = false;
+ // Queue for buffering functions to be called.
+ var functionQueue = [];
+
+ this.callFunction = function(func) {
+ // If message processing is paused, we push it
+ // into the queue - otherwise we process it directly.
+ if (pauseProcessing) {
+ functionQueue.push(func);
+ } else {
+ func();
+ }
+ };
+
+ this.pauseProcessing = function() {
+ pauseProcessing = true;
+ };
+
+ this.resumeProcessing = function() {
+ pauseProcessing = false;
+
+ // Process all queued functions until some handler calls
+ // pauseProcessing() again.
+ while (functionQueue.length > 0 && !pauseProcessing) {
+ var func = functionQueue.pop();
+ func();
+ }
+ };
+ }
+
+ // The WebSocket object.
+ var socket;
+ // ID of the timer which sends ping messages.
+ var pingTimerId;
+
+ var isStarted = false;
+ var playerCount = 0;
+
+ // An array of PathIdContainer objects that the server
+ // did not yet handle.
+ // They are ordered by id (ascending).
+ var pathsNotHandled = [];
+
+ var nextMsgId = 1;
+
+ var canvasDisplay = document.createElement("canvas");
+ var canvasBackground = document.createElement("canvas");
+ var canvasServerImage = document.createElement("canvas");
+ var canvasArray = [canvasDisplay, canvasBackground,
+ canvasServerImage];
+ canvasDisplay.addEventListener("mousedown", function(e) {
+ // Prevent default mouse event to prevent browsers from marking text
+ // (and Chrome from displaying the "text" cursor).
+ e.preventDefault();
+ }, false);
+
+ var labelPlayerCount = document.createTextNode("0");
+ var optionContainer = document.createElement("div");
+
+
+ var canvasDisplayCtx = canvasDisplay.getContext("2d");
+ var canvasBackgroundCtx = canvasBackground.getContext("2d");
+ var canvasServerImageCtx = canvasServerImage.getContext("2d");
+ var canvasMouseMoveHandler;
+ var canvasMouseDownHandler;
+
+ var isActive = false;
+ var mouseInWindow = false;
+ var mouseDown = false;
+ var currentMouseX = 0, currentMouseY = 0;
+ var currentPreviewPath = null;
+
+ var availableColors = [];
+ var currentColorIndex;
+ var colorContainers;
+ var previewTransparency = 0.65;
+
+ var availableThicknesses = [2, 3, 6, 10, 16, 28, 50];
+ var currentThicknessIndex;
+ var thicknessContainers;
+
+ var availableDrawTypes = [
+ { name: "Brush", id: 1, continuous: true },
+ { name: "Line", id: 2, continuous: false },
+ { name: "Rectangle", id: 3, continuous: false },
+ { name: "Ellipse", id: 4, continuous: false }
+ ];
+ var currentDrawTypeIndex;
+ var drawTypeContainers;
+
+
+ var labelContainer = document.getElementById("labelContainer");
+ var placeholder = document.createElement("div");
+ placeholder.appendChild(document.createTextNode("Loading... "));
+ var progressElem = document.createElement("progress");
+ placeholder.appendChild(progressElem);
+
+ labelContainer.appendChild(placeholder);
+
+ function rgb(color) {
+ return "rgba(" + color[0] + "," + color[1] + ","
+ + color[2] + "," + color[3] + ")";
+ }
+
+ function PathIdContainer(path, id) {
+ this.path = path;
+ this.id = id;
+ }
+
+ function Path(type, color, thickness, x1, y1, x2, y2) {
+ this.type = type;
+ this.color = color;
+ this.thickness = thickness;
+ this.x1 = x1;
+ this.y1 = y1;
+ this.x2 = x2;
+ this.y2 = y2;
+
+ function ellipse(ctx, x, y, w, h) {
+ /* Drawing a ellipse cannot be done directly in a
+ * CanvasRenderingContext2D - we need to use drawArc()
+ * in conjunction with scaling the context so that we
+ * get the needed proportion.
+ */
+ ctx.save();
+
+ // Translate and scale the context so that we can draw
+ // an arc at (0, 0) with a radius of 1.
+ ctx.translate(x + w / 2, y + h / 2);
+ ctx.scale(w / 2, h / 2);
+
+ ctx.beginPath();
+ ctx.arc(0, 0, 1, 0, Math.PI * 2, false);
+
+ ctx.restore();
+ }
+
+ this.draw = function(ctx) {
+ ctx.beginPath();
+ ctx.lineCap = "round";
+ ctx.lineWidth = thickness;
+ var style = rgb(color);
+ ctx.strokeStyle = style;
+
+ if (x1 == x2 && y1 == y2) {
+ // Always draw as arc to meet the behavior
+ // in Java2D.
+ ctx.fillStyle = style;
+ ctx.arc(x1, y1, thickness / 2.0, 0,
+ Math.PI * 2.0, false);
+ ctx.fill();
+ } else {
+ if (type == 1 || type == 2) {
+ // Draw a line.
+ ctx.moveTo(x1, y1);
+ ctx.lineTo(x2, y2);
+ ctx.stroke();
+ } else if (type == 3) {
+ // Draw a rectangle.
+ if (x1 == x2 || y1 == y2) {
+ // Draw as line
+ ctx.moveTo(x1, y1);
+ ctx.lineTo(x2, y2);
+ ctx.stroke();
+ } else {
+ ctx.strokeRect(x1, y1, x2 - x1, y2 - y1);
+ }
+ } else if (type == 4) {
+ // Draw a ellipse.
+ ellipse(ctx, x1, y1, x2 - x1, y2 - y1);
+ ctx.closePath();
+ ctx.stroke();
+ }
+ }
+ };
+ }
+
+
+ function connect() {
+ var host = (window.location.protocol == "https:"
+ ? "wss://" : "ws://") + window.location.host
+ + "/examples/websocket/drawboard";
+ socket = new WebSocket(host);
+
+ /* Use a pausable event forwarder.
+ * This is needed when we load an Image object with data
+ * from a previous message, because we must wait until the
+ * Image's load event it raised before we can use it (and
+ * in the meantime the socket.message event could be
+ * raised).
+ * Therefore we need this pausable event handler to handle
+ * e.g. socket.onmessage and socket.onclose.
+ */
+ var eventForwarder = new PausableEventForwarder();
+
+ socket.onopen = function () {
+ // Socket has opened. Now wait for the server to
+ // send us the initial packet.
+ Console.log("WebSocket connection opened.");
+
+ // Set up a timer for pong messages.
+ pingTimerId = window.setInterval(function() {
+ socket.send("0");
+ }, 30000);
+ };
+
+ socket.onclose = function () {
+ eventForwarder.callFunction(function() {
+ Console.log("WebSocket connection closed.");
+ disableControls();
+
+ // Disable pong timer.
+ window.clearInterval(pingTimerId);
+ });
+ };
+
+ // Handles an incoming Websocket message.
+ var handleOnMessage = function(message) {
+
+ // Split joined message and process them
+ // individually.
+ var messages = message.data.split(";");
+ for (var msgArrIdx = 0; msgArrIdx < messages.length;
+ msgArrIdx++) {
+ var msg = messages[msgArrIdx];
+ var type = msg.substring(0, 1);
+
+ if (type == "0") {
+ // Error message.
+ var error = msg.substring(1);
+ // Log it to the console and show an alert.
+ Console.log("Error: " + error);
+ alert(error);
+
+ } else {
+ if (!isStarted) {
+ if (type == "2") {
+ // Initial message. It contains the
+ // number of players.
+ // After this message we will receive
+ // a binary message containing the current
+ // room image as PNG.
+ playerCount = parseInt(msg.substring(1));
+
+ refreshPlayerCount();
+
+ // The next message will be a binary
+ // message containing the room images
+ // as PNG. Therefore we temporarily swap
+ // the message handler.
+ var originalHandler = handleOnMessage;
+ handleOnMessage = function(message) {
+ // First, we restore the original handler.
+ handleOnMessage = originalHandler;
+
+ // Read the image.
+ var blob = message.data;
+ // Create new blob with correct MIME type.
+ blob = new Blob([blob], {type : "image/png"});
+
+ var url = URL.createObjectURL(blob);
+
+ var img = new Image();
+
+ // We must wait until the onload event is
+ // raised until we can draw the image onto
+ // the canvas.
+ // Therefore we need to pause the event
+ // forwarder until the image is loaded.
+ eventForwarder.pauseProcessing();
+
+ img.onload = function() {
+
+ // Release the object URL.
+ URL.revokeObjectURL(url);
+
+ // Set the canvases to the correct size.
+ for (var i = 0; i < canvasArray.length; i++) {
+ canvasArray[i].width = img.width;
+ canvasArray[i].height = img.height;
+ }
+
+ // Now draw the image on the last canvas.
+ canvasServerImageCtx.clearRect(0, 0,
+ canvasServerImage.width,
+ canvasServerImage.height);
+ canvasServerImageCtx.drawImage(img, 0, 0);
+
+ // Draw it on the background canvas.
+ canvasBackgroundCtx.drawImage(canvasServerImage,
+ 0, 0);
+
+ isStarted = true;
+ startControls();
+
+ // Refresh the display canvas.
+ refreshDisplayCanvas();
+
+
+ // Finally, resume the event forwarder.
+ eventForwarder.resumeProcessing();
+ };
+
+ img.src = url;
+ };
+ }
+ } else {
+ if (type == "3") {
+ // The number of players in this room changed.
+ var playerAdded = msg.substring(1) == "+";
+ playerCount += playerAdded ? 1 : -1;
+ refreshPlayerCount();
+
+ Console.log("Player " + (playerAdded
+ ? "joined." : "left."));
+
+ } else if (type == "1") {
+ // We received a new DrawMessage.
+ var maxLastHandledId = -1;
+ var drawMessages = msg.substring(1).split("|");
+ for (var i = 0; i < drawMessages.length; i++) {
+ var elements = drawMessages[i].split(",");
+ var lastHandledId = parseInt(elements[0]);
+ maxLastHandledId = Math.max(maxLastHandledId,
+ lastHandledId);
+
+ var path = new Path(
+ parseInt(elements[1]),
+ [parseInt(elements[2]),
+ parseInt(elements[3]),
+ parseInt(elements[4]),
+ parseInt(elements[5]) / 255.0],
+ parseFloat(elements[6]),
+ parseFloat(elements[7]),
+ parseFloat(elements[8]),
+ parseFloat(elements[9]),
+ parseFloat(elements[10]));
+
+ // Draw the path onto the last canvas.
+ path.draw(canvasServerImageCtx);
+ }
+
+ // Draw the last canvas onto the background one.
+ canvasBackgroundCtx.drawImage(canvasServerImage,
+ 0, 0);
+
+ // Now go through the pathsNotHandled array and
+ // remove the paths that were already handled by
+ // the server.
+ while (pathsNotHandled.length > 0
+ && pathsNotHandled[0].id <= maxLastHandledId)
+ pathsNotHandled.shift();
+
+ // Now me must draw the remaining paths onto
+ // the background canvas.
+ for (var i = 0; i < pathsNotHandled.length; i++) {
+ pathsNotHandled[i].path.draw(canvasBackgroundCtx);
+ }
+
+ refreshDisplayCanvas();
+ }
+ }
+ }
+ }
+ };
+
+ socket.onmessage = function(message) {
+ eventForwarder.callFunction(function() {
+ handleOnMessage(message);
+ });
+ };
+
+ }
+
+
+ function refreshPlayerCount() {
+ labelPlayerCount.nodeValue = String(playerCount);
+ }
+
+ function refreshDisplayCanvas() {
+ if (!isActive) { // Don't draw a curser when not active.
+ return;
+ }
+
+ canvasDisplayCtx.drawImage(canvasBackground, 0, 0);
+ if (currentPreviewPath != null) {
+ // Draw the preview path.
+ currentPreviewPath.draw(canvasDisplayCtx);
+
+ } else if (mouseInWindow && !mouseDown) {
+ canvasDisplayCtx.beginPath();
+ var color = availableColors[currentColorIndex].slice(0);
+ color[3] = previewTransparency;
+ canvasDisplayCtx.fillStyle = rgb(color);
+
+ canvasDisplayCtx.arc(currentMouseX, currentMouseY,
+ availableThicknesses[currentThicknessIndex] / 2,
+ 0, Math.PI * 2.0, true);
+ canvasDisplayCtx.fill();
+ }
+
+ }
+
+ function startControls() {
+ isActive = true;
+
+ labelContainer.removeChild(placeholder);
+ placeholder = undefined;
+
+ labelContainer.appendChild(
+ document.createTextNode("Number of Players: "));
+ labelContainer.appendChild(labelPlayerCount);
+
+
+ drawContainer.style.display = "block";
+ drawContainer.appendChild(canvasDisplay);
+
+ drawContainer.appendChild(optionContainer);
+
+ canvasMouseDownHandler = function(e) {
+ if (e.button == 0) {
+ currentMouseX = e.pageX - canvasDisplay.offsetLeft;
+ currentMouseY = e.pageY - canvasDisplay.offsetTop;
+
+ mouseDown = true;
+ canvasMouseMoveHandler(e);
+
+ } else if (mouseDown) {
+ // Cancel drawing.
+ mouseDown = false;
+ currentPreviewPath = null;
+
+ currentMouseX = e.pageX - canvasDisplay.offsetLeft;
+ currentMouseY = e.pageY - canvasDisplay.offsetTop;
+
+ refreshDisplayCanvas();
+ }
+ };
+ canvasDisplay.addEventListener("mousedown", canvasMouseDownHandler, false);
+
+ canvasMouseMoveHandler = function(e) {
+ var mouseX = e.pageX - canvasDisplay.offsetLeft;
+ var mouseY = e.pageY - canvasDisplay.offsetTop;
+
+ if (mouseDown) {
+ var drawType = availableDrawTypes[currentDrawTypeIndex];
+
+ if (drawType.continuous) {
+
+ var path = new Path(drawType.id,
+ availableColors[currentColorIndex],
+ availableThicknesses[currentThicknessIndex],
+ currentMouseX, currentMouseY, mouseX,
+ mouseY);
+ // Draw it on the background canvas.
+ path.draw(canvasBackgroundCtx);
+
+ // Send it to the sever.
+ pushPath(path);
+
+ // Refresh old coordinates
+ currentMouseX = mouseX;
+ currentMouseY = mouseY;
+
+ } else {
+ // Create a new preview path.
+ var color = availableColors[currentColorIndex].slice(0);
+ color[3] = previewTransparency;
+ currentPreviewPath = new Path(drawType.id,
+ color,
+ availableThicknesses[currentThicknessIndex],
+ currentMouseX, currentMouseY, mouseX,
+ mouseY, false);
+ }
+
+ refreshDisplayCanvas();
+ } else {
+ currentMouseX = mouseX;
+ currentMouseY = mouseY;
+
+ if (mouseInWindow) {
+ refreshDisplayCanvas();
+ }
+ }
+
+ };
+ document.addEventListener("mousemove", canvasMouseMoveHandler, false);
+
+ document.addEventListener("mouseup", function(e) {
+ if (e.button == 0) {
+ if (mouseDown) {
+ mouseDown = false;
+ currentPreviewPath = null;
+
+ var mouseX = e.pageX - canvasDisplay.offsetLeft;
+ var mouseY = e.pageY - canvasDisplay.offsetTop;
+ var drawType = availableDrawTypes[currentDrawTypeIndex];
+
+ // If we are drawing a continuous path and the previous mouse coordinates are the same as
+ // the new ones, there is no need to construct a new draw message as we don't need to
+ // "terminate" a path as every path element contains both the start and the end point.
+ if (!(drawType.continuous && mouseX == currentMouseX && mouseY == currentMouseY)) {
+ var path = new Path(drawType.id, availableColors[currentColorIndex],
+ availableThicknesses[currentThicknessIndex],
+ currentMouseX, currentMouseY, mouseX,
+ mouseY);
+ // Draw it on the background canvas.
+ path.draw(canvasBackgroundCtx);
+
+ // Send it to the sever.
+ pushPath(path);
+
+ // Refresh old coordinates
+ currentMouseX = mouseX;
+ currentMouseY = mouseY;
+ }
+
+ refreshDisplayCanvas();
+ }
+ }
+ }, false);
+
+ canvasDisplay.addEventListener("mouseout", function(e) {
+ mouseInWindow = false;
+ refreshDisplayCanvas();
+ }, false);
+
+ canvasDisplay.addEventListener("mousemove", function(e) {
+ if (!mouseInWindow) {
+ mouseInWindow = true;
+ refreshDisplayCanvas();
+ }
+ }, false);
+
+
+ // Create color and thickness controls.
+ var colorContainersBox = document.createElement("div");
+ colorContainersBox.setAttribute("style",
+ "margin: 4px; border: 1px solid #bbb; border-radius: 3px;");
+ optionContainer.appendChild(colorContainersBox);
+
+ colorContainers = new Array(3 * 3 * 3);
+ for (var i = 0; i < colorContainers.length; i++) {
+ var colorContainer = colorContainers[i] =
+ document.createElement("div");
+ var color = availableColors[i] =
+ [
+ Math.floor((i % 3) * 255 / 2),
+ Math.floor((Math.floor(i / 3) % 3) * 255 / 2),
+ Math.floor((Math.floor(i / (3 * 3)) % 3) * 255 / 2),
+ 1.0
+ ];
+ colorContainer.setAttribute("style",
+ "margin: 3px; width: 18px; height: 18px; "
+ + "float: left; background-color: " + rgb(color));
+ colorContainer.style.border = '2px solid #000';
+ colorContainer.addEventListener("mousedown", (function(ix) {
+ return function() {
+ setColor(ix);
+ };
+ })(i), false);
+
+ colorContainersBox.appendChild(colorContainer);
+ }
+
+ var divClearLeft = document.createElement("div");
+ divClearLeft.setAttribute("style", "clear: left;");
+ colorContainersBox.appendChild(divClearLeft);
+
+
+ var drawTypeContainersBox = document.createElement("div");
+ drawTypeContainersBox.setAttribute("style",
+ "float: right; margin-right: 3px; margin-top: 1px;");
+ optionContainer.appendChild(drawTypeContainersBox);
+
+ drawTypeContainers = new Array(availableDrawTypes.length);
+ for (var i = 0; i < drawTypeContainers.length; i++) {
+ var drawTypeContainer = drawTypeContainers[i] =
+ document.createElement("div");
+ drawTypeContainer.setAttribute("style",
+ "text-align: center; margin: 3px; padding: 0 3px;"
+ + "height: 18px; float: left;");
+ drawTypeContainer.style.border = "2px solid #000";
+ drawTypeContainer.appendChild(document.createTextNode(
+ String(availableDrawTypes[i].name)));
+ drawTypeContainer.addEventListener("mousedown", (function(ix) {
+ return function() {
+ setDrawType(ix);
+ };
+ })(i), false);
+
+ drawTypeContainersBox.appendChild(drawTypeContainer);
+ }
+
+
+ var thicknessContainersBox = document.createElement("div");
+ thicknessContainersBox.setAttribute("style",
+ "margin: 3px; border: 1px solid #bbb; border-radius: 3px;");
+ optionContainer.appendChild(thicknessContainersBox);
+
+ thicknessContainers = new Array(availableThicknesses.length);
+ for (var i = 0; i < thicknessContainers.length; i++) {
+ var thicknessContainer = thicknessContainers[i] =
+ document.createElement("div");
+ thicknessContainer.setAttribute("style",
+ "text-align: center; margin: 3px; width: 18px; "
+ + "height: 18px; float: left;");
+ thicknessContainer.style.border = "2px solid #000";
+ thicknessContainer.appendChild(document.createTextNode(
+ String(availableThicknesses[i])));
+ thicknessContainer.addEventListener("mousedown", (function(ix) {
+ return function() {
+ setThickness(ix);
+ };
+ })(i), false);
+
+ thicknessContainersBox.appendChild(thicknessContainer);
+ }
+
+
+ divClearLeft = document.createElement("div");
+ divClearLeft.setAttribute("style", "clear: left;");
+ thicknessContainersBox.appendChild(divClearLeft);
+
+
+ setColor(0);
+ setThickness(0);
+ setDrawType(0);
+
+ }
+
+ function disableControls() {
+ document.removeEventListener("mousedown", canvasMouseDownHandler);
+ document.removeEventListener("mousemove", canvasMouseMoveHandler);
+ mouseInWindow = false;
+ refreshDisplayCanvas();
+
+ isActive = false;
+ }
+
+ function pushPath(path) {
+
+ // Push it into the pathsNotHandled array.
+ var container = new PathIdContainer(path, nextMsgId++);
+ pathsNotHandled.push(container);
+
+ // Send the path to the server.
+ var message = container.id + "|" + path.type + ","
+ + path.color[0] + "," + path.color[1] + ","
+ + path.color[2] + ","
+ + Math.round(path.color[3] * 255.0) + ","
+ + path.thickness + "," + path.x1 + ","
+ + path.y1 + "," + path.x2 + "," + path.y2;
+
+ socket.send("1" + message);
+ }
+
+ function setThickness(thicknessIndex) {
+ if (typeof currentThicknessIndex !== "undefined")
+ thicknessContainers[currentThicknessIndex]
+ .style.borderColor = "#000";
+ currentThicknessIndex = thicknessIndex;
+ thicknessContainers[currentThicknessIndex]
+ .style.borderColor = "#d08";
+ }
+
+ function setColor(colorIndex) {
+ if (typeof currentColorIndex !== "undefined")
+ colorContainers[currentColorIndex]
+ .style.borderColor = "#000";
+ currentColorIndex = colorIndex;
+ colorContainers[currentColorIndex]
+ .style.borderColor = "#d08";
+ }
+
+ function setDrawType(drawTypeIndex) {
+ if (typeof currentDrawTypeIndex !== "undefined")
+ drawTypeContainers[currentDrawTypeIndex]
+ .style.borderColor = "#000";
+ currentDrawTypeIndex = drawTypeIndex;
+ drawTypeContainers[currentDrawTypeIndex]
+ .style.borderColor = "#d08";
+ }
+
+
+ connect();
+
+ }
+
+
+ // Initialize the room
+ var room = new Room(document.getElementById("drawContainer"));
+
+
+ }, false);
+
+ })();
+ ]]></script>
+</head>
+<body>
+ <div class="noscript"><div style="color: #ff0000; font-size: 16pt;">Seems your browser doesn't support JavaScript! Websockets rely on JavaScript being enabled. Please enable
+ JavaScript and reload this page!</div></div>
+ <div id="labelContainer"/>
+ <div id="drawContainer"/>
+ <div id="console-container"/>
+ <div style="clear: left;"/>
+
+ <h1 class="expand" data-content-id="expandContent" style="font-size: 1.3em;"
+ >About Drawboard WebSocket Example</h1>
+ <div id="expandContent">
+ <p>
+ This drawboard is a page where you can draw with your mouse or touch input
+ (using different colors) and everybody else which has the page open will
+ <em>immediately</em> see what you are drawing.<br/>
+ If someone opens the page later, they will get the current room image (so they
+ can see what was already drawn by other people).
+ </p>
+ <p>
+ It uses asynchronous sending of messages so that it doesn't need separate threads
+ for each client to send messages.<br/>
+ Each "Room" (where the drawing happens) uses a ReentrantLock to synchronize access
+ (currently, only a single Room is implemented).
+ </p>
+ <p>
+ When you open the page, first you will receive a binary websocket message containing
+ the current room image as PNG image. After that, you will receive string messages
+ that contain the drawing actions (line from x1,y1 to x2,y2).<br/>
+ <small>Note that it currently only uses simple string messages instead of JSON because
+ I did not want to introduce a dependency on a JSON lib.</small>
+ </p>
+ <p>
+ It uses synchronization mechanisms to ensure that the final image will look the same
+ for every user, regardless of what their network latency/speed is 鈥� e.g. if two user
+ draw at the same time on the same place, the server will decide which line was the
+ first one, and that will be reflected on every client.
+ </p>
+ </div>
+</body>
+</html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/websocket/echo.xhtml b/web/tomcat/webapps/examples/websocket/echo.xhtml
new file mode 100644
index 0000000..ac2a732
--- /dev/null
+++ b/web/tomcat/webapps/examples/websocket/echo.xhtml
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+ <title>Apache Tomcat WebSocket Examples: Echo</title>
+ <style type="text/css"><![CDATA[
+ #connect-container {
+ float: left;
+ width: 400px
+ }
+
+ #connect-container div {
+ padding: 5px;
+ }
+
+ #console-container {
+ float: left;
+ margin-left: 15px;
+ width: 400px;
+ }
+
+ #console {
+ border: 1px solid #CCCCCC;
+ border-right-color: #999999;
+ border-bottom-color: #999999;
+ height: 170px;
+ overflow-y: scroll;
+ padding: 5px;
+ width: 100%;
+ }
+
+ #console p {
+ padding: 0;
+ margin: 0;
+ }
+ ]]></style>
+ <script type="application/javascript"><![CDATA[
+ "use strict";
+
+ var ws = null;
+
+ function setConnected(connected) {
+ document.getElementById('connect').disabled = connected;
+ document.getElementById('disconnect').disabled = !connected;
+ document.getElementById('echo').disabled = !connected;
+ }
+
+ function connect() {
+ var target = document.getElementById('target').value;
+ if (target == '') {
+ alert('Please select server side connection implementation.');
+ return;
+ }
+ if ('WebSocket' in window) {
+ ws = new WebSocket(target);
+ } else if ('MozWebSocket' in window) {
+ ws = new MozWebSocket(target);
+ } else {
+ alert('WebSocket is not supported by this browser.');
+ return;
+ }
+ ws.onopen = function () {
+ setConnected(true);
+ log('Info: WebSocket connection opened.');
+ };
+ ws.onmessage = function (event) {
+ log('Received: ' + event.data);
+ };
+ ws.onclose = function (event) {
+ setConnected(false);
+ log('Info: WebSocket connection closed, Code: ' + event.code + (event.reason == "" ? "" : ", Reason: " + event.reason));
+ };
+ }
+
+ function disconnect() {
+ if (ws != null) {
+ ws.close();
+ ws = null;
+ }
+ setConnected(false);
+ }
+
+ function echo() {
+ if (ws != null) {
+ var message = document.getElementById('message').value;
+ log('Sent: ' + message);
+ ws.send(message);
+ } else {
+ alert('WebSocket connection not established, please connect.');
+ }
+ }
+
+ function updateTarget(target) {
+ if (window.location.protocol == 'http:') {
+ document.getElementById('target').value = 'ws://' + window.location.host + target;
+ } else {
+ document.getElementById('target').value = 'wss://' + window.location.host + target;
+ }
+ }
+
+ function log(message) {
+ var console = document.getElementById('console');
+ var p = document.createElement('p');
+ p.style.wordWrap = 'break-word';
+ p.appendChild(document.createTextNode(message));
+ console.appendChild(p);
+ while (console.childNodes.length > 25) {
+ console.removeChild(console.firstChild);
+ }
+ console.scrollTop = console.scrollHeight;
+ }
+
+
+ document.addEventListener("DOMContentLoaded", function() {
+ // Remove elements with "noscript" class - <noscript> is not allowed in XHTML
+ var noscripts = document.getElementsByClassName("noscript");
+ for (var i = 0; i < noscripts.length; i++) {
+ noscripts[i].parentNode.removeChild(noscripts[i]);
+ }
+ }, false);
+ ]]></script>
+</head>
+<body>
+<div class="noscript"><h2 style="color: #ff0000">Seems your browser doesn't support JavaScript! Websockets rely on JavaScript being enabled. Please enable
+ JavaScript and reload this page!</h2></div>
+<div>
+ <div id="connect-container">
+ <div>
+ <span>Connect to service implemented using:</span>
+ <br/>
+ <!-- echo example using new programmatic API on the server side -->
+ <input id="radio1" type="radio" name="group1" value="/examples/websocket/echoProgrammatic"
+ onclick="updateTarget(this.value);"/> <label for="radio1">programmatic API</label>
+ <br/>
+ <!-- echo example using new annotation API on the server side -->
+ <input id="radio2" type="radio" name="group1" value="/examples/websocket/echoAnnotation"
+ onclick="updateTarget(this.value);"/> <label for="radio2">annotation API (basic)</label>
+ <br/>
+ <!-- echo example using new annotation API on the server side -->
+ <input id="radio3" type="radio" name="group1" value="/examples/websocket/echoStreamAnnotation"
+ onclick="updateTarget(this.value);"/> <label for="radio3">annotation API (stream)</label>
+ <br/>
+ <!-- echo example using new annotation API on the server side -->
+ <!-- Disabled by default -->
+ <!--
+ <input id="radio4" type="radio" name="group1" value="/examples/websocket/echoAsyncAnnotation"
+ onclick="updateTarget(this.value);"/> <label for="radio4">annotation API (async)</label>
+ -->
+ </div>
+ <div>
+ <input id="target" type="text" size="40" style="width: 350px"/>
+ </div>
+ <div>
+ <button id="connect" onclick="connect();">Connect</button>
+ <button id="disconnect" disabled="disabled" onclick="disconnect();">Disconnect</button>
+ </div>
+ <div>
+ <textarea id="message" style="width: 350px">Here is a message!</textarea>
+ </div>
+ <div>
+ <button id="echo" onclick="echo();" disabled="disabled">Echo message</button>
+ </div>
+ </div>
+ <div id="console-container">
+ <div id="console"/>
+ </div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/websocket/index.xhtml b/web/tomcat/webapps/examples/websocket/index.xhtml
new file mode 100644
index 0000000..97ee945
--- /dev/null
+++ b/web/tomcat/webapps/examples/websocket/index.xhtml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+ <title>Apache Tomcat WebSocket Examples</title>
+</head>
+<body>
+<h1>Apache Tomcat WebSocket Examples</h1>
+<ul>
+ <li><a href="echo.xhtml">Echo example</a></li>
+ <li><a href="chat.xhtml">Chat example</a></li>
+ <li><a href="snake.xhtml">Multiplayer snake example</a></li>
+ <li><a href="drawboard.xhtml">Multiplayer drawboard example</a></li>
+
+</ul>
+</body>
+</html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/examples/websocket/snake.xhtml b/web/tomcat/webapps/examples/websocket/snake.xhtml
new file mode 100644
index 0000000..f0dee27
--- /dev/null
+++ b/web/tomcat/webapps/examples/websocket/snake.xhtml
@@ -0,0 +1,266 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+ <title>Apache Tomcat WebSocket Examples: Multiplayer Snake</title>
+ <style type="text/css"><![CDATA[
+ #playground {
+ width: 640px;
+ height: 480px;
+ background-color: #000;
+ }
+
+ #console-container {
+ float: left;
+ margin-left: 15px;
+ width: 300px;
+ }
+
+ #console {
+ border: 1px solid #CCCCCC;
+ border-right-color: #999999;
+ border-bottom-color: #999999;
+ height: 480px;
+ overflow-y: scroll;
+ padding-left: 5px;
+ padding-right: 5px;
+ width: 100%;
+ }
+
+ #console p {
+ padding: 0;
+ margin: 0;
+ }
+ ]]></style>
+</head>
+<body>
+ <div class="noscript"><h2 style="color: #ff0000">Seems your browser doesn't support JavaScript! Websockets rely on JavaScript being enabled. Please enable
+ JavaScript and reload this page!</h2></div>
+ <div style="float: left">
+ <canvas id="playground" width="640" height="480"/>
+ </div>
+ <div id="console-container">
+ <div id="console"/>
+ </div>
+ <script type="application/javascript"><![CDATA[
+ "use strict";
+
+ var Game = {};
+
+ Game.fps = 30;
+ Game.socket = null;
+ Game.nextFrame = null;
+ Game.interval = null;
+ Game.direction = 'none';
+ Game.gridSize = 10;
+
+ function Snake() {
+ this.snakeBody = [];
+ this.color = null;
+ }
+
+ Snake.prototype.draw = function(context) {
+ for (var id in this.snakeBody) {
+ context.fillStyle = this.color;
+ context.fillRect(this.snakeBody[id].x, this.snakeBody[id].y, Game.gridSize, Game.gridSize);
+ }
+ };
+
+ Game.initialize = function() {
+ this.entities = [];
+ var canvas = document.getElementById('playground');
+ if (!canvas.getContext) {
+ Console.log('Error: 2d canvas not supported by this browser.');
+ return;
+ }
+ this.context = canvas.getContext('2d');
+ window.addEventListener('keydown', function (e) {
+ var code = e.keyCode;
+ if (code > 36 && code < 41) {
+ switch (code) {
+ case 37:
+ if (Game.direction != 'east') Game.setDirection('west');
+ break;
+ case 38:
+ if (Game.direction != 'south') Game.setDirection('north');
+ break;
+ case 39:
+ if (Game.direction != 'west') Game.setDirection('east');
+ break;
+ case 40:
+ if (Game.direction != 'north') Game.setDirection('south');
+ break;
+ }
+ }
+ }, false);
+ if (window.location.protocol == 'http:') {
+ Game.connect('ws://' + window.location.host + '/examples/websocket/snake');
+ } else {
+ Game.connect('wss://' + window.location.host + '/examples/websocket/snake');
+ }
+ };
+
+ Game.setDirection = function(direction) {
+ Game.direction = direction;
+ Game.socket.send(direction);
+ Console.log('Sent: Direction ' + direction);
+ };
+
+ Game.startGameLoop = function() {
+ if (window.webkitRequestAnimationFrame) {
+ Game.nextFrame = function () {
+ webkitRequestAnimationFrame(Game.run);
+ };
+ } else if (window.mozRequestAnimationFrame) {
+ Game.nextFrame = function () {
+ mozRequestAnimationFrame(Game.run);
+ };
+ } else {
+ Game.interval = setInterval(Game.run, 1000 / Game.fps);
+ }
+ if (Game.nextFrame != null) {
+ Game.nextFrame();
+ }
+ };
+
+ Game.stopGameLoop = function () {
+ Game.nextFrame = null;
+ if (Game.interval != null) {
+ clearInterval(Game.interval);
+ }
+ };
+
+ Game.draw = function() {
+ this.context.clearRect(0, 0, 640, 480);
+ for (var id in this.entities) {
+ this.entities[id].draw(this.context);
+ }
+ };
+
+ Game.addSnake = function(id, color) {
+ Game.entities[id] = new Snake();
+ Game.entities[id].color = color;
+ };
+
+ Game.updateSnake = function(id, snakeBody) {
+ if (typeof Game.entities[id] != "undefined") {
+ Game.entities[id].snakeBody = snakeBody;
+ }
+ };
+
+ Game.removeSnake = function(id) {
+ Game.entities[id] = null;
+ // Force GC.
+ delete Game.entities[id];
+ };
+
+ Game.run = (function() {
+ var skipTicks = 1000 / Game.fps, nextGameTick = (new Date).getTime();
+
+ return function() {
+ while ((new Date).getTime() > nextGameTick) {
+ nextGameTick += skipTicks;
+ }
+ Game.draw();
+ if (Game.nextFrame != null) {
+ Game.nextFrame();
+ }
+ };
+ })();
+
+ Game.connect = (function(host) {
+ if ('WebSocket' in window) {
+ Game.socket = new WebSocket(host);
+ } else if ('MozWebSocket' in window) {
+ Game.socket = new MozWebSocket(host);
+ } else {
+ Console.log('Error: WebSocket is not supported by this browser.');
+ return;
+ }
+
+ Game.socket.onopen = function () {
+ // Socket open.. start the game loop.
+ Console.log('Info: WebSocket connection opened.');
+ Console.log('Info: Press an arrow key to begin.');
+ Game.startGameLoop();
+ setInterval(function() {
+ // Prevent server read timeout.
+ Game.socket.send('ping');
+ }, 5000);
+ };
+
+ Game.socket.onclose = function () {
+ Console.log('Info: WebSocket closed.');
+ Game.stopGameLoop();
+ };
+
+ Game.socket.onmessage = function (message) {
+ var packet = JSON.parse(message.data);
+ switch (packet.type) {
+ case 'update':
+ for (var i = 0; i < packet.data.length; i++) {
+ Game.updateSnake(packet.data[i].id, packet.data[i].body);
+ }
+ break;
+ case 'join':
+ for (var j = 0; j < packet.data.length; j++) {
+ Game.addSnake(packet.data[j].id, packet.data[j].color);
+ }
+ break;
+ case 'leave':
+ Game.removeSnake(packet.id);
+ break;
+ case 'dead':
+ Console.log('Info: Your snake is dead, bad luck!');
+ Game.direction = 'none';
+ break;
+ case 'kill':
+ Console.log('Info: Head shot!');
+ break;
+ }
+ };
+ });
+
+ var Console = {};
+
+ Console.log = (function(message) {
+ var console = document.getElementById('console');
+ var p = document.createElement('p');
+ p.style.wordWrap = 'break-word';
+ p.innerHTML = message;
+ console.appendChild(p);
+ while (console.childNodes.length > 25) {
+ console.removeChild(console.firstChild);
+ }
+ console.scrollTop = console.scrollHeight;
+ });
+
+ Game.initialize();
+
+
+ document.addEventListener("DOMContentLoaded", function() {
+ // Remove elements with "noscript" class - <noscript> is not allowed in XHTML
+ var noscripts = document.getElementsByClassName("noscript");
+ for (var i = 0; i < noscripts.length; i++) {
+ noscripts[i].parentNode.removeChild(noscripts[i]);
+ }
+ }, false);
+
+ ]]></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/web/tomcat/webapps/host-manager/META-INF/context.xml b/web/tomcat/webapps/host-manager/META-INF/context.xml
new file mode 100644
index 0000000..1fa3a5a
--- /dev/null
+++ b/web/tomcat/webapps/host-manager/META-INF/context.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Context antiResourceLocking="false" privileged="true" >
+ <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
+ sameSiteCookies="strict" />
+ <Valve className="org.apache.catalina.valves.RemoteAddrValve"
+ allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
+ <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
+</Context>
\ No newline at end of file
diff --git a/web/tomcat/webapps/host-manager/WEB-INF/jsp/401.jsp b/web/tomcat/webapps/host-manager/WEB-INF/jsp/401.jsp
new file mode 100644
index 0000000..047766b
--- /dev/null
+++ b/web/tomcat/webapps/host-manager/WEB-INF/jsp/401.jsp
@@ -0,0 +1,71 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ page session="false" trimDirectiveWhitespaces="true" %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>401 Unauthorized</title>
+ <style type="text/css">
+ <!--
+ BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;font-size:12px;}
+ H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;}
+ PRE, TT {border: 1px dotted #525D76}
+ A {color : black;}A.name {color : black;}
+ -->
+ </style>
+ </head>
+ <body>
+ <h1>401 Unauthorized</h1>
+ <p>
+ You are not authorized to view this page. If you have not changed
+ any configuration files, please examine the file
+ <tt>conf/tomcat-users.xml</tt> in your installation. That
+ file must contain the credentials to let you use this webapp.
+ </p>
+ <p>
+ For example, to add the <tt>admin-gui</tt> role to a user named
+ <tt>tomcat</tt> with a password of <tt>s3cret</tt>, add the following to the
+ config file listed above.
+ </p>
+<pre>
+<role rolename="admin-gui"/>
+<user username="tomcat" password="s3cret" roles="admin-gui"/>
+</pre>
+ <p>
+ Note that for Tomcat 7 onwards, the roles required to use the host manager
+ application were changed from the single <tt>admin</tt> role to the
+ following two roles. You will need to assign the role(s) required for
+ the functionality you wish to access.
+ </p>
+ <ul>
+ <li><tt>admin-gui</tt> - allows access to the HTML GUI</li>
+ <li><tt>admin-script</tt> - allows access to the text interface</li>
+ </ul>
+ <p>
+ The HTML interface is protected against CSRF but the text interface is not.
+ To maintain the CSRF protection:
+ </p>
+ <ul>
+ <li>Users with the <tt>admin-gui</tt> role should not be granted the
+ <tt>admin-script</tt> role.</li>
+ <li>If the text interface is accessed through a browser (e.g. for testing
+ since this interface is intended for tools not humans) then the browser
+ must be closed afterwards to terminate the session.</li>
+ </ul>
+ </body>
+
+</html>
diff --git a/web/tomcat/webapps/host-manager/WEB-INF/jsp/403.jsp b/web/tomcat/webapps/host-manager/WEB-INF/jsp/403.jsp
new file mode 100644
index 0000000..74e1e2d
--- /dev/null
+++ b/web/tomcat/webapps/host-manager/WEB-INF/jsp/403.jsp
@@ -0,0 +1,90 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ page session="false" trimDirectiveWhitespaces="true" %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>403 Access Denied</title>
+ <style type="text/css">
+ <!--
+ BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;font-size:12px;}
+ H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;}
+ PRE, TT {border: 1px dotted #525D76}
+ A {color : black;}A.name {color : black;}
+ -->
+ </style>
+ </head>
+ <body>
+ <h1>403 Access Denied</h1>
+ <p>
+ You are not authorized to view this page.
+ </p>
+ <p>
+ By default the Host Manager is only accessible from a browser running on the
+ same machine as Tomcat. If you wish to modify this restriction, you'll need
+ to edit the Host Manager's <tt>context.xml</tt> file.
+ </p>
+ <p>
+ If you have already configured the Host Manager application to allow access
+ and you have used your browsers back button, used a saved book-mark or
+ similar then you may have triggered the cross-site request forgery (CSRF)
+ protection that has been enabled for the HTML interface of the Host Manager
+ application. You will need to reset this protection by returning to the
+ <a href="<%=request.getContextPath()%>/html">main Host Manager page</a>.
+ Once you return to this page, you will be able to continue using the Host
+ Manager application's HTML interface normally. If you continue to see this
+ access denied message, check that you have the necessary permissions to
+ access this application.
+ </p>
+ <p> If you have not changed
+ any configuration files, please examine the file
+ <tt>conf/tomcat-users.xml</tt> in your installation. That
+ file must contain the credentials to let you use this webapp.
+ </p>
+ <p>
+ For example, to add the <tt>admin-gui</tt> role to a user named
+ <tt>tomcat</tt> with a password of <tt>s3cret</tt>, add the following to the
+ config file listed above.
+ </p>
+<pre>
+<role rolename="admin-gui"/>
+<user username="tomcat" password="s3cret" roles="admin-gui"/>
+</pre>
+ <p>
+ Note that for Tomcat 7 onwards, the roles required to use the host manager
+ application were changed from the single <tt>admin</tt> role to the
+ following two roles. You will need to assign the role(s) required for
+ the functionality you wish to access.
+ </p>
+ <ul>
+ <li><tt>admin-gui</tt> - allows access to the HTML GUI</li>
+ <li><tt>admin-script</tt> - allows access to the text interface</li>
+ </ul>
+ <p>
+ The HTML interface is protected against CSRF but the text interface is not.
+ To maintain the CSRF protection:
+ </p>
+ <ul>
+ <li>Users with the <tt>admin-gui</tt> role should not be granted the
+ <tt>admin-script</tt> role.</li>
+ <li>If the text interface is accessed through a browser (e.g. for testing
+ since this interface is intended for tools not humans) then the browser
+ must be closed afterwards to terminate the session.</li>
+ </ul>
+ </body>
+
+</html>
diff --git a/web/tomcat/webapps/host-manager/WEB-INF/jsp/404.jsp b/web/tomcat/webapps/host-manager/WEB-INF/jsp/404.jsp
new file mode 100644
index 0000000..1950b77
--- /dev/null
+++ b/web/tomcat/webapps/host-manager/WEB-INF/jsp/404.jsp
@@ -0,0 +1,62 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ page import="org.apache.tomcat.util.security.Escape" session="false"
+ trimDirectiveWhitespaces="true" %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>404 Not found</title>
+ <style type="text/css">
+ <!--
+ BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;font-size:12px;}
+ H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;}
+ PRE, TT {border: 1px dotted #525D76}
+ A {color : black;}A.name {color : black;}
+ -->
+ </style>
+ </head>
+ <body>
+ <h1>404 Not found</h1>
+ <p>
+ The page you tried to access
+ (<%=Escape.htmlElementContent((String) request.getAttribute(
+ "javax.servlet.error.request_uri"))%>)
+ does not exist.
+ </p>
+ <p>
+ The Host Manager application has been re-structured for Tomcat 7 onwards and
+ some URLs have changed. All URLs used to access the Manager application
+ should now start with one of the following options:
+ </p>
+ <ul>
+ <li><%=request.getContextPath()%>/html for the HTML GUI</li>
+ <li><%=request.getContextPath()%>/text for the text interface</li>
+ </ul>
+ <p>
+ Note that the URL for the text interface has changed from
+ "<%=request.getContextPath()%>" to
+ "<%=request.getContextPath()%>/text".
+ </p>
+ <p>
+ You probably need to adjust the URL you are using to access the Host Manager
+ application. However, there is always a chance you have found a bug in the
+ Host Manager application. If you are sure you have found a bug, and that the
+ bug has not already been reported, please report it to the Apache Tomcat
+ team.
+ </p>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/host-manager/WEB-INF/manager.xml b/web/tomcat/webapps/host-manager/WEB-INF/manager.xml
new file mode 100644
index 0000000..a26dca6
--- /dev/null
+++ b/web/tomcat/webapps/host-manager/WEB-INF/manager.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!--
+
+ Context configuration file for the Tomcat Manager Web App
+
+-->
+<Context docBase="${catalina.home}/webapps/manager"
+ privileged="true" antiResourceLocking="false" >
+ <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
+ sameSiteCookies="strict" />
+ <Valve className="org.apache.catalina.valves.RemoteAddrValve"
+ allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
+ <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
+</Context>
diff --git a/web/tomcat/webapps/host-manager/WEB-INF/web.xml b/web/tomcat/webapps/host-manager/WEB-INF/web.xml
new file mode 100644
index 0000000..db785d1
--- /dev/null
+++ b/web/tomcat/webapps/host-manager/WEB-INF/web.xml
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
+ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+ version="3.1"
+ metadata-complete="true">
+
+ <display-name>Tomcat Host Manager Application</display-name>
+ <description>
+ A scriptable host management web application for the Tomcat Web Server;
+ Manager lets you view, create and remove virtual hosts.
+ </description>
+
+ <servlet>
+ <servlet-name>HostManager</servlet-name>
+ <servlet-class>org.apache.catalina.manager.host.HostManagerServlet</servlet-class>
+ <init-param>
+ <param-name>debug</param-name>
+ <param-value>2</param-value>
+ </init-param>
+ </servlet>
+ <servlet>
+ <servlet-name>HTMLHostManager</servlet-name>
+ <servlet-class>org.apache.catalina.manager.host.HTMLHostManagerServlet</servlet-class>
+ <init-param>
+ <param-name>debug</param-name>
+ <param-value>2</param-value>
+ </init-param>
+ </servlet>
+
+ <filter>
+ <filter-name>SetCharacterEncoding</filter-name>
+ <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
+ <init-param>
+ <param-name>encoding</param-name>
+ <param-value>UTF-8</param-value>
+ </init-param>
+ </filter>
+
+ <filter-mapping>
+ <filter-name>SetCharacterEncoding</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <filter>
+ <filter-name>CSRF</filter-name>
+ <filter-class>org.apache.catalina.filters.CsrfPreventionFilter</filter-class>
+ <init-param>
+ <param-name>entryPoints</param-name>
+ <param-value>/html,/html/,/html/list,/index.jsp</param-value>
+ </init-param>
+ </filter>
+
+ <!-- Configured to set X-FRAME-OPTIONS. Disable HSTS in case it interferes -->
+ <!-- with an existing setting. Keep X-Content-Type-Options and -->
+ <!-- X-XSS-Protection as they are page specific. -->
+ <filter>
+ <filter-name>HTTP header security filter</filter-name>
+ <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
+ <init-param>
+ <param-name>hstsEnabled</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ </filter>
+
+ <filter-mapping>
+ <filter-name>CSRF</filter-name>
+ <servlet-name>HTMLHostManager</servlet-name>
+ </filter-mapping>
+
+ <filter-mapping>
+ <filter-name>HTTP header security filter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <!-- Define the Manager Servlet Mapping -->
+ <servlet-mapping>
+ <servlet-name>HostManager</servlet-name>
+ <url-pattern>/text/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>HTMLHostManager</servlet-name>
+ <url-pattern>/html/*</url-pattern>
+ </servlet-mapping>
+
+ <!-- Define a Security Constraint on this Application -->
+ <security-constraint>
+ <web-resource-collection>
+ <web-resource-name>HostManager commands</web-resource-name>
+ <url-pattern>/text/*</url-pattern>
+ </web-resource-collection>
+ <auth-constraint>
+ <!-- NOTE: This role is not present in the default users file -->
+ <role-name>admin-script</role-name>
+ </auth-constraint>
+ </security-constraint>
+ <security-constraint>
+ <web-resource-collection>
+ <web-resource-name>HTMLHostManager commands</web-resource-name>
+ <url-pattern>/html/*</url-pattern>
+ </web-resource-collection>
+ <auth-constraint>
+ <!-- NOTE: This role is not present in the default users file -->
+ <role-name>admin-gui</role-name>
+ </auth-constraint>
+ </security-constraint>
+
+ <!-- Define the Login Configuration for this Application -->
+ <login-config>
+ <auth-method>BASIC</auth-method>
+ <realm-name>Tomcat Host Manager Application</realm-name>
+ </login-config>
+
+ <!-- Security roles referenced by this web application -->
+ <security-role>
+ <description>
+ The role that is required to log in to the Host Manager Application HTML
+ interface
+ </description>
+ <role-name>admin-gui</role-name>
+ </security-role>
+ <security-role>
+ <description>
+ The role that is required to log in to the Host Manager Application text
+ interface
+ </description>
+ <role-name>admin-script</role-name>
+ </security-role>
+
+ <error-page>
+ <error-code>401</error-code>
+ <location>/WEB-INF/jsp/401.jsp</location>
+ </error-page>
+ <error-page>
+ <error-code>403</error-code>
+ <location>/WEB-INF/jsp/403.jsp</location>
+ </error-page>
+ <error-page>
+ <error-code>404</error-code>
+ <location>/WEB-INF/jsp/404.jsp</location>
+ </error-page>
+
+</web-app>
diff --git a/web/tomcat/webapps/host-manager/css/manager.css b/web/tomcat/webapps/host-manager/css/manager.css
new file mode 100644
index 0000000..5b50738
--- /dev/null
+++ b/web/tomcat/webapps/host-manager/css/manager.css
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+body {
+ font-family: Tahoma, Arial, sans-serif;
+}
+
+h1,
+h2,
+h3,
+b {
+ color : white;
+ background-color: #525D76;
+}
+
+h1 {
+ font-size: 22px;
+}
+
+h2 {
+ font-size: 16px;
+}
+
+h3 {
+ font-size: 14px;
+}
+
+p {
+ font-size: 12px;
+}
+
+a {
+ color: black;
+}
+
+.line {
+ height : 1px;
+ background-color: #525D76;
+ border : none;
+}
+
+table {
+ width: 100%;
+}
+
+td.page-title {
+ text-align : center;
+ vertical-align: top;
+ font-family : sans-serif, Tahoma, Arial;
+ font-weight : bold;
+ background : white;
+ color : black;
+}
+
+td.title {
+ text-align : left;
+ vertical-align: top;
+ font-family : sans-serif, Tahoma, Arial;
+ font-style : italic;
+ font-weight : bold;
+ background : #D2A41C;
+}
+
+td.header-left {
+ text-align : left;
+ vertical-align: top;
+ font-family : sans-serif, Tahoma, Arial;
+ font-weight : bold;
+ background : #FFDC75;
+}
+
+td.header-center {
+ text-align : center;
+ vertical-align: top;
+ font-family : sans-serif, Tahoma, Arial;
+ font-weight : bold;
+ background : #FFDC75;
+}
+
+td.row-left {
+ text-align : left;
+ vertical-align: middle;
+ font-family : sans-serif, Tahoma, Arial;
+ color : black;
+}
+
+td.row-center {
+ text-align : center;
+ vertical-align: middle;
+ font-family : sans-serif, Tahoma, Arial;
+ color : black;
+}
+
+td.row-right {
+ text-align : right;
+ vertical-align: middle;
+ font-family : sans-serif, Tahoma, Arial;
+ color : black;
+}
+
+TH {
+ text-align : center;
+ vertical-align: top;
+ font-family : sans-serif, Tahoma, Arial;
+ font-weight : bold;
+ background : #FFDC75;
+}
+
+TD {
+ text-align : center;
+ vertical-align: middle;
+ font-family : sans-serif, Tahoma, Arial;
+ color : black;
+}
+
+form {
+ margin: 1;
+}
+
+form.inline {
+ display: inline;
+}
+
+img.tomcat-logo {
+ height: 92px;
+ float : left;
+}
\ No newline at end of file
diff --git a/web/tomcat/webapps/host-manager/images/asf-logo.svg b/web/tomcat/webapps/host-manager/images/asf-logo.svg
new file mode 100644
index 0000000..e24cbe5
--- /dev/null
+++ b/web/tomcat/webapps/host-manager/images/asf-logo.svg
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 7127.6 2890" enable-background="new 0 0 7127.6 2890" xml:space="preserve">
+<path fill="#6D6E71" d="M7104.7,847.8c15.3,15.3,22.9,33.7,22.9,55.2c0,21.5-7.6,39.9-22.9,55.4c-15.3,15.4-33.8,23.1-55.6,23.1
+ c-21.8,0-40.2-7.6-55.4-22.9c-15.1-15.3-22.7-33.7-22.7-55.2c0-21.5,7.6-39.9,22.9-55.4c15.3-15.4,33.7-23.1,55.4-23.1
+ C7070.9,824.9,7089.4,832.5,7104.7,847.8z M7098.1,951.9c13.3-13.6,20-29.8,20-48.7s-6.6-35-19.8-48.5
+ c-13.2-13.4-29.4-20.1-48.6-20.1c-19.2,0-35.4,6.7-48.7,20.2c-13.3,13.5-19.9,29.7-19.9,48.7c0,19,6.6,35.2,19.7,48.6
+ c13.1,13.4,29.3,20.1,48.5,20.1S7084.7,965.4,7098.1,951.9z M7087.1,888.1c0,14-6.1,22.8-18.4,26.4l22.5,30.5h-18.2l-20.3-28.3
+ h-18.6v28.3h-14.7v-84.6h31.8c12.8,0,22,2.2,27.6,6.6C7084.4,871.4,7087.1,878.4,7087.1,888.1z M7068.2,900c3-2.4,4.4-6.5,4.4-12
+ c0-5.5-1.5-9.4-4.5-11.6c-3-2.2-8.4-3.2-16-3.2h-18v30.5h17.5C7059.7,903.6,7065.3,902.4,7068.2,900z"/>
+<path fill="#6D6E71" d="M1803.6,499.8v155.4h-20V499.8h-56.8v-19.2h133.9v19.2H1803.6z"/>
+<path fill="#6D6E71" d="M2082.2,655.2v-76.9h-105.2v76.9h-20V480.5h20v78.9h105.2v-78.9h20v174.7H2082.2z"/>
+<path fill="#6D6E71" d="M2241.4,499.8v57.4h88.1v19.2h-88.1v59.8h101.8v19h-121.8V480.5H2340v19.2H2241.4z"/>
+<path fill="#D22128" d="M1574.5,1852.4l417.3-997.6h80.1l417.3,997.6h-105.4l-129.3-311.9h-448.2l-127.9,311.9H1574.5z M2032.6,970
+ l-205.1,493.2h404.7L2032.6,970z"/>
+<path fill="#D22128" d="M2596.9,1852.4V854.8H3010c171.4,0,295.1,158.8,295.1,313.3c0,163-115.2,316.1-286.6,316.1h-324.6v368.1
+ H2596.9z M2693.9,1397.1h318.9c118,0,193.9-108.2,193.9-229c0-125.1-92.7-226.2-202.3-226.2h-310.5V1397.1z"/>
+<path fill="#D22128" d="M3250.5,1852.4l417.3-997.6h80.1l417.3,997.6h-105.4l-129.3-311.9h-448.2l-127.9,311.9H3250.5z M3708.6,970
+ l-205.1,493.2h404.7L3708.6,970z"/>
+<path fill="#D22128" d="M4637.3,849.1c177,0,306.3,89.9,368.1,217.8l-78.7,47.8c-63.2-132.1-186.9-177-295.1-177
+ c-238.9,0-369.5,213.6-369.5,414.5c0,220.6,161.6,420.1,373.7,420.1c112.4,0,244.5-56.2,307.7-185.5l81.5,42.1
+ c-64.6,148.9-241.7,231.8-394.8,231.8c-274,0-466.5-261.3-466.5-514.2C4163.8,1106.3,4336.6,849.1,4637.3,849.1z"/>
+<path fill="#D22128" d="M5949.1,854.8v997.6h-98.4v-466.5h-591.5v466.5h-96.9V854.8h96.9v444h591.5v-444H5949.1z"/>
+<path fill="#D22128" d="M6844.6,1765.2v87.1h-670.2V854.8H6832v87.1h-560.6v359.7h489v82.9h-489v380.8H6844.6z"/>
+<path fill="#6D6E71" d="M1667.6,2063.6c11.8,3.5,22.2,8.3,31,14.2l-10.3,22.6c-9-6-18.6-10.4-28.9-13.4c-10.2-2.9-20-4.4-29.2-4.4
+ c-13.6,0-24.5,2.4-32.6,7.3c-8.1,4.9-12.2,11.8-12.2,20.7c0,7.6,2.3,14,6.8,19c4.5,5,10.2,8.9,17,11.7c6.8,2.8,16.1,6,28,9.6
+ c14.4,4.6,26,8.9,34.7,12.9c8.8,4,16.3,9.9,22.5,17.8c6.2,7.8,9.3,18.2,9.3,31c0,11.7-3.2,21.8-9.5,30.6
+ c-6.3,8.7-15.3,15.5-26.8,20.3c-11.6,4.8-24.9,7.2-40,7.2c-15.1,0-29.7-2.9-43.9-8.7c-14.2-5.8-26.4-13.6-36.6-23.4l10.7-21.6
+ c9.6,9.4,20.7,16.7,33.3,21.9c12.6,5.2,24.8,7.8,36.8,7.8c15.3,0,27.3-3,36.1-8.9c8.8-5.9,13.2-13.9,13.2-23.9
+ c0-7.8-2.3-14.3-6.9-19.4c-4.6-5.1-10.3-9-17.1-11.9c-6.8-2.8-16.1-6-28-9.6c-14.2-4.2-25.7-8.3-34.6-12.2
+ c-8.9-3.9-16.4-9.7-22.5-17.5c-6.1-7.7-9.2-17.9-9.2-30.6c0-10.9,3-20.4,9-28.6c6-8.2,14.6-14.6,25.6-19.1
+ c11.1-4.5,23.8-6.8,38.2-6.8C1643.8,2058.3,1655.7,2060.1,1667.6,2063.6z"/>
+<path fill="#6D6E71" d="M1980.1,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6
+ c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6
+ c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14
+ C1944.8,2058.6,1963.2,2063.3,1980.1,2072.8z M1881.9,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7
+ c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1
+ c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30
+ c-13-7.4-27.2-11.2-42.6-11.2C1909.4,2081.5,1895.1,2085.2,1881.9,2092.7z"/>
+<path fill="#6D6E71" d="M2186.5,2082.4v74h98.4v23.2h-98.4v90.2h-24.1v-210.6h133.8v23.2H2186.5z"/>
+<path fill="#6D6E71" d="M2491.6,2082.4v187.4h-24.1v-187.4h-68.4v-23.2h161.4v23.2H2491.6z"/>
+<path fill="#6D6E71" d="M2871.8,2269.8l-56.8-177.4l-57.6,177.4h-24.5l-70.5-210.6h25.9l57.9,182.7l57.1-182.4l24.1-0.3l57.7,182.7
+ l57.1-182.7h25l-70.6,210.6H2871.8z"/>
+<path fill="#6D6E71" d="M3087.3,2216.6l-23.5,53.2h-25.6l94.4-210.6h25l94.1,210.6h-26.1l-23.5-53.2H3087.3z M3144.5,2086.6
+ l-46.9,106.8h94.4L3144.5,2086.6z"/>
+<path fill="#6D6E71" d="M3461.1,2202.7c-6,0.4-10.7,0.6-14.1,0.6h-56v66.5H3367v-210.6h80c26.2,0,46.6,6.2,61.2,18.5
+ c14.5,12.3,21.8,29.8,21.8,52.3c0,17.2-4.1,31.7-12.2,43.3c-8.1,11.6-19.8,20-35,25l49.2,71.5h-27.3L3461.1,2202.7z M3491.3,2167.6
+ c10.3-8.4,15.5-20.8,15.5-37c0-15.9-5.2-27.9-15.5-36c-10.3-8.1-25.1-12.2-44.3-12.2h-56v97.8h56
+ C3466.2,2180.2,3481,2176,3491.3,2167.6z"/>
+<path fill="#6D6E71" d="M3688.3,2082.4v69.2h106.2v23.2h-106.2v72.1h122.8v22.9h-146.9v-210.6h142.9v23.2H3688.3z"/>
+<path fill="#6D6E71" d="M4147,2082.4v74h98.4v23.2H4147v90.2h-24.1v-210.6h133.8v23.2H4147z"/>
+<path fill="#6D6E71" d="M4523.3,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6
+ c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6
+ c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14
+ C4488.1,2058.6,4506.5,2063.3,4523.3,2072.8z M4425.2,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7
+ c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1
+ c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30
+ c-13-7.4-27.2-11.2-42.6-11.2C4452.6,2081.5,4438.3,2085.2,4425.2,2092.7z"/>
+<path fill="#6D6E71" d="M4854.7,2247.7c-15.7,15.5-37.3,23.3-64.8,23.3c-27.7,0-49.4-7.8-65.1-23.3c-15.7-15.5-23.6-37-23.6-64.6
+ v-124h24.1v124c0,20.3,5.8,36.1,17.3,47.5c11.6,11.4,27.3,17.1,47.3,17.1c20.1,0,35.8-5.7,47.1-17c11.4-11.3,17-27.2,17-47.7v-124
+ h24.1v124C4878.2,2210.7,4870.4,2232.2,4854.7,2247.7z"/>
+<path fill="#6D6E71" d="M5169.5,2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3,169.3v-169.3h23.8v210.6H5169.5z"/>
+<path fill="#6D6E71" d="M5478.4,2073.1c16.4,9.3,29.4,21.9,38.9,37.9c9.6,16,14.3,33.9,14.3,53.5s-4.8,37.6-14.3,53.6
+ c-9.5,16.1-22.6,28.7-39.3,37.9c-16.6,9.2-35.2,13.8-55.5,13.8h-84.3v-210.6h85.2C5443.7,2059.2,5462,2063.8,5478.4,2073.1z
+ M5362.3,2246.9h61.4c15.5,0,29.6-3.5,42.3-10.6c12.7-7.1,22.8-16.9,30.2-29.5c7.4-12.5,11.1-26.5,11.1-42
+ c0-15.5-3.8-29.4-11.3-41.9c-7.5-12.5-17.7-22.3-30.6-29.6c-12.8-7.2-27-10.9-42.6-10.9h-60.5V2246.9z"/>
+<path fill="#6D6E71" d="M5668.6,2216.6l-23.5,53.2h-25.6l94.4-210.6h25l94.1,210.6H5807l-23.5-53.2H5668.6z M5725.8,2086.6
+ l-46.9,106.8h94.4L5725.8,2086.6z"/>
+<path fill="#6D6E71" d="M5991,2082.4v187.4H5967v-187.4h-68.4v-23.2h161.4v23.2H5991z"/>
+<path fill="#6D6E71" d="M6175.9,2269.8v-210.6h24.1v210.6H6175.9z"/>
+<path fill="#6D6E71" d="M6493.7,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6
+ c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6
+ c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14
+ C6458.5,2058.6,6476.9,2063.3,6493.7,2072.8z M6395.6,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7
+ c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1
+ c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30
+ c-13-7.4-27.2-11.2-42.6-11.2C6423,2081.5,6408.8,2085.2,6395.6,2092.7z"/>
+<path fill="#6D6E71" d="M6826.5,2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3,169.3v-169.3h23.8v210.6H6826.5z"/>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-4516.6152" y1="-2338.7222" x2="-4108.4111" y2="-1861.3982" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0" style="stop-color:#F69923"/>
+ <stop offset="0.3123" style="stop-color:#F79A23"/>
+ <stop offset="0.8383" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_1_)" d="M1230.1,13.7c-45.3,26.8-120.6,102.5-210.5,212.3l82.6,155.9c58-82.9,116.9-157.5,176.3-221.2
+ c4.6-5.1,7-7.5,7-7.5c-2.3,2.5-4.6,5-7,7.5c-19.2,21.2-77.5,89.2-165.5,224.4c84.7-4.2,214.9-21.6,321.1-39.7
+ c31.6-177-31-258-31-258S1323.4-41.4,1230.1,13.7z"/>
+<path fill="none" d="M1090.2,903.1c0.6-0.1,1.2-0.2,1.8-0.3l-11.9,1.3c-0.7,0.3-1.4,0.7-2.1,1
+ C1082.1,904.4,1086.2,903.7,1090.2,903.1z"/>
+<path fill="none" d="M1005.9,1182.3c-6.7,1.5-13.7,2.7-20.7,3.7C992.3,1185,999.2,1183.8,1005.9,1182.3z"/>
+<path fill="none" d="M432.9,1808.8c0.9-2.3,1.8-4.7,2.6-7c18.2-48,36.2-94.7,54-140.1c20-51,39.8-100.4,59.3-148.3
+ c20.6-50.4,40.9-99.2,60.9-146.3c21-49.4,41.7-97,62-142.8c16.5-37.3,32.8-73.4,48.9-108.3c5.4-11.7,10.7-23.2,16-34.6
+ c10.5-22.7,21-44.8,31.3-66.5c9.5-20,19-39.6,28.3-58.8c3.1-6.4,6.2-12.8,9.3-19.1c0.5-1,1-2,1.5-3.1l-10.2,1.1l-8-15.9
+ c-0.8,1.6-1.6,3.1-2.4,4.6c-14.5,28.8-28.9,57.9-43.1,87.2c-8.2,16.9-16.4,34-24.6,51c-22.6,47.4-44.8,95.2-66.6,143.3
+ c-22.1,48.6-43.7,97.5-64.9,146.5c-20.8,48.1-41.3,96.2-61.2,144.2c-20,48-39.5,95.7-58.5,143.2c-19.9,49.5-39.2,98.7-58,147.2
+ c-4.2,10.9-8.5,21.9-12.7,32.8c-15,39.2-29.7,77.8-44,116l12.7,25.1l11.4-1.2c0.4-1.1,0.8-2.3,1.3-3.4
+ C396.7,1905.4,414.9,1856.4,432.9,1808.8z"/>
+<path fill="none" d="M980,1186.8L980,1186.8c0.1,0,0.1,0,0.1-0.1C980.1,1186.8,980.1,1186.8,980,1186.8z"/>
+<path fill="#BE202E" d="M952.6,1323c-10.6,1.9-21.4,3.8-32.5,5.7c-0.1,0-0.1,0.1-0.2,0.1c5.6-0.8,11.2-1.7,16.6-2.6
+ C942,1325.2,947.3,1324.1,952.6,1323z"/>
+<path opacity="0.35" fill="#BE202E" d="M952.6,1323c-10.6,1.9-21.4,3.8-32.5,5.7c-0.1,0-0.1,0.1-0.2,0.1c5.6-0.8,11.2-1.7,16.6-2.6
+ C942,1325.2,947.3,1324.1,952.6,1323z"/>
+<path fill="#BE202E" d="M980.3,1186.7C980.2,1186.7,980.2,1186.7,980.3,1186.7c-0.1,0.1-0.2,0.1-0.2,0.1c1.8-0.2,3.5-0.5,5.2-0.8
+ c7-1,13.9-2.2,20.7-3.7C997.5,1183.8,989,1185.2,980.3,1186.7L980.3,1186.7L980.3,1186.7z"/>
+<path opacity="0.35" fill="#BE202E" d="M980.3,1186.7C980.2,1186.7,980.2,1186.7,980.3,1186.7c-0.1,0.1-0.2,0.1-0.2,0.1
+ c1.8-0.2,3.5-0.5,5.2-0.8c7-1,13.9-2.2,20.7-3.7C997.5,1183.8,989,1185.2,980.3,1186.7L980.3,1186.7L980.3,1186.7z"/>
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-7537.7339" y1="-2391.4075" x2="-4625.4141" y2="-2391.4075" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_2_)" d="M858.6,784.7c25.1-46.9,50.5-92.8,76.2-137.4c26.7-46.4,53.7-91.3,80.9-134.7
+ c1.6-2.6,3.2-5.2,4.8-7.7c27-42.7,54.2-83.7,81.6-122.9L1019.5,226c-6.2,7.6-12.5,15.3-18.8,23.2c-23.8,29.7-48.6,61.6-73.9,95.5
+ c-28.6,38.2-58,78.9-87.8,121.7c-27.6,39.5-55.5,80.9-83.5,123.7c-23.8,36.5-47.7,74-71.4,112.5c-0.9,1.4-1.8,2.9-2.6,4.3
+ l107.5,212.3C811.8,873.6,835.1,828.7,858.6,784.7z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-7186.1777" y1="-2099.3059" x2="-5450.7183" y2="-2099.3059" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0" style="stop-color:#282662"/>
+ <stop offset="9.548390e-02" style="stop-color:#662E8D"/>
+ <stop offset="0.7882" style="stop-color:#9F2064"/>
+ <stop offset="0.9487" style="stop-color:#CD2032"/>
+</linearGradient>
+<path fill="url(#SVGID_3_)" d="M369,1981c-14.2,39.1-28.5,78.9-42.9,119.6c-0.2,0.6-0.4,1.2-0.6,1.8c-2,5.7-4.1,11.5-6.1,17.2
+ c-9.7,27.4-18,52.1-37.3,108.2c31.7,14.5,57.1,52.5,81.1,95.6c-2.6-44.7-21-86.6-56.2-119.1c156.1,7,290.6-32.4,360.1-146.6
+ c6.2-10.2,11.9-20.9,17-32.2c-31.6,40.1-70.8,57.1-144.5,53c-0.2,0.1-0.3,0.1-0.5,0.2c0.2-0.1,0.3-0.1,0.5-0.2
+ c108.6-48.6,163.1-95.3,211.2-172.6c11.4-18.3,22.5-38.4,33.8-60.6c-94.9,97.5-205,125.3-320.9,104.2l-86.9,9.5
+ C374.4,1966.3,371.7,1973.6,369,1981z"/>
+<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2418.5454" x2="-4461.8428" y2="-2418.5454" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_4_)" d="M409.6,1786.3c18.8-48.5,38.1-97.7,58-147.2c19-47.4,38.5-95.2,58.5-143.2
+ c20-48,40.4-96.1,61.2-144.2c21.2-49,42.9-97.8,64.9-146.5c21.8-48.1,44-95.9,66.6-143.3c8.1-17.1,16.3-34.1,24.6-51
+ c14.2-29.3,28.6-58.4,43.1-87.2c0.8-1.6,1.6-3.1,2.4-4.6L681.4,706.8c-1.8,2.9-3.5,5.8-5.3,8.6c-25.1,40.9-50,82.7-74.4,125.4
+ c-24.7,43.1-49,87.1-72.7,131.7c-20,37.6-39.6,75.6-58.6,113.9c-3.8,7.8-7.6,15.5-11.3,23.2c-23.4,48.2-44.6,94.8-63.7,139.5
+ c-21.7,50.7-40.7,99.2-57.5,145.1c-11,30.2-21,59.4-30.1,87.4c-7.5,24-14.7,47.9-21.5,71.8c-16,56.3-29.9,112.4-41.2,168.3
+ L353,1935.1c14.3-38.1,28.9-76.8,44-116C401.1,1808.2,405.4,1797.3,409.6,1786.3z"/>
+<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-7161.7642" y1="-2379.1431" x2="-5631.2524" y2="-2379.1431" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0" style="stop-color:#282662"/>
+ <stop offset="9.548390e-02" style="stop-color:#662E8D"/>
+ <stop offset="0.7882" style="stop-color:#9F2064"/>
+ <stop offset="0.9487" style="stop-color:#CD2032"/>
+</linearGradient>
+<path fill="url(#SVGID_5_)" d="M243.5,1729.4c-13.6,68.2-23.2,136.2-28,203.8c-0.2,2.4-0.4,4.7-0.5,7.1
+ c-33.7-54-124-106.8-123.8-106.2c64.6,93.7,113.7,186.7,120.9,278c-34.6,7.1-82-3.2-136.8-23.3c57.1,52.5,100,67,116.7,70.9
+ c-52.5,3.3-107.1,39.3-162.1,80.8c80.5-32.8,145.5-45.8,192.1-35.3C148.1,2414.2,74.1,2645,0,2890c22.7-6.7,36.2-21.9,43.9-42.6
+ c13.2-44.4,100.8-335.6,238-718.2c3.9-10.9,7.8-21.8,11.8-32.9c1.1-3,2.2-6.1,3.3-9.2c14.5-40.1,29.5-81.1,45.1-122.9
+ c3.5-9.5,7.1-19,10.7-28.6c0.1-0.2,0.1-0.4,0.2-0.6l-107.9-213.2C244.6,1724.4,244,1726.9,243.5,1729.4z"/>
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2117.1309" x2="-4461.8428" y2="-2117.1309" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_6_)" d="M805.6,937c-3.1,6.3-6.2,12.7-9.3,19.1c-9.3,19.2-18.8,38.8-28.3,58.8
+ c-10.3,21.7-20.7,43.9-31.3,66.5c-5.3,11.4-10.6,22.9-16,34.6c-16.1,35-32.4,71.1-48.9,108.3c-20.3,45.8-41,93.4-62,142.8
+ c-20,47.1-40.3,95.9-60.9,146.3c-19.5,47.9-39.3,97.3-59.3,148.3c-17.8,45.4-35.9,92.1-54,140.1c-0.9,2.3-1.8,4.7-2.6,7
+ c-18,47.6-36.2,96.6-54.6,146.8c-0.4,1.1-0.8,2.3-1.3,3.4l86.9-9.5c-1.7-0.3-3.5-0.5-5.2-0.9c103.9-13,242.1-90.6,331.4-186.5
+ c41.1-44.2,78.5-96.3,113-157.3c25.7-45.4,49.8-95.8,72.8-151.5c20.1-48.7,39.4-101.4,58-158.6c-23.9,12.6-51.2,21.8-81.4,28.2
+ c-5.3,1.1-10.7,2.2-16.1,3.1c-5.5,1-11,1.8-16.6,2.6l0,0l0,0c0.1,0,0.1-0.1,0.2-0.1c96.9-37.3,158-109.2,202.4-197.4
+ c-25.5,17.4-66.9,40.1-116.6,51.1c-6.7,1.5-13.7,2.7-20.7,3.7c-1.7,0.3-3.5,0.6-5.2,0.8l0,0l0,0c0.1,0,0.1,0,0.1-0.1
+ c0,0,0.1,0,0.1,0l0,0c33.6-14.1,62-29.8,86.6-48.4c5.3-4,10.4-8.1,15.3-12.3c7.5-6.5,14.7-13.3,21.5-20.5c4.4-4.6,8.6-9.3,12.7-14.2
+ c9.6-11.5,18.7-23.9,27.1-37.3c2.6-4.1,5.1-8.3,7.6-12.6c3.2-6.2,6.3-12.3,9.3-18.3c13.5-27.2,24.4-51.5,33-72.8
+ c4.3-10.6,8.1-20.5,11.3-29.7c1.3-3.7,2.5-7.2,3.7-10.6c3.4-10.2,6.2-19.3,8.4-27.3c3.3-12,5.3-21.5,6.4-28.4l0,0l0,0
+ c-3.3,2.6-7.1,5.2-11.3,7.7c-29.3,17.5-79.5,33.4-119.9,40.8l79.8-8.8l-79.8,8.8c-0.6,0.1-1.2,0.2-1.8,0.3c-4,0.7-8.1,1.3-12.2,2
+ c0.7-0.3,1.4-0.7,2.1-1l-273,29.9C806.6,935,806.1,936,805.6,937z"/>
+<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-7554.8232" y1="-2132.0981" x2="-4642.5034" y2="-2132.0981" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_7_)" d="M1112.9,385.1c-24.3,37.3-50.8,79.6-79.4,127.5c-1.5,2.5-3,5.1-4.5,7.6
+ c-24.6,41.5-50.8,87.1-78.3,137c-23.8,43.1-48.5,89.3-74.3,139c-22.4,43.3-45.6,89.2-69.4,137.8l273-29.9
+ c79.5-36.6,115.1-69.7,149.6-117.6c9.2-13.2,18.4-27,27.5-41.3c28-43.8,55.6-92,80.1-139.9c23.7-46.3,44.7-92.2,60.7-133.5
+ c10.2-26.3,18.4-50.8,24.1-72.3c5-19,8.9-36.9,11.9-54.1C1327.9,363.5,1197.6,380.9,1112.9,385.1z"/>
+<path fill="#BE202E" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/>
+<path opacity="0.35" fill="#BE202E" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/>
+<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2027.484" x2="-4461.8433" y2="-2027.484" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_8_)" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/>
+<path fill="#BE202E" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/>
+<path opacity="0.35" fill="#BE202E" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/>
+<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2037.7417" x2="-4461.8433" y2="-2037.7417" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_9_)" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/>
+<path fill="#BE202E" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7L980.2,1186.7
+ C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/>
+<path opacity="0.35" fill="#BE202E" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7
+ L980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/>
+<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-5738.0635" y1="-2039.799" x2="-5094.3457" y2="-2039.799" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_10_)" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7L980.2,1186.7
+ C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/>
+</svg>
diff --git a/web/tomcat/webapps/host-manager/images/tomcat.svg b/web/tomcat/webapps/host-manager/images/tomcat.svg
new file mode 100644
index 0000000..8823f79
--- /dev/null
+++ b/web/tomcat/webapps/host-manager/images/tomcat.svg
@@ -0,0 +1,967 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Generator: Adobe Illustrator 11 Build 196, SVG Export Plug-In . SVG Version: 6.0.0 Build 78) -->
+<svg:svg
+ xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/"
+ xmlns:xap="http://ns.adobe.com/xap/1.0/"
+ xmlns:ns0="http://ns.adobe.com/SaveForWeb/1.0/"
+ xmlns:ns="http://ns.adobe.com/Variables/1.0/"
+ xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/"
+ xmlns:x="adobe:ns:meta/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ i:viewOrigin="176.7139 486.707"
+ i:rulerOrigin="-156 -296"
+ i:pageBounds="156 496 456 296"
+ width="260.162"
+ height="184.413"
+ viewBox="0 0 260.162 184.413"
+ overflow="visible"
+ enable-background="new 0 0 260.162 184.413"
+ xml:space="preserve"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="tomcat.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"><svg:defs
+ id="defs59"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 92.206497 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="260.16199 : 92.206497 : 1"
+ inkscape:persp3d-origin="130.08099 : 61.470998 : 1"
+ id="perspective63" /></svg:defs><sodipodi:namedview
+ inkscape:window-height="725"
+ inkscape:window-width="1051"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="2.1025362"
+ inkscape:cx="130.08099"
+ inkscape:cy="91.968689"
+ inkscape:window-x="35"
+ inkscape:window-y="192"
+ inkscape:current-layer="svg2" />
+ <svg:metadata
+ id="metadata4">
+ <ns:variableSets>
+ <ns:variableSet
+ varSetName="binding1"
+ locked="none">
+ <ns:variables />
+ <ns:sampleDataSets />
+ </ns:variableSet>
+ </ns:variableSets>
+ <ns0:sfw>
+ <ns0:slices />
+ <ns0:sliceSourceBounds
+ y="302.294"
+ x="176.714"
+ width="260.162"
+ height="184.413"
+ bottomLeftOrigin="true" />
+ </ns0:sfw>
+<xpacket /><x:xmpmeta
+ x:xmptk="XMP toolkit 3.0-29, framework 1.6">
+
+<svg:metadata
+ id="metadata61"><rdf:RDF>
+
+ <rdf:Description
+ rdf:about="">
+ </rdf:Description>
+
+ <rdf:Description
+ rdf:about="">
+ </rdf:Description>
+
+ <rdf:Description
+ rdf:about="">
+ <xap:CreateDate>2006-05-09T08:17:21Z</xap:CreateDate>
+ <xap:ModifyDate>2006-05-09T08:37:38Z</xap:ModifyDate>
+ <xap:CreatorTool>Illustrator</xap:CreatorTool>
+ <xap:Thumbnails>
+ <rdf:Alt>
+ <rdf:li
+ rdf:parseType="Resource">
+ <xapGImg:format>JPEG</xapGImg:format>
+ <xapGImg:width>256</xapGImg:width>
+ <xapGImg:height>184</xapGImg:height>
+ <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
+AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
+DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
+Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAuAEAAwER
+AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
+AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
+UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
+1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
+qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
+obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
+0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
+FXYq7FXYq7FXYq7FXYq7FXhH/OYHnWfQ/wAurfRLSUxXXmK49GQqaN9VtwJJqH3cxqfYnFXhP5Y/
+85O+f/JU0enaw769okbBJLS8ZvrUKg0IhnarDj/I9R2HHFX2F+Xn5neT/P8ApP6R8u3glKAfW7KS
+iXNuzdFljqaezCqnsTirK8VdirsVdirsVdirsVdirC/zM/Nvyd+XemC71255Xcqk2WmQUa5nI2+F
+CRxUd3ag+nbFXx1+Zf8Azkn+YvneaW1tLh9C0NgwXTrB2V3Sm/rzji8m3UDitP2cVfV//OOfmabz
+D+T3l+6uHMl1aRPYTsxqSbVzEhJ7kxKhxV6VirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd
+irsVfHn/ADlxdSa7+bvlvyvGx4RW0EVARtNfXJVqf7BY+uRlKgT3JAt5r/zkD5ZGgfmfqSRR+nZ6
+gsd9agdOMq0f/ksj5h9nZvEwgnmNi2Z4cMiw/wAqebPMHlTXLfW9BvHstQtjVZEPwstQWjkXo6NT
+4lOxzOan3v8Akl+cel/mX5a+tAJa69ZcU1fTlJojGvGWLluYpKbV6GqmtKlV6NirsVdirsVdirsV
+eWfnr+eGl/lroywwBLzzPfox02wJqqL0+sT03EanoOrnYdyFXwh5i8x655j1i41jW7yS+1K6blNc
+SmpPgABQKo6BVFB2xVnf5Q+SjrWh+d9Yli5w6XolylsadbqSNnTj8kiYf7IZg6zUeHKERzlIfL8U
+3YoWCe4Pff8AnCfVTN5D1zTCamz1P11HcLcQIAPlWE5nNL6KxV2KuxV2KuxV2KuxV2KuxV2KuxV2
+KuxV2KuxV2KuxV2KvjD8wm/Sv/OX8UTGsdrqGnCMNUU+rW0Mp6f5ammY2sNYZ/1T9zZi+oe9m/8A
+zkx+Xc/mPytFrunRepqehc3ljUVeS0cAyAU6mMqHA8OXfNB2PqhCfAeUvv8A2uZqcdix0fIedQ69
+m35OefrryN+YOla2kpjsjKttqqDo9nMwEoI78ftr/lKMVfaeqf8AOSH5KaaSs3meCZx0W1inuanf
+YNDG69vHFWM3v/OYn5QW5YQ/pK8ArQwWqitPD1pIuvviqVT/APObH5cKR6GjaxIP2i8dqhB9qTvi
+qmP+c2fIFd9C1Wnfa2/6q4qmFv8A85n/AJUSvxksdZtx/NJb25H/ACTuHOKp3bf85XfkpPBI7avN
+BIisywS2lwGcqCeIZUdKmm1WGKvijzz5x1bzl5q1HzFqjlrm+lLrHWqxRDaOFP8AJjSij7+uKpNb
+W1xdXMVtbRtNcTuscMKAszu54qqgbkkmgwE1uVfbHkL8uk8o/lTPoMiK+o3drPNqZHRrieIhlr4I
+tEB9q5yWo1fi6gS/hBFfN2UMfDAjqwT/AJwdvyt/5usC20sVlOq77em0yMR2/wB2Cudc619ZYq7F
+XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXxZKTJ/zmFc+oedNTmA5b/ZtG49fCgpmH2h/
+cS9zbh+sPqDrsc4t2r57/Nf/AJxkGo3c+teSTFb3ExMlxo0hEcTMdybd/spU/sN8PgQNs3+i7Xoc
+OX5/rcLLpusWIaF/zif56vFWTVr6y0pG6xgtczL81QLH90mZWTtnFH6bk1x0sjz2Z1pf/OIvlOIL
++lNbvrthSv1dYrZSe+zC4ND88wp9uTP0xA9+/wCptGkHUsms/wDnGf8AKS3AEunT3dOpmupxXam/
+pNFmPPtjOeRA+H67bBpoPDv+ch/yt03yXrdjeaFbG30HUouCQ8pJBFcQ0DqXkZ2+NSrCrfzeGbns
+vWHNAiX1BxdRi4TtySH8jfJdn5u/MOy07UIfrGl28ct3fw1IDRxrxUEqQaGV0By7X6g4sRkOfRhh
+hxSp9N3X/OO/5P3FSdBETGnxRXN0nT/JEvH8M50dq6gfxfYHOOnh3JDqP/OKn5a3NTazajYt+yIp
+0dfpEsbn/hsvj21lHMRP497A6SPmwzW/+cQr9A76H5himO/CG9haL5AyxGT/AIhmXj7cifqiR7t/
+1NUtIehZh+S3/OP8Xk+5GveYXivNfTkLSKIloLYGqlwzBecjL3p8P45i9odqeIOCH09fNtw6fh3P
+N7DfIz2VwijkzRuFA6klTmpxmpD3uRLk+bf+cJrrj+Yet2tT+90hpeP7J9O5hWp9/wB5tneunfZm
+KuxV2KuxV2KuxV2KuxVZLNFDG0srrHGu7O5CqB7k4qks3nzyNC5jm8xaZHIOqPeW6nf2L4qmFhrW
+j6iK6ff294KVrbypLt1r8BPjirAvzb/Pnyf+WrW9rqKS6hq90vqRaba8eaxVp6krMQEUkEL1JPbq
+cVYFof8Azmp5BupVj1fR9Q0wNsZo/SuY1/1qGN6fJDir2Xyf+Yfkrzjam48taxb6iqgGSKNisyA9
+PUhcLKn+yXFWRYq7FXYq7FXxRrBNj/zl/NVwC+rL8XtcWw+Hf/jJTMXXC8M/6pbMP1h9SZxLtnYq
+7FWG+afzg/LnyvdNZ6vrUSXqGj2sKvcSofB1hV+B/wBamZmHs/NkFxjt8mqWaMeZRPk78zvI/nF5
+ItA1RLm5hHKS1dXhmC1pyEcoRmXputRkdRosuLeQ2TDLGXJCfm/5JXzj5D1HSo05X8a/WtNPcXMI
+JUD/AFxVP9lk+z9R4WUE8jsWOaHFGnl3/OI/lpodN1zzFMlGuJUsLcsKELCPUlpXsWkQfNc2Xbmb
+eMPj+r9LRpI8y+hc0DmuxV2KuxV2Kvl//nClHP5oas4B4Lok6luwLXdqQPpoc9AdK+08VdirsVdi
+rsVdiqXeYPMOi+XtIudY1q7jsdNtF5z3EpooHQAd2ZjsqjcnYYq+VfPf/OV3nXzNqp0D8stPlto5
+mMcF0IfrGoT+8UIDrGD8mbvVcVSqz/5xn/Pjzs66h5t1RbUueX+5W7kurgA/yxx+sq/6pZaeGKsj
+h/5wanMYM3nNUk7qmml1/wCCN0n6sVQt7/zhDr8B56Z5stppEIMZntZLfcb1qkk9KHFXzr5mtdUs
+tfv9O1S5a7vtOuJbKaZndwWt3MZ4mSjcartUDFUsxVFabqeo6XfQ3+m3UtlfW7c4Lq3dopUbxV1I
+IxV9Sfkr/wA5aNcT2+gfmG6K8hWO18wqAi1OwF2q0Vf+Mi0H8w6tir6lVlZQykMrCqsNwQe4xVvF
+XYq+Kfzzro3/ADlLa6oxKJLdaReFiaApGsMLeG1ISMqzw4sco94LKBogvqPOEdw7FXkf55/mBrlj
+Jp3kbykX/wAVeYSFE0Zo8FuzFOSt+wzlW+P9lQx2NDm27N0sZXlyfRFxs+Qj0jmUd5B/IHyP5bsI
+31Oyh1zWnAa6vb1BMnqHciKKSqKAehI5e+Q1XamTIfSeGPlzTj08YjfcsJ/PDy5pXkHX/LH5geW7
+WPTGhvlt9Rt7RBFHKpBk+wgCjnGkiPQbg5m9m5jnhLFM3s1Z4iBEg+hOu4zn3NQOkaLpuj20ltp8
+IghlnnunRe8tzK0sh/4JzQdhtlmXLKZuXdXyYxiByR2VsnYqxjV/zO/L3SJWh1DzDYQzoaPD66PI
+p/ykQsw+kZlY9Dmnyifu+9qOWI6pvoOvaRr+kwato9yt3p1zz9C4UMob03MbbMFOzoR0ynLiljkY
+yFEM4yBFhV1WVYdLvJWJCxwSOxHWioTjhFzA8wsuRfPn/OEVoX83eZLzekOnxQnpSsswb/mVneOn
+fYOKuxV2KuxV2KqF9e2lhZT315KsFpaxtNcTuaKkcYLMzHwAFcVfFHnPzR50/wCchPzJi8veXlaH
+y7aO5sYnqsUUCkK97dU/bYdB2qFXcklV9U/lj+UnlH8u9IWz0a2WS+dQL7VpVBuLhh1q37KV+yg2
+Huakqs1xV2KuxV8v/nf/AM4patrnmG+80eSp4Xn1GR7m/wBIuW9ImdyWd4JSOH7xjUq9KGvxb0Cr
+5/1j8mPzX0iRkvfKepgL9qSC3e5jG9P7yASJ1PjiqRjyb5vMvpDQ9QMtePpi1m5culKca1xVPtG/
+JT82dYdUsvKepUf7MlxA1rGe395cekn44q+zf+cffKv5m+VvJ50bzvPbzRwFf0RFHK01xbxU+KCV
+6cCqmnDizU3FaUAVeo4q7FXx5/zmxpD2vnTy7rcdUN5YPbh12POzmL1qO4FyuKsl/Lz/AJyc8ra2
+sNj5mUaHqZAU3TGtnI3Qnn1ir1o/wj+bOY1XY8474/UO7r+1z8epB2Oz2iKWKaJJYnWSKQBkkQhl
+ZTuCCNiDmnIINFygVGXTNOmvYb6W1hkvbbkLe6eNWljDgq3ByOS1UkGhwjJIDhs0ei0LtE5FLxD/
+AJyycP5F0ezQcp59WjaNdt+NvMp/GQZuuxI/vJH+j+lxNWfSPe9rgiEMEcQNRGoQE9+IpmmlKyS5
+QCpgSsllihieWVxHFGpeR2NFVVFSST0AGEAk0EEvn2fVfOv5269e6foN9Jof5e6fIYbm9QMst2af
+ZIBUtyG4QkKqkFqmgzfiGLRQBkOLKfx+C4ZMspobRZzof/OOv5U6VCiyaUdSnUUa4vZZJGb5opSL
+7kzBydrZ5HY8PuDbHTQDP9G0XStE02HTNJtks9Pt+Xo20Qoi83LtQe7MTmBkyynLikbJboxAFBJv
+zO1Aaf8Al35lu60ZNNuljP8AlvEyJ/wzDL9FDizQH9IfYxymol59/wA4P6S0eg+adXI+G6ura0Vv
+e2jeRgP+kkZ2zqX01irsVdirsVdir50/5zJ/MGbSfK1j5PspOFxrrGa/KmhFpAwon/PWWn0KR3xV
+mf8Azjd+WEPkj8vrae5iA17XES91KQijorrWG333HpI24/mLYq9YxV2KuxV2KuxV2KuxV2KuxV2K
+obUdT03TbR7zUbuGytI/7y4uJFijX5u5VRir5U/5yz/MX8tfNfl7S7DQtZh1LW9NvS5W2V3iFvJG
+yyUnC+kfjVPsscVSv8i/yi/LTzn5Ij1XVLSafU4J5rW9C3EkaFlIdCFQrT926980XaOuy4cnDGqI
+vk5eDDGQsvdvKXkby35StXtdBgmtrZ6Vge6uZ4wf5ljmkkRCe5UCuaPPqp5Tc9/gHLhjEeSN8x3+
+o6foGoX2m2hv9QtoJJbWyFazSKpKxjjv8R22yOCEZTAkaBZTJAsPHv8AlcP53/8Altpv+BuP+ac3
+H8n6X/VPti4vjZP5rzz8wfPP5i+bfNvluw1Dyq1rqWjzG+g0ROZmuRVZDVGHPjxgbcDpXNhpdNiw
+wkYy9Mutj8dWnJOUiAQ9D/5XD+d//ltpv+BuP+ac1/8AJ+l/1T7Yt3jZP5rv+Vw/nf8A+W2m/wCB
+uP8AmnH+T9L/AKp9sV8bJ/NYp+ZX5v8A5qXnli40LVfKbaCutAWkdyxlWRwWXnHGrheRdfhI8DmV
+pNBgE+KMuLh9zXkzTIoirR/kbzf+bvlHy1Y+XtO/LedobYENM6zK0kjtyeRzxoOTH6BtkNTp9Plm
+ZyyfaEwnOIoRej+RPO35o6xr62fmPyf+hdNMTub71C1HWnFaV/azX6rS4IQuE+KXds348kyaIZ7q
+jaqthKdKSCS/pSBbp3jhr4uY1kbbwA38Rmux8PF6r4fJuldbPlv8+YvzstdPS483apafoO7nEEVh
+pcjJbl6NIA0bKkjgenWsnKhpnTdnHTH+7HqHfz+f6nAz8f8AFyfQ3/OLHl06N+TWkyOnCfVpJ9Rm
+Hj6r+nEfphiQ5t3GeuYq7FXYq7FXYq+MfzQhXzz/AM5YWmgz1lsLe7sbB4zvW3gRbi5TvSrNLir7
+OxV2KuxV2KuxV2KuxV2KuxV5j59/5yM/K7yb6kFxqQ1TU0qP0dpvG4cMO0kgIij36hn5e2KvAvMv
+/OWP5p+arl9P8laWukxtXiYIzfXvHpUuy+mg+UdR/NkJ5IwFyIA80xiSaDF/+VT/AJo+b7sah5w1
+h1kavx3sz3k617KgYoo9uYp4ZptR7QYIbRuZ8uXzP7XMx6GcuezJYf8AnH3yrBptwjXFxd6g8LrB
+NIwSNJSpCOEQA7NvRmOak+0eQzGwjCxfU11/FOT/ACfEDnZYH+S+sfmZZeajoHlC8htrq6ZnubC/
+K/VnMAPLkrAtyUdfT+Kg8BnSa7HhMOLINg6/CZA1F9k6KdbOmw/pxbZdTp/pH1IyNAW8U9UK9Pnn
+I5eDi9F8PnzdlG63R2VsmndUUu5CooJZiaAAdSTiBaHhP5N8/On5r+bPzEkBbT7dv0do7EGhWgUM
+tRswgjUsP+LM3vaH7nBDCOZ5/j3/AHOJh9UzJ7vmicx2KvEf+clQLS78i63cEjT9O1cC6O3H4mjl
+FR/qwPm77G3GSPUj9f63E1XQvbQQQCDUHoc0jlN4pSXzN5z8q+V7ZLjX9Tg0+OSvpLK37x+PXhGv
+J3pXfiMuw6bJlNQFsJ5BHmXzJ+dn5haf+Z/mby75e8qtLPbLN6EbyI0YluruRI0oh+KigChIHU50
+/ZmilhieL6i4GoyiZ2fbWh6Ra6Noun6PaClpp1tFaW4/4rgQRr+C5s3HR2KuxV2KuxV2KvjfymCP
++c0p/rdK/pTU+POlKfUp/S/4144q+yMVdirsVdirsVdirsVeQfmX/wA5Ofl55MaaxtZv0/rcdVNl
+ZMDEj+E1x8SL4ELyYdxir5W/Mf8A5yD/ADJ88GSC6vjpmjyVC6VYFoYmQ1FJXr6kte/I8fADFXme
+Kvpj8jdTtb3yJBFFGkdxYyyW9zwVU5MDzRzTqSjipPU1zhvaDHKOosk8Mht5d/6/i7rQSBh5h6Fm
+ic12Kvnvz6l35B/Nqz8z2CEQyzLqMSqeIY143UVf8upr7Pnedl5RqdLwS5gcJ/R9n2uj1MPDyWPe
++wdL1Ky1TTbXUrGQTWd5Ek9vKOjJIoZT9xznMkDCRieYc2JsWisgyYZ+b1p5vvfIGqWPlSFZ9Tu0
+9F1LiN/q77TelXYuV+EAkddt6A5vZ8sccoMzsPv6NOYSMdnzl+Wn5m/mVoKR+RtEtNLsrmGWSsOp
+q1vM87t8Su8ssS+p0UKaGgAGdDqtHhyfvJ2fd3fBwseWUfSHq36V/wCcqf8AqzaN/wAGn/ZRms4N
+B/OP2/qci83c79K/85U/9WbRv+DT/sox4NB/OP2/qW83c8o/Mj8z/wAy/MAm8i6zaaZfXU0sY9HT
+Ea4lSdGqqxvFLKvqbFSBXqQc2el0eHH+8jY2693xcfJllL0l9KflXb+bbXyJpVp5riWLV7aIQsqu
+JGMSbRGUio9ThQNQnx70znNccZyk4+R+9zsIkIi2W5iNqB1xdH/RF2+sxQy6XFE8t4tyiyRelGpZ
+i6uCpAAyzFxcQ4D6ixlVb8nzj/zjB5UtfNn5xal5tisltNE0Rpbu1tEUCOOa6ZktYgBt+7j5tt3U
+Z3UIkRAJt1BO77PySHYq7FXYq7FXYq+M/wAyX/wb/wA5b2WsP+7s7q90+7Zz8NILlEt7htqV3EmK
+vszFXYq7FXYq7FWGfmR+bnkn8vrD6xr16PrkilrXS4KPdTdacY6jitRTmxC++Kvjz80/+clPPvnk
+TWVq50Py45KfULRj6kqntcTjiz1H7K8V8QeuKsQ/KyLyvP5wtbTzFbC4trn91bc2IjW4JBj9QAjk
+G+zQ7VIrmB2mcowE4jUh93Vv0wiZgS5Po7zD5J8ta/pa6bf2UfoQrxtWiAjeDbb0io+Hp06eIzht
+N2jmwz4oyu+d7373dZNPCYoh8/effyj17yuZLu3B1DRgSRdRr8cS9f3yD7P+sPh+XTOz7P7Wxajb
+6Z936u90+fSyx78wnP8Azj5r4s/M11o8jUi1OHlED/v63qwA+cbP92YvtDp+PCJjnA/Ydv1NugyV
+Ou99C5xDuWDeefKvnzV9WiufL+v/AKKskt1jkt+Ui8pQ7sX+AEbqyj6M3XZ2t02LGRlhxyvnQO23
+e4eow5JSuJoe8sD81/lL+ZF9pj3Go65Hq7WKPLBbMZGc7VZY+S9WC9O+bnSdsaQTEYQ4OLyAHxou
+Jl0mWrJuvel/5Q/8rK80ySeXdA85S6P9Qh9W2spZ51RouXx+kEDD4CwqPfbvmz1pw4xxzhxX5Bxc
+XFLYGnv35Y+RfzR0DXri881+af03p0lq8MVp6s0nGZpI2WSkiqNkRh9OaLW6rBkgBjjwm+4D7nMx
+Y5g7m3p2axyGGfmF+U3k/wA82pGq23paii8bfVIAFuEpWgLU+NN/st9FDvmZpddkwnbePc1ZMMZ+
+95R/iv8AMz8lbm20/wAzMPMvk2Z/Ssr5XpcIBvxXmSwKr/ut6r2Vxm28HDrAZQ9OTr+P0uNxzxbH
+cNSeb/zJ/Om9uNM8pk+XPJ0Lelf6g7D13DD7L8DyJZf91oafzNTEYMOjAlP1ZOn7P1qZyymhsHrH
+5d/lN5R8i2gXS7f1tRdaXGqTgNcPXqAeiJ/kr9NTvmq1euyZjvtHucjHhEPezPMJuePedvy3/OXV
+fNF/qGg+c/0ZpM7KbWx9a4X0wI1VhxRSoqwJ2zc6fWaaMAJQuXuDizxZCbB2eNfm7F+Z3lQQaDr3
+nKXV21SJmm0+GedgIQwCmVXC7OwIUd6HNtopYcvrhDhrrQcbKJR2JeieSv8AnHD8+9H0SJtG83Q+
+XlvlS5udPinuonSR0Hwy+nHxLqPhO5zYtD2r8mvJH5m+V/0x/jjzN/iL659W/R/76eb0PS9X1f75
+Vpz5p08MVel4q7FXYq7FXYq+Xv8AnNjya81joXnG3Sv1Vm0y/YCp4SEy25PgquJB82GKva/yY87J
+5z/LXRNbaTneNALfUfEXVv8Au5SR25leY9mGKs2xV2KrZJI4o2kkYJGgLO7EBVUCpJJ6AYq+aPzm
+/wCctrTTWn0L8vmjvL1ax3GvOA9vEehFsh2lYH9tvg8A1cVeMfl95AvPzCvLrzP5l1SW6iNwUueT
+tJdTyqqsQ7tXgvFgPGmwp1zS9rdrflqjEXMj4OZpdL4m5Oz3O18seXrXSP0PDp0C6ZSjWhjVkb3c
+NXk3ud842etzSyeIZHi73bDDAR4a2eaeb/yBsLlmvPK9x9QuQeX1OYs0JPX4JN3j/EfLN9ovaIj0
+5hfmP0j9XycLNoBzh8noHku+1y50OKLXrV7XWLT9xeB6FZGUCkyOvwsHG549DUds03aOLHHJxYiD
+jluPLy8v1OXp5SMakPUE9IBBBFQdiDmCDTe841/8pLaHW7bzL5U42OqWkyzvYfZt5+JqyrT+6LrV
+f5fl1zoNL21xQOLPvGQri6j39/3+9wMujo8UOY6PSB06U9s54uewnzt5H8z69qsV5pXme60W3jgW
+F7WAyhWcO7GQ+nLGKkMB07Zt9BrsGGBjkxiZvnt5d7iZ8M5m4ypj/wDyqbz9/wBT/f8A/BXP/ZRm
+d/K+k/1CPyj+pp/K5f55+15z518keZ/y91G01W01SZ2nLiPVrYyW8qTMDzQurFgXQnfl8Qrm90Pa
+GLVxIrl/CXCz4JYiHv8A+Qeia/NDH5tufO155k0u+s3gGm3Tzt9XufUjZuQkmlUPHwZdh0NQaHfV
+9qTgP3YgIyB57bhv04PO7eyZp3KYZ+afm/zN5Z0KGby5okmtanezC1gVAXSF3UlXkRPjYbdqDxYd
+83Q6eGWR45cIG7TmmYjYMC8p/kVrGu6ovmj81b1tV1Njyi0YODBEOoWQp8FB/vuP4fEtXM7P2nGE
+eDAKHf8Aj7y1QwEm5orzX+Rd9pepP5n/ACuvm0HWlq0mlhqWc46lFBqqV/kYFP8AVyODtMSHBnHF
+Hv8Ax9/NM8BBuGxZB+VP5j+ZPMs9/ovmbQJ9J13R1Q3s3ErbPzNEoGPJWehIA5KQKhu2Ua7RwxgT
+hK4yZYcplsRuHo2a1yHh35u+SvN1nNrXnD/lYl/omiIFli0yB7gBSEVFiiC3EacpHGwAG5zd6HPi
+lw4/DEpd+3z5OJmhIXLi2eW/lJ+UXnn829Svtdl1ue0XTjGo127MtzM9ytDHHG5dXrGg5E8vh+Hx
+zo4QERQFBwSSeb2z/oXX86P/AC8Gq/8AI2+/7Kskh6L+UP5dedPJv6W/xN5wu/Nf1/6v9U+tvO/1
+f0fV9Th68s3956i1pT7OKvRcVdirsVdirsVY/wCf/J9l5x8nar5bvKLFqMDRpKRX05R8UUlP8iRV
+b6MVfLf/ADiz50vvJX5han+XXmGtsmoztDHE/SLU4Dw4jt++Qca9yEpir7ExVK/MnmbQvLOjXGs6
+5eR2Om2q8pZ5TT5KoG7M3RVUVJ6Yq+M/zS/PHzr+bWrnyv5Vt5rPy67fDZoaS3CqaerduDRU/wAi
+vEd+RplWbNDFEymaiGUIGRoc0Nc/846uugI1vqXPX1BaRGFLVtv7tTTmtP5z18BnOw9pInLRj+77
++vv/AB9rsD2eeHY+pV/Io6rofmDWPK2rwSWlzJEl3FBIKCsbem5UjZuYddxUHjke34xy4YZYGwDW
+3n/YuhJjMxL2rOSdq7FXYq7FXYq7FXYq7FUt8w6Bp2v6Pc6VqCc7a5XiSPtIw3V0J6Mp3GZGl1M8
+GQTjzH2+TXlxicaLxryB5w1r8nPPM+i63yl8v3rKbrgCVKE0ju4V8R0ZR13HUDO3ywx67CJw59P1
+H8ebpgZYZ0X1xZXlpfWkN5ZyrPa3CLLBNGQyOjiqspHUEZzE4mJo8w54N7q2RS7FXYq73xVTuLi3
+treS4uJFht4VMk00hCoiKKszMdgAOpwxiSaHNBNPlfzv5j8wfnh+Yll5O8qBhoVtKTFKwIQqvwzX
+047IgNEB33p9p6Z13Z2iGGNn6zz/AFOtz5eM+T7B8j+TdG8m+V7Hy7o8fCzso+Jc/blkO8ksh7s7
+bn7htTNi0J9irsVdirsVdirsVdirsVfLP/OXf5WXENxb/mXoKNHNCY4tbMNVdWQhbe7BG9RtGx/1
+PfFWefl3/wA5I+VdQ/KqTzN5mu0ttV0YLbavarT1Z7gqfSaCPbl9YCkgdFIb9la4q+cvNPm3z/8A
+nr5uCUNnolo1YLRSxtrOIkgSSdPUmYd+p7cV6Yms1mPTw4pn3DqW3FhlkNB695O8l6J5U00Wemx/
+vHAN1duB6szDux8B2XoM4LXdoZNTK5cug7vx3u7w4I4xQT/MFvUJbGzluYbqSFGubfl6ExA5oHFG
+AbrQjqMsjmkImIPplzDEwBIPUNahew2Nhc3s54wWsTzSt4JGpZj9wxw4zOYiP4iB81nLhBPc8w/J
+Tzn5v8y3mqHV7oXFlaIhjHpojLJKxIAZQtQFQ9a50XbujwYYRMI8MifsH4DgaLNOZNmwHq+cy7F2
+KuxV2KuxV2KuxVjXnzyLpnm/SDZ3P7m7hq9leAVaJyO/ijftL/EDNj2d2jLTTsbxPMfjq4+o04yD
+zeb/AJZ/mj5g/KrXZPKnmyKSTQS9QFq5t+Z/v7c/txP1ZR8x8VQet1Gmx6vGMmM+r8bF1UJyxS4Z
+PqrTNT0/VLCDUNOuI7qyuVDwXETBkZT3BGczkxygeGQohzgQRYRWRZOxVSurq2tLaW6upUgtoVLz
+TSMEREUVLMxoABhjEyNDcoJp8v8A5n/mrr/5n65D5E8hQTTadcy+kxQcZL1lNeTV+xbpTl8VNvia
+nTOp7O7OGL1S+v7v2uvz5+LYcn0j+SX5N6V+Wvlv6uCl1r96FfV9RUGjMKlYoq7iKOu38x+I+A2z
+jPR8VdirsVdirsVdirsVdirsVSDz3rvlfQ/KWp6h5oaMaGsDx3kUgDCZJFK+iqEjm0leIXvir81d
+SfTpdTupdPhkt9MedzawyMJJI4WYmNGeihmCbV74q+q/y8tfLEHlOyPlsV06VefqGnqvJ0czH/fl
+RQ+HQbUzzrtWeY5z4v1D5V5eTv8ATCAgOFkma5yHYq7FWIfm3qBsfy81mRftSxLbge08ixN/wrHN
+r2Jj4tVHys/Z+txdZKsZSD/nH3TRb+S5rwj4767kYH/IjVYwP+CDZm+0mQnNGPQR+/8AAauz4+gn
+zenZzrnuxV2KuxV2KuxV2KuxVjnnbyLovm3Tfqt+np3MYJtL1APUiY+Feqn9pe/zocz9B2jk00rj
+vHqPx1aM+njkG/N4/ovmf8xfyX1w2rr9b0W4fkbVyxtLgDq8T0Jikp12r4gimdkPA12PiHP7R7/x
+7nUETwyovpX8vvzc8m+eLZf0ZdCDUgKzaVcEJcKR1KitJF/ykr70O2aHVaDJhO4uPf8Ajk5ePNGX
+vTXzl578seTtMOoa9eLboa+hAPimmYfsxRjdj+A7kZVp9LPMaiP1Mp5BEbvmXzJ54/Mb87vMcflj
+y1ZyQ6SzhksENFCKf96L2YbcV60+yDQAM1Cep0eghgF85d/6nX5cxn7n1H+S35IaB+Wmkkxlb3zD
+eIo1LVGHyJhgrukQbfxbqewGe0vSsVdirsVdirsVdirsVdirsVQup6np+l6fc6jqNwlrY2kbTXNx
+KeKJGgqzMfYYq+HfzQ/MTzL+dvnmHSNFR4PLtm7fo+2eoUIKh7y5pX42BoB+yPhG5JajU6mGGBnM
+7BnjxmZoPQ4Pyv8AK8fk1vK5i5W8g5yXVAJjcU2nr/MO3am3TOGl2xmOfxfs6V3ft73dDSQ4OH7X
+kehaz5g/KfzbLpWqK0+jXLB5VQfDJGaqlxDU7MKfEv0HsR0uowYu0MAlA+ocvI9x/HmHXY5ywTo8
+n0Fp2o2OpWMN9YzLcWlwoeGZDUEH/Pcds4jNhljkYyFSDuYTEhY5KzTQoaPIqnwJAOCOOR3AKmQH
+VyzQueKyKx8AQTiccgLIKiQPV5t/zkDctD5FijHS5voYm37BJJP1x5vPZwf4Qf6h+8OH2h/dj3p3
++UNt9X/LnRkoQXjklNRQ/vJnf9TbZjdtyvVT+H3Bs0Y/dBmOalynYq7FXYq7FXYq7FXYq7FUHq+j
+6ZrFhLYanbJdWkwo8Tjb2II3Vh2I3GXYNRPFLigaLCeMSFF4R50/JTXdCnOq+VpJby1ib1FjjJF5
+ARuCvGhenYr8Xt3zstB25jzenJ6Z/Yf1fF1OfRShvHcJFJ5F/M7zRY3PmTUI7m8eKMFHvZHa6mRe
+0SvV2CjcdK/s1OZsu0NNimMVgHy5D39zQMGSQ4qfTP8AziV518hXnlX/AA3p1lBpPmi0XnqUIr6l
+6F2+sq7lnfr8SV+A9AFIzYtD6BxV2KuxV2KuxV2KuxV2KuxV2KvjX/nI7847/wA+eYk/L/ye7XGj
+QTiO4kgNRfXSnswNDBEeh6Egt0CnIZMkYRMpGgExiSaDJvy88h2PlDRRbJxl1G4o9/dAfbcDZVPX
+gn7P3988/wC0+0Zamd8oDkP0+93um04xx82vOP5meVvKoMV7OZ7+lVsLejy+3PcKg/1j8q4dF2Tm
+1G4HDDvP6O9c2qhj25l47r/mfzt+ak6aXovlxrmO3f1I47SF7meOuxLzAURT32UZ1/Z/ZcNNdEkn
+n3fJ1OfUnJzDFvNXl7z35Lu/8P8AmCG60uQoLhbNpaxMsg+2nps0TVpQkHqKHcZseEXdbtFsbySH
+Yqu9ST0/T5H068uFTx5UpWnjir2HyZ+T/wCfGr+U9O1/yreSS6VdKzWkEOo+iQI5HRlMcjxoPjjI
+pXKMmmxT+qMT7wGcckhyJCOudA/5yq0IfvtM1G4VDuscNvqFadqwidj07HMXJ2Tpp84D4bfc2x1W
+QdUvl/Oj8y9CmEPmHQ0iPQpc209pKT1/aNP+FzCyezunly4o/H9bbHX5Bzop1pv/ADkboslBqWkX
+FsfG3dJx8/j9HNfl9mZfwTB94r9bkR7RHUMv0r82/wAvtSoserx28ndLoNb0/wBlIFT7mzWZuxdT
+D+HiHlv9nP7HIhrMcutMst7i3uIlmt5Umib7MkbBlPyIqM1s8coGpAg+bkxkDuFTIJdirsVdirsV
+dirH/PXm608q+XZ9Umo8391ZwH/dk7A8V+Qpyb2GZ/Z2iOoyiP8AD19zRqMwxxvq+cfL9n+Yf19/
+Omi29ytzYytfnU41CgPyLOyhqCTqeSqDt1FM7+WoxYyIGQBOwDoxjlIE0+1/yK/O7S/zJ0IpP6dp
+5nsVA1LT1OzrsPrEAO5jYncdVOx/ZJyGt6jirsVdirsVdirsVdirsVfO/wDzlT+dh8vaa/kfQJ6a
+7qUf+5S4jPxWtrINoxTpJMD8wm/7SnFWA/k3+W48v6eNZ1OL/c1ep8EbDe3hbfhQ9Hbq3h08a8V2
+52n4svCgfRHn5n9Q/HR3Gi03COI8yl/5qfm5LYTt5d8sP6mqM3pXd3GOZiY7elFStZa9T+z0+10v
+7I7G4gMmUbdI/pP6mGr1demPzZX+UH/OJcl6I/MP5lNKZJj6sehB2EjV35XkoPKp68FNfFuq51wF
+OqfT2j6Jo+i2Een6RZQafYxf3dtbRrFGPfigAqe5xVj35mflh5Y/MLy++k61CBKgLWGoIB69tKf2
+o2PY0HJejD6CFXwV+Z35WeaPy715tL1qHlbyFmsNRjB9C4jBoGU/st/Mh3X5UJVYdirsVfb3/OHX
+mKPUfyrfSS9Z9EvpovTrUiK4/wBIRvYM7yD6MVe7YqsmhhniaKaNZYnFHjcBlI8CDtirDde/JX8q
+Ne5HUvK1g0j15zQRC1lJPcyW/pOT9OKvMfMn/OF/5eXwZ9D1K+0aY/ZRit3AP9g/CT/krirzTVv+
+cTvzh8tSPdeVNVh1EDoLS4exuWp4rIVj/wCSpyGTHGYqQBHmmMiNwxq58/fnT5ImW382aVMYgeIO
+oWzRch0pHcRhUfp1+LNVn7C02TcDhPl+rk5UNbkj1tlGgf8AOQHlS94x6rBNpUx6uR68P/BIOf8A
+wmaPUezmWO+MiX2H9X2uZj7QifqFPRNK1vR9Wg9fTL2G9iHVoHV6V7NQ7H2OaTPpsmI1OJi5sMkZ
+cjaNyhm7FXYqlGq+VNC1fULe91S2F69opW2hn+OFCxqzekfhLGg3avTbMzDrsuKBhA8N8yOfz/U0
+zwRlKzumyqqqFUAKBQKNgAO2YhJJttp84edta0nyl+Y0Gu+Qr/0NQtH9W4WAfuI5wfiRSDxdJBUO
+lOPUd6D0PsqWc4R4w36d5Hm6HUiAn6H2P+TH5xaN+ZXlwXcIW11u0ATVdM5VMbnpJHXcxP8Asnt0
+PTNk470PFXYq7FXYq7FXYqwf84fzP078uvJtxrU/GXUJawaTZMf765YbVA34IPic+G3UjFXyR+U/
+lPUvNnmK589+ZXa65XDzRPKB/pF2Wq0h7cIz0AFK7D7NM5/tztLwo+HA+uXPyH6z+OjnaLT8R4jy
+DOPzf89t5Y8v+hZScdX1HlHbEdY0A/eS/MVovufbNJ2J2f4+TikPRD7T3fr/AGubrM/BGhzKf/8A
+OK/5HQWtjb/mF5ltxLqV3+90K2mBPoxHpdMD1kk6x+C/F1O3dukfTGKuxV2KpL5v8neXfN+hz6J5
+gs0vLCffi2zxuPsyROPiR17EfqxV8N/nR/zj/wCZfy5umvYeep+VpXpb6mq/FFyPwx3Kj7Ddg32W
+7UO2KvKcVeu/84z/AJoQeRvPwi1KX0tC11Vs7+RjRIpA1YJ29kZipJ6KxPbFX3sCCKjcHocVbxV2
+KuxV2Kqc9vBcQvBcRrNDIOMkUihlYHsVNQcVeX+cP+cZ/wAovM3OQ6QNIvH/AOPrSmFsQf8AjDRo
+D/yLrirw/wA0f84fef8AQZ21DyRrKal6dTHEWNhejwVH5GJvmXT5ZGURIURYSCRyYf8A8rL/ADW8
+jXo03zjpUslK8Y7+JreVlXasU6rxdf8AKo3zzT6rsHBk3j6D5cvl+qnLx62cee7P/LX5zeSdbKxS
+XJ0y7bb0byiKT/kygmP5VIPtnO6rsLPi3iOOPlz+X6rc/HrYS57FnSsrKGUhlIqCNwRmmIINFywW
+8CWLebfLnmTzCG0+PVV0jRm2n+rK0lzOpG6s7FFjXtRa17nembXRavBp/VwmeTz2A93P5uLmxTnt
+dRSjR/yO8g6cVea2l1GVTUPdyEiv+pH6aEfMHL83tBqJ/TUfcP12whocY57sS80+XfMH5YeaLfz3
+5JdorSKStxbAExxBz8UUigjlbydP8n58Tm97H7WGccE/7wf7L9vf8/dhavS8BsfT9z6x/Kf81NB/
+MbyzHq2nEQXsVI9U0xmDSW03genJHpVHpuPAggb1wmbYq7FXYq7FVK6ure0tprq5lWG2gRpZ5nIV
+ERByZmJ2AAFTir4W89eZtV/PD81xHas8Xlyw5RWXb0bJGHqTsDt6s7U/4Vei1zE12rjp8Rmfh5lt
+w4jOVB7Zp2n2enWMFjZxiG1tkWKGMdAqig655xmyyyTM5G5F6CEREUOTxPS9Gb81/wA/YNJlLNo1
+tMUuKbUsrEky0I6es9QD25jPQ+zNL4OCMevM+8/inQ6nJxzJfdcUUUUSRRIscUahY41AVVVRQAAb
+AAZntC/FXYq7FXYqo3dnaXtrLaXkKXFrOpjnglUOjowoVZWqCD74q+T/AM7f+cTri0a48wfl7E09
+pvJdeX6lpY+5NqTu6/8AFZ+Ifs16BV8xyRyRSNHIpSRCVdGBDBgaEEHoRiqLv9b1nUEjS/v7m7SF
+VjhWeV5QiIOKqocmgUbADFU/8k/mp588l38N1oOrzwxREcrCR2ktJFH7MkDHgRTaoow7EYq/Qb8v
+POFv5y8laR5mt4/RXUoBI8NeXpyqxjlQNtULIjCuKsixV2KuxV2KuxVB6rpGlavZSWGq2cF/ZS7S
+W1zGssbfNHBGKvD/AD5/zh75B1r1Lny1PL5cvmqREtbizY/8YnYOlT/K9B/LirxDWPy7/Pr8pmea
+GKW90OI8nuLOt5ZcQakvERzhHixVfnmJqdDhzj1xvz6/Ntx5pw5FNvKv/OQWi3fCDzDbNp0/Q3UI
+aWAmnUqKyJv2+L55zWr9nJDfEeLyPP58vudhi7QB2kKepWGo6fqNst1YXMd1bP8AZmhcOp+lSc57
+LhnjPDMGJ83YRmJCwbROVMlk0MU8LwzIJIZVKSRsKqysKEEHqCMlCZiQRsQggEUXiepWHmf8m/OM
+PnDyiS+jSH07i3erxhHYFrafuY2oOD9QadwCe77J7UGojwy2yD7fN0mq0xxmx9L7C/Lr8wvL/n3y
+zBr+iyExSfBc2z/3tvOAC8Ug8RXY9CNxm5cRk+KuxV2Kvm7/AJzA/NOTTNHg8haVKRf6ugn1ZkJ5
+JacqJDt3mdTyH8op0bFUg/KjyOvlfy2n1iMDVr8LNfsaVXb4Ia/8Vg7/AOVXOB7Z1/j5aH0R5fpL
+vNJg4I2eZZRr1/8Ao/Q9Rv8A/lktZp/+RUZf+Ga7SwE8sInkZAfa35ZVEnyYp/zg/o0Ump+atccV
+mghtbKJu/Gd3ll/GBM9PecfWeKuxV2KuxV2KuxV2KvOfPf5Aflj521UatrGmtHqRFJ7m0kMDTdKG
+Xjs7CmzUr+GKsb/6FD/Jv/lmvv8ApLb+mKu/6FD/ACb/AOWa+/6S2/pir0/yZ5Q0byf5as/LmirI
+mmWPqfV1lcyOPWleZ6sevxyHFU7xV2KuxV2KuxV2KuxV2KvMfzC/5x1/LLzr6lzcaf8AovVn3/Se
+ncYJGbrWSOhikr3LLy9xir5080f846/nH+XVzJqnlK6k1nT1NTLpwYXHFenrWR58/kvMZTmwQyx4
+ZgSDKEzE2DSH8r/85ABZRZea7IwSoeD3lup+FgaH1YT8Qp34/wDA5zes9nBzwn4H9B/X83Y4u0Ok
+w9b0nWdK1e0W80y7iu7ZukkTBgD4Hup9jvnM59PkxS4ZgxLsYZIyFg2q31jaX9pNZ3kKz2s6lJoX
+FVZT2ORxZZY5CUTUgmURIUeTxy2svzN/KLzbcaj5Eil1DS9RRkNuIZLqMqDVUnij35Rk/A+3z3YZ
+3Wg7YxZYXOQhMc7NfK/wHS59JKMthYZVB/zlL+eWlMZNc8owTWiEmRzaXlsaClaS83jp/sTmxx6r
+FM1GUZe4guPLHIcwQ9C8jf8AOYH5ea7NFaa9bzeW7uUhRLMwns+RNADOgVl+bxhR3OXsHulvcW9z
+BHcW0qTW8yh4Zo2Do6MKqysKggjoRir849U/MZtX/M6688azZnUTNdNcxWTSekFVPhtk5cZPhhVV
+FKb0yjU4pZMZjE8JPVnjkIyBItnP/Qyn/fuf9Pv/AF4zm/8AQx/tn+x/487D+Uv6P2/sQWuf85A/
+pXRNQ0z9A+j9etprb1vrfLh60ZTlx9Fa05VpXLcHs74eSM+O+Eg/T3f5zGev4okcPPz/AGPU/wDn
+B7UUbTvNmmkgPFNaXCjuRIsqH7vTH350zrn1DirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV
+dirsVdirsVdirBPzB/JP8uvPivJremKmpFaJqtofQul2oKuopJTsJFYYq+afOP8AzjN+afkK7fWP
+JF7LrNjGeX+iVjvVUb0ktqlZh/qcq/yjK8uKGSPDIAjzZRkYmwl/lf8AP1opf0f5vsmgnjb05LyB
+CCrA0PqwH4lI78f+BzmtZ7OA74T8D+g/r+bsMPaHSfzet6TrOlavZreaZdR3ds3SSJgwB8D3B9jv
+nMZ9PkxS4ZgxLsoZIyFg2jMpZsJ87flR5Z8zxSTLCthqxBKX0Kgcm/4uQUEg9/te+bjQds5cBAke
+KHcf0H8BxM+kjPlsWPfkJ+aPmL8t/PS+QfNEjHQbycWyo7FktbiZh6U8LH/dMpYcxsN+WxBr3OHN
+HLATibiXSzgYmjzfWP8AyrzyB/1LOlf9INt/zRlrF3/KvPIH/Us6V/0g23/NGKu/5V55A/6lnSv+
+kG2/5oxVHaV5Z8uaRJJJpOlWenySgLK9rbxQMyg1AYxqtRiqZYq7FXYq7FXYq7FXYq7FXYq7FXYq
+7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqwT8xvyU/L/AM/xFtbsBHqQXjFq1pSG6XsKuARIB2EisB2x
+V856t/ziZ+bHl/VpT5M1qO4sZhtcpcPYT0B2SVFJBp4hj8hleTFCYqQEh5i2UZGPI0of9C+f85Nf
+9XeT/uLS/wDNWUfkNP8A6nD/AEo/Uz8ef84/N3/Qvn/OTX/V3k/7i0v/ADVj+Q0/+pw/0o/Uvjz/
+AJx+aX3n/OK/576ldpcalLBdTgKguLi/MzqoNQAzVagqTTMjHijAVECI8tmEpEmybf/Z</xapGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xap:Thumbnails>
+ </rdf:Description>
+
+ <rdf:Description
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ </rdf:Description>
+
+<cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></svg:metadata></x:xmpmeta>
+ <xpacket />
+ </svg:metadata>
+ <svg:switch
+ id="switch6">
+ <svg:foreignObject
+ requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/"
+ x="0"
+ y="0"
+ width="1"
+ height="1"
+ id="foreignObject8">
+ <i:pgfRef
+ xlink:href="#adobe_illustrator_pgf">
+ </i:pgfRef>
+ </svg:foreignObject>
+ <svg:g
+ i:extraneous="self"
+ id="g10">
+ <svg:g
+ id="colors"
+ i:layer="yes"
+ i:dimmedPercent="3"
+ i:rgbTrio="#4F00FFFF4F00">
+ <svg:path
+ i:knockout="Off"
+ fill="#F8DC75"
+ d="M237.682,33.617c-0.019-5.071,0.402-24.5-2.5-30.4 c-7.869,2.99-19.189,11.68-22.431,21.588c-15.532-2.32-35.042-2.045-50.381,0.608C159.808,14.753,147.946,7.596,138.243,3 c-4.093,6.907-3.906,19.92-3.445,31.279c-0.018,0.013-0.037,0.024-0.054,0.037c1.8,47.7,22.2,74.399,52.799,92.399 c31.481-17.988,50.972-49.057,50.101-93.12C237.656,33.603,237.67,33.609,237.682,33.617z M216.485,25.421 c0.114,0.021,0.229,0.042,0.344,0.064C216.715,25.463,216.601,25.441,216.485,25.421z M214.527,25.083 c0.275,0.044,0.554,0.094,0.83,0.141C215.081,25.177,214.805,25.129,214.527,25.083z"
+ id="path13" />
+ <svg:path
+ i:knockout="Off"
+ fill="#D2A41F"
+ d="M91.013,133.328c46.474,4.115,90.927,22.883,141.085,49.085h25.598l0.361,0.191 c0.516-2.575-1.888-6.025-4.752-9.229c-4.941-5.528-11.623-6.145-19.707-5.951c-5.738-6.83-41.004-43.861-41.004-43.861 l-4.808,3.395c-38.75-21.75-49.155-62.513-49.155-62.513c-33.792,8.148-69.78,28.334-90.391,49.761l-3.118,3.292 c-1.489,1.597-2.928,3.174-4.312,4.723C18.967,146.661,3,170.87,3,175.213v2.25h23.816l-0.505-0.668 c-2.449-12.943,4.443-23.341,10.279-30.385c4.179-5.044,11.1-9.801,21.968-12.457L91.013,133.328z"
+ id="path15" />
+ </svg:g>
+ <svg:g
+ id="tomcat"
+ i:layer="yes"
+ i:dimmedPercent="3"
+ i:rgbTrio="#4F00FFFF4F00">
+ <svg:path
+ i:knockout="Off"
+ d="M240.682,32.617c-0.019-5.071-1.598-26.5-4.5-32.4c-7.869,2.99-22.189,12.68-25.431,22.588 c-15.532-2.32-33.042-2.045-48.381,0.608C159.808,12.753,146.946,4.596,137.243,0c-4.093,6.907-5.906,22.92-5.445,34.279 c-0.018,0.013-0.037,0.024-0.054,0.037c1.8,47.7,25.2,77.399,55.799,95.399c31.481-17.988,53.972-53.057,53.101-97.12 C240.656,32.603,240.67,32.609,240.682,32.617z M214.485,23.421c0.114,0.021,0.229,0.042,0.344,0.064 C214.715,23.463,214.601,23.441,214.485,23.421z M212.527,23.083c0.275,0.044,0.554,0.094,0.83,0.141 C213.081,23.177,212.805,23.129,212.527,23.083z M235.784,36.059c0.81,39.69-19.44,71.279-47.79,87.48 c-48.118-23.977-57.183-84.71-48.977-117.289c2.283,12.454,6.424,20.266,15.394,24.098c19.533-5.591,46.423-6.033,66.231-0.57 c8.255-6.001,11.456-15.169,13.204-23.18C236.029,15.921,235.777,36.055,235.784,36.059z"
+ id="path18" />
+ <svg:g
+ id="g20">
+ <svg:rect
+ x="133.209"
+ y="90.51"
+ i:knockout="Off"
+ width="26.245"
+ height="3.239"
+ id="rect22" />
+ <svg:rect
+ x="133.209"
+ y="82.732"
+ i:knockout="Off"
+ width="26.245"
+ height="3.24"
+ id="rect24" />
+ <svg:rect
+ x="213.35"
+ y="90.51"
+ i:knockout="Off"
+ width="26.244"
+ height="3.239"
+ id="rect26" />
+ <svg:rect
+ x="213.35"
+ y="82.732"
+ i:knockout="Off"
+ width="26.244"
+ height="3.24"
+ id="rect28" />
+ <svg:g
+ id="g30">
+ <svg:path
+ i:knockout="Off"
+ d="M204.1,63.524h-27.188h-3.021h-12.561v-2.917h13.31c1.639-7.018,1.963-13.725-0.014-17.125 c-0.844-1.446-2.01-2.121-3.674-2.121c-7.609,0-10.753,8.046-10.884,8.389l0.002-0.003l-2.73-1.024 c0.156-0.42,3.965-10.278,13.612-10.278c2.692,0,4.834,1.235,6.191,3.57c2.41,4.141,2.127,11.305,0.494,18.592l23.354,0 c3.103-9.116,9.581-13.414,20.405-13.414v2.916c-11.732,0-15.019,4.973-17.366,10.498l12.743,0l-0.029,2.901L204.1,63.524z"
+ id="path32" />
+ <svg:path
+ i:knockout="Off"
+ d="M206.017,77.925l0.019-0.003c-3.459-5.101-4.555-9.456-3.108-14.413l-2.971,0.015 c-1.035,3.3-0.62,8.273,1.929,12.54H172.21c1.806-3.616,3.479-8.025,4.702-12.54h-3.021 c-1.348,4.786-3.241,9.524-5.372,13.277l-0.689,1.213l16.652,10.482l-9.375,6.178l1.605,2.436l10.479-6.908l11.312,7.382 l1.554-2.468l-10.488-6.488c0,0,15.682-10.187,16.461-10.684C206.024,77.937,206.021,77.931,206.017,77.925z M187.156,86.733 l-12.317-7.755l24.071,0.006L187.156,86.733z"
+ id="path34" />
+ </svg:g>
+ </svg:g>
+ <svg:polygon
+ i:knockout="Off"
+ points="114.745,73.635 122.087,95.391 99.788,80.434 "
+ id="polygon36" />
+ <svg:polygon
+ i:knockout="Off"
+ points="93.261,83.153 101.147,96.75 84.559,88.32 "
+ id="polygon38" />
+ <svg:polygon
+ i:knockout="Off"
+ points="75.313,93.759 79.12,107.356 67.699,99.47 "
+ id="polygon40" />
+ <svg:polygon
+ i:knockout="Off"
+ points="196.871,130.199 189.801,141.077 202.31,135.366 "
+ id="polygon42" />
+ <svg:polygon
+ i:knockout="Off"
+ points="208.021,142.709 196.6,151.411 212.372,147.332 "
+ id="polygon44" />
+ <svg:polygon
+ i:knockout="Off"
+ points="180.282,24.686 188.713,43.178 194.151,24.414 "
+ id="polygon46" />
+ <svg:polygon
+ i:knockout="Off"
+ points="137.588,51.608 150.913,58.678 138.947,59.494 "
+ id="polygon48" />
+ <svg:polygon
+ i:knockout="Off"
+ points="140.851,66.021 149.009,69.284 142.211,71.188 "
+ id="polygon50" />
+ <svg:polygon
+ i:knockout="Off"
+ points="236.031,56.775 225.153,61.398 234.127,62.757 "
+ id="polygon52" />
+ <svg:polygon
+ i:knockout="Off"
+ points="231.68,70.1 223.25,72.548 230.048,74.995 "
+ id="polygon54" />
+ <svg:path
+ i:knockout="Off"
+ d="M256.305,173.375c-4.941-5.528-14.623-8.145-22.707-7.951c-5.738-6.83-39.004-41.861-39.004-41.861 l-2.306,2.903l40.162,43.238l1.743-0.149c10.912-0.935,17.115,4.983,18.757,6.819c1.204,1.347,1.931,2.575,2.326,3.539h-22.075 c-50.624-26.416-95.078-45.044-142.297-49.112c0.104-6.571,1.273-14.01,3.518-22.299l-4.343-1.177 c-2.308,8.521-3.523,16.236-3.661,23.133c-4.92-0.326-9.872-0.495-14.868-0.495c-4.237,0-8.095,0.394-11.614,1.077 c-4.59-4.587-8.5-8.959-11.823-13.108c21.936-22.85,58.15-43.498,89.533-51.092l-1.015-4.396 c-33.792,8.148-70.78,30.334-91.391,51.761c-9.565-12.91-13.36-23.504-14.487-31.532c-1.424-10.14,0.997-19.441,6.999-26.899 C47.15,44.099,60.502,43.277,74.23,45.586c-0.268,2.167,0.017,4.24,0.885,5.522c3.631,5.363,23.144,7.246,34.791,2.049 c-8.595-12.045-26.006-17.926-30.83-15.569c-1.598,0.781-2.804,2.214-3.63,3.886c-4.745-0.849-9.458-1.48-12.903-1.455 c-12.107,0.088-21.363,4.319-28.296,12.932c-6.802,8.451-9.551,18.944-7.95,30.347c1.516,10.8,6.863,22.286,15.825,34.198 c-1.489,1.597-2.928,3.174-4.312,4.723C15.967,146.661,0,172.87,0,177.213v2.25h28.816l-0.505-2.668 c-1.627-8.601,1.623-19.351,8.279-27.385c4.179-5.044,11.1-10.801,21.968-13.457c9.663,9.431,21.975,19.446,35.679,29.109 h21.414v-2.25c0-2.539-1.259-4.762-3.545-6.257c-3.383-2.212-8.605-2.517-13.402-0.881c-4.573-5.093-7.137-11.896-7.691-20.347 c46.474,4.115,90.927,22.883,141.085,49.085h27.598l0.361-1.809C260.572,180.029,259.169,176.579,256.305,173.375z M33.125,146.539c-6.816,8.227-10.429,19.094-9.601,28.424H5.372c3.647-7.894,18.176-30.712,39.644-53.76 c2.958,3.656,6.253,7.35,9.872,11.073C44.347,135.444,37.437,141.336,33.125,146.539z"
+ id="path56" />
+ </svg:g>
+ </svg:g>
+ </svg:switch>
+ <i:pgf
+ id="adobe_illustrator_pgf">
+
+ eJzdffle8sqy6H0B3gFUFGQwEyEBB2YHUEFwwJlJRJlkWGuv88d59lvVSUgICWmQ75x1716/7aed
+Tnd1dXXN1fF6iuVQsjmot0J8mHG7vN70qFWbDEYxN2l1n3e70/FkhE2+G7+bZcMMdEqeS29qx7vW
+aNwZ9GPkEXmYw7d951e565vTrN/t80NbpTPptqB1Mug1apPw+K+2X5sLXs7UJvAwciAfMKKbZWJ8
+1J28hOepwbTf7PTbqcF/YPyo6OYZzi3AU0GKwuOzzk1rbO4TjrK8jB3DnAy/CLwYluBNQYInDL6V
+GTSmvVZ/UhwNGq3xOD3oDkbjmDv9T63vvqy14UnNXW11u4O/3alurfHtgtVG3nKdbgsW1qtN3FFc
+ZfKcfyOv3o7hHXgdf8fm6Nt5D1rKrckEoIKBESXpy2reOB9Aqv7ne7pptTsEw4CIF78ycqXVG3YB
+KWRRPCCFl0XtX7UHwEOehqJsmJdlGfAmhiMy9BMlPiwwjAC/RMgj5Q193a2/Oq2/Y+6rQb+lLC45
+mpQ7/9XCqRg3xzBK68202xrd9jsTWASHTbKy4stBs9VVm8i7uW6NLJT8x+o/lQ6V2qjdmsBODbrT
+CaEUSZvhator1P5pjfQJroetfmVwR+ALiUJYFMWIWxQY5Rc2HHFLouyOMoA6ScEgC8tUp2TJtKwy
+No6E42gTRHHvi7Az16NOu9OPsYLoDnHYint2Ouo09S2Lcm5J+UHWEZYM/5e1/ysAw9onk1Zf2eZs
+v5ke9BDJY6Re2Ng+7Hp30FaezX4nT2C66VCBlfz9BvtRHHX6CIPrijyR3ordKTw6HQ2mw/P+x8Dl
+U05lEScd9a/78MunOzWajj/dlcGgC6dtroP6SBkFH44mxt5L54C+9uPrA601drrW7Xbao9rws9Ow
+Gt7i+Wweu3eXTgjbNGrpY5A/Z/8ufbPcIKi0gnL+0WxwizeWz/BPrz7odsY9fWBDi/67E0XARnVb
+/eZ4Nozypw5YofOX1rh8sEzrA1idYWtJa7b/V6s7GBrQOGup9Zvu+9poaDcsQvfR6TcBK+VpZ9LS
+N3rQGyIDd5c/a0NsXuipnBA4PcbzEQotPzgrvyArT5ARTv7ptsaug3x/8Hef/OGOuXxPgJLatDt5
+8bsPrmq9ljvoOih3gEm3tC6M+9rFqDzwG367cWn8MO/SuCLjfvgH/riAX76g6W+34L50P70w7ia0
+Pty4kIE9NF0HxRoA54673AcwLfxLAIQV6eA5rrFY6wI7axEginWXnbhBkMauhdZiY/bGt+XTYmoG
+gjbTKvgtwHBGpC6skHRYZyNZRnmkHBsc5v+ozTCQqdFmcBVWTV6CclJzed8OtL9hr/GvTgOxURv9
+o/z9cFm4ArlI/vBtN9W+QC3lCQzedvv+0+v2oUMIf/SBgvxAQt436+d/1bpTtYPsPjiHOeceT/4Z
+qk8PkqNRzQqCXmtSawLgvweAXQ+Av2qjTq3eRT1o/G8A4n8dhv9JLMT1Po3PTrc5avXVPiayNXQE
+mTXq1KcTBDRIHgUX1xIb15Dn4ZH4H95Y6iXNQ4zvOIPp2+2P3xpg5wx6cZvOBpi5/9lt0NawuB3k
+QewvuuUBHY7/rYvDNQRpyHFNKoC1A7leEYQ44areIeYk++9DlXEVi8TQHTS+W03n9fXB6vv3rU2D
+/k9SwQq84N98WCiRNL/28cff/2sScNztNP6/EH9kIeXBdNRoEa/Tv3JN8yD/4wjizFN2cNOqdf81
+pP6PpcBzXM3MAfjvWs1/rFbzd6c5+XRcEScyYVbk2H/ZilTgF1f12eq0P53VbVYSwgLL/9uWpUG/
+uK76YALqYaH1MVEciM4rdB+kBoN/z9IWF/AvEbYgm/4fl7WbEzgbAt7ggMAWRsVd8pxl3TM/BnFA
+uwu1fntaa7fcxcFwOjSRLnmhOGqNW6O/Wu5K6z8Td7bZmdTqnW5norJoMRLhI7MJZHdtNKkPaqOm
+u4HBAjfrHmmKnWPP9qilrdexb31GGRFO4CT7rpwOgGNPAwCOfesLQnyx2zzp4vPJqNYfD2uwr41/
+YLpO0z3u/Fdrtk0a2mX3sDZsjeBhb9olfjdNWjMax8RO19PJcDpx39TGk9ao81+ko1sPtajgRebe
+uWyNPx3eYOb2X6Mldwd61SYtWHmL2EhLO3/3QaUfAHBtdAOrx/3pstXsTHuGCV8MJ9+KPNX4CqCC
+kOHEbbB/TEdCIxfAvIr4qIb55rATNkFb63bGpqZebfytolnUMDasNXWzJHnuTk4ngxn2tP1nDAeM
+cX/MQB6RfqG/Wo0JkEy91q31G4t7PfcKYKzb6bfcEzhrdD3Hk9HgWzv7rE3nRrczBJJE581/4Dy0
+AW0Obwy1Uz/4qzUaooN0xl4ANY3BqNlqLm6D++BqMJl7vCrvcRhOp5YDne8djJqjcVhx4JgV74Vu
+tX5/MJmtXdnlhU4aHsbjeQ662HHabzh0AXkHJ6ZJdQSML/9nGNYlpdXo0GEwbE4dOoydRmgM5tmY
+qQOSzvIOgz6QyEShw6VzqT112iasyaonMOJ5lsQzNj1H5p7RiHXHueNnufNDZd+X7zp0AjY038/A
+lc1dP2vN1qi1fLwuiyezNlnaCXA3Ia6bpX16eGzHRkZu1a/fagPj/2v5YPUOnsF5CWYGvPVXq2s/
+yEd/Eh5P6+MlC8Muze5w9DGY8RcrKlO69UDbUbUDS3S3e9/hXm30PR58fIQVdZe6+0jX+yl6TwZD
+6r5d0LhnCLDpDPyh1TRDTdHdADVF7xnUFH3noF7ce+xLNJx6bbSMuLHfyBA9dOg6BGHQ6X8MnGYe
+GVZi3YUsRO0T5iK2C262PlCKGsxZa2ZMOn8N6hNMZHLsqIiij0532RHDjmMMdjr0mZMfVr0ao2Z4
+Ahq5ppFZnSDsM240+ssOo9Jn2G38Y9BrFvGmdKt1W+G/KPt9LiE77DUYtbWxlvZRx7Fi8NhlOBh3
+lhMZ9oL9Hn4ORv+lcraoXb/BqIO5YA4DdkfhmYJUx3Sx5X01WTkcTJYcG+ypMztrOgNadFAPsEe9
+M+nVhmYRadebrKI2Vl6i6DpYTuGzfnXVW7qsY7M17rT7TugeDkdhYkItoxbs9AlMbNxaxhtJt7/p
+uhndQksGc2Qi0Enfs2iUDwuWjAm6dTCJcE4cROSIU3eDOGClsLVsmnWeSQNWdOqqC4OozNl1NeJI
+ZG27GZBkxaewS1NJC1nCFqGTs7Y/nnTVXsNh035G7KbOOOtnPyB0wZPZtfLxL/RF2m+N5lyCS6dX
++muGgiHlyGoGEL/dFjGVdJM4PnPZYAJRUuvsRpuKyryyO504WW3icNZHoA6Oxi0cbWS/YOw5/u4M
+gVv2v504HCoEcNzbluu7GNQxvcywOt0TA52yxbL72mS8zvlP1D4FtKIxexGz2IiPa6kHRX3rdFRr
+ooAgbyk+FTtDZPaO4jc4uFP8ASk7f4AKumrfV3RrybZP2c4HoHRLo/WfVq3/G6P1T+ORwRGWuGFY
+o9eqP9D9Be5On7gcUCpbuWwWqc/3ZEg3d69B/1Z2Cq6hmMm9pYmN1TG6Lq3IU+uueT0NEKHrE8BI
+14aKA7TTWmKyaOOcItbg6FQ+p716v9bpLpGD2juYtwz/5pZKV61zDojqvlXHd5yhIQncmcHffSWR
+J9/pNw0kTvuamdI5zkols3mZpMcn64O/dFtu+atp3arV4V2+0/NvlaY1fc+5iOOEmFtf1r17yzZ3
+VPtndWzOv7UaMuffXQWX+ObKqDS9tAIm8U16RF4O+oPG52jQa1mh09r5s+xdM1KFpRuCI9gjVaCa
+2xK1y4+i8gJIHudDXhl1epfoUXDuCvydsich9tRSA37GDQEl50sNc51vEiUGQajMwnN2Jrh5efct
+BzeM9sI1UdtzgHhA39+D0XdhpqKu9l7KyU1k++bNuqBWlrphtNdS6MAoLPcdzfW9cTBR5jqvAIMR
+Q8voWQG4019iAWtds716q3meThdHxILUpOjSU16e1hGNg/7kBo1EZ3hmqh+FCFW0m4ohNkelHi0Z
+C54rmtKVIdNmKbLNL17W/rNED6UaodO31Ulp3lf01JTJb079OmqdqtKp6JyrD6Hqt2WH0ILD6xVj
+LM1R4Us2RoN6baLUjc3MDuihrmqmdppNDtkc3hrW+pp7XJOx5btTJGGFmCcLHjv1cWHQqC3OAA/J
+wVGsCJWm9GcAXqOju/4NM2b7jYEerxX0B6TUQufSM00eHpHyHKRdOBANi+daheLik2L7Y7HxoWZO
+LcDpu53GDKz4ojmgF77M12Lgjik1Griz2jMX2UljC5oYyXL6/FyKZGDcJlbteAPHYmgnMfY/bGXy
+F42PnL/EJRM/qVefcHL9fhy955lmvBXz9smf8fPx4CP3Xpju5TyBJ8bUFji5qx8wXHcSSd5UcpVE
+bPgii49i79HlPQy95wZkMJgvPk6Wp7e+ZL/eHqvvHP/0kvn77PZodFzrn3bvvuqp98tSMhnssy/x
+E/ZOymw3p9lM+uz5hQwVOD4aeoUxv1MKnHxOeAKIy0sBygqAHNWTweHVRSIvj4+ls8P7cG7wKNy5
+vNnR8yOTecxVK7mj5FHDCp7jof9wCBOchdLcztF7JjxN3Cajz29VsTpki7nd0kNXna+R3M18DP1s
+snIxmeptLq/Smn/wT2Cci2kmfP15OBoJmQ7DiVvDxN1eeUfpzjLFWs4/2a1lgy9XBykxyG2p47wP
+EqNRfFwBeIPnDBv6iunIiqdu0i2XdyzlJnfc6+B7Vyy19gMRT9p/LRyWYpXA0Y34OXphxodhviBz
+geNTz64w5saXAM2dFD4YS6eC9BP/gj/9fqa5W83MT/o8erl8LpFJgcbmp4V3o6+R2Plr2HLS152r
+gu2kYid/6rWa1OUdjQ49vtGY9Y6s1jqWiuyzsMXF9q0mHe8FL0M2k0Y+fbW9apZM6vIurFXwPwcO
+uXbJctKt3KuwfTvsFqwmZXKpfMJqUpcXphW3d/oj/5E1goXqK5P7uCpbT3rqOdxlL94qlpOennEV
+Mime/UUEc4/HlXcyKbufrGfnd/V+9Dw9LuCk8cU99VX5py7rh0lDQX1SmEUhpQKTUtda3NszTRqJ
+9N6GdpO+jV4++xWbSRM1MZrbYV1e07QqKZ2839hNerbD++LP1pMeel7G25+tG9OkwGGUaUtp//HP
+Tq9gNWkg3o0d20wa+dw/eUxcW08qVKtMTmaugMas1rqVa0d3bnrctdWkTO7lJWczqbjt/e5fpk2T
+wizatDXmNPh+Zz3pKZPca/miVUv0TraDJ+qk1ZDPhN6TK+Ho2aWcVTb7/J2bW+vjIVOIhlic9HBh
+0rPWQLyphTiYlAmZV1p4eqyZJiWzqGuNfjdzr3aTZpjL/RfZetLzn1jia3R1YzlpOb7Hw6m0Xqu4
+nW+VecZm0qcQU37zb1lPmj9rXT09+n36pC6vYdq7vX7bdtLyZ+m9bjfpKXOXHx5aTw==
+
+
+ WuC9Lu9tLnF4ZLnWu+HFlu2kd2+nWxO7Sa+Z+5N8Rp8U1mKY9vI4+/ZaenmxnPTl+vvcdtKvaqSZ
+s5n0Gbgl8zLuhqzXevU17F3LEm856dt5qG876chbDnj0SVGKGc/qLZPt9C4sJ5WuQluexEsoC5Py
+YfOhmb5F39RJ67zfdGhcXv9jobZPpuX2jn1n82stMO/7sSROemyaFIb9+tGYvnhgnnQ82D1SJ52c
+BGBf5tfqea49+ZVJU1X2fJ4VBkfj22MPTppY5EnnIW2lh6xpUsBY/GxLVKY9YfMhEysMDoUrRdLw
+O7F0fn7SndGoVu/jpCnzSkfJ1kCj3hTQmFmUR75iqqQ5iZXCJgRvDVrvFUWmtmpv4jxIZ7e7r4OY
+1VMikSNn1RLbu7N7+5M5e/dObZ8C683s2jyFHdgNpL0qt2RaX62o6bkosW8a3ONvyfy0/7n1YPs0
+WjyPPetPF3Zf4vZv3m3flj5rr3u2T5Pc7mPD6qmqwxQC/RPO9u1C/fojbvv0eqtRP7N5Kp3tnh3e
+jjWMfez9yKa3bwMdTT39YLdi5qf1i3Lf9uldJvA90p8uYOzeWz/w2L59/5yJHdk+ffe+RnesnqoY
++5oUh2e2b3/fcamS7dPed+741e4poKoUj8wwtvj8ghOOH2yfNvr1csHu6a5n9/x53x5ju9nkZb1l
++/YFd7LF2j1Nergdf8wWY5EzJnu0r6065oubznSgUhqfqE/T4UPT08r76X7S+FQI3iBDKSnGXDq0
+nwbdcjJ8fUm3Pyvo1EseHctnO0hZ9z7VWj5pxGzMvvFD4u7jtpysVLz3hEUlK5dNIVsbPXkDqcH4
+Sm8Du7I2etwjfC7GSp4rwsw8+/k46wlmbu49wbvXsif41qx4fE/+Kf5WBBL8TntC+bfIolFYbSdL
+fFkCqNMBsE4H3+JOVP5AS3yf82h25YuUe5s81xLxIbuVuQhsR7Sl7faSg8wrkOm2vMXtHRWPM639
+rJecOzRnnjQsWvdzKT3R2pKX9yT9jmPpp6pjPzDD6js333o/l9e257730DNwHFHcpl0L2GLRG/8L
+xYg7fT7+RtHPe925rFGsRdxGod6gGHHvvB5ua/22e7n0x4V0cHnRisKf+9vJ6GOXV2xkPwjHj0OF
+Tpgx101Wkv0ccxER9hWyQfcHWMsRThe84lZVuMw+Nn4+DjpHdb/4KBbOVLs5ujuaCeB0cvBz60cO
+s7glft/JU3c5eGhLv9AAt5WrhY1eBVvwmFz+sGgCz3I3hKvMuxVwhFvq4FXfqMA73RFpgDstbT8a
+dH478KSzOWKxxV31ZjlwQGPK1l7l72jAy2ZvczPcZZLl4PcODFCqHnS2Y8G5CQKHZhqLGUBh9yKv
+mY9KhkeQBVzaob5SNnjLhvRJR1M+zVBMCjr//LREO15z0kBsMMnipEOCFoabJj7Tn8Kbui+gah4P
+M9lGsSJqbsX2NNuoth6UNo2P5zPnzSPQlHLTbjReui6ib5GbPb3B38AI/5bPAergdy59EiuTbTdY
+FuPA8XF2D6At7yOMYbLq46GvOVZdNfMORmWlbW83ebt9hFoBs5Usdz2jXFa6OVAHvWr8BI6LuwOY
+BYWZOPGxp+qLO82MojYDZKmDz1bGq/wAOriHwYqiam3BfLMtIcvIoJMhN7+MjMGrQJbhNfzAmWPv
+P8WYQbTOgfezEnDkVC4Fr86fWYFnAdy+LXC4FhW8MQ14hEIJVaojXkh2y53q42m7b7tg+HGjLFfx
+3VgsF4yrwvLlulbZjb2tNUlF5ckLu3Fa7CERt/EgbStcR7wgauyddCyf3hbBctr1kh/c3glzjoCc
+z4YqaZyvKELnpwzsCxhId5T7S0F8A3Y/9ZVjWDnyleATj6jB7fpmvosK04Rd9Xq1H8K+eiCJy2Au
+AhF7H43rsE3xEC0CXXSn7fT55zcI1LVxFYWoJz/++oDoCORSj/IF+i3nULgSAi042o0VR5udympw
+aMYyM3xNr8fRsgjNqY4RVSJb4+Q0v4sz31jufvb5emLaq8jwQC6a9oqwd5fXlsHPjXjnoRhR/VF7
+yCCCzmx3/zXL78Tzhbm92t6z3KtWMbyr7osFxk5ipcvNYCwToNzJXZfKD615w2sWHQX3Jvm6Okgu
+LwIVpgXKASSwWatWIFnISic8MU4gDQJHugpBWIFyXi6WgJcOPy3F2K6uihhPL3FeamC6vBbnt7xE
+I6lzCyLf+fSSfbE8vzkrxcpi43Xd6omMqAbW5sZzeZURT3zZPBUpGYTMpWzNI2G5CmOenTqiw5jO
+nU+yVv3mUG2giNrWJbcci3he5mhCXzq8PTmdLX2ojy1VdvcuTyvPX02GTT23M+Gb26Ae7iczw1C3
+I50nqbLSSiYtV2PnRnwYL5dxLu8cITrrWd/SZHW9zeVdOuJ0M5rgTIp9yx6qEY/q+/o5sKJa7HyK
+3v0LM082SXYa82JuXz63N70v8s6m90Wmsm5W2RdppMhSJ5UGjVCCVFXtOrXhtM1TXWt1eZeqXTRM
+St3u07uB7eYAT17nGN4tCJmlqHR5nY/hiK3t7J39BpUmHQaQSafBroLK+hilmKOWvbJhfmsSgzN7
+n2BnckxlXNKpsWe6GutAY7pqb6lscKmHT7PSaYUMl8HosN79yQmVNbn0aJowdkLFPuiM5zPdeP4t
+xqpbu5vB2PGYjvXMrKlFDV3RYYAcTsv9lSxHW5BWtpGtzQYEqTpcCSQlwmsNFBVfoQDpbUR19uct
+bDulun1moVQv8Y/NLOxyfD70dKMNe+hLRl89Ye5lXE+lP6Nnw0w+/5PSgjVk0q9zprlXyxJkuLz0
+RjjJFrIg55dx34EBuLwWODmzwcnX+Yp7pQHnMqd5auBNHNSSleSey8u9TLzUJGBlZpuWu2hk0/iU
+bHdjEtijBc5FsxuYg3C7qgfIaN3M8eQTX2ZixSDWJ75PbhZ7XUUu2nD58+UuNKOmREvOq7vQiAZr
+YyAiAokT7TcIJAxu5k9WtY97eyP8hL1YMGcoXWiWnt4LkxNtTe8LvxPz7ZC9Aj7m7ESjON0wYtgs
+m/XxFnbf8XT3LlZ3odlgbN6JtjbG5B9m8bys46/qXVC40Fy0QPG/caGpUR4FKDsn2sp4iphAAilG
+QfNzvpI5igezgcI561qmOqgpJ9eGIOJJrDixCyLmkc6zlB5FZ/89UOD2SttkoOR52hnmTT4um2NB
+ZTKTUwkjvkxTeZqDhj+WSxX+5DbmM+0V6JbWrnT/LuECdhjzbwpjFnJ4HcI+ufXyixHedRgAgPSx
+9/NgC9JcJNERKPNpowXJZO8jUAvi1tYba61Pz+2fxypiZUtZ1j5vC1MfyWc7btLQdT72ULY9uusE
+3k6LPTb7Mj416fxrBHPSALdg1o+s+RitzEXCPqDWLubtdEtZiTAe0YTWHE4voo0/uatc0u2+E9r8
+PmcPPM25I7Sx4M2jXd+8hwRWuPwQ0x5h3ES/brj9msb8C4FxC4pw0UpfMiJtlM48noHGLGIfrz9L
+Ylen5T6toHN5KUQd7n7lN+GmmY08B+MqLNPrwDJxPDgvjrFCpxEtnBqob/p1Xcflndd20sARYpTH
+giJ95OGWGCmEJ//2bIy/HRjcjJJpIyPAAFZXeHAtNioPwugQIaTkTrd4XjZhqyBIgUX/prpIrLBb
+gaVgrk1w9fXNPIomwlj0TK4lX+4GxFzZEI0FFnmN0S9AMiHnA8eOfBPR5hjlmQsbu+hNF8SibeAY
+xZL9hilnf6WIRxoenI9W2jU7fzLAvWn75eFuo1kEAKHJ8WCVRUB3crLPz2YHqi3aXN5l5A7bvREj
+BuULUMeiH3HN9Vkn8Gj1lSvwvjsr7+HaNLZW7p21WCYV3DiiTbThN7EGZGEBIpZdXqtMZmAuBUqc
+0IhlktO7Ce8hws3ScRh6sfz8s5JYdjl4IhBG4ddiWeEw9xsSywBSyEos28Qslh++2tblatlzth4S
+WN+mxPLzD3KYTfgRCbJsxbKuw6wqlq3yuezEMkpkLcePTiy/jZaI5ZiPnlvSiGUA7snJWG9Nbg8s
+rSS7wOrDg0Vm/9JsRf1sl+O2PPlttHG5/7BZuf82WkHu2/mr5rdb3KgljnlDNLa9YTw7Xx9usrMj
+ZEY7NA4/Jb7vfPZpMl2tvH5c6qGaJF4/l3cxMv9Q3azXD/OUdL+fDcGumEqKKoSZ9VhERqhSSY1k
+kXr43lq+k2pkhNqtCIDSOpUNbkXAmE1oGGGcmAP/zoqMJYtSzn6VXiLTkG59bFKvl2baL0tRQtwd
+OKrXKuXMPL3OZz/18OboZFhMTCdYnJf7qtjSdYpUrPMafEiWgw+D5E2/nk+FpMH1Ap5md2iZb8vi
+xm1PqF96c3mxejrrCSX5V0/oQs6qhdMXctUT/Pyq4I8wtuWw1DpN6q3xBonDZPm795Ft3J80cC1Z
+rMisZmrl40LOPzpD9+rOXi7zHdrCKmpB1ZSUAuviWaWYDYz5XV3Sikdf9fNsPZRYLLa9OrnR92pJ
+v+IBM1f3at+zFCtS9BtN38Mhq34u72LPGEsz81bu1XLExX7NA7q1bOW+KGce8lRrwQuyIlQjnoZk
+Qz+7StnROBYYG+4hsS/kFR4+C7P7CewKeQ+3fLaFvBizMGwJG6YAL3AY7904Aidub/+I02c98m5f
+Z/xEV6PdcyggV28GY3KDSoUCvN1C67PpXATdMgEH1qtlfftV6YECd0z26umUYmNd3rnCf3vwSmsX
+Ru8fHRhojLoeG6ux4ytN6vIa1o/3Da0zqeAvKpOqroXCQyKW89ZUGJRYktgflhOHnckDjn2bDew3
+w8lr9uQe2qZbJhVrSTgmNx052vu6OWCvwVsZTcXdnl0aRkbX6hwyh/cpyygX6hnnbT9DJNEYMLWv
+Gl1wp9AAZ2clFXcXsOxcqGILHHKYhYKt3yTwZywMroy5sn4Fk6u4R12XQ1fDu6gTrkYq8xHe4u6A
+LkccmB5dyXJghXxLGuKjrUyZVwjtq74tAtoOCCT5lsuqvqkSkp0QiLOoKFyIBv7igJgSy5ZU2C1B
+oBVHqwb7dhwtq9wISmGp0nG0atCSMa/ugX/Nru6gUSq57OLtMOJGEsu03c8+Vx3sXCofZTVkmYq3
+DsZWj8lYZ9pjIIXWs+NYCQ1HeANRUQSJMvJOA5RTloS9V8geY/YRiOX2sNXpVXZfO791bmB3fnO/
+Ob0WOSR1jio9nDqMUue3qHMUKUq3csSvZ3Xq1PtgLTyFzj7mWo62It5lsXTHCh7QtxM2FTzNU72C
+Z3nNCH3NqWNRhjqUGk2gKpSkUist9TbLvL5Tytt6qEs5qXXL+XNgX1tsWcA4x5NpzIu5fVmUPr/e
+F+dLgFbdFzqVdaV9obsJaJVqZXPYCj0kv7mcCauVnSuZXKsdQ0rl1YzK2W3zVoeG7k4gClSqOgwi
+0zH6uCoq9Zqm5TWJKxvmk+MfKzGo172aBeH6hvnk2CwG7Whsptpb00H7bCWTY3anyg==
+
+
+ wu6fUTK4oKJdvHOv77ZHU8OYhfm8tvE8OTGL+bUxRjK1N4IxOtaj62N2xDDGU7kop5dYjvYgrWwj
+2wK1GBCkAsngUZwBRcVXKEDSbbblZ3/ewrYJUGKQaSFlxto/ZrKwna65GX7YX3PzMm6bkxhcXmcj
+fEkRNOU2uSjLZH/MVudKwJki71/ny1NNV1U/YTxUc2jvhXOq3+JeJj77GxbsfUpLarRXYS5OudZY
+tLyOB8jCulF48vlyBrH6ck1aiOXtQBZycUnJMoU8cy0e8SUIdDjitgi01GDPraozV0TgnO7h8qrV
+mezF2M4Iv/i1C22+sp7NL5gf69X1Utw/ttLphhGdXWgu+urMnRhrvuJgreonwJhDSRZ9JTR93oVT
+2TF1FcbyGw6xEnoThV0uLwL1+xxUFSQbF9oKt50Y9+9iungVwpJct1m2rVOe1oN9EBFLQilreaj8
+9/k1k5mNGRFaES1Lk51EfRXCyW10b+Gum5XuEzVV5tpehbBaLU9+zTxmK4x5Hd2vlJXQs6sQDBHe
+Ncuzac6ai648+5cpzKq9j0DRJIFSpoDmrSNWK2bSWSYuF3u2GjreBV17o6rGpzu4WFMaNitda90S
+gHCvFLYy1FjZlomWf51XvFApvJHbgBFtiSnt7juhjTZ25aIqX/5tPZGijZNiY+p7ih0rvReM7LVp
+bKWbEVzOhb44In2Zr6U0V2ZZLPT9avlsv4zANHePaOr4dEE3k/u2NxB8tRwvTHYMNyla3wxGjr7e
+XB/Rtn4dxjugvrfHdkSr+vWRla4zu90US1QXfFhWx4IqfQTFpCFErHGY9eqMaS9ypo6MYLVrYbqm
+wmNTKbwYa1mzuJffzK1NpHh5wb9pnWlPU77sfAWU7fpUzq+XLzuWKlBXeoc3R2M2gWNT2NgQ5XHO
+08eqb6c6TMtUApRijiUmoK8cH9sEjkmBqpPPwbVCxOO0Olxz18z+5PRK30Ogqv/Y++E2mUWQts3d
+mcsioDo51eGiR3Gte+HSK30UwbF4+W5Aa/E5rW9Td0Mpld4L3sO1acz5ywj0lgwZj13re0mOYnkS
+WHYXNGiFmxTLYCjSaxfLqeieQizPqjgpxXJt640yZ84olpdVCm9GLAPaIpu5S40ULy8Ry6abJ53K
+l9cUywseElK+vCGxXNu63NDNkwRZTmIZ7f3VKj8BbSuLZWqPYnFZPhcpZF0ill1GK4pKLL+NVq/7
+tF7LfC3watmKVnWfCzwZetZpvlpEL/djPmGjch8g/N6hlfsUt35jzfcKdZ8UlvjbiD6J16buU/X1
+kfp+2spP6rrPvaM71vnsr5DpOuf1q49NXr85ywJLWTfo9eNSD82p453DK6aSYuG3zXUFhsiI/YUF
+NmRRH9O6Falvn6tu+va5+pjarUhzXUE6HF3h7NOVLK9834X9Jq96XQHF2Qfq/+11BarcV8SWzhuO
+xRKfvBkkaqluNN87DDCZV4tjMftQ9eInqX03O1GsmC5jxXTB5fWEpNCb5Yeq9ytJcc0PVZs+U+3y
+/pEPVZs+U004/+Y/VG3q5/L+kQ9Vmz5TvXwta3+o2nYtG/1Qtekz1XgTxR/4ULXVl743/6FqE3Au
+7x/5UHVg/jPVsJY/8aFqE3DEB7v5D1WbPlOt1b5t+EPVps9UY5baH/hQtWlS/Dr2H/hQNcJg+Ez1
+zKuw2Q9Vz0sfowd+kx+qXjVz2KGM0uZD1RaRRINm88sPVdsBZ7aSaD9UTVtAPqar4V3vQ9Wm8Rbv
+6nQ0uWg+VL1SDS/dh6qdSUVZC/WHqqlLluc/U22fb0lLfJYfqnbOt/zth6otEGj7pe8Vk8eXIxDv
+7KK6LJP2gAysvrFjVWFHjcAF14nTLQEOZu+y8uwNR3lsyrMp/HYLX5Te4P15enE27dcZnDJLlxdn
+r+KDtSnPXgdjm7ky11Sc/ZuoqFqevYGsG4rybAqQyL78rjybojjbDmNrOq1sirO1L0pv8nKFxeJs
+my8ZrVKeTZ2j+KvybAqPmm2Uh748m6I4Wz+Va5dnU3A527XQl2dTf7X8V+XZFptoLs6212FWGNGx
+dtFKiq1Ynm2gWrvi7CX7QluevcK+/KI82xKL87GGjeyLo/a74l2dVuXZv/8CO015NoWyoX+Vae3y
+bIribGM04beV7vbF2evdaj5Xnk2BSrv85BXKsymKs1eOii6WZ1OUGlvl9a1Ynk1RnO1wLxxNeTZF
+cfZ81s1a5dlrY2zFCkrH4myn80JRdkwhpV2UQK1YfWkCaZZtu3559iJIFnnjvy7Ppqys/2V5tnNx
+tjHXGtfaMicOUq/U6uad2bezre7oNn49m75Wfdm3s6m+J05dNm7HmEw1VrTgrfjtbKdM+818O1uX
+yNZfz157N+a+nU19k96vvp1tpcEuq6OmUmkWlmv7bfRPuotcHAvRSRU1sffX8Out9u1sy7s6qRFI
+p8jQ36vwuVAZR319CahDBj9//s9VjNvc1LrhinEKL9wGKsYXa0X/RMW4PcY2WTG+gRsOKSrGaW84
+/F3FuDHn6s9VjNN80eD3FeMuh4SjzVSML2YQ/YmK8VmFnWWx8aYqxvVK4SjlQVunYnzdb9itVjG+
+HGObqhjH/OT1a6doK8bNsdc/UzFuWVm/8Ypx+rsIflMxPl+V9qcqxpfljm6uYnyluwfXrhi3/VrW
+RivGN1OX5FQxvkJd0i8qxhdy4P9IxfgGaIyiYtxFL31/UTE+R2N/rGJ8lW/Wr18xbvPN+g1XjJMb
+QTna6Oq6FeMu7+I3zzdfMb6hGiuHinEDJdOXpq1cMa74+uxUnk1VjCvaBb8ptNmUpq1e97pOxbi1
+72LTFeObo7HFWPbi3YMrlqatWDHuWsl0Wbdi3Hxn15+pGLe/qXWTFeOz6qc96vvX1qgY/81dN/QV
+4y6KD17/XtnQvlpOUdLyi4pxu+/ybLZifDmNLVaMr1rfPXc7kOVHHzZXMY7f4LbKl95sxbjyjdTf
+524trxg3c5g/UzHucvZEbKBifMZh2C3ar5KuUTG+5t1QK1aML/GQbLBiHLTxWc34H6kYJ2LZ/gsg
+m6wY178AssK3gleuGKeIjGygYtzCSvoDFeNk923LiTdVMW6oeqZ1WK9RMb7eDYerVoyvZImvXTFu
+cUfEH6gYJxVDd5v8NtKc10+tGHd5rT9xv9mKcVjLrGb8z1WMW0ZGNl4xrkdGqN2Ka1SMk7w+20/c
+b6pifHb20+Hon6sYd8i031DF+Er3j61dMW5z/9jyivFFPC2pGMfacPwG95+qDtdrw+Hs/7HqcL0f
+YuxPVYfr/VzeP1cdvnwtm6oO1/u5vH+uOlwvtl380vfmqsP12nC9amDz1eE6cHNfYd5wdThdZf1v
+q8NNlfV/qDrcsbJ+I9Xhepk26Px/rDpcrw3X5MufqA5XRUK3PQWM/bHqcF0xVK2kP1IdbpcDv9nq
+cJMO84eqw80+pT9THb65L+Utqw5fo15sjerwpV8v3Vh1uF4bvkZOL3V1uL5cy69mbKg63CKj+w9U
+h1tmdG+8OlwPYzvUWfyqOtzKStpYdbiGO6s6iz9QHa4jw+VIT+tXhy/U8P6R6nC6/LHfVocbswj+
+XHX4YtXzn6gOX5ajuLnqcKcI72aqw/XacIds219Vh9thbLPV4XptOE3m8LrV4TbZgxuuDtdlvVrN
+8Ueqw3VEm+5V2Gh1uJ6M5PL+uepw27VstDpcrw0309gmq8PtdZhNVodbSbHNV4cv2ZcNVofrteGb
+3Re7T3f/Yl9W+HT3Eovv19Xh+mZb6Pwbqw7XNxtj4n+qOtypinMz1eFzttgfqw6nuleB+SgIz0tR
+afAbqAs3xpENCRIur5Yi0WvZf8A39fC6+gdAz23PfvtsU4W8lLdq6NLeUsOD9X1TfQH4nXtFz1Wn
++MA6kFLq4cd8K/ZKpZwLGFuxlNMOY7T3XThjbPHm3xXu7Jpbmq0JvxJIJJL4RpWO5Py9dFtmZZ/X
+Z4unFYtI56xXE1Br3OJmF+giX2Cnrfek0PlxpQu5O7jSOZ3fwlK31/RPfJmRnaZ/brLTf/0V5uxC
+GZoN56er9l3L6Wh7EziAt2AU/8bpCON5V/gyi6PT8dzW6bg8D9Z+N/ZWOjQOVtL5eldSLqust0gJ
++90nwGcC0eXdxM0Jnwvp7fMItPkO7xIELknctkWgrQ6DxetOyWHUCMRZsHjdyZ5QcWchIS0yRsft
+JbVv/I48pKlsoPPB9i6sdn+NrMCLjX/172KzXzQALrFwsNcrfdbzvX+LMccP/tH5LbF6ekPfSL0g
+Gd+/zxsnIFmkelvd1EqBJ0c/03zKnlLLY5eihcXrv/w86sw7Olfsxp9UJhkb79Iwv2aWt7UPlj+5
+DZhvgFlnm2IlLSrqlFNHK95jJftjtsaN0/nVE7xtMXbk3wjGPFq92C8TqfMUSWR0X/xEoH6T222I
+8eWtfBtr4skUNVoe5XFS8rF0nSYd0LV6gcZwScIClsZaHNy1b5zGuBB1kY/L61RTTCdzl0vcue8j
+n73HzO6W9S+KwNJ17fQaIrxrfWm39kZzwYOLshSbSvDakrj+FWasW9/EbRFK1fr8EV73Vg1StR7c
+HI2tKn2tZK9uv5AR69Q0tkLyeLmPPNnGj4iOHqoybmdBp+9+uW97HdLqYWyEcF9nmY66pWFEuzIP
+MuLSa3VcXooRLWtT95ORI7simFtLD8n6sVAQkxTizUVzNgDuHA3x2TruF+ssgAHQ3j1DVZu6nywu
+3j24VvnY3WB5berc7juWYu+vaT6Z/MmEOjZTm4rl15qz9LfyBavWnWtTaWksvpAgYXYiLctAsPlm
+vQXfNDtCKArlZoFxwpO1ezoAj/u2yaJs9jlNYxRa+Rws13K30lVZSyuKKb9dSx01A/N3o3fcIYyr
+3fdg/33ku5Xuy1peiK1V1/76kga7FCVLi8/5S+freB+svl+JdetrXZplhSyrexStXKSUH8PEEe3C
+H1Y0tsKVEbWt0xM7sXyvi2UHbkkplp9/lovlFeRLbeuBxqtpJZZt7iGB3ac9dzRimdS91jfgc0G0
+2Yrlxd13/Hg3taavHz1Lnny/MbGM5dcgljdwi6ZStb5ULK9EY5eOFzzYiOVl36zfnFhe8Chi2DVo
+K5YBxlsa08wklu3X8uAslqkrV3Ur6W3kqFgtfPPcuX6d27TcfxttWO7HfLQXSnjnIolLyuv7v7xq
+cd4Sf1jBEaKOaIs7kxuEourZWUxi/brz2aepYLfw+r15lnn96oaPECy3xOm8fh/psIONiH4YmysX
+lpU0fzpduDCfgeuiuNOg+mu34sI9ilY5Sb9wK1Yt8y3Xvn2YlK7TS2S6z50fUKvXWi2PjdiyTC1a
+48KF+bNfpfHzr2JN6kIL8y0LQthebL2M2w7Xg6nLWPZdiHnr9TZ2YDsfRcTcdr7ZjTqqxxHxWKhk
+6weNXrLfCA2Ske700iQDyFSpbktkEoff18+5/d1rjbk0kruZj6GfTebvHwuzfQYrSQ==
+
+
+ r7xXT5G5+/uV3l3vrNRqqTgpXKe6kodNX92XWrnD7HMY1nfvy/lLXDLxk3r1YWWKYg7MWk8aORyx
+mIhXSlOsjz6TQp7dafY+de+ZP1zFTCNWa2Yb79niaMSNk5799qh0EPLGdvn7y0gyIgbGn+cHg2nN
+5d07a0ny/snTzuOW53zi9yRzNwdb1VcxtlO+3854v/vlwl7rcxgSy4Wft+h3s9BOfL9ffeZbZVm+
+ej77uSuzw/xH+bPU6d6eHlxO795O/b63t3TA/1WNfF33ioH4h8s7DDwmJiNv2bc3GvE7nq1Ba3Dg
+ZXY+4/7HQuMuIAcufcc/O71CjHu/OUoyh4dbo9FJrOjZfzm99HCp624g3hASTI45OWZylfscc7o9
+uGJOr68+R6POSWg0/TwGbjneC17Vw3xBjiXL2+09UkIO63vOhqKF3S8pepLOp7rRUoAUb8NKKxWA
+odUMWFy4YJHnoOyky2t55YK/05U9ga5Qwul5nXRjXG2vlDgMnQlKQfte6ufGGsddVih/3u78jBJ9
+8crl9dxf5QMOKJq+h3f2d70PxR0p3k15i+XTi7338vmRIO9eirCqlCdZOaifYIF8JXB0ELpH4KKJ
++MtrN3Ph852Qr2NXS0z2Lvo2Grcvthmu9LydjL4kWpnz3slDIjZ8OTR58oFHXv5kg9I4LBcvSp3Z
+6TXQOciFYlo/FC6vdixeLnXxznDdyWH6U7yuwl6NX5OwF/dz4zx5rcY2433/JTf1BD+/HvC+i7vX
+rCd4ef/g8YVqW3jLxQX+iHtCSb7oCR3svuI2HXtC/dKzJ9AIy4iOSPKm8ryXrTPxKBk7es8zTXLz
+Bfkt3notfgL3vffBqrYP8Tbgs4+XTGs0CiZ7g8IYVnX/g23NXDrl2Up8bSe76U7tgGWY8ftupn79
+dpWUgsNBIHv3cAadH7ZgvsA7ov+ceztrBhn2ddub6l2/SLl0clpLDMdsXfvi57HYCGYbje39RPzi
+G459Pj8hRhPDTSfbidF2c5QKSd0rht3zt5Plxt40WdqX7pKDQbiAiuqOWM3384nYdfor+x5qTxKH
+J4I3kyrcNXAtUZc39/52PUxWMo8ckHvwKPPBVPFaD5kla8U/3xOHomeEx8I/a+sd+hOFcqrb3wvh
+YLe4k5HU90/Mmyold8SUMAk85XyDdzbzEXq6Jpz/XQCiak5wnGrm4+U+muomujyOSOJBnvTnU2Ma
+uwzwT0gHeQI8kFfoIpe9vJNynuBNLvfmf8qLk+FrEfbqJAiAeHynk7dhHVb1ICBPvpgGEvGCB+/V
+3d/O5PNnUXh7Ozw3jm9P25zMCBc+zqVboaeUEOn7CQloe/rgTX+Gzptn22FvVN9nPPvv51sAfI8N
+ZILeac53dn4eu0pNnzLn54ldvS3e5qrfqbPb/o8yHzethmCRzS29i/gofj0lbz7ao8zHwc5btrH9
+fUKmgrUAAP5c9uc5ltv3BwPiduyhnG0ED0Nzi7ziYNJUn7iOdBhT35c3B0AHzyO8iyBNeFvmI3Uv
+5TKRRw4IqVrIZTk/6DAGdHDbb98JPnXwpfzJtqMDgDa9bVhQ/vF0YAD+KPdzRnYNtuSplBhNc3tA
+DNU7hvdsSZnw9WeGbCLoYx+9+E6y5Km2YRnRi8zF+3gX5N3RC8MFW92UmLj/IfKVYQfVLrCmh0ny
+mg2V1c1pDktkf9UuqXorcfdxew8Mda+QKlVPGYIMQmMfsIM3vXLu+azQSl6nU9VM/txzt/CgzVyQ
+033kCwXfxWrhNpF7be1UM+fdwFXmYzA6VhgXHy/vptqPpbv4x7SYRsJ9hrOPh1PRrggLm3U68k25
+99PDoa+We/fHMhhuu1ZhfNr/zgY6jxNxO339tgCS2JzAvpzswMjnfTwvd2Qtzy9HL/nsQaYd8tWT
+khgN5zLVShDQFn1iuEk8KRe97Yf4RapxnzsZnxZz73fVJChTFQGPVCpZDu1cpi+P+mmVWzQK41Sp
+dH2bavSnr+q+SP32M5+tlx5QF8yHxRPx4TSdvREmKgnkq9108z54n/kojd+QCd/msuxoJxOs/eAK
+HkOZg9rhbqzd37sFuCK+TGt8Iqi48wgyUYJAt+S5wiT3FryLoRpbMpoNVr4prnAPxBmXcP+KtDOD
+fLGYe+WZc+nPaF710CJHAz6dq6AElMXbI7wVMHm7G38nnfAukXt85yLV9VYq6XZ77AG4LyUET8o2
+Iu/+6F23cKqfl+hd6akCP3q13OHp0ylhZqQtdtWOd2KdV+kDHrCwFvVAAgCZVmfwdOo9ff7K1ivZ
+iD4YcLTUrfhQG96R7UbiLGdaD35+9ud76ps78mhC5GwPr35pprrhmwBYQS9+QmPZXaB5IZvztU5e
+koPP633VAtMfNL+esrVaRD6Wz7mBgtnLs7vvxOi0B/qD/7WUCd80OPJ0XudPI59+gbW0PytvoFsn
+jyx02ZjBLQ5MagtY6+1OIj7oVVPXk9o43op5+4oFdj4efOTeC9M9PUtAb5vd1nj80yNX1YDiGN2L
+7Q44ARTjn7vEwWQ/E5AjwiH8dniROBgPT+DB5UVmWitew4Ojk5y8c9NMv1xsnxEFK3oX2rrMvV/u
+RlWn4zAJVtL8Mb0GkLlptvF4RITjDUixwxGezw7uwTnoAjxPfBd44ivkyEXjjYeQqV82sC9+iEdf
+9fNsPZQ4V7I7duIfZweV5DUzvERCO1dE+bTH12HPfyrkphhyKxdwgYc0UWjhnAs+YKg/DaJsHIbe
+cwP99i5JHhx8JMuT4TSZf/RLsBYkP0PrTf/7OVvf3X87O3rm7xV1+PrH30hdT/d8yMzOMh+vW99n
+2zenYeDyz/d4MdBPznfx5QO0DBh1qGmJUCAcXCZ44PKysOXHMJjMAQNsbwMf37uA/f3ZBUWm6kve
+dIf72cb3jwwaUDKEU3WIiILDEHwE9p/YIlRCrhc68t8HOgQtZLnECsTPI4XVbFv29DWMBS/ZrVw2
+44+aepqdFWyl4wOQmE9QjbY+U6FYZkdhlLMfYBS2PDDAzVaydNX6grMvtKeNeRLA+wKkQeZi/2kH
+hmgNDVpfIwVSG9EvC29PN4fBx8xzLhMUAwb5eXJzeJ/z7b50svVyfpoNFMJKpXDKm8mn3vncc3On
+TXYf21hgAPEJKMHXHrmbazzHW7f+TqrxszVSucXO1jjnL3ZigePo3Vn6/Tu1n2m9Tx9zb5PPbiKW
+89ZmD7ZcXmApL8cKD3kU28+gj+UN2gxYP2I0l+kGFUGIBzslTvKTo9xb98CTiGXjxaQcz4e03Q0O
+QPdoT3PJXiyo3X7Uvp73Wq9iNhivwQvtJMb+h61M/uLxPc3e9sY5z345pD/AL0tefLRhzyPRlBhk
+H3DEi9Q3W2tkcs+X7Wzg8/URT+A78TilO1/iAehM99PoiD/rpAqPgwc4i7FnEOSfO8Ajr4RE7Opb
+Tl0Xhx1QaWK78tfI8+TyqqSksLAPJtXtDUPK0dUV7MdGixmNjg6wyzZoLh95llC8PphisOxGBvr1
+WFWQcjdbOX+1OAEau06HjomCiRufRMM9hBYKo8O9ON8ooHuzjnzdeAfw2fYkfpLbicRhsNkkl34R
+X8H2jzi9dHkNyuTifEXDDVx2OFHuvkrvnGRtVwq7r6z1kbuwWqvFzNuOKx3sm1ZK/DBWawXb3pva
+ySxdaYl2pWBX8udPPaPF0GyXTLhlcw+n7MztlIpx9YMO2mw1NCC+iDwj/EB7UM+bpB2efXgeb3u8
+X9lG9Z1LdS8OemAWHkfQ45jCjwsUcu+xgZDzyaI/GwoMhrqNddAJxvAsPsqJ+5J3y/Ld1w+s5AJG
+ko/GOunMJ+G1KPJ9yDyD8Y/g6DHdvLu/VC3e42wQDTcZTIlTwGKd2cl8fJT4mR3rz4TD58E4c/Lh
+gS4Hr7psdnnl67v2de71eaAIodgV030Tpzf8Pdj7500Ypxgh3hC8bxF08OHTa/K6cPaIqn0p984l
+IwqNHcZ7Nwx3dj3NnE6irVQkE7rTnwLG4o3rS5BExQFIIrkGnLgxVuAhasD0nTXc9mcECeSnPUhP
+I5CzM5BA5zcDlRmXbYEKxLu3V6uDhLtf3O3ZAKXcI3lli6f52wqvwIZ6207ExqEBbvxZNnA1qIBh
+cwUWX7LYK7dz6cZNGv0+j3jkuHTnKBWwnPSmx71qzuLMOHMR2N9OCfdcCk1PJlke98tAVAfTufUl
+eCLF/FOQKhcPZNq5Sf3PhnNnNAA7JQWpuWSmYYlyBanntQcyKdiVxmljrPVOT45/aHd6YVKuXTJE
+RgxoxS8bF3S0Lq7PFqkwaeJ+v0ZAgmMWfCVP0T+mPce7Sp8VoEr78Wcr8rICCXSh70s7kF4JSGhZ
+2AGFmDABpT/FOzhfaEGC86IDdVKZXC0Hak2QXN6VgNJBwrinn5YdWZz9ZQxpTXZEfH3V4UrUbzpy
+6oGc5J4tJ8XjiDT2ctFWVNq5jajaHMiX2rJzDgfO4pRjnpI6LF7IKh/j7jcsJn3Qd9+O5LoWrOcE
+bwS6ACm2ucNne/RA66Mlqo90OLQmm4Hd/xMCBUjqc6qTlI0UW0JUR5z1sMVne0rV1rJkWDs+XXz7
+oT0AQGP00LbGtsMyuZR4bQuryzveyrUZm2EHnvWPK8A6O654e7bNgV31uL63bY8rruX0LLVMLFf7
+NsM23myHBQR9GbgAcpiFYV/smMuLDdWW+9YnrCAc6XFkI0fgT24LBQt0vNpsXXVgqSkFC4G4znDI
+rebKBAkuVWXPLSZozaLHX9n6wQfGNkqvROlW3kD/fOr7MjQBdf/5PtvYFncUV/j1q3hMwhHogVfM
+WX6XuInU3y4+vtEPc8MGvqN7DJtP9k4fTo7qSeb4oqc5Z6Gtuu9ppD+fUt6Z77+L8ZwfLb7kF4l3
+BTO7NL8QrL8bRhfNceajUsJgzuN++uPos4iGu+KwP6yL8X7q23fzEW/tiUXcqyd84wIMlrO+4myC
+P6VZXOgZzDrf9uyrGaL/Z2YbfQEXzDJKqIfkTighsVz1VQkVsPnvSS7BXNwCHsKP6p97mXsllKV4
+/LEtefotkKgRWuJq3OgcgxhcsnJ3GwC6ewkYbRowOQ5Pu8fVbH1wFkoWm/GmIVjF+/vbYMfd7mTO
+u7e3JscnCQShlcTEo5pDNzhGk8urhE8OQ/et1Hfha6T4B+eCObXk7e7hMWz33fViQOm+q9u2JCKF
+33ycj0lxZ+mhQiL5armv7fTkSwmu5E9+BD3yg9vZSXde3zit7TEOW7LvnwWw9mHNzD5Sss/vM8TF
+Lr62f8haovf8Yc04PYnHPo2F1PfeaU4z631eY6ArffyilmvNXmPzVZT775feLkasRMXi67xe9IHG
+RiLG6bbk72QW0ObnZzHTBw8cvvxohp2JEj0ddRp+DdZ7KfHA+MPan7tg7+d8ecaLzulLOHK1XYUY
+mrvBfG6fO+a0bXyU0Oru5N738i9wAo+2SWQE3ZgZA0sBGkqA/f3QS1Yus3l9c1xezQ==
+
+
+ /+uVsVMcWj1fydIVaJkY6tHRMYsgyXgOCkrwCO24+QfFRLx3nDYEfV74bBdsZOKA04JCxEFV1UJG
+4ihRTudvQA/xn5MoHjpBJQw4PGldUl9JqfH4kDl4KEWVcNosGAXblPlIxJ+TF4Qnm4GKYrToKNmv
+196V84K35xzujVvtrG/rrp3JeT8u5gNKF+J9zz9IDobDekqYpkqmiJTCYT5zJ+Pnu8Dx9uE2vnMG
+mA/siNssc39wWf5GHfVkB/Sj/SfVEfJ+fgyc6mRsiFx2vZWSIZQzH4QBi6/16v8A7SqHmTPbEvqg
+B7MY0d3Z9s1RHInhEihmb0LcEYpD15wHqmVuzYIs1/qkuJa5aTc+Kbt3gRbfee27uBjb8l9IJVk6
+BS7YqpDAuPoOCcaNIoVUKB6PEe89MArvNF0YTK4RzKF2Srhp+nN6U8HARA45jMLCSGvvK1lJ336Q
+ZcyOoV8JtxWfLp6zb8PmF9DiVkQbjASC2Ex2J/R5z3Ah3yRZDHUraswf/yxdle8wMuJvXish++/W
+C4xTYGup7vd5WQvjA51PfOHLxfi++kDc/vGUT4c7hyL63bcQqYVovHF7Q4QWSfZAWQm41aJFC6I1
+1u6nSing0lupwmMpqbJWRbqeMBhFD6NQ68/kx2Gq+yzHCAx6nGYWf+metnOJduJZOQJkG9lU/dMU
+0VHjNPL4hHwyQOmH9/wnfhKjQ+IdVN+VO57sXn+3BCCxTy6vOTfk+DTvI9GLROzB10lxX2E1Jq70
+C4Z7Sngk3SjHzCGTdGtag+mTLVX3eKgWsvVws4VWUqe9rTiWQDiO1SDN6O5UTZBIpTygMBwntFCP
+b5cczePdcqwTOK4OFE1BCfoQl+xD7eeC8Omzo9c7hhAX0cf0AI/gzZxWE/Vk/8QzyJw/idtKyi1/
+6BOSkebpbeLno91XL/h6mISVQodOMBZAPWqQrNzv7GffxWHD0M/iTntxB4DK/aAH/gsTaUZqoHP2
+A0OQmon31MzWvc26iQQQTxktEUqVj2QtO3u5zHfw9Oj+I51guO3vj6z/tdYGPaMyzj62Jruq0Nv7
+8CYOI18dZMcvChcAZCW1lL5sH/NdSMpQEiQJxyditUI/9fl+iXZlJ/n8nq2XqjPZpgV97t+PK6nu
+Vj9HojyyeOpvYDgGtbCHDHkQPbwX3zDtpYMh8lI2WPk4MMCFn6AA6v0Za7qlwj7k5Hvi8CwdxsHi
+amhY3d9YshxMgLLRqUxIsgtqzJdaduT4v49dAsMKbiHKiu6Dm2m3NboeddqdvjvoirsOkucse9tv
+DnKjVqvS+s8kM2hMe63+xB1zHyTL6fNzCfhrY9BsQXfvXDyn8aFnOuppV7QxX8sg/aPYe3R5SehT
+zeES42PMMPWBrGuPF6LEx7X+affuq556vywlk8E++xI/Ye+kzHZzms2kz55ftCjq0FyxBKLIGZQV
+AAHdPji8ukjk5fGxdHZ4H84NHgVgrNnR8yOTecxVK7mj5FHDCh6NISo6z9dKkfOZwFseORfqB6ks
+d5YgQfPEx23lKnkmvl9RRc5Re1dVBEWT7/a30KR4UyLit6+5GvD8pytDogS2SZXn1H3qe1eaaCcE
+j+VXp6bwx5kQ1APgbLDdPlaYkS9br3QOM/n84d68CVMAtb8XxByeoprIo6RHvEQTsWtfCznJKVE0
+NTWz9pT6zpwxKg9nMi8khIRhp/RTCxihvK9EX0h8ngTkhffQi/IlF9x4NVyvpRLqOVN6WyzPHhzo
+gRwlf6ReOdxGsRp8ieTejpM1+4w5e6PncXAJyziVVaEU8vWUPKrKxVRWRYh8+ePyJkaNMFGkJ9lm
+7LhnYbj00UwMn748+2LpVrl4OxtnlohmCAKWrYwjlzd2WSudKOaBvtP3l8NzAvycDXSHcfeTH2Nb
+z7eX8zWeZ+zyBZTP4uOBIeqO6QioVPWOMDmvWwWB+CIbktfQqkp1Wyk20bseltQw3selrKf7YZxw
+V8lHNybtFB7A0mC+CWtE5OfwEz6RgYRZmSJIxZNbEA3j4JzhkhxlznOPW9qfhwB3/uHDuKDGjxfU
+ndeQJky07M3rglgiGYGouIeeMOVd+diaoOkWJGW20Mrkdv2lVOSuNNEyygw+EYwEHqN0vP/J+c4f
+bmabc6mmuoYS6J5gdmD3MTdAswwq9Rk6QpqZ4XlDFfBmMauNPDg6U3TDxWS5C80weQ7PJeeh7UOU
+Lu1oPj5ye8e+M2OXe/kj0w7kaxa2y2G2cfyyDasPPphAArFaehx2zGL+ZVwvgfWSDYPpIbfErdxb
+CbpIrOZveX45er5KH+WSjXYDU+Su0vxR5ZjYuEoCByba6VYMWct9kFhBhgQ7dvBzBiRXJCSSydQu
+Lm4T8ZPpZE4rP79Pd46OYwoTBu39OxEvT4qpkPQVSHXD7f1ksfFRQLjK5FNkzcfsY/MCY7Avx5ge
+gihq+NKd8SFL6iTmy2FN18KkNPPg+9p2UnSmzE3760nF41vhKskcTscqHzt4BEpW0unZg+3xYeA2
+PlI6oXZE3lET4zBZbhZZVlMAX/NZ4xFXbKDgI1ZonKksDNtaA6EBp3LBelET8UwJduoJROvlOtXL
+qZuMVsDgIvui/4kZna3UWWX7Ffc0jSkfQWK0n2DKSLo3S7W7RLfLQ7J/tv8zy+vSH1zMvvU10JBa
+64FmXPlBsVVNxCs3Y+Xp3AUcqyfMcIUK+t0+QUQNt+OtyvsNCNtaz1yaUrmYTGdyXy9YUT7seDHF
+xN3D0Yib7Hr8h1eCJ3Swd4cp9BnPTkY6nGXUn+CDC0/wZ3iND04wwb7pCV4+nHn2f7ZHsC+XLyYX
+J70RtroJhqkzqxphq5tgcF5WNsJWN8HURJCVjLDVTTDtoodVjLDVTTDislnRCFvdBMOSjFWNsNVN
+MCUpfzUjbHUTzOVdNMK0mljiifZXR6TqoZ87zDVZs0Kv2AbG4rezTMszDOIZaiTuKue1XFYqtZRy
+39zsURv3PEw+5KoU3UrcbS5ZnmyVcZObWPNxrBTKGzKq2qXXWXrdrVVaHGoXmL71Vpm8ZANjfnfG
+wpZngiUcM8Eau0ZbbHnWG36is7Q0E+yOIhNMS2jzTHzj5ZlgzPlzMKxFkpalCk7rxR/TSkHuO2e9
+2a50a+v45HTpSm/nPnW5NOuNyR5eZx1W2tqKHNiuVNt9ZRmpg0untMiz3TNjcdjJaSATDouPxGhQ
+5JlS/aA+uCfSjhTkaPJOed7bAuMk86Vkus1y2fb53fgTO59e92Wwqy4i4bieJ2d61+VV3gbl9gvs
+pdhuLlnqjWcxpQZ7+tpmQOa8jlDNO8/6b8/HimoL6ucNBu5bWAHYIlFivZgJU+7ec8kn1gPyI/WK
+7lq9sH2+NsY+2sy1S7TRZhJrNiVOhUNrRZtfLpcHwNHe/2XGCgVIJPBgCMlerRnsXxLqrwZBVm48
+L6+2dXpuymExpM44pUYZP1JtMPvSy/PyDGlAq+TldW9WT3UgsnJZvgdGnH6dFApr2VwWFl6BPbYC
+yeWlShb8ZQ6P8ZpCI1Cx4mTt/MVFkDBM+/vEorvBcna0/OwvMKQ12ZHp7L+8U1C/He2/2uaqkQJp
+Mu062WpW59wqVw3k/m+z1Shy1VAik1yamC/4RzKyydGb7f5qRFW3T9SiSP/dlECZJ6kW8fasS1R2
+qU/vZkq1Wsvq+dPvS9M1HdOybaFtLMv/ah6YBjWnmD/ZDfvxG8wCT16WXLrmcU2Y8pXNa+ktT5dH
+dvxjMWwSTbysDReoPitrsR8W7Zd31SF06x0ky4+eSYp7v/wislmpNrlKH7wSp/l83cmLfrOBegH6
+8rsNfn2zAWDM+W6DX99soAbpl99t8OubDVxeirsNAr+92YAU4TvdbfDrmw3UhLbldxv8+mYDl5fi
+boNf32wANOZ8t8GvbzZweSnuNvj1zQbouXK82yDw25sNMC7meLfBr282wFJMx7sNAr+92QB23/lu
+g1/fbABrcbrbAAxgh/sFHC81QHt/tQsVVptUuc9gVh6/eKPBBu8zUEvKrW402OB9Bvq1OAs3GgQ2
+d58BXryl3mhgIVoNlZsF081B0jDIjVPfmb3PmTC6RWob5fZ9/g7AkL4HWVHdJnC5lExV9Au9zF8K
+EM+cN47u9J7Yj/jopGQ5+L1DHEuGywO2qsJl9rHpbRNXMuxVXxV0IPck5YqfWUq47+ygs1XcnaVN
+vM2c5kRg9vQwgybU78d6W1LknzvJSJNrq36B0vM2iWjgqVRiGiUmt783muphDxQE7yAIvv2pXmC3
+qgyWPxmWofMgljn/+jnjMqGngDGW0mxfZAPj7G7685kPJpnjaZQQl8ur31iAQraRhR0ZAPqDUzWO
+fFS8IUEYY1TiOBuaRSXUT3ZwwZEHyed7vp93ti/aB8qUKvGr3e/qLBSSnt3Nu6uFQuDgoslBrihY
+JIHPJ4Z9ufxMRfziyJgRQfJFMOuWI/EJvK/sKdPKPuwBEvQ06fte7r0w4MFw2/pMdfKJseoO1Or9
+UUDf4+5Xoe00DIpKqJ3zfUivWP5fx5i4d7hvOGiRA7meaX1dHDKRev4ED1Ioze0cvWfC0/EDSJ/K
+VHvABJOV7G5HzWzeO+NzvnxSVyH2E7HsAXDQVP1E0S0vSbRBi2Tc1xOVG6mMmaEldX+1AIia4Y4R
+R/2GgMF/H7viQEbnLPuW7TeNuWQurxdayq3JdIgdIm+pVrvTL9T+aY1crFv5j4H/WDfnjspuLhLB
+fxg3D/8v1F2+xqA7GI397kLf5X07SI4mmU5j0hn0a6N/3DFsergs3J5n3DH3rGvc7QNImDfoDE/8
+mLz2BtC9uRh3Ev7/8LdrfwpzZ+D3axcTZjg+4mbCLCcL8E+EkSWY+tvFqIDBC//AHxfwyxc0/e0W
+3JfupxfG3cSxblwCK4R5GcAWInyYkeDtntIWjUKTFGZFRnRjQ1SGhQnRaDgiwUwCy4Yl8prEhwWZ
+4dxpl8AIAI0IDyUAxM3LXDjKiCym74UlkHxuXpLDgihIbkFkw5gCBC/xUT4s8xzMIQphjmOjbj4i
+hAWOg8lEeCREeTfPywCaQF7jZFguvMaL4QjHRsjgcoQX3TwnhMWIDFBH5TDLsvAaQC1HRAXGKBPF
+11gmLIk8QBAVwxLDYCc2zETgF5wtKokiaYmwLC6fA0AkjrzHwioFVmljYd2kJRpRWxgYkrREohHS
+wsusSN7jw1wEloC4EWVWgLXwAGaUcwOCw7LMwS+48IgIA0RkpQXekyPhKC/xSi+JgUHZCKBHgl8Y
+QIYgSWRT+EhUIDsHC5ZwC8jOMazSxghKJwkXjNsr46YubHja9QETQn+YXMGxBLvWI22wgIjSJsJa
+sUXgcBBsEQSlJSLwSgP8z91wKZ0krRMfdSsDCbOBRPfidA0AggGiBsTBS6zyROQEAgduiCiSpoiE
+hAQtUVmQlRYetxGIjYmyCiCw3wIBZLEXjiSpI0UlZaS56RCO/Vvrw0pOoXb4wiyMzA==
+
+
+ IPBw1sNSVMLjx8Ay4fBxoFlGOaQlwDEflWRcBeCdY4AKeUEGJCBa4HiJER7pmwHqwpPCSHBSgKp5
+IBegdDwgAg/HgQFUzdoKpC0aZZR+oN5ESFtEwSTPiGExipvEc2FJ4pAykT/g8YWJGFw/0iXP424J
+XAQQF4XXWJhbJCQjKQTCs3Bco4h3eJ8nYEELJ/HaYQfCBrA4EagPVyHKYZ6JwuBwklgBtrvqQtqO
+EMKOIow8TAa/8BKLrUDRPJwVNxx2RAgH/Tl8EoFfkUphRs7NCZEwnGGBkIyMZMVxeKwFmCfKAb9D
+YIBvhCWYi8DAsTATxwHIwK2gJRoWETwOliUzEraIsE+AKGA2wEMAoQilIMEpbbhYOHiiRHYJUCVE
+ZDcL7AQISybwwiRzLSpXSLv0Njie5GQADAycDQ4OmKmN4QSln8wqsDLALqMRmBMQIUUA8xwTBUaJ
+x59H/gHUzOGGMQJH4OJkgKLhQvgJqQMWYbGMRFCj8KIIo5x2DqkCuQ3wpGiEENQicRacaL6QUoQf
+iEIi+kKhtYThZNBr1CZUwlDrSiUMiSB0t1eQeVGNBQq6zIuqMk/WZF5ElXkozRSZx2kyT9RlXkST
+eTyReYwm83hN5kU1mcfrMo/VZJ64IPMiZpnHW8g8XpN5vCrzJE6Tebwm80RN5gGlqTJPVmUesBmT
+zIOWBZkHbSaZhy3zMg9bFmQeYy/zhAWZJ1rIPEGTeZIq81hGk3lRTeYJusyLajJPUGVeVJN5gibz
+zBuuyDxWE0K8LvNYTebxmsxjNZnHazKPVWUer8s8VpN5vCbzWE3m8ZrMM083k3mSrAkhXpN50KTK
+PF6VedCiSjNek2aMJvP4mcxb7EVGktSRiMwzT4dwIHELMuKMCYtAKeRI8ApDR/TLEYmwYCaCHB4o
+CTghS/YxCoyHsHxRIrsv4mmRCOETKQBDANkCBxeEqCInkZNGeZacLAGJFV8DkmR5RCD8AhySMEMg
+OlwdSC+ZQTICBHKIUiAaEJ4CvofgImkRlVKAo4AaUwQXIIiEJHG/kGgiynuyQtx4bkVCLNBL5nBX
+NNkrgFgBquHIsiMRWSRwskyUSGNAU1RAARVl8OiwbgVxiE0CCse7F1CZduKvU3K2EYG8DP/KcHh6
+5NzKHApWra1gbOPIlhQMby62zN77mDXCsQ3LUZCehglmbQVjG6yPFwTDeJZNszfxPAE9inxkBgqS
+kKjqBDPoDE36svQ3rdq0Vw1TzGAxzGGAz9CmL01/16pt9u4HbgfsuETYAHBYVuIJa4jgaRH1poJC
+fUwkMtfGAwELeAIt20D3kGUydQQYRASp2dgGS5WRunhU6YncRtUZGR7IA4kTUFSwirAXBGQ/ArIR
+hANoH4hRAJYbxbMCSiacF2xRtSzQhsKiGNUb4DXUcfA8651gX4Fjw2t8FMSOzJOWqERAEhXJogii
+qBTR2mSi2oFKysC5I2/KyIyUNo5lUO+UUF7gaHjM4QVBANYuskaw1AZlNaAyCoZOEdT0WMJBQNuV
+CVok5ABkwShj8DUQpiIyOgHPLbK+CAhTCTkPoJOXREXOwmAGpKM0jhJJqTaR/cLtZ/Dko/rECgo3
+4ySJJfsQAWUayBKMYxaPu9aCImzWBlwQeQiOBaQYlWW9DWQTTITyiVdsDpwO6JHVQUgrVpQEG2Ak
+D2xTCVCWOA3QOTolupxiovCgFER5lKPA2qISCKqe0oaESJoiZAxg5qh5ALeXJNRCo7AIGeUbil8B
+dWHoIQqMYWbEGlgZojxP5lFgqjzqOmAnSBLuN/RiCC9EWxwsFTJ6RJYUoSICTnAs2GdgOpLephyt
+KIeUgnZTBAWKonQocImipFDB3IlMW59INLhA8qmWTZTQHEgunqwZ9CeOaNDA9QRiXcvAEQhUAop5
+BVeirFC0iDJc5MnuE9JWDrLEsaoNilZVgfAK2DhJkb6oguC7qABGFH4eYSKyijGOVfuBbCNNomrb
+oZohs4Sjo56IG4jTMqgN4NaDwBNV8ECdB4YqabIJNxctzDuVBiReaSPDkhY8FKQFjaYFOklrigmA
+LEWJwQ1oifJEakTQRANyB8qAHZIi2sZzgtrEaaudf1W1Mm5dstvndz/cu5ZJRK0Ph4pVhKiAcGii
+HApGMKlQj5VUHQtW0HVxUcQpSm+wfjng5Ni28G4XQLCfkxMRUlRv0XCLAP5gLmAOIOUVNUqG0wHD
+ossCSJNsBuEqXYtXHaYCWgazQVaEG2jvOFUE7UtBUa4icNpgWCBB0CZEhf3wUVzB4qvLp0IHGyIB
+2WOEiaJURnKKsGhBC7hvcIi7hAswHE6vyZfu4qsOM0mCIkN5kEwysapwBKJO88hIQVTgqBJaNsjE
+gXEC5ZAm05sOExGjAfmliLiAXcc1RZQTh2IRrG6ewI/ePpRT0I8YUV2Ldx3mQncZw0pEFBDeDHNx
+ILPwBHBwGkEq4LCg0ooiylt4xrEcWejCq05TgeYqEi0BmJhEDhs6TDhUldHW59RhkVsSLhuBbZTJ
+qsyvLp9J0WKRXDkZLVFclMAAGxNR7YU5QQ1EaJEfS0TX4HhFu+5avOswF4NMl0eGDxKDEYkvDHkC
+4V3o5kEGDOPCwY2KaIKybDjKsjJpM7+7fC5V8KG4n3Nzwepwq2zcXBxrdnNxrIWbS1LdXGC8L7q5
+ZDRaoIlRLCvQQBn0I6C1CFsDz4jbDu0oBjUAaGPRVIA2dF2xqGihBSSJskpVHDrIOFSyZYJpURkL
+IOTRT4WePEmUOGKBy+iDRGUClKYosbeiRNxBi4xuCvQIRlVvInE7RfQmlFUo/1nF18QSrzlxcxG5
+xqMfh7jQ0JeG+pQiHBUnEqpmcIyEKJxiOHthiZhbyAtZ0c0BouDoKwoFx0RY8hpOi2tDJicR4cYR
+7xu6xMhxBV7LEZNZVjGM/jD8BRBEOBF6z2CkCApgVlaYUxQ9hRFeUxRgEjTUOaI/otNMa2kQlspw
+6GDRezEKmnliVgLj5UBTg8MkkwWjcgrT8cAtRBRnuMXoSOOQIEgngB+1EHS+SRySmIiCNYLmKScg
+USP5yKjqwUpA1spIh3iMiJwiXEIhSPTTRKNq2EB1jQqKaxTQBBhTXaOi5hrlFlyj7IJrFOYBjosi
+JIKyBNaLvh5CKKCHMKiHKO5GpBiM4PACKuEcg5qbdkRBhSDvCSIwaWQGQjQCK4ZHgog8F6hRBnMD
+34OHircJoBPRaObQlGAjCmcGUgYwQUkDBRNb0KJnRLKfwLii2AtMBOLcIr1ERlGcJVDHoQU1LZkl
+DJUokQ0iNVEnBgg4Hl7n0HkUVZkzUfU5UMBFDq0HHmMVMiHfqKS4YdHyAWQAMmFfRRZ1woga2MGR
+0Y0gYDhJIjhBB5PMysQw4XmwylAYK6cPNlpGjxi2sCKgXiAqJfH3gdmGDjTSiZFYluxcFIQPaYmi
+3sfxsuo0gxYRthIxGVUIDJvIatHhSxyR8DqPh59DhiKyioEDFEe8wgxhqVGVj+PSgLMD61HCeBLL
+oH8ZGST6LOAXYLKc+l6EHAwZNw5sKw4dh1FB8dezHJIOMk+Dnz1NfNBmP3tkwc8uWPjZuQU/u6h5
+1XnNzy7qPvWZn33WFtV96hHNzz7Xtuhn51H9jxBWSyw2JHJRwBYOYzLYMvOzEwPY7GfnzH52IAST
+n52Z+dmB04DOAfwAqJwHBgK0gfChps6rMoSLomcN0QAnV0RhAu/JnGKdzNoKxjYeScDUJoaBAGA0
+9DAyRKRhZAnIEpQTVbrA+WAjxE7mkBGAugRtOABuGViRsEkCacHzzEWRVyBeAFCGJxYBgioJguIj
+YDmF4cObPEGLwn70yAKrRBbSxrBX1Bz24qSFsBenh71ELezF6WEv0SLsFV0Ie0UWwl68Oeyl2DeE
+wnlZIFSIZlhPDdDwircRaE5ws6CskOOD+8FEyYFCZiMpwWMiQ4AwgbEz6GuYtRWgDf2caCkAaxcx
+ukDeRCUHcSZE8HDAoMSYAP01wiiEg5FscoCA3eHZQk4gS0TWgcxB1zOHngMGhS0GDnji58eRMPSA
+yFdpGTkB8E0SH4oi3zGv1zHaaRX58RZr7VZlVOt0WyNXe1z7q+Wu9fuDSW3SGsITd3vUGk8Go5Z7
+/Dn4G1vgFa2715u9zrn+L1T7Dxc=
+
+ </i:pgf>
+ <svg:text
+ xml:space="preserve"
+ style="font-size:13.03699398px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ x="246.20877"
+ y="10.629581"
+ id="text2436"
+ sodipodi:linespacing="125%"
+ transform="scale(0.9830254,1.0172677)"><svg:tspan
+ sodipodi:role="line"
+ id="tspan2438"
+ x="246.20877"
+ y="10.629581">TM</svg:tspan></svg:text>
+</svg:svg>
\ No newline at end of file
diff --git a/web/tomcat/webapps/host-manager/index.jsp b/web/tomcat/webapps/host-manager/index.jsp
new file mode 100644
index 0000000..2806b76
--- /dev/null
+++ b/web/tomcat/webapps/host-manager/index.jsp
@@ -0,0 +1,18 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ page session="false" trimDirectiveWhitespaces="true" %>
+<% response.sendRedirect(request.getContextPath() + "/html"); %>
\ No newline at end of file
diff --git a/web/tomcat/webapps/manager/META-INF/context.xml b/web/tomcat/webapps/manager/META-INF/context.xml
new file mode 100644
index 0000000..120b7ab
--- /dev/null
+++ b/web/tomcat/webapps/manager/META-INF/context.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Context antiResourceLocking="false" privileged="true" >
+ <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
+ sameSiteCookies="strict" />
+ <Valve className="org.apache.catalina.valves.RemoteAddrValve"
+ allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
+ <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
+</Context>
diff --git a/web/tomcat/webapps/manager/WEB-INF/jsp/401.jsp b/web/tomcat/webapps/manager/WEB-INF/jsp/401.jsp
new file mode 100644
index 0000000..84c9a97
--- /dev/null
+++ b/web/tomcat/webapps/manager/WEB-INF/jsp/401.jsp
@@ -0,0 +1,80 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ page session="false" trimDirectiveWhitespaces="true" %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>401 Unauthorized</title>
+ <style type="text/css">
+ <!--
+ BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;font-size:12px;}
+ H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;}
+ PRE, TT {border: 1px dotted #525D76}
+ A {color : black;}A.name {color : black;}
+ -->
+ </style>
+ </head>
+ <body>
+ <h1>401 Unauthorized</h1>
+ <p>
+ You are not authorized to view this page. If you have not changed
+ any configuration files, please examine the file
+ <tt>conf/tomcat-users.xml</tt> in your installation. That
+ file must contain the credentials to let you use this webapp.
+ </p>
+ <p>
+ For example, to add the <tt>manager-gui</tt> role to a user named
+ <tt>tomcat</tt> with a password of <tt>s3cret</tt>, add the following to the
+ config file listed above.
+ </p>
+<pre>
+<role rolename="manager-gui"/>
+<user username="tomcat" password="s3cret" roles="manager-gui"/>
+</pre>
+ <p>
+ Note that for Tomcat 7 onwards, the roles required to use the manager
+ application were changed from the single <tt>manager</tt> role to the
+ following four roles. You will need to assign the role(s) required for
+ the functionality you wish to access.
+ </p>
+ <ul>
+ <li><tt>manager-gui</tt> - allows access to the HTML GUI and the status
+ pages</li>
+ <li><tt>manager-script</tt> - allows access to the text interface and the
+ status pages</li>
+ <li><tt>manager-jmx</tt> - allows access to the JMX proxy and the status
+ pages</li>
+ <li><tt>manager-status</tt> - allows access to the status pages only</li>
+ </ul>
+ <p>
+ The HTML interface is protected against CSRF but the text and JMX interfaces
+ are not. To maintain the CSRF protection:
+ </p>
+ <ul>
+ <li>Users with the <tt>manager-gui</tt> role should not be granted either
+ the <tt>manager-script</tt> or <tt>manager-jmx</tt> roles.</li>
+ <li>If the text or jmx interfaces are accessed through a browser (e.g. for
+ testing since these interfaces are intended for tools not humans) then
+ the browser must be closed afterwards to terminate the session.</li>
+ </ul>
+ <p>
+ For more information - please see the
+ <a href="/docs/manager-howto.html" rel="noopener noreferrer">Manager App How-To</a>.
+ </p>
+ </body>
+
+</html>
diff --git a/web/tomcat/webapps/manager/WEB-INF/jsp/403.jsp b/web/tomcat/webapps/manager/WEB-INF/jsp/403.jsp
new file mode 100644
index 0000000..4baa2f4
--- /dev/null
+++ b/web/tomcat/webapps/manager/WEB-INF/jsp/403.jsp
@@ -0,0 +1,100 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ page session="false" trimDirectiveWhitespaces="true" %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>403 Access Denied</title>
+ <style type="text/css">
+ <!--
+ BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;font-size:12px;}
+ H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;}
+ PRE, TT {border: 1px dotted #525D76}
+ A {color : black;}A.name {color : black;}
+ -->
+ </style>
+ </head>
+ <body>
+ <h1>403 Access Denied</h1>
+ <p>
+ You are not authorized to view this page.
+ </p>
+ <p>
+ By default the Manager is only accessible from a browser running on the
+ same machine as Tomcat. If you wish to modify this restriction, you'll need
+ to edit the Manager's <tt>context.xml</tt> file.
+ </p>
+ <p>
+ If you have already configured the Manager application to allow access and
+ you have used your browsers back button, used a saved book-mark or similar
+ then you may have triggered the cross-site request forgery (CSRF) protection
+ that has been enabled for the HTML interface of the Manager application. You
+ will need to reset this protection by returning to the
+ <a href="<%=request.getContextPath()%>/html">main Manager page</a>. Once you
+ return to this page, you will be able to continue using the Manager
+ application's HTML interface normally. If you continue to see this access
+ denied message, check that you have the necessary permissions to access this
+ application.
+ </p>
+ <p>
+ If you have not changed
+ any configuration files, please examine the file
+ <tt>conf/tomcat-users.xml</tt> in your installation. That
+ file must contain the credentials to let you use this webapp.
+ </p>
+ <p>
+ For example, to add the <tt>manager-gui</tt> role to a user named
+ <tt>tomcat</tt> with a password of <tt>s3cret</tt>, add the following to the
+ config file listed above.
+ </p>
+<pre>
+<role rolename="manager-gui"/>
+<user username="tomcat" password="s3cret" roles="manager-gui"/>
+</pre>
+ <p>
+ Note that for Tomcat 7 onwards, the roles required to use the manager
+ application were changed from the single <tt>manager</tt> role to the
+ following four roles. You will need to assign the role(s) required for
+ the functionality you wish to access.
+ </p>
+ <ul>
+ <li><tt>manager-gui</tt> - allows access to the HTML GUI and the status
+ pages</li>
+ <li><tt>manager-script</tt> - allows access to the text interface and the
+ status pages</li>
+ <li><tt>manager-jmx</tt> - allows access to the JMX proxy and the status
+ pages</li>
+ <li><tt>manager-status</tt> - allows access to the status pages only</li>
+ </ul>
+ <p>
+ The HTML interface is protected against CSRF but the text and JMX interfaces
+ are not. To maintain the CSRF protection:
+ </p>
+ <ul>
+ <li>Users with the <tt>manager-gui</tt> role should not be granted either
+ the <tt>manager-script</tt> or <tt>manager-jmx</tt> roles.</li>
+ <li>If the text or jmx interfaces are accessed through a browser (e.g. for
+ testing since these interfaces are intended for tools not humans) then
+ the browser must be closed afterwards to terminate the session.</li>
+ </ul>
+ <p>
+ For more information - please see the
+ <a href="/docs/manager-howto.html" rel="noopener noreferrer">Manager App How-To</a>.
+ </p>
+ </body>
+
+</html>
diff --git a/web/tomcat/webapps/manager/WEB-INF/jsp/404.jsp b/web/tomcat/webapps/manager/WEB-INF/jsp/404.jsp
new file mode 100644
index 0000000..111a800
--- /dev/null
+++ b/web/tomcat/webapps/manager/WEB-INF/jsp/404.jsp
@@ -0,0 +1,63 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ page import="org.apache.tomcat.util.security.Escape" session="false"
+ trimDirectiveWhitespaces="true" %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>404 Not found</title>
+ <style type="text/css">
+ <!--
+ BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;font-size:12px;}
+ H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;}
+ PRE, TT {border: 1px dotted #525D76}
+ A {color : black;}A.name {color : black;}
+ -->
+ </style>
+ </head>
+ <body>
+ <h1>404 Not found</h1>
+ <p>
+ The page you tried to access
+ (<%=Escape.htmlElementContent((String) request.getAttribute(
+ "javax.servlet.error.request_uri"))%>)
+ does not exist.
+ </p>
+ <p>
+ The Manager application has been re-structured for Tomcat 7 onwards and some
+ of URLs have changed. All URLs used to access the Manager application should
+ now start with one of the following options:
+ </p>
+ <ul>
+ <li><%=request.getContextPath()%>/html for the HTML GUI</li>
+ <li><%=request.getContextPath()%>/text for the text interface</li>
+ <li><%=request.getContextPath()%>/jmxproxy for the JMX proxy</li>
+ <li><%=request.getContextPath()%>/status for the status pages</li>
+ </ul>
+ <p>
+ Note that the URL for the text interface has changed from
+ "<%=request.getContextPath()%>" to
+ "<%=request.getContextPath()%>/text".
+ </p>
+ <p>
+ You probably need to adjust the URL you are using to access the Manager
+ application. However, there is always a chance you have found a bug in the
+ Manager application. If you are sure you have found a bug, and that the bug
+ has not already been reported, please report it to the Apache Tomcat team.
+ </p>
+ </body>
+</html>
diff --git a/web/tomcat/webapps/manager/WEB-INF/jsp/connectorCerts.jsp b/web/tomcat/webapps/manager/WEB-INF/jsp/connectorCerts.jsp
new file mode 100644
index 0000000..9d86a46
--- /dev/null
+++ b/web/tomcat/webapps/manager/WEB-INF/jsp/connectorCerts.jsp
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page session="false" contentType="text/html; charset=ISO-8859-1" %>
+<%@page import="java.util.Map" %>
+<%@page import="java.util.Map.Entry" %>
+<%@page import="java.util.List" %>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<% Map<String,List<String>> certList = (Map<String,List<String>>) request.getAttribute("certList");
+%>
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
+ <meta http-equiv="pragma" content="no-cache"/><!-- HTTP 1.0 -->
+ <meta http-equiv="cache-control" content="no-cache,must-revalidate"/><!-- HTTP 1.1 -->
+ <meta http-equiv="expires" content="0"/><!-- 0 is an invalid value and should be treated as 'now' -->
+ <meta http-equiv="content-language" content="en"/>
+ <meta name="copyright" content="copyright 2005-2021 the Apache Software Foundation"/>
+ <meta name="robots" content="noindex,nofollow,noarchive"/>
+ <title>Configured certificate chains per Connector</title>
+</head>
+<body>
+<h1>Configured certificate chains per Connector</h1>
+
+<table border="1" cellpadding="2" cellspacing="2" width="100%">
+ <thead>
+ <tr>
+ <th>Connector / TLS Virtual Host / Certificate type</th>
+ <th>Certificate chain</th>
+ </tr>
+ </thead>
+ <tbody>
+ <%
+ for (Map.Entry<String, List<String>> entry : certList.entrySet()) {
+ %>
+ <tr>
+ <td><%=entry.getKey()%></td>
+ <td>
+ <%
+ for (String cert : entry.getValue()) {
+ %>
+ <pre><%=cert%></pre>
+ <%
+ }
+ %>
+ </td>
+ </tr>
+ <%
+ }
+ %>
+ </tbody>
+</table>
+
+<form method="get" action="<%=request.getContextPath()%>/html">
+ <p style="text-align: center;">
+ <input type="submit" value="Return to main page" />
+ </p>
+</form>
+
+<%--div style="display: none;">
+<p>
+ <a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-html401"
+ alt="Valid HTML 4.01!" height="31" width="88"></a>
+ <a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-xhtml10"
+ alt="Valid XHTML 1.0!" height="31" width="88" /></a>
+ <a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-xhtml11"
+ alt="Valid XHTML 1.1!" height="31" width="88" /></a>
+</p>
+</div--%>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/manager/WEB-INF/jsp/connectorCiphers.jsp b/web/tomcat/webapps/manager/WEB-INF/jsp/connectorCiphers.jsp
new file mode 100644
index 0000000..8c0f940
--- /dev/null
+++ b/web/tomcat/webapps/manager/WEB-INF/jsp/connectorCiphers.jsp
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page session="false" contentType="text/html; charset=ISO-8859-1" %>
+<%@page import="java.util.Map" %>
+<%@page import="java.util.Map.Entry" %>
+<%@page import="java.util.List" %>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<% Map<String,List<String>> cipherList = (Map<String,List<String>>) request.getAttribute("cipherList");
+%>
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
+ <meta http-equiv="pragma" content="no-cache"/><!-- HTTP 1.0 -->
+ <meta http-equiv="cache-control" content="no-cache,must-revalidate"/><!-- HTTP 1.1 -->
+ <meta http-equiv="expires" content="0"/><!-- 0 is an invalid value and should be treated as 'now' -->
+ <meta http-equiv="content-language" content="en"/>
+ <meta name="copyright" content="copyright 2005-2021 the Apache Software Foundation"/>
+ <meta name="robots" content="noindex,nofollow,noarchive"/>
+ <title>Configured ciphers per Connector</title>
+</head>
+<body>
+<h1>Configured ciphers per Connector</h1>
+
+<table border="1" cellpadding="2" cellspacing="2" width="100%">
+ <thead>
+ <tr>
+ <th>Connector / TLS Virtual Host</th>
+ <th>Enabled Ciphers</th>
+ </tr>
+ </thead>
+ <tbody>
+ <%
+ for (Map.Entry<String, List<String>> entry : cipherList.entrySet()) {
+ %>
+ <tr>
+ <td><%=entry.getKey()%></td>
+ <td>
+ <%
+ for (String cipher : entry.getValue()) {
+ %>
+ <p><%=cipher%></p>
+ <%
+ }
+ %>
+ </td>
+ </tr>
+ <%
+ }
+ %>
+ </tbody>
+</table>
+
+<form method="get" action="<%=request.getContextPath()%>/html">
+ <p style="text-align: center;">
+ <input type="submit" value="Return to main page" />
+ </p>
+</form>
+
+<%--div style="display: none;">
+<p>
+ <a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-html401"
+ alt="Valid HTML 4.01!" height="31" width="88"></a>
+ <a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-xhtml10"
+ alt="Valid XHTML 1.0!" height="31" width="88" /></a>
+ <a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-xhtml11"
+ alt="Valid XHTML 1.1!" height="31" width="88" /></a>
+</p>
+</div--%>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/manager/WEB-INF/jsp/connectorTrustedCerts.jsp b/web/tomcat/webapps/manager/WEB-INF/jsp/connectorTrustedCerts.jsp
new file mode 100644
index 0000000..a9ec0e0
--- /dev/null
+++ b/web/tomcat/webapps/manager/WEB-INF/jsp/connectorTrustedCerts.jsp
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page session="false" contentType="text/html; charset=ISO-8859-1" %>
+<%@page import="java.util.Map" %>
+<%@page import="java.util.Map.Entry" %>
+<%@page import="java.util.List" %>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<% Map<String,List<String>> trustedCertList = (Map<String,List<String>>) request.getAttribute("trustedCertList");
+%>
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
+ <meta http-equiv="pragma" content="no-cache"/><!-- HTTP 1.0 -->
+ <meta http-equiv="cache-control" content="no-cache,must-revalidate"/><!-- HTTP 1.1 -->
+ <meta http-equiv="expires" content="0"/><!-- 0 is an invalid value and should be treated as 'now' -->
+ <meta http-equiv="content-language" content="en"/>
+ <meta name="copyright" content="copyright 2005-2021 the Apache Software Foundation"/>
+ <meta name="robots" content="noindex,nofollow,noarchive"/>
+ <title>Trusted certificates per Connector</title>
+</head>
+<body>
+<h1>Trusted certificates per Connector</h1>
+
+<table border="1" cellpadding="2" cellspacing="2" width="100%">
+ <thead>
+ <tr>
+ <th>Connector / TLS Virtual Host</th>
+ <th>Trusted Certificates</th>
+ </tr>
+ </thead>
+ <tbody>
+ <%
+ for (Map.Entry<String, List<String>> entry : trustedCertList.entrySet()) {
+ %>
+ <tr>
+ <td><%=entry.getKey()%></td>
+ <td>
+ <%
+ for (String cert : entry.getValue()) {
+ %>
+ <pre><%=cert%></pre>
+ <%
+ }
+ %>
+ </td>
+ </tr>
+ <%
+ }
+ %>
+ </tbody>
+</table>
+
+<form method="get" action="<%=request.getContextPath()%>/html">
+ <p style="text-align: center;">
+ <input type="submit" value="Return to main page" />
+ </p>
+</form>
+
+<%--div style="display: none;">
+<p>
+ <a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-html401"
+ alt="Valid HTML 4.01!" height="31" width="88"></a>
+ <a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-xhtml10"
+ alt="Valid XHTML 1.0!" height="31" width="88" /></a>
+ <a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-xhtml11"
+ alt="Valid XHTML 1.1!" height="31" width="88" /></a>
+</p>
+</div--%>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/manager/WEB-INF/jsp/sessionDetail.jsp b/web/tomcat/webapps/manager/WEB-INF/jsp/sessionDetail.jsp
new file mode 100644
index 0000000..9f149e1
--- /dev/null
+++ b/web/tomcat/webapps/manager/WEB-INF/jsp/sessionDetail.jsp
@@ -0,0 +1,197 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page session="false" contentType="text/html; charset=ISO-8859-1" %>
+<%@page import="java.util.Enumeration" %>
+<%@page import="javax.servlet.http.HttpSession" %>
+<%@page import="org.apache.catalina.Session" %>
+<%@page import="org.apache.catalina.manager.JspHelper" %>
+<%@page import="org.apache.catalina.util.ContextName" %>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<%--!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"--%>
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<% String path = (String) request.getAttribute("path");
+ String version = (String) request.getAttribute("version");
+ ContextName cn = new ContextName(path, version);
+ Session currentSession = (Session)request.getAttribute("currentSession");
+ String currentSessionId = null;
+ HttpSession currentHttpSession = null;
+ if (currentSession != null) {
+ currentHttpSession = currentSession.getSession();
+ currentSessionId = JspHelper.escapeXml(currentSession.getId());
+ } else {
+ currentSessionId = "Session invalidated";
+ }
+ String submitUrl = JspHelper.escapeXml(response.encodeURL(
+ ((HttpServletRequest) pageContext.getRequest()).getRequestURI() +
+ "?path=" + path + "&version=" + version));
+%>
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
+ <meta http-equiv="pragma" content="no-cache"/><!-- HTTP 1.0 -->
+ <meta http-equiv="cache-control" content="no-cache,must-revalidate"/><!-- HTTP 1.1 -->
+ <meta http-equiv="expires" content="0"/><!-- 0 is an invalid value and should be treated as 'now' -->
+ <meta http-equiv="content-language" content="en"/>
+ <meta name="author" content="Cedrik LIME"/>
+ <meta name="copyright" content="copyright 2005-2021 the Apache Software Foundation"/>
+ <meta name="robots" content="noindex,nofollow,noarchive"/>
+ <title>Sessions Administration: details for <%= currentSessionId %></title>
+</head>
+<body>
+<% if (currentHttpSession == null) { %>
+ <h1><%=currentSessionId%></h1>
+<% } else { %>
+ <h1>Details for Session <%= currentSessionId %></h1>
+
+ <table style="text-align: left;" border="0">
+ <tr>
+ <th>Session Id</th>
+ <td><%= currentSessionId %></td>
+ </tr>
+ <tr>
+ <th>Guessed Locale</th>
+ <td><%= JspHelper.guessDisplayLocaleFromSession(currentSession) %></td>
+ </tr>
+ <tr>
+ <th>Guessed User</th>
+ <td><%= JspHelper.guessDisplayUserFromSession(currentSession) %></td>
+ </tr>
+ <tr>
+ <th>Creation Time</th>
+ <td><%= JspHelper.getDisplayCreationTimeForSession(currentSession) %></td>
+ </tr>
+ <tr>
+ <th>Last Accessed Time</th>
+ <td><%= JspHelper.getDisplayLastAccessedTimeForSession(currentSession) %></td>
+ </tr>
+ <tr>
+ <th>Session Max Inactive Interval</th>
+ <td><%= JspHelper.secondsToTimeString(currentSession.getMaxInactiveInterval()) %></td>
+ </tr>
+ <tr>
+ <th>Used Time</th>
+ <td><%= JspHelper.getDisplayUsedTimeForSession(currentSession) %></td>
+ </tr>
+ <tr>
+ <th>Inactive Time</th>
+ <td><%= JspHelper.getDisplayInactiveTimeForSession(currentSession) %></td>
+ </tr>
+ <tr>
+ <th>TTL</th>
+ <td><%= JspHelper.getDisplayTTLForSession(currentSession) %></td>
+ </tr>
+ </table>
+
+ <form method="post" action="<%= submitUrl %>">
+ <div>
+ <input type="hidden" name="sessionId" value="<%= currentSessionId %>" />
+ <input type="hidden" name="action" value="sessionDetail" />
+ <%
+ if ("Primary".equals(request.getParameter("sessionType"))) {
+ %>
+ <input type="hidden" name="sessionType" value="Primary" />
+ <%
+ }
+ %> <input type="submit" value="Refresh" />
+ </div>
+ </form>
+
+ <div class="error"><%= JspHelper.escapeXml(request.getAttribute("error")) %></div>
+ <div class="message"><%= JspHelper.escapeXml(request.getAttribute("message")) %></div>
+
+ <table style="text-align: left;" border="1" cellpadding="2" cellspacing="2">
+ <% int nAttributes = 0;
+ Enumeration<String> attributeNamesEnumeration = currentHttpSession.getAttributeNames();
+ while (attributeNamesEnumeration.hasMoreElements()) {
+ attributeNamesEnumeration.nextElement();
+ ++nAttributes;
+ }
+ %>
+ <caption style="font-variant: small-caps;"><%= JspHelper.formatNumber(nAttributes) %> attributes</caption>
+ <thead>
+ <tr>
+ <th>Remove Attribute</th>
+ <th>Attribute name</th>
+ <th>Attribute value</th>
+ </tr>
+ </thead>
+ <%--tfoot>
+ <tr>
+ <td colspan="3" style="text-align: center;">
+ TODO: set Max Inactive Interval on sessions
+ </td>
+ </tr>
+ </tfoot--%>
+ <tbody>
+ <% attributeNamesEnumeration = currentHttpSession.getAttributeNames();
+ while (attributeNamesEnumeration.hasMoreElements()) {
+ String attributeName = attributeNamesEnumeration.nextElement();
+ %>
+ <tr>
+ <td align="center">
+ <form method="post" action="<%= submitUrl %>">
+ <div>
+ <input type="hidden" name="action" value="removeSessionAttribute" />
+ <input type="hidden" name="sessionId" value="<%= currentSessionId %>" />
+ <input type="hidden" name="attributeName" value="<%= JspHelper.escapeXml(attributeName) %>" />
+ <%
+ if ("Primary".equals(request.getParameter("sessionType"))) {
+ %>
+ <input type="submit" value="Remove" />
+ <input type="hidden" name="sessionType" value="Primary" />
+ <%
+ } else {
+ out.print("Primary sessions only");
+ }
+ %>
+ </div>
+ </form>
+ </td>
+ <td><%= JspHelper.escapeXml(attributeName) %></td>
+ <td><% Object attributeValue = currentHttpSession.getAttribute(attributeName); %><span title="<%= attributeValue == null ? "" : attributeValue.getClass().toString() %>"><%= JspHelper.escapeXml(attributeValue) %></span></td>
+ </tr>
+ <% } // end while %>
+ </tbody>
+ </table>
+<% } // endif%>
+
+<form method="post" action="<%=submitUrl%>">
+ <p style="text-align: center;">
+ <input type="submit" value="Return to session list" />
+ </p>
+</form>
+
+<%--div style="display: none;">
+<p>
+ <a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-html401"
+ alt="Valid HTML 4.01!" height="31" width="88"></a>
+ <a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-xhtml10"
+ alt="Valid XHTML 1.0!" height="31" width="88" /></a>
+ <a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-xhtml11"
+ alt="Valid XHTML 1.1!" height="31" width="88" /></a>
+</p>
+</div--%>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/manager/WEB-INF/jsp/sessionsList.jsp b/web/tomcat/webapps/manager/WEB-INF/jsp/sessionsList.jsp
new file mode 100644
index 0000000..44c2e22
--- /dev/null
+++ b/web/tomcat/webapps/manager/WEB-INF/jsp/sessionsList.jsp
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@page session="false" contentType="text/html; charset=ISO-8859-1" %>
+<%@page import="java.util.Collection" %>
+<%@page import="org.apache.catalina.manager.JspHelper" %>
+<%@page import="org.apache.catalina.Session" %>
+<%@page import="org.apache.catalina.ha.session.DeltaSession" %>
+<%@page import="org.apache.catalina.util.ContextName" %>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<%@page import="org.apache.catalina.manager.DummyProxySession"%><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<% String path = (String) request.getAttribute("path");
+ String version = (String) request.getAttribute("version");
+ ContextName cn = new ContextName(path, version);
+ String submitUrl = JspHelper.escapeXml(response.encodeURL(
+ ((HttpServletRequest) pageContext.getRequest()).getRequestURI() +
+ "?path=" + path + "&version=" + version));
+ Collection<Session> activeSessions = (Collection<Session>) request.getAttribute("activeSessions");
+%>
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
+ <meta http-equiv="pragma" content="no-cache"/><!-- HTTP 1.0 -->
+ <meta http-equiv="cache-control" content="no-cache,must-revalidate"/><!-- HTTP 1.1 -->
+ <meta http-equiv="expires" content="0"/><!-- 0 is an invalid value and should be treated as 'now' -->
+ <meta http-equiv="content-language" content="en"/>
+ <meta name="author" content="Cedrik LIME"/>
+ <meta name="copyright" content="copyright 2005-2021 the Apache Software Foundation"/>
+ <meta name="robots" content="noindex,nofollow,noarchive"/>
+ <title>Sessions Administration for <%= JspHelper.escapeXml(cn.getDisplayName()) %></title>
+</head>
+<body>
+<h1>Sessions Administration for <%= JspHelper.escapeXml(cn.getDisplayName()) %></h1>
+
+<p>Tips:</p>
+<ul>
+ <li>Click on a column to sort.</li>
+ <li>To view a session details and/or remove a session attributes, click on its id.</li>
+</ul>
+
+<div class="error"><%= JspHelper.escapeXml(request.getAttribute("error")) %></div>
+<div class="message"><%= JspHelper.escapeXml(request.getAttribute("message")) %></div>
+
+<form action="<%= submitUrl %>" method="post" id="sessionsForm">
+ <fieldset><legend>Active HttpSessions informations</legend>
+ <input type="hidden" name="action" id="sessionsFormAction" value="injectSessions"/>
+ <input type="hidden" name="sort" id="sessionsFormSort" value="<%= JspHelper.escapeXml(request.getAttribute("sort")) %>"/>
+ <% String order = (String) request.getAttribute("order");
+ if (order == null || "".equals(order)) {
+ order = "ASC";
+ }
+ %>
+ <input type="hidden" name="order" id="sessionsFormSortOrder" value="<%= JspHelper.escapeXml(order) %>"/>
+ <input type="submit" name="refresh" id="refreshButton" value="Refresh Sessions list" onclick="document.getElementById('sessionsFormAction').value='refreshSessions'; return true;"/>
+ <%= JspHelper.formatNumber(activeSessions.size()) %> active Sessions<br/>
+ <table border="1" cellpadding="2" cellspacing="2" width="100%">
+ <thead>
+ <tr>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='id'; document.getElementById('refreshButton').click(); return true;">Session Id</a></th>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='id'; document.getElementById('refreshButton').click(); return true;">Type</a></th>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='locale'; document.getElementById('refreshButton').click(); return true;">Guessed Locale</a></th>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='user'; document.getElementById('refreshButton').click(); return true;">Guessed User name</a></th>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='CreationTime'; document.getElementById('refreshButton').click(); return true;">Creation Time</a></th>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='LastAccessedTime'; document.getElementById('refreshButton').click(); return true;">Last Accessed Time</a></th>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='UsedTime'; document.getElementById('refreshButton').click(); return true;">Used Time</a></th>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='InactiveTime'; document.getElementById('refreshButton').click(); return true;">Inactive Time</a></th>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='TTL'; document.getElementById('refreshButton').click(); return true;"><span title="Time To Live">TTL</span></a></th>
+ </tr>
+ </thead>
+ <% if (activeSessions.size() > 10) { %>
+ <tfoot><%-- <tfoot> is the same as <thead> --%>
+ <tr>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='id'; document.getElementById('refreshButton').click(); return true;">Session Id</a></th>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='id'; document.getElementById('refreshButton').click(); return true;">Type</a></th>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='locale'; document.getElementById('refreshButton').click(); return true;">Guessed Locale</a></th>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='user'; document.getElementById('refreshButton').click(); return true;">Guessed User name</a></th>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='CreationTime'; document.getElementById('refreshButton').click(); return true;">Creation Time</a></th>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='LastAccessedTime'; document.getElementById('refreshButton').click(); return true;">Last Accessed Time</a></th>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='UsedTime'; document.getElementById('refreshButton').click(); return true;">Used Time</a></th>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='InactiveTime'; document.getElementById('refreshButton').click(); return true;">Inactive Time</a></th>
+ <th><a onclick="document.getElementById('sessionsFormSort').value='TTL'; document.getElementById('refreshButton').click(); return true;"><span title="Time To Live">TTL</span></a></th>
+ </tr>
+ </tfoot>
+ <% } // end if %>
+ <tbody>
+<%
+ for (Session currentSession : activeSessions) {
+ String currentSessionId = JspHelper.escapeXml(currentSession.getId());
+ String type;
+ if (currentSession instanceof DeltaSession) {
+ if (((DeltaSession) currentSession).isPrimarySession()) {
+ type = "Primary";
+ } else {
+ type = "Backup";
+ }
+ } else if (currentSession instanceof DummyProxySession) {
+ type = "Proxy";
+ } else {
+ type = "Primary";
+ }
+%>
+ <tr>
+ <td><input type="checkbox" name="sessionIds" value="<%= currentSessionId %>" />
+ <%
+ if ("Proxy".equals(type)) {
+ out.print(currentSessionId);
+ } else {
+ %>
+ <a href="<%= submitUrl %>&action=sessionDetail&sessionId=<%= currentSessionId %>&sessionType=<%= type %>"><%= currentSessionId %></a>
+ <%
+ }
+ %>
+ </td>
+ <td style="text-align: center;"><%= type %></td>
+ <td style="text-align: center;"><%= JspHelper.guessDisplayLocaleFromSession(currentSession) %></td>
+ <td style="text-align: center;"><%= JspHelper.guessDisplayUserFromSession(currentSession) %></td>
+ <td style="text-align: center;"><%= JspHelper.getDisplayCreationTimeForSession(currentSession) %></td>
+ <td style="text-align: center;"><%= JspHelper.getDisplayLastAccessedTimeForSession(currentSession) %></td>
+ <td style="text-align: center;"><%= JspHelper.getDisplayUsedTimeForSession(currentSession) %></td>
+ <td style="text-align: center;"><%= JspHelper.getDisplayInactiveTimeForSession(currentSession) %></td>
+ <td style="text-align: center;"><%= JspHelper.getDisplayTTLForSession(currentSession) %></td>
+ </tr>
+<% } // end while %>
+ </tbody>
+ </table>
+ <p style="text-align: center;">
+ <input type="submit" name="invalidate" value="Invalidate selected Sessions" onclick="document.getElementById('sessionsFormAction').value='invalidateSessions'; return true;"/>
+ </p>
+ </fieldset>
+</form>
+
+<form method="get" action="<%=request.getContextPath()%>/html">
+ <p style="text-align: center;">
+ <input type="submit" value="Return to main page" />
+ </p>
+</form>
+
+<%--div style="display: none;">
+<p>
+ <a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-html401"
+ alt="Valid HTML 4.01!" height="31" width="88"></a>
+ <a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-xhtml10"
+ alt="Valid XHTML 1.0!" height="31" width="88" /></a>
+ <a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-xhtml11"
+ alt="Valid XHTML 1.1!" height="31" width="88" /></a>
+</p>
+</div--%>
+
+</body>
+</html>
diff --git a/web/tomcat/webapps/manager/WEB-INF/web.xml b/web/tomcat/webapps/manager/WEB-INF/web.xml
new file mode 100644
index 0000000..1a161a7
--- /dev/null
+++ b/web/tomcat/webapps/manager/WEB-INF/web.xml
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
+ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+ version="3.1"
+ metadata-complete="true">
+
+ <display-name>Tomcat Manager Application</display-name>
+ <description>
+ A scriptable management web application for the Tomcat Web Server;
+ Manager lets you view, load/unload/etc particular web applications.
+ </description>
+
+ <servlet>
+ <servlet-name>Manager</servlet-name>
+ <servlet-class>org.apache.catalina.manager.ManagerServlet</servlet-class>
+ <init-param>
+ <param-name>debug</param-name>
+ <param-value>2</param-value>
+ </init-param>
+ </servlet>
+ <servlet>
+ <servlet-name>HTMLManager</servlet-name>
+ <servlet-class>org.apache.catalina.manager.HTMLManagerServlet</servlet-class>
+ <init-param>
+ <param-name>debug</param-name>
+ <param-value>2</param-value>
+ </init-param>
+ <!-- Uncomment this to show proxy sessions from the Backup manager or a
+ StoreManager in the sessions list for an application
+ <init-param>
+ <param-name>showProxySessions</param-name>
+ <param-value>true</param-value>
+ </init-param>
+ -->
+ <multipart-config>
+ <!-- 50MB max -->
+ <max-file-size>52428800</max-file-size>
+ <max-request-size>52428800</max-request-size>
+ <file-size-threshold>0</file-size-threshold>
+ </multipart-config>
+ </servlet>
+ <servlet>
+ <servlet-name>Status</servlet-name>
+ <servlet-class>org.apache.catalina.manager.StatusManagerServlet</servlet-class>
+ <init-param>
+ <param-name>debug</param-name>
+ <param-value>0</param-value>
+ </init-param>
+ </servlet>
+
+ <servlet>
+ <servlet-name>JMXProxy</servlet-name>
+ <servlet-class>org.apache.catalina.manager.JMXProxyServlet</servlet-class>
+ </servlet>
+
+ <!-- Define the Manager Servlet Mapping -->
+ <servlet-mapping>
+ <servlet-name>Manager</servlet-name>
+ <url-pattern>/text/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>Status</servlet-name>
+ <url-pattern>/status/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>JMXProxy</servlet-name>
+ <url-pattern>/jmxproxy/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>HTMLManager</servlet-name>
+ <url-pattern>/html/*</url-pattern>
+ </servlet-mapping>
+
+ <filter>
+ <filter-name>SetCharacterEncoding</filter-name>
+ <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
+ <init-param>
+ <param-name>encoding</param-name>
+ <param-value>UTF-8</param-value>
+ </init-param>
+ </filter>
+
+ <filter-mapping>
+ <filter-name>SetCharacterEncoding</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <filter>
+ <filter-name>CSRF</filter-name>
+ <filter-class>org.apache.catalina.filters.CsrfPreventionFilter</filter-class>
+ <init-param>
+ <param-name>entryPoints</param-name>
+ <param-value>/html,/html/,/html/list,/index.jsp</param-value>
+ </init-param>
+ </filter>
+
+ <!-- Configured to set X-FRAME-OPTIONS. Disable HSTS in case it interferes -->
+ <!-- with an existing setting. Keep X-Content-Type-Options and -->
+ <!-- X-XSS-Protection as they are page specific. -->
+ <filter>
+ <filter-name>HTTP header security filter</filter-name>
+ <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
+ <init-param>
+ <param-name>hstsEnabled</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ </filter>
+
+ <filter-mapping>
+ <filter-name>CSRF</filter-name>
+ <servlet-name>HTMLManager</servlet-name>
+ </filter-mapping>
+
+ <filter-mapping>
+ <filter-name>HTTP header security filter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <!-- Define a Security Constraint on this Application -->
+ <!-- NOTE: None of these roles are present in the default users file -->
+ <security-constraint>
+ <web-resource-collection>
+ <web-resource-name>HTML Manager interface (for humans)</web-resource-name>
+ <url-pattern>/html/*</url-pattern>
+ </web-resource-collection>
+ <auth-constraint>
+ <role-name>manager-gui</role-name>
+ </auth-constraint>
+ </security-constraint>
+ <security-constraint>
+ <web-resource-collection>
+ <web-resource-name>Text Manager interface (for scripts)</web-resource-name>
+ <url-pattern>/text/*</url-pattern>
+ </web-resource-collection>
+ <auth-constraint>
+ <role-name>manager-script</role-name>
+ </auth-constraint>
+ </security-constraint>
+ <security-constraint>
+ <web-resource-collection>
+ <web-resource-name>JMX Proxy interface</web-resource-name>
+ <url-pattern>/jmxproxy/*</url-pattern>
+ </web-resource-collection>
+ <auth-constraint>
+ <role-name>manager-jmx</role-name>
+ </auth-constraint>
+ </security-constraint>
+ <security-constraint>
+ <web-resource-collection>
+ <web-resource-name>Status interface</web-resource-name>
+ <url-pattern>/status/*</url-pattern>
+ </web-resource-collection>
+ <auth-constraint>
+ <role-name>manager-gui</role-name>
+ <role-name>manager-script</role-name>
+ <role-name>manager-jmx</role-name>
+ <role-name>manager-status</role-name>
+ </auth-constraint>
+ </security-constraint>
+
+ <!-- Define the Login Configuration for this Application -->
+ <login-config>
+ <auth-method>BASIC</auth-method>
+ <realm-name>Tomcat Manager Application</realm-name>
+ </login-config>
+
+ <!-- Security roles referenced by this web application -->
+ <security-role>
+ <description>
+ The role that is required to access the HTML Manager pages
+ </description>
+ <role-name>manager-gui</role-name>
+ </security-role>
+ <security-role>
+ <description>
+ The role that is required to access the text Manager pages
+ </description>
+ <role-name>manager-script</role-name>
+ </security-role>
+ <security-role>
+ <description>
+ The role that is required to access the HTML JMX Proxy
+ </description>
+ <role-name>manager-jmx</role-name>
+ </security-role>
+ <security-role>
+ <description>
+ The role that is required to access to the Manager Status pages
+ </description>
+ <role-name>manager-status</role-name>
+ </security-role>
+
+ <error-page>
+ <error-code>401</error-code>
+ <location>/WEB-INF/jsp/401.jsp</location>
+ </error-page>
+ <error-page>
+ <error-code>403</error-code>
+ <location>/WEB-INF/jsp/403.jsp</location>
+ </error-page>
+ <error-page>
+ <error-code>404</error-code>
+ <location>/WEB-INF/jsp/404.jsp</location>
+ </error-page>
+
+</web-app>
diff --git a/web/tomcat/webapps/manager/css/manager.css b/web/tomcat/webapps/manager/css/manager.css
new file mode 100644
index 0000000..5b50738
--- /dev/null
+++ b/web/tomcat/webapps/manager/css/manager.css
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+body {
+ font-family: Tahoma, Arial, sans-serif;
+}
+
+h1,
+h2,
+h3,
+b {
+ color : white;
+ background-color: #525D76;
+}
+
+h1 {
+ font-size: 22px;
+}
+
+h2 {
+ font-size: 16px;
+}
+
+h3 {
+ font-size: 14px;
+}
+
+p {
+ font-size: 12px;
+}
+
+a {
+ color: black;
+}
+
+.line {
+ height : 1px;
+ background-color: #525D76;
+ border : none;
+}
+
+table {
+ width: 100%;
+}
+
+td.page-title {
+ text-align : center;
+ vertical-align: top;
+ font-family : sans-serif, Tahoma, Arial;
+ font-weight : bold;
+ background : white;
+ color : black;
+}
+
+td.title {
+ text-align : left;
+ vertical-align: top;
+ font-family : sans-serif, Tahoma, Arial;
+ font-style : italic;
+ font-weight : bold;
+ background : #D2A41C;
+}
+
+td.header-left {
+ text-align : left;
+ vertical-align: top;
+ font-family : sans-serif, Tahoma, Arial;
+ font-weight : bold;
+ background : #FFDC75;
+}
+
+td.header-center {
+ text-align : center;
+ vertical-align: top;
+ font-family : sans-serif, Tahoma, Arial;
+ font-weight : bold;
+ background : #FFDC75;
+}
+
+td.row-left {
+ text-align : left;
+ vertical-align: middle;
+ font-family : sans-serif, Tahoma, Arial;
+ color : black;
+}
+
+td.row-center {
+ text-align : center;
+ vertical-align: middle;
+ font-family : sans-serif, Tahoma, Arial;
+ color : black;
+}
+
+td.row-right {
+ text-align : right;
+ vertical-align: middle;
+ font-family : sans-serif, Tahoma, Arial;
+ color : black;
+}
+
+TH {
+ text-align : center;
+ vertical-align: top;
+ font-family : sans-serif, Tahoma, Arial;
+ font-weight : bold;
+ background : #FFDC75;
+}
+
+TD {
+ text-align : center;
+ vertical-align: middle;
+ font-family : sans-serif, Tahoma, Arial;
+ color : black;
+}
+
+form {
+ margin: 1;
+}
+
+form.inline {
+ display: inline;
+}
+
+img.tomcat-logo {
+ height: 92px;
+ float : left;
+}
\ No newline at end of file
diff --git a/web/tomcat/webapps/manager/images/asf-logo.svg b/web/tomcat/webapps/manager/images/asf-logo.svg
new file mode 100644
index 0000000..e24cbe5
--- /dev/null
+++ b/web/tomcat/webapps/manager/images/asf-logo.svg
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 7127.6 2890" enable-background="new 0 0 7127.6 2890" xml:space="preserve">
+<path fill="#6D6E71" d="M7104.7,847.8c15.3,15.3,22.9,33.7,22.9,55.2c0,21.5-7.6,39.9-22.9,55.4c-15.3,15.4-33.8,23.1-55.6,23.1
+ c-21.8,0-40.2-7.6-55.4-22.9c-15.1-15.3-22.7-33.7-22.7-55.2c0-21.5,7.6-39.9,22.9-55.4c15.3-15.4,33.7-23.1,55.4-23.1
+ C7070.9,824.9,7089.4,832.5,7104.7,847.8z M7098.1,951.9c13.3-13.6,20-29.8,20-48.7s-6.6-35-19.8-48.5
+ c-13.2-13.4-29.4-20.1-48.6-20.1c-19.2,0-35.4,6.7-48.7,20.2c-13.3,13.5-19.9,29.7-19.9,48.7c0,19,6.6,35.2,19.7,48.6
+ c13.1,13.4,29.3,20.1,48.5,20.1S7084.7,965.4,7098.1,951.9z M7087.1,888.1c0,14-6.1,22.8-18.4,26.4l22.5,30.5h-18.2l-20.3-28.3
+ h-18.6v28.3h-14.7v-84.6h31.8c12.8,0,22,2.2,27.6,6.6C7084.4,871.4,7087.1,878.4,7087.1,888.1z M7068.2,900c3-2.4,4.4-6.5,4.4-12
+ c0-5.5-1.5-9.4-4.5-11.6c-3-2.2-8.4-3.2-16-3.2h-18v30.5h17.5C7059.7,903.6,7065.3,902.4,7068.2,900z"/>
+<path fill="#6D6E71" d="M1803.6,499.8v155.4h-20V499.8h-56.8v-19.2h133.9v19.2H1803.6z"/>
+<path fill="#6D6E71" d="M2082.2,655.2v-76.9h-105.2v76.9h-20V480.5h20v78.9h105.2v-78.9h20v174.7H2082.2z"/>
+<path fill="#6D6E71" d="M2241.4,499.8v57.4h88.1v19.2h-88.1v59.8h101.8v19h-121.8V480.5H2340v19.2H2241.4z"/>
+<path fill="#D22128" d="M1574.5,1852.4l417.3-997.6h80.1l417.3,997.6h-105.4l-129.3-311.9h-448.2l-127.9,311.9H1574.5z M2032.6,970
+ l-205.1,493.2h404.7L2032.6,970z"/>
+<path fill="#D22128" d="M2596.9,1852.4V854.8H3010c171.4,0,295.1,158.8,295.1,313.3c0,163-115.2,316.1-286.6,316.1h-324.6v368.1
+ H2596.9z M2693.9,1397.1h318.9c118,0,193.9-108.2,193.9-229c0-125.1-92.7-226.2-202.3-226.2h-310.5V1397.1z"/>
+<path fill="#D22128" d="M3250.5,1852.4l417.3-997.6h80.1l417.3,997.6h-105.4l-129.3-311.9h-448.2l-127.9,311.9H3250.5z M3708.6,970
+ l-205.1,493.2h404.7L3708.6,970z"/>
+<path fill="#D22128" d="M4637.3,849.1c177,0,306.3,89.9,368.1,217.8l-78.7,47.8c-63.2-132.1-186.9-177-295.1-177
+ c-238.9,0-369.5,213.6-369.5,414.5c0,220.6,161.6,420.1,373.7,420.1c112.4,0,244.5-56.2,307.7-185.5l81.5,42.1
+ c-64.6,148.9-241.7,231.8-394.8,231.8c-274,0-466.5-261.3-466.5-514.2C4163.8,1106.3,4336.6,849.1,4637.3,849.1z"/>
+<path fill="#D22128" d="M5949.1,854.8v997.6h-98.4v-466.5h-591.5v466.5h-96.9V854.8h96.9v444h591.5v-444H5949.1z"/>
+<path fill="#D22128" d="M6844.6,1765.2v87.1h-670.2V854.8H6832v87.1h-560.6v359.7h489v82.9h-489v380.8H6844.6z"/>
+<path fill="#6D6E71" d="M1667.6,2063.6c11.8,3.5,22.2,8.3,31,14.2l-10.3,22.6c-9-6-18.6-10.4-28.9-13.4c-10.2-2.9-20-4.4-29.2-4.4
+ c-13.6,0-24.5,2.4-32.6,7.3c-8.1,4.9-12.2,11.8-12.2,20.7c0,7.6,2.3,14,6.8,19c4.5,5,10.2,8.9,17,11.7c6.8,2.8,16.1,6,28,9.6
+ c14.4,4.6,26,8.9,34.7,12.9c8.8,4,16.3,9.9,22.5,17.8c6.2,7.8,9.3,18.2,9.3,31c0,11.7-3.2,21.8-9.5,30.6
+ c-6.3,8.7-15.3,15.5-26.8,20.3c-11.6,4.8-24.9,7.2-40,7.2c-15.1,0-29.7-2.9-43.9-8.7c-14.2-5.8-26.4-13.6-36.6-23.4l10.7-21.6
+ c9.6,9.4,20.7,16.7,33.3,21.9c12.6,5.2,24.8,7.8,36.8,7.8c15.3,0,27.3-3,36.1-8.9c8.8-5.9,13.2-13.9,13.2-23.9
+ c0-7.8-2.3-14.3-6.9-19.4c-4.6-5.1-10.3-9-17.1-11.9c-6.8-2.8-16.1-6-28-9.6c-14.2-4.2-25.7-8.3-34.6-12.2
+ c-8.9-3.9-16.4-9.7-22.5-17.5c-6.1-7.7-9.2-17.9-9.2-30.6c0-10.9,3-20.4,9-28.6c6-8.2,14.6-14.6,25.6-19.1
+ c11.1-4.5,23.8-6.8,38.2-6.8C1643.8,2058.3,1655.7,2060.1,1667.6,2063.6z"/>
+<path fill="#6D6E71" d="M1980.1,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6
+ c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6
+ c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14
+ C1944.8,2058.6,1963.2,2063.3,1980.1,2072.8z M1881.9,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7
+ c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1
+ c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30
+ c-13-7.4-27.2-11.2-42.6-11.2C1909.4,2081.5,1895.1,2085.2,1881.9,2092.7z"/>
+<path fill="#6D6E71" d="M2186.5,2082.4v74h98.4v23.2h-98.4v90.2h-24.1v-210.6h133.8v23.2H2186.5z"/>
+<path fill="#6D6E71" d="M2491.6,2082.4v187.4h-24.1v-187.4h-68.4v-23.2h161.4v23.2H2491.6z"/>
+<path fill="#6D6E71" d="M2871.8,2269.8l-56.8-177.4l-57.6,177.4h-24.5l-70.5-210.6h25.9l57.9,182.7l57.1-182.4l24.1-0.3l57.7,182.7
+ l57.1-182.7h25l-70.6,210.6H2871.8z"/>
+<path fill="#6D6E71" d="M3087.3,2216.6l-23.5,53.2h-25.6l94.4-210.6h25l94.1,210.6h-26.1l-23.5-53.2H3087.3z M3144.5,2086.6
+ l-46.9,106.8h94.4L3144.5,2086.6z"/>
+<path fill="#6D6E71" d="M3461.1,2202.7c-6,0.4-10.7,0.6-14.1,0.6h-56v66.5H3367v-210.6h80c26.2,0,46.6,6.2,61.2,18.5
+ c14.5,12.3,21.8,29.8,21.8,52.3c0,17.2-4.1,31.7-12.2,43.3c-8.1,11.6-19.8,20-35,25l49.2,71.5h-27.3L3461.1,2202.7z M3491.3,2167.6
+ c10.3-8.4,15.5-20.8,15.5-37c0-15.9-5.2-27.9-15.5-36c-10.3-8.1-25.1-12.2-44.3-12.2h-56v97.8h56
+ C3466.2,2180.2,3481,2176,3491.3,2167.6z"/>
+<path fill="#6D6E71" d="M3688.3,2082.4v69.2h106.2v23.2h-106.2v72.1h122.8v22.9h-146.9v-210.6h142.9v23.2H3688.3z"/>
+<path fill="#6D6E71" d="M4147,2082.4v74h98.4v23.2H4147v90.2h-24.1v-210.6h133.8v23.2H4147z"/>
+<path fill="#6D6E71" d="M4523.3,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6
+ c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6
+ c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14
+ C4488.1,2058.6,4506.5,2063.3,4523.3,2072.8z M4425.2,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7
+ c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1
+ c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30
+ c-13-7.4-27.2-11.2-42.6-11.2C4452.6,2081.5,4438.3,2085.2,4425.2,2092.7z"/>
+<path fill="#6D6E71" d="M4854.7,2247.7c-15.7,15.5-37.3,23.3-64.8,23.3c-27.7,0-49.4-7.8-65.1-23.3c-15.7-15.5-23.6-37-23.6-64.6
+ v-124h24.1v124c0,20.3,5.8,36.1,17.3,47.5c11.6,11.4,27.3,17.1,47.3,17.1c20.1,0,35.8-5.7,47.1-17c11.4-11.3,17-27.2,17-47.7v-124
+ h24.1v124C4878.2,2210.7,4870.4,2232.2,4854.7,2247.7z"/>
+<path fill="#6D6E71" d="M5169.5,2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3,169.3v-169.3h23.8v210.6H5169.5z"/>
+<path fill="#6D6E71" d="M5478.4,2073.1c16.4,9.3,29.4,21.9,38.9,37.9c9.6,16,14.3,33.9,14.3,53.5s-4.8,37.6-14.3,53.6
+ c-9.5,16.1-22.6,28.7-39.3,37.9c-16.6,9.2-35.2,13.8-55.5,13.8h-84.3v-210.6h85.2C5443.7,2059.2,5462,2063.8,5478.4,2073.1z
+ M5362.3,2246.9h61.4c15.5,0,29.6-3.5,42.3-10.6c12.7-7.1,22.8-16.9,30.2-29.5c7.4-12.5,11.1-26.5,11.1-42
+ c0-15.5-3.8-29.4-11.3-41.9c-7.5-12.5-17.7-22.3-30.6-29.6c-12.8-7.2-27-10.9-42.6-10.9h-60.5V2246.9z"/>
+<path fill="#6D6E71" d="M5668.6,2216.6l-23.5,53.2h-25.6l94.4-210.6h25l94.1,210.6H5807l-23.5-53.2H5668.6z M5725.8,2086.6
+ l-46.9,106.8h94.4L5725.8,2086.6z"/>
+<path fill="#6D6E71" d="M5991,2082.4v187.4H5967v-187.4h-68.4v-23.2h161.4v23.2H5991z"/>
+<path fill="#6D6E71" d="M6175.9,2269.8v-210.6h24.1v210.6H6175.9z"/>
+<path fill="#6D6E71" d="M6493.7,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6
+ c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6
+ c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14
+ C6458.5,2058.6,6476.9,2063.3,6493.7,2072.8z M6395.6,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7
+ c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1
+ c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30
+ c-13-7.4-27.2-11.2-42.6-11.2C6423,2081.5,6408.8,2085.2,6395.6,2092.7z"/>
+<path fill="#6D6E71" d="M6826.5,2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3,169.3v-169.3h23.8v210.6H6826.5z"/>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-4516.6152" y1="-2338.7222" x2="-4108.4111" y2="-1861.3982" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0" style="stop-color:#F69923"/>
+ <stop offset="0.3123" style="stop-color:#F79A23"/>
+ <stop offset="0.8383" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_1_)" d="M1230.1,13.7c-45.3,26.8-120.6,102.5-210.5,212.3l82.6,155.9c58-82.9,116.9-157.5,176.3-221.2
+ c4.6-5.1,7-7.5,7-7.5c-2.3,2.5-4.6,5-7,7.5c-19.2,21.2-77.5,89.2-165.5,224.4c84.7-4.2,214.9-21.6,321.1-39.7
+ c31.6-177-31-258-31-258S1323.4-41.4,1230.1,13.7z"/>
+<path fill="none" d="M1090.2,903.1c0.6-0.1,1.2-0.2,1.8-0.3l-11.9,1.3c-0.7,0.3-1.4,0.7-2.1,1
+ C1082.1,904.4,1086.2,903.7,1090.2,903.1z"/>
+<path fill="none" d="M1005.9,1182.3c-6.7,1.5-13.7,2.7-20.7,3.7C992.3,1185,999.2,1183.8,1005.9,1182.3z"/>
+<path fill="none" d="M432.9,1808.8c0.9-2.3,1.8-4.7,2.6-7c18.2-48,36.2-94.7,54-140.1c20-51,39.8-100.4,59.3-148.3
+ c20.6-50.4,40.9-99.2,60.9-146.3c21-49.4,41.7-97,62-142.8c16.5-37.3,32.8-73.4,48.9-108.3c5.4-11.7,10.7-23.2,16-34.6
+ c10.5-22.7,21-44.8,31.3-66.5c9.5-20,19-39.6,28.3-58.8c3.1-6.4,6.2-12.8,9.3-19.1c0.5-1,1-2,1.5-3.1l-10.2,1.1l-8-15.9
+ c-0.8,1.6-1.6,3.1-2.4,4.6c-14.5,28.8-28.9,57.9-43.1,87.2c-8.2,16.9-16.4,34-24.6,51c-22.6,47.4-44.8,95.2-66.6,143.3
+ c-22.1,48.6-43.7,97.5-64.9,146.5c-20.8,48.1-41.3,96.2-61.2,144.2c-20,48-39.5,95.7-58.5,143.2c-19.9,49.5-39.2,98.7-58,147.2
+ c-4.2,10.9-8.5,21.9-12.7,32.8c-15,39.2-29.7,77.8-44,116l12.7,25.1l11.4-1.2c0.4-1.1,0.8-2.3,1.3-3.4
+ C396.7,1905.4,414.9,1856.4,432.9,1808.8z"/>
+<path fill="none" d="M980,1186.8L980,1186.8c0.1,0,0.1,0,0.1-0.1C980.1,1186.8,980.1,1186.8,980,1186.8z"/>
+<path fill="#BE202E" d="M952.6,1323c-10.6,1.9-21.4,3.8-32.5,5.7c-0.1,0-0.1,0.1-0.2,0.1c5.6-0.8,11.2-1.7,16.6-2.6
+ C942,1325.2,947.3,1324.1,952.6,1323z"/>
+<path opacity="0.35" fill="#BE202E" d="M952.6,1323c-10.6,1.9-21.4,3.8-32.5,5.7c-0.1,0-0.1,0.1-0.2,0.1c5.6-0.8,11.2-1.7,16.6-2.6
+ C942,1325.2,947.3,1324.1,952.6,1323z"/>
+<path fill="#BE202E" d="M980.3,1186.7C980.2,1186.7,980.2,1186.7,980.3,1186.7c-0.1,0.1-0.2,0.1-0.2,0.1c1.8-0.2,3.5-0.5,5.2-0.8
+ c7-1,13.9-2.2,20.7-3.7C997.5,1183.8,989,1185.2,980.3,1186.7L980.3,1186.7L980.3,1186.7z"/>
+<path opacity="0.35" fill="#BE202E" d="M980.3,1186.7C980.2,1186.7,980.2,1186.7,980.3,1186.7c-0.1,0.1-0.2,0.1-0.2,0.1
+ c1.8-0.2,3.5-0.5,5.2-0.8c7-1,13.9-2.2,20.7-3.7C997.5,1183.8,989,1185.2,980.3,1186.7L980.3,1186.7L980.3,1186.7z"/>
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-7537.7339" y1="-2391.4075" x2="-4625.4141" y2="-2391.4075" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_2_)" d="M858.6,784.7c25.1-46.9,50.5-92.8,76.2-137.4c26.7-46.4,53.7-91.3,80.9-134.7
+ c1.6-2.6,3.2-5.2,4.8-7.7c27-42.7,54.2-83.7,81.6-122.9L1019.5,226c-6.2,7.6-12.5,15.3-18.8,23.2c-23.8,29.7-48.6,61.6-73.9,95.5
+ c-28.6,38.2-58,78.9-87.8,121.7c-27.6,39.5-55.5,80.9-83.5,123.7c-23.8,36.5-47.7,74-71.4,112.5c-0.9,1.4-1.8,2.9-2.6,4.3
+ l107.5,212.3C811.8,873.6,835.1,828.7,858.6,784.7z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-7186.1777" y1="-2099.3059" x2="-5450.7183" y2="-2099.3059" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0" style="stop-color:#282662"/>
+ <stop offset="9.548390e-02" style="stop-color:#662E8D"/>
+ <stop offset="0.7882" style="stop-color:#9F2064"/>
+ <stop offset="0.9487" style="stop-color:#CD2032"/>
+</linearGradient>
+<path fill="url(#SVGID_3_)" d="M369,1981c-14.2,39.1-28.5,78.9-42.9,119.6c-0.2,0.6-0.4,1.2-0.6,1.8c-2,5.7-4.1,11.5-6.1,17.2
+ c-9.7,27.4-18,52.1-37.3,108.2c31.7,14.5,57.1,52.5,81.1,95.6c-2.6-44.7-21-86.6-56.2-119.1c156.1,7,290.6-32.4,360.1-146.6
+ c6.2-10.2,11.9-20.9,17-32.2c-31.6,40.1-70.8,57.1-144.5,53c-0.2,0.1-0.3,0.1-0.5,0.2c0.2-0.1,0.3-0.1,0.5-0.2
+ c108.6-48.6,163.1-95.3,211.2-172.6c11.4-18.3,22.5-38.4,33.8-60.6c-94.9,97.5-205,125.3-320.9,104.2l-86.9,9.5
+ C374.4,1966.3,371.7,1973.6,369,1981z"/>
+<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2418.5454" x2="-4461.8428" y2="-2418.5454" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_4_)" d="M409.6,1786.3c18.8-48.5,38.1-97.7,58-147.2c19-47.4,38.5-95.2,58.5-143.2
+ c20-48,40.4-96.1,61.2-144.2c21.2-49,42.9-97.8,64.9-146.5c21.8-48.1,44-95.9,66.6-143.3c8.1-17.1,16.3-34.1,24.6-51
+ c14.2-29.3,28.6-58.4,43.1-87.2c0.8-1.6,1.6-3.1,2.4-4.6L681.4,706.8c-1.8,2.9-3.5,5.8-5.3,8.6c-25.1,40.9-50,82.7-74.4,125.4
+ c-24.7,43.1-49,87.1-72.7,131.7c-20,37.6-39.6,75.6-58.6,113.9c-3.8,7.8-7.6,15.5-11.3,23.2c-23.4,48.2-44.6,94.8-63.7,139.5
+ c-21.7,50.7-40.7,99.2-57.5,145.1c-11,30.2-21,59.4-30.1,87.4c-7.5,24-14.7,47.9-21.5,71.8c-16,56.3-29.9,112.4-41.2,168.3
+ L353,1935.1c14.3-38.1,28.9-76.8,44-116C401.1,1808.2,405.4,1797.3,409.6,1786.3z"/>
+<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-7161.7642" y1="-2379.1431" x2="-5631.2524" y2="-2379.1431" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0" style="stop-color:#282662"/>
+ <stop offset="9.548390e-02" style="stop-color:#662E8D"/>
+ <stop offset="0.7882" style="stop-color:#9F2064"/>
+ <stop offset="0.9487" style="stop-color:#CD2032"/>
+</linearGradient>
+<path fill="url(#SVGID_5_)" d="M243.5,1729.4c-13.6,68.2-23.2,136.2-28,203.8c-0.2,2.4-0.4,4.7-0.5,7.1
+ c-33.7-54-124-106.8-123.8-106.2c64.6,93.7,113.7,186.7,120.9,278c-34.6,7.1-82-3.2-136.8-23.3c57.1,52.5,100,67,116.7,70.9
+ c-52.5,3.3-107.1,39.3-162.1,80.8c80.5-32.8,145.5-45.8,192.1-35.3C148.1,2414.2,74.1,2645,0,2890c22.7-6.7,36.2-21.9,43.9-42.6
+ c13.2-44.4,100.8-335.6,238-718.2c3.9-10.9,7.8-21.8,11.8-32.9c1.1-3,2.2-6.1,3.3-9.2c14.5-40.1,29.5-81.1,45.1-122.9
+ c3.5-9.5,7.1-19,10.7-28.6c0.1-0.2,0.1-0.4,0.2-0.6l-107.9-213.2C244.6,1724.4,244,1726.9,243.5,1729.4z"/>
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2117.1309" x2="-4461.8428" y2="-2117.1309" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_6_)" d="M805.6,937c-3.1,6.3-6.2,12.7-9.3,19.1c-9.3,19.2-18.8,38.8-28.3,58.8
+ c-10.3,21.7-20.7,43.9-31.3,66.5c-5.3,11.4-10.6,22.9-16,34.6c-16.1,35-32.4,71.1-48.9,108.3c-20.3,45.8-41,93.4-62,142.8
+ c-20,47.1-40.3,95.9-60.9,146.3c-19.5,47.9-39.3,97.3-59.3,148.3c-17.8,45.4-35.9,92.1-54,140.1c-0.9,2.3-1.8,4.7-2.6,7
+ c-18,47.6-36.2,96.6-54.6,146.8c-0.4,1.1-0.8,2.3-1.3,3.4l86.9-9.5c-1.7-0.3-3.5-0.5-5.2-0.9c103.9-13,242.1-90.6,331.4-186.5
+ c41.1-44.2,78.5-96.3,113-157.3c25.7-45.4,49.8-95.8,72.8-151.5c20.1-48.7,39.4-101.4,58-158.6c-23.9,12.6-51.2,21.8-81.4,28.2
+ c-5.3,1.1-10.7,2.2-16.1,3.1c-5.5,1-11,1.8-16.6,2.6l0,0l0,0c0.1,0,0.1-0.1,0.2-0.1c96.9-37.3,158-109.2,202.4-197.4
+ c-25.5,17.4-66.9,40.1-116.6,51.1c-6.7,1.5-13.7,2.7-20.7,3.7c-1.7,0.3-3.5,0.6-5.2,0.8l0,0l0,0c0.1,0,0.1,0,0.1-0.1
+ c0,0,0.1,0,0.1,0l0,0c33.6-14.1,62-29.8,86.6-48.4c5.3-4,10.4-8.1,15.3-12.3c7.5-6.5,14.7-13.3,21.5-20.5c4.4-4.6,8.6-9.3,12.7-14.2
+ c9.6-11.5,18.7-23.9,27.1-37.3c2.6-4.1,5.1-8.3,7.6-12.6c3.2-6.2,6.3-12.3,9.3-18.3c13.5-27.2,24.4-51.5,33-72.8
+ c4.3-10.6,8.1-20.5,11.3-29.7c1.3-3.7,2.5-7.2,3.7-10.6c3.4-10.2,6.2-19.3,8.4-27.3c3.3-12,5.3-21.5,6.4-28.4l0,0l0,0
+ c-3.3,2.6-7.1,5.2-11.3,7.7c-29.3,17.5-79.5,33.4-119.9,40.8l79.8-8.8l-79.8,8.8c-0.6,0.1-1.2,0.2-1.8,0.3c-4,0.7-8.1,1.3-12.2,2
+ c0.7-0.3,1.4-0.7,2.1-1l-273,29.9C806.6,935,806.1,936,805.6,937z"/>
+<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-7554.8232" y1="-2132.0981" x2="-4642.5034" y2="-2132.0981" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_7_)" d="M1112.9,385.1c-24.3,37.3-50.8,79.6-79.4,127.5c-1.5,2.5-3,5.1-4.5,7.6
+ c-24.6,41.5-50.8,87.1-78.3,137c-23.8,43.1-48.5,89.3-74.3,139c-22.4,43.3-45.6,89.2-69.4,137.8l273-29.9
+ c79.5-36.6,115.1-69.7,149.6-117.6c9.2-13.2,18.4-27,27.5-41.3c28-43.8,55.6-92,80.1-139.9c23.7-46.3,44.7-92.2,60.7-133.5
+ c10.2-26.3,18.4-50.8,24.1-72.3c5-19,8.9-36.9,11.9-54.1C1327.9,363.5,1197.6,380.9,1112.9,385.1z"/>
+<path fill="#BE202E" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/>
+<path opacity="0.35" fill="#BE202E" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/>
+<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2027.484" x2="-4461.8433" y2="-2027.484" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_8_)" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/>
+<path fill="#BE202E" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/>
+<path opacity="0.35" fill="#BE202E" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/>
+<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2037.7417" x2="-4461.8433" y2="-2037.7417" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_9_)" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/>
+<path fill="#BE202E" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7L980.2,1186.7
+ C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/>
+<path opacity="0.35" fill="#BE202E" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7
+ L980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/>
+<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-5738.0635" y1="-2039.799" x2="-5094.3457" y2="-2039.799" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_10_)" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7L980.2,1186.7
+ C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/>
+</svg>
diff --git a/web/tomcat/webapps/manager/images/tomcat.svg b/web/tomcat/webapps/manager/images/tomcat.svg
new file mode 100644
index 0000000..8823f79
--- /dev/null
+++ b/web/tomcat/webapps/manager/images/tomcat.svg
@@ -0,0 +1,967 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Generator: Adobe Illustrator 11 Build 196, SVG Export Plug-In . SVG Version: 6.0.0 Build 78) -->
+<svg:svg
+ xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/"
+ xmlns:xap="http://ns.adobe.com/xap/1.0/"
+ xmlns:ns0="http://ns.adobe.com/SaveForWeb/1.0/"
+ xmlns:ns="http://ns.adobe.com/Variables/1.0/"
+ xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/"
+ xmlns:x="adobe:ns:meta/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ i:viewOrigin="176.7139 486.707"
+ i:rulerOrigin="-156 -296"
+ i:pageBounds="156 496 456 296"
+ width="260.162"
+ height="184.413"
+ viewBox="0 0 260.162 184.413"
+ overflow="visible"
+ enable-background="new 0 0 260.162 184.413"
+ xml:space="preserve"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="tomcat.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"><svg:defs
+ id="defs59"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 92.206497 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="260.16199 : 92.206497 : 1"
+ inkscape:persp3d-origin="130.08099 : 61.470998 : 1"
+ id="perspective63" /></svg:defs><sodipodi:namedview
+ inkscape:window-height="725"
+ inkscape:window-width="1051"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="2.1025362"
+ inkscape:cx="130.08099"
+ inkscape:cy="91.968689"
+ inkscape:window-x="35"
+ inkscape:window-y="192"
+ inkscape:current-layer="svg2" />
+ <svg:metadata
+ id="metadata4">
+ <ns:variableSets>
+ <ns:variableSet
+ varSetName="binding1"
+ locked="none">
+ <ns:variables />
+ <ns:sampleDataSets />
+ </ns:variableSet>
+ </ns:variableSets>
+ <ns0:sfw>
+ <ns0:slices />
+ <ns0:sliceSourceBounds
+ y="302.294"
+ x="176.714"
+ width="260.162"
+ height="184.413"
+ bottomLeftOrigin="true" />
+ </ns0:sfw>
+<xpacket /><x:xmpmeta
+ x:xmptk="XMP toolkit 3.0-29, framework 1.6">
+
+<svg:metadata
+ id="metadata61"><rdf:RDF>
+
+ <rdf:Description
+ rdf:about="">
+ </rdf:Description>
+
+ <rdf:Description
+ rdf:about="">
+ </rdf:Description>
+
+ <rdf:Description
+ rdf:about="">
+ <xap:CreateDate>2006-05-09T08:17:21Z</xap:CreateDate>
+ <xap:ModifyDate>2006-05-09T08:37:38Z</xap:ModifyDate>
+ <xap:CreatorTool>Illustrator</xap:CreatorTool>
+ <xap:Thumbnails>
+ <rdf:Alt>
+ <rdf:li
+ rdf:parseType="Resource">
+ <xapGImg:format>JPEG</xapGImg:format>
+ <xapGImg:width>256</xapGImg:width>
+ <xapGImg:height>184</xapGImg:height>
+ <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
+AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
+DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
+Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAuAEAAwER
+AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
+AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
+UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
+1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
+qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
+obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
+0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
+FXYq7FXYq7FXYq7FXYq7FXhH/OYHnWfQ/wAurfRLSUxXXmK49GQqaN9VtwJJqH3cxqfYnFXhP5Y/
+85O+f/JU0enaw769okbBJLS8ZvrUKg0IhnarDj/I9R2HHFX2F+Xn5neT/P8ApP6R8u3glKAfW7KS
+iXNuzdFljqaezCqnsTirK8VdirsVdirsVdirsVdirC/zM/Nvyd+XemC71255Xcqk2WmQUa5nI2+F
+CRxUd3ag+nbFXx1+Zf8Azkn+YvneaW1tLh9C0NgwXTrB2V3Sm/rzji8m3UDitP2cVfV//OOfmabz
+D+T3l+6uHMl1aRPYTsxqSbVzEhJ7kxKhxV6VirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd
+irsVfHn/ADlxdSa7+bvlvyvGx4RW0EVARtNfXJVqf7BY+uRlKgT3JAt5r/zkD5ZGgfmfqSRR+nZ6
+gsd9agdOMq0f/ksj5h9nZvEwgnmNi2Z4cMiw/wAqebPMHlTXLfW9BvHstQtjVZEPwstQWjkXo6NT
+4lOxzOan3v8Akl+cel/mX5a+tAJa69ZcU1fTlJojGvGWLluYpKbV6GqmtKlV6NirsVdirsVdirsV
+eWfnr+eGl/lroywwBLzzPfox02wJqqL0+sT03EanoOrnYdyFXwh5i8x655j1i41jW7yS+1K6blNc
+SmpPgABQKo6BVFB2xVnf5Q+SjrWh+d9Yli5w6XolylsadbqSNnTj8kiYf7IZg6zUeHKERzlIfL8U
+3YoWCe4Pff8AnCfVTN5D1zTCamz1P11HcLcQIAPlWE5nNL6KxV2KuxV2KuxV2KuxV2KuxV2KuxV2
+KuxV2KuxV2KuxV2KvjD8wm/Sv/OX8UTGsdrqGnCMNUU+rW0Mp6f5ammY2sNYZ/1T9zZi+oe9m/8A
+zkx+Xc/mPytFrunRepqehc3ljUVeS0cAyAU6mMqHA8OXfNB2PqhCfAeUvv8A2uZqcdix0fIedQ69
+m35OefrryN+YOla2kpjsjKttqqDo9nMwEoI78ftr/lKMVfaeqf8AOSH5KaaSs3meCZx0W1inuanf
+YNDG69vHFWM3v/OYn5QW5YQ/pK8ArQwWqitPD1pIuvviqVT/APObH5cKR6GjaxIP2i8dqhB9qTvi
+qmP+c2fIFd9C1Wnfa2/6q4qmFv8A85n/AJUSvxksdZtx/NJb25H/ACTuHOKp3bf85XfkpPBI7avN
+BIisywS2lwGcqCeIZUdKmm1WGKvijzz5x1bzl5q1HzFqjlrm+lLrHWqxRDaOFP8AJjSij7+uKpNb
+W1xdXMVtbRtNcTuscMKAszu54qqgbkkmgwE1uVfbHkL8uk8o/lTPoMiK+o3drPNqZHRrieIhlr4I
+tEB9q5yWo1fi6gS/hBFfN2UMfDAjqwT/AJwdvyt/5usC20sVlOq77em0yMR2/wB2Cudc619ZYq7F
+XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXxZKTJ/zmFc+oedNTmA5b/ZtG49fCgpmH2h/
+cS9zbh+sPqDrsc4t2r57/Nf/AJxkGo3c+teSTFb3ExMlxo0hEcTMdybd/spU/sN8PgQNs3+i7Xoc
+OX5/rcLLpusWIaF/zif56vFWTVr6y0pG6xgtczL81QLH90mZWTtnFH6bk1x0sjz2Z1pf/OIvlOIL
++lNbvrthSv1dYrZSe+zC4ND88wp9uTP0xA9+/wCptGkHUsms/wDnGf8AKS3AEunT3dOpmupxXam/
+pNFmPPtjOeRA+H67bBpoPDv+ch/yt03yXrdjeaFbG30HUouCQ8pJBFcQ0DqXkZ2+NSrCrfzeGbns
+vWHNAiX1BxdRi4TtySH8jfJdn5u/MOy07UIfrGl28ct3fw1IDRxrxUEqQaGV0By7X6g4sRkOfRhh
+hxSp9N3X/OO/5P3FSdBETGnxRXN0nT/JEvH8M50dq6gfxfYHOOnh3JDqP/OKn5a3NTazajYt+yIp
+0dfpEsbn/hsvj21lHMRP497A6SPmwzW/+cQr9A76H5himO/CG9haL5AyxGT/AIhmXj7cifqiR7t/
+1NUtIehZh+S3/OP8Xk+5GveYXivNfTkLSKIloLYGqlwzBecjL3p8P45i9odqeIOCH09fNtw6fh3P
+N7DfIz2VwijkzRuFA6klTmpxmpD3uRLk+bf+cJrrj+Yet2tT+90hpeP7J9O5hWp9/wB5tneunfZm
+KuxV2KuxV2KuxV2KuxVZLNFDG0srrHGu7O5CqB7k4qks3nzyNC5jm8xaZHIOqPeW6nf2L4qmFhrW
+j6iK6ff294KVrbypLt1r8BPjirAvzb/Pnyf+WrW9rqKS6hq90vqRaba8eaxVp6krMQEUkEL1JPbq
+cVYFof8Azmp5BupVj1fR9Q0wNsZo/SuY1/1qGN6fJDir2Xyf+Yfkrzjam48taxb6iqgGSKNisyA9
+PUhcLKn+yXFWRYq7FXYq7FXxRrBNj/zl/NVwC+rL8XtcWw+Hf/jJTMXXC8M/6pbMP1h9SZxLtnYq
+7FWG+afzg/LnyvdNZ6vrUSXqGj2sKvcSofB1hV+B/wBamZmHs/NkFxjt8mqWaMeZRPk78zvI/nF5
+ItA1RLm5hHKS1dXhmC1pyEcoRmXputRkdRosuLeQ2TDLGXJCfm/5JXzj5D1HSo05X8a/WtNPcXMI
+JUD/AFxVP9lk+z9R4WUE8jsWOaHFGnl3/OI/lpodN1zzFMlGuJUsLcsKELCPUlpXsWkQfNc2Xbmb
+eMPj+r9LRpI8y+hc0DmuxV2KuxV2Kvl//nClHP5oas4B4Lok6luwLXdqQPpoc9AdK+08VdirsVdi
+rsVdiqXeYPMOi+XtIudY1q7jsdNtF5z3EpooHQAd2ZjsqjcnYYq+VfPf/OV3nXzNqp0D8stPlto5
+mMcF0IfrGoT+8UIDrGD8mbvVcVSqz/5xn/Pjzs66h5t1RbUueX+5W7kurgA/yxx+sq/6pZaeGKsj
+h/5wanMYM3nNUk7qmml1/wCCN0n6sVQt7/zhDr8B56Z5stppEIMZntZLfcb1qkk9KHFXzr5mtdUs
+tfv9O1S5a7vtOuJbKaZndwWt3MZ4mSjcartUDFUsxVFabqeo6XfQ3+m3UtlfW7c4Lq3dopUbxV1I
+IxV9Sfkr/wA5aNcT2+gfmG6K8hWO18wqAi1OwF2q0Vf+Mi0H8w6tir6lVlZQykMrCqsNwQe4xVvF
+XYq+Kfzzro3/ADlLa6oxKJLdaReFiaApGsMLeG1ISMqzw4sco94LKBogvqPOEdw7FXkf55/mBrlj
+Jp3kbykX/wAVeYSFE0Zo8FuzFOSt+wzlW+P9lQx2NDm27N0sZXlyfRFxs+Qj0jmUd5B/IHyP5bsI
+31Oyh1zWnAa6vb1BMnqHciKKSqKAehI5e+Q1XamTIfSeGPlzTj08YjfcsJ/PDy5pXkHX/LH5geW7
+WPTGhvlt9Rt7RBFHKpBk+wgCjnGkiPQbg5m9m5jnhLFM3s1Z4iBEg+hOu4zn3NQOkaLpuj20ltp8
+IghlnnunRe8tzK0sh/4JzQdhtlmXLKZuXdXyYxiByR2VsnYqxjV/zO/L3SJWh1DzDYQzoaPD66PI
+p/ykQsw+kZlY9Dmnyifu+9qOWI6pvoOvaRr+kwato9yt3p1zz9C4UMob03MbbMFOzoR0ynLiljkY
+yFEM4yBFhV1WVYdLvJWJCxwSOxHWioTjhFzA8wsuRfPn/OEVoX83eZLzekOnxQnpSsswb/mVneOn
+fYOKuxV2KuxV2KqF9e2lhZT315KsFpaxtNcTuaKkcYLMzHwAFcVfFHnPzR50/wCchPzJi8veXlaH
+y7aO5sYnqsUUCkK97dU/bYdB2qFXcklV9U/lj+UnlH8u9IWz0a2WS+dQL7VpVBuLhh1q37KV+yg2
+Huakqs1xV2KuxV8v/nf/AM4patrnmG+80eSp4Xn1GR7m/wBIuW9ImdyWd4JSOH7xjUq9KGvxb0Cr
+5/1j8mPzX0iRkvfKepgL9qSC3e5jG9P7yASJ1PjiqRjyb5vMvpDQ9QMtePpi1m5culKca1xVPtG/
+JT82dYdUsvKepUf7MlxA1rGe395cekn44q+zf+cffKv5m+VvJ50bzvPbzRwFf0RFHK01xbxU+KCV
+6cCqmnDizU3FaUAVeo4q7FXx5/zmxpD2vnTy7rcdUN5YPbh12POzmL1qO4FyuKsl/Lz/AJyc8ra2
+sNj5mUaHqZAU3TGtnI3Qnn1ir1o/wj+bOY1XY8474/UO7r+1z8epB2Oz2iKWKaJJYnWSKQBkkQhl
+ZTuCCNiDmnIINFygVGXTNOmvYb6W1hkvbbkLe6eNWljDgq3ByOS1UkGhwjJIDhs0ei0LtE5FLxD/
+AJyycP5F0ezQcp59WjaNdt+NvMp/GQZuuxI/vJH+j+lxNWfSPe9rgiEMEcQNRGoQE9+IpmmlKyS5
+QCpgSsllihieWVxHFGpeR2NFVVFSST0AGEAk0EEvn2fVfOv5269e6foN9Jof5e6fIYbm9QMst2af
+ZIBUtyG4QkKqkFqmgzfiGLRQBkOLKfx+C4ZMspobRZzof/OOv5U6VCiyaUdSnUUa4vZZJGb5opSL
+7kzBydrZ5HY8PuDbHTQDP9G0XStE02HTNJtks9Pt+Xo20Qoi83LtQe7MTmBkyynLikbJboxAFBJv
+zO1Aaf8Al35lu60ZNNuljP8AlvEyJ/wzDL9FDizQH9IfYxymol59/wA4P6S0eg+adXI+G6ura0Vv
+e2jeRgP+kkZ2zqX01irsVdirsVdir50/5zJ/MGbSfK1j5PspOFxrrGa/KmhFpAwon/PWWn0KR3xV
+mf8Azjd+WEPkj8vrae5iA17XES91KQijorrWG333HpI24/mLYq9YxV2KuxV2KuxV2KuxV2KuxV2K
+obUdT03TbR7zUbuGytI/7y4uJFijX5u5VRir5U/5yz/MX8tfNfl7S7DQtZh1LW9NvS5W2V3iFvJG
+yyUnC+kfjVPsscVSv8i/yi/LTzn5Ij1XVLSafU4J5rW9C3EkaFlIdCFQrT926980XaOuy4cnDGqI
+vk5eDDGQsvdvKXkby35StXtdBgmtrZ6Vge6uZ4wf5ljmkkRCe5UCuaPPqp5Tc9/gHLhjEeSN8x3+
+o6foGoX2m2hv9QtoJJbWyFazSKpKxjjv8R22yOCEZTAkaBZTJAsPHv8AlcP53/8Altpv+BuP+ac3
+H8n6X/VPti4vjZP5rzz8wfPP5i+bfNvluw1Dyq1rqWjzG+g0ROZmuRVZDVGHPjxgbcDpXNhpdNiw
+wkYy9Mutj8dWnJOUiAQ9D/5XD+d//ltpv+BuP+ac1/8AJ+l/1T7Yt3jZP5rv+Vw/nf8A+W2m/wCB
+uP8AmnH+T9L/AKp9sV8bJ/NYp+ZX5v8A5qXnli40LVfKbaCutAWkdyxlWRwWXnHGrheRdfhI8DmV
+pNBgE+KMuLh9zXkzTIoirR/kbzf+bvlHy1Y+XtO/LedobYENM6zK0kjtyeRzxoOTH6BtkNTp9Plm
+ZyyfaEwnOIoRej+RPO35o6xr62fmPyf+hdNMTub71C1HWnFaV/azX6rS4IQuE+KXds348kyaIZ7q
+jaqthKdKSCS/pSBbp3jhr4uY1kbbwA38Rmux8PF6r4fJuldbPlv8+YvzstdPS483apafoO7nEEVh
+pcjJbl6NIA0bKkjgenWsnKhpnTdnHTH+7HqHfz+f6nAz8f8AFyfQ3/OLHl06N+TWkyOnCfVpJ9Rm
+Hj6r+nEfphiQ5t3GeuYq7FXYq7FXYq+MfzQhXzz/AM5YWmgz1lsLe7sbB4zvW3gRbi5TvSrNLir7
+OxV2KuxV2KuxV2KuxV2KuxV5j59/5yM/K7yb6kFxqQ1TU0qP0dpvG4cMO0kgIij36hn5e2KvAvMv
+/OWP5p+arl9P8laWukxtXiYIzfXvHpUuy+mg+UdR/NkJ5IwFyIA80xiSaDF/+VT/AJo+b7sah5w1
+h1kavx3sz3k617KgYoo9uYp4ZptR7QYIbRuZ8uXzP7XMx6GcuezJYf8AnH3yrBptwjXFxd6g8LrB
+NIwSNJSpCOEQA7NvRmOak+0eQzGwjCxfU11/FOT/ACfEDnZYH+S+sfmZZeajoHlC8htrq6ZnubC/
+K/VnMAPLkrAtyUdfT+Kg8BnSa7HhMOLINg6/CZA1F9k6KdbOmw/pxbZdTp/pH1IyNAW8U9UK9Pnn
+I5eDi9F8PnzdlG63R2VsmndUUu5CooJZiaAAdSTiBaHhP5N8/On5r+bPzEkBbT7dv0do7EGhWgUM
+tRswgjUsP+LM3vaH7nBDCOZ5/j3/AHOJh9UzJ7vmicx2KvEf+clQLS78i63cEjT9O1cC6O3H4mjl
+FR/qwPm77G3GSPUj9f63E1XQvbQQQCDUHoc0jlN4pSXzN5z8q+V7ZLjX9Tg0+OSvpLK37x+PXhGv
+J3pXfiMuw6bJlNQFsJ5BHmXzJ+dn5haf+Z/mby75e8qtLPbLN6EbyI0YluruRI0oh+KigChIHU50
+/ZmilhieL6i4GoyiZ2fbWh6Ra6Noun6PaClpp1tFaW4/4rgQRr+C5s3HR2KuxV2KuxV2KvjfymCP
++c0p/rdK/pTU+POlKfUp/S/4144q+yMVdirsVdirsVdirsVeQfmX/wA5Ofl55MaaxtZv0/rcdVNl
+ZMDEj+E1x8SL4ELyYdxir5W/Mf8A5yD/ADJ88GSC6vjpmjyVC6VYFoYmQ1FJXr6kte/I8fADFXme
+Kvpj8jdTtb3yJBFFGkdxYyyW9zwVU5MDzRzTqSjipPU1zhvaDHKOosk8Mht5d/6/i7rQSBh5h6Fm
+ic12Kvnvz6l35B/Nqz8z2CEQyzLqMSqeIY143UVf8upr7Pnedl5RqdLwS5gcJ/R9n2uj1MPDyWPe
++wdL1Ky1TTbXUrGQTWd5Ek9vKOjJIoZT9xznMkDCRieYc2JsWisgyYZ+b1p5vvfIGqWPlSFZ9Tu0
+9F1LiN/q77TelXYuV+EAkddt6A5vZ8sccoMzsPv6NOYSMdnzl+Wn5m/mVoKR+RtEtNLsrmGWSsOp
+q1vM87t8Su8ssS+p0UKaGgAGdDqtHhyfvJ2fd3fBwseWUfSHq36V/wCcqf8AqzaN/wAGn/ZRms4N
+B/OP2/qci83c79K/85U/9WbRv+DT/sox4NB/OP2/qW83c8o/Mj8z/wAy/MAm8i6zaaZfXU0sY9HT
+Ea4lSdGqqxvFLKvqbFSBXqQc2el0eHH+8jY2693xcfJllL0l9KflXb+bbXyJpVp5riWLV7aIQsqu
+JGMSbRGUio9ThQNQnx70znNccZyk4+R+9zsIkIi2W5iNqB1xdH/RF2+sxQy6XFE8t4tyiyRelGpZ
+i6uCpAAyzFxcQ4D6ixlVb8nzj/zjB5UtfNn5xal5tisltNE0Rpbu1tEUCOOa6ZktYgBt+7j5tt3U
+Z3UIkRAJt1BO77PySHYq7FXYq7FXYq+M/wAyX/wb/wA5b2WsP+7s7q90+7Zz8NILlEt7htqV3EmK
+vszFXYq7FXYq7FWGfmR+bnkn8vrD6xr16PrkilrXS4KPdTdacY6jitRTmxC++Kvjz80/+clPPvnk
+TWVq50Py45KfULRj6kqntcTjiz1H7K8V8QeuKsQ/KyLyvP5wtbTzFbC4trn91bc2IjW4JBj9QAjk
+G+zQ7VIrmB2mcowE4jUh93Vv0wiZgS5Po7zD5J8ta/pa6bf2UfoQrxtWiAjeDbb0io+Hp06eIzht
+N2jmwz4oyu+d7373dZNPCYoh8/effyj17yuZLu3B1DRgSRdRr8cS9f3yD7P+sPh+XTOz7P7Wxajb
+6Z936u90+fSyx78wnP8Azj5r4s/M11o8jUi1OHlED/v63qwA+cbP92YvtDp+PCJjnA/Ydv1NugyV
+Ou99C5xDuWDeefKvnzV9WiufL+v/AKKskt1jkt+Ui8pQ7sX+AEbqyj6M3XZ2t02LGRlhxyvnQO23
+e4eow5JSuJoe8sD81/lL+ZF9pj3Go65Hq7WKPLBbMZGc7VZY+S9WC9O+bnSdsaQTEYQ4OLyAHxou
+Jl0mWrJuvel/5Q/8rK80ySeXdA85S6P9Qh9W2spZ51RouXx+kEDD4CwqPfbvmz1pw4xxzhxX5Bxc
+XFLYGnv35Y+RfzR0DXri881+af03p0lq8MVp6s0nGZpI2WSkiqNkRh9OaLW6rBkgBjjwm+4D7nMx
+Y5g7m3p2axyGGfmF+U3k/wA82pGq23paii8bfVIAFuEpWgLU+NN/st9FDvmZpddkwnbePc1ZMMZ+
+95R/iv8AMz8lbm20/wAzMPMvk2Z/Ssr5XpcIBvxXmSwKr/ut6r2Vxm28HDrAZQ9OTr+P0uNxzxbH
+cNSeb/zJ/Om9uNM8pk+XPJ0Lelf6g7D13DD7L8DyJZf91oafzNTEYMOjAlP1ZOn7P1qZyymhsHrH
+5d/lN5R8i2gXS7f1tRdaXGqTgNcPXqAeiJ/kr9NTvmq1euyZjvtHucjHhEPezPMJuePedvy3/OXV
+fNF/qGg+c/0ZpM7KbWx9a4X0wI1VhxRSoqwJ2zc6fWaaMAJQuXuDizxZCbB2eNfm7F+Z3lQQaDr3
+nKXV21SJmm0+GedgIQwCmVXC7OwIUd6HNtopYcvrhDhrrQcbKJR2JeieSv8AnHD8+9H0SJtG83Q+
+XlvlS5udPinuonSR0Hwy+nHxLqPhO5zYtD2r8mvJH5m+V/0x/jjzN/iL659W/R/76eb0PS9X1f75
+Vpz5p08MVel4q7FXYq7FXYq+Xv8AnNjya81joXnG3Sv1Vm0y/YCp4SEy25PgquJB82GKva/yY87J
+5z/LXRNbaTneNALfUfEXVv8Au5SR25leY9mGKs2xV2KrZJI4o2kkYJGgLO7EBVUCpJJ6AYq+aPzm
+/wCctrTTWn0L8vmjvL1ax3GvOA9vEehFsh2lYH9tvg8A1cVeMfl95AvPzCvLrzP5l1SW6iNwUueT
+tJdTyqqsQ7tXgvFgPGmwp1zS9rdrflqjEXMj4OZpdL4m5Oz3O18seXrXSP0PDp0C6ZSjWhjVkb3c
+NXk3ud842etzSyeIZHi73bDDAR4a2eaeb/yBsLlmvPK9x9QuQeX1OYs0JPX4JN3j/EfLN9ovaIj0
+5hfmP0j9XycLNoBzh8noHku+1y50OKLXrV7XWLT9xeB6FZGUCkyOvwsHG549DUds03aOLHHJxYiD
+jluPLy8v1OXp5SMakPUE9IBBBFQdiDmCDTe841/8pLaHW7bzL5U42OqWkyzvYfZt5+JqyrT+6LrV
+f5fl1zoNL21xQOLPvGQri6j39/3+9wMujo8UOY6PSB06U9s54uewnzt5H8z69qsV5pXme60W3jgW
+F7WAyhWcO7GQ+nLGKkMB07Zt9BrsGGBjkxiZvnt5d7iZ8M5m4ypj/wDyqbz9/wBT/f8A/BXP/ZRm
+d/K+k/1CPyj+pp/K5f55+15z518keZ/y91G01W01SZ2nLiPVrYyW8qTMDzQurFgXQnfl8Qrm90Pa
+GLVxIrl/CXCz4JYiHv8A+Qeia/NDH5tufO155k0u+s3gGm3Tzt9XufUjZuQkmlUPHwZdh0NQaHfV
+9qTgP3YgIyB57bhv04PO7eyZp3KYZ+afm/zN5Z0KGby5okmtanezC1gVAXSF3UlXkRPjYbdqDxYd
+83Q6eGWR45cIG7TmmYjYMC8p/kVrGu6ovmj81b1tV1Njyi0YODBEOoWQp8FB/vuP4fEtXM7P2nGE
+eDAKHf8Aj7y1QwEm5orzX+Rd9pepP5n/ACuvm0HWlq0mlhqWc46lFBqqV/kYFP8AVyODtMSHBnHF
+Hv8Ax9/NM8BBuGxZB+VP5j+ZPMs9/ovmbQJ9J13R1Q3s3ErbPzNEoGPJWehIA5KQKhu2Ua7RwxgT
+hK4yZYcplsRuHo2a1yHh35u+SvN1nNrXnD/lYl/omiIFli0yB7gBSEVFiiC3EacpHGwAG5zd6HPi
+lw4/DEpd+3z5OJmhIXLi2eW/lJ+UXnn829Svtdl1ue0XTjGo127MtzM9ytDHHG5dXrGg5E8vh+Hx
+zo4QERQFBwSSeb2z/oXX86P/AC8Gq/8AI2+/7Kskh6L+UP5dedPJv6W/xN5wu/Nf1/6v9U+tvO/1
+f0fV9Th68s3956i1pT7OKvRcVdirsVdirsVY/wCf/J9l5x8nar5bvKLFqMDRpKRX05R8UUlP8iRV
+b6MVfLf/ADiz50vvJX5han+XXmGtsmoztDHE/SLU4Dw4jt++Qca9yEpir7ExVK/MnmbQvLOjXGs6
+5eR2Om2q8pZ5TT5KoG7M3RVUVJ6Yq+M/zS/PHzr+bWrnyv5Vt5rPy67fDZoaS3CqaerduDRU/wAi
+vEd+RplWbNDFEymaiGUIGRoc0Nc/846uugI1vqXPX1BaRGFLVtv7tTTmtP5z18BnOw9pInLRj+77
++vv/AB9rsD2eeHY+pV/Io6rofmDWPK2rwSWlzJEl3FBIKCsbem5UjZuYddxUHjke34xy4YZYGwDW
+3n/YuhJjMxL2rOSdq7FXYq7FXYq7FXYq7FUt8w6Bp2v6Pc6VqCc7a5XiSPtIw3V0J6Mp3GZGl1M8
+GQTjzH2+TXlxicaLxryB5w1r8nPPM+i63yl8v3rKbrgCVKE0ju4V8R0ZR13HUDO3ywx67CJw59P1
+H8ebpgZYZ0X1xZXlpfWkN5ZyrPa3CLLBNGQyOjiqspHUEZzE4mJo8w54N7q2RS7FXYq73xVTuLi3
+treS4uJFht4VMk00hCoiKKszMdgAOpwxiSaHNBNPlfzv5j8wfnh+Yll5O8qBhoVtKTFKwIQqvwzX
+047IgNEB33p9p6Z13Z2iGGNn6zz/AFOtz5eM+T7B8j+TdG8m+V7Hy7o8fCzso+Jc/blkO8ksh7s7
+bn7htTNi0J9irsVdirsVdirsVdirsVfLP/OXf5WXENxb/mXoKNHNCY4tbMNVdWQhbe7BG9RtGx/1
+PfFWefl3/wA5I+VdQ/KqTzN5mu0ttV0YLbavarT1Z7gqfSaCPbl9YCkgdFIb9la4q+cvNPm3z/8A
+nr5uCUNnolo1YLRSxtrOIkgSSdPUmYd+p7cV6Yms1mPTw4pn3DqW3FhlkNB695O8l6J5U00Wemx/
+vHAN1duB6szDux8B2XoM4LXdoZNTK5cug7vx3u7w4I4xQT/MFvUJbGzluYbqSFGubfl6ExA5oHFG
+AbrQjqMsjmkImIPplzDEwBIPUNahew2Nhc3s54wWsTzSt4JGpZj9wxw4zOYiP4iB81nLhBPc8w/J
+Tzn5v8y3mqHV7oXFlaIhjHpojLJKxIAZQtQFQ9a50XbujwYYRMI8MifsH4DgaLNOZNmwHq+cy7F2
+KuxV2KuxV2KuxVjXnzyLpnm/SDZ3P7m7hq9leAVaJyO/ijftL/EDNj2d2jLTTsbxPMfjq4+o04yD
+zeb/AJZ/mj5g/KrXZPKnmyKSTQS9QFq5t+Z/v7c/txP1ZR8x8VQet1Gmx6vGMmM+r8bF1UJyxS4Z
+PqrTNT0/VLCDUNOuI7qyuVDwXETBkZT3BGczkxygeGQohzgQRYRWRZOxVSurq2tLaW6upUgtoVLz
+TSMEREUVLMxoABhjEyNDcoJp8v8A5n/mrr/5n65D5E8hQTTadcy+kxQcZL1lNeTV+xbpTl8VNvia
+nTOp7O7OGL1S+v7v2uvz5+LYcn0j+SX5N6V+Wvlv6uCl1r96FfV9RUGjMKlYoq7iKOu38x+I+A2z
+jPR8VdirsVdirsVdirsVdirsVSDz3rvlfQ/KWp6h5oaMaGsDx3kUgDCZJFK+iqEjm0leIXvir81d
+SfTpdTupdPhkt9MedzawyMJJI4WYmNGeihmCbV74q+q/y8tfLEHlOyPlsV06VefqGnqvJ0czH/fl
+RQ+HQbUzzrtWeY5z4v1D5V5eTv8ATCAgOFkma5yHYq7FWIfm3qBsfy81mRftSxLbge08ixN/wrHN
+r2Jj4tVHys/Z+txdZKsZSD/nH3TRb+S5rwj4767kYH/IjVYwP+CDZm+0mQnNGPQR+/8AAauz4+gn
+zenZzrnuxV2KuxV2KuxV2KuxVjnnbyLovm3Tfqt+np3MYJtL1APUiY+Feqn9pe/zocz9B2jk00rj
+vHqPx1aM+njkG/N4/ovmf8xfyX1w2rr9b0W4fkbVyxtLgDq8T0Jikp12r4gimdkPA12PiHP7R7/x
+7nUETwyovpX8vvzc8m+eLZf0ZdCDUgKzaVcEJcKR1KitJF/ykr70O2aHVaDJhO4uPf8Ajk5ePNGX
+vTXzl578seTtMOoa9eLboa+hAPimmYfsxRjdj+A7kZVp9LPMaiP1Mp5BEbvmXzJ54/Mb87vMcflj
+y1ZyQ6SzhksENFCKf96L2YbcV60+yDQAM1Cep0eghgF85d/6nX5cxn7n1H+S35IaB+Wmkkxlb3zD
+eIo1LVGHyJhgrukQbfxbqewGe0vSsVdirsVdirsVdirsVdirsVQup6np+l6fc6jqNwlrY2kbTXNx
+KeKJGgqzMfYYq+HfzQ/MTzL+dvnmHSNFR4PLtm7fo+2eoUIKh7y5pX42BoB+yPhG5JajU6mGGBnM
+7BnjxmZoPQ4Pyv8AK8fk1vK5i5W8g5yXVAJjcU2nr/MO3am3TOGl2xmOfxfs6V3ft73dDSQ4OH7X
+kehaz5g/KfzbLpWqK0+jXLB5VQfDJGaqlxDU7MKfEv0HsR0uowYu0MAlA+ocvI9x/HmHXY5ywTo8
+n0Fp2o2OpWMN9YzLcWlwoeGZDUEH/Pcds4jNhljkYyFSDuYTEhY5KzTQoaPIqnwJAOCOOR3AKmQH
+VyzQueKyKx8AQTiccgLIKiQPV5t/zkDctD5FijHS5voYm37BJJP1x5vPZwf4Qf6h+8OH2h/dj3p3
++UNt9X/LnRkoQXjklNRQ/vJnf9TbZjdtyvVT+H3Bs0Y/dBmOalynYq7FXYq7FXYq7FXYq7FUHq+j
+6ZrFhLYanbJdWkwo8Tjb2II3Vh2I3GXYNRPFLigaLCeMSFF4R50/JTXdCnOq+VpJby1ib1FjjJF5
+ARuCvGhenYr8Xt3zstB25jzenJ6Z/Yf1fF1OfRShvHcJFJ5F/M7zRY3PmTUI7m8eKMFHvZHa6mRe
+0SvV2CjcdK/s1OZsu0NNimMVgHy5D39zQMGSQ4qfTP8AziV518hXnlX/AA3p1lBpPmi0XnqUIr6l
+6F2+sq7lnfr8SV+A9AFIzYtD6BxV2KuxV2KuxV2KuxV2KuxV2KvjX/nI7847/wA+eYk/L/ye7XGj
+QTiO4kgNRfXSnswNDBEeh6Egt0CnIZMkYRMpGgExiSaDJvy88h2PlDRRbJxl1G4o9/dAfbcDZVPX
+gn7P3988/wC0+0Zamd8oDkP0+93um04xx82vOP5meVvKoMV7OZ7+lVsLejy+3PcKg/1j8q4dF2Tm
+1G4HDDvP6O9c2qhj25l47r/mfzt+ak6aXovlxrmO3f1I47SF7meOuxLzAURT32UZ1/Z/ZcNNdEkn
+n3fJ1OfUnJzDFvNXl7z35Lu/8P8AmCG60uQoLhbNpaxMsg+2nps0TVpQkHqKHcZseEXdbtFsbySH
+Yqu9ST0/T5H068uFTx5UpWnjir2HyZ+T/wCfGr+U9O1/yreSS6VdKzWkEOo+iQI5HRlMcjxoPjjI
+pXKMmmxT+qMT7wGcckhyJCOudA/5yq0IfvtM1G4VDuscNvqFadqwidj07HMXJ2Tpp84D4bfc2x1W
+QdUvl/Oj8y9CmEPmHQ0iPQpc209pKT1/aNP+FzCyezunly4o/H9bbHX5Bzop1pv/ADkboslBqWkX
+FsfG3dJx8/j9HNfl9mZfwTB94r9bkR7RHUMv0r82/wAvtSoserx28ndLoNb0/wBlIFT7mzWZuxdT
+D+HiHlv9nP7HIhrMcutMst7i3uIlmt5Umib7MkbBlPyIqM1s8coGpAg+bkxkDuFTIJdirsVdirsV
+dirH/PXm608q+XZ9Umo8391ZwH/dk7A8V+Qpyb2GZ/Z2iOoyiP8AD19zRqMwxxvq+cfL9n+Yf19/
+Omi29ytzYytfnU41CgPyLOyhqCTqeSqDt1FM7+WoxYyIGQBOwDoxjlIE0+1/yK/O7S/zJ0IpP6dp
+5nsVA1LT1OzrsPrEAO5jYncdVOx/ZJyGt6jirsVdirsVdirsVdirsVfO/wDzlT+dh8vaa/kfQJ6a
+7qUf+5S4jPxWtrINoxTpJMD8wm/7SnFWA/k3+W48v6eNZ1OL/c1ep8EbDe3hbfhQ9Hbq3h08a8V2
+52n4svCgfRHn5n9Q/HR3Gi03COI8yl/5qfm5LYTt5d8sP6mqM3pXd3GOZiY7elFStZa9T+z0+10v
+7I7G4gMmUbdI/pP6mGr1demPzZX+UH/OJcl6I/MP5lNKZJj6sehB2EjV35XkoPKp68FNfFuq51wF
+OqfT2j6Jo+i2Een6RZQafYxf3dtbRrFGPfigAqe5xVj35mflh5Y/MLy++k61CBKgLWGoIB69tKf2
+o2PY0HJejD6CFXwV+Z35WeaPy715tL1qHlbyFmsNRjB9C4jBoGU/st/Mh3X5UJVYdirsVfb3/OHX
+mKPUfyrfSS9Z9EvpovTrUiK4/wBIRvYM7yD6MVe7YqsmhhniaKaNZYnFHjcBlI8CDtirDde/JX8q
+Ne5HUvK1g0j15zQRC1lJPcyW/pOT9OKvMfMn/OF/5eXwZ9D1K+0aY/ZRit3AP9g/CT/krirzTVv+
+cTvzh8tSPdeVNVh1EDoLS4exuWp4rIVj/wCSpyGTHGYqQBHmmMiNwxq58/fnT5ImW382aVMYgeIO
+oWzRch0pHcRhUfp1+LNVn7C02TcDhPl+rk5UNbkj1tlGgf8AOQHlS94x6rBNpUx6uR68P/BIOf8A
+wmaPUezmWO+MiX2H9X2uZj7QifqFPRNK1vR9Wg9fTL2G9iHVoHV6V7NQ7H2OaTPpsmI1OJi5sMkZ
+cjaNyhm7FXYqlGq+VNC1fULe91S2F69opW2hn+OFCxqzekfhLGg3avTbMzDrsuKBhA8N8yOfz/U0
+zwRlKzumyqqqFUAKBQKNgAO2YhJJttp84edta0nyl+Y0Gu+Qr/0NQtH9W4WAfuI5wfiRSDxdJBUO
+lOPUd6D0PsqWc4R4w36d5Hm6HUiAn6H2P+TH5xaN+ZXlwXcIW11u0ATVdM5VMbnpJHXcxP8Asnt0
+PTNk470PFXYq7FXYq7FXYqwf84fzP078uvJtxrU/GXUJawaTZMf765YbVA34IPic+G3UjFXyR+U/
+lPUvNnmK589+ZXa65XDzRPKB/pF2Wq0h7cIz0AFK7D7NM5/tztLwo+HA+uXPyH6z+OjnaLT8R4jy
+DOPzf89t5Y8v+hZScdX1HlHbEdY0A/eS/MVovufbNJ2J2f4+TikPRD7T3fr/AGubrM/BGhzKf/8A
+OK/5HQWtjb/mF5ltxLqV3+90K2mBPoxHpdMD1kk6x+C/F1O3dukfTGKuxV2KpL5v8neXfN+hz6J5
+gs0vLCffi2zxuPsyROPiR17EfqxV8N/nR/zj/wCZfy5umvYeep+VpXpb6mq/FFyPwx3Kj7Ddg32W
+7UO2KvKcVeu/84z/AJoQeRvPwi1KX0tC11Vs7+RjRIpA1YJ29kZipJ6KxPbFX3sCCKjcHocVbxV2
+KuxV2Kqc9vBcQvBcRrNDIOMkUihlYHsVNQcVeX+cP+cZ/wAovM3OQ6QNIvH/AOPrSmFsQf8AjDRo
+D/yLrirw/wA0f84fef8AQZ21DyRrKal6dTHEWNhejwVH5GJvmXT5ZGURIURYSCRyYf8A8rL/ADW8
+jXo03zjpUslK8Y7+JreVlXasU6rxdf8AKo3zzT6rsHBk3j6D5cvl+qnLx62cee7P/LX5zeSdbKxS
+XJ0y7bb0byiKT/kygmP5VIPtnO6rsLPi3iOOPlz+X6rc/HrYS57FnSsrKGUhlIqCNwRmmIINFywW
+8CWLebfLnmTzCG0+PVV0jRm2n+rK0lzOpG6s7FFjXtRa17nembXRavBp/VwmeTz2A93P5uLmxTnt
+dRSjR/yO8g6cVea2l1GVTUPdyEiv+pH6aEfMHL83tBqJ/TUfcP12whocY57sS80+XfMH5YeaLfz3
+5JdorSKStxbAExxBz8UUigjlbydP8n58Tm97H7WGccE/7wf7L9vf8/dhavS8BsfT9z6x/Kf81NB/
+MbyzHq2nEQXsVI9U0xmDSW03genJHpVHpuPAggb1wmbYq7FXYq7FVK6ure0tprq5lWG2gRpZ5nIV
+ERByZmJ2AAFTir4W89eZtV/PD81xHas8Xlyw5RWXb0bJGHqTsDt6s7U/4Vei1zE12rjp8Rmfh5lt
+w4jOVB7Zp2n2enWMFjZxiG1tkWKGMdAqig655xmyyyTM5G5F6CEREUOTxPS9Gb81/wA/YNJlLNo1
+tMUuKbUsrEky0I6es9QD25jPQ+zNL4OCMevM+8/inQ6nJxzJfdcUUUUSRRIscUahY41AVVVRQAAb
+AAZntC/FXYq7FXYqo3dnaXtrLaXkKXFrOpjnglUOjowoVZWqCD74q+T/AM7f+cTri0a48wfl7E09
+pvJdeX6lpY+5NqTu6/8AFZ+Ifs16BV8xyRyRSNHIpSRCVdGBDBgaEEHoRiqLv9b1nUEjS/v7m7SF
+VjhWeV5QiIOKqocmgUbADFU/8k/mp588l38N1oOrzwxREcrCR2ktJFH7MkDHgRTaoow7EYq/Qb8v
+POFv5y8laR5mt4/RXUoBI8NeXpyqxjlQNtULIjCuKsixV2KuxV2KuxVB6rpGlavZSWGq2cF/ZS7S
+W1zGssbfNHBGKvD/AD5/zh75B1r1Lny1PL5cvmqREtbizY/8YnYOlT/K9B/LirxDWPy7/Pr8pmea
+GKW90OI8nuLOt5ZcQakvERzhHixVfnmJqdDhzj1xvz6/Ntx5pw5FNvKv/OQWi3fCDzDbNp0/Q3UI
+aWAmnUqKyJv2+L55zWr9nJDfEeLyPP58vudhi7QB2kKepWGo6fqNst1YXMd1bP8AZmhcOp+lSc57
+LhnjPDMGJ83YRmJCwbROVMlk0MU8LwzIJIZVKSRsKqysKEEHqCMlCZiQRsQggEUXiepWHmf8m/OM
+PnDyiS+jSH07i3erxhHYFrafuY2oOD9QadwCe77J7UGojwy2yD7fN0mq0xxmx9L7C/Lr8wvL/n3y
+zBr+iyExSfBc2z/3tvOAC8Ug8RXY9CNxm5cRk+KuxV2Kvm7/AJzA/NOTTNHg8haVKRf6ugn1ZkJ5
+JacqJDt3mdTyH8op0bFUg/KjyOvlfy2n1iMDVr8LNfsaVXb4Ia/8Vg7/AOVXOB7Z1/j5aH0R5fpL
+vNJg4I2eZZRr1/8Ao/Q9Rv8A/lktZp/+RUZf+Ga7SwE8sInkZAfa35ZVEnyYp/zg/o0Ump+atccV
+mghtbKJu/Gd3ll/GBM9PecfWeKuxV2KuxV2KuxV2KvOfPf5Aflj521UatrGmtHqRFJ7m0kMDTdKG
+Xjs7CmzUr+GKsb/6FD/Jv/lmvv8ApLb+mKu/6FD/ACb/AOWa+/6S2/pir0/yZ5Q0byf5as/LmirI
+mmWPqfV1lcyOPWleZ6sevxyHFU7xV2KuxV2KuxV2KuxV2KvMfzC/5x1/LLzr6lzcaf8AovVn3/Se
+ncYJGbrWSOhikr3LLy9xir5080f846/nH+XVzJqnlK6k1nT1NTLpwYXHFenrWR58/kvMZTmwQyx4
+ZgSDKEzE2DSH8r/85ABZRZea7IwSoeD3lup+FgaH1YT8Qp34/wDA5zes9nBzwn4H9B/X83Y4u0Ok
+w9b0nWdK1e0W80y7iu7ZukkTBgD4Hup9jvnM59PkxS4ZgxLsYZIyFg2q31jaX9pNZ3kKz2s6lJoX
+FVZT2ORxZZY5CUTUgmURIUeTxy2svzN/KLzbcaj5Eil1DS9RRkNuIZLqMqDVUnij35Rk/A+3z3YZ
+3Wg7YxZYXOQhMc7NfK/wHS59JKMthYZVB/zlL+eWlMZNc8owTWiEmRzaXlsaClaS83jp/sTmxx6r
+FM1GUZe4guPLHIcwQ9C8jf8AOYH5ea7NFaa9bzeW7uUhRLMwns+RNADOgVl+bxhR3OXsHulvcW9z
+BHcW0qTW8yh4Zo2Do6MKqysKggjoRir849U/MZtX/M6688azZnUTNdNcxWTSekFVPhtk5cZPhhVV
+FKb0yjU4pZMZjE8JPVnjkIyBItnP/Qyn/fuf9Pv/AF4zm/8AQx/tn+x/487D+Uv6P2/sQWuf85A/
+pXRNQ0z9A+j9etprb1vrfLh60ZTlx9Fa05VpXLcHs74eSM+O+Eg/T3f5zGev4okcPPz/AGPU/wDn
+B7UUbTvNmmkgPFNaXCjuRIsqH7vTH350zrn1DirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV
+dirsVdirsVdirBPzB/JP8uvPivJremKmpFaJqtofQul2oKuopJTsJFYYq+afOP8AzjN+afkK7fWP
+JF7LrNjGeX+iVjvVUb0ktqlZh/qcq/yjK8uKGSPDIAjzZRkYmwl/lf8AP1opf0f5vsmgnjb05LyB
+CCrA0PqwH4lI78f+BzmtZ7OA74T8D+g/r+bsMPaHSfzet6TrOlavZreaZdR3ds3SSJgwB8D3B9jv
+nMZ9PkxS4ZgxLsoZIyFg2jMpZsJ87flR5Z8zxSTLCthqxBKX0Kgcm/4uQUEg9/te+bjQds5cBAke
+KHcf0H8BxM+kjPlsWPfkJ+aPmL8t/PS+QfNEjHQbycWyo7FktbiZh6U8LH/dMpYcxsN+WxBr3OHN
+HLATibiXSzgYmjzfWP8AyrzyB/1LOlf9INt/zRlrF3/KvPIH/Us6V/0g23/NGKu/5V55A/6lnSv+
+kG2/5oxVHaV5Z8uaRJJJpOlWenySgLK9rbxQMyg1AYxqtRiqZYq7FXYq7FXYq7FXYq7FXYq7FXYq
+7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqwT8xvyU/L/AM/xFtbsBHqQXjFq1pSG6XsKuARIB2EisB2x
+V856t/ziZ+bHl/VpT5M1qO4sZhtcpcPYT0B2SVFJBp4hj8hleTFCYqQEh5i2UZGPI0of9C+f85Nf
+9XeT/uLS/wDNWUfkNP8A6nD/AEo/Uz8ef84/N3/Qvn/OTX/V3k/7i0v/ADVj+Q0/+pw/0o/Uvjz/
+AJx+aX3n/OK/576ldpcalLBdTgKguLi/MzqoNQAzVagqTTMjHijAVECI8tmEpEmybf/Z</xapGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xap:Thumbnails>
+ </rdf:Description>
+
+ <rdf:Description
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ </rdf:Description>
+
+<cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></svg:metadata></x:xmpmeta>
+ <xpacket />
+ </svg:metadata>
+ <svg:switch
+ id="switch6">
+ <svg:foreignObject
+ requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/"
+ x="0"
+ y="0"
+ width="1"
+ height="1"
+ id="foreignObject8">
+ <i:pgfRef
+ xlink:href="#adobe_illustrator_pgf">
+ </i:pgfRef>
+ </svg:foreignObject>
+ <svg:g
+ i:extraneous="self"
+ id="g10">
+ <svg:g
+ id="colors"
+ i:layer="yes"
+ i:dimmedPercent="3"
+ i:rgbTrio="#4F00FFFF4F00">
+ <svg:path
+ i:knockout="Off"
+ fill="#F8DC75"
+ d="M237.682,33.617c-0.019-5.071,0.402-24.5-2.5-30.4 c-7.869,2.99-19.189,11.68-22.431,21.588c-15.532-2.32-35.042-2.045-50.381,0.608C159.808,14.753,147.946,7.596,138.243,3 c-4.093,6.907-3.906,19.92-3.445,31.279c-0.018,0.013-0.037,0.024-0.054,0.037c1.8,47.7,22.2,74.399,52.799,92.399 c31.481-17.988,50.972-49.057,50.101-93.12C237.656,33.603,237.67,33.609,237.682,33.617z M216.485,25.421 c0.114,0.021,0.229,0.042,0.344,0.064C216.715,25.463,216.601,25.441,216.485,25.421z M214.527,25.083 c0.275,0.044,0.554,0.094,0.83,0.141C215.081,25.177,214.805,25.129,214.527,25.083z"
+ id="path13" />
+ <svg:path
+ i:knockout="Off"
+ fill="#D2A41F"
+ d="M91.013,133.328c46.474,4.115,90.927,22.883,141.085,49.085h25.598l0.361,0.191 c0.516-2.575-1.888-6.025-4.752-9.229c-4.941-5.528-11.623-6.145-19.707-5.951c-5.738-6.83-41.004-43.861-41.004-43.861 l-4.808,3.395c-38.75-21.75-49.155-62.513-49.155-62.513c-33.792,8.148-69.78,28.334-90.391,49.761l-3.118,3.292 c-1.489,1.597-2.928,3.174-4.312,4.723C18.967,146.661,3,170.87,3,175.213v2.25h23.816l-0.505-0.668 c-2.449-12.943,4.443-23.341,10.279-30.385c4.179-5.044,11.1-9.801,21.968-12.457L91.013,133.328z"
+ id="path15" />
+ </svg:g>
+ <svg:g
+ id="tomcat"
+ i:layer="yes"
+ i:dimmedPercent="3"
+ i:rgbTrio="#4F00FFFF4F00">
+ <svg:path
+ i:knockout="Off"
+ d="M240.682,32.617c-0.019-5.071-1.598-26.5-4.5-32.4c-7.869,2.99-22.189,12.68-25.431,22.588 c-15.532-2.32-33.042-2.045-48.381,0.608C159.808,12.753,146.946,4.596,137.243,0c-4.093,6.907-5.906,22.92-5.445,34.279 c-0.018,0.013-0.037,0.024-0.054,0.037c1.8,47.7,25.2,77.399,55.799,95.399c31.481-17.988,53.972-53.057,53.101-97.12 C240.656,32.603,240.67,32.609,240.682,32.617z M214.485,23.421c0.114,0.021,0.229,0.042,0.344,0.064 C214.715,23.463,214.601,23.441,214.485,23.421z M212.527,23.083c0.275,0.044,0.554,0.094,0.83,0.141 C213.081,23.177,212.805,23.129,212.527,23.083z M235.784,36.059c0.81,39.69-19.44,71.279-47.79,87.48 c-48.118-23.977-57.183-84.71-48.977-117.289c2.283,12.454,6.424,20.266,15.394,24.098c19.533-5.591,46.423-6.033,66.231-0.57 c8.255-6.001,11.456-15.169,13.204-23.18C236.029,15.921,235.777,36.055,235.784,36.059z"
+ id="path18" />
+ <svg:g
+ id="g20">
+ <svg:rect
+ x="133.209"
+ y="90.51"
+ i:knockout="Off"
+ width="26.245"
+ height="3.239"
+ id="rect22" />
+ <svg:rect
+ x="133.209"
+ y="82.732"
+ i:knockout="Off"
+ width="26.245"
+ height="3.24"
+ id="rect24" />
+ <svg:rect
+ x="213.35"
+ y="90.51"
+ i:knockout="Off"
+ width="26.244"
+ height="3.239"
+ id="rect26" />
+ <svg:rect
+ x="213.35"
+ y="82.732"
+ i:knockout="Off"
+ width="26.244"
+ height="3.24"
+ id="rect28" />
+ <svg:g
+ id="g30">
+ <svg:path
+ i:knockout="Off"
+ d="M204.1,63.524h-27.188h-3.021h-12.561v-2.917h13.31c1.639-7.018,1.963-13.725-0.014-17.125 c-0.844-1.446-2.01-2.121-3.674-2.121c-7.609,0-10.753,8.046-10.884,8.389l0.002-0.003l-2.73-1.024 c0.156-0.42,3.965-10.278,13.612-10.278c2.692,0,4.834,1.235,6.191,3.57c2.41,4.141,2.127,11.305,0.494,18.592l23.354,0 c3.103-9.116,9.581-13.414,20.405-13.414v2.916c-11.732,0-15.019,4.973-17.366,10.498l12.743,0l-0.029,2.901L204.1,63.524z"
+ id="path32" />
+ <svg:path
+ i:knockout="Off"
+ d="M206.017,77.925l0.019-0.003c-3.459-5.101-4.555-9.456-3.108-14.413l-2.971,0.015 c-1.035,3.3-0.62,8.273,1.929,12.54H172.21c1.806-3.616,3.479-8.025,4.702-12.54h-3.021 c-1.348,4.786-3.241,9.524-5.372,13.277l-0.689,1.213l16.652,10.482l-9.375,6.178l1.605,2.436l10.479-6.908l11.312,7.382 l1.554-2.468l-10.488-6.488c0,0,15.682-10.187,16.461-10.684C206.024,77.937,206.021,77.931,206.017,77.925z M187.156,86.733 l-12.317-7.755l24.071,0.006L187.156,86.733z"
+ id="path34" />
+ </svg:g>
+ </svg:g>
+ <svg:polygon
+ i:knockout="Off"
+ points="114.745,73.635 122.087,95.391 99.788,80.434 "
+ id="polygon36" />
+ <svg:polygon
+ i:knockout="Off"
+ points="93.261,83.153 101.147,96.75 84.559,88.32 "
+ id="polygon38" />
+ <svg:polygon
+ i:knockout="Off"
+ points="75.313,93.759 79.12,107.356 67.699,99.47 "
+ id="polygon40" />
+ <svg:polygon
+ i:knockout="Off"
+ points="196.871,130.199 189.801,141.077 202.31,135.366 "
+ id="polygon42" />
+ <svg:polygon
+ i:knockout="Off"
+ points="208.021,142.709 196.6,151.411 212.372,147.332 "
+ id="polygon44" />
+ <svg:polygon
+ i:knockout="Off"
+ points="180.282,24.686 188.713,43.178 194.151,24.414 "
+ id="polygon46" />
+ <svg:polygon
+ i:knockout="Off"
+ points="137.588,51.608 150.913,58.678 138.947,59.494 "
+ id="polygon48" />
+ <svg:polygon
+ i:knockout="Off"
+ points="140.851,66.021 149.009,69.284 142.211,71.188 "
+ id="polygon50" />
+ <svg:polygon
+ i:knockout="Off"
+ points="236.031,56.775 225.153,61.398 234.127,62.757 "
+ id="polygon52" />
+ <svg:polygon
+ i:knockout="Off"
+ points="231.68,70.1 223.25,72.548 230.048,74.995 "
+ id="polygon54" />
+ <svg:path
+ i:knockout="Off"
+ d="M256.305,173.375c-4.941-5.528-14.623-8.145-22.707-7.951c-5.738-6.83-39.004-41.861-39.004-41.861 l-2.306,2.903l40.162,43.238l1.743-0.149c10.912-0.935,17.115,4.983,18.757,6.819c1.204,1.347,1.931,2.575,2.326,3.539h-22.075 c-50.624-26.416-95.078-45.044-142.297-49.112c0.104-6.571,1.273-14.01,3.518-22.299l-4.343-1.177 c-2.308,8.521-3.523,16.236-3.661,23.133c-4.92-0.326-9.872-0.495-14.868-0.495c-4.237,0-8.095,0.394-11.614,1.077 c-4.59-4.587-8.5-8.959-11.823-13.108c21.936-22.85,58.15-43.498,89.533-51.092l-1.015-4.396 c-33.792,8.148-70.78,30.334-91.391,51.761c-9.565-12.91-13.36-23.504-14.487-31.532c-1.424-10.14,0.997-19.441,6.999-26.899 C47.15,44.099,60.502,43.277,74.23,45.586c-0.268,2.167,0.017,4.24,0.885,5.522c3.631,5.363,23.144,7.246,34.791,2.049 c-8.595-12.045-26.006-17.926-30.83-15.569c-1.598,0.781-2.804,2.214-3.63,3.886c-4.745-0.849-9.458-1.48-12.903-1.455 c-12.107,0.088-21.363,4.319-28.296,12.932c-6.802,8.451-9.551,18.944-7.95,30.347c1.516,10.8,6.863,22.286,15.825,34.198 c-1.489,1.597-2.928,3.174-4.312,4.723C15.967,146.661,0,172.87,0,177.213v2.25h28.816l-0.505-2.668 c-1.627-8.601,1.623-19.351,8.279-27.385c4.179-5.044,11.1-10.801,21.968-13.457c9.663,9.431,21.975,19.446,35.679,29.109 h21.414v-2.25c0-2.539-1.259-4.762-3.545-6.257c-3.383-2.212-8.605-2.517-13.402-0.881c-4.573-5.093-7.137-11.896-7.691-20.347 c46.474,4.115,90.927,22.883,141.085,49.085h27.598l0.361-1.809C260.572,180.029,259.169,176.579,256.305,173.375z M33.125,146.539c-6.816,8.227-10.429,19.094-9.601,28.424H5.372c3.647-7.894,18.176-30.712,39.644-53.76 c2.958,3.656,6.253,7.35,9.872,11.073C44.347,135.444,37.437,141.336,33.125,146.539z"
+ id="path56" />
+ </svg:g>
+ </svg:g>
+ </svg:switch>
+ <i:pgf
+ id="adobe_illustrator_pgf">
+
+ eJzdffle8sqy6H0B3gFUFGQwEyEBB2YHUEFwwJlJRJlkWGuv88d59lvVSUgICWmQ75x1716/7aed
+Tnd1dXXN1fF6iuVQsjmot0J8mHG7vN70qFWbDEYxN2l1n3e70/FkhE2+G7+bZcMMdEqeS29qx7vW
+aNwZ9GPkEXmYw7d951e565vTrN/t80NbpTPptqB1Mug1apPw+K+2X5sLXs7UJvAwciAfMKKbZWJ8
+1J28hOepwbTf7PTbqcF/YPyo6OYZzi3AU0GKwuOzzk1rbO4TjrK8jB3DnAy/CLwYluBNQYInDL6V
+GTSmvVZ/UhwNGq3xOD3oDkbjmDv9T63vvqy14UnNXW11u4O/3alurfHtgtVG3nKdbgsW1qtN3FFc
+ZfKcfyOv3o7hHXgdf8fm6Nt5D1rKrckEoIKBESXpy2reOB9Aqv7ne7pptTsEw4CIF78ycqXVG3YB
+KWRRPCCFl0XtX7UHwEOehqJsmJdlGfAmhiMy9BMlPiwwjAC/RMgj5Q193a2/Oq2/Y+6rQb+lLC45
+mpQ7/9XCqRg3xzBK68202xrd9jsTWASHTbKy4stBs9VVm8i7uW6NLJT8x+o/lQ6V2qjdmsBODbrT
+CaEUSZvhator1P5pjfQJroetfmVwR+ALiUJYFMWIWxQY5Rc2HHFLouyOMoA6ScEgC8tUp2TJtKwy
+No6E42gTRHHvi7Az16NOu9OPsYLoDnHYint2Ouo09S2Lcm5J+UHWEZYM/5e1/ysAw9onk1Zf2eZs
+v5ke9BDJY6Re2Ng+7Hp30FaezX4nT2C66VCBlfz9BvtRHHX6CIPrijyR3ordKTw6HQ2mw/P+x8Dl
+U05lEScd9a/78MunOzWajj/dlcGgC6dtroP6SBkFH44mxt5L54C+9uPrA601drrW7Xbao9rws9Ow
+Gt7i+Wweu3eXTgjbNGrpY5A/Z/8ufbPcIKi0gnL+0WxwizeWz/BPrz7odsY9fWBDi/67E0XARnVb
+/eZ4Nozypw5YofOX1rh8sEzrA1idYWtJa7b/V6s7GBrQOGup9Zvu+9poaDcsQvfR6TcBK+VpZ9LS
+N3rQGyIDd5c/a0NsXuipnBA4PcbzEQotPzgrvyArT5ARTv7ptsaug3x/8Hef/OGOuXxPgJLatDt5
+8bsPrmq9ljvoOih3gEm3tC6M+9rFqDzwG367cWn8MO/SuCLjfvgH/riAX76g6W+34L50P70w7ia0
+Pty4kIE9NF0HxRoA54673AcwLfxLAIQV6eA5rrFY6wI7axEginWXnbhBkMauhdZiY/bGt+XTYmoG
+gjbTKvgtwHBGpC6skHRYZyNZRnmkHBsc5v+ozTCQqdFmcBVWTV6CclJzed8OtL9hr/GvTgOxURv9
+o/z9cFm4ArlI/vBtN9W+QC3lCQzedvv+0+v2oUMIf/SBgvxAQt436+d/1bpTtYPsPjiHOeceT/4Z
+qk8PkqNRzQqCXmtSawLgvweAXQ+Av2qjTq3eRT1o/G8A4n8dhv9JLMT1Po3PTrc5avXVPiayNXQE
+mTXq1KcTBDRIHgUX1xIb15Dn4ZH4H95Y6iXNQ4zvOIPp2+2P3xpg5wx6cZvOBpi5/9lt0NawuB3k
+QewvuuUBHY7/rYvDNQRpyHFNKoC1A7leEYQ44areIeYk++9DlXEVi8TQHTS+W03n9fXB6vv3rU2D
+/k9SwQq84N98WCiRNL/28cff/2sScNztNP6/EH9kIeXBdNRoEa/Tv3JN8yD/4wjizFN2cNOqdf81
+pP6PpcBzXM3MAfjvWs1/rFbzd6c5+XRcEScyYVbk2H/ZilTgF1f12eq0P53VbVYSwgLL/9uWpUG/
+uK76YALqYaH1MVEciM4rdB+kBoN/z9IWF/AvEbYgm/4fl7WbEzgbAt7ggMAWRsVd8pxl3TM/BnFA
+uwu1fntaa7fcxcFwOjSRLnmhOGqNW6O/Wu5K6z8Td7bZmdTqnW5norJoMRLhI7MJZHdtNKkPaqOm
+u4HBAjfrHmmKnWPP9qilrdexb31GGRFO4CT7rpwOgGNPAwCOfesLQnyx2zzp4vPJqNYfD2uwr41/
+YLpO0z3u/Fdrtk0a2mX3sDZsjeBhb9olfjdNWjMax8RO19PJcDpx39TGk9ao81+ko1sPtajgRebe
+uWyNPx3eYOb2X6Mldwd61SYtWHmL2EhLO3/3QaUfAHBtdAOrx/3pstXsTHuGCV8MJ9+KPNX4CqCC
+kOHEbbB/TEdCIxfAvIr4qIb55rATNkFb63bGpqZebfytolnUMDasNXWzJHnuTk4ngxn2tP1nDAeM
+cX/MQB6RfqG/Wo0JkEy91q31G4t7PfcKYKzb6bfcEzhrdD3Hk9HgWzv7rE3nRrczBJJE581/4Dy0
+AW0Obwy1Uz/4qzUaooN0xl4ANY3BqNlqLm6D++BqMJl7vCrvcRhOp5YDne8djJqjcVhx4JgV74Vu
+tX5/MJmtXdnlhU4aHsbjeQ662HHabzh0AXkHJ6ZJdQSML/9nGNYlpdXo0GEwbE4dOoydRmgM5tmY
+qQOSzvIOgz6QyEShw6VzqT112iasyaonMOJ5lsQzNj1H5p7RiHXHueNnufNDZd+X7zp0AjY038/A
+lc1dP2vN1qi1fLwuiyezNlnaCXA3Ia6bpX16eGzHRkZu1a/fagPj/2v5YPUOnsF5CWYGvPVXq2s/
+yEd/Eh5P6+MlC8Muze5w9DGY8RcrKlO69UDbUbUDS3S3e9/hXm30PR58fIQVdZe6+0jX+yl6TwZD
+6r5d0LhnCLDpDPyh1TRDTdHdADVF7xnUFH3noF7ce+xLNJx6bbSMuLHfyBA9dOg6BGHQ6X8MnGYe
+GVZi3YUsRO0T5iK2C262PlCKGsxZa2ZMOn8N6hNMZHLsqIiij0532RHDjmMMdjr0mZMfVr0ao2Z4
+Ahq5ppFZnSDsM240+ssOo9Jn2G38Y9BrFvGmdKt1W+G/KPt9LiE77DUYtbWxlvZRx7Fi8NhlOBh3
+lhMZ9oL9Hn4ORv+lcraoXb/BqIO5YA4DdkfhmYJUx3Sx5X01WTkcTJYcG+ypMztrOgNadFAPsEe9
+M+nVhmYRadebrKI2Vl6i6DpYTuGzfnXVW7qsY7M17rT7TugeDkdhYkItoxbs9AlMbNxaxhtJt7/p
+uhndQksGc2Qi0Enfs2iUDwuWjAm6dTCJcE4cROSIU3eDOGClsLVsmnWeSQNWdOqqC4OozNl1NeJI
+ZG27GZBkxaewS1NJC1nCFqGTs7Y/nnTVXsNh035G7KbOOOtnPyB0wZPZtfLxL/RF2m+N5lyCS6dX
++muGgiHlyGoGEL/dFjGVdJM4PnPZYAJRUuvsRpuKyryyO504WW3icNZHoA6Oxi0cbWS/YOw5/u4M
+gVv2v504HCoEcNzbluu7GNQxvcywOt0TA52yxbL72mS8zvlP1D4FtKIxexGz2IiPa6kHRX3rdFRr
+ooAgbyk+FTtDZPaO4jc4uFP8ASk7f4AKumrfV3RrybZP2c4HoHRLo/WfVq3/G6P1T+ORwRGWuGFY
+o9eqP9D9Be5On7gcUCpbuWwWqc/3ZEg3d69B/1Z2Cq6hmMm9pYmN1TG6Lq3IU+uueT0NEKHrE8BI
+14aKA7TTWmKyaOOcItbg6FQ+p716v9bpLpGD2juYtwz/5pZKV61zDojqvlXHd5yhIQncmcHffSWR
+J9/pNw0kTvuamdI5zkols3mZpMcn64O/dFtu+atp3arV4V2+0/NvlaY1fc+5iOOEmFtf1r17yzZ3
+VPtndWzOv7UaMuffXQWX+ObKqDS9tAIm8U16RF4O+oPG52jQa1mh09r5s+xdM1KFpRuCI9gjVaCa
+2xK1y4+i8gJIHudDXhl1epfoUXDuCvydsich9tRSA37GDQEl50sNc51vEiUGQajMwnN2Jrh5efct
+BzeM9sI1UdtzgHhA39+D0XdhpqKu9l7KyU1k++bNuqBWlrphtNdS6MAoLPcdzfW9cTBR5jqvAIMR
+Q8voWQG4019iAWtds716q3meThdHxILUpOjSU16e1hGNg/7kBo1EZ3hmqh+FCFW0m4ohNkelHi0Z
+C54rmtKVIdNmKbLNL17W/rNED6UaodO31Ulp3lf01JTJb079OmqdqtKp6JyrD6Hqt2WH0ILD6xVj
+LM1R4Us2RoN6baLUjc3MDuihrmqmdppNDtkc3hrW+pp7XJOx5btTJGGFmCcLHjv1cWHQqC3OAA/J
+wVGsCJWm9GcAXqOju/4NM2b7jYEerxX0B6TUQufSM00eHpHyHKRdOBANi+daheLik2L7Y7HxoWZO
+LcDpu53GDKz4ojmgF77M12Lgjik1Griz2jMX2UljC5oYyXL6/FyKZGDcJlbteAPHYmgnMfY/bGXy
+F42PnL/EJRM/qVefcHL9fhy955lmvBXz9smf8fPx4CP3Xpju5TyBJ8bUFji5qx8wXHcSSd5UcpVE
+bPgii49i79HlPQy95wZkMJgvPk6Wp7e+ZL/eHqvvHP/0kvn77PZodFzrn3bvvuqp98tSMhnssy/x
+E/ZOymw3p9lM+uz5hQwVOD4aeoUxv1MKnHxOeAKIy0sBygqAHNWTweHVRSIvj4+ls8P7cG7wKNy5
+vNnR8yOTecxVK7mj5FHDCp7jof9wCBOchdLcztF7JjxN3Cajz29VsTpki7nd0kNXna+R3M18DP1s
+snIxmeptLq/Smn/wT2Cci2kmfP15OBoJmQ7DiVvDxN1eeUfpzjLFWs4/2a1lgy9XBykxyG2p47wP
+EqNRfFwBeIPnDBv6iunIiqdu0i2XdyzlJnfc6+B7Vyy19gMRT9p/LRyWYpXA0Y34OXphxodhviBz
+geNTz64w5saXAM2dFD4YS6eC9BP/gj/9fqa5W83MT/o8erl8LpFJgcbmp4V3o6+R2Plr2HLS152r
+gu2kYid/6rWa1OUdjQ49vtGY9Y6s1jqWiuyzsMXF9q0mHe8FL0M2k0Y+fbW9apZM6vIurFXwPwcO
+uXbJctKt3KuwfTvsFqwmZXKpfMJqUpcXphW3d/oj/5E1goXqK5P7uCpbT3rqOdxlL94qlpOennEV
+Mime/UUEc4/HlXcyKbufrGfnd/V+9Dw9LuCk8cU99VX5py7rh0lDQX1SmEUhpQKTUtda3NszTRqJ
+9N6GdpO+jV4++xWbSRM1MZrbYV1e07QqKZ2839hNerbD++LP1pMeel7G25+tG9OkwGGUaUtp//HP
+Tq9gNWkg3o0d20wa+dw/eUxcW08qVKtMTmaugMas1rqVa0d3bnrctdWkTO7lJWczqbjt/e5fpk2T
+wizatDXmNPh+Zz3pKZPca/miVUv0TraDJ+qk1ZDPhN6TK+Ho2aWcVTb7/J2bW+vjIVOIhlic9HBh
+0rPWQLyphTiYlAmZV1p4eqyZJiWzqGuNfjdzr3aTZpjL/RfZetLzn1jia3R1YzlpOb7Hw6m0Xqu4
+nW+VecZm0qcQU37zb1lPmj9rXT09+n36pC6vYdq7vX7bdtLyZ+m9bjfpKXOXHx5aTw==
+
+
+ WuC9Lu9tLnF4ZLnWu+HFlu2kd2+nWxO7Sa+Z+5N8Rp8U1mKY9vI4+/ZaenmxnPTl+vvcdtKvaqSZ
+s5n0Gbgl8zLuhqzXevU17F3LEm856dt5qG876chbDnj0SVGKGc/qLZPt9C4sJ5WuQluexEsoC5Py
+YfOhmb5F39RJ67zfdGhcXv9jobZPpuX2jn1n82stMO/7sSROemyaFIb9+tGYvnhgnnQ82D1SJ52c
+BGBf5tfqea49+ZVJU1X2fJ4VBkfj22MPTppY5EnnIW2lh6xpUsBY/GxLVKY9YfMhEysMDoUrRdLw
+O7F0fn7SndGoVu/jpCnzSkfJ1kCj3hTQmFmUR75iqqQ5iZXCJgRvDVrvFUWmtmpv4jxIZ7e7r4OY
+1VMikSNn1RLbu7N7+5M5e/dObZ8C683s2jyFHdgNpL0qt2RaX62o6bkosW8a3ONvyfy0/7n1YPs0
+WjyPPetPF3Zf4vZv3m3flj5rr3u2T5Pc7mPD6qmqwxQC/RPO9u1C/fojbvv0eqtRP7N5Kp3tnh3e
+jjWMfez9yKa3bwMdTT39YLdi5qf1i3Lf9uldJvA90p8uYOzeWz/w2L59/5yJHdk+ffe+RnesnqoY
++5oUh2e2b3/fcamS7dPed+741e4poKoUj8wwtvj8ghOOH2yfNvr1csHu6a5n9/x53x5ju9nkZb1l
++/YFd7LF2j1Nergdf8wWY5EzJnu0r6065oubznSgUhqfqE/T4UPT08r76X7S+FQI3iBDKSnGXDq0
+nwbdcjJ8fUm3Pyvo1EseHctnO0hZ9z7VWj5pxGzMvvFD4u7jtpysVLz3hEUlK5dNIVsbPXkDqcH4
+Sm8Du7I2etwjfC7GSp4rwsw8+/k46wlmbu49wbvXsif41qx4fE/+Kf5WBBL8TntC+bfIolFYbSdL
+fFkCqNMBsE4H3+JOVP5AS3yf82h25YuUe5s81xLxIbuVuQhsR7Sl7faSg8wrkOm2vMXtHRWPM639
+rJecOzRnnjQsWvdzKT3R2pKX9yT9jmPpp6pjPzDD6js333o/l9e257730DNwHFHcpl0L2GLRG/8L
+xYg7fT7+RtHPe925rFGsRdxGod6gGHHvvB5ua/22e7n0x4V0cHnRisKf+9vJ6GOXV2xkPwjHj0OF
+Tpgx101Wkv0ccxER9hWyQfcHWMsRThe84lZVuMw+Nn4+DjpHdb/4KBbOVLs5ujuaCeB0cvBz60cO
+s7glft/JU3c5eGhLv9AAt5WrhY1eBVvwmFz+sGgCz3I3hKvMuxVwhFvq4FXfqMA73RFpgDstbT8a
+dH478KSzOWKxxV31ZjlwQGPK1l7l72jAy2ZvczPcZZLl4PcODFCqHnS2Y8G5CQKHZhqLGUBh9yKv
+mY9KhkeQBVzaob5SNnjLhvRJR1M+zVBMCjr//LREO15z0kBsMMnipEOCFoabJj7Tn8Kbui+gah4P
+M9lGsSJqbsX2NNuoth6UNo2P5zPnzSPQlHLTbjReui6ib5GbPb3B38AI/5bPAergdy59EiuTbTdY
+FuPA8XF2D6At7yOMYbLq46GvOVZdNfMORmWlbW83ebt9hFoBs5Usdz2jXFa6OVAHvWr8BI6LuwOY
+BYWZOPGxp+qLO82MojYDZKmDz1bGq/wAOriHwYqiam3BfLMtIcvIoJMhN7+MjMGrQJbhNfzAmWPv
+P8WYQbTOgfezEnDkVC4Fr86fWYFnAdy+LXC4FhW8MQ14hEIJVaojXkh2y53q42m7b7tg+HGjLFfx
+3VgsF4yrwvLlulbZjb2tNUlF5ckLu3Fa7CERt/EgbStcR7wgauyddCyf3hbBctr1kh/c3glzjoCc
+z4YqaZyvKELnpwzsCxhId5T7S0F8A3Y/9ZVjWDnyleATj6jB7fpmvosK04Rd9Xq1H8K+eiCJy2Au
+AhF7H43rsE3xEC0CXXSn7fT55zcI1LVxFYWoJz/++oDoCORSj/IF+i3nULgSAi042o0VR5udympw
+aMYyM3xNr8fRsgjNqY4RVSJb4+Q0v4sz31jufvb5emLaq8jwQC6a9oqwd5fXlsHPjXjnoRhR/VF7
+yCCCzmx3/zXL78Tzhbm92t6z3KtWMbyr7osFxk5ipcvNYCwToNzJXZfKD615w2sWHQX3Jvm6Okgu
+LwIVpgXKASSwWatWIFnISic8MU4gDQJHugpBWIFyXi6WgJcOPy3F2K6uihhPL3FeamC6vBbnt7xE
+I6lzCyLf+fSSfbE8vzkrxcpi43Xd6omMqAbW5sZzeZURT3zZPBUpGYTMpWzNI2G5CmOenTqiw5jO
+nU+yVv3mUG2giNrWJbcci3he5mhCXzq8PTmdLX2ojy1VdvcuTyvPX02GTT23M+Gb26Ae7iczw1C3
+I50nqbLSSiYtV2PnRnwYL5dxLu8cITrrWd/SZHW9zeVdOuJ0M5rgTIp9yx6qEY/q+/o5sKJa7HyK
+3v0LM082SXYa82JuXz63N70v8s6m90Wmsm5W2RdppMhSJ5UGjVCCVFXtOrXhtM1TXWt1eZeqXTRM
+St3u07uB7eYAT17nGN4tCJmlqHR5nY/hiK3t7J39BpUmHQaQSafBroLK+hilmKOWvbJhfmsSgzN7
+n2BnckxlXNKpsWe6GutAY7pqb6lscKmHT7PSaYUMl8HosN79yQmVNbn0aJowdkLFPuiM5zPdeP4t
+xqpbu5vB2PGYjvXMrKlFDV3RYYAcTsv9lSxHW5BWtpGtzQYEqTpcCSQlwmsNFBVfoQDpbUR19uct
+bDulun1moVQv8Y/NLOxyfD70dKMNe+hLRl89Ye5lXE+lP6Nnw0w+/5PSgjVk0q9zprlXyxJkuLz0
+RjjJFrIg55dx34EBuLwWODmzwcnX+Yp7pQHnMqd5auBNHNSSleSey8u9TLzUJGBlZpuWu2hk0/iU
+bHdjEtijBc5FsxuYg3C7qgfIaN3M8eQTX2ZixSDWJ75PbhZ7XUUu2nD58+UuNKOmREvOq7vQiAZr
+YyAiAokT7TcIJAxu5k9WtY97eyP8hL1YMGcoXWiWnt4LkxNtTe8LvxPz7ZC9Aj7m7ESjON0wYtgs
+m/XxFnbf8XT3LlZ3odlgbN6JtjbG5B9m8bys46/qXVC40Fy0QPG/caGpUR4FKDsn2sp4iphAAilG
+QfNzvpI5igezgcI561qmOqgpJ9eGIOJJrDixCyLmkc6zlB5FZ/89UOD2SttkoOR52hnmTT4um2NB
+ZTKTUwkjvkxTeZqDhj+WSxX+5DbmM+0V6JbWrnT/LuECdhjzbwpjFnJ4HcI+ufXyixHedRgAgPSx
+9/NgC9JcJNERKPNpowXJZO8jUAvi1tYba61Pz+2fxypiZUtZ1j5vC1MfyWc7btLQdT72ULY9uusE
+3k6LPTb7Mj416fxrBHPSALdg1o+s+RitzEXCPqDWLubtdEtZiTAe0YTWHE4voo0/uatc0u2+E9r8
+PmcPPM25I7Sx4M2jXd+8hwRWuPwQ0x5h3ES/brj9msb8C4FxC4pw0UpfMiJtlM48noHGLGIfrz9L
+Ylen5T6toHN5KUQd7n7lN+GmmY08B+MqLNPrwDJxPDgvjrFCpxEtnBqob/p1Xcflndd20sARYpTH
+giJ95OGWGCmEJ//2bIy/HRjcjJJpIyPAAFZXeHAtNioPwugQIaTkTrd4XjZhqyBIgUX/prpIrLBb
+gaVgrk1w9fXNPIomwlj0TK4lX+4GxFzZEI0FFnmN0S9AMiHnA8eOfBPR5hjlmQsbu+hNF8SibeAY
+xZL9hilnf6WIRxoenI9W2jU7fzLAvWn75eFuo1kEAKHJ8WCVRUB3crLPz2YHqi3aXN5l5A7bvREj
+BuULUMeiH3HN9Vkn8Gj1lSvwvjsr7+HaNLZW7p21WCYV3DiiTbThN7EGZGEBIpZdXqtMZmAuBUqc
+0IhlktO7Ce8hws3ScRh6sfz8s5JYdjl4IhBG4ddiWeEw9xsSywBSyEos28Qslh++2tblatlzth4S
+WN+mxPLzD3KYTfgRCbJsxbKuw6wqlq3yuezEMkpkLcePTiy/jZaI5ZiPnlvSiGUA7snJWG9Nbg8s
+rSS7wOrDg0Vm/9JsRf1sl+O2PPlttHG5/7BZuf82WkHu2/mr5rdb3KgljnlDNLa9YTw7Xx9usrMj
+ZEY7NA4/Jb7vfPZpMl2tvH5c6qGaJF4/l3cxMv9Q3azXD/OUdL+fDcGumEqKKoSZ9VhERqhSSY1k
+kXr43lq+k2pkhNqtCIDSOpUNbkXAmE1oGGGcmAP/zoqMJYtSzn6VXiLTkG59bFKvl2baL0tRQtwd
+OKrXKuXMPL3OZz/18OboZFhMTCdYnJf7qtjSdYpUrPMafEiWgw+D5E2/nk+FpMH1Ap5md2iZb8vi
+xm1PqF96c3mxejrrCSX5V0/oQs6qhdMXctUT/Pyq4I8wtuWw1DpN6q3xBonDZPm795Ft3J80cC1Z
+rMisZmrl40LOPzpD9+rOXi7zHdrCKmpB1ZSUAuviWaWYDYz5XV3Sikdf9fNsPZRYLLa9OrnR92pJ
+v+IBM1f3at+zFCtS9BtN38Mhq34u72LPGEsz81bu1XLExX7NA7q1bOW+KGce8lRrwQuyIlQjnoZk
+Qz+7StnROBYYG+4hsS/kFR4+C7P7CewKeQ+3fLaFvBizMGwJG6YAL3AY7904Aidub/+I02c98m5f
+Z/xEV6PdcyggV28GY3KDSoUCvN1C67PpXATdMgEH1qtlfftV6YECd0z26umUYmNd3rnCf3vwSmsX
+Ru8fHRhojLoeG6ux4ytN6vIa1o/3Da0zqeAvKpOqroXCQyKW89ZUGJRYktgflhOHnckDjn2bDew3
+w8lr9uQe2qZbJhVrSTgmNx052vu6OWCvwVsZTcXdnl0aRkbX6hwyh/cpyygX6hnnbT9DJNEYMLWv
+Gl1wp9AAZ2clFXcXsOxcqGILHHKYhYKt3yTwZywMroy5sn4Fk6u4R12XQ1fDu6gTrkYq8xHe4u6A
+LkccmB5dyXJghXxLGuKjrUyZVwjtq74tAtoOCCT5lsuqvqkSkp0QiLOoKFyIBv7igJgSy5ZU2C1B
+oBVHqwb7dhwtq9wISmGp0nG0atCSMa/ugX/Nru6gUSq57OLtMOJGEsu03c8+Vx3sXCofZTVkmYq3
+DsZWj8lYZ9pjIIXWs+NYCQ1HeANRUQSJMvJOA5RTloS9V8geY/YRiOX2sNXpVXZfO791bmB3fnO/
+Ob0WOSR1jio9nDqMUue3qHMUKUq3csSvZ3Xq1PtgLTyFzj7mWo62It5lsXTHCh7QtxM2FTzNU72C
+Z3nNCH3NqWNRhjqUGk2gKpSkUist9TbLvL5Tytt6qEs5qXXL+XNgX1tsWcA4x5NpzIu5fVmUPr/e
+F+dLgFbdFzqVdaV9obsJaJVqZXPYCj0kv7mcCauVnSuZXKsdQ0rl1YzK2W3zVoeG7k4gClSqOgwi
+0zH6uCoq9Zqm5TWJKxvmk+MfKzGo172aBeH6hvnk2CwG7Whsptpb00H7bCWTY3anyg==
+
+
+ wu6fUTK4oKJdvHOv77ZHU8OYhfm8tvE8OTGL+bUxRjK1N4IxOtaj62N2xDDGU7kop5dYjvYgrWwj
+2wK1GBCkAsngUZwBRcVXKEDSbbblZ3/ewrYJUGKQaSFlxto/ZrKwna65GX7YX3PzMm6bkxhcXmcj
+fEkRNOU2uSjLZH/MVudKwJki71/ny1NNV1U/YTxUc2jvhXOq3+JeJj77GxbsfUpLarRXYS5OudZY
+tLyOB8jCulF48vlyBrH6ck1aiOXtQBZycUnJMoU8cy0e8SUIdDjitgi01GDPraozV0TgnO7h8qrV
+mezF2M4Iv/i1C22+sp7NL5gf69X1Utw/ttLphhGdXWgu+urMnRhrvuJgreonwJhDSRZ9JTR93oVT
+2TF1FcbyGw6xEnoThV0uLwL1+xxUFSQbF9oKt50Y9+9iungVwpJct1m2rVOe1oN9EBFLQilreaj8
+9/k1k5mNGRFaES1Lk51EfRXCyW10b+Gum5XuEzVV5tpehbBaLU9+zTxmK4x5Hd2vlJXQs6sQDBHe
+Ncuzac6ai648+5cpzKq9j0DRJIFSpoDmrSNWK2bSWSYuF3u2GjreBV17o6rGpzu4WFMaNitda90S
+gHCvFLYy1FjZlomWf51XvFApvJHbgBFtiSnt7juhjTZ25aIqX/5tPZGijZNiY+p7ih0rvReM7LVp
+bKWbEVzOhb44In2Zr6U0V2ZZLPT9avlsv4zANHePaOr4dEE3k/u2NxB8tRwvTHYMNyla3wxGjr7e
+XB/Rtn4dxjugvrfHdkSr+vWRla4zu90US1QXfFhWx4IqfQTFpCFErHGY9eqMaS9ypo6MYLVrYbqm
+wmNTKbwYa1mzuJffzK1NpHh5wb9pnWlPU77sfAWU7fpUzq+XLzuWKlBXeoc3R2M2gWNT2NgQ5XHO
+08eqb6c6TMtUApRijiUmoK8cH9sEjkmBqpPPwbVCxOO0Olxz18z+5PRK30Ogqv/Y++E2mUWQts3d
+mcsioDo51eGiR3Gte+HSK30UwbF4+W5Aa/E5rW9Td0Mpld4L3sO1acz5ywj0lgwZj13re0mOYnkS
+WHYXNGiFmxTLYCjSaxfLqeieQizPqjgpxXJt640yZ84olpdVCm9GLAPaIpu5S40ULy8Ry6abJ53K
+l9cUywseElK+vCGxXNu63NDNkwRZTmIZ7f3VKj8BbSuLZWqPYnFZPhcpZF0ill1GK4pKLL+NVq/7
+tF7LfC3watmKVnWfCzwZetZpvlpEL/djPmGjch8g/N6hlfsUt35jzfcKdZ8UlvjbiD6J16buU/X1
+kfp+2spP6rrPvaM71vnsr5DpOuf1q49NXr85ywJLWTfo9eNSD82p453DK6aSYuG3zXUFhsiI/YUF
+NmRRH9O6Falvn6tu+va5+pjarUhzXUE6HF3h7NOVLK9834X9Jq96XQHF2Qfq/+11BarcV8SWzhuO
+xRKfvBkkaqluNN87DDCZV4tjMftQ9eInqX03O1GsmC5jxXTB5fWEpNCb5Yeq9ytJcc0PVZs+U+3y
+/pEPVZs+U004/+Y/VG3q5/L+kQ9Vmz5TvXwta3+o2nYtG/1Qtekz1XgTxR/4ULXVl743/6FqE3Au
+7x/5UHVg/jPVsJY/8aFqE3DEB7v5D1WbPlOt1b5t+EPVps9UY5baH/hQtWlS/Dr2H/hQNcJg+Ez1
+zKuw2Q9Vz0sfowd+kx+qXjVz2KGM0uZD1RaRRINm88sPVdsBZ7aSaD9UTVtAPqar4V3vQ9Wm8Rbv
+6nQ0uWg+VL1SDS/dh6qdSUVZC/WHqqlLluc/U22fb0lLfJYfqnbOt/zth6otEGj7pe8Vk8eXIxDv
+7KK6LJP2gAysvrFjVWFHjcAF14nTLQEOZu+y8uwNR3lsyrMp/HYLX5Te4P15enE27dcZnDJLlxdn
+r+KDtSnPXgdjm7ky11Sc/ZuoqFqevYGsG4rybAqQyL78rjybojjbDmNrOq1sirO1L0pv8nKFxeJs
+my8ZrVKeTZ2j+KvybAqPmm2Uh748m6I4Wz+Va5dnU3A527XQl2dTf7X8V+XZFptoLs6212FWGNGx
+dtFKiq1Ynm2gWrvi7CX7QluevcK+/KI82xKL87GGjeyLo/a74l2dVuXZv/8CO015NoWyoX+Vae3y
+bIribGM04beV7vbF2evdaj5Xnk2BSrv85BXKsymKs1eOii6WZ1OUGlvl9a1Ynk1RnO1wLxxNeTZF
+cfZ81s1a5dlrY2zFCkrH4myn80JRdkwhpV2UQK1YfWkCaZZtu3559iJIFnnjvy7Ppqys/2V5tnNx
+tjHXGtfaMicOUq/U6uad2bezre7oNn49m75Wfdm3s6m+J05dNm7HmEw1VrTgrfjtbKdM+818O1uX
+yNZfz157N+a+nU19k96vvp1tpcEuq6OmUmkWlmv7bfRPuotcHAvRSRU1sffX8Out9u1sy7s6qRFI
+p8jQ36vwuVAZR319CahDBj9//s9VjNvc1LrhinEKL9wGKsYXa0X/RMW4PcY2WTG+gRsOKSrGaW84
+/F3FuDHn6s9VjNN80eD3FeMuh4SjzVSML2YQ/YmK8VmFnWWx8aYqxvVK4SjlQVunYnzdb9itVjG+
+HGObqhjH/OT1a6doK8bNsdc/UzFuWVm/8Ypx+rsIflMxPl+V9qcqxpfljm6uYnyluwfXrhi3/VrW
+RivGN1OX5FQxvkJd0i8qxhdy4P9IxfgGaIyiYtxFL31/UTE+R2N/rGJ8lW/Wr18xbvPN+g1XjJMb
+QTna6Oq6FeMu7+I3zzdfMb6hGiuHinEDJdOXpq1cMa74+uxUnk1VjCvaBb8ptNmUpq1e97pOxbi1
+72LTFeObo7HFWPbi3YMrlqatWDHuWsl0Wbdi3Hxn15+pGLe/qXWTFeOz6qc96vvX1qgY/81dN/QV
+4y6KD17/XtnQvlpOUdLyi4pxu+/ybLZifDmNLVaMr1rfPXc7kOVHHzZXMY7f4LbKl95sxbjyjdTf
+524trxg3c5g/UzHucvZEbKBifMZh2C3ar5KuUTG+5t1QK1aML/GQbLBiHLTxWc34H6kYJ2LZ/gsg
+m6wY178AssK3gleuGKeIjGygYtzCSvoDFeNk923LiTdVMW6oeqZ1WK9RMb7eDYerVoyvZImvXTFu
+cUfEH6gYJxVDd5v8NtKc10+tGHd5rT9xv9mKcVjLrGb8z1WMW0ZGNl4xrkdGqN2Ka1SMk7w+20/c
+b6pifHb20+Hon6sYd8i031DF+Er3j61dMW5z/9jyivFFPC2pGMfacPwG95+qDtdrw+Hs/7HqcL0f
+YuxPVYfr/VzeP1cdvnwtm6oO1/u5vH+uOlwvtl380vfmqsP12nC9amDz1eE6cHNfYd5wdThdZf1v
+q8NNlfV/qDrcsbJ+I9Xhepk26Px/rDpcrw3X5MufqA5XRUK3PQWM/bHqcF0xVK2kP1IdbpcDv9nq
+cJMO84eqw80+pT9THb65L+Utqw5fo15sjerwpV8v3Vh1uF4bvkZOL3V1uL5cy69mbKg63CKj+w9U
+h1tmdG+8OlwPYzvUWfyqOtzKStpYdbiGO6s6iz9QHa4jw+VIT+tXhy/U8P6R6nC6/LHfVocbswj+
+XHX4YtXzn6gOX5ajuLnqcKcI72aqw/XacIds219Vh9thbLPV4XptOE3m8LrV4TbZgxuuDtdlvVrN
+8Ueqw3VEm+5V2Gh1uJ6M5PL+uepw27VstDpcrw0309gmq8PtdZhNVodbSbHNV4cv2ZcNVofrteGb
+3Re7T3f/Yl9W+HT3Eovv19Xh+mZb6Pwbqw7XNxtj4n+qOtypinMz1eFzttgfqw6nuleB+SgIz0tR
+afAbqAs3xpENCRIur5Yi0WvZf8A39fC6+gdAz23PfvtsU4W8lLdq6NLeUsOD9X1TfQH4nXtFz1Wn
++MA6kFLq4cd8K/ZKpZwLGFuxlNMOY7T3XThjbPHm3xXu7Jpbmq0JvxJIJJL4RpWO5Py9dFtmZZ/X
+Z4unFYtI56xXE1Br3OJmF+giX2Cnrfek0PlxpQu5O7jSOZ3fwlK31/RPfJmRnaZ/brLTf/0V5uxC
+GZoN56er9l3L6Wh7EziAt2AU/8bpCON5V/gyi6PT8dzW6bg8D9Z+N/ZWOjQOVtL5eldSLqust0gJ
++90nwGcC0eXdxM0Jnwvp7fMItPkO7xIELknctkWgrQ6DxetOyWHUCMRZsHjdyZ5QcWchIS0yRsft
+JbVv/I48pKlsoPPB9i6sdn+NrMCLjX/172KzXzQALrFwsNcrfdbzvX+LMccP/tH5LbF6ekPfSL0g
+Gd+/zxsnIFmkelvd1EqBJ0c/03zKnlLLY5eihcXrv/w86sw7Olfsxp9UJhkb79Iwv2aWt7UPlj+5
+DZhvgFlnm2IlLSrqlFNHK95jJftjtsaN0/nVE7xtMXbk3wjGPFq92C8TqfMUSWR0X/xEoH6T222I
+8eWtfBtr4skUNVoe5XFS8rF0nSYd0LV6gcZwScIClsZaHNy1b5zGuBB1kY/L61RTTCdzl0vcue8j
+n73HzO6W9S+KwNJ17fQaIrxrfWm39kZzwYOLshSbSvDakrj+FWasW9/EbRFK1fr8EV73Vg1StR7c
+HI2tKn2tZK9uv5AR69Q0tkLyeLmPPNnGj4iOHqoybmdBp+9+uW97HdLqYWyEcF9nmY66pWFEuzIP
+MuLSa3VcXooRLWtT95ORI7simFtLD8n6sVAQkxTizUVzNgDuHA3x2TruF+ssgAHQ3j1DVZu6nywu
+3j24VvnY3WB5berc7juWYu+vaT6Z/MmEOjZTm4rl15qz9LfyBavWnWtTaWksvpAgYXYiLctAsPlm
+vQXfNDtCKArlZoFxwpO1ezoAj/u2yaJs9jlNYxRa+Rws13K30lVZSyuKKb9dSx01A/N3o3fcIYyr
+3fdg/33ku5Xuy1peiK1V1/76kga7FCVLi8/5S+freB+svl+JdetrXZplhSyrexStXKSUH8PEEe3C
+H1Y0tsKVEbWt0xM7sXyvi2UHbkkplp9/lovlFeRLbeuBxqtpJZZt7iGB3ac9dzRimdS91jfgc0G0
+2Yrlxd13/Hg3taavHz1Lnny/MbGM5dcgljdwi6ZStb5ULK9EY5eOFzzYiOVl36zfnFhe8Chi2DVo
+K5YBxlsa08wklu3X8uAslqkrV3Ur6W3kqFgtfPPcuX6d27TcfxttWO7HfLQXSnjnIolLyuv7v7xq
+cd4Sf1jBEaKOaIs7kxuEourZWUxi/brz2aepYLfw+r15lnn96oaPECy3xOm8fh/psIONiH4YmysX
+lpU0fzpduDCfgeuiuNOg+mu34sI9ilY5Sb9wK1Yt8y3Xvn2YlK7TS2S6z50fUKvXWi2PjdiyTC1a
+48KF+bNfpfHzr2JN6kIL8y0LQthebL2M2w7Xg6nLWPZdiHnr9TZ2YDsfRcTcdr7ZjTqqxxHxWKhk
+6weNXrLfCA2Ske700iQDyFSpbktkEoff18+5/d1rjbk0kruZj6GfTebvHwuzfQYrSQ==
+
+
+ r7xXT5G5+/uV3l3vrNRqqTgpXKe6kodNX92XWrnD7HMY1nfvy/lLXDLxk3r1YWWKYg7MWk8aORyx
+mIhXSlOsjz6TQp7dafY+de+ZP1zFTCNWa2Yb79niaMSNk5799qh0EPLGdvn7y0gyIgbGn+cHg2nN
+5d07a0ny/snTzuOW53zi9yRzNwdb1VcxtlO+3854v/vlwl7rcxgSy4Wft+h3s9BOfL9ffeZbZVm+
+ej77uSuzw/xH+bPU6d6eHlxO795O/b63t3TA/1WNfF33ioH4h8s7DDwmJiNv2bc3GvE7nq1Ba3Dg
+ZXY+4/7HQuMuIAcufcc/O71CjHu/OUoyh4dbo9FJrOjZfzm99HCp624g3hASTI45OWZylfscc7o9
+uGJOr68+R6POSWg0/TwGbjneC17Vw3xBjiXL2+09UkIO63vOhqKF3S8pepLOp7rRUoAUb8NKKxWA
+odUMWFy4YJHnoOyky2t55YK/05U9ga5Qwul5nXRjXG2vlDgMnQlKQfte6ufGGsddVih/3u78jBJ9
+8crl9dxf5QMOKJq+h3f2d70PxR0p3k15i+XTi7338vmRIO9eirCqlCdZOaifYIF8JXB0ELpH4KKJ
++MtrN3Ph852Qr2NXS0z2Lvo2Grcvthmu9LydjL4kWpnz3slDIjZ8OTR58oFHXv5kg9I4LBcvSp3Z
+6TXQOciFYlo/FC6vdixeLnXxznDdyWH6U7yuwl6NX5OwF/dz4zx5rcY2433/JTf1BD+/HvC+i7vX
+rCd4ef/g8YVqW3jLxQX+iHtCSb7oCR3svuI2HXtC/dKzJ9AIy4iOSPKm8ryXrTPxKBk7es8zTXLz
+Bfkt3notfgL3vffBqrYP8Tbgs4+XTGs0CiZ7g8IYVnX/g23NXDrl2Up8bSe76U7tgGWY8ftupn79
+dpWUgsNBIHv3cAadH7ZgvsA7ov+ceztrBhn2ddub6l2/SLl0clpLDMdsXfvi57HYCGYbje39RPzi
+G459Pj8hRhPDTSfbidF2c5QKSd0rht3zt5Plxt40WdqX7pKDQbiAiuqOWM3384nYdfor+x5qTxKH
+J4I3kyrcNXAtUZc39/52PUxWMo8ckHvwKPPBVPFaD5kla8U/3xOHomeEx8I/a+sd+hOFcqrb3wvh
+YLe4k5HU90/Mmyold8SUMAk85XyDdzbzEXq6Jpz/XQCiak5wnGrm4+U+muomujyOSOJBnvTnU2Ma
+uwzwT0gHeQI8kFfoIpe9vJNynuBNLvfmf8qLk+FrEfbqJAiAeHynk7dhHVb1ICBPvpgGEvGCB+/V
+3d/O5PNnUXh7Ozw3jm9P25zMCBc+zqVboaeUEOn7CQloe/rgTX+Gzptn22FvVN9nPPvv51sAfI8N
+ZILeac53dn4eu0pNnzLn54ldvS3e5qrfqbPb/o8yHzethmCRzS29i/gofj0lbz7ao8zHwc5btrH9
+fUKmgrUAAP5c9uc5ltv3BwPiduyhnG0ED0Nzi7ziYNJUn7iOdBhT35c3B0AHzyO8iyBNeFvmI3Uv
+5TKRRw4IqVrIZTk/6DAGdHDbb98JPnXwpfzJtqMDgDa9bVhQ/vF0YAD+KPdzRnYNtuSplBhNc3tA
+DNU7hvdsSZnw9WeGbCLoYx+9+E6y5Km2YRnRi8zF+3gX5N3RC8MFW92UmLj/IfKVYQfVLrCmh0ny
+mg2V1c1pDktkf9UuqXorcfdxew8Mda+QKlVPGYIMQmMfsIM3vXLu+azQSl6nU9VM/txzt/CgzVyQ
+033kCwXfxWrhNpF7be1UM+fdwFXmYzA6VhgXHy/vptqPpbv4x7SYRsJ9hrOPh1PRrggLm3U68k25
+99PDoa+We/fHMhhuu1ZhfNr/zgY6jxNxO339tgCS2JzAvpzswMjnfTwvd2Qtzy9HL/nsQaYd8tWT
+khgN5zLVShDQFn1iuEk8KRe97Yf4RapxnzsZnxZz73fVJChTFQGPVCpZDu1cpi+P+mmVWzQK41Sp
+dH2bavSnr+q+SP32M5+tlx5QF8yHxRPx4TSdvREmKgnkq9108z54n/kojd+QCd/msuxoJxOs/eAK
+HkOZg9rhbqzd37sFuCK+TGt8Iqi48wgyUYJAt+S5wiT3FryLoRpbMpoNVr4prnAPxBmXcP+KtDOD
+fLGYe+WZc+nPaF710CJHAz6dq6AElMXbI7wVMHm7G38nnfAukXt85yLV9VYq6XZ77AG4LyUET8o2
+Iu/+6F23cKqfl+hd6akCP3q13OHp0ylhZqQtdtWOd2KdV+kDHrCwFvVAAgCZVmfwdOo9ff7K1ivZ
+iD4YcLTUrfhQG96R7UbiLGdaD35+9ud76ps78mhC5GwPr35pprrhmwBYQS9+QmPZXaB5IZvztU5e
+koPP633VAtMfNL+esrVaRD6Wz7mBgtnLs7vvxOi0B/qD/7WUCd80OPJ0XudPI59+gbW0PytvoFsn
+jyx02ZjBLQ5MagtY6+1OIj7oVVPXk9o43op5+4oFdj4efOTeC9M9PUtAb5vd1nj80yNX1YDiGN2L
+7Q44ARTjn7vEwWQ/E5AjwiH8dniROBgPT+DB5UVmWitew4Ojk5y8c9NMv1xsnxEFK3oX2rrMvV/u
+RlWn4zAJVtL8Mb0GkLlptvF4RITjDUixwxGezw7uwTnoAjxPfBd44ivkyEXjjYeQqV82sC9+iEdf
+9fNsPZQ4V7I7duIfZweV5DUzvERCO1dE+bTH12HPfyrkphhyKxdwgYc0UWjhnAs+YKg/DaJsHIbe
+cwP99i5JHhx8JMuT4TSZf/RLsBYkP0PrTf/7OVvf3X87O3rm7xV1+PrH30hdT/d8yMzOMh+vW99n
+2zenYeDyz/d4MdBPznfx5QO0DBh1qGmJUCAcXCZ44PKysOXHMJjMAQNsbwMf37uA/f3ZBUWm6kve
+dIf72cb3jwwaUDKEU3WIiILDEHwE9p/YIlRCrhc68t8HOgQtZLnECsTPI4XVbFv29DWMBS/ZrVw2
+44+aepqdFWyl4wOQmE9QjbY+U6FYZkdhlLMfYBS2PDDAzVaydNX6grMvtKeNeRLA+wKkQeZi/2kH
+hmgNDVpfIwVSG9EvC29PN4fBx8xzLhMUAwb5eXJzeJ/z7b50svVyfpoNFMJKpXDKm8mn3vncc3On
+TXYf21hgAPEJKMHXHrmbazzHW7f+TqrxszVSucXO1jjnL3ZigePo3Vn6/Tu1n2m9Tx9zb5PPbiKW
+89ZmD7ZcXmApL8cKD3kU28+gj+UN2gxYP2I0l+kGFUGIBzslTvKTo9xb98CTiGXjxaQcz4e03Q0O
+QPdoT3PJXiyo3X7Uvp73Wq9iNhivwQvtJMb+h61M/uLxPc3e9sY5z345pD/AL0tefLRhzyPRlBhk
+H3DEi9Q3W2tkcs+X7Wzg8/URT+A78TilO1/iAehM99PoiD/rpAqPgwc4i7FnEOSfO8Ajr4RE7Opb
+Tl0Xhx1QaWK78tfI8+TyqqSksLAPJtXtDUPK0dUV7MdGixmNjg6wyzZoLh95llC8PphisOxGBvr1
+WFWQcjdbOX+1OAEau06HjomCiRufRMM9hBYKo8O9ON8ooHuzjnzdeAfw2fYkfpLbicRhsNkkl34R
+X8H2jzi9dHkNyuTifEXDDVx2OFHuvkrvnGRtVwq7r6z1kbuwWqvFzNuOKx3sm1ZK/DBWawXb3pva
+ySxdaYl2pWBX8udPPaPF0GyXTLhlcw+n7MztlIpx9YMO2mw1NCC+iDwj/EB7UM+bpB2efXgeb3u8
+X9lG9Z1LdS8OemAWHkfQ45jCjwsUcu+xgZDzyaI/GwoMhrqNddAJxvAsPsqJ+5J3y/Ld1w+s5AJG
+ko/GOunMJ+G1KPJ9yDyD8Y/g6DHdvLu/VC3e42wQDTcZTIlTwGKd2cl8fJT4mR3rz4TD58E4c/Lh
+gS4Hr7psdnnl67v2de71eaAIodgV030Tpzf8Pdj7500Ypxgh3hC8bxF08OHTa/K6cPaIqn0p984l
+IwqNHcZ7Nwx3dj3NnE6irVQkE7rTnwLG4o3rS5BExQFIIrkGnLgxVuAhasD0nTXc9mcECeSnPUhP
+I5CzM5BA5zcDlRmXbYEKxLu3V6uDhLtf3O3ZAKXcI3lli6f52wqvwIZ6207ExqEBbvxZNnA1qIBh
+cwUWX7LYK7dz6cZNGv0+j3jkuHTnKBWwnPSmx71qzuLMOHMR2N9OCfdcCk1PJlke98tAVAfTufUl
+eCLF/FOQKhcPZNq5Sf3PhnNnNAA7JQWpuWSmYYlyBanntQcyKdiVxmljrPVOT45/aHd6YVKuXTJE
+RgxoxS8bF3S0Lq7PFqkwaeJ+v0ZAgmMWfCVP0T+mPce7Sp8VoEr78Wcr8rICCXSh70s7kF4JSGhZ
+2AGFmDABpT/FOzhfaEGC86IDdVKZXC0Hak2QXN6VgNJBwrinn5YdWZz9ZQxpTXZEfH3V4UrUbzpy
+6oGc5J4tJ8XjiDT2ctFWVNq5jajaHMiX2rJzDgfO4pRjnpI6LF7IKh/j7jcsJn3Qd9+O5LoWrOcE
+bwS6ACm2ucNne/RA66Mlqo90OLQmm4Hd/xMCBUjqc6qTlI0UW0JUR5z1sMVne0rV1rJkWDs+XXz7
+oT0AQGP00LbGtsMyuZR4bQuryzveyrUZm2EHnvWPK8A6O654e7bNgV31uL63bY8rruX0LLVMLFf7
+NsM23myHBQR9GbgAcpiFYV/smMuLDdWW+9YnrCAc6XFkI0fgT24LBQt0vNpsXXVgqSkFC4G4znDI
+rebKBAkuVWXPLSZozaLHX9n6wQfGNkqvROlW3kD/fOr7MjQBdf/5PtvYFncUV/j1q3hMwhHogVfM
+WX6XuInU3y4+vtEPc8MGvqN7DJtP9k4fTo7qSeb4oqc5Z6Gtuu9ppD+fUt6Z77+L8ZwfLb7kF4l3
+BTO7NL8QrL8bRhfNceajUsJgzuN++uPos4iGu+KwP6yL8X7q23fzEW/tiUXcqyd84wIMlrO+4myC
+P6VZXOgZzDrf9uyrGaL/Z2YbfQEXzDJKqIfkTighsVz1VQkVsPnvSS7BXNwCHsKP6p97mXsllKV4
+/LEtefotkKgRWuJq3OgcgxhcsnJ3GwC6ewkYbRowOQ5Pu8fVbH1wFkoWm/GmIVjF+/vbYMfd7mTO
+u7e3JscnCQShlcTEo5pDNzhGk8urhE8OQ/et1Hfha6T4B+eCObXk7e7hMWz33fViQOm+q9u2JCKF
+33ycj0lxZ+mhQiL5armv7fTkSwmu5E9+BD3yg9vZSXde3zit7TEOW7LvnwWw9mHNzD5Sss/vM8TF
+Lr62f8haovf8Yc04PYnHPo2F1PfeaU4z631eY6ArffyilmvNXmPzVZT775feLkasRMXi67xe9IHG
+RiLG6bbk72QW0ObnZzHTBw8cvvxohp2JEj0ddRp+DdZ7KfHA+MPan7tg7+d8ecaLzulLOHK1XYUY
+mrvBfG6fO+a0bXyU0Oru5N738i9wAo+2SWQE3ZgZA0sBGkqA/f3QS1Yus3l9c1xezQ==
+
+
+ /+uVsVMcWj1fydIVaJkY6tHRMYsgyXgOCkrwCO24+QfFRLx3nDYEfV74bBdsZOKA04JCxEFV1UJG
+4ihRTudvQA/xn5MoHjpBJQw4PGldUl9JqfH4kDl4KEWVcNosGAXblPlIxJ+TF4Qnm4GKYrToKNmv
+196V84K35xzujVvtrG/rrp3JeT8u5gNKF+J9zz9IDobDekqYpkqmiJTCYT5zJ+Pnu8Dx9uE2vnMG
+mA/siNssc39wWf5GHfVkB/Sj/SfVEfJ+fgyc6mRsiFx2vZWSIZQzH4QBi6/16v8A7SqHmTPbEvqg
+B7MY0d3Z9s1RHInhEihmb0LcEYpD15wHqmVuzYIs1/qkuJa5aTc+Kbt3gRbfee27uBjb8l9IJVk6
+BS7YqpDAuPoOCcaNIoVUKB6PEe89MArvNF0YTK4RzKF2Srhp+nN6U8HARA45jMLCSGvvK1lJ336Q
+ZcyOoV8JtxWfLp6zb8PmF9DiVkQbjASC2Ex2J/R5z3Ah3yRZDHUraswf/yxdle8wMuJvXish++/W
+C4xTYGup7vd5WQvjA51PfOHLxfi++kDc/vGUT4c7hyL63bcQqYVovHF7Q4QWSfZAWQm41aJFC6I1
+1u6nSing0lupwmMpqbJWRbqeMBhFD6NQ68/kx2Gq+yzHCAx6nGYWf+metnOJduJZOQJkG9lU/dMU
+0VHjNPL4hHwyQOmH9/wnfhKjQ+IdVN+VO57sXn+3BCCxTy6vOTfk+DTvI9GLROzB10lxX2E1Jq70
+C4Z7Sngk3SjHzCGTdGtag+mTLVX3eKgWsvVws4VWUqe9rTiWQDiO1SDN6O5UTZBIpTygMBwntFCP
+b5cczePdcqwTOK4OFE1BCfoQl+xD7eeC8Omzo9c7hhAX0cf0AI/gzZxWE/Vk/8QzyJw/idtKyi1/
+6BOSkebpbeLno91XL/h6mISVQodOMBZAPWqQrNzv7GffxWHD0M/iTntxB4DK/aAH/gsTaUZqoHP2
+A0OQmon31MzWvc26iQQQTxktEUqVj2QtO3u5zHfw9Oj+I51guO3vj6z/tdYGPaMyzj62Jruq0Nv7
+8CYOI18dZMcvChcAZCW1lL5sH/NdSMpQEiQJxyditUI/9fl+iXZlJ/n8nq2XqjPZpgV97t+PK6nu
+Vj9HojyyeOpvYDgGtbCHDHkQPbwX3zDtpYMh8lI2WPk4MMCFn6AA6v0Za7qlwj7k5Hvi8CwdxsHi
+amhY3d9YshxMgLLRqUxIsgtqzJdaduT4v49dAsMKbiHKiu6Dm2m3NboeddqdvjvoirsOkucse9tv
+DnKjVqvS+s8kM2hMe63+xB1zHyTL6fNzCfhrY9BsQXfvXDyn8aFnOuppV7QxX8sg/aPYe3R5SehT
+zeES42PMMPWBrGuPF6LEx7X+affuq556vywlk8E++xI/Ye+kzHZzms2kz55ftCjq0FyxBKLIGZQV
+AAHdPji8ukjk5fGxdHZ4H84NHgVgrNnR8yOTecxVK7mj5FHDCh6NISo6z9dKkfOZwFseORfqB6ks
+d5YgQfPEx23lKnkmvl9RRc5Re1dVBEWT7/a30KR4UyLit6+5GvD8pytDogS2SZXn1H3qe1eaaCcE
+j+VXp6bwx5kQ1APgbLDdPlaYkS9br3QOM/n84d68CVMAtb8XxByeoprIo6RHvEQTsWtfCznJKVE0
+NTWz9pT6zpwxKg9nMi8khIRhp/RTCxihvK9EX0h8ngTkhffQi/IlF9x4NVyvpRLqOVN6WyzPHhzo
+gRwlf6ReOdxGsRp8ieTejpM1+4w5e6PncXAJyziVVaEU8vWUPKrKxVRWRYh8+ePyJkaNMFGkJ9lm
+7LhnYbj00UwMn748+2LpVrl4OxtnlohmCAKWrYwjlzd2WSudKOaBvtP3l8NzAvycDXSHcfeTH2Nb
+z7eX8zWeZ+zyBZTP4uOBIeqO6QioVPWOMDmvWwWB+CIbktfQqkp1Wyk20bseltQw3selrKf7YZxw
+V8lHNybtFB7A0mC+CWtE5OfwEz6RgYRZmSJIxZNbEA3j4JzhkhxlznOPW9qfhwB3/uHDuKDGjxfU
+ndeQJky07M3rglgiGYGouIeeMOVd+diaoOkWJGW20Mrkdv2lVOSuNNEyygw+EYwEHqN0vP/J+c4f
+bmabc6mmuoYS6J5gdmD3MTdAswwq9Rk6QpqZ4XlDFfBmMauNPDg6U3TDxWS5C80weQ7PJeeh7UOU
+Lu1oPj5ye8e+M2OXe/kj0w7kaxa2y2G2cfyyDasPPphAArFaehx2zGL+ZVwvgfWSDYPpIbfErdxb
+CbpIrOZveX45er5KH+WSjXYDU+Su0vxR5ZjYuEoCByba6VYMWct9kFhBhgQ7dvBzBiRXJCSSydQu
+Lm4T8ZPpZE4rP79Pd46OYwoTBu39OxEvT4qpkPQVSHXD7f1ksfFRQLjK5FNkzcfsY/MCY7Avx5ge
+gihq+NKd8SFL6iTmy2FN18KkNPPg+9p2UnSmzE3760nF41vhKskcTscqHzt4BEpW0unZg+3xYeA2
+PlI6oXZE3lET4zBZbhZZVlMAX/NZ4xFXbKDgI1ZonKksDNtaA6EBp3LBelET8UwJduoJROvlOtXL
+qZuMVsDgIvui/4kZna3UWWX7Ffc0jSkfQWK0n2DKSLo3S7W7RLfLQ7J/tv8zy+vSH1zMvvU10JBa
+64FmXPlBsVVNxCs3Y+Xp3AUcqyfMcIUK+t0+QUQNt+OtyvsNCNtaz1yaUrmYTGdyXy9YUT7seDHF
+xN3D0Yib7Hr8h1eCJ3Swd4cp9BnPTkY6nGXUn+CDC0/wZ3iND04wwb7pCV4+nHn2f7ZHsC+XLyYX
+J70RtroJhqkzqxphq5tgcF5WNsJWN8HURJCVjLDVTTDtoodVjLDVTTDislnRCFvdBMOSjFWNsNVN
+MCUpfzUjbHUTzOVdNMK0mljiifZXR6TqoZ87zDVZs0Kv2AbG4rezTMszDOIZaiTuKue1XFYqtZRy
+39zsURv3PEw+5KoU3UrcbS5ZnmyVcZObWPNxrBTKGzKq2qXXWXrdrVVaHGoXmL71Vpm8ZANjfnfG
+wpZngiUcM8Eau0ZbbHnWG36is7Q0E+yOIhNMS2jzTHzj5ZlgzPlzMKxFkpalCk7rxR/TSkHuO2e9
+2a50a+v45HTpSm/nPnW5NOuNyR5eZx1W2tqKHNiuVNt9ZRmpg0untMiz3TNjcdjJaSATDouPxGhQ
+5JlS/aA+uCfSjhTkaPJOed7bAuMk86Vkus1y2fb53fgTO59e92Wwqy4i4bieJ2d61+VV3gbl9gvs
+pdhuLlnqjWcxpQZ7+tpmQOa8jlDNO8/6b8/HimoL6ucNBu5bWAHYIlFivZgJU+7ec8kn1gPyI/WK
+7lq9sH2+NsY+2sy1S7TRZhJrNiVOhUNrRZtfLpcHwNHe/2XGCgVIJPBgCMlerRnsXxLqrwZBVm48
+L6+2dXpuymExpM44pUYZP1JtMPvSy/PyDGlAq+TldW9WT3UgsnJZvgdGnH6dFApr2VwWFl6BPbYC
+yeWlShb8ZQ6P8ZpCI1Cx4mTt/MVFkDBM+/vEorvBcna0/OwvMKQ12ZHp7L+8U1C/He2/2uaqkQJp
+Mu062WpW59wqVw3k/m+z1Shy1VAik1yamC/4RzKyydGb7f5qRFW3T9SiSP/dlECZJ6kW8fasS1R2
+qU/vZkq1Wsvq+dPvS9M1HdOybaFtLMv/ah6YBjWnmD/ZDfvxG8wCT16WXLrmcU2Y8pXNa+ktT5dH
+dvxjMWwSTbysDReoPitrsR8W7Zd31SF06x0ky4+eSYp7v/wislmpNrlKH7wSp/l83cmLfrOBegH6
+8rsNfn2zAWDM+W6DX99soAbpl99t8OubDVxeirsNAr+92YAU4TvdbfDrmw3UhLbldxv8+mYDl5fi
+boNf32wANOZ8t8GvbzZweSnuNvj1zQbouXK82yDw25sNMC7meLfBr282wFJMx7sNAr+92QB23/lu
+g1/fbABrcbrbAAxgh/sFHC81QHt/tQsVVptUuc9gVh6/eKPBBu8zUEvKrW402OB9Bvq1OAs3GgQ2
+d58BXryl3mhgIVoNlZsF081B0jDIjVPfmb3PmTC6RWob5fZ9/g7AkL4HWVHdJnC5lExV9Au9zF8K
+EM+cN47u9J7Yj/jopGQ5+L1DHEuGywO2qsJl9rHpbRNXMuxVXxV0IPck5YqfWUq47+ygs1XcnaVN
+vM2c5kRg9vQwgybU78d6W1LknzvJSJNrq36B0vM2iWjgqVRiGiUmt783muphDxQE7yAIvv2pXmC3
+qgyWPxmWofMgljn/+jnjMqGngDGW0mxfZAPj7G7685kPJpnjaZQQl8ur31iAQraRhR0ZAPqDUzWO
+fFS8IUEYY1TiOBuaRSXUT3ZwwZEHyed7vp93ti/aB8qUKvGr3e/qLBSSnt3Nu6uFQuDgoslBrihY
+JIHPJ4Z9ufxMRfziyJgRQfJFMOuWI/EJvK/sKdPKPuwBEvQ06fte7r0w4MFw2/pMdfKJseoO1Or9
+UUDf4+5Xoe00DIpKqJ3zfUivWP5fx5i4d7hvOGiRA7meaX1dHDKRev4ED1Ioze0cvWfC0/EDSJ/K
+VHvABJOV7G5HzWzeO+NzvnxSVyH2E7HsAXDQVP1E0S0vSbRBi2Tc1xOVG6mMmaEldX+1AIia4Y4R
+R/2GgMF/H7viQEbnLPuW7TeNuWQurxdayq3JdIgdIm+pVrvTL9T+aY1crFv5j4H/WDfnjspuLhLB
+fxg3D/8v1F2+xqA7GI397kLf5X07SI4mmU5j0hn0a6N/3DFsergs3J5n3DH3rGvc7QNImDfoDE/8
+mLz2BtC9uRh3Ev7/8LdrfwpzZ+D3axcTZjg+4mbCLCcL8E+EkSWY+tvFqIDBC//AHxfwyxc0/e0W
+3JfupxfG3cSxblwCK4R5GcAWInyYkeDtntIWjUKTFGZFRnRjQ1SGhQnRaDgiwUwCy4Yl8prEhwWZ
+4dxpl8AIAI0IDyUAxM3LXDjKiCym74UlkHxuXpLDgihIbkFkw5gCBC/xUT4s8xzMIQphjmOjbj4i
+hAWOg8lEeCREeTfPywCaQF7jZFguvMaL4QjHRsjgcoQX3TwnhMWIDFBH5TDLsvAaQC1HRAXGKBPF
+11gmLIk8QBAVwxLDYCc2zETgF5wtKokiaYmwLC6fA0AkjrzHwioFVmljYd2kJRpRWxgYkrREohHS
+wsusSN7jw1wEloC4EWVWgLXwAGaUcwOCw7LMwS+48IgIA0RkpQXekyPhKC/xSi+JgUHZCKBHgl8Y
+QIYgSWRT+EhUIDsHC5ZwC8jOMazSxghKJwkXjNsr46YubHja9QETQn+YXMGxBLvWI22wgIjSJsJa
+sUXgcBBsEQSlJSLwSgP8z91wKZ0krRMfdSsDCbOBRPfidA0AggGiBsTBS6zyROQEAgduiCiSpoiE
+hAQtUVmQlRYetxGIjYmyCiCw3wIBZLEXjiSpI0UlZaS56RCO/Vvrw0pOoXb4wiyMzA==
+
+
+ IPBw1sNSVMLjx8Ay4fBxoFlGOaQlwDEflWRcBeCdY4AKeUEGJCBa4HiJER7pmwHqwpPCSHBSgKp5
+IBegdDwgAg/HgQFUzdoKpC0aZZR+oN5ESFtEwSTPiGExipvEc2FJ4pAykT/g8YWJGFw/0iXP424J
+XAQQF4XXWJhbJCQjKQTCs3Bco4h3eJ8nYEELJ/HaYQfCBrA4EagPVyHKYZ6JwuBwklgBtrvqQtqO
+EMKOIow8TAa/8BKLrUDRPJwVNxx2RAgH/Tl8EoFfkUphRs7NCZEwnGGBkIyMZMVxeKwFmCfKAb9D
+YIBvhCWYi8DAsTATxwHIwK2gJRoWETwOliUzEraIsE+AKGA2wEMAoQilIMEpbbhYOHiiRHYJUCVE
+ZDcL7AQISybwwiRzLSpXSLv0Njie5GQADAycDQ4OmKmN4QSln8wqsDLALqMRmBMQIUUA8xwTBUaJ
+x59H/gHUzOGGMQJH4OJkgKLhQvgJqQMWYbGMRFCj8KIIo5x2DqkCuQ3wpGiEENQicRacaL6QUoQf
+iEIi+kKhtYThZNBr1CZUwlDrSiUMiSB0t1eQeVGNBQq6zIuqMk/WZF5ElXkozRSZx2kyT9RlXkST
+eTyReYwm83hN5kU1mcfrMo/VZJ64IPMiZpnHW8g8XpN5vCrzJE6Tebwm80RN5gGlqTJPVmUesBmT
+zIOWBZkHbSaZhy3zMg9bFmQeYy/zhAWZJ1rIPEGTeZIq81hGk3lRTeYJusyLajJPUGVeVJN5gibz
+zBuuyDxWE0K8LvNYTebxmsxjNZnHazKPVWUer8s8VpN5vCbzWE3m8ZrMM083k3mSrAkhXpN50KTK
+PF6VedCiSjNek2aMJvP4mcxb7EVGktSRiMwzT4dwIHELMuKMCYtAKeRI8ApDR/TLEYmwYCaCHB4o
+CTghS/YxCoyHsHxRIrsv4mmRCOETKQBDANkCBxeEqCInkZNGeZacLAGJFV8DkmR5RCD8AhySMEMg
+OlwdSC+ZQTICBHKIUiAaEJ4CvofgImkRlVKAo4AaUwQXIIiEJHG/kGgiynuyQtx4bkVCLNBL5nBX
+NNkrgFgBquHIsiMRWSRwskyUSGNAU1RAARVl8OiwbgVxiE0CCse7F1CZduKvU3K2EYG8DP/KcHh6
+5NzKHApWra1gbOPIlhQMby62zN77mDXCsQ3LUZCehglmbQVjG6yPFwTDeJZNszfxPAE9inxkBgqS
+kKjqBDPoDE36svQ3rdq0Vw1TzGAxzGGAz9CmL01/16pt9u4HbgfsuETYAHBYVuIJa4jgaRH1poJC
+fUwkMtfGAwELeAIt20D3kGUydQQYRASp2dgGS5WRunhU6YncRtUZGR7IA4kTUFSwirAXBGQ/ArIR
+hANoH4hRAJYbxbMCSiacF2xRtSzQhsKiGNUb4DXUcfA8651gX4Fjw2t8FMSOzJOWqERAEhXJogii
+qBTR2mSi2oFKysC5I2/KyIyUNo5lUO+UUF7gaHjM4QVBANYuskaw1AZlNaAyCoZOEdT0WMJBQNuV
+CVok5ABkwShj8DUQpiIyOgHPLbK+CAhTCTkPoJOXREXOwmAGpKM0jhJJqTaR/cLtZ/Dko/rECgo3
+4ySJJfsQAWUayBKMYxaPu9aCImzWBlwQeQiOBaQYlWW9DWQTTITyiVdsDpwO6JHVQUgrVpQEG2Ak
+D2xTCVCWOA3QOTolupxiovCgFER5lKPA2qISCKqe0oaESJoiZAxg5qh5ALeXJNRCo7AIGeUbil8B
+dWHoIQqMYWbEGlgZojxP5lFgqjzqOmAnSBLuN/RiCC9EWxwsFTJ6RJYUoSICTnAs2GdgOpLephyt
+KIeUgnZTBAWKonQocImipFDB3IlMW59INLhA8qmWTZTQHEgunqwZ9CeOaNDA9QRiXcvAEQhUAop5
+BVeirFC0iDJc5MnuE9JWDrLEsaoNilZVgfAK2DhJkb6oguC7qABGFH4eYSKyijGOVfuBbCNNomrb
+oZohs4Sjo56IG4jTMqgN4NaDwBNV8ECdB4YqabIJNxctzDuVBiReaSPDkhY8FKQFjaYFOklrigmA
+LEWJwQ1oifJEakTQRANyB8qAHZIi2sZzgtrEaaudf1W1Mm5dstvndz/cu5ZJRK0Ph4pVhKiAcGii
+HApGMKlQj5VUHQtW0HVxUcQpSm+wfjng5Ni28G4XQLCfkxMRUlRv0XCLAP5gLmAOIOUVNUqG0wHD
+ossCSJNsBuEqXYtXHaYCWgazQVaEG2jvOFUE7UtBUa4icNpgWCBB0CZEhf3wUVzB4qvLp0IHGyIB
+2WOEiaJURnKKsGhBC7hvcIi7hAswHE6vyZfu4qsOM0mCIkN5kEwysapwBKJO88hIQVTgqBJaNsjE
+gXEC5ZAm05sOExGjAfmliLiAXcc1RZQTh2IRrG6ewI/ePpRT0I8YUV2Ldx3mQncZw0pEFBDeDHNx
+ILPwBHBwGkEq4LCg0ooiylt4xrEcWejCq05TgeYqEi0BmJhEDhs6TDhUldHW59RhkVsSLhuBbZTJ
+qsyvLp9J0WKRXDkZLVFclMAAGxNR7YU5QQ1EaJEfS0TX4HhFu+5avOswF4NMl0eGDxKDEYkvDHkC
+4V3o5kEGDOPCwY2KaIKybDjKsjJpM7+7fC5V8KG4n3Nzwepwq2zcXBxrdnNxrIWbS1LdXGC8L7q5
+ZDRaoIlRLCvQQBn0I6C1CFsDz4jbDu0oBjUAaGPRVIA2dF2xqGihBSSJskpVHDrIOFSyZYJpURkL
+IOTRT4WePEmUOGKBy+iDRGUClKYosbeiRNxBi4xuCvQIRlVvInE7RfQmlFUo/1nF18QSrzlxcxG5
+xqMfh7jQ0JeG+pQiHBUnEqpmcIyEKJxiOHthiZhbyAtZ0c0BouDoKwoFx0RY8hpOi2tDJicR4cYR
+7xu6xMhxBV7LEZNZVjGM/jD8BRBEOBF6z2CkCApgVlaYUxQ9hRFeUxRgEjTUOaI/otNMa2kQlspw
+6GDRezEKmnliVgLj5UBTg8MkkwWjcgrT8cAtRBRnuMXoSOOQIEgngB+1EHS+SRySmIiCNYLmKScg
+USP5yKjqwUpA1spIh3iMiJwiXEIhSPTTRKNq2EB1jQqKaxTQBBhTXaOi5hrlFlyj7IJrFOYBjosi
+JIKyBNaLvh5CKKCHMKiHKO5GpBiM4PACKuEcg5qbdkRBhSDvCSIwaWQGQjQCK4ZHgog8F6hRBnMD
+34OHircJoBPRaObQlGAjCmcGUgYwQUkDBRNb0KJnRLKfwLii2AtMBOLcIr1ERlGcJVDHoQU1LZkl
+DJUokQ0iNVEnBgg4Hl7n0HkUVZkzUfU5UMBFDq0HHmMVMiHfqKS4YdHyAWQAMmFfRRZ1woga2MGR
+0Y0gYDhJIjhBB5PMysQw4XmwylAYK6cPNlpGjxi2sCKgXiAqJfH3gdmGDjTSiZFYluxcFIQPaYmi
+3sfxsuo0gxYRthIxGVUIDJvIatHhSxyR8DqPh59DhiKyioEDFEe8wgxhqVGVj+PSgLMD61HCeBLL
+oH8ZGST6LOAXYLKc+l6EHAwZNw5sKw4dh1FB8dezHJIOMk+Dnz1NfNBmP3tkwc8uWPjZuQU/u6h5
+1XnNzy7qPvWZn33WFtV96hHNzz7Xtuhn51H9jxBWSyw2JHJRwBYOYzLYMvOzEwPY7GfnzH52IAST
+n52Z+dmB04DOAfwAqJwHBgK0gfChps6rMoSLomcN0QAnV0RhAu/JnGKdzNoKxjYeScDUJoaBAGA0
+9DAyRKRhZAnIEpQTVbrA+WAjxE7mkBGAugRtOABuGViRsEkCacHzzEWRVyBeAFCGJxYBgioJguIj
+YDmF4cObPEGLwn70yAKrRBbSxrBX1Bz24qSFsBenh71ELezF6WEv0SLsFV0Ie0UWwl68Oeyl2DeE
+wnlZIFSIZlhPDdDwircRaE5ws6CskOOD+8FEyYFCZiMpwWMiQ4AwgbEz6GuYtRWgDf2caCkAaxcx
+ukDeRCUHcSZE8HDAoMSYAP01wiiEg5FscoCA3eHZQk4gS0TWgcxB1zOHngMGhS0GDnji58eRMPSA
+yFdpGTkB8E0SH4oi3zGv1zHaaRX58RZr7VZlVOt0WyNXe1z7q+Wu9fuDSW3SGsITd3vUGk8Go5Z7
+/Dn4G1vgFa2715u9zrn+L1T7Dxc=
+
+ </i:pgf>
+ <svg:text
+ xml:space="preserve"
+ style="font-size:13.03699398px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ x="246.20877"
+ y="10.629581"
+ id="text2436"
+ sodipodi:linespacing="125%"
+ transform="scale(0.9830254,1.0172677)"><svg:tspan
+ sodipodi:role="line"
+ id="tspan2438"
+ x="246.20877"
+ y="10.629581">TM</svg:tspan></svg:text>
+</svg:svg>
\ No newline at end of file
diff --git a/web/tomcat/webapps/manager/index.jsp b/web/tomcat/webapps/manager/index.jsp
new file mode 100644
index 0000000..2806b76
--- /dev/null
+++ b/web/tomcat/webapps/manager/index.jsp
@@ -0,0 +1,18 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ page session="false" trimDirectiveWhitespaces="true" %>
+<% response.sendRedirect(request.getContextPath() + "/html"); %>
\ No newline at end of file
diff --git a/web/tomcat/webapps/manager/status.xsd b/web/tomcat/webapps/manager/status.xsd
new file mode 100644
index 0000000..5af979d
--- /dev/null
+++ b/web/tomcat/webapps/manager/status.xsd
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:element name="status">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="jvm" type="jvm"/>
+ <xs:element name="connector" type="connector" minOccurs="1" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="connector">
+ <xs:sequence>
+ <xs:element name="threadInfo" type="threadInfo"/>
+ <xs:element name="requestInfo" type="requestInfo"/>
+ <xs:element name="workers" type="workers"/>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:string" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="jvm">
+ <xs:sequence>
+ <xs:element name="memory" type="memory"/>
+ <xs:element name="memorypool" type="memorypool" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="memory">
+ <xs:attribute name="free" type="xs:long" use="required"/>
+ <xs:attribute name="total" type="xs:long" use="required"/>
+ <xs:attribute name="max" type="xs:long" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="memorypool">
+ <xs:attribute name="name" type="xs:string" use="required"/>
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ <xs:attribute name="usageInit" type="xs:long" use="required"/>
+ <xs:attribute name="usageCommitted" type="xs:long" use="required"/>
+ <xs:attribute name="usageMax" type="xs:long" use="required"/>
+ <xs:attribute name="usageUsed" type="xs:long" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="requestInfo">
+ <xs:attribute name="maxTime" type="xs:long" use="required"/>
+ <xs:attribute name="processingTime" type="xs:int" use="required"/>
+ <xs:attribute name="requestCount" type="xs:long" use="required"/>
+ <xs:attribute name="errorCount" type="xs:long" use="required"/>
+ <xs:attribute name="bytesReceived" type="xs:long" use="required"/>
+ <xs:attribute name="bytesSent" type="xs:long" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="threadInfo">
+ <xs:attribute name="maxThreads" type="xs:int" use="required"/>
+ <xs:attribute name="currentThreadCount" type="xs:int" use="required"/>
+ <xs:attribute name="currentThreadsBusy" type="xs:int" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="worker">
+ <xs:attribute name="stage" type="xs:string" use="required"/>
+ <xs:attribute name="requestProcessingTime" type="xs:int" use="required"/>
+ <xs:attribute name="requestBytesSent" type="xs:long" use="required"/>
+ <xs:attribute name="requestBytesReceived" type="xs:long" use="required"/>
+ <xs:attribute name="remoteAddr" type="xs:string" use="required"/>
+ <xs:attribute name="virtualHost" type="xs:string" use="required"/>
+ <xs:attribute name="method" type="xs:string" use="required"/>
+ <xs:attribute name="currentUri" type="xs:string" use="required"/>
+ <xs:attribute name="currentQueryString" type="xs:string" use="required"/>
+ <xs:attribute name="protocol" type="xs:string" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="workers">
+ <xs:sequence>
+ <xs:element name="worker" type="worker" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+</xs:schema>
diff --git a/web/tomcat/webapps/manager/xform.xsl b/web/tomcat/webapps/manager/xform.xsl
new file mode 100644
index 0000000..0f0753f
--- /dev/null
+++ b/web/tomcat/webapps/manager/xform.xsl
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+ <!-- Output method -->
+ <xsl:output encoding="iso-8859-1"
+ indent="no"/>
+
+ <xsl:template match="status">
+ <html lang="en">
+ <head>
+ <title>Tomcat Status</title>
+ <style>
+ body, table, tr, td, a, div, span {
+ vertical-align: top;
+ }
+ </style>
+ </head>
+ <body>
+ <div style='font-size:20px;'>Tomcat Status</div>
+
+ <xsl:apply-templates select="jvm"/>
+ <xsl:apply-templates select="connector"/>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template match="jvm">
+ <xsl:apply-templates select="memory"/>
+ <b>Memory Pools</b><br />
+ <xsl:apply-templates select="memorypool"/>
+ <hr />
+ </xsl:template>
+
+ <xsl:template match="memory">
+ <table>
+ <tr>
+ <td><b>JVM:</b></td>
+ <td><b>free:</b> <xsl:value-of select="@free"/></td>
+ <td><b>total:</b> <xsl:value-of select="@total"/></td>
+ <td><b>max:</b> <xsl:value-of select="@max"/></td>
+ </tr>
+ </table>
+ <hr />
+ </xsl:template>
+
+ <xsl:template match="memorypool">
+ <table>
+ <tr>
+ <td><b>Name:</b> <xsl:value-of select="@name"/></td>
+ <td><b>Type:</b> <xsl:value-of select="@type"/></td>
+ <td><b>Initial:</b> <xsl:value-of select="@usageInit"/></td>
+ <td><b>Committed:</b> <xsl:value-of select="@usageCommitted"/></td>
+ <td><b>Maximum:</b> <xsl:value-of select="@usageMax"/></td>
+ <td><b>Used:</b> <xsl:value-of select="@usageUsed"/></td>
+ </tr>
+ </table>
+ </xsl:template>
+
+ <xsl:template match="connector">
+ <b>Connector -- </b> <xsl:value-of select="@name"/><br />
+
+ <xsl:apply-templates select="threadInfo"/>
+ <xsl:apply-templates select="requestInfo"/>
+ <xsl:apply-templates select="workers"/>
+ </xsl:template>
+
+ <xsl:template match="threadInfo">
+ <table>
+ <tr>
+ <td><b>threadInfo</b></td>
+ <td><b>maxThreads:</b> <xsl:value-of select="@maxThreads"/></td>
+ <td><b>currentThreadCount:</b> <xsl:value-of select="@currentThreadCount"/></td>
+ <td><b>currentThreadsBusy:</b> <xsl:value-of select="@currentThreadsBusy"/></td>
+ </tr>
+ </table>
+ <hr />
+ </xsl:template>
+
+ <xsl:template match="requestInfo">
+ <table>
+ <tr>
+ <td><b>requestInfo </b></td>
+ <td><b>maxTime:</b> <xsl:value-of select="@maxTime"/></td>
+ <td><b>processingTime:</b> <xsl:value-of select="@processingTime"/></td>
+ <td><b>requestCount:</b> <xsl:value-of select="@requestCount"/></td>
+ <td><b>errorCount:</b> <xsl:value-of select="@errorCount"/></td>
+ <td><b>bytesReceived:</b> <xsl:value-of select="@bytesReceived"/></td>
+ <td><b>bytesSent:</b> <xsl:value-of select="@bytesSent"/></td>
+ </tr>
+ </table>
+ <hr />
+ </xsl:template>
+
+ <xsl:template match="workers">
+ <table>
+ <tr>
+ <th>Stage</th>
+ <th>Time</th>
+ <th>B Sent</th>
+ <th>B Recv</th>
+ <th>Client</th>
+ <th>VHost</th>
+ <th>Request</th>
+ </tr>
+ <xsl:apply-templates select="worker"/>
+ </table>
+ <hr />
+ </xsl:template>
+
+ <xsl:template match="worker">
+ <tr>
+ <td><xsl:value-of select="@stage"/></td>
+ <td><xsl:value-of select="@requestProcessingTime"/></td>
+ <td><xsl:value-of select="@requestBytesSent"/></td>
+ <td><xsl:value-of select="@requestBytesReceived"/></td>
+ <td><xsl:value-of select="@remoteAddr"/></td>
+ <td><xsl:value-of select="@virtualHost"/></td>
+ <td><xsl:value-of select="@method"/> <xsl:value-of select="@currentUri"/>?<xsl:value-of select="@currentQueryString"/> <xsl:value-of select="@protocol"/></td>
+ </tr>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/web/tomcat/webapps/mpmweb.war b/web/tomcat/webapps/mpmweb.war
new file mode 100644
index 0000000..9a6329a
--- /dev/null
+++ b/web/tomcat/webapps/mpmweb.war
Binary files differ
--
Gitblit v1.9.3